私は最近同じ問題に苦しんでいました。
これを行うためのクリーンな方法を見つけることは非常に困難でした-ほとんどの選択肢はどちらかでした。
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=ファイルのコピーなど。
長所:
- 手間のかからないコード'Your_key'.translate()を使用すると、これがローカライズされた文字列であることを読みやすく、認識しやすくなります。
- メンテナンスのオーバーヘッドなし/わずか(ロケールごとにオーバーライドファイルを保持しますか?イエス..)
- シャバン全体ではなく、必要なロケールのみをロードします。
- 本当に必要な場合は、同じバンドル内のExtJSロケールファイルの独自の翻訳を作成することもできます。
- 単体テストを記述して、すべてのバンドルに同じキーが含まれていることを確認し、後で孤立した翻訳を回避することができます。
短所:
- 同期-メインアプリを起動する前にストアをロードする必要があります。すべてのテキストが読み込まれると呼び出されるユーティリティクラスからのコールバックを追加することで、これを解決しました。
- リアルタイムのテキストの入力はありません..ユーザーにサーバーを過負荷にさせたくありませんでしたが:P
これまでのところ、私のアプローチは私の要件に対してかなりうまく機能しています。サイトの読み込みはそれほど遅くはなく、バンドル(バンドルごとに最大200のキー/値を含む)は読み込み中に最大10kbで測定されます。