2013-02-27 46 views
1

我有一个I18n应用程序,它实际上通过返回JSON的ajax调用来加载语言环境的翻译。使用EmberJS进行本地化

现在,它将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/

回答

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的呼叫。对localhost的Ajax调用不能在小提琴中工作。看到一个工作版本here

UPDATE: 如果你想为这个用例写一个自己的帮助器,你将不得不创建一个绑定帮助器。这在最新的发行版中可用(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上工作。

+0

嗨,@mavilein非常感谢您的回复。我知道AJAX调用不会在JSFiddle中工作(为了清楚起见,我只是保留它)。另外,如果我只保留html中的json字符串,它将起作用(因为它基本上意味着我已经预先获取了翻译并在init中应用了),我真正想要的是在AJAX调用中获取翻译, JSON添加到Em.Strings,然后完成之后,由于Em.STRINGS中的变化,把手会自行更新。 – user661905 2013-02-27 18:10:37

+0

为什么不使用ember-i18n?它处理这类问题。 – mavilein 2013-02-27 21:41:09