【问题标题】:Use another I18n key in an I18n interpolation在 I18n 插值中使用另一个 I18n 键
【发布时间】: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 有办法自引用密钥。

【问题讨论】:

    标签: ruby-on-rails internationalization interpolation rails-i18n


    【解决方案1】:

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

    【讨论】:

    • 不幸的是,这是正确的答案。供您参考@Aaron,请参阅 SO 问题/答案herehere
    • 这个答案真的正确吗?还是没办法?
    【解决方案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]}") ) %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      相关资源
      最近更新 更多