1

JSONを返すajax呼び出しでロケールの翻訳を本質的にロードするI18nアプリケーションがあります。

次に、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 呼び出しが行われます。したがって、翻訳は事実上表示されません!. これを修正するにはどうすればよいですか?

フィドルの URL は次のとおりです: 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 に答える