Django es el entorno de desarrollo web para perfeccionistas con límites de tiempo

Traducciones de modelos con django-transmeta

django-transmeta es una aplicación reusable que nos permite añadir traducciones a los campos de nuestros modelos. Es muy fácil de utilizar ya que crea automáticamente un campo en la base de datos por cada atributo traducible y cada idioma de nuestro setting LANGUAGES.

Así, si tenemos un campo llamado nombre y nuestro setting LANGUAGES son inglés y español django-transmeta creará los campos nombre_es, nombre_en en la base de datos y al acceder directamente a atributo nombre obtendremos la traducción correspondiente al idioma que esté activo en la petición.

Para usar django-transmeta tenemos que añadir un atributo __metaclass__ a los modelos que tengan campos con traducciones y en la clase Meta del modelo añadiremos el atributo translate en el que tendremos que incluir la lista de campos que permiten ser traducidos. Valga como ejemplo el siguiente modelo en el que los campos con traducción serán description y body:

from transmeta import TransMeta

class Book(models.Model):
    __metaclass__ = TransMeta

    title = models.CharField(max_length=200)
    description = models.TextField()
    body = models.TextField(default='')
    price = models.FloatField()

class Meta:
    translate = ('description', 'body', )

Al añadir nuevos idiomas o marcar nuevos campos como traducibles django-transmeta se ocupa de detectar qué tablas faltan en la base de datos para crearlas. Para ello basta utilizar el siguiente comando tras haber modificado cualquier modelo:

./manage.py sync_transmeta_db

Otra ventaja es que django-transmeta muestra todos los campos de idiomas en el sitio de administración de Django de forma transparente, permitiendo editar todos los idiomas desde el Admin.

Publicado por Antonio Melé el Lunes 14 de Febrero de 2011 Compártelo: Facebook: Twitter: | Categorías: aplicaciones, internacionalización, modelos, pluggables

Entradas similares

Editar y traducir inline en Django fácilmente

Desde Yaco nos traen las aplicaciones pluggables django-inlinetrans y django-inplaceedit que permiten editar traducciones de templates y objetos de nuestros modelos desde el frontend ...


Crear una imagen de nuestros modelos con django-command-extensions

Algo interesante que nos aporta django-command-extensions es poder crear una representación gráfica de nuestros modelos (o por decirlo de otro modo nuestro esquema de ...


 
Migración de esquemas con django-evolution

Las migraciones o evoluciones de esquema son las modificaciones que hacemos a modelos ya creados y que afectan a la base de datos. Cuando ...


Idiomas en nuestras URLs gracias a django-localeurl

django-localeurl es una aplicación que permite el uso de códigos de idiomas en las URLs de nuestro proyecto. Esto trae la ventaja de que ...


 
 

6 comentarios:

El Lunes 14 de Febrero de 2011 raimon dijo:
Hola, me has abierto una duda que tenia hace unas semanas! La lástima, es que el label no lo traduce y queda con inglés: * Description es * Description ca En el frontend, como lo solucionais que se muestre un campo o otro según el idoma? {% load i18n %} {% get_current_language as LANGUAGE_CODE %} {% if LANGUAGE_CODE == 'es' %} {{entry.description_es|safe}} {% else %} {{entry.description_ca|safe}} {% endif %}
El Lunes 14 de Febrero de 2011 Antonio Melé dijo:
Para los label de formularios o los verbose_name de los modelos tendrías que marcar la cadena para traducción y luego utilizar los comandos de internacionalización para crear/compilar los archivos de traducción. Por ejemplo: from django.utils.translation import ugettext as _ class Modelo(models.Model): descripcion = models.TextField(verbose_name=_(u'descripción'))
El Martes 15 de Febrero de 2011 raimon dijo:
@antonio: me dejaba el verbose_name, por eso en el .po no podia traducir los labels. En el frontend, en la doc no se comenta como mostrar un campo o otro segun el idioma del usuario. Com te lo montarias por no hacer if/else segun el idioma de l'usuario del frontend?
El Martes 15 de Febrero de 2011 Miguel Araujo dijo:
@ralmon En ese caso no tienes que hacer nada. Basta con poner {% trans variable %} y Django usará la traducción correspondiente al idioma del navegador que solicite la página. Es inteligente. Justo hace unos días andaba mirando esta aplicación, creo que después de este artículo me voy a animar a probarla @antonio. Gran artículo!! Un saludo
El Miércoles 16 de Febrero de 2011 raimon dijo:
@miguel! conocia {%trans "string" %} pero no con la variable! Perfecto. Cada vez me esta gustando más Django ;)
El Miércoles 16 de Febrero de 2011 Antonio Melé dijo:
@miguel ya nos contarás la experiencia :)

Escribe un comentario: