Rails 5 I18n default_locale和后备区域设置

时间:2018-11-20 17:21:02

标签: ruby-on-rails-5 rails-i18n

如何在Rails 5.2中设置后备区域设置?

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

具体到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在下面的回答(https://stackoverflow.com/a/53453211/252799)中正确配置了后备配置

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

  • 实验1。 删除nb.yml的全部内容,只剩下一个问候世界。 Works :打印属性(关联记录)名称。
  • 实验2。 用正式的Rails nb.yml代替我们的nb.yml:https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/nb.yml Works 。我收到有用的挪威语-英语信息Det oppstod feil: Company må eksistere。不漂亮,但是很有帮助,我想要的!
  • 实验3。证明。 nb.yml重现了问题。

两种方法

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

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

这会导致另一个问题。

方法 B:隐藏使您在服务器端视而不见。规格,日志和控制台将显示Validation Failed: can't be blank,但在用户界面中看起来不错。

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

注意:如果您的所有后备语言环境都没有针对您要翻译的键进行翻译,则仍然会出现翻译丢失错误。

要获得更完整的答案,请参阅以下示例,该示例具有多个后备。将按照指定的顺序对其进行检查:

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

答案 1 :(得分:0)

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

# 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会在初始化时弄乱语言环境)。实际上,由于spree_i18n sets it to true在初始化时,实际上不需要最后一行config.i18n.fallbacks。但是无论如何,我还是把它留在那里,所以我知道发生了什么(此外,在以后的版本中,狂欢可能会停止覆盖此问题,因为在开发中,不要使用后备版本可能会很有用,这样会使丢失的翻译更加可见)。