2013-02-27 65 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