代码之家  ›  专栏  ›  技术社区  ›  Matt Rogish

Rails:javascript字符串的国际化?

  •  53
  • Matt Rogish  · 技术社区  · 14 年前

    因此,我们现有的Rails2.3.5应用程序根本不支持国际化。现在,我很熟悉Railsi18n的东西,但是我们里面有很多输出字符串 /javascripts/ . 我不太喜欢这种方法,但不幸的是现在解决它为时已晚。

    我们如何将Rails应用程序中JS文件中存储的字符串国际化?Rails甚至不提供JS文件…

    我想我可以一直让Rails应用程序为JS文件提供服务,但这看起来相当糟糕。有插件可以做到这一点吗?

    10 回复  |  直到 9 年前
        1
  •  93
  •   rmontgomery429    12 年前

    为什么不简单的比如:

    <script type="text/javascript">
      window.I18n = <%= I18n.backend.send(:translations).to_json.html_safe %>
    </script>
    

    在JS中,您可以执行以下操作:

    I18n["en-US"]["alpha"]["bravo"];
    

    我把我的包在一个应用程序助手中。

    def current_translations
      @translations ||= I18n.backend.send(:translations)
      @translations[I18n.locale].with_indifferent_access
    end
    

    然后我在application.html.erb中的调用如下:

    <script type="text/javascript">
      window.I18n = <%= current_translations.to_json.html_safe %>
    </script>
    

    这允许您避免在javascript中了解当前的区域设置。

    I18n["alpha"]["bravo"];
    

    I18n.alpha.bravo;
    
        2
  •  18
  •   Felipe Elias Philipp    12 年前

    巴厘布岛被遗弃。使用I18N JS: https://github.com/fnando/i18n-js

        3
  •  8
  •   life_like_weeds    11 年前

    Ryan的上述解决方案是完美的,但如果后端还没有初始化,就需要对其进行初始化。

    I18n.backend.send(:init_translations) unless I18n.backend.initialized?
    # now you can safely dump the translations to json
    
        4
  •  6
  •   Vince V.    11 年前

    对于Rails 3应用程序,您可以这样做:

    创建一个i18n.js.erb文件并将其添加到application.js中。加上这段代码 进入文件。

    <%
    @translator = I18n.backend
    @translator.load_translations
    @translations ||= @translator.send(:translations)[I18n.locale][:javascript]
    %>
    
    window.I18n = <%= @translations.to_json.html_safe %>
    

    我还将翻译范围限定为没有巨大的javascript文件。我的范围是:javascript。

    希望它能帮助别人!

        5
  •  5
  •   Community WizardZ    7 年前

    为什么不简单地在您的javascript文件中这样做:

    var a_message = "<%= I18n.t 'my_key' %>"
    

    要使其生效,必须将.erb添加到JavaScript文件的扩展名中。

    如果不使用ruby>=2.0,您可能还需要在javascript文件的顶部添加以下行。

    <%# encoding: utf-8 %>
    

    有关详细信息,请参阅此线程中已接受答案的最后一条注释: Encoding issues in javascript files using rails asset pipeline

        6
  •  2
  •   sblom    14 年前

    Babilu 是一个为您做这件事的Rails插件。

        7
  •  2
  •   Simo    10 年前

    另一个可能有用的选项:

    假设您有一个包含所有可用语言的模型语言(slug)。 它处理缺少翻译的情况(替换为默认区域设置版本)

    资产/javascript/i18n.js.erb

    <%
    @translator = I18n.backend
    @translator.load_translations
    
    translations = {}
    Language.all.each do |l|
        translations[l.slug] = @translator.send(:translations)[l.slug.to_sym]
    end
    
    @translations = translations
    
    %>
    window.I18n = <%= @translations.to_json.html_safe %>
    
    window.I18n.t = function(key){
        if(window.I18n[current_locale]){
            el = eval("I18n['"+current_locale+"']." + key);
        }
        if(window.I18n[default_locale] && typeof(el) == 'undefined'){
            el = eval("I18n['"+default_locale+"']." + key);
        }
        if(typeof(el) == 'undefined'){
            el = key;
        }
        return el;
    };
    

    视图/layout/application.html.erb

    ...
    <%= javascript_tag "var current_locale = '#{I18n.locale.to_s}';" %>
    <%= javascript_tag "var default_locale = '#{I18n.default_locale}';" %>
    ...
    

    在JavaScript代码中,可以这样翻译:

    // current_locale:fr , default_locale:en
    
    // existing translation (in french) 
    I18n.t('message.hello_world'); // => Bonjour le monde
    
    // non-existing translation (in french) but existing in english 
    I18n.t('message.hello_this_world'); // => Hello this world
    
    // non-existing translation (french & english) 
    I18n.t('message.hello_this_new_world'); // => message.hello_this_new_world
    

    希望有帮助!

        8
  •  1
  •   macler    11 年前

    Ryan的解决方案很出色。 但要不包括应使用的整个文件,请执行以下操作: @translations[I18n.locale].with_indifferent_access["alpha"] 而不是 I18n.backend.send(:translations)["alpha"]

        9
  •  0
  •   robbie613    11 年前

    I18n-js 对我来说工作很好,我会推荐它。如果你用他的 rewrite branch 然后该插件将包含 /assets/i18n/filtered.js 输出@ryan montgomery所回答的内容的文件,无需手动执行任何操作。

    这样,您就可以在后端使用相同的翻译。 使用Rails帮助程序 t(:key) 并使用 I18n.t('key') 在前端的javascript中。

        10
  •  0
  •   Johann Echavarria    11 年前

    对于像您所描述的“根本不支持国际化”和“现在修复太晚”这样的应用程序,我编写了一个非常快速的方法:jquery插件quick-i18n: https://github.com/katio/Quick-i18n 演示(以及如何使用): http://johannpaul.net/Quick-i18n/