Rutas multilenguaje en Symfony

symfony.jpg
Solucionex
27
Mar 18

Cuando iniciamos un proyecto nos puede pasar que el cliente tenga muy claro desde el principo que necesita una aplicación web multilenguaje, o nos puede pasar que después de tener la mitad del proyecto con textos y rutas en nuestro idioma cambien las especificaciones para que la nueva herramienta se pueda utilizar en diferentes lenguas. Tanto en un caso como en otro, en Symfony no tendremos ningún problema gracias a estos dos bundles que podremos instalar en cualquier punto del proyecto:

Ahora vamos a explicar cómo nos van a ayudar, lo primero que tienes que hacer es intalarlos, puedes seguir sus documentaciones, o este pequeño tutorial, que si estás acostumbrado a desarrollar aplicaciones en Symfony no te supondrá mucho, instalar vía composer, añadir al AppKernel.php y añadir sus parámetros de configuración en el config.yml:

1- Composer

$ composer require "jms/i18n-routing-bundle" "jms/translation-bundle"; 

2- Añadir al kernel


\\AppKernel.php
$bundles = array ( ... new JMS\I18nRoutingBundle\JMSI18nRoutingBundle(), 
new JMS\TranslationBundle\JMSTranslationBundle(), ); 

3- Añadir parámetros de configuración


\\config.yml 
jms_i18n_routing: 
    default_locale: es
    locales: [de, en, es]
    strategy: prefix_except_default 

¡Ya tienes una aplicación symfony multilenguaje! Así de sencillo, siguiendo estos sencillos pasos ya tienes las rutas creadas para tres idiomas distintos como puedes ver en el fichero de configuración: de (alemán), en (inglés) y es (español). Puedes mirar la documentación del bundle para ver las distintas configuraciones, por ejemplo, en la que hemos puesto añade a todas las rutas el prefijo del idioma savo en el idioma por defecto (prefix_except_default), que será el español (es).

Para comprobar que el proceso ha funcionado correctamente bastará con irnos a la consola de symfony y probar el depurador de rutas:

$ php bin/console debug:router

Esto nos mostrará el listado de rutas triplicado, tres entradas por idioma, la utilidad real de este proceso es que las rutas se pueden traducir. Si no vamos a utilizar esta funcionalidad, podemos trabajar poniéndole el parámetro "locale" a todas las rutas y nos ahorraría trabajo.

¿Cómo hago para traducir una ruta en Symfony? Sencillo, gracias a los bundles que acabamos de instalar, ejecutaremos el siguiente comando:

$php bin/console translation:extract en --bundle=AppBundle --enable-extractor=jms_i18n_routing --output-format=yml --exclude-dir=Tests 

Esto nos generará los ficheros de traducciones en AppBundle/Resources/translations, ahora podrás traducir las rutas en el routes.en.yml, y el fichero messages.en.yml ya se puedes enviar a tu cliente para que traduzca los textos que necesite.

Esperamos desde aquí haberos ahorrado algún dolor de cabeza a la hora de desarrollar una aplicación symfony multiidioma.