从 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
而不是简单的t
。 t
是仅在视图中可用的辅助方法,将整个逻辑委托给 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 - 想要在模型中翻译自定义消息