JSP項(xiàng)目國(guó)際化解決方案

背景介紹

現(xiàn)有項(xiàng)目已上線(xiàn)運(yùn)營(yíng)6年了,在項(xiàng)目搭建初期也沒(méi)有預(yù)留國(guó)際化處理的相關(guān)插口,現(xiàn)在進(jìn)行國(guó)際化處理,由于JSP和JS 文件太多,于是考慮腳本批量處理。

處理方案

  1. 解決思路:
    指定文件夾遍歷,獲取文件,按行讀取,把中文截取出來(lái),并替換為對(duì)應(yīng)的key值,生成Excel文件,后續(xù)補(bǔ)充Excel文檔即可。
  2. 具體代碼實(shí)現(xiàn)
        //文件遍歷方法
        function fileDisplay(filePath){
            //根據(jù)文件路徑讀取文件,返回文件列表
            fs.readdir(filePath,function(err,files){
                if(err){
                    console.warn(err)
                }else{
                    //遍歷讀取到的文件列表
                    files.forEach(function(filename){
                        //獲取當(dāng)前文件的絕對(duì)路徑
                        var filedir = path.join(filePath,filename);
                        //根據(jù)文件路徑獲取文件信息,返回一個(gè)fs.Stats對(duì)象
                        fs.stat(filedir,function(eror,stats){
                            if(eror){
                                console.error('獲取文件:'+filename+',狀態(tài):'+stats+';失敗');
                            }else{
                                var isFile = stats.isFile();//是文件
                                var isDir = stats.isDirectory();//是文件夾
                                if(isFile){
                                    //if(/title_201711/.test(filename)) {
                                        var fRead = fs.createReadStream(filedir);
                                        var fWrite = fs.createWriteStream('./source/' +filename+ '.xlsx');
                                        var fsJSPWriter = fs.createWriteStream(Configer.publicPath+filename);
                                        var objReadline = readline.createInterface({      // 按行讀取
                                            input: fRead
                                        });
                                        var rowDatas = [];
                                        rowDatas.push(["key值","中文"]); 
                                        objReadline.on('line', (line)=>{
                                            var chiaArray = createChar(line);
                                            var datas=[];
                                            var keyLine = line;
                                            if(chiaArray&&chiaArray.length > 0) {
                                                chiaArray.forEach(function(item){
                                                    if(!item) return;
                                                    rowDatas.push([charKey,item]); 
                                                    console.log('中文詞:' + charKey + ":" + item);
                                                    var index = line.indexOf(item);
                                                    keyLine = insert_flg(keyLine,charKey,item);


                                                    charKey += 1;
                                                })
                                            }
                                            fsJSPWriter.write(keyLine);
                                        });

                                        objReadline.on('close', ()=>{
                                            var buffer = xlsx.build([
                                                {
                                                    name:'sheet1',
                                                    data:rowDatas   
                                                }
                                            ]);
                                            fWrite.write(buffer);
                                        });
                                    //}
                                }
                                if(isDir){
                                    fileDisplay(filedir);//遞歸,如果是文件夾,就繼續(xù)遍歷該文件夾下面的文件
                                }
                            }
                        })
                    });
                }
            });
        }

        //截取中文詞語(yǔ)
        function createChar(line) {
            if(!line.length || line.length==0) return;
            var reg = /[\u4e00-\u9fa5]/g;
            var charMarry = [];
            var str = "";
            for(var i=0;i<line.length;i++) {
                var chart = line.charAt(i);
                var prevChart = line.charAt(i-1);
                if(prevChart.match(reg)) {
                    if(chart.match(reg)){
                        str += chart;
                    }else{
                        charMarry.push(str);
                        str = "";
                    }
                }else if(chart.match(reg)) {
                    str += chart;
                }
                if(i==line.length-1){
                    charMarry.push(str);
                    str = "";
                }
            }
            return charMarry;
        }

        //生成國(guó)際化標(biāo)記
        function insert_flg(str,key,item){
            var newstr="";
            var index = str.indexOf(item);
            var xmlKey = "<fm key=\"${}\"></fm>";
            var enIndex = index+item.length;
            newstr = str.substring(0,index)+xmlKey.replace('${}',key)+str.substring(enIndex);
            return newstr;
        }

實(shí)現(xiàn)效果

JSP插入國(guó)際化標(biāo)簽

            <td><fm key="100000"></fm>:</td>
            <td><fm key="100001"></fm>:</td>

生成Excel文件,補(bǔ)充英文

key 中文 英文
100000 用戶(hù)地址
100001 機(jī)構(gòu)地址

總結(jié)

該方案,核心代碼是把文件按行讀取,并遍歷該行有沒(méi)有中文,有中文就判斷下一個(gè)字節(jié)是否是中文,一直截取到非中文字節(jié)的位置。生成excel后可直觀方便的補(bǔ)充對(duì)應(yīng)英文,便于進(jìn)行國(guó)際化處理。本來(lái)打算直接調(diào)用谷歌引文翻譯,把中文翻譯成英文,生成國(guó)際化文件,但考慮到生成的英文太生硬,還是人工補(bǔ)充較好,有興趣的可以試下。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容