Blog ENI : Toute la veille numérique !
-25€ dès 75€ sur les livres en ligne, vidéos... avec le code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

La traduction et la localisation

Principes et généralités

L’internationalisation, c’est rendre une application web utilisable dans plusieurs pays. Pour rendre une application web utilisable à l’international, on doit résoudre plusieurs problématiques différentes :

1- Faire en sorte que le contenu du site soit affiché dans la langue du pays (traduire).

2 - Avoir les bons formats affichés pour certaines unités, telles que les devises, les dates, les heures et les nombres. Ce deuxième point se décomposant en deux sous-parties : convertir des unités, par exemple afficher des centimètres en pouces et localiser, c’est-à-dire utiliser le format d’affichage du pays pour l’unité, par exemple 12 décembre 2014 pour le format des dates en France.

Dans ce chapitre nous ne nous intéresserons pas à la conversion des unités, mais à la traduction des contenus, la localisation des unités et à la conversion des heures UTC en fonction du fuseau horaire (timezone). Django prenant en charge ces trois aspects (traduction, localisation et timezone), dans le code et dans les templates.

Traduction

Pour traduire un projet Django, c’est relativement aisé, il n’y a pas énormément de code à ajouter et de préférence, si vous avez lu ce chapitre, vous prendrez la bonne habitude de coder directement en utilisant les raccourcis qui permettent d’activer la traduction dans votre code.

Car hélas, il faut tout de même indiquer à Django ce qu’il faut traduire, cela n’est pas totalement automatique et si vous l’oubliez, vos textes ne seront pas traduits.

Les mécanismes gérant la traduction dans Django s’appuient sur les outils open source gettext de GNU.

1. Principe général

Pour que la machinerie de traduction fonctionne, il faut activer USE_I18N = True dans votre fichier settings.py, vérifier que le processeur de templates ’django.core.context_processors.i18n’ est bien défini dans TEMPLATE_CONTEXT_PROCESSORS et que django.middleware.locale.LocaleMiddleware est installé dans MIDDLEWARE_CLASSES.

Si vous n’avez pas besoin de traduire votre site, supprimez le processeur et désactivez USE_I18N, cela optimisera votre site en évitant le chargement de la machinerie de traduction. 

Description du principe général de fonctionnement

On utilise ugettext() pour signaler à Django les chaînes de caractères à traduire : « ugettext(’ma chaine’) ». Il est de convention que, pour simplifier l’écriture, on crée un alias de ugettext() avec _() lors de son importation : « _(’ma chaine’) ».

Un utilitaire va extraire du site tous les messages à traduire, les recoller avec le fichier de traduction déjà existant, indiquer les numéros de lignes qui utilisent cette traduction et ajouter les informations fournies par le programmeur au traducteur puis créer ou modifier un fichier .po. Cette opération étant réalisée pour chacune des langues définies, le traducteur traduit chaque ligne du fichier .po.

Une fois traduit, le fichier .po est compilé en un fichier .mo que la machinerie de traduction de Django va utiliser pour afficher les messages en fonction de la langue de l’utilisateur.

images/page557.png

Exemple : le texte ″Bonjour !″ est converti en chaîne à traduire :


from...

La localisation

Django est en mesure d’afficher les dates, les heures et les nombres selon des formats spécifiques à une langue. Il peut également faire en sorte que l’affichage et les saisies dans les formulaires soient compatibles avec un langage particulier.

Exemples :

Anglais : « oct. 17, 2014. Français « 17 oct. 2014 » . US : « $1,000.00 ». Français « 1 000,00 $ »

Pour activer le mécanisme de localisation dans Django, activez USE_L10N = True, dans votre fichier settings.py.

Activez également USE_THOUSAND_SEPARATOR = True si vous voulez afficher les nombres avec des séparateurs de milliers. Vous pouvez sinon de toutes les façons utiliser le filtre intcomma de django.contrib.humanize dans vos templates pour formater les nombres avec un séparateur de milliers.

1. Activer et désactiver la localisation dans les templates

Lorsque l’on a activé USE_L10N, Django va dans les templates utiliser systématiquement un format spécifique à la langue courante. Cela peut s’avérer inapproprié dans certaines circonstances. Par exemple si vous voulez extraire des données à un format CSV systématiquement formaté d’une certaine manière, quelle que soit la langue de l’utilisateur.

Si vous chargez dans vos templates la librairie l10n vous aurez un certain nombre de tags...

Les timezones

Le dernier volet de la couleur locale est la gestion correcte des timezones, car pour beaucoup d’utilisateurs lambda, une heure UTC (Coordinated Universal Time) ne va pas signifier grand-chose et afficher la date du lendemain pour une commande passée depuis la Chine, ne fait pas nécessairement sérieux, même si c’est techniquement compréhensible, les fuseaux horaires étant une réalité.

Pour activer les timezones : positionnez USE_TZ=True dans le fichier settings.py. Lorsque le support des timezones est activé, Django stocke toutes les dates en UTC dans la base de données, et les convertit en temps local lors de l’affichage dans les formulaires et les templates. Ainsi chaque utilisateur verra des dates et des heures qui correspondent à son fuseau horaire.

Mais doit-on nécessairement activer le support des timezones dans Django ? Mon site est en France et s’adresse aux Français (ou aux autres Européens du même fuseau horaire), donc je n’ai pas besoin des timezones, n’est-ce pas ?

En fait à la première question la réponse est oui et à la deuxième la réponse est non. Si on n’active pas les timezones on s’expose à des bugs imprévisibles et non reproductibles au moment du changement d’heure c’est-à-dire deux fois par an. Même si on n’en a pas besoin, il est fortement recommandé de les activer.

Seulement, activer les TZ (timezones) ne suffit pas, il va falloir également les gérer correctement.

Primo, il vaut mieux installer le module Python pytz, cela améliorera le support des timezones dans Django et c’est très fortement recommandé. En plus cela simplifiera la gestion des TZ.

Pour l’installer :


$ sudo pip install pytz
 

Secundo, il faut accepter quelques erreurs et messages de warning, jusqu’à ce que vous soyez habitué à jongler avec les TZ. Si vous êtes déjà un habitué de pytz, cela ne devrait pas poser de problème. Quelques problèmes que vous pourriez rencontrer :


TypeError: can't compare offset-naive and offset-aware datetimes
 

On ne peut pas directement comparer des datetime « ordinaires » et des dates avec timezone. Il va falloir adapter votre code pour...