22 Utilisateur(s) en ligne

Internationaliser un programme wxWidgets

Par Ceacy


Lorsqu'on crée un programme, interviennent souvent plusieurs problèmes, apparemment superficiels, mais plutôt gênants :
- comment proposer un choix de la langue ?
- comment mettre des accents et des caractères accentués, ffs ?!


Une solution élégante à ce problème est celle des catalogues. En gros, le principe est le suivant :
- on crée un fichier .po, contenant les correspondances entre certaines chaînes de caractères et leur traduction en une langue spécifique.
- dans le programme, on utilise ensuite ces chaînes de caractères, et on spécifie qu'on utilise un catalogue - le fichier .po, qui doit être auparavant compilé en fichier .mo.

Lorsqu'on lance le programme, une correspondance est alors faite entre lesdites chaînes de caractères et leur traduction ... et c'est cette dernière qui est affichée ! Et ça, c'est Bien.

Dans cet exemple, nous verrons comment utiliser ce système de catalogue avec un programme wxWidgets, une librairire d'interface graphique qui fournit un support pour cela.

Dans ce tutoriel, je supposerai donc que vous savez comment utiliser wxWidgets (anciennement wxWindows). Éventuellement, jetez un oeil ici et .

  • I. Première étape

Ajoutez une donnée membre wxLocale à votre classe dérivée de wxApp, et initialisez-la dans votre wxApp::OnInit().

#define MENU_FILE_ITEM _("&File")
#define MENU_HELP_ITEM _("&Help")
#define MENU_ABOUT_ITEM _("&About")

class XVMProto_App : public wxApp
{
public:
virtual bool OnInit();
protected:
wxLocale m_locale; // C'est elle ^^
};

bool XVMProto_App::OnInit()
{
// Initialize the locale and set the catalog
m_locale.Init( wxLANGUAGE_FRENCH ); // ou wxLANGUAGE_ENGLISH, ou wxLANGUAGE_GERMAN ... voir http://www.wxwidgets.org/manuals/2.4.2/wx238.htm#wxlanguage
m_locale.AddCatalog(wxT("messages"));
// [...]
}

  • II. deuxième étape

Utilisez ensuite les chaînes que vous souhaitez utiliser, en les mettant entre "_()" : cela assurera qu'elles seront traduites.

#define MENU_FILE_ITEM _("&File")
#define MENU_HELP_ITEM _("&Help")
#define MENU_INFOS_ITEM _("&About\tF1")
[...]
XVMProto_Frame::XVMProto_Frame( const wxChar *title, int xpos, int ypos, int width, int height )
: wxFrame( (wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height) )
{
[...]
helpMenu = new wxMenu;
helpMenu->Append(200, MENU_INFOS_ITEM);
[...]
menuBar = new wxMenuBar;
menuBar->Append(fileMenu, MENU_FILE_ITEM);
menuBar->Append(helpMenu, MENU_HELP_ITEM);
[...]
}

  • III. Troisième étape

Puis, compilez le programme. Créez ensuite, dans le dossier où est l'exécutable un dossier par langage souhaité : "fr", "en", "de", "ru" ...

Puis, créez le fichier /messages.po ; ici, fr/messages.po, qui contiendra les traductions :

# XVM Prototype with GUI messages.
# Copyright (C) 2005 Free Software Foundation, Inc.
# Ceacy <ceacy@xxx.fr>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: XVM Prototype with GUI\n"
"POT-Creation-Date: 2005-03-21 16:23+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Ceacy <ceacy@xxx.fr>\n"
"Language-Team: FR <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid "&File"
msgstr "&Fichier"

msgid "&Help"
msgstr "&Aide"

msgid "&About\tF1"
msgstr "&À Propos\tF1"

Je ne traduis ici que les chaînes "&File", "&Help" et "&About" utilisées dans mon programme - dans les menus - mais vous pouvez en mettre autant que vous voulez ... d'ailleurs, dans le programme complet, j'en ai mis pas mal ;-)

Pour finir, il suffit de compiler les .po en .mo; sous Linux :

$ cd /dossier/des/sources/
$ msgfmt -o fr/messages.mo fr/messages.po
$ msgfmt -o en/messages.mo en/messages.po


Et ça marche !




Publié le: dimanche 27 décembre 2009 (862 lectures)
Copyrights © par Oltana.net

Format imprimable

[ Retour ]