Kaixo!

On Wed, Aug 29, 2001 at 09:12:02AM +0200, Alexis ROLLAND wrote:

> Je reviens ensuite sur ma question concernant la programmation multilangues.
> Visiblement je ne m'�tais pas suffisamment bien expliqu�, je remets �a :
> Je d�sire d�velopper un application qui puisse �tre multilangues (pour le
> moment Anglais et Fran�ais, plus tard le Catalan...). L'id�e est de fournir
> selon la langue d�sir�e un fichier "ressource" avec les termes de l'IHM
> correspondants dans la langue choisie.

Sous GNU/Linux (en fait, sous tout syst�me ayant une implementation de
gettext()) la fa�on standard de faire cela est d'utiliser gettext().
Ensuite, selon la valeur de la variable LANGUAGE (en, fr ou ca) la bonne
traduction sera utilis�e.
La liste des traductions disponible n'est pas ferm�e, puisqu'elle est
compl�tement independente du programme, il n'y a pas besoin de toucher
aux binaires pour ajouter des nouvelles langues.

> Bref, j'avais crois� sur le net une page qui expliquait que les applications
> Linux d�velopp�es selon je ne sais plus quel protocole permettaient � tout
> un chacun de les traduire. Le syst�me semblait �tre celui d�crit
> pr�c�demment. Je recherche donc des infos sur cette norme. Histoire de ne
> pas r�inventer l'eau ti�de tout les matins.

voir la page info de la 'libc', cherche la section sur la traduction des
messages.
Si tu utilises le gnome-help-browser, tape l'uri
'info:libc#Message_Translation' et tu est � la bonne section.
note en particulier ngettext() qui g�re l'�pineux probl�me des pluriels
(tr�s important pour les langues slaves, dont certaines ont jusqu'� trois
formes differentes suivant le nombre)


Voici un mini example:

#include <stdlib.h>
#include <stdio.h>
/* ceci est fait automatiquemment par la plupart des toolkits hau niveau */
#include <locale.h>
#include <libintl.h> 
#define _(String) gettext(String)

int main()
{
        int i;

        setlocale(LC_ALL, ""); 
        bindtextdomain("toto", "/usr/share/locale");
        textdomain("toto");

        printf( _("test string\n"));

        for (i=0;i<500;i++)
                printf( ngettext("%d sheep ", "%d sheeps ", i));

        printf("\n");
        return 0;
}


puis tu cr�es un fichier *.po pour la langue que tu veux, eg pour le fran�ais:

msgid ""
msgstr ""
"Project-Id-Version: toto 0.1\n"
"POT-Creation-Date: 2001-08-28 19:10+0200\n"
"PO-Revision-Date: 2001-08-28 22:24GMT\n"
"Last-Translator: Ton Nom <ton@email>\n"
"Language-Team: French\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n==1 || n==0 ? 0 : 1;\n"

msgid "test string\n"
msgstr "message de test: ������\n"

msgid "%d sheep "
msgid_plural "%d sheeps "
msgstr[0] "%d mouton "
msgstr[1] "%d moutons "



que tu compiles comme ceci:

msgfmt -o /usr/share/locale/fr/LC_MESSAGES/toto.mo fr.po

('toto' est le domaine indiqu� dans bindtextdomain et textdomain).

puis, lance ton programme avec LANGUAGE=fr.

Plus fort, ouvre un xterm en unicode (xterm -u8),
et essaye maintenant avec LC_ALL=fr_FR.UTF-8 LANGUAGE=fr,
essaye mainenant avec LC_ALL=C et LANGUAGE=fr.

avec une autre r�gle de pluriel (4, comme en slov�ne):

"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 
2 : 3;\n"

puis:

msgid "%d sheep "
msgid_plural "%d sheeps "
msgstr[0] "%d stul "
msgstr[1] "%d stuli "
msgstr[2] "%d stula "
msgstr[3] "%d stulov "

(�a veut pas dire mouton, c'est juste pour illustrer la r�gle de pluriels)

avec une seule forme invariable (comme en chinois):

"Plural-Forms: nplurals=1; plural=0;\n"

msgid "%d sheep "
msgid_plural "%d sheeps "
msgstr[0] "%d xxxx "


Enfin, sache que la cr�ation des fichiers *.po et du fichier *.pot est
faite avec xgettext et msgmerge; �a va normalement dans un repertoire po/
avec un ficheir POTFILES.in listant (relatif au repertorie du dessus)
tous les ficheirs avec des cha�nes traduisibles, pour que xgettext puisse
les extraire.
en lan�ant "gettextize" sur une arborescence de sources utilisant autoconf
il cr�e les bons repertoires et fait les bonnes modifs au configure.in

Pour l'�criture des traductions, cherche des programmes comme KBabel,
gtranslator, ou si tu aimes emacs il y a le po-mode; et pour vim aussi
il y a un .po.vim tr�s pratique.
il y a aussi pospell (du paquetage spellutils) qui permets de lancer
un correcteur orthographique sur les traductions.

Le grand avantage par rapport � d'autres syst�mes c'est la grande simplicit�
d'utilisation, aussi bien c�t� programmeur que c�t� traducteur et aussi
c�t� utilisateur.
Aussi, le fait que les entr�e soient des cha�nes de texte et non des
identifiants rends une traduction utilisable malgr� des changemments en
profondeur du source et donc du binaire (bon, il manquera des traductions,
mais on ne risque pas, comme avec un syst�me � identifiants num�riques,
que "Ok" soit traduit par "impossible d'ouvrir le ficheir" par exemple.
J'ai eu des trucs tr�s rigolos avec 'man' par exemple, qui lui utilise
des identifiants num�riques: une cha�ne avait �t� ajout�e, tous les identifians
d�cal�s --> plus aucune traduction n'avait de sens. Avec le syst�me gettext
en pareil cas il y aurait juste la nouvelle cha�ne qui serait non traduite,
c'est tout.

voil�.

-- 
Ki �a vos v�ye b�n,
Pablo Saratxaga

http://www.srtxg.easynet.be/            PGP Key available, key ID: 0x8F0E4975

[ Soyez pr�cis dans vos sujets svp afin de d�terminer directement  ]
[ le type de demande...                                            ]
[ Pour vous (d�s)inscrire, aller sur http://unixtech.be/ml.php     ]
[ Archives de la mailing list: http://archives.unixtech.be/linux/  ]
[ http://unixtech.be              Contact: [EMAIL PROTECTED]  ]

Répondre à