我正在使用默认的 rails I18n 本地化一个应用程序,并将 globalize3 作为后端。
是否可以在自动转到默认回退之前设置带有国家代码(即:fr-CA
)的区域设置以回退到其特定语言( )?:fr
我知道可以手动设置每个语言环境/国家/地区
config.i18n.fallbacks = {'fr-CA' => 'fr'}
但是最好不必手动添加每个后备并自动执行此行为。
我正在使用默认的 rails I18n 本地化一个应用程序,并将 globalize3 作为后端。
是否可以在自动转到默认回退之前设置带有国家代码(即:fr-CA
)的区域设置以回退到其特定语言( )?:fr
我知道可以手动设置每个语言环境/国家/地区
config.i18n.fallbacks = {'fr-CA' => 'fr'}
但是最好不必手动添加每个后备并自动执行此行为。
为了准确地实现这一点,我有一个初始化器
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
有关更多信息,请参阅源代码。
编辑:
这提醒了我,ActionView LookupContext 中有一个烦人的错误,它阻止了本地化视图的工作(尽管它适用于语言环境文件)。我看还没有修好。基本上,如果您有任何本地化视图(例如帮助页面,由于它们的长度不适合存储在语言环境文件中),那么 fr-CA 语言环境将不会退回到名为 help.fr.html.erb 的视图。您要么必须将文件命名为 help.fr-CA.html.erb ,要么就像我所做的那样,用另一个初始化程序对 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
另一个编辑:请注意,该补丁相当粗糙并且破坏了完整的语言环境查找,直接针对语言。如果您还需要完全匹配的视图(语言区域),您需要改进我的代码!