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/