Rails 5的I18n默认语言环境和回退语言环境

9

在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在下面的回答中正确地设置了备用配置 (https://dev59.com/NK_la4cB1Zd3GeqP0vKJ#53453211)

然而,那不是问题所在。我了解到,问题出在我的nb.yml文件中。

  • 实验1。 删除nb.yml文件的所有内容,只留下“hello world”。成功:它打印属性(关联记录)名称。
  • 实验2。 用官方的Rails nb.yml替换我们的nb.yml:https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/nb.yml成功。我得到了有用的挪威语-英语消息 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:隐藏使您在服务器端失去了视野。规格、日志和控制台将显示验证失败:不能为空,但在 UI 中看起来很好。

我发布了另一个问题:Simpleform 错误没有属性名称,但在日志、控制台和规格中使用属性名称

2个回答

9
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]

赏金说明:“不要猜测,展示它的工作原理。”如果您像在猜测一样呈现它,请提供权威答案。谢谢! - oma
@oma 不确定你是否看到了,但我更新了我的回复。我也在Rails 5.2.0上尝试过了。 - Nate
纳特,就像你所说的,它确实会回退到 :en。然而这并没有解决我的问题,我想我可能是在问错问题,我犯了一个错误,假设了问题出在哪里。我认为我知道问题出在哪儿了,是我们/我自己的问题(就像99%的情况一样)。我们的 nb.yml 是问题所在。使用官方的 nb.yml https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/nb.yml 创建一个新的 Rails 5.2 app 不会有同样的问题。如果我用我们的 nb.yml 替换它,问题就会重新出现。我会更新我的问题,加上我学到的信息,并指向你的答案来解决回退的问题。 - oma
注意:按照[:en, :es, :de]的顺序设置回退语言选项是没有意义的,因为你可能会得到一个用户只能说其中一种语言的部分界面显示了4种不同语言的情况。 - Christopher Oezbek

1

我使用的是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 在初始化时将其设置为 true。但我仍然保留它,以便了解正在发生的情况(此外,spree 可能会在未来版本中停止覆盖此行为,因为在开发中不使用回退可能很有用,从而使缺少的翻译更加明显)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接