使用EmberJS进行本地化

时间:2013-02-27 03:57:30

标签: javascript ember.js

我有一个I18n应用程序,它实际上加载了一个带有返回JSON的ajax调用的语言环境的翻译。

现在,它将JSON放入Em.STRINGS。在HTML中,我有一个手柄标签,上面写着这样的内容

{{translate context key="LOGOUT_LABEL"}}

我在JS中编写了一个看起来像这样的帮助器

Ember.Handlebars.registerHelper('translate', function(property, options) {
    var key = options.hash && options.hash.key, 
    replacants = options.hash && options.hash.values, value;
    if (key) {
        value = Em.String.loc(key, replacants ? Em.String.w(replacants) : []); 
        return value ;
    }
});

当这个运行时,我的HTML首先被绘制,接下来会发生AJAX调用。所以,翻译有效地不会出现!我该如何解决这个问题?

以下是小提琴网址:http://jsfiddle.net/infinityat0/gBa7T/

1 个答案:

答案 0 :(得分:0)

这不起作用:

var App = Em.Application.create({
    locale: 'en_US',
    init: function () {
        var locale = this.get('locale') || 'en_US';
        $.get("http://localhost:8000/translations.json", {
            locale: locale
        }, function (data) {
            Ember.STRINGS = data;
        });
    }
});

如果你更换AJAX-Call,实际上你的小提琴是有效的。对本地主机的Ajax调用无法在小提琴中起作用。查看工作版here

<强>更新 如果要为此用例编写自己的帮助程序,则必须创建绑定帮助程序。这可以在最新的ember版本(ember doc)中找到。您的代码可能如下所示:

Em.Handlebars.registerBoundHelper('translate', function (property, options) {
    var key = options.hash && options.hash.key,
        replacants = options.hash && options.hash.values,
        value;
    if (key) {
        value = Em.String.loc(key, replacants ? Em.String.w(replacants) : []);
        console.log(value);
        console.log(Ember.STRINGS);
        return value;
    }
}, "Ember.STRINGS");

注意: 有一个名为ember-i18n的项目。你可能应该以此为基础,而不是在如此低级别的api上工作。