Karrigell Documentation

Version 2.2.5 13 05 06

English

16. Internationalisation et Unicode

Comme les lecteurs de la documentation en anglais l'auront remarqué, je ne suis pas originaire d'un pays anglophone (je suis français, et plus précisément breton - "Karrigell" est un mot breton). J'ai donc inclus un programme pour faciliter l'internationalisation des scripts.

16.1 Introduction

La traduction est effectuée en utilisant le module gettext fourni dans la bibliothèque standard de Python. La traduction figure dans un fichier texte qui a une extension .po, dans un répertoire appelé langue/LC_MESSAGES ; dans ce fichier, le texte anglais est sur une ligne qui commence par msgid et la traduction sur la ligne suivante qui commence par msgstr. Par exemple :

msgid "Server got itself in trouble"
msgstr "Quelque chose ne va pas dans le serveur"

Ce fichier texte est transformé en un fichier binaire avec une extension .mo par un programme Python appelé msgfmt.py, écrit par Martin v. Löwis (il est inclus dans le Répertoire Serveur de Karrigell)

Dans un script, à chaque fois que vous voulez qu'un message soit traduit ans une langue donnée, au lieu de l'écrire comme une chaîne normale avec des guillemets, on l'écrit comme argument d'une fonction appelée _, de cette façon :

print _("Server got itself in trouble")

Pour que la traduction dans la langue voulue soit activée :

import gettext
t=gettext.translation(domaine,repBase,langue)
t.install()

domaine est le nom du fichier .po, repBase le répertoire dans lequel se trouve le sous-répertoire langue/LC_MESSAGES, et langue est la langue voulue

Par exemple, si la langue est "francais", que le fichier .po file s'appelle messages.po, et qu'il se trouve dans c:\Mes documents\Traductions\francais\LC_MESSAGES vous écrirez :

import gettext
t=gettext.translation("messages","c:\Mes documents\Traductions","francais")
t.install()

16.2 Programme d'internationalisation

L'utilisation de gettext seul peut s'avérer un peu lourd quand on écrit ou qu'on met au point un programme ; pour chaque nouvelle chaîne de caractères à traduire il faut recréer l'ensemble du fichier .po puis le fichier .mo sans effacer les traductions précédentes. Karrigell fournit une interface web simple pour créer et modifier les traductions de chaînes, en cachant le mécanisme sous-jacent de gettext

Pour des raisons de sécurité, ce script est réservé à l'administrateur. Un script d'authentification est exécuté, il s'appuie sur des condensés md5 stockés dans un fichier appelé admin.ini, que l'administrateur doit définir en exécutant le script k_password.py

Avec votre navigateur, appelez le script http://localhost/admin/internat.pih. Il s'ouvre sur un explorateur de répertoires avec lequel on peut accéder à tous les fichiers susceptibles de contenir des chaînes à traduire (c'est-à-dire tous les fichiers qui ont une extension .py, .pyw, .pih, .hip). En cliquant sur le nom d'un fichier une page affiche toutes les chaînes à traduire (les arguments de la fonction _()) et demande une traduction dans toutes les langues qui sont actuellement sélectionnées dans les préférences du navigateur (1). Si des traductions ont déjà été faites elles apparaissent dans les champs du formulaire

Remplissez les champs et validez le formulaire ; les traductions sont automatiquement créées ou modifiées

Vous pouvez vérifier l'effet en appelant le script que vous venez de traiter et en changeant l'ordre des langues dans les préférences

La traduction est conservée dans un fichier qui est commun à tous les fichiers d'un même répertoire. On peut aussi éditer tout le dictionnaire en cliquant sur le premier élément de la liste des scripts

16.3 Prise en charge d'Unicode

Nouveau dans la version 2.2.2

écrit principalement par Radovan Garabik

Unicode est un standard normalisé qui sert à représenter tous les styles d'écriture dans le monde. Pour chaque signe (une lettre dans un alphabet, un idéogramme dans une langue asiatique), Unicode définit un nombre unique, appelé "point de code". Comme les ordinateurs et les réseaux ne savent manipuler que des octets, une correspondance doit être définie entre ces "points de code" et un ou plusieurs octets ; ces correspondances sont appelées "encodages"

Du fait qu'il existe beaucoup d'encodages différents, quand un programme doit imprimer un signe (une lettre grecque, un signe chinois) il doit recevoir deux informations : la chaîne de caractères qui représente le signe (une séquence d'octets) et l'encodage utilisé. S'il reçoit seulement une chaîne, le programme peut essayer de deviner l'encodage (c'est ce que fait généralement un navigateur web) mais sans aucune garantie de succès

Karrigell définit deux paramètres du fichier de configuration pour prendre en charge Unicode :

  • encodeFormData : s'il est initialisé à 1, Karrigell cherche à convertir les données des formulaires en chaînes Unicode, en essayant successivement plusieurs encodages. Plus précisément, si les données reçues ne comportent que des caractères ASCII, il n'y a pas de conversion en Unicode, on conserve la chaîne telle quelle ; sinon le programme essaie plusieurs encodages
    Les données de formulaires accessibles dans QUERY sont donc soit des chaînes ordinaires soit des chaînes Unicode
    Par défaut encodeFormData vaut 0 : aucune conversion en Unicode n'est effectuée
  • outputEncoding : définit l'encodage que le navigateur doit utiliser pour interpréter les chaînes de caractères qu'on lui demande d'afficher. La valeur par défaut est 'latin-1', qui sert à représenter les signes des langues européennes basées sur l'alphabet latin. Vous pouvez définir un autre encodage en donnant une valeur à l'option outputEncoding dans la section [Server] du fichier de configuration

    Vous pouvez regarder des exemples dans le répertoire demo/unicode : donnez à outputEncoding la valeur utf-8 pour voit le résultat attendu


(1) Sur Microsoft Internet Explorer la préférence de langue est définie par Outils/Options Internet/Général/Langues ; les langues acceptées sont sélectionnées à partir d'une liste et classées par ordre de préférence. Sur Netscape utiliser Edition/Préférences/Langues