在 I18n 插值中使用另一个 I18n 键
Posted
技术标签:
【中文标题】在 I18n 插值中使用另一个 I18n 键【英文标题】:Use another I18n key in an I18n interpolation 【发布时间】:2012-12-27 16:56:40 【问题描述】:这可能是 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
中的 my_var
键?
我知道我可以通过做类似的事情来完成它
I18n.t 'my_message', :my_var => I18n.t('my_var')
但我希望 I18n 有办法自引用密钥。
【问题讨论】:
【参考方案1】:这实际上是一个很常见的问题,但简短的回答是否定的,不幸的是这是不可能的:(
【讨论】:
不幸的是,这是正确的答案。供您参考@Aaron,请参阅 SO 问题/答案here 和 here。 这个答案真的正确吗?还是没办法?【参考方案2】:目前我正在为之奋斗...最后我创建了一个自定义 yaml 类型。
在初始化部分。
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
应用自定义内置类型。
【讨论】:
非常酷!我必须阅读 Psych 和add_builtin_type
才能完全了解性能特征,但这看起来是一个很棒的补丁。【参考方案3】:
正如你所说,从视图到翻译两次调用可能不是一个那么直接的解决方案
<%= t("my_message", my_var: t("my_var") ) %>
但让您可以灵活地使用变量调用
<%= t("my_message", my_var: t("my_#$item[:slug]") ) %>
【讨论】:
以上是关于在 I18n 插值中使用另一个 I18n 键的主要内容,如果未能解决你的问题,请参考以下文章