Sencha Touch には国際化を行う公式の方法がないため、私は独自のユーティリティ メソッドの小さなセットを作成しています。jQuery のような別のライブラリを埋め込んで、既存の i18n プラグインを使用するつもりはありません。現時点では、最善の方法を見つけるのに苦労しています。現在、シングルトンとして実装されたクラスがあります。コンストラクターで言語を決定し、対応する言語ファイルを読み込みます。現時点では、Sencha メソッドを使用してモデルを定義し、データ (json) をストアにロードしています。ある意味便利だと思います。データをロードするコンストラクターのスニペットを次に示します。
Ext.define('Translation', {
extend: 'Ext.data.Model',
idProperty: 'key',
fields: [
{name: 'key', type: 'string'},
{name: 'translation', type: 'string'}
],
proxy: {
type: 'ajax',
url: 'res/translation-'+lang+'.json',
//appendId: false,
reader: {
type: 'json',
}
}
});
_store = Ext.create('Ext.data.Store', {
model : 'Translation',
autoLoad: true
});
ここでの問題は、ロードが非同期であることです (sencha で同期呼び出しを行う方法はありません?!)。これは、この処理が完了する前にアプリケーションがロードを開始する可能性があることを意味します。ビューはデータに依存しているため、データが必要です。
Ext.Loader.setConfig({enabled:true});
Ext.application({
name: 'MyApp',
controllers: ['Ctr1', 'Ctr2'],
models: ['Model1', 'Model2],
init: function() {
},
launch: function() {
}
});
これまでに見つけた唯一の解決策は
- コールバックを使用して、アプリの初期化を内部にラップします。
- Sencha を使用せず、手動で ajax リクエストを行います。
- Ajax をまったく使用しないでください。すべての言語の翻訳を javascript ファイルに入れ、それを index.html に含め、ユーティリティ クラスがオブジェクトにアクセスできることを確認します。