Siempre ha sido un quebradero de cabeza desarrollar un proyecto multi idioma. Hasta ahora, en el desarrollo con Symfony siempre se han utilizado soluciones de terceros para poder implementar esta funcionalidad en nuestros sites. Hoy se ha confirmado que se lanza en la versión 4.1 una mejora del Routing del framework Symfony 4. Esta nueva versión del componente permite que se puedan generar rutas multi-idioma. Esto es una gran noticia, por que personalmente creo que el framework se vuelve más completo y fuerte en el mercado.
Ejemplo de caso de éxito en mi carrera profesional, es el desarrollo de gcp.network donde tuvimos el reto de implementar un site disponible en 7 idiomas, con lo que conlleva sobre todo encajando en el diseño, sobre todo los idiomas orientales.
¿Que bundles se utilizan para implementar el multi idioma?
Antes de ver como podemos implementar el multi-idioma con la nueva funcionalidad del componente de Routing, quiero hacer un recorrido por las distintas soluciones de terceros que existen y he podido utilizar a lo largo de mi recorrido con el Framework
LexikTranslationBundle
Repositorio: https://github.com/lexik/LexikTranslationBundle
Este bundle permite importar los ficheros de traducciones en la base de datos, proveyendo una interfaz gráfico para gestionarlas, además permite exportar. estos cambios en ficheros de traducción. Todo ello a través de una caché para evitar repetidas consultas contra la base de datos.
Para realizar esta implementación, se sobre-escribe el servicio Translator para proveer un DataBaseLoader que permite almacenar estos ficheros de traducción a través de Doctrine.
JMSTranslationBundle:
Repositorio: https://github.com/schmittjoh/JMSTranslationBundle
Este bundle vitamina el componente Translation de Symfony proporcionando 3 componentes básicos.
Extractor: Permite extraer cadena de traducción del código fuente.
Dumper: Permite volcar las traducciones en ficheros en un formato más sencillo que permita trabajar mejor al equipo de traductores
WebUI: Permite gestionar las traducciones a través de un interfaz web.
JMSi18nRoutingBundle
Repositorio: https://github.com/schmittjoh/JMSI18nRoutingBundle
De los mismos desarrolladores que el bundle anterior, este bundle permite crear rutas multi idioma en Symfony. Esto permite añadir rutas i18n durante el desarrollo, sin necesidad de reescribir parte de la aplicación, traduciendo las rutas que requieras. Además permite asignar diferentes nombres de dominio a un idioma concreto.
Este bundle era el principal candidato a usar para generación de rutas multi-idioma.
A2LixTranslationBundle
Repositorio: https://github.com/a2lix/TranslationFormBundle
Este bundle permite a manejar traducciones de nuestras entidades permitiendo crear Formularios que permiten traducir aquellos campos translatables. Muy útil para integrar en backends como EasyAdmin o Sonata Admin Bundle.
BeSimpleI18nRoutingBundle
Repositorio: https://github.com/BeSimple/BeSimpleI18nRoutingBundle
Este bundle al igual que JMSi18nRoutingBundle permite construir de una manera simple rutas para distintos lenguajes
BazingaJSTranslationBundle
Repositorio: https://github.com/willdurand/BazingaJsTranslationBundle
Este bundle es muy interesante por que expone un objeto javascript que expone las traducciones del backend para poder usarlo en el lado del cliente. Esto es bastante interesante por que podemos mantener en un solo sitio las traducciones.
¿Como generamos rutas multi idioma en Symfony 4?
Con el nuevo componente se resolverán problemas que solucionábamos con algunas de las librerías presentadas. Ahora para definir una ruta podremos indicar el locale bajo la propiedad path:
action: controller: App\Controller\DefaultController::action path: en: /action es: /accion
Además, podremos incluir enrutado con prefijos que también se comporten multi-idioma:
site: resource: '../src/Controller/' type: annotation prefix: en: '/site' es: '/sitio'
Además tenemos dos posibilidades de poder generar las rutas
$url = $urlGenerator->generate('action', ['_locale' => 'es']); $url = $urlGenerator->generate('action.es');
Conclusión
Creo que esta funcionalidad para dar soporte a rutas multi-idiomas es algo importante para la comunidad y todos los desarrolladores Symfony, ya que ahora tenemos la posibilidad de utilizar una solución core proporcionada por el propio framework, proporcionándole aún más madurez.