在.js.erb中处理I18n

时间:2013-02-08 10:45:49

标签: javascript ruby-on-rails internationalization ruby-on-rails-3.2

我正在尝试根据触发某些JS代码的语言创建一个IF语句。

temp.js.erb

<% if I18n.locale.to_s == 'es' %>
    someJScode;
<% elsif I18n.locale.to_s == 'en' %>
    someJScode;
<% elsif I18n.locale.to_s == 'eu' %>
    someJScode;
<% elsif I18n.locale.to_s == 'fr' %>
    someJScode;
<% end %>

显然它有效。但是,当我更改应用程序上的语言时,此代码的行为不会更改。它仍会触发先前语言环境的代码。

改变语言的次数无关紧要。它只会触发我用第一个窗口打开的语言环境的代码。

为什么?我做错了什么?

-------------------- UPDATE ------------

根据@tigrish的建议,我安装了i18n-js gem。

我将这个haml添加到我的application.html.haml

:javascript
      I18n.defaultLocale = " I18n.default_locale ";
      I18n.locale = " I18n.locale ";

并尝试使用gem docs中提供的代码获取JS中的语言环境。

var fo = I18n.currentLocale();
alert(fo);

然而,它不起作用。

知道为什么吗?

3 个答案:

答案 0 :(得分:1)

我认为@marcgg在缓存方面可能是正确的。

您可以考虑使用https://github.com/fnando/i18n-js - 即使您本身不包含任何翻译,您的I18n.locale == 'foo'调用都将在JS中并在每次函数运行时进行解释。

答案 1 :(得分:0)

我会说,因为它是javascript代码,它可能会被缓存。尝试清除缓存并检查语言是否发生变化。如果是,请停用此文件的缓存,或使其取决于区域设置。

答案 2 :(得分:0)

我遇到了类似的问题,而@tigrish解决方案帮助我解决了这个问题。

@SergioNekora,请尝试以下步骤:

  1. 安装i18n-js(将gem 'i18n-js'添加到您的Gemfile中)。
  2. 添加到application.html.erb文件(对于haml文件,您应该使用其他一些语法):

    <script type="text/javascript">
        I18n.locale = "<%= I18n.locale %>";
    </script>`
    
  3. 添加到temp.js.erb / temp.js文件//= require i18n

  4. 现在,您可以在temp.js.erb / temp.js文件中使用I18n.locale变量(不使用ruby)。例如:

    if (I18n.locale) == 'es' {
         someJScode;
    } else if (I18n.locale == 'en') {
         someJScode;
    }