如何实现翻译根据配置的原语言,来实现生成各种语言的翻译配置文件?

* 源码地址 :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 就可以自动翻译生成

 

 

 

posted @ 2020-04-24 16:22  missLiuliu  阅读(583)  评论(0编辑  收藏  举报