Sumfony2: Traducir texto Base Datos

jueves, 8 de noviembre de 2012 Etiquetas: , ,


Introducción

En esta entrada vamos a ver como traducir pequeños textos que tenemos en base de datos de nuestro proyecto de Symfony2.
Supongamos que tenemos una aplicación donde los usuarios pueden dar de alta resultados deportivos, en la que tenemos una tabla donde indicamos  los deportes que soporta la aplicación, aunque en un futuro es posible que los ampliemos por necesidades de los usuarios, por eso creamos la tabla por sencillez. Esta tabla la mantiene el administrador del sitio, no los usuarios.

La tabla contiene la descripción, el icono y algún dato más de configuración que podamos necesitar, para el ejemplo con esos dos campos nos valdrá. En el formulario de alta de los resultados mostramos los diferentes deportes, para que los usuarios puedan seleccionar uno. Lo añadimos en nuestro formulario de la siguiente forma, utilizando para ello el tipo entity para que nos lea de la base de datos los tipos de deporte que tenemos:


$form = $this->createFormBuilder()
   [....]
  ->add('deporte', 'entity',
 array('class'=> AcmeAcmeBundle:Deporte',
 'required' => true,
 'expanded' => true,
 'multiple' => false))
    [....]
   ->getForm();

De esta forma si queremos añadir nuevos deportes no tenemos mas que añadir nuevos registros en la base de datos y no hay que tocar nada mas. Todo funciona correctamente, pero llega un día que    nuestra aplicación crece y la traducimos a diferentes idiomas. Traducimos el formulario de alta de resultados, pero nos encontramos que los textos de la base de datos están sin traducir, por lo que tenemos un problema. 

Solución

Buscando soluciones para traducir texto que tenemos en la Base de Datos. Existe un Bundle creado por Gediminas Morkevicius[1] que gestiona la traducción de textos de la Base de datos. Crea unas tablas en la base de datos con las traducciones y mediante anotaciones en las entidades se indican los campos de textos que se quieren traducir. Para un detalle de su utilización visita la página del autor del Bundle.

Para el pequeño mantenimiento que quería traducir me parecía así que probé algo mas sencillo a ver si funcionaba, y lo hacía. Lo que probé fue lo siguiente: en la descripción guardar una clave de traducción del tipo: deporte.futbol 

 En los ficheros de traducción añado la traducción para esa clave, de la siguiente forma:

#Acme/AcmeBundle/Resources/translations/messages.es.yml
[....]
deporte:
    futbol: Fútbol
    basket: Baloncesto
[....]

#Acme/AcmeBundle/Resources/translations/messages.en.yml
[....]
deporte:
    futbol: Soccer
    basket: Basketball
[....]

Con esta configuración si ahora probamos nuestro formulario de alta, sin tocar nada más, ya esta, tenemos los textos traducidos. Desde las demás plantillas de twig tendremos que traducir como es habitual de la forma:

<!--Plantilla Twig --> 
<img src="{{ deporte.icono }}" title="{{ deporte.des | trans }}"> 
Y desde el controlador

  //Controller
 $t = $this->get('translator')->trans( $deporte->getDes() );


Bibliografia

[1]  Gediminas Morkevicius. Doctrine Extensions Github (Inglés)
[] 2012 Nacho Pacheco. Symfony en español. Capítulo Traduciendo

0 comentarios:

Publicar un comentario