我最近還面臨同樣的問題。
找到一個乾淨的方式做到這一點是相當大的挑戰 - 大多數替代要麼..
1)複製每個區域設置您的代碼庫(WTH)
2)下載本地化的文件重寫你的每一個組件(維護地獄?那些可憐的翻譯者呢?)
3)使用/生成一個包含翻譯並引用它的靜態文件(所有語言被下載?額外構建步驟來生成它?你如何保持它們同步?)
我試圖讓世界上最好的,並結束了與負責一個實用工具類:
1)加載ExtJS的翻譯文件(這基本上適用替代來ExtJS的基本組件)
2 )從服務器加載特定於語言環境的屬性resourcebundle(指定要加載的語言環境)。
3)使用translate()方法查詢加載的存儲(包含來自服務器的消息包)並返回基於字符串值的轉換的原型字符串。
這是事物的要旨:
捆綁&原型:
localeStore.load({
callback : function(records, operation, success) {
// Define translation function (NB! Must be defined before any components which want to use it.)
function translate() {
var record = localeStore.getById(this.valueOf()) ;
if(record === null) {
alert('Missing translation for: ' + this.valueOf()); // Key is not found in the corresponding messages_<locale>.properties file.
return this.valueOf(); // Return key name as placeholder
} else {
var value = record.get('value');
}
return value;
}
String.prototype.translate = translate;
callback.call(); // call back to caller(app.js/Ext.Application), loading rest of application
}
});
如從一個視圖的示例:
this.copyButton = Ext.create('Ext.button.Button', {
disabled: true,
text: 'DOCUMENT_LIBRARY_MENU_COPYTO_BUTTON'.translate(),
action: 'openCopyDialog'
});
束上的服務器(mesages_en.properties ): DOCUMENT_LIBRARY_MENU_COPYTO_BUTTON =複製檔案 e TC ..
優點:
- 沒有大驚小怪代碼,「Your_key'.translate()可以很容易地閱讀和了解,這是一個本地化的字符串
- 無/低維護開銷(保持每個語言環境的重寫文件?耶穌..)
- 你只加載你需要的語言環境 - 不是整個shabang。
- 如果您真的想要,甚至可以在同一個包中爲ExtJS語言環境文件提供自己的翻譯。
- 你可以編寫單元測試,以確保所有包包含相同的密鑰,從而避免孤立的翻譯後
缺點:
- 同步 - 商店必須在主應用程序開始之前被加載。我通過從實用程序類中添加一個回調來解決此問題,一旦所有文本加載後都會調用該回調函數。
- 沒有文字的..雖然我不想讓我的用戶的實時人口超負荷的服務器或者:P
到目前爲止,我的方法已經制定了相當不錯我的要求。 網站加載速度並不明顯較慢,並且在加載過程中捆綁包(每個包含約200個鍵/值)在〜10kb處測量出來。
Thanx JaySee,不錯的方法,原型,使代碼高興閱讀,仍然提供了一個簡單的翻譯方法! – Paul
感謝您的優雅解決方案。如果使用[Ext.ux.Cache](https://market.sencha.com/extensions/ext-ux-cache)Cons可以更改爲專業人員 – Pencroff