为前端国际化提供的一点小工具

329 阅读1分钟

最近公司要求所有的产品都要国际化,这真是个让人头大的消息,很多系统都已经好几年了,代码量大,里面的中文也比较多,一个系统人肉替换要一个人少则一星期,多则一个月。为了提高替换的效率,特意写了个小脚本,提取文件夹下所有中文,翻译还是要靠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;缺点:同名文件夹会被覆盖,可自行修改写入文件的路径即可;
小菜鸡,第一次写掘金,加油冲鸭!