Встраивание псевдонима YAML в строку YAML - PullRequest
3 голосов
/ 13 января 2020

Я пытаюсь объявить псевдоним в своем файле YAML и использовать его позже в строке. Например, я объявляю это:

en:
  support_email: &support_email "helpme@foo.com"
  support_text: "Having a problem? Reach out to <a href="*support_email">*support_email</a>"

и хочу en.support_text оценить до Having a problem? Reach out to <a href="helpme@foo.com">helpme@foo.com</a>.

Есть ли способ сделать это sh? Для контекста, это в рамках проекта RoR.

Спасибо за помощь!

1 Ответ

1 голос
/ 13 января 2020

Вы не можете сделать это с самим 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 для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...