最近开发项目需要国际化设置,特别是涉及到一个外部组件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-api和google-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配置文件,或者单独做翻译都可。