翻译Rails模型关联 - 不工作

时间:2012-02-13 19:16:16

标签: ruby-on-rails ruby validation internationalization

任何人都有一些关于如何在Rails中翻译模型关联的提示?

例如:我有一个Person模型,可以有很多Phone。但是,一个人需要至少有一部电话。我无法翻译该验证。我能做的最好的就是:

validates_presence_of :phones, :message => "At least one phone is required."

在我的YAML上,我替换了这一行以省略%{attribute}

format: ! '%{message}'

这样只显示我的信息,并且我避免显示未翻译的字段名称。

这让我很头疼,因为有些宝石根本不允许我通过:message => "something describing the error",所以我想通过我的YAML配置所有错误信息。

另外,对于某些型号,我可以翻译他们的属性,而与其他型号我不能。例如:

activerecord:  
  attributes:
    additional_info:
      account_manager: "Manager"

这很有效。我可以在我的表格上看到"经理"。但是,当此字段出错时,Rails会将其显示为"Additional info account manager can't be blank"

我试过了:

activerecord:          
  errors:
    models:
      additional_info:
        attributes:
          account_manager: "Manager"

但没有运气。

我确实阅读了文档,但没有说明它为什么会发生。

2 个答案:

答案 0 :(得分:9)

Rails 3.2改变了这种行为。我之前发布的方式已被弃用。

现在,为了翻译关联,需要添加斜杠(而不是嵌套所有东西)。所以不要这样:

    activerecord:
      attributes:
        person:
          additional_info:
            account_manager: "Manager"

现在正确的是:

    activerecord:
      attributes:
        person:
          additional_info/account_manager: "Manager"

此外,我发现has_many关联的翻译方式与此不同。如果您要翻译它们,以下示例可能有所帮助:

    activerecord:
      attributes:
         emails:
           address: "E-mail field"

而不是上面的模型名称,您需要传递关联名称,在本例中为emails

检查此评论并提取请求以获取更多信息:

https://github.com/rails/rails/commit/c19bd4f88ea5cf56b2bc8ac0b97f59c5c89dbff7#commitcomment-619858

https://github.com/rails/rails/pull/3859

答案 1 :(得分:8)

以下是Rails 4.1的有效密钥路径:

# Basic Attribute on Model
activerecord:
  attributes:
    #{model_class.model_name.i18n_key}:
      #{attribute_name}:
        "Localized Value"

# Attribute on Nested Model
activerecord:
  attributes:
    #{model_class.model_name.i18n_key}/#{association_name}:
      #{attribute_name}:
        "Localized Value"
    #{association_name}:
      #{attribute_name}:
        "Fallback Localized Value"

因此,给定此模型(i18n_key具有:person):

class Person
  has_many :friends
end

您拥有以下区域定义:

activerecord:
  attributes:
    person:
      first_name:
        "My Name"
    person/friends:
      first_name:
        "My Friend's Name"
    friends:
      first_name:
        "A Friend's Name"

如果您的模型是名称空间,例如:

class MyApp::Person
  has_many :friends
end

i18n_key变为:my_app/person且您的/密钥开始消失:

activerecord:
  attributes:
    my_app/person:
      first_name:
        "My Name"
    my_app/person/friends:
      first_name:
        "My Friend's Name"
    friends:
      first_name:
        "A Friend's Name"