Добавление ссылки внутри переведенного содержимого в шаблон Twig

Внутри шаблона Twig мне нужно будет иметь переведенный текст, содержащий ссылку (путь должен быть сгенерирован маршрутизатором, а не статически встроен). Twig не позволяет отображать переменную внутри транс-блока - я также знаю следующее:

{% trans with {'%name%': 'Fabien'} from "app" %}
Hello %name%
{% endtrans %}

но я не вижу, как использовать это, чтобы впрыскивать внутри трансляции часть, подобную этой

<a href="{{ path('privacy') }}">privacy policy</a>

(конечно, текст перевода также должен быть переведен)

Ответы

Ответ 1

Подход, который я сделал, следующий:

В файле перевода:

page.privacy.policy: Please read our %link_start%privacy policy%link_end%

В файле twig:

<p>{{ 'page.privacy.policy' | trans({'%link_start%' : '<a href="'~path('privacy-policy')~'">', '%link_end%' : '</a>'}, 'account') | raw }}</p>

Я не уверен, что это можно сделать, используя синтаксис блока, который вы упомянули выше, поскольку я обнаружил, что он не работает, если я не передал результат перевода через фильтр "raw". Также я использую домены сообщений для разделения переводов, следовательно, параметр "account".

Я думаю, что ближе всего к вашему примеру будет:

<p>{{ 'Please read our %link_start%privacy policy%link_end%' | trans({'%link_start%' : '<a href="'~path('privacy-policy')~'">', '%link_end%' : '</a>'}) | raw }}</p>

EDIT:

Единственная проблема с этим подходом, с которой я столкнулся, - это то, где мне нужно программно следовать переведенной ссылке в unit test, поскольку нет ни одного перевода, представляющего текст ссылки. Хотя я беспорядочный, я думаю, что можно обойти это, предоставив отдельный перевод текста ссылки и заменив его переведенным значением в полный текст в качестве дополнительной переменной.

Ответ 2

Решение rebdirdo не очень безопасно, поскольку оно не ускользает от всего сообщения. Он не работает правильно для сообщений типа "don't use <b> tag, use <strong> tag instead. %link_start%Here%link_end% you can find why.", потому что теги не будут экранированы и не будут видны.

рабочий подход:

файл перевода:

advises.strong: don't use <b> tag, use <strong> tag instead. %link_start%Here%link_end% you can find why.

файл twig:

{{ 'advises.strong'|trans|nl2br|replace({'%link_start%': '<a href="'~path('privacy-policy')~'">', '%link_end%': '</a>'})|raw }}

Обратите внимание на фильтр nl2br. Необходимо поместить некоторый фильтр, чтобы фильтр работал только для тегов ссылок.

Ответ 3

Twig:

{{'body.term'|trans('%link_terms%' :app.request.getSchemeAndHttpHost()~path('terms')},'AcmeTerm')|raw }}

AcmeTerm.yml

body
    term: >
      <ul>          
          <li>Read<a href="%link_terms%">Terms</a>.</li>
      </ul>

где path ('terms') - это маршрут как:

it__RG__terms                             ANY      ANY    ANY  /it/termini-e-condizioni
en__RG__terms                             ANY      ANY    ANY  /en/terms-and-conditions

Ответ 4

Это лучший способ:

{{ 'Please read our %privacy_policy%'|trans({
    '%privacy_policy%': '<a href="' ~ path('privacypolicy') ~ '"> ' ~ 'Privacy Policy'|trans ~ '</a>'
})|raw }}