Вы не можете сделать это с самим YAML, потому что спецификация исключает это:
7.1. Узлы псевдонимов
Последующие вхождения ранее сериализованного узла представлены как псевдонимов . Первое вхождение узла должно быть помечено якорем , чтобы последующие вхождения были представлены в качестве узлов псевдонимов.
Узел псевдонимов обозначается индикатором «*». Псевдоним относится к самому последнему предшествующему узлу , имеющему тот же якорь . Для узла псевдонима является ошибкой использовать якорь , который ранее не встречался в документе . Не является ошибкой указание якоря , который не используется ни одним узлом псевдонима.
Обратите внимание, что узел псевдонима не должен указывать какие-либо свойства или content , поскольку они уже были указаны при первом появлении узла .
Пример 7.1. Узлы псевдонимов
First occurrence: &anchor Foo
Second occurrence: *anchor
Override anchor: &anchor Bar
Reuse anchor: *anchor
Однако вы можете использовать переменную интерполяцию с I18n . Для вашего примера это будет выглядеть следующим образом:
en:
support_email: 'helpme@foo.com'
support_text: 'Having a problem? Reach out to <a href="mailto:%{support_email}">%{support_email}</a>'
Тогда, на ваш взгляд:
<%= t('support_text', support_email: t('support_email')) %>
Обратите внимание, что вышеприведенное не помечено как HTML safe, что может быть сделано с помощью добавление суффикса _html
с изменением последнего элемента на html
. В качестве альтернативы вы можете вызвать .html_safe
для результата самостоятельно или ввести в виде необработанного содержимого, используя <%== ... %>
(вместо <%= ... %>
) или <%= raw ... %>
.
Если вы хотите назначать переменные более динамично, рассмотрите возможность изменения структуры файла YAML.
en:
support:
constants:
message: 'Having a problem?'
phone: '0123456789'
email: 'helpme@foo.com'
help_messages:
phone:
text: '%{message} Call us on %{phone}.'
html: '%{message} Call us on %{phone}.'
email:
text: '%{message} Reach out to %{email}.'
html: '%{message} Reach out to <a href="mailto:%{email}">%{email}</a>.'
Теперь сделайте что-то вроде этого:
<% vars = t('support.constants') %>
<%= t('support.help_messages.email.html', vars) %>
Вы также можете переместить это к своему собственному помощнику:
def t_with_constants(base, path, options = {})
options = t("#{base}.constants").deep_merge(options)
t("#{base}.#{path}", options)
end
Что позволяет Вы должны использовать:
<%= t_with_constants('support', 'help_messages.email.html') %>
Обратите внимание, что если вы не в представлении или помощнике, вам может понадобиться использовать I18n.t
вместо этого. Который не будет улучшать качество жизни, которое предлагает ActionView::Helpers::TranslationHelper#t
(например, помечая строки как HTML safe).
Конечно, вы можете сделать свой собственный поворот, но я предлагаю проверить I18n руководство и документацию под ActionView::Helpers::TranslationHelper#translate
для получения дополнительной информации.