Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails:Javascript字符串的国际化?_Javascript_Ruby On Rails_Internationalization - Fatal编程技术网

Rails:Javascript字符串的国际化?

Rails:Javascript字符串的国际化?,javascript,ruby-on-rails,internationalization,Javascript,Ruby On Rails,Internationalization,因此,我们现有的Rails 2.3.5应用程序根本不支持国际化。现在,我非常熟悉Rails I18n的内容,但是我们在/javascripts/中有很多输出字符串。我不是这个方法的超级粉丝,但不幸的是现在修复它已经太晚了 我们如何在Rails应用程序中国际化JS文件中存储的字符串?Rails甚至不提供JS文件 我想我可以一直让Rails应用程序提供JS文件,但这看起来很恶心。有插件可以这样做吗?是一个Rails插件,可以为您这样做。Balibu被放弃了。使用i18n js:为什么不做一些简单的事

因此,我们现有的Rails 2.3.5应用程序根本不支持国际化。现在,我非常熟悉Rails I18n的内容,但是我们在
/javascripts/
中有很多输出字符串。我不是这个方法的超级粉丝,但不幸的是现在修复它已经太晚了

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


我想我可以一直让Rails应用程序提供JS文件,但这看起来很恶心。有插件可以这样做吗?

是一个Rails插件,可以为您这样做。

Balibu被放弃了。使用i18n js:

为什么不做一些简单的事情,比如:

<script type="text/javascript">
  window.I18n = <%= I18n.backend.send(:translations).to_json.html_safe %>
</script>
我已经把我的包在了应用程序助手中

def current_translations
  @translations ||= I18n.backend.send(:translations)
  @translations[I18n.locale].with_indifferent_access
end
然后,我在my application.html.erb中的调用如下所示:

<script type="text/javascript">
  window.I18n = <%= current_translations.to_json.html_safe %>
</script>
// 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

Ryan的解决方案非常出色。 但是为了不包含整个文件,您应该使用:
@translations[I18n.locale]。具有访问权限[“alpha”]

与其使用
I18n.backend.send(:translations)[“alpha”]

为什么不在Javascript文件中简单地执行此操作:

var a_message = "<%= I18n.t 'my_key' %>"
var a_message=“”
要使其工作,必须将.erb添加到Javascript文件的扩展名中

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

<%# encoding: utf-8 %>


有关更多信息,请参阅此线程中接受答案的最后一条评论:

Ryan的上述解决方案是完美的,除非后端尚未初始化,否则需要初始化

I18n.backend.send(:init_translations) unless I18n.backend.initialized?
# now you can safely dump the translations to json
这对我来说很有用,我推荐它。如果您使用his,那么该插件将包含一个
/assets/i18n/filtered.js
文件,该文件将输出@ryan montgomery所回答的内容,而无需自己手动执行任何操作

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

对于您描述的“根本不支持国际化”和“现在修复它为时已晚”的应用程序,我写了一个非常快速的方法:jQuery插件quick-i18n:demo(以及如何使用它):

对于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 %>

window.I18n=
我还确定了翻译的范围,使其不具有庞大的javascript文件。我的范围是:javascript


希望它能帮助别人

另一个可能有用的选项:

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

assets/javascript/i18n.js.erb
希望能有帮助

很好用,谢谢。我还实现了这个
t
方法,使它更具railsish性<代码>t(“产品价格”)我刚刚花了一周的时间试图让i18n js正常工作。。。您的解决方案更简单,而且可以立即使用!“加载”翻译时,不需要包含整个文件
I18n.backend.send(:translations)
返回一个散列,这样您就可以使用类似于
I18n.backend.send(:translations)[“alpha”]
的内容来确定翻译的范围,这样只会加载您需要的部分。我不知道I18n js为什么如此复杂。这非常有效(甚至是预编译!),当我最终需要时,它将很容易被拆分和扩展。谢谢如何将其用于显示文本这样的翻译:“显示%{entry\u name}选项”这将很困难的一个主要原因是资产预编译。当资源被预编译时,javascript将与您的默认目录翻译一起放在公共目录中。你必须按需编译该资产。并不是说这是错的,但肯定有一些问题。当翻译返回空散列时,我被卡住了,直到我读到了你的答案!谢谢这个解决方案有两个问题:1。在生产环境中,语言环境将始终相同,因为编译的资产为2。每次更改yml中的翻译时,都需要清除
tmp/cache
I18n.backend.send(:init_translations) unless I18n.backend.initialized?
# now you can safely dump the translations to json
<%
@translator = I18n.backend
@translator.load_translations
@translations ||= @translator.send(:translations)[I18n.locale][:javascript]
%>

window.I18n = <%= @translations.to_json.html_safe %>
<%
@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;
};
...
<%= javascript_tag "var current_locale = '#{I18n.locale.to_s}';" %>
<%= javascript_tag "var default_locale = '#{I18n.default_locale}';" %>
...
// 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