首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我把Ember-I18n的翻译放在什么地方?

我把Ember-I18n的翻译放在什么地方?
EN

Stack Overflow用户
提问于 2014-06-21 18:45:19
回答 3查看 4.5K关注 0票数 14

我是新成员,和烬-cli,我仍然在学习的一切。我试图在成员-i18n模块中添加多语言支持。

我在bower中安装了依赖项。

代码语言:javascript
复制
bower install cldr ember-i18n --save

我让我的进口品在Brocfile.js里工作

代码语言:javascript
复制
app.import('vendor/cldr/plurals.js');
app.import('vendor/ember-i18n/lib/i18n.js');

在我的应用程序中,i18n车把帮手正在工作

{{t hello}}给了我“缺少的翻译:你好”

我不知道在哪里放置或引用包含翻译的成员-cli文件夹结构中的文件。

每一个成员-i18n文档,它看起来会像这样

代码语言:javascript
复制
Ember.I18n.translations = {
    hello: "Hello World",
}

我试着把它粘在app.js上,只是想看看它能不能正常工作,但是得到了错误:

代码语言:javascript
复制
Uncaught TypeError: Cannot set property 'translations' of undefined
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-08 09:17:26

您可以在initializer (医生来了)中添加您的翻译。通过成员-cli,您可以通过在命令行上执行ember generate initializer i18n生成一个。

在初始化器中,可以设置翻译:

代码语言:javascript
复制
var TRANSLATIONS = {
  'user.edit.title': 'Edit User',
  'user.followers.title.one': 'One Follower',
  'user.followers.title.other': 'All {{count}} Followers',
  'button.add_user.title': 'Add a user',
  'button.add_user.text': 'Add',
  'button.add_user.disabled': 'Saving...'
};
var i18nInitializer = {
  name: 'i18n',
  initialize: function() {
    Ember.I18n.translations = TRANSLATIONS;
  }
};
export default i18nInitializer;

如果您希望在java-properties文件中通过ajax检索语言数据,您可以使用ajax检索它,并使用java-properties.js解析它。它也可以通过Bower获得。

票数 12
EN

Stack Overflow用户

发布于 2014-08-29 21:01:20

我遇到了与Weston相同的问题,在进行了一些研究之后,我实现了一个可以动态加载用户指定语言的解决方案。对于OP来说,这可能太晚了,但是我把它放在这里,供其他可能对此过程有疑问的人参考。

我的解决方案可能不是处理这个问题的理想方法,但它似乎与我的站点很好地工作。

我正在使用Ember-cli和包含成员-i18n的国际化,以及CLDR来处理复数。我的网站使用cookie来存储用户语言,用户语言用于在站点加载时加载适当的语言文件。cookie还会传递给REST服务(一些API调用返回可以包含翻译文本的对象)。我正在使用jQuery来处理我的cookie。

首先,我创建了我的翻译文件,每个语言都有一个,它们只是javascript文件,然后我将使用$.getScript加载这些文件。我将它们存储在公共/javascript文件夹Ember中的一个“翻译”文件夹中。

translations-en.js

代码语言:javascript
复制
Ember.I18n.translations = {
  'hello' : 'Hello World!',
  ...
}

translations-fr.js

代码语言:javascript
复制
Ember.I18n.translations = {
  'hello' : 'Bonjour Monde!',
  ...
}

然后,我为CLDR设置了初始化器,它根据我的站点使用的用户--lang cookie --设置默认语言--如果cookie还不存在,它默认为'en‘并创建cookie。

\app\initializers\cldr.js

代码语言:javascript
复制
export default {
  name: 'cldr',

  initialize: function() {
    var lang = $.cookie('user-lang');

    if (lang === undefined) {  // no cookie exists yet
      lang = 'en';
      $.cookie('user-lang', lang, {expires:365, path:'/'});
    }

    CLDR.defaultLanguage = lang; 
  }
};

现在,在应用程序路由的beforeModel函数中,我根据存储在CLDR.defaultLanguage中的值获取转换文件。

\app\routes\application.js

代码语言:javascript
复制
export default Ember.Route.extend({

  beforeModel: function() {
    $.getScript('./javascript/translations/translations-' + CLDR.defaultLanguage + '.js')
      .fail(function(jqxhr, reason, exception) {
        // handle failure
      });
  }
});

如果您的站点有大量的翻译字符串或多种语言,您可能不希望每次有人加载您的应用程序时都包含您的翻译文件,或者需要一段时间才能加载。在这种情况下,您可以用ajax调用替换这个getScript,并获得后端提供的文件。在我的例子中,没有太多的翻译字符串,所以这是可以的。

现在,每当用户想要更改语言时,我所要做的就是更新我的用户- language的值,然后重新加载站点,这将再次通过初始化程序和beforeModel函数,并加载适当的语言文件。

代码语言:javascript
复制
export default Ember.Controller.extend({
  actions: {
    changeLanguage: function(lang) {
      $.cookie('user-lang', lang); 

      window.location.reload();
    }
  }
});

每当用户重新加载页面或返回站点时,默认情况下,他们最后选择的语言将从cookie中加载。当然,用户可以从不同的浏览器中删除cookie或登录,在这种情况下,站点将返回默认的'en‘语言。为了解决这个问题,用户的语言选择需要在后端的某个位置保持,并在应用程序加载时被获取--但这是另一项任务。

票数 6
EN

Stack Overflow用户

发布于 2014-06-22 21:24:34

命名空间是错误的。

你需要Em.I18n.translations

试过了。很管用。

我不知道在哪里放置或引用包含翻译的成员-cli文件夹结构中的文件。

我也是。当然,app.js可以工作,但也许有人可以提供一个很好的提示。我也是新来的.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24344739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档