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

41

我模型中有:

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') - Roman Kiselenko
2个回答

107

呼叫:

I18n.t 

替换简单的 t。在视图中,t 是一个帮助方法,将所有逻辑委托给 I18n 模块。

更新:

如评论中所述,视图助手不仅委托给 I18n 模块,还确保您可以使用默认作用域。


10
为了解释原因:这是因为t是视图助手。视图助手在模型中(以及其他地方)不可用,因此需要完整调用I18n.t - joanwolk
1
太好了。我需要在“单元格”内访问i18n - 运行得很好。 - Mikey Hogarth
2
值得一提的是,I18n.t不同于在视图中调用translatehttps://github.com/rails/rails/blob/v5.1.1/actionview/lib/action_view/helpers/translation_helper.rb#L18 - Artur INTECH
有没有办法在模型中使用I18n助手,这样我们就可以直接调用t()而不是I18n.t了?在模型内部调用翻译的情况有很多合理的用例,包括自定义验证错误消息等。 - Aaron Wallentine

2
# constants
def self.option_enum
    [ 
      [ I18n.t('enum.amount'), 'A' ], 
      [ I18n.t('enum.percentage'), 'P' ] 
    ]
end

这在像德语这样的语言中根本行不通,因为每个名词都以大写字母开头。大小写是语言本身的问题,不应该在代码内部“修复”。 - BroiSatse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接