如何仅为某些地区而不是全部地区启用Rails i18n回退



我在Rails 4应用程序中使用i18n回退,以减少"de"one_answers"de AT"区域设置的重复翻译(将来可能会添加更多类似的对)。为了实现这一点,我在application.rb:中启用了回退

config.i18n.fallbacks = true
config.i18n.fallbacks = {'de-AT' => 'de'}

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

这可能吗?如果可能,我该如何实现?

这在6.1之前的Rails中很棘手,因为您需要击败Railtie初始化器中迫切希望回退到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";在选定的位置
  • 如果你真的要翻译,就要全面地翻译。对UI进行部分翻译是非常令人恼火的

注意#7:从Rails 6.1.3开始,默认区域设置默认情况下不再作为后备(请参阅此提交)包含

您尝试过更改默认区域设置吗?

在哪里

I18n.locale = :somelocale

尝试添加

I18n.default_locale = :somelocale

最新更新