从 Rails 模型内部访问翻译文件 (i18n)

Posted

技术标签:

【中文标题】从 Rails 模型内部访问翻译文件 (i18n)【英文标题】:Access translation file (i18n) from inside rails model 【发布时间】:2014-02-05 08:26:12 【问题描述】:

我的模型中有:

def body_color_enum
  [
    ['Aqua', '#009c9c'],
    ['Grey', '#6d6e71'],
    ['Yellow', '#ffe600'],
    ['White', 'white']
  ]
end

我希望这些值来自翻译文件 'en.yml'

en:
  group:
    hero:
      hex1: '#6d6e71'
      name1: 'Dark grey'
      hex2: '#ccc'
      name2: 'Light grey'
      hex3: '#0099ce'
      name3: 'Blue'
      hex4: '#ffffff'
      name4: 'White'

我试过这个:

def body_color_enum
  [
    [t('group.hero.name1'), '#009c9c'],
    ['Grey', '#6d6e71'],
    ['Yellow', '#ffe600'],
    ['White', 'white']
  ]
end

但我得到这个错误:

undefined method `t' for #<Group:0x007fabad847ac8>

所以我要问的是如何从模型访问我的本地文件,以便我可以在 body_color_enum 方法中设置我的值。

【问题讨论】:

I18n.t('group.hero.name1') 【参考方案1】:

呼叫:

I18n.t 

而不是简单的tt 是仅在视图中可用的辅助方法,将整个逻辑委托给 I18n 模块。

更新:

正如 cmets 中提到的,视图助手不仅委托给 I18n 模块,它还确保您也可以使用默认范围。

【讨论】:

解释原因:这是因为t 是一个视图助手。视图助手在模型中(以及其他地方)不可用,因此需要完整调用 I18n.t 可爱的东西。我需要它来访问“单元格”中的 i18n - 就像一个魅力。 值得一提的是,I18n.t 与在视图github.com/rails/rails/blob/v5.1.1/actionview/lib/action_view/… 中调用translate 不同【参考方案2】:
# constants
def self.option_enum
    [ 
      [ I18n.t('enum.amount'), 'A' ], 
      [ I18n.t('enum.percentage'), 'P' ] 
    ]
end

【讨论】:

这根本不适用于德语等每个名词都以大写字母开头的语言。大小写是语言本身的问题,不应在代码中“固定”

以上是关于从 Rails 模型内部访问翻译文件 (i18n)的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails i18n - 想要在模型中翻译自定义消息

如何使用 i18n 和 rails 配置语言环境别名?

如何在Rails中的I18n zh-CN文件中返回数组转换?

如何在 Rails 3 中使用 I18n 后备功能

从rails模型内部登录

你如何在 Rails 中构建 i18n yaml 文件?