在 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 键的主要内容,如果未能解决你的问题,请参考以下文章

Rails i18n如何获取某个键的所有值?

出于语义版本控制的目的,i18n字符串键是否被视为“公共API”?

为什么国际化缩短为“i18n”?

用于测试 i18n 属性的 Maven 插件

Springboot国际化信息(i18n)解析

vue 项目的I18n国际化之路