Symfony 2.1, el libro oficial

15.7. Traducciones en plantillas

Casi siempre la traducción de los contenidos se produce en las plantillas. Symfony2 incluye soporte para la traducción tanto en las plantillas Twig como en las plantillas PHP.

15.7.1. Plantillas Twig

Symfony2 proporciona etiquetas Twig especiales (trans y transchoice) para traducir los contenidos estáticos de texto de las plantillas:

{% trans %}Hello %name%{% endtrans %}

{% transchoice count %}
    {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples
{% endtranschoice %}

La etiqueta transchoice obtiene automáticamente la variable %count% a partir del contexto actual y la pasa al traductor. Este mecanismo sólo funciona cuando se utiliza un marcador de posición con el formato %variable%.

Truco Si necesitas utilizar el carácter de porcentaje (%) en una cadena, lo tienes que escapar duplicándolo: {% trans %}Porcentaje: %percent%%%{% endtrans %}

También puedes especificar el dominio del mensaje y pasar algunas variables adicionales:

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

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

{% transchoice count with {'%name%': 'Fabien'} from "app" %}
    {0} %name%, there are no apples|{1} %name%, there is one apple|]1,Inf] %name%, there are %count% apples
{% endtranschoice %}

Los filtros trans y transchoice se pueden utilizar para traducir texto dinámicos y expresiones complejas:

{{ message|trans }}

{{ message|transchoice(5) }}

{{ message|trans({'%name%': 'Fabien'}, "app") }}

{{ message|transchoice(5, {'%name%': 'Fabien'}, 'app') }}

Truco Usar etiquetas de traducción o filtros es casi indiferente, pero existe una pequeña diferencia: el mecanismo de escape sólo se aplica automáticamente en el caso del filtro. Así que si utilizas el filtro y necesitas asegurarte de que no se aplica el mecanismo de escape a la traducción, debes añadir también el filtro raw:

{# el texto traducido entre etiquetas nunca se escapa #}
{% trans %}
    <h3>foo</h3>
{% endtrans %}

{% set message = '<h3>foo</h3>' %}

{# Las cadenas y variables traducidas vía un filtro se escapan por defecto #}
{{ message|trans|raw }}
{{ '<h3>bar</h3>'|trans|raw }}

Truco A partir de Symfony 2.1 también es posible indicar para toda la plantilla Twig el dominio que se utiliza en las traducciones. Para ello, utiliza la etiqueta trans_default_domain:

{% trans_default_domain "app" %}

Esta etiqueta solamente afecta a la plantilla actual, por lo que no se aplica a las plantillas incluidas o embebidas.

15.7.2. Plantillas PHP

El servicio traductor está disponible en las plantillas PHP a través del helper translator:

<?php echo $view['translator']->trans('Symfony2 is great') ?>

<?php echo $view['translator']->transChoice(
    '{0} There is no apples|{1} There is one apple|]1,Inf[ There are %count% apples',
    10,
    array('%count%' => 10)
) ?>