Sencha Touch 2 MVC — запросы Ajax перед инициализацией приложения

Поскольку в 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() {

}
});

Единственными решениями, которые я нашел до сих пор, были бы

  1. используйте обратный вызов и оберните инициализацию приложения внутри.
  2. Не используйте Sencha и выполняйте запрос ajax вручную.
  3. Не используйте Ajax вообще. Поместите переводы для всех языков в файл javascript, включите его в index.html и убедитесь, что служебный класс имеет доступ к объекту.

person karazy    schedule 07.01.2012    source источник


Ответы (3)


Расширение i18N уже есть, посмотрите здесь.

https://github.com/elmasse/Ext.i18n.Bundle-touch

person oferc    schedule 13.02.2012

Нет простого способа сделать это с Sencha Touch. Лучше всего было бы сделать синхронный запрос Ajax для файла json с переводами, а затем позволить вашему приложению запуститься после этого.

person rdougan    schedule 12.02.2012

См. этот пост, это может помочь: основы sencha touch i18n

И мой ответ, возможно, он мог бы помочь вам.

Для ваших собственных строк (не говоря уже о собственном сенсорном компоненте) вы можете сделать что-то вроде этого.

1) В вашем index.html в разделе заголовка загрузите файл LocaleManager.js (независимо от имени) перед

<script id="microloader" type="text/javascript" src="sdk/microloader/development.js"></script>

В вашем localeManager, в зависимости от языка вашего браузера, загрузите файл ресурсов, соответствующий вашему языку (myStrings-fr.js | myStrings-en.js)

Вы можете сделать что-то вроде этого, чтобы получить язык в браузере:

window.navigator.language || window.navigator.userLanguage || window.navigator.browserLanguage || window.navigator.systemLanguage

2) Создайте файлы ресурсов с переведенной строкой.

Это должно выглядеть так для английской версии (myStrings-en.js):

var myStrings = {
MyPackage1: {
    myString1: 'Seach...'
}};

Например, для французской версии (myStrings-fr.js) это должно выглядеть так:

var myStrings = {
MyPackage1: {
    myString1: 'Recherchez...'
}};

3) В вашем сенсорном коде сенчи, например, для значения заполнителя поля поиска

xtype: 'searchfield',
id: 'searchToolbarItem',
placeHolder: myStrings.MyPackage1.myString1

Надеюсь, это поможет.

Другим решением может быть изменение процесса сборки вашего приложения sencha touch и создание локализованных версий вашего приложения при его создании. Таким образом, будет одна версия для каждого языка. Затем, в зависимости от языка браузера, вы загрузите правильную версию своего приложения при загрузке приложения в браузере.

person Ronan Quillevere    schedule 01.08.2012