在I18n插值中使用另一个I18n键

36

这可能是I18n嵌套,但假设我有一个如下的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} 应该是 en.yml 中的键 my_var

我知道我可以通过做类似于以下的事情来实现:

I18n.t 'my_message', :my_var => I18n.t('my_var')

但我希望I18n有一种方法可以自我引用键。

3个回答

42

这其实是一个非常常见的问题,但简短的回答是不行,很遗憾:(


4
很不幸,这是正确答案。 @Aaron,供您参考的stackoverflow问题/答案在这里和在这里。 - Paul Fioravanti
1
这个答案是正确的吗?还是没有办法做到? - joaofraga

5

我目前在这方面存在一些困难......最终我创建了一个自定义的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 应用自定义内置类型。


1
非常酷!我得仔细研究一下 Psych 和 add_builtin_type,才能完全理解性能特征,但这看起来是一个很棒的补丁。 - Aaron

2

正如你所说,也许从视图中两次调用翻译并不是一个十分直接的解决方案。

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

但它让你可以使用变量进行调用,从而提供了灵活性。
<%= t("my_message", my_var: t("my_#{$item[:slug]}") ) %>

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