Rails:Javascriptstring的国际化?

所以,我们有一个现有的Rails 2.3.5应用程序根本不支持国际化。 现在,我对Rails I18n的东西非常熟悉,但是在/javascripts/里面有很多的输出string。 我不是这种方法的巨大的粉丝,但不幸的是现在修复它为时已晚。

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

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

为什么不是简单的:

 <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; 

Balibu被遗弃。 使用i18n-js: https : //github.com/fnando/i18n-js

上面的Ryan的解决scheme是完美的,除了后端需要被初始化,如果它还没有。

 I18n.backend.send(:init_translations) unless I18n.backend.initialized? # now you can safely dump the translations to json 

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

创build一个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。

希望它可以帮助别人!

为什么不简单在你的JavaScript文件中:

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

为此,您必须将.erb添加到您的Javascript文件的扩展名中。

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

 <%# encoding: utf-8 %> 

有关更多信息,请参阅本主题中已接受答案的最后一条评论: 使用Rail资产pipe道对JavaScript文件进行编码问题

Babilu是一个Rails插件,为你做到这一点。

另一个可能有用的选项:

假设您有一个包含所有可用语言的模型语言(slug)。 它处理的情况下,有一个缺less的翻译(它被replace为默认的语言环境版本)

资产/ 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; }; 

视图/布局/ 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 

希望它有帮助!

瑞安的解决scheme是高明的。 但是不包括整个文件,你应该使用: @translations[I18n.locale].with_indifferent_access["alpha"]而不是I18n.backend.send(:translations)["alpha"]

I18n-js正在为我工​​作,我会推荐它。 如果你使用他的重写分支,那么这个插件将会包含一个/assets/i18n/filtered.js文件,它可以完全输出@ ryan-montgomery的回答,而不需要手动去做任何事情。

这样,你可以在后台使用与Rails助手t(:key)相同的翻译,并在前端的Javascript中使用I18n.t('key')

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