33

这可能是 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 有办法自我引用密钥。

4

3 回答 3

39

这实际上是一个很常见的问题,但简短的回答是否定的,不幸的是这是不可能的:(

于 2013-01-13T18:17:57.207 回答
3

目前我正在为此奋斗......最后我创建了一个自定义 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应用自定义内置类型。

于 2016-03-09T12:35:54.907 回答
2

正如您所说,从视图到翻译两次调用可能不是一个那么直接的解决方案

<%= t("my_message", my_var: t("my_var") ) %>

但让您可以灵活地使用变量调用

<%= t("my_message", my_var: t("my_#{$item[:slug]}") ) %>
于 2018-04-13T14:02:25.450 回答