2019-09-12 node 实现自动抓取文件数据并进行多语言翻译

1.首先安装一下翻译依赖,这里采用的是谷歌翻译

npm install --save google-translate-api

安装成功后将node_module中google-translate-api和google-translate-token这两个文件夹的index.js,里面的
https://translate.google.com全部替换为 https://translate.google.cn
然后在google-translate-api 的index.js中的第三十五行中 t 改为gtx

client: 'gtx',//client: 't',=>client: 'gtx',

实现代码如下:

var fs = require('fs');
var join = require('path').join;
var translate = require('google-translate-api');
var conf = require('./config.js');//獲取配置信息
var arr = [];
var fileItem = [];
var num = 0;//计数器
function getJsonFiles(jsonPath){
    let jsonFiles = [];
    var i = 0;
    function findJsonFile(path){
        let files = fs.readdirSync(path);
        for(let n = 0;n<files.length;n++){
            let fPath = join(path,files[n]);
            let stat = fs.statSync(fPath);
            let tempPath = fPath.substring(fPath.lastIndexOf("\\")+1,fPath.length);
            if(stat.isDirectory() === true &&(conf.cf.skipFolderName.indexOf(tempPath)==-1&&conf.cf.skipPath.indexOf(fPath)==-1) ) {//
                findJsonFile(fPath); 
            }
            if (stat.isFile() === true) { 
              jsonFiles.push(...fPath);
              readFileKeyword(fPath,m=>{
                fileItem.push(...m);
              });
              i++;
            }
        }
    }
    findJsonFile(jsonPath);
    let initData = deletRrepetitionItemAndFormat(fileItem);

    
    //翻譯
    conf.cf.languages.forEach(el=>{
        if(el=="en-US"){
            writeTranlateData(el+".json",initData,"en",conf.cf.Mode);
        }else{
            writeTranlateData(el+".json",initData,el,conf.cf.Mode);
        } 
    })
}

getJsonFiles(conf.cf.sourceCodePath);//執行入口
/**
 * 判斷文件是否存在
 * @param {string} path -文件路勁
 * @return {bool} -true存在 false不存在
 */
function fsExistsSync(path){
    try{
        fs.accessSync(path)
    }catch(e){
        console.log(e);
        return false;
    }
    return true;
}
/**
 * 读取文件中的指定数据
 * @param {string} path - 傳入文件夾地址相對路徑
 * @param {function} fn -回調函數
 */
function readFileKeyword(path,fn){
    let str = fs.readFileSync(path,'utf-8');
    let temp = [];
    for(let n in conf.cf.patterns){
        let m = str.match(conf.cf.patterns[n]);
        if(m){
            temp.push(...m);
        }
    }
    if(temp.length)
        fn(temp);
}
/**
 * 數據去重並格式化數據
 * @param {Array} arr- 需要去重的數組 
 * @return {Array} -返回已去重的數組
 */
function deletRrepetitionItemAndFormat(arr){
    var Arr = new Set(arr);
    let temp = [];
    Array.from(Arr).forEach(el=>{
        num++;//计数器自增
        temp.push({
            text:el,
            orderBy:num,
            translate:""
        })  
    })
    return temp;
}
/**
 * 寫入文件
 * @param {String} path - 寫入文件的路徑 
 * @param {String} str -寫入文件的數據
 */
function writeFile(path,str){
    // fs.appendFileSync(path,str);
    fs.writeFileSync(path,str);
}
/**
 * 多語言翻譯
 * @param {String} data -需要翻譯的數據 
 * @param {String} language -需要翻譯成的語言 如 en 、 zh-TW 、 zh-CN
 * @param {function} callback - 翻譯後的回調函數
 */
function Translate(data,language,callback){
    translate(data,{to:language}).then(res=>{
        callback(res);
    }).catch(err=>{
        callback(err);
        console.log(err);
    })
}

/**
 * 排序
 */
function compare(propertyName){
    return function(obj1,obj2){
        var  value1 = obj1[propertyName];
        var  value2 = obj2[propertyName];
        return value1-value2
    }
}
/**
 * 讀取文件
 * @param {String} path -讀取文件 
 * 
 */
function readFile(path){
    return fs.readFileSync(path,'utf-8');
}

/**
 * 
 * @param {String} path - 寫入文件地址 
 * @param {Array} initData -寫入文件的數據  
 * @param {String} language -需要寫入的語言
 * @param {String} ModeStat-寫入語言的狀態
 */
function writeTranlateData(path,initData,language,ModeStat){
        let temp = [];
        
        initData.map(item=>{
            Translate(item.text,language,res=>{
                // console.log(item);
                if(conf.cf.skipEnglishKey&&res.from.language.iso=="en"){
                    temp.push({
                        text:item.text,
                        orderBy:item.orderBy,
                        translate:item.text
                    });
                }else{
                    temp.push({
                        text:item.text,
                        orderBy:item.orderBy,
                        translate:res.text.replace(/(^\s*)|(\s*$)/g,"")
                    });
                }
                if(temp.length==initData.length){
                    let str = "{\n";
                    temp.sort(compare("orderBy")).forEach((el,index)=>{
                        str += '    "'+el.text+'": "'+el.translate+'",\n';
                    })
                    str=str.substring(0,str.length-2);
                    str+="\n}";

                    if(ModeStat=="Append"){//狀態為追加
                        if(fsExistsSync(path)){
                            let readData  = fs.readFileSync(path,'utf-8');
                            readData = JSON.parse(readData);
                            let strJson = JSON.parse(str);
                            for(let i in readData){
                                delete strJson[i];
                            }
                            for(let n in strJson){
                                readData[n]=strJson[n]
                            }
                            let writeStr = "{\n";
                            for(let i in readData){
                                writeStr += '    "'+i+'": "'+readData[i]+'",\n';
                            }
                            writeStr=writeStr.substring(0,writeStr.length-2);
                            writeStr+="\n}";
                            writeFile(path,writeStr);
                        }
                        
                    }
                    if(ModeStat=="Create"){//狀態為創建

                        writeFile(path,str);
                    }
                    return;
                }
            })
        })
    
}


配置文件如下:

var cf = {
        sourceCodePath:"D:\\Collection2018\\Insurance\\cms",//源代碼路徑\\pages
        skipEnglishKey:true,//當key為全英文時,是否跳過翻譯
        languages:['en-US','zh-CN','zh-TW'],//需要翻譯的語言
        patterns:{
            0:/(?<=\$t(\s*)\((\s*)(\"|\'))[^\'|\"]+/g
        },
        skipPath:[//需要跳過的路徑(完整路徑,不區分大小寫)
            //"d:\\...\\node_module"
            "D:\\test\\TestServer\\CMS\\pages\\adminUser"
        ],
        skipFolderName:[//需要跳過的文件夾(文件夾名稱,不區分大小寫)//"plugins",".nuxt","locales","node_modules"
            ".nuxt","node_modules","locales","plugins"
        ],
        //Mode: Create/Append
        Mode:"Create"
    }
exports.cf = cf;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容