定义命名空间资源中嵌套表单的翻译

问题描述 投票:0回答:1

我有以下设置

class BudgetLine < ApplicationRecord
  has_many :budget_line_items
  accepts_nested_attributes_for :budget_line_items
end

class BudgetLine::Accommodation < BudgetLine
end

class BudgetLineItem < ApplicationRecord
  belongs_to :budget_line
end

现在我尝试为

BudgetLineItem
内的
BudgetLine::Accommodation
的嵌套形式指定标签。根据 i18n documentation,你通常可以这样做:

en:
  activerecord:
    attributes:
      user/role:
        admin: "Admin"
        contributor: "Contributor"

如果相关模型没有命名空间(如上面的 User 所示),则此方法有效。然而,当你想指定一个命名空间模型时,它具有相同的语法,所以它变成:

en:
  activerecord:
    attributes:
      budget_line/accommodation/budget_line_items:
        unit: Room

这不起作用。

我尝试过不同的变体,例如

en:
  activerecord:
    attributes:
      budget_line:
        accommodation/budget_line_items:
          price: Price (USD)

这也不起作用,因为这种在语言环境中指定名称空间的方法似乎已被弃用。

据我了解,为了正确翻译标签,以下内容应该返回正确的翻译:

BudgetLine::Accommodation.human_attribute_name("budget_line_items.unit")
,但到目前为止,我尝试针对此目标的尝试并未成功。

有办法解决这个用例吗?

ruby-on-rails nested-attributes rails-i18n accepts-nested-attributes accepts-nested-attributes-for
1个回答
0
投票

它并没有被贬低。你只是对它应该如何工作抱有不切实际的期望。

Rails 通过 ActiveModel::Naming 提供的 API 查找翻译,该 API 仅基于类名:

class Foo
  extend ActiveModel::Naming
end

Foo.model_name.i18n_key  == :foo # true

# This is the correct way to define nested classes
class Foo
  class Bar
    extend ActiveModel::Naming
  end
end

Foo::Bar.i18n_key == :"foo/bar"

正如您所看到的,嵌套常量在 I18n 键的分隔符中使用

/
,因为
:
在 YAML 中具有特殊意义。

我不知道您是否可能混淆了常量嵌套(这是具有嵌套属性的语言级功能),或者只是以某种方式认为关联在其中发挥了作用(它们没有)。

如果您希望模型以不同的方式翻译,您可以使用具有不同嵌套的不同类:

class BudgetLine
  class Accommodation < BudgetLine
    class BudgetLineItem < ::BudgetLineItem 
      # ...
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.