Django : internationaliser vos modèles dans vos applications
Par NiCoS le jeudi 15 novembre 2007, 12:34 - Python - Django - Lien permanent
La documentation sur l'internationalisation d'une application Django m'ayant laissé perplexe tant en anglais qu'en français, voici un petit résumé de ce qu'il faut faire.
Dans settings.py, il vous faut :
- Avoir un language code correctement configuré
- Que USE_I18N soit bien activé - c'est le cas par défaut
- Ajouter
'django.middleware.locale.LocaleMiddleware', à la liste de vos middleware. Attention l'ordre compte - cf documentation
Exemple :
[...] LANGUAGE_CODE = 'fr' USE_I18N = True [...] MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.doc.XViewMiddleware', ) [...]
Dans app/models.py :
- Importer
gettext_lazyfourni par django.gettext_lazy()s'utlise pour traduire les champs des modèles - Pour éviter d'écrire
gettext_lazy('Single'), on peut utiliser le système d'alias pour n'écrire que :_('Single'). - Si vous êtes en unicode, c'est
ugettext_lazy()et nongettext_lazy()bien sûr,
Exemple :
# -*- coding: utf-8 -*- from django.db import models from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ """ Profile This object is used to provide some common information regarding the profile of a user. """ class Profile(models.Model): CIVILITY_CHOICES = ( ('single', _('Single')), ('taken', _('Taken')), ) who = models.ForeignKey(User, unique=True, verbose_name=_('Person'),) photo = models.ImageField(height_field="80", width_field="80", upload_to="photos", blank=True) street = models.CharField(_('Address 1'), maxlength=100) street_bis = models.CharField(_('Address 2'), maxlength=100, blank=True) zipcode = models.IntegerField(_('Zip code'), maxlength=5) city = models.CharField(_('City'), maxlength=100) phone = models.CharField(_('Phone'), maxlength=20) mobile = models.CharField(_('Mobile'), maxlength=20, blank=True) civility = models.CharField(_('Status'), maxlength=20, choices=CIVILITY_CHOICES) birthdate = models.DateField(_('Birth date')) children = models.IntegerField(_('Children'), blank=True, null=True)
Dans le répertoire de votre application, créer un répertoire "locale" :
mkdir -p /chemin/de/votre/projet/django/app/locale
Ensuite il vous faut générer votre fichier de langue .po correspondant à votre langue (ici : fr):
/usr/lib/python2.5/site-packages/django/bin/make-messages -l fr
Saisissez alors la traduction dans app/locale/<langue>/LC_MESSAGES/django.po
Exemple :
#: models.py:14 msgid "Single" msgstr "Célibataire"
Compiler ensuite votre fichier de langue :
/usr/lib/python2.5/site-packages/django/bin/compile-messages
Vous obtenez alors un fichier app/locale/<langue>/LC_MESSAGES/django.mo
Dans votre template :
- ajouter
{% load i18n %}en tête de template
Ex :
{% extends "base.html" %}
{% load markup %}
{% load i18n %}
Si vous utilisez le serveur de développement, il faut le redémarrer pour qu'il prenne en compte les fichiers de langue compilés (idem lors d'une mise à jour des fichiers de langue).
Et voilà, savourez le travail...
Merci à benoitc et anhj de #django-fr pour m'avoir aidé à trouver mon erreur (ie avoir créer dans le répertoire de mon application une structure conf/locale au lieu de locale. La première ne s'utilise que pour l'ensemble d'un projet django).