Aplicaciones multi idioma con Doctrine

Aplicaciones multi idioma con Doctrine

En este tutorial vamos a ver cómo podemos crear Aplicaciones multi idioma con Doctrine utilizando la extensión Translatable, ésta es una de las muchas extensiones que tiene Doctrine para poder hacer lo difícil un poco más fácil, en este caso el desarrollo de sitios multi idioma.

Si tienes dudas con el siguiente código te recomiendo que sigas estas entradas donde partimos desde 0 con Doctrine.

Existen muchas formas de crear sitios multi idioma con Doctrine, nosotros vamos a guardar todas las traducciones en una tabla llamada ext_translations a través de la cual Doctrine sabe cómo actuar para manejar la información en los idiomas que necesitemos.

Tabla ext_translations Doctrine

Esa es la estructura de dicha tabla, y una vez contiene información ésta se guarda de la siguiente forma.

Información almacenada ext_translations Doctrine

Cómo puedes ver la lógica es clara y sencilla, guarda el campo, el idioma, la entidad, la foreign_key y el valor, así de sencillo, por lo tanto, Doctrine únicamente guardará el idioma preferido en la tabla posts, y el resto de traducciones en la tabla ext_translations.

Configurar aplicaciones multi idioma con Doctrine

Lo primero que debemos hacer es instalar las extensiones de Doctrine a través de composer.


Ahora abre tu clase Doctrine y añade la siguiente configuración, aparte de Translatable también configuramos Timestampable y Sluggable.

Crear una Entidad con Translatable en Doctrine

Ahora vamos a crear una entidad Post que utilizará Translatable, Timestampable y Sluggable.

Con las anotaciones @Gedmo\Translatable le decimos a Doctrine que propiedades van a ser traducibles.

La propiedad $locale nos permitirá guardar y obtener nuestras traducciones de forma sencilla, sólo deberemos pasarle el idioma a guardar u obtener.

Crear un repositorio para obtener Traducciones

Para no tener que repetir demasiado código, vamos a crear un repositorio llamado BaseRepository y añadimos lo siguiente.

El método getTranslatedQuery recibe una instancia de QueryBuilder y el idioma que deseamos obtener, de esta forma nos devolverá el resultado en el idioma solicitado.

Ahora vamos a crear el repositorio PostRepository, el cual está asociado a la entidad Post y vamos a realizar una consulta donde utilizaremos el método getTranslatedQuery.

El método findPostTranslated recibe el id del post y el idioma, esta es una de las formas de obtener una entidad traducida, aunque se puede hacer de otras formas.

Crear un nuevo post y una traducción

Para crear un nuevo post y una traducción que se guarde en la tabla de ext_translations simplemente debemos escribir el siguiente código.

Añadir una traducción a un post existente

Imagina que quieres añadir más traducciones al post que hemos creado anteriormente, para ello simplemente debes añadir el siguiente código.

Obtener una entidad en un idioma concreto

Si recuerdas, un poco más arriba hemos creado un repositorio PostRepository con el método findPostTranslated, vamos a utilizarlo para acceder a una de las traducciones de un post que hayamos guardado previamente.

Acceder a todas las traducciones de un Post

Igual de útil puede ser acceder a todas las traducciones que contenga una entidad, en este caso un post, para conseguirlo simplemente debes escribir el siguiente código.

Obtener una entidad traducida con de forma dinámica

Cómo ya he comentado antes, existen varias formas de acceder a la traducción de una entidad, en este caso vamos a ver lo sencillo que es utilizar el método refresh del EntityManager para conseguirlo.

Y eso es todo, te aseguro que no es sencillo encontrar esta información en la web, con esta entrada ya tienes una muy buena base para escribir aplicaciones multi idioma con Doctrine, también te recuerdo que compartir es gratis, así que si te ha parecido interesante comparte.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. ACEPTAR

Aviso de cookies