6.12. Localisation 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.

6.12.1 Localisation

Dans un script, à chaque fois que vous voulez qu'un message soit traduit dans 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 _("Bonjour tout le monde")

Pour les scripts Python Inside HTML (PIH) il existe un raccourci, <%_ > :

<%_ "Bonjour tout le monde" %>

Le menu d'administration donne accès à une interface web pour créer et modifier facilement la traduction des chaînes de caractères

6.12.3 Prise en charge d'Unicode

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

Quand vous écrivez un script, le mieux à faire est d'indiquer explicitement l'encodage utilisé : pour cela, il existe une fonction intégrée, SET_UNICODE_OUT(encodage), où encodage est une chaîne de caractères comme 'iso-8859-1' ou 'utf-8'

S'il n'est pas défini, l'encodage du document sera celui spécifié dans le fichier de configuration de l'hôte par output_encoding. Sa valeur par défaut est None, ce qui veut dire qu'aucun encodage n'est défini. Il est beaucoup plus sûr d'en définir un, habituellement 'iso-8859-1' pour les langues qui utilisent l'alphabet latin et 'utf-8' pour les autres écritures. Si rien n'est défini, vous devez vous fier au navigateur pour deviner l'encodage utilisé, ce qui peut conduire à des rendus inattendus

6.12.3 Exemple

from HTMLTags import *
def index():
    SET_UNICODE_OUT("utf-8")
    print FORM(INPUT(name="foo")+INPUT(Type="submit",value="Ok"),
        action="bar")
def bar(foo):
    foo = unicode(foo,"utf-8").encode("iso-8859-1")
    SET_UNICODE_OUT("iso-8859-1")
    print foo

Dans index(), nous indiquons que l'encodage est utf-8 ; le navigateur enverra les données entrées au clavier par l'utilisateur avec cet encodage

La fonction bar reçoit la valeur foo comme une chaîne de caractères en octets, l'encodage utf-8 d'une chaîne Unicode. Nous voulons l'imprimer en utilisant un autre encodage, défini par la ligne SET_UNICODE_OUT("iso-8859-1") : il faut donc d'abord encoder la chaîne Unicode avec cet encodage, ce qui est réalisé dans la première ligne de bar(). Nous pouvons alors imprimer foo, qui sera rendu sous la forme attendue

6.12.4 Traductions intégrées et Unicode

Si aucun encodage n'est spécifié, la fonction intégrée _() renvoie l'encodage en utf-8 des traductions. Si un encodage est indiqué, il sera utilisé par la fonction de telle façon que le texte traduit est encodé de la bonne façon