Los idiomas son una muestra de la riqueza cultural de la humanidad, pero a veces, son un verdadero quebradero de cabeza para los desarrolladores de software.
En intelligenia, una de las plataformas que usamos para desarrollar aplicaciones web es Django. Por desgracia, al contrario que ocurre con las traducciones de textos estáticos, no hay un módulo estándar para la traducción de los campos de los modelos de aplicaciones en este framework.
Así que, después de ver algunas alternativas como transdb, hemos optado por desarrollar nuestra propia aplicación que solucione este problema.
ModelTranslation está compuesto de un modelo y una serie de funciones de ayuda que, de alguna forma, proporcionan herramientas que permiten que el proceso de gestionar las traducciones de cada uno de los objetos sea transparente para el desarrollador.
El resto de herramientas son las que dan la unión entre las traducciones y cada uno de los modelos que queremos traducir.
Vamos a resumir lo que tienes que hacer para poder usar esta herramienta:
Una vez que hayamos hecho esto, sólo tendremos que hacer que nuestros ModelForm hereden de TranslatableModelForm y ya nos aparecerán los campos de cada uno de los idiomas definidos en la opción LANGUAGES del fichero settings.py de nuestro proyecto.
Para obtener la traducción de un campo, ModelTranslation inyecta el método get_trans_attr a todos los modelos, así que para obtener la traducción al idioma actual de la web sólo hay que hacer:
Para mostrar la traducción en nuestras plantillas sólo tendremos que usar un filtro definido con esa intención. Incluiremos en toda plantilla que tenga modelos con campos traducibles lo siguiente:
Y ahora podremos usar el filtro de traducción, que hemos llamado convenientemente _:
Y vosotros, ¿qué herramienta usáis para gestionar las traducciones en vuestros proyectos Django?
En intelligenia, una de las plataformas que usamos para desarrollar aplicaciones web es Django. Por desgracia, al contrario que ocurre con las traducciones de textos estáticos, no hay un módulo estándar para la traducción de los campos de los modelos de aplicaciones en este framework.
Así que, después de ver algunas alternativas como transdb, hemos optado por desarrollar nuestra propia aplicación que solucione este problema.
ModelTranslation está compuesto de un modelo y una serie de funciones de ayuda que, de alguna forma, proporcionan herramientas que permiten que el proceso de gestionar las traducciones de cada uno de los objetos sea transparente para el desarrollador.
Funcionamiento
En primer lugar, las traducciones se almacenan en un modelo: FieldTranslation. Este modelo contiene un objeto por cada campo y objeto cuyo modelo sea traducible. Funciona como un almacén de información sobre el que se consultará de forma transparente para extraer la traducción que nos interese.El resto de herramientas son las que dan la unión entre las traducciones y cada uno de los modelos que queremos traducir.
Uso
La información completa sobre cómo usarlo se encuentra en el fichero README del repositorio (tanto en español como inglés).Vamos a resumir lo que tienes que hacer para poder usar esta herramienta:
- Instalar django-cuser e instalar modeltranslation (por ejemplo desde el commit del tope)
-e git://github.com/intelligenia/modeltranslation@fbe6dff#egg=modeltranslation
- Incluir "cuser" y "modeltranslation" en INSTALLED_APPS en settings.py.
- IS_MONOLINGUAL=False en settings.py, indicando que estamos ante una web que va a necesitar de todo el procesamiento extra para traducciones dinámicas.
- Listar los módulos queremos traducir, en TRANSLATABLE_MODEL_MODULES, en el fichero settings.py.
- Añadir la llamada a addtranslations(__name__) al final del fichero de modelos.
- Indicar en el Meta de cada modelo una lista de campos que queremos traducir con el nombre translatable_fields.
Una vez que hayamos hecho esto, sólo tendremos que hacer que nuestros ModelForm hereden de TranslatableModelForm y ya nos aparecerán los campos de cada uno de los idiomas definidos en la opción LANGUAGES del fichero settings.py de nuestro proyecto.
Para obtener la traducción de un campo, ModelTranslation inyecta el método get_trans_attr a todos los modelos, así que para obtener la traducción al idioma actual de la web sólo hay que hacer:
event.get_trans_attr("name") {# Traduce el campo "name" del objeto event #}
Para mostrar la traducción en nuestras plantillas sólo tendremos que usar un filtro definido con esa intención. Incluiremos en toda plantilla que tenga modelos con campos traducibles lo siguiente:
{% load modeltranslation_tags %}
Y ahora podremos usar el filtro de traducción, que hemos llamado convenientemente _:
{{ event|_:"name" }} {# Traduce el campo "name" para el objeto event #}
Mejoras
Actualmente, tenemos varias ideas para mejorar la aplicación, básicamente a nivel de desempeño en el servidor web y usabilidad.Caché de traducciones
No hemos tenido problemas de eficiencia en nuestros servidores en los que se está ejecutando actualmente esta aplicación, pero estamos seguros de poder mejorar su desempeño si incluimos una caché intermedia que evite la consulta constante a la tabla de FieldTranslation para traducciones que ya hemos consultado.Nueva interfaz atractiva de edición de traducciones
Actualmente la interfaz simplemente incluye campos extra por cada uno de los idiomas. Nosotros tenemos la intención de hacer esta inclusión sea usable y que los campos tengan un estilo agradable y moderno.Ayudas a la traducción/Traducción automática
Si bien es cierto que no podemos confiar en las herramientas de traducción automática para todos los textos de nuestra web, es de gran ayuda tener una versión preliminar en la que se pueda enseñar a un cliente un boceto de la traducción de la web.Creación de un paquete pip
Actualmente el módulo ha de instalarse a partir del repositorio, esperamos poder desarrollar en un futuro un paquete pip para hacer más fácil y directa su instalación.Licencia
Con el fin de favorecer el uso de esta herramienta, la hemos liberado con una licencia muy permisiva (la licencia MIT), lo que permite la creación de código derivado de cualquier tipo sin ninguna limitación.
Y vosotros, ¿qué herramienta usáis para gestionar las traducciones en vuestros proyectos Django?
No hay comentarios:
Publicar un comentario