nodejs 使用谷歌翻译api自动处理国际化文件

568 阅读2分钟

最近开发项目需要国际化设置,特别是涉及到一个外部组件Survey,他的中文翻译缺失很多很多,自己手写国际化文件很麻烦,所以特意写了一个js小脚本做一下自动翻译并生成json文件,特此记录一下。

准备

翻译使用的谷歌api ,涉及npm包google-translate-api

yarn add google-translate-api

修改client

node_modules/google-translate-api/index.js中修改 client: 'gtx'

备注:在node_modules目录下找到google-translate-apigoogle-translate-token这两个文件夹,将里面index.js里的几个**translate.google.com全部替换为 translate.google.cn,这样就能不翻墙使用这个谷歌翻译api**了

编写脚本

1、获取待翻译对象

从组件中获取英文翻译文档en.json,中文翻译文档zh.json

编写一个简单方法,对比2个json文件,将英文文档中有,而中文文档中没有的取出来,保存到一个对象中

2、编写翻译方法,使用google-translate-api

const translate = require('google-translate-api')
const trans = async (text) => {
  let datas = await translate(text, { to: 'zh-cn' })//转成中文
  return datas['text']
}

没有做错误处理,有需要的时候可以单独加一下

3、对待翻译对象进行翻译

查看待翻译对象,可以知道里面的结构嵌套的比较深,如果单独循环解析会比较麻烦,所以可以写一个递归函数进行处理

递归函数

const handler = async (dataValue) => {
  for (let key in dataValue) {
    if (typeof dataValue[key] == 'object') { // 如果是对象类型继续递归
        dataValue[key] =await handler(dataValue[key])
    } else if (typeof dataValue[key] == 'string') {// 如果是字符串则进行翻译
      dataValue[key] = await trans(dataValue[key])
    } else {// 其他类型,具体情况具体分析
      console.log(
        '🚀 ~ file: d.js:695 ~ handler ~ dataValue[key]:',
        dataValue[key]
      )
    }
  }
  return dataValue
}

4、生成json文件

const handleData = async () => {
  await  handler(langData)
  fs.writeFile('./xxx.json', JSON.stringify(langData), function () {
    console.log('🚀 ~ file: d.js:686 ~ handleData ~ 结束:')
  })
}

最后

可以把生成的json文件,或者考出来做i18n配置文件,或者单独做翻译都可。

扫码_搜索联合传播样式-标准色版.png