vistas plantillas comentar symfony twig

symfony - plantillas - Agregar un enlace dentro del contenido traducido en la plantilla Twig



twig symfony (4)

Dentro de una plantilla de Twig necesitaría tener un texto traducido que contenga un enlace (la ruta debe ser generada por el enrutador, no está incrustada estáticamente). Twig no permite representar una variable dentro de un bloque trans; también conozco lo siguiente:

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

pero no puedo ver cómo usar eso para inyectar dentro de la traducción una pieza como esta

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

(por supuesto, el texto de anclaje también debe traducirse)


El enfoque que he tomado es este:

En el archivo de traducción:

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

En el archivo twig:

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

No estoy seguro si esto se puede hacer utilizando la sintaxis de bloque que mencionaste anteriormente, ya que descubrí que no funcionó a menos que canalizara el resultado de la traducción a través del filtro ''raw''. También utilizo dominios de mensaje para dividir las traducciones, de ahí el parámetro ''cuenta''.

Creo que lo más cercano a tu ejemplo sería:

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

EDITAR:

El único problema con este enfoque que he encontrado es donde necesito seguir programáticamente un enlace traducido en una prueba unitaria ya que no hay una sola traducción que represente el texto del enlace. Aunque desordenado, creo que sería posible evitar esto al proporcionar una traducción separada para el texto del enlace y sustituirlo por el valor traducido en el texto completo como una variable adicional.


La solución de Rebdirdo no es realmente segura ya que no escapa a todo el mensaje. No funciona correctamente para mensajes como "don''t use <b> tag, use <strong> tag instead. %link_start%Here%link_end% you can find why." , porque las etiquetas no serán escapadas y no serán visibles.

enfoque de trabajo:

archivo de traducción:

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

ramita de archivo:

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

Tenga en cuenta el filtro nl2br. Es necesario poner un filtro allí para que el filtro sin formato funcione solo para las etiquetas de enlace.


Ramita:

{{''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>

donde path (''términos'') es la ruta como:

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


Esta es una mejor manera:

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