Table des matières

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

from django.utils.translation import gettext_lazy as _
MACHAINE = 'Une belle chaîne de caractères'

devient

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

Dans les templates

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

Ou pour un bloc complet

{% blocktrans %}
[...]
{% endblocktrans %}

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 :

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.