[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux] Info Kylix et multilangue
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: listmaster@unixtech.be ]