如何在 Ruby 类/模块命名空间中翻译模型?

Posted

技术标签:

【中文标题】如何在 Ruby 类/模块命名空间中翻译模型?【英文标题】:How to translate model in Ruby class/module namespace? 【发布时间】:2011-12-03 07:55:12 【问题描述】:

我有一个模型 Products::Car。如何翻译它的属性?

我已经试过了:

activerecord: 
  models:
    products:
      car: "Автомобиль"
  attributes:
    products:
      car:
        owner: "Владелец"

还有这个:

activerecord: 
  models:
    products_car: "Автомобиль"
  attributes:
    products_car:
      owner: "Владелец"

但如果我尝试使用 Products::Car.model_name.human 它仍然显示“汽车”。我的其他翻译效果很好,语言设置为:ru。

【问题讨论】:

参考这个答案:***.com/questions/2521383/… @HarishShetty 这个答案对这里的命名空间问题没有任何帮助! 【参考方案1】:

我检查了“model_name.human”源代码并找到了“i18n_key”方法。我试过这个:

irb(main):006:0> Products::Car.model_name.i18n_key
=> :"products/car"

然后我将我的 yml 文件更改为:

activerecord:    
  models:
    products/car: "Автомобиль"   
  attributes:
    products/car:
      owner: "Владелец"

它有效!

编辑:

供进一步参考:i18n_key 设置在 ActiveModel::Name https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/activemodel/lib/active_model/naming.rb#L147 的初始化程序中

它只是基于

MyClass.name.underscore

【讨论】:

感谢您分享找到此问题的方法。这是一个命名空间之后的单数模型名称让我感到困惑。 十年和三个 Rails 版本之后,这种 yml 语法仍然有效。活动模型 6.1.3.1。在这里。【参考方案2】:

从 rails 3.2.12 开始,它似乎被转换回这个:

activerecord: 
  models:
    products:
      car: "Автомобиль"
  attributes:
    products:
      car:
        owner: "Владелец"

products/car: "Автомобиль" 不再工作了

【讨论】:

以上是关于如何在 Ruby 类/模块命名空间中翻译模型?的主要内容,如果未能解决你的问题,请参考以下文章

ruby 加载命名空间目录中的所有模块

在控制器中找不到命名空间内的 Ruby on Rails 模型

如何防止从命名空间内访问类?

处理命名空间中的命名空间模型(类)

ruby 从命名空间#ruby #autoload自动加载一个类

在 Ruby 中动态定义命名类