Ember.js + i18n: как организовать смену языка без перезагрузки страницы?

Привет, воспользовался единственным(кажется) расширением для Эмбер, реализующем интернационализацию:
github.com/zendesk/ember-i18n


Вопрос вот в чем — как мне без перезагрузки страницы изменить язык приложения?
  • Вопрос задан
  • 4586 просмотров
Решения вопроса 1
DeusModus
@DeusModus Автор вопроса
В итоге получилось как-то так…

TranslationsPrototype.
Прототип для работы с локализациями. Если в переводе нет строки, возьмется значение из дефолтной локали. Таким образом если что-то не переведено в других языках, но есть в исходниках у нас не будет алиаса или пустого места — будет оригинал. Для меня это английский.
/**
 * Прототип обьекта, содержащего локализации
 * Назначение просто - вернуть обьект с переведенными строками
 * @type {*}
 */
var translationsPrototype = Em.Object.extend({
    defaultLocale:'en',
    currentTranslation:{},
    locales:_locales,
    getLocale:function (localeName) {
        this.currentTranslation = this.locales[localeName];
        for (prop in this.locales[this.defaultLocale]) {
            if (typeof this.currentTranslation[prop] == 'undefined') {
                this.currentTranslation[prop] = this.locales[this.defaultLocale][prop];
            }
        }
        return this.currentTranslation;
    }
});


_locales.
Простой обьект для хранения переводов. Может генерироваться на сервер-сайде, может быть включен в предыдущий прототип. Мне было удобнее вынести его.
/**
 * Перевод программы
 * @type {Object}
 * @private
 */
_locales = {
    en:{
        'str_one':'Hello',
    },
    ru:{
        'str_one':'Привет',
    },
}


Application.
Простой пример инициализации приложения. Переопределяем конструктор, чтобы получить активный язык. На практике language:'en' может выглядеть как language:Common.getActiveLanguage() и приложение уже запустится с нужным языком.
var Translation = translationsPrototype.create();
var App= Em.Application.create({
    version:'1.0b',
    language:'en',
    debug:0,
    init:function () { //constructor overwrite
        Ember.Namespace.NAMESPACES.push(this);
        Ember.Namespace.PROCESSED = false;
        // вся эта мутня с переводами нужна для живой смены языка в рамках подходов ember
        var translation = Em.Object.extend();
        this.T = translation.create();
        this._setLocale(this.get('language'));
    },
    _setLocale:function (localeName) {
        this.T.setProperties(Translation.getLocale(localeName));
        return this;
    }
});

T = App.T;  // алиас для глобального контекста


Observer
Слушаем изменения языка через App.set('language','XX') и изменяем локаль.
App.addObserver('language', function (object, property) {
    object._setLocale(object.language);
});


Template.
Пример перевода строки.
<script type="text/x-handlebars">
    {{T.str_one}}!
</script>


При изменении языка приложения, все строки разом будут обновлены.
Здесь не включен код, отвечающий за обработку ошибок — придумать обработку ситуаций с некорректным языком можете сами.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы