1

我有一个 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/

4

1 回答 1

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,您的小提琴就可以工作。对 localhost 的 Ajax-Call 无法正常工作。在此处查看工作版本。

更新: 如果您想为此用例编写自己的助手,则必须创建一个绑定助手。这在最新的 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。

于 2013-02-27T09:35:14.970 回答