2013-08-05 46 views
2

我在我的应用程序中使用Ember i18n。我也想在控制器中使用翻译字符串(大多数情况下在警报或确认消息中)。如何才能做到这一点 ?Ember:如何在控制器代码中使用i18n翻译?

http://jsfiddle.net/cyclomarc/36VS3/2/

单击按钮应提醒“信息”,而不是“T1005” ......

<script type="text/x-handlebars"> 
    {{t T1005}}<br> 
    <button {{action 'clickMe' content}}>{{t T1005}} - Click me</button> 
</script> 

CLDR.defaultLanguage = 'en'; 

App.ApplicationController = Ember.Controller.extend({ 
    clickMe: function(){ 
     alert('T1005'); 
    } 
}) 

我知道,一个可能的解决方法是不再使用警报,确认并更换他们通过例如bootstrap替代品。不过,我可以想象,在某些情况下,你会想用JavaScript中的字符串做些事情(例如,通过jQuery或更新某个标签)。

关于如何在控制器中使用i18n字符串的任何想法都很有帮助。使用i18n库只有在应用程序的各个方面都可以转换时才有用...

回答

1

可能会晚点这里,但什么?

你可以这样做:

App.ApplicationController = Ember.Controller.extend(Em.I18n.translateableProperties, { 
    messageTranslation: 'T1005', 

    clickMe: function(){ 
     alert(this.get('message')); 
    } 
}); 

在模板中,{{message}}还将举行翻译。

0

的作品给我的解决方案如下(使用恩贝尔I18N):

App.ApplicationController = Ember.Controller.extend(Em.I18n.translateableProperties, { 
    messageTranslation: 'T001', 

    showMessage: function(){ 
    alert(this.get('message')); 
    } 
}); 
+1

尝试缩进你的代码 – chouaib

0

从cyclomarc答案并没有为我(这是从2013年开始,这可能是相关的)工作,但它指出我在正确的方向:

this.container.lookup('service:i18n').t('my.translation.id') 
+0

为什么要查找?为什么不只是注入像'i18n:Ember.inject.service()'这样的服务将获得i18n服务对象。 – kumkanillam

+0

真的(我刚刚了解到this.container已被弃用)。重点是:无论哪种方式,都可以从控制器中获取翻译后的字符串,从而回答问题。 btw:我更喜欢'lookup'的方式是在'else'中使用的情况。如果仅使用_some_次 – crusy

+0

[参考弃用](https://www.emberjs.com/deprecations/v2.x/#toc_deprecations-added-in-2-3),我不需要注入服务_every_ time。我们可以使用'Ember.getOwner(this).lookup'而不是'this.container' – kumkanillam