Documentation PostgreSQL 8.0.2 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Chapitre 44. Support natif des langues | Avance rapide | Suivant |
Cette section décrit comment implémenter le support natif d'un langage 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
Insérez le code suivant 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 commun est d'utiliser
#define _(x) gettext(x)
Une autre solution est envisageable si le programme effectue la plupart de ses
communications via une ou un nombre restreint de fonctions, telle
ereport()
pour le moteur. Ainsi,
vous modifiez le fonctionnement interne de cette fonction pour qu'elle appelle
gettext
pour toutes les chaînes en entrée.
Ajoutez un fichier nls.mk 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 altenative. Éventuellement, ceci incluera pratiquement tous les fichiers
sources du programme. Si cette liste est trop longue, vous pouvez remplacer
le premier << fichier >> par un + et
laisser le deuxième mot représenter un fichier contenant un nom de fichier par
ligne.
Les outils qui génèrent 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 vous utilisez
_
ou d'autres identifiants, vous avez besoin 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 construisez pas 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 vous n'oubliez pas d'appeler gettext() 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. Si vous pensez pouvoir résoudre ceci ainsi
if (n==1) printf("copied 1 file"); else printf("copied %d files", n):
alors soyez déçu. Certaines langues ont plus de deux formes avec des règles particulières. Il se pourrait que nous ayons solution à ce problème dans le futur, mais actuellement le mieux est encore de l'éviter. Vous pouvez écrire :
printf("number of copied files: %d", n);
Si vous voulez communiquer quelque chose au traducteur, telle que la façon dont un message doit être aligné avec quelque autre sortie, faîtes précéder l'occurence 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 |