Rails 5 I18n default_locale 和后备语言环境

Rails 5 I18n default_locale and fallback locale

如何在 Rails 5.2 中设置后备语言环境?

现在,如果在语言环境中找不到属性名称,它会打印“(空白)”。我希望它在发生这种情况时回退到 :en 。

Rails 5具体?

# config/application.rb 
config.load_defaults 5.0
config.i18n.default_locale = :nb

运行 规格并获得:

#<ActiveRecord::RecordInvalid: Det oppstod en feil: er allerede i bruk>
see the missing part here:
#<ActiveRecord::RecordInvalid: Det oppstod en feil: [MISSING RECORD NAME] er allerede i bruk>

# switch to 
# config.i18n.default_locale = :en
#<ActiveRecord::RecordInvalid: Validation failed: Report date has already been taken> 

更新:

@Nate 在下面的回答中得到了正确的后备配置 ()

但这不是问题所在。我了解到,问题出在我的 nb.yml 中。

两种方法

# A: SHOW attribute name
nb: 
  errors:
    format: "%{attribute} %{message}"

# B: HIDE attribute name
nb:
  errors:
    format: "%{message}"

这导致了另一个问题。

方法B:HIDE 让你在服务器端失明。规范、日志和控制台将显示 Validation Failed: can't be blank 但它在 UI.

中看起来不错

我发布了另一个问题:Simpleform errors without attribute name, but using attribute name in logs, console, specs

Rails 5.2 允许您设置 config.i18n.fallbacks 来控制可以使用哪些后备语言环境。将其设置为一个符号数组,以控制在找不到翻译时应使用哪些语言环境。设置多个时,它会一个接一个地遍历数组,直到音译有效(或无效)。

在您的情况下,您需要在 config/application.rb 中包含以下内容:

config.i18n.default_locale = :nb
config.i18n.fallbacks = [:en]

这样,如果未指定语言环境,它将使用 :nb 语言环境(您的默认语言环境)。然后,任何时候在任何语言环境中翻译失败,它都会尝试 :en 语言环境作为后备。

注意:如果 none 的后备语言环境有您尝试翻译的键的翻译,您仍然会收到翻译缺失错误。

为了获得更完整的答案,这里有一个包含多个回退的示例。他们将按照指定的顺序进行检查:

config.i18n.default_locale = :nb
config.i18n.fallbacks = [:en, :es, :de]

Spree (4.1.5) + spree_i18n (3.3.2) 在 Rails (6.0.3.1) 上,我希望该站点使用西班牙语,并且由于缺少翻译而退回到英语。这对我有用:

# config/application.rb

config.after_initialize do
    config.i18n.default_locale = :es
    config.i18n.locale = :en
end
config.i18n.fallbacks = true

config.after_initialize 块是必需的,否则它将无法工作(spree_i18n 会在初始化时弄乱语言环境)。最后 config.i18n.fallbacks 行实际上不需要,因为初始化时 spree_i18n sets it to true 。但我还是把它留在那里,这样我就知道发生了什么(此外,spree 可能会在未来的版本中停止覆盖它,因为在开发过程中,不使用回退可能会很有用,从而使丢失的翻译更加明显)。