如何实现翻译根据配置的原语言,来实现生成各种语言的翻译配置文件?
* 源码地址 :https://github.com/13476075014/04.node-vue-project/tree/master/03.singlewebpack/02.ejsHtml
一.需要用到的插件
谷歌翻译的插件包:google-translate-api (https://www.npmjs.com/package/google-translate-api);
node的命令行指令执行包:commander (https://www.npmjs.com/package/commander);
二:需要达到的目的
目的:因为项目涉及到多语言配置,不止两门语言,所有在写配置的翻译的时候手动搜索复制翻译很慢,就需要有方法直接把自己的基础语言翻译的配置,这里是基于英语,来对该翻译文件的所有key对应的value都翻译成对应的语言,最后直接在英语的配置文件目录下生成一个别的语言的配置文件,这样在使用的时候直接引入这个文件就可以,不需要再一句句的手动翻译了;
三:具体实现思路
根据现有插件 google-translate-api 可以实现对应的语言的翻译,所以我们可以在原英语配置文件是对外暴露的一个json,直接把这个json的key对应的value都一个个的去翻译,翻译完了,把json对应的key的value换成翻译的结果,这样最后就可以得到一个翻译完的json对象了,然后把这个对象通过node的fs模块写入到文件配置的目录下生成一个新的js文件,对外暴露的是翻译后的json
四:具体实现步骤
4.1 首先下载 google-translate-api
npm install google-translate-api --save-dev
4.2 修改插件里面的请求地址前缀 https://translate.google.com 改成中国区域的 https://translate.google.cn,避免外网访问不到或者访问很慢,需要改的两个文件在node_modules的 google-translate-api 和 google-translate-token
4.3 把插件 google-translate-api 里面的 client: 't' 换成 client: 'gtx'
4.4 下载 commander 辅助在命令行执行代码
npm install commander --save-dev
4.5 在项目的根目录下面创建translate.js的文件,来实现脚本翻译,具体代码如下
const program = require('commander'); const fs = require("fs") const path = require("path") function translate_split_keys(val) { return val.split('@') } program .version('1.0.0') .option('-t, --translate <type>.<b>', 'translate Something',translate_split_keys) .parse(process.argv); class google_translate{ //to_language 实例化的时候传值需要翻译成什么语言 //json_path 需要被翻译的js文件的地址,里面返回的一个json constructor(to_language,json_path){ this.translate = require('google-translate-api') //谷歌翻译的包 // this.en = require(path.resolve(__dirname,'../../../lang/en.js')) //获取 this.en = require(json_path) //获取 this.to_language = to_language this.translate_arr = [] this.json_path = json_path this.i=0 this.init2(this.en,to_language || 'zh-CN') //hi印地语 ; zh-CN中文 } my_translate(language,text,i,callback){ /** * @param {需要翻译成什么语言} language * @param {需要翻译的文本} text */ setTimeout(()=>{ this.translate(text, {to: language}).then(res => { callback(res.text) }).catch(err => { console.error(err,'错啦'); }); },200*i) } /** * @param {要被翻译的json对象} json_obj * @param {需要翻译成什么语言} language */ init(json_obj,language){ let i=0 for(let item in json_obj){ if(typeof json_obj[item] == "object" && Object.keys(json_obj[item]).length){ this.init(json_obj[item],language) }else if(item != 'name'){ this.translate_arr.push(json_obj[item]) json_obj[item] = i; i++; if(item == "end"){ //读完了所有的对象 this.my_translate(language,JSON.stringify(this.translate_arr),function(res){ // console.log(res) }) } } } } /** * @param {要被翻译的json对象} json_obj * @param {需要翻译成什么语言} language * 一句句的去请求翻译,上面的方法是一次全部请求 */ init2(json_obj,language){ let _this = this for(let item in json_obj){ ++this.i; let i = this.i; if(Object.prototype.toString.call(json_obj[item]) == '[object Object]' && Object.keys(json_obj[item]).length){ this.init2(json_obj[item],language) }else if(item == 'name'){ json_obj[item] = this.to_language }else if(item != 'name'){ //读完了所有的对象 this.my_translate(language,json_obj[item],i,function(res){ // nned_obj[need_item] = res json_obj[item] = res console.log((i/_this.i*100).toFixed(2) + "%") if(item == 'end'){ let result = "module.exports ="; result += JSON.stringify(json_obj); let result_file_path = _this.json_path.split('') result_file_path.splice(-5,5,'auto_' + _this.to_language + '.js'); result_file_path = result_file_path.join('') // result_file_path =((result_file_path.slice(0,result_file_path.length-1)).join('/')) + ('/auto_' + _this.to_language + '.js') fs.writeFile(path.resolve(__dirname,result_file_path),result,'utf8',err =>{ if(err){ console.error("错啦文件生成",err) }else{ console.log("成功") } }) } }) } } } }; if(program.translate){ //执行下面命令的时候会触发这个指令,参数通过@分开; //"translate":"node ./lop_server/mobile/checksum/google.js -t hi@lj" new google_translate(program.translate[0],path.resolve(program.translate[1])) }
4.6 在package.json 的scripts下面写上执行脚本
"scripts": { "translate": "node ./translate.js -t hi@./public/lang/en.js" },
hi@./public/lang/en.js 这个部分是传的参数用@分开,hi是需要翻译成印地语,具体的哪种语言对应的值在 https://github.com/matheuss/google-translate-api/blob/master/languages.js 这里有对照列表;
./public/lang/en.js这个参数是自己的英语配置文件的地址,阴雨配置文件的格式如下:
module.exports = { name:"english", //语言名称 common:{ //公用部分 success:"Success", fail:"Fail", }, index:{ //首页翻译配置 title:"Home1", },
。。。 //可以随意加上自己需要的key和value end:{ //最后一个必须是end } }
4.7 最后执行命令 npm run translate 就可以自动翻译生成