🌿 Traducciones en templates Twig (BO moderno)

Actualizado: 2024-12-01

Los templates Twig del Back Office de PrestaShop 8+ usan la extension Symfony Translation. La forma principal de traducir es el filtro |trans con el dominio como segundo argumento.

#Filtro |trans en Twig

Uso basico del filtro |trans en templates Twig
twig
{# Forma basica: cadena | trans(params, dominio) #}
{{ 'Save'|trans({}, 'Admin.Actions') }}
{{ 'Configuration'|trans({}, 'Modules.Mymodule.Admin') }}

{# Reutilizar dominios del core para terminos comunes #}
{{ 'Yes'|trans({}, 'Admin.Global') }}
{{ 'No'|trans({}, 'Admin.Global') }}
{{ 'Cancel'|trans({}, 'Admin.Actions') }}
{{ 'Delete'|trans({}, 'Admin.Actions') }}
{{ 'Edit'|trans({}, 'Admin.Actions') }}
{{ 'Enable'|trans({}, 'Admin.Actions') }}
{{ 'An error occurred.'|trans({}, 'Admin.Notifications.Error') }}
{{ 'Successful update.'|trans({}, 'Admin.Notifications.Success') }}

{# Variable de traduccion para reutilizar #}
{% set saveLabel = 'Save'|trans({}, 'Admin.Actions') %}
<button>{{ saveLabel }}</button>

{# En atributos HTML #}
<button title="{{ 'Delete this item'|trans({}, 'Modules.Mymodule.Admin') }}">

#Bloque trans para textos largos

Bloque trans para parrafos y textos multilinea
twig
{# Bloque trans — util para textos largos o HTML en las traducciones #}
{% trans with {} into 'Modules.Mymodule.Admin' %}
  This module allows you to manage your custom content.
{% endtrans %}

{# Con variables dentro del bloque #}
{% set productName = product.name %}
{% trans with {'%name%': productName} into 'Modules.Mymodule.Admin' %}
  Product %name% has been saved successfully.
{% endtrans %}

{# En un parrafo de ayuda (hint) #}
<p class="help-block">
  {% trans with {} into 'Modules.Mymodule.Admin' %}
    Enter your API key from the provider dashboard.
  {% endtrans %}
</p>

#Variables y parametros

Interpolacion de variables en traducciones Twig
twig
{# Parametros: segundo argumento del filtro trans #}
{{ 'Hello %name%!'|trans({'%name%': customer.firstname}, 'Modules.Mymodule.Admin') }}

{# Numeros y formatos #}
{{ 'You have %count% items in your cart.'|trans({'%count%': cart.nbProducts}, 'Modules.Mymodule.Shop') }}

{# El formato %variable% es el estandar Symfony #}
{# Otros formatos (NO RECOMENDADOS para nuevos modulos): #}
{# {{ 'Hello {{ name }}'|trans({'{{ name }}': customer.firstname}, ...) }} #}

{# Para fechas formateadas (pasar ya formateadas desde PHP) #}
{{ 'Last updated: %date%'|trans({'%date%': lastUpdated}, 'Modules.Mymodule.Admin') }}

#Pluralizacion en Twig

Pluralizacion con transchoice (Symfony)
twig
{# Symfony < 5.x: usar transchoice #}
{{ '{0} No items|{1} One item|]1,Inf[ %count% items'|transchoice(count, {'%count%': count}, 'Modules.Mymodule.Admin') }}

{# Symfony 5+: usar trans con |syntax #}
{{ 'one product|%count% products'|trans({'%count%': count}, 'Modules.Mymodule.Admin') }}

{# En el archivo .xlf para pluralizacion: #}
{# <source>{0} No products|{1} One product|]1,Inf[ %count% products</source> #}

#Traducciones en JS (Twig a JS)

Pasar traducciones de Twig a JavaScript
twig
{# Inyectar traducciones en un objeto JS desde el template #}
<script>
  var MyModuleTranslations = {
    confirm_delete: {{ 'Are you sure you want to delete this item?'|trans({}, 'Modules.Mymodule.Admin')|json_encode|raw }},
    save_success:   {{ 'Saved successfully.'|trans({}, 'Admin.Notifications.Success')|json_encode|raw }},
    error_generic:  {{ 'An error occurred.'|trans({}, 'Admin.Notifications.Error')|json_encode|raw }},
  };
</script>

{# Uso en JavaScript: #}
{# if (confirm(MyModuleTranslations.confirm_delete)) { ... } #}
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.