如何仅针对某些区域设置启用Rails i18n后备,而不是全部?

时间:2014-01-10 09:42:02

标签: ruby-on-rails internationalization ruby-on-rails-4 fallback rails-i18n

我在Rails 4应用程序中使用i18n后备,以减少“de”和“de-AT”语言环境的重复翻译(可能会有更多像这样的对将来添加)。为了实现这一目标,我在application.rb

中启用了后备功能
config.i18n.fallbacks = true
config.i18n.fallbacks = {'de-AT' => 'de'}

但我不希望其他语言环境回归到英语(这是默认的语言环境),无论是在制作还是在开发中。

这是可能的,如果是的话,我该如何实现?

2 个答案:

答案 0 :(得分:0)

您是否尝试更改默认区域设置?

你在哪里

I18n.locale = :somelocale

尝试添加

I18n.default_locale = :somelocale

答案 1 :(得分:0)

这在 Rails 到 6.1 中很棘手,因为您需要 beat the logic in the Railtie initializer,而后者非常想回退到 default_locale

要将默认后备语言环境设置为 nil,您需要使用以下代码:

config.i18n.default_locale = :en
config.i18n.fallbacks.defaults = [[]] # If you just write [], then default_locale is used
config.i18n.fallbacks.map = {
  ca: :es, # Catalan fallback to Spanish
  de: "en-UK", # German fallback to UK English first, then automatically to :en
}

注意 #1:默认情况下,所有国家/地区变体 (en-US) 将首先回退到语言(例如 en),如果您想以不同的方式回退,您只需指定某些内容。

注意 #2:检查您是否正确设置:

...> rails console
2.7.2 :001 > I18n.fallbacks["de-AT"] # Check what happens with Austrian German?
 => [:"de-AT", :de, :"en-UK", :en]

2.7.2 :002 > I18n.fallbacks[:ca]     # Catalan falls back to Spanish
 => [:es]

2.7.2 :003 > I18n.fallbacks[:fr]     # French should have no fallback!
 => [:fr]

注意 #3:映射将被递归扩展。

config.i18n.fallbacks.map = {
  es: :fr, # Spanish to French
  fr: :en, # French to English
}

rails console
2.7.2 :001 > I18n.fallbacks[:es]
 => [:es, :fr, :en]

但是您不需要注意循环和/或重复项。这些都被过滤掉了。

注意#4:映射散列也可以将语言代码映射到数组,从左到右依次处理。

config.i18n.fallbacks.map = {
  ca: [:es, :fr, :en], # Catalan falls back to Spanish then French, then English
}

注意 #5:我还没有找到一个好的规范语言映射模型,它根据每个国家/地区的语言当前语言技能做出“适当”的回退决策,并将其编码到 Rails 中。

注意 #6:我强烈建议:

  • 使用 :en 作为所有事情的唯一和主要后备。
  • 保持 :en 版本尽可能简单和不惯用。
  • 在选定的地方自定义“en-US”和“en-UK”。
  • 如果您要翻译,请全面进行。部分翻译的用户界面非常令人恼火。

注意 #7:从 Rails 6.1.3 开始,默认情况下不再包含默认语言环境作为后备 (see this commit)