避免 I18n 回退到默认语言环境

Avoid I18n Fallback to default locale

我在 application.rb

中配置了以下内容
config.i18n.available_locales = [:at, :de, :ch_de, :ch_fr, :fr, :int_en, :int_fr]
config.i18n.default_locale = :at

我的默认语言环境设置为 :at(奥地利)。我需要路由转换。 Rails 没有它服务器将无法启动,公平地说这是有道理的。

我现在创建了一个后备地图,效果很好:

config.i18n.fallbacks = {'de' => 'at', 'ch_de' => 'at', 'ch_fr' => 'fr', 'int_fr' => 'fr', 'fr' => 'fr', 'int_en' => 'int_en'}

所以基本上我希望所有讲德语的国家都使用 :at,而所有讲法语的国家都使用 :fr。

但是,我在任何情况下都不希望 :fr 退回到 :at。这是为了 SEO 目的,因为一些法语页面没有配置元数据。所以现在法语页面将显示奥地利语 :at 元数据条目。哪一个是错误的。

如果我完全关闭回退:

config.i18n.fallbacks = false

以下在我看来很好用:

t('.metatitle', :default => "")

在这种情况下,如果没有可用的翻译,则不会显示任何内容。但是,网站的其余部分已经存在依赖于回退 - 因此考虑到实施更改的努力,这不是一个选项。

有没有办法关闭个别翻译的回退?

或者我是否可以实施回退地图并确保地图不会回退到它的默认语言环境,例如如果不存在法语 :fr 翻译?

PS: 路由翻译gem需要默认语言环境是this one here.

感谢您的帮助!

弄明白了 - 并想与您分享:

如果您希望避免在个别翻译时回退到默认语言环境,您只需发送一个空的回退数组,如下所示:

t('.metatitle', :default => "", :fallback => [])

瞧瞧!

这在 Rails 到 6.1 中是棘手的,因为你需要 beat the logic in the Railtie initializer 迫切希望回退到 default_locale.

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

config.i18n.default_locale = "de-AT"
config.i18n.fallbacks.defaults = [[]] # If you just write [], then default_locale is used
config.i18n.fallbacks.map = {
  :de => "de-AT",
  "de-CH" => "de-AT",
}

让我们检查一下:

$ rails console
2.7.2 :001 > I18n.fallbacks["de"]
 => [:de, :"de-AT"]
2.7.2 :002 > I18n.fallbacks["fr"]
 => [:fr]
2.7.2 :003 > I18n.fallbacks["de-CH"]
 => [:"de-CH", :de, :"de-AT"]
2.7.2 :004 > I18n.fallbacks["de-AT"]
 => [:"de-AT", :de]
2.7.2 :005 >

不是您想要的 100%,但似乎没有办法阻止回退从国家/地区特定区域设置到通用语言区域设置,当回退启用时。

注意#1:您的语言环境有点不标准。据我所知,没有 'at' 语言环境,只有“de-AT”。

注释 #2:Some more subtleties and notes in this answer.