В итоге получилось как-то так…
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>
При изменении языка приложения, все строки разом будут обновлены.
Здесь не включен код, отвечающий за обработку ошибок — придумать обработку ситуаций с некорректным языком можете сами.