Documentation PostgreSQL 8.0.25 | ||||
---|---|---|---|---|
Pr�c�dent | Arri�re rapide | Chapitre 44. Support natif des langues | Avance rapide | Suivant |
Cette section explique comment impl�menter le support natif d'une langue dans un programme ou dans une biblioth�que qui fait partie de la distribution PostgreSQL. Actuellement, cela s'applique uniquement aux programmes C.
Ajouter le support NLS � un programme
Le code suivant est ins�r� dans la s�quence initiale du programme :
#ifdef ENABLE_NLS #include <locale.h> #endif ... #ifdef ENABLE_NLS setlocale(LC_ALL, ""); bindtextdomain("nomprog", LOCALEDIR); textdomain("nomprog"); #endif
(nomprog peut �tre choisi tout � fait librement.)
Partout o� un message candidat � la traduction est trouv�,
un appel � gettext()
doit �tre ins�r�.
Par exemple :
fprintf(stderr, "panic level %d\n", lvl);
devra �tre chang� avec
fprintf(stderr, gettext("panic level %d\n"), lvl);
(gettext est d�fini comme une op�ration nulle si NLS n'est pas configur�.)
Cela peut engendrer du fouillis. Un raccourci habituel consiste � utiliser
#define _(x) gettext(x)
Une autre solution est envisageable si le programme effectue la plupart de ses
communications via une fonction ou un nombre restreint de fonctions, telle
ereport()
pour le moteur. Le fonctionnement interne de
cette fonction peut alors �tre modifi�e pour qu'elle appelle
gettext
pour toutes les cha�nes en entr�e.
Un fichier nls.mk est ajout� dans le r�pertoire des sources du programme. Ce fichier sera lu comme un makefile. Les affectations des variables suivantes doivent �tre r�alis�es ici :
Le nom du programme tel que fourni lors de l'appel �
textdomain()
.
Liste des traductions fournies — initialement vide.
Liste des fichiers contenant les cha�nes traduisibles, c'est-�-dire
celles marqu�es avec gettext
ou avec une
solution alternative. Il se peut que cette liste inclut pratiquement
tous les fichiers sources du programme. Si cette liste est trop longue,
le premier <<�fichier�>> peut �tre remplac� par un +
et le deuxi�me mot repr�senter un fichier contenant un nom de fichier par
ligne.
Les outils qui engendrent des catalogues de messages pour les
traducteurs ont besoin de conna�tre les appels de
fonction contenant des cha�nes � traduire. Par d�faut, seuls les appels
� gettext()
sont reconnus. Si _
ou d'autres identifiants sont utilis�s, il est n�cessaire de les lister ici.
Si la cha�ne traduisible n'est pas le premier argument,
l'�l�ment a besoin d'�tre de la forme func:2 (pour
le second argument).
Le syst�me de construction s'occupera automatiquement de construire et installer les catalogues de messages.
Voici quelques lignes de conduite pour l'�criture de messages facilement traduisibles.
Ne pas construire de phrases � l'ex�cution, telles que
printf("Files were %s.\n", flag ? "copied" : "removed");
L'ordre des mots d'une phrase peut �tre diff�rent dans d'autres langues. De plus, m�me si gettext() est correctement appel� sur chaque fragment, il pourrait �tre difficile de traduire s�par�ment les fragments. Il est pr�f�rable de dupliquer un peu de code de fa�on � ce que chaque message � traduire forme un tout coh�rent. Seuls les nombres, noms de fichiers et autres variables d'ex�cution devraient �tre ins�r�s au moment de l'ex�cution dans le texte d'un message.
Pour des raisons similaires, ceci ne fonctionnera pas :
printf("copied %d file%s", n, n!=1 ? "s" : "");
parce que cette forme pr�sume de la fa�on dont la forme plurielle est obtenue. L'id�e de r�soudre ce cas de la fa�on suivante :
if (n==1) printf("copied 1 file"); else printf("copied %d files", n):
sera source de d�ception. Certaines langues ont plus de deux formes avec des r�gles particuli�res. Il se pourrait qu'une solution � ce probl�me soit trouv�e dans le futur, mais actuellement le mieux est encore de l'�viter. Il est pr�f�rable d'�crire :
printf("number of copied files: %d", n);
Lorsque quelque chose doit �tre communiqu� au traducteur, telle que la fa�on dont un message doit �tre align� avec quelque autre sortie, on pourra faire pr�c�der l'occurrence de la cha�ne d'un commentaire commen�ant par translator, par exemple
/* translator: This message is not what it seems to be. */
Ces commentaires sont copi�s dans les catalogues de messages de fa�on � ce que les traducteurs les voient.
Pr�c�dent | Sommaire | Suivant |
Support natif des langues | Niveau sup�rieur | �crire un gestionnaire de langage proc�dural |