Outils pour utilisateurs

Outils du site


django:tips

Truc en vrac

Internationalisation d'application

Dans le projet Django

Les réglages se font dans le setting.py

from django.utils.translation import gettext as _
[...]
USE_I18N = True
LANGUAGE_CODE = 'en'
LANGUAGES = (
    ('en', _('English')),
    ('fr', _('Français')),
)
DEFAULT_LANGUAGE = 1
[...]
MIDDLEWARE_CLASSES = (
   [...]
   'django.middleware.locale.LocaleMiddleware',
)
 
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.i18n',
)

Dans les fichiers source Python

  • ajouter l'import kivabien
from django.utils.translation import gettext_lazy as _
  • pour chaque chaîne de caractères, utiliser l'alias pour identifier une chaîne à traduire.
MACHAINE = 'Une belle chaîne de caractères'

devient

MACHAINE = _('Une belle chaîne de caractères')

Dans les templates

  • Charger les extensions i18n
{% load i18n %}
  • Tagguer les chaînes
{% trans "Ma chaine de caractères" %}
{% blocktrans %}Cette chaîne contient en plus une {{ variable }}.{% endblocktrans %}

Ou pour un bloc complet

{% blocktrans %}
[...]
{% endblocktrans %}
  • À venir: quelques subtilités pour la base de données ou les variables filtrées des templates

Générer les fichiers de traduction

La création des fichiers de traduction est faite grâce à gettext que l'on trouve dans toutes les bonnes crèmeries. Les fichiers sont créés au niveau de l'application

cd monApplication
mkdir locale
django-admin.py makemessages -l CODE_LANGUE

→ Génère un fichier .po pour la langue CODE_LANGUE. Ce fichier se trouvera dans locale/CODE_LANGUE/LC_MESSAGES

Une fois la(es) traduction(s) réalisée, il suffit de compiler les fichiers .po pour générer le fichier .mo :

django-admin.py compilemessages

Erreurs d'encodage avec gettext

Lors de la génération des fichiers d'internationalisation avec gettext, le message suivant peut apparaître :

Unknown encoding "utf8". Proceeding with ASCII instead.

Le même en français

Encodage « utf8 » inconnu. Traitement effectué en ASCII.

Ce message vient d'un problème de déclaration de l'encodage des fichiers source. Il semble de Python traite la déclaration d'encodage utf8 comme un alias à utf-8. Pour corriger le problème, il suffit de parcourir l'ensemble des fichiers source et de remplacer

# -*- coding: utf8 -*-

par

# -*- coding: utf-8 -*-

ugettext vs ugettext_lazy

Ces deux fonctions permettent de traduire des chaînes de caractères :

  • Formulaires et modèles, exécutions à l'import : Utilisez ugettext_lazy. La traduction est faite au dernier moment.
  • Vues et fonctions similaires : utilisez ugettext. Cette fonction renvoie son résultat immédiatement.
  • N'UTILISEZ PAS ugettext_lazy dans des fonctions qui attendent une string comme .replace ou lors d'une concatenation. Cela ne fonctionnera pas.
  • N'UTILISEZ PAS ugettext dans des fonctions exécutées à l'import, par exemple dans les modèles. Le changement de locale sans redémarrage du serveur ne modifierait alors pas la valeur traduite de la variable : les traductions conserveraient les anciennes valeurs.

Je n'ai pas encore tout compris mais de ce que je lis ici et là, il semble que ce soit la bonne manière de faire.

django/tips.txt · Dernière modification: 2016/10/17 13:56 (modification externe)