在Rails 3.2中明确重新加载资产

时间:2012-01-27 14:51:02

标签: ruby-on-rails internationalization asset-pipeline sprockets

我正在使用BackboneJS和RoR 3.2(从3.1升级)后端构建单页ajax应用程序。我使用客户端I18n javascript翻译库将其数据保存在JSON对象中。我正在使用yml文件和默认的i18n gem来管理后端的翻译。 我每种语言都有一个翻译资产,例如英语:

//FILE: <project_root>/app/assets/javascripts/translations/en.js.erb:
I18n || (I18n = {});
I18n.translations || (I18n.translations= {});
I18n.translations["en"] = <%= I18n.with_locale(:en) { I18n.t(".") }.to_json %>;

我的翻译在config / locales /及其子目录下。我按如下方式配置了加载路径:

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]

到目前为止,一切正常,但是,在开发模式下重新加载页面后,添加到yaml文件的新翻译不会自动在客户端上可用。只有在我重新启动服务器并对相应的翻译资产进行更改(例如添加空白行)时,才能使用新的翻译。这个例程非常繁琐......

  1. 如何明确告诉资产管道/链接器每次请求重新处理我的翻译资产?或者更好的是,有一个(简单的)解决方案来监控yaml文件并告诉sprockets重新处理翻译资产吗?
  2. 当新的翻译被添加到新的或现有的yaml文件时,Rails以某种方式不会自动更新i18n翻译哈希。我不知道为什么,但这应该正常工作。有任何线索吗?

2 个答案:

答案 0 :(得分:1)

  1. 我没有看到每次请求都重新加载它的可能性。我认为这需要在i18n-js gem中解决。删除tmp/i18n-js.cache没有帮助。你能做的就是调用rake i18n:js:export来重新加载js输出。结合守卫,你可以自己重装。

  2. rails错过了新的翻译文件,但是将翻译添加到现有文件应该有效。你也可以用I18n.backend.reload!

  3. 强制它

答案 1 :(得分:1)

Rails 4.x

我无法让I18n.js在更改后重新加载文件。

docs之后,我发现我必须运行rake i18n:js:setup,即使我的应用中未禁用资产管道。

在更改之后,现在在config目录中使用I18n-js.yml文件,我进行了更改并运行rake i18n:js:export并且一切正常。

希望这有助于某人。