Node.js處理國際化

繆宇發表於2017-11-02

之前做國際化,用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) {
  }
}複製程式碼

得到所有的檔案後,再通過遍歷,按照上面的方式進行處理就可以了。

最後

感謝你的閱讀,上面是大體的思路,有些細節省略了。這裡有全量程式碼

如你發現有不妥的地方或者有更好的實現方法,歡迎討論。

相關文章