区域设置从国家/地区回退到语言,而无需单独定义每个

时间:2012-11-13 22:29:20

标签: ruby-on-rails localization fallback globalize3 rails-i18n

我正在使用默认导轨I18n本地化应用程序,其中globalize3作为后端。

在自动转到默认回退之前,是否可以设置包含国家/地区代码(即:fr-CA)的区域设置以回退到其特定语言(:fr)?我知道可以使用

手动设置每个区域设置/国家/地区
config.i18n.fallbacks = {'fr-CA' => 'fr'}

但是不必手动添加每个回退并自动执行此行为会很好。

1 个答案:

答案 0 :(得分:2)

为了实现这一点,我有一个带

的初始化器
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)

有关详细信息,请参阅the source code

修改:

这让我想起,ActionView LookupContext中有an annoying bug阻止它为本地化视图工作(尽管它适用于语言环境文件)。我发现它还没有修好。基本上,如果您有任何本地化视图(例如,由于其长度而不适合存储在区域设置文件中的帮助页面),则fr-CA区域设置将回退到名为help的视图。 fr.html.erb。您必须将文件命名为help.fr-CA.html.erb ,这就是我所做的,使用另一个初始化程序monkeypatch LookupContext,如下所示:

module ActionView
  class LookupContext
    # Override locale= to also set the I18n.locale. If the current I18n.config object responds
    # to original_config, it means that it's has a copy of the original I18n configuration and it's
    # acting as proxy, which we need to skip.
    def locale=(value)
      if value
        config = I18n.config.respond_to?(:original_config) ? I18n.config.original_config : I18n.config
        config.locale = value[0,2] # only use first part of the locale in lookups
      end
      super(@skip_default_locale ? I18n.locale : default_locale)
    end
  end
end

另一个编辑:请注意,该修补程序非常粗糙,会破坏完整的区域设置查找,直接针对该语言。如果您还需要完全匹配的视图(language-REGION),您需要改进我的代码!