====== 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.