最近公司要求所有的产品都要国际化,这真是个让人头大的消息,很多系统都已经好几年了,代码量大,里面的中文也比较多,一个系统人肉替换要一个人少则一星期,多则一个月。为了提高替换的效率,特意写了个小脚本,提取文件夹下所有中文,翻译还是要靠Google的,然后自己可以遍历替换成想要的格式。至于每个文件的单词替换,目前仍是手动替换的。有好的建议欢迎告诉我哈,本人node新手,有很多问题,写出来权当自己记录,同时希望大家多多文明指教。 代码如下:
const fs = require('fs');
const reg = /[\u4e00-\u9fa5]+/;
function mapDir(dir, callback, finish) {
fs.readdir(dir, (err, files)=> {
if (err) return;
files.forEach((fileName, index)=> {
let pathName = path.join(dir, fileName);
fs.stat(pathName, (err, stats)=> {
if (err) return;
if (stats.isDirectory()) {
mapDir(pathName, callback, finish);
} else if (stats.isFile()) {
if(['.json', '.less', '.png', '.gif', '.html'].includes(path.extname(pathName))) return;
fs.readFile(pathName, {encoding: 'utf-8'}, (err, data)=> {
if (err) return;
// callback && callback(data);
let columns = data.split("\n");
let resultArray = [];
for (let i = 0; i < columns.length; i++) {
let regArr = regChinese(columns[i].trim());
resultArray = Array.from(new Set([...resultArray, ...regArr]))
}
if(!fs.existsSync(path.join(__dirname, 'locales'))){
fs.mkdir(path.join(__dirname, 'locales'), {encoding: 'utf-8'}, (err)=>{
if (err) throw err;
resultArray.length && fs.writeFile(`locales/${fileName}_zh.json`, resultArray, (err)=>{
if(err) throw err;
});
})
}else{
resultArray.length && fs.writeFile(`locales/${fileName}_zh.json`, resultArray, (err)=>{
if(err) throw err;
});
};
})
}
});
console.log(fileName);
if (index === files.length - 1) finish && finish();
})
})
}
function regChinese(str, resultArr = []) {
var c = str.match(reg);
if (c) {
if (resultArr.indexOf(c[0]) === -1) {
resultArr.push(c[0]);
}
let lastIndex = str.indexOf(c[0].slice(-1))+1;
if (lastIndex <= str.length - 1) {
var newStr = str.slice(lastIndex);
regChinese(newStr, resultArr);
}
}
return resultArr;
}
let args = (process.argv.splice(2)[0]);
mapDir(args);```
只需终端node运行该文件,加上你需要找出的中文文件夹路径即可。如node test.js a/b/c;缺点:同名文件夹会被覆盖,可自行修改写入文件的路径即可;
小菜鸡,第一次写掘金,加油冲鸭!