因為工作需要,最近研究了下網站語言國際化的問題,根據當前項目架構,尋求一種較好的解決方案。
首先總結下項目中語言切換實現方式大概有以下幾種:
1,一種語言一套頁面,如:index_CN.html,index_TN.html,index_EN.html
根據用戶當前使用語言來展示對應的頁面。
這種方式比較常用,也比較理想,性能不錯,但是開發使用的時間就多,每個頁面要多做幾遍。
2,后台定義變量,根據當前語言返回對應語言信息
這種方式不好使,麻煩,頁面所有靜態顯示文本處都需要定義變量,從后台讀取。
后台變量的定義可以根據語言分不同的屬性文件,如message_cn.properties,message_tn.properties,message_en.properties
注:這種方式不適應處理頁面靜態文本,但是可以結合第1種方式,這里專門處理頁面動態的信息提示。
3,js定義語言變量,全文替換,如:
var dbi = document.body.innerHTML; var TOLAN = eval(LAN); for(var n=0;n<CN.length;n++){ dbi= dbi.replace(eval("/"+CN[n]+"/g"), TOLAN[n]); } document.body.innerHTML = dbi;
這種方式不推薦使用,處理性能低下,如果頁面有事件綁定等內容,還會導致很多問題。
4,采用i18next頁面層框架,js框架地址:http://i18next.com/;
i18next的原理是根據標簽里聲明的變量,綁定語言資源文件內容,再呈現結果頁面。
page source:
<!DOCTYPE html> <html> <head> <script type="text/javascript" src="[PATH]/jquery.js"></script> <script type="text/javascript" src="[PATH]/i18next.js"></script> </head> <body> <ul class="nav"> <li><a href="#" data-i18n="nav.home"></a></li> <li><a href="#" data-i18n="nav.page1"></a></li> <li><a href="#" data-i18n="nav.page2"></a></li> </ul> </body> </html>
loaded resource file (locales/en/translation.json):
{
"app": { "name": "i18next" }, "nav": { "home": "Home", "page1": "Page One", "page2": "Page Two" } }
javascript code:
i18n.init(function(err, t) { // translate nav $(".nav").i18n(); // programatical access var appName = t("app.name"); });