这可能是I18n-ception,但我可以说我有一个en.yml
文件,如下所示
en:
my_var: Foo
my_message: "This is a message where I'd like to interpolate I18n's %{my_var}"
有没有办法向I18n表明%{my_var}
应该是my_var
中的en.yml
键?
我知道我可以通过做类似
的事情来完成它I18n.t 'my_message', :my_var => I18n.t('my_var')
但我希望I18n有办法自我引用键。
答案 0 :(得分:32)
这实际上是一个非常常见的问题,但简短的回答是否定的,不幸的是,这是不可能的:(
答案 1 :(得分:3)
目前我为此奋斗......最后我创建了一个自定义的yaml类型。
在init部分。
Psych.add_builtin_type('i18n') { |_type, value|
->(_key, _options) do
value.gsub(/%\{([\w.]+)\}/) do |match|
key = $1.to_sym
if I18n.exists?(key)
I18n.t(key)
else
match
end
end
end
}
I18n.reload!
在en.yml
中en:
my_var: Foo
my_message: !!i18n "This is a message where I'd like to interpolate I18n's %{my_var}"
!!i18n
应用自定义内置类型。
答案 2 :(得分:2)
正如你所说,也许从视图到翻译的两次调用不是一个如此直接的解决方案
<%= t("my_message", my_var: t("my_var") ) %>
但是您可以灵活地使用变量
进行调用<%= t("my_message", my_var: t("my_#{$item[:slug]}") ) %>