背景介紹
現(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 文件太多,于是考慮腳本批量處理。
處理方案
- 解決思路:
指定文件夾遍歷,獲取文件,按行讀取,把中文截取出來(lái),并替換為對(duì)應(yīng)的key值,生成Excel文件,后續(xù)補(bǔ)充Excel文檔即可。 - 具體代碼實(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ǔ)充較好,有興趣的可以試下。