Поскольку в Sencha Touch нет официального способа интернационализации, я пишу свой собственный небольшой набор служебных методов. Я не буду встраивать другую библиотеку, например jQuery, чтобы использовать уже существующие плагины i18n. На данный момент у меня проблемы с выяснением лучшего способа. В настоящее время у меня есть класс, реализованный как Singleton. В конструкторе определяю язык и загружаю соответствующий языковой файл. На данный момент я использую методы 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
});
Проблема здесь в том, что загрузка является асинхронной (нет возможности синхронного вызова с сенчей?!), что означает, что приложение может начать загружаться до того, как все это будет завершено. Мне нужны данные, потому что представления полагаются на них.
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 и убедитесь, что служебный класс имеет доступ к объекту.