Internacionalización en Symfony2

Una de las cosas que siempre he encontrado más práctica a Symfony es la gestión multiidioma. Ya desde la versión 1.0, la gestión de ficheros de idioma, así como la personalización de los proyectos en varios idiomas es algo muy habitual en los proyectos en que trabajo.

Symfony2 facilita no sólo una manera muy práctica de trabajar en multiidioma y compatible con SEO, si no que nos ofrece diferentes formatos con los que generar estos ficheros: YAML, XML o PHP. Y como siempre, la primera pregunta es ¿que tipo de formato elegir?

Con Symfony 1.x utilizaba el formato XML, aunque algo más engorroso de escribir, es un formato que sigue el estándar XLIFF, del cual existen varias herramientas para por ejemplo, enviar los textos a una empresa de traducciones. Este formato lo recomiendo más bien para páginas/portales donde tengamos frases largas y la traducción sea más bien en bloque.

En el segundo caso, me centro en los ficheros codificados en YAML, son mucho más reducidos y fáciles de escribir. En el caso que lo que estemos realizando es una aplicación web, y los textos a traducir sean principalmente palabras o frases muy cortas, es la mejor opción. El formato más habitual es definir una palabra clave que relacione la traducción, por ejemplo:

curso.nombre: Nombre
curso.nombre.corto: Nombre corto
curso.nombre.largo: Nombre largo
curso.nombre.visible: Visible
curso.alumnos: Alumnos

Esto nos permitirá una mayor reutilización de las palabras, y su consiguiente simplificación para su mantenimiento, y si por ejemplo, nos vemos en la necesidad de cambiar una definición por otra palabra, será mucho más rápido y sencillo.

En cuanto al formato PHP, no me he encontrado en la situación de utilizarlo, pero supongo que nos añadirá la facilidad de tener el diccionario del idioma, el poder utilizar código como bucles para generar el texto.

En la página de Symfony disponéis de un buen manual sobre las traducciones, así que tampoco me centraré en explicar lo explicado. Por descontado, el libro de Javier Eguiluz sobre Symfony2, así que me centraré más bien en unos consejos prácticos.

Primero de todo, intentar simplificar los diccionarios, sobretodo si estamos haciendo una aplicación web, intentos simplificar los textos. No queramos rizar el rizo y poner traducciones personalizadas a todas las secciones, si por ejemplo tenemos un listado de cursos, aprovechemos el nombre de la sección para poner “listado de cursos” mediante el paso de la variable a la traducción:

# en el fichero YML
'listado de %nom%': 'llistat de %nom%'
centros: centros

En nuestro controlador podemos usar:

 $t = $this->get('translator')->trans('listado de %nom%', $name);
  //o mejor
 $t = $this->get('translator')->trans('listado de %nom%', array('%name%' => $name));
 $t = $this->get('translator')->trans('listado de %nom%',  $this->get('translator')->trans('centros'));

En la vista TWIG:

{% trans %}listado de %nom%{% endtrans %}      ---->; ha de existir la variable nom
{% trans with {'%nom%': 'Centro'} %}listado de %nom%{% endtrans %}

No olvidemos tampoco la utilización de los plurales:

'1 curso| %count% cursos': '1 curso| %count% cursos'

Y en nuestra vista (%count%  es una variable enviada del controlador al template):

{% transchoice count %}
       1 curso| %count% cursos
{% endtranschoice %}

Y todavía lo podemos complicar más:

#Fichero YAML:
'{0} There are no apples|{1}There is one apple|]1,19] There are %count% apples|[20,Inf] There are many apples': '{0}No hay manzanas|{1}Hay una manzana|]1,19]Hay (%count%) manzanas|[20,Inf]Hay muchas manzanas'

En el template tendremos:

{% transchoice count %}
     {0} There are no apples|{1}There is one apple|]1,19] There are %count% apples|[20,Inf] There are many apples
{% endtranschoice %}
{# o también #}
{{ '{0} There are no apples|{1}There is one apple|]1,19] There are %count% apples|[20,Inf] There are many apples' | transchoice (count) }}
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s