Blog


Traducir mensajes con variables en Symfony2

TRADUCIR MENSAJES CON VARIABLES EN SYMFONY2

06 / 03 / 2014 Symfony

La tarea de traducir cadenas de textos en Symfony es extremadamente sencilla gracias al componente Translation. Aunque no es la finalidad de este artículo, vamos a hacer un repaso rápido de cómo se realiza la internacionalización en Symfony2.

Antes de poder utilizar el servicio translator del componente Translation, es necesario habilitarlo en la configuración de nuestro proyecto Symfony:


# app/config/config.yml
framework:
    translator: { fallback: es }

Traducir una cadena desde un controlador, es tan sencillo como utilizar el método trans de la siguiente manera:


$cadena = $this->get('translator')->trans('Vabadus, Symfony and Drupal Experts');

o desde una plantilla twig:


{{ 'Vabadus, Symfony and Drupal Experts'|trans }}

De esta forma, Symfony buscará entre los diccionarios de traducciones que tengamos definidos, basándose en el locale del usuario, la cadena que le pasamos al método trans. El formato estándar y recomendado para crear diccionarios es Xliff. Para nuestro ejemplo vamos a crear un diccionario codificado en YML, aunque podría hacerse en XML o PHP:


# src/Vabadus/MiBundle/Resources/translations/messages.es.yml
'Vabadus, Symfony and Drupal Experts': Vabadus, Expertos Symfony y Drupal

Aunque, como hemos visto, podemos crear diccionarios incluyendo pares con la cadena de texto original completa y su correspondiente traducción, es más recomendable y mantenible, el uso de identificadores, tal y como mostramos a continuación:


# src/Vabadus/MiBundle/Resources/translations/messages.es.yml
frontend:
    message:
        vabadus: Vabadus, Expertos Symfony y Drupal

Definiendo de esta forma nuestro diccionario, podríamos traducir la cadena en un controlador de la siguiente manera:


$cadena = $this->get('translator')->trans('frontend.message.vabadus');

o en una plantilla twig:


{{ 'frontend.message.vabadus'|trans }}

Después de este repaso rápido a cómo traducir textos en Symfony, vamos a centrarnos en el caso particular que queríamos revisar en este artículo: cómo podemos traducir mensajes en nuestros desarrollos Symfony multiidioma, incluyendo variables.

Como ya hemos visto, mediante el método trans podemos traducir cadenas exactas de texto, pero también tenemos la posibilidad de incluir, en esos textos a traducir, variables de la siguiente manera:


# src/Vabadus/MiBundle/Resources/translations/messages.es.yml
frontend:
    message:
        hello: Hola %nombre%, somos Vabadus, Expertos Symfony y Drupal

Para traducir esta cadena desde un controlador, haríamos lo siguiente:


$cadena = $this->get('translator')->trans(
    'frontend.message.hello',
    array('%nombre%' => $nombre)
);

Podemos complicar un poco más el ejemplo incluyendo en la cadena a traducir un enlace cuya URL tendremos que generar y pasar como variable. Por un lado, definimos la cadena con las variables necesarias en nuestro diccionario:


# src/Vabadus/MiBundle/Resources/translations/messages.es.yml
frontend:
    message:
        vabadus: <a href="%path%" title="%titulo%">Vabadus</a>, Expertos Symfony y Drupal
        vabadus_title: ir a portada

Vemos que la cadena recibe dos variables, por un lado el valor a incluir en el atributo href del enlace y por otro el del atributo title. Éste último, puede ser a su vez otra cadena a traducir que tendríamos que incluir en nuestro diccionario.

Para traducir esta cadena con dos variables en una plantilla twig, haríamos lo siguiente:


{{ 'frontend.message.vabadus'|trans({ '%path%': path('vabadus_homepage'), '%titulo%': 'frontend.message.vabadus_title'|trans }) }}


ARTÍCULOS RELACIONADOS