之前做國際化,用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) {
}
}複製程式碼
得到所有的檔案後,再通過遍歷,按照上面的方式進行處理就可以了。
最後
感謝你的閱讀,上面是大體的思路,有些細節省略了。這裡有全量程式碼。
如你發現有不妥的地方或者有更好的實現方法,歡迎討論。