之前做国际化,用java写的一个工具提取代码中的中文,用于翻译。再将代码中的中文替换成变量,以便根据系统语言设置,转换语言。
这次我想通过NodeJS实现,下面写下具体思路。这里有全量代码
首先NodeJS需要实现两个功能:读文件和写文件。
NodeJS怎么读单个文件?
处理文件需要引入NodeJS的一个模块:
var fs = require('fs');复制代码
写一个方法来处理读取文件:
// 读文件
function readFile(file){
fs.readFile(file, function(err, data){
if(err)
console.log("读取文件fail " + err + file);
else{
// 读取成功时
// 输出字节数组
console.log("读文件操作成功" + file)
}
});
}复制代码
NodeJS怎么写单个文件?
可以读文件了,接下来就需要处理文件内容。
同样也写一个方法来专门处理文件内容:
// 写文件
function writeFile(file, data){
fs.writeFile(file, data,function(err, data){
if(err) {
console.log(file+'写文件操作失败:',err);
} else {
console.log("写文件操作"+file);
}
});
}复制代码
如何识别出中文,并替换成比变量?
文件内容读取出来了,就需要将内容中的中文替换成变量,方便显示不同的语言。
需要实现的效果如下:
读取出文件内容:
// do something
var a = [1,2,3]
var key = [
"测试用户",
"什么",
]
function render() {
return (
<div>
<p>{"用户权限信息无效,验证权限失败!"}</p>
<p>{"好的"}</p>
</div>
)
}复制代码
替换后的文件内容:
// do something
var a = [1,2,3]
var key = [
$i18n["userMgr_js_1"],
$i18n["comfirm_js_2"],
]
function render() {
return (
<div>
<p>{$i18n["userMgr_js_2"]}</p>
<p>{$i18n["comfirm_js_1"]}</p>
</div>
)
}复制代码
具体的实现步骤:
- 将文件读取出的内容,通过按行分割成数组。读取出来的内容是一个字符串。
strs.split('\n');复制代码
- 遍历每一行,过滤出行内含有中文的,再通过
"
分割成数组。str.split(/["]/)复制代码
- 接着遍历数组把中文替换成你想要的变量。
- 最后通过
writeFile()
方法将处理后的内容覆盖源文件。
如何处理多个文件?
单个文件的处理实现了,但是我们肯定不止一个文件,我们需要将某个路径的文件都扫描出来。所以写一个方法来处理路径的读取:
let files = []
// 读取路径
function ScanDir(path) {
let that = this
if (fs.statSync(path).isFile()) {
return files.push(path)
}
try {
fs.readdirSync(path).forEach(function (file) {
console.log('path + file',path + '/' + file)
ScanDir.call(that, path + '/' + file)
})
} catch (e) {
}
}复制代码
得到所有的文件后,再通过遍历,按照上面的方式进行处理就可以了。
最后
感谢你的阅读,上面是大体的思路,有些细节省略了。这里有全量代码。
如你发现有不妥的地方或者有更好的实现方法,欢迎讨论。