如何在Rails 3中使用I18n回退功能

38

我从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


文件中缺少关键书籍。请查看并尝试添加书籍关键字。 - Naren Sisodiya
是的,它不存在,但这就是使用后备方案的主要原因。如果您定义了所有内容,就不需要后备方案。但我做不到。对我来说,这太多无用的工作了。 - antpaw
1
如果你能编辑一下问题,更加明确就好了。你现在所处的地区是哪个?你想要回退到哪个地区呢?(看起来你有自己的德语地区,但为什么要用英语写呢?) - lulalala
6个回答

105

通常我会在config/application.rb中进行设置。

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

你可以声明回退的顺序。

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


3
这个答案不应该被接受,OP 寻求的是关键词回退(也称为默认值),而不是语言回退。 - rewritten
@rewritten,您能再澄清一下吗?我感觉我不能很清楚地区分这两个,也找不到在线讨论。 - lulalala
1
@lulalala 关键回退(默认)意味着如果在翻译中找不到特定的关键字,则会搜索另一个关键字:I18n.t("activerecord.notices.models.book.success.create", :default => I18n.t("activerecord.notices.messages.success.create"))。语言回退允许跳过某些语言的翻译,而使用另一种语言的翻译(相同的关键字)。 - rewritten
注意:此数组中的回退顺序不正确!回退将从左到右搜索! - Christopher Oezbek

45

如果给定了 :default 选项,则在翻译缺失时返回其值:

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

更多信息,请点击这里


好的,谢谢。这对我来说似乎有效。 "I18n.t("activerecord.notices.models.#{object.to_s.downcase}.#{type}", :default => I18n.t("activerecord.notices.messages.#{type}"))" - antpaw

18
在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

这不再是默认设置,但仍然可以添加。 - tybro0103

18

[回答适用于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。 - Simon Hürlimann
这对我在Rails 2上有效 - 在包含“i18n” gem之后。 - Dave Burt

13

我认为处理缺失字符串的最佳方式是显示默认的本地化,而不是错误消息。

在application.rb中添加以下行来回退到英语本地化。

config.i18n.fallbacks = [:en]

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

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

此外,请注意您可以根据您的环境启用和禁用后备功能。因此,在开发过程中,显示错误可能是有意义的,但您可以在environments/production.rb中启用后备功能,方法如下:

config.i18n.fallbacks = true

1
目前我持不同意见。如果其他开发人员更改或删除了翻译键,然后应用程序稍后部署,您可能会收到默认的本地化字符串,并且对错误一无所知,然后客户投诉。最好创建一个测试规范,以确保某种语言的所有键都已就位。 - Rui Nunes
在自身上使用回退没有任何意义::de => [:de,:en]:de => [:en] 或者只是 de: :en 是一样的。 - Christopher Oezbek

7

关于 I18n 回退 功能存在误解。

该功能会导致当出现缺失翻译异常时(在这种情况下,当 I18n 无法在当前语言的区域文件中找到与 "activerecord.notices.models.book.success.create" 键相关联的值时),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


我发现你给出的链接并没有解释太多,但其他方面是个很好的答案。 - Christopher Oezbek

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