Utilisez une autre clé I18n dans une interpolation I18n

Cela pourrait être i18n-ception mais disons que j'ai un fichier en.yml comme ci-dessous

en:
  my_var: Foo
  my_message: "This is a message where I'd like to interpolate I18n's %{my_var}"

Existe-t-il un moyen d'indiquer à I18n que %{my_var} devrait être la clé my_var dans en.yml?

Je sais que je pourrais accomplir en faisant quelque chose comme

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

Mais j'espérais que I18n a un moyen d'auto-référencer les clés.

27
demandé sur Aaron 2013-01-13 22:04:14

3 réponses

C'est en fait une question assez commune, mais la réponse courte est non, ce n'est malheureusement pas possible: (

30
répondu tigrish 2013-01-13 18:17:57

Actuellement, je lutte pour cela... Et enfin, je crée un type yaml personnalisé.

Dans la section init.

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!

, Dans fr.yml

en:
  my_var: Foo
  my_message: !!i18n "This is a message where I'd like to interpolate I18n's %{my_var}"

!!i18n Appliquer le type intégré personnalisé.

3
répondu odk 2016-03-10 00:48:49

Comme vous l'avez dit, peut-être que ce n'est pas une solution si directe d'appeler deux fois de la vue à la traduction

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

, Mais vous donne la possibilité d'appeler une variable

<%= t("my_message", my_var: t("my_#{$item[:slug]}") ) %>
2
répondu yondemon 2018-04-13 14:02:25