Rails I18n Cascading – 如何让它工作

我在Sven Fuchs的这篇博文中读到了关于I18n的级联可能性,但是我无法让它工作。

我试图将blogpost中提到的代码放入应用程序控制器并进入初始化程序,我也尝试传递级联选项,就像模块本身的注释中提到的那样,但似乎没有任何效果。

有没有人有关于如何在Rails 4应用程序中启动和运行I18n级联的任何提示或工作示例?

所以,终于有了这个工作。

问题是,默认情况下不包含级联模块,因此您必须自己包含它。 不幸的是,似乎没有预定义的配置选项(比如config.i18n.fallbacks ,但如果我错了请纠正我),所以你必须手动包含它:

 # config/application.rb module NameOfMyApp class Application < Rails::Application # some config code here I18n.backend.class.send(:include, I18n::Backend::Cascade) # more config code end end 

之后,如果将cascade: true选项传递给translate-helper,它将起作用。

一个例子

请考虑en.yml文件中包含以下行:

 # config/locales/en.yml en: title: 'Default application title' subtitle: 'Default application subtitle' footertext: 'Default text for footer' accounts: title: 'Default accounts title' subtitle: 'Default accounts subtitle' index: title: 'Accounts index title' 

在您的视图中,您可以像这样使用它:

 # app/views/account/index.html.erb <%= t('accounts.index.title', cascade: true) %> # => "Accounts index title" <%= t('accounts.index.subtitle', cascade: true) %> # => "Default accounts subtitle" <%= t('accounts.index.footertext', cascade: true) %> # => "Default text for footer" 

它也使用惰性查找 :

 # app/views/account/index.html.erb <%= t('.title', cascade: true) %> # => "Accounts index title" <%= t('.subtitle', cascade: true) %> # => "Default accounts subtitle" <%= t('.footertext', cascade: true) %> # => "Default text for footer" 

接受答案的一些额外信息(这对我帮助我很好地朝着正确的方向发展)。

如果您还希望级联查找是translate帮助程序的默认行为,那么可以通过覆盖translate方法来实现。 这样做你可以尽可能少地操作以使其工作。 很可能这个解决方案也应该向上兼容 – 只要翻译助手在方法签名等方面没有太大改变。

 # eg in config/initializers/i18n.rb # monkey-patch to let I18n.translate (and its alias 't') cascade for keys by default ActionView::Base.class_eval do def translate(key, options = {}) super(key, options.merge({ cascade: { skip_root: false } })) end alias t translate end 

此解决方案也是Sven Fuchs推荐的方法,并使用Rails 4.0.4进行测试。