我有一个ember应用程序写在1.0之前的ember。我想在Ember2.0中重写这个应用。
在旧的代码库中,我有一个LanguageController,它具有所有语言字符串的英语定义,并且我有一个ajax调用,用来自另一种语言的字符串填充语言控制器。然后,我将该控制器作为全局变量在所有模板中可用。ember 2.0模板可能如下所示:
<label id="lblHomeNextAppointment">{{EEA.lang.home_next_appointment}}</label>
<div class="appointment">
{{model.nextAppointment.formattedDate}}
{{model.nextAppointment.title}}
</div>
我想把动态语言字符串放在它表示EEA.lang.home_next_appointment
的地方。
如何构造控制器等来实现这一点?也许使用一种服务?控制器和服务之间的根本区别是什么?
旧的(1.0版本之前)控制器如下所示:
EEA.LanguageController = Ember.ArrayController.extend({
// Default values for language strings
"header_progress": 'Progress',
"header_planned": 'Planned',
"home_next_appointment": "Next Appointment",
...
init: function() {
this._super();
EEA.lang = this; // Shorter to write EEA.lang, than EEA.router.languageController
},
...
发布于 2015-09-02 13:52:32
你应该使用库来实现国际化。Ember-I18n做的就是你想要的。
在您的模板中,您可以使用{{t}}
helper:
<label id="lblHomeNextAppointment">{{t 'lang.home_next_appointment'}}</label>
export default {
lang: {
'home_next_appointment': 'whatever'
}
};
我有一个ajax调用,用另一种语言的字符串填充语言控制器。
使用Ember-I18n,您可以使用define translations at runtime。
例如,您可以在application
路由的beforeModel()
钩子中设置所需翻译的动态加载:
i18n: Ember.inject.service(),
beforeModel() {
let lang = $.cookie('user-lang');
if (!lang) {
lang = 'pl';
}
this.set('lang', lang);
Ember.$.getJSON('/translations/' + lang + '.json', (json) => {
this.get('i18n').addTranslations(lang, json);
});
},
当然,使用上面的方法,您需要在公共translations
URL路径下有.json
转换文件。
发布于 2015-09-02 14:09:52
解决这个问题的方法很少,但是在我看来最好使用Ember.Service()
来解决这个问题,例如通过创建Translator
服务(参见Service Guide)。我将使用以下论点来解释这一点:
Translator
服务从应用程序中分离出来,并在另一个Route
与控制器耦合将不再需要在这种情况下,您可以这样做:
翻译器服务:
export default Ember.Service.extend({
lang: 't1', // For reference
current: {},
init: function() {
this.current = this.translations[this.lang];
},
changeLanguage: function(lang) {
this.set('lang', lang);
this.set('current', this.translations[lang]);
},
translations: {
t1: {a: 'T1:A', b: 'T1:B'},
t2: {a: 'T2:A', b: 'T2:B'}
}
});
注入控制器
export default Ember.Controller.extend({
translator: Ember.inject.service()
});
和模板中的用法:
<p>{{translator.current.a}}</p>
显然,人们可以做得更好,例如,通过拆分成Translator
(用于设置/配置)和Dictionary
(用于公开选定的语言翻译),这样模板的使用将类似于{{Dictionary.index.greeting}}
,但它显示了解决问题的基于服务的方法。
https://stackoverflow.com/questions/32350548
复制