Salut,
Avec un code proche de
1 2 3 4 5 6 7
| #if 1
char const * const catalog = "fr_FR";
char const * const locale = "french_France.1252";
#else
char const * const catalog = "es_ES";
char const * const locale = "Spanish_Spain.1252";
#endif |
ce n'est pas vraiment étonnant 
Ce code dit au compilateur : si 1 est vrai, tu gardes les eeux premières lignes (celles qui parlent francais), sinon tu gardes les deux dernières lignes (celles qui parlent l'espagnol).
Et, comme 1 est toujours vrai, bah, tu n'auras jamais que les deux premières lignes.
Sinon, l'idée de base, c'est que tu créeras tous les messages que tu veux afficher en anglais, en les faisant passer par la "machinerie" de gettext.
En ne me basant que sur ton code, cela donnerait quelque chose comme (attention, adapté, non testé 
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream>
#include <string>
#include <libintl.h>
#include <locale.h>
int main(){
setlocale( LC_ALL, "" );
textdomain("TonApplication");
bindtextdomain("TonApplication", "i18n");
bind_textdomain_codeset("TonApplication", "UTF-8");
std::cout<<gettext("hello world!");
return 0;
} |
Une fois que c'est fait, tu extrait les chaines qu'il faut traduire avec xgettext sous la forme de
xgettext -d TonApplication -s -o main.pot main.cpp
Cette commande te créera un fichier (main.)pot (portable object template) qui est un modèle que tu pourras utiliser pour tes traductions.
La troisième étape est d'obtenir "une copie de travail" du fichier pot afin d'effectuer les traductions.
Tu peux assez facilement copier le fichier main.pot en main.po, mais, l'idéal est d'utiliser msginit, sous une forme proche de
msginit -l <locale à utiliser pour la traduction> -o <nom du fichier po à créer > -i <fichier.pot d'origine>
Si tu veux, par exemple, permettre la traduction en francais et en espagnol, tu créeras les fichiers po grace aux deux commandes (une pour le francais, l'autre pour l'espagnole)
1 2
| msginit -l fr_FR -o main_fr.po -i main.pot
msginit -l es_ES -o main_es.po -i main.pot |
La première commande t'aura créé le fichier main_fr.po et la seconde le fichier main_es.po, qui prendront tous les deux une forme proche de
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| # <nom du projet> translations for PACKAGE package.
# Copyright (C) 2004 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# <ton nom> <ton e-mail> <annee>.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date:<date et heure>\n"
"PO-Revision-Date: <date et heure \n"
"Last-Translator: <toi> <ton e-mail>\n"
"Language-Team: <nom dui projet>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:10
msgid "Hello, world!\n"
msgstr "" |
La quatrième étape consiste à modifier les chaines de caratère msgstr afin de traduire les chaines telles qu'elles sont indiquées par les chaines msgid.
Il ne te restera plus qu'à créer le fichier objet (qui contient les chaines au format binaire adéquat) avec la commande
msgfmt -c -v -o main.mo main_fr.po
et à copier le fichier main.mo dans le dossier adéquat pour que la magie fonctionne 
Si, par la suite, tu rajoutes des chaines de caractères qui doivent être traduites, tu regénère un nouveau fichier pot et tu peux les rajouter aux fichiers déjà générés avec msmerge, grace à une commande proche de
msgmerge -s -U main_fr.po nouveau_fichier.pot
Partager