Добавление ссылки внутри переведенного содержимого в шаблон 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 }}