【问题标题】:Translate Rails model association - not working翻译 Rails 模型关联 - 不工作
【发布时间】:2012-02-13 19:16:16
【问题描述】:

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

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

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

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

format: ! '%{message}'

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

这让我很头疼,因为有些 gem 根本不允许我传递: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"

但没有运气。

我确实阅读了文档,但不知道为什么会这样。

【问题讨论】:

    标签: ruby-on-rails ruby validation internationalization


    【解决方案1】:

    以下是 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"
    

    因此,鉴于此模型(具有 :personi18n_key):

    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"
    

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      • 我在想这样的事情,但不知道物品的确切位置,也不知道如何找到它,谢谢!,非常感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多