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

时间:2015-09-23 04:28:38

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

我在 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'}

所以基本上我希望所有讲德语的国家都有所依赖:所有法语国家都会回归:fr。

但是,我在任何情况下都不希望:fr回退:at。这是出于搜索引擎优化的目的,因为一些法语页面没有配置元数据。所以现在法语页面会显示奥地利语:元数据输入。哪个错了。

如果我完全拒绝后退:

config.i18n.fallbacks = false

以下在我的观点中工作正常:

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

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

有没有办法关闭个别翻译的后备?

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

想出来 - 并考虑与你分享:

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

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

Et Voila!

答案 1 :(得分:1)

这在 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:您的语言环境有点不标准。 AFAIK 没有“at”语言环境,而只有“de-AT”。

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