如何在 Rails 3 中使用 I18n 后备功能

Posted

技术标签:

【中文标题】如何在 Rails 3 中使用 I18n 后备功能【英文标题】:How to use the I18n fallback features in Rails 3 【发布时间】:2011-05-12 13:10:18 【问题描述】:

我收到来自 Rails 3 的“翻译缺失”错误消息:

activerecord:
  notices:
    messages:
      success: 
        create: "Something was created"
    models:
      user:
        success:
          create: "Thanks for registration"

I18n.t("activerecord.notices.models.user.success.create")
# => "Thanks for registration"


I18n.t("activerecord.notices.models.book.success.create") 
# => "translation missing: de, activerecord, notices, models, book, success, create"

我不知道为什么书本模型没有得到后备按摩。我已经设置了config.i18n.fallbacks = true

【问题讨论】:

文件中不存在密钥簿。查看相同的内容,然后通过添加图书密钥重试。 是的,它不存在,但这是使用后备的主要原因。如果你定义了一切,你就不需要后备。但我不能那样做。这对我来说太无用了。 如果您编辑问题以澄清更多信息会很好。你现在在哪个地区,你想回退到哪个地区? (好像你有自己的德语语言环境,但为什么要在里面写英文呢?) 【参考方案1】:

我通常设置在config/application.rb

    config.i18n.fallbacks = [:de, :fr, :en]

所以你可以声明回退的顺序。

但要注意在某些环境/*.rb 配置会被覆盖。

【讨论】:

不应该是公认的答案,OP 要求密钥后备(AKA 默认值),而不是语言后备。 @rewritten 你能再澄清一点吗?我觉得我不能很清楚的区分这两个,网上也找不到关于它的讨论。 @lulalala key fallback(默认)意味着如果在翻译中找不到特定的键,则会搜索另一个键:I18n.t("activerecord.notices.models.book.success.create", :default => I18n.t("activerecord.notices.messages.success.create"))。语言回退允许跳过一种语言的一些翻译,并使用另一种语言的翻译(相同的键)。 注意:这个数组中fallback的顺序不正确!从左到右搜索后备!【参考方案2】:

当一个 :default 选项被给出时,如果翻译丢失,它的值将被返回:

I18n.t :missing, :default => 'Not here'
# => 'Not here'

更多信息here

【讨论】:

好的,谢谢,这似乎对我有用 "I18n.t("activerecord.notices.models.#object.to_s.downcase.#type", :default => I18n. t("activerecord.notices.messages.#type"))"【参考方案3】:

在 rails 3+ 中,这是在 config/environments 文件中设置的:

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation can not be found)
  config.i18n.fallbacks = true

【讨论】:

默认情况下不再存在,但仍然可以添加。【参考方案4】:

[答案适用于 Rails 2]

您是否为后端启用了回退功能?假设它很简单(基于示例中的 yml):

把它放在初始化器中:

require "i18n/backend/fallbacks" 
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)

https://github.com/svenfuchs/i18n/wiki/Fallbacks

【讨论】:

对于 Rails,只需将其放入 config/initializers/i18n_fallbacks.rb 之类的文件中 这在 Rails 2 上对我有用——在包含 'i18n' gem 之后。【参考方案5】:

我相信处理缺失字符串的最佳方法是显示默认语言环境,而不是错误消息。

在 application.rb 中添加这一行以回退到英语语言环境。

config.i18n.fallbacks = [:en]

如果您想指定特定于语言环境的回退,您可以使用以下内容:

config.i18n.fallbacks = :de => [:de,:en], :en => [:en,:de]

另外,请注意,您可以根据您的环境启用和禁用回退。 因此,虽然在开发过程中显示错误可能是有意义的,但您可以改为在 environments/production.rb 中启用回退,使用以下命令:

config.i18n.fallbacks = true

【讨论】:

目前我不同意。如果其他开发人员更改或删除了翻译密钥并且稍后部署了应用程序,您可能会获得默认的语言环境字符串并且不知道错误,然后客户会抱怨。最好创建一个测试规范以确保某种语言的所有密钥都到位 对自身使用后备没有任何意义::de => [:de,:en]:de => [:en] 或只是 de: :en 相同。【参考方案6】:

I18n Fallback 功能存在误解。

此功能会导致当存在 缺少翻译异常(在这种情况下,当 I18n 无法找到与 "activerecord.notices.models.book.success.create" 键相关联的值时会发生这种情况您当前语言的语言环境文件)I18n 将在 预定义的备用语言列表中查找生成 缺少翻译异常的键的值, 如果找到 I18n 将返回该值,但如果在任何其他语言环境文件中找不到它 I18n 将返回 缺少翻译异常 .

所以当你定义config.i18n.fallbacks = true时,这并不意味着当缺少翻译异常发生时,在这种情况下:

I18n.t("activerecord.models.book.success.create")
# => "translation missing: de, activerecord, notices, models, book, success, create"

I18n 将在您的语言环境文件中查找类似的键以返回其值,可能是:

I18n.t("activerecord.models.user.success.create")
# => "Thanks for registration"

I18n 会在您的默认后备语言中查找发生缺少翻译异常的特定语言会发生什么。


一个很好的用法示例是:

# using :"en-US" as a default locale:
I18n.default_locale = :"en-US" 
I18n.fallbacks[:es] # => [:es, :"en-US", :en]

语言环境文件:

es:
  activerecord:
    notices:
      messages:
        success: 
          create: "Algo fue creado"
      models:
        user:
          success:
            create: "Gracias por registrarte"
en-US:
  activerecord:
      ...
      models:
        books:
          success:
            create: "The model was created" 

英文网站调用:

I18n.t("activerecord.models.books.success.create")
# => "The model was created"

在西班牙语网站上调用:

#with config.i18n.fallbacks = false
I18n.t("activerecord.models.books.success.create")
# => "translation missing: es, activerecord, models, book, success, create"

#with config.i18n.fallbacks = true
I18n.t("activerecord.models.books.success.create")
# => "The model was created"

更多信息请查看:https://github.com/ruby-i18n/i18n

【讨论】:

我发现您提供的链接并没有真正解释太多,但其他答案很好。

以上是关于如何在 Rails 3 中使用 I18n 后备功能的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 Rails 中构建 i18n yaml 文件?

如何在没有后备表的 Rails 中创建只读模型

使用rails(I18n)Api翻译错误消息

Rails i18n如何获取某个键的所有值?

如何在Rails中的I18n zh-CN文件中返回数组转换?

Rails:如何将I18N放入SVG文件