wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 2
Pub hébergeur
Pourquoi cette pub ?

Valid XHTML 1.0 Transitional

Valid CSS2

Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Système
» Application multilangues
Détails du snippet : Application multilangues
Informations sur l'auteur de ce snippet :


Hors ligne
cfdev (Membre)
Lieu: Alpes de Haut Provence
Inscrit le : 08-11-2007
Messages: 127
Snippets: 4
Tutoriels: 0
Introduction / Description :
Ce snippe montre l'utilisation de la class wxLocale,
elle permet de gérer les catalogues de langues pour traduire une application.

Prérequis :
- Gestion des catalogues (*.mo) avec Poedit
Contenu du snippet :
Avant toutes choses, pour que Poedit sache quelles chaines sont à traduire, il faut les distinguer dans le code :
_() chaine à traduire.
wxT() chaine standard.

Aprés avoir généré un catalogue et placer par exemple dans un dossier "locale/<lang>/",

il faut déclarer un wxLocale dans la class de construction de l'application .

Code wxWidgets:

 
#include <wx/intl.h> // Gestion de la localisation
 
class myApp : public wxApp
{
    private:
        // Gestion de la localisation
        wxLocale *m_Locale;
    public:
    virtual bool OnInit();
};
 


Puis dans le OnInit de celle-ci avant la construction de frame, on charge le langage par défaut du système :

Code wxWidgets:

 
bool myApp::OnInit()
{
/// Gestion du multilangages
// Ajout du chemin
wxLocale::AddCatalogLookupPathPrefix(wxT("locale"));
// Création de la class avec le langage par défaut
m_Locale = new wxLocale( wxLANGUAGE_DEFAULT );
// Ajout du catalogue correspondant (*.mo)
m_Locale->AddCatalog(wxT("myApp"));
 
///Construction des frames
...
return true;
}
 
Explications finales :
Au lancement le catalogue correspondant sera chargé à l'aide de wxLocale et l'application sera traduite.

Bonne Prog ;) ++
Commentaires
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1367
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Tip top ;)

C'est vrai que c'est tout bête à utiliser.
Il y a juste un petit point que tu as oublié de préciser : la façon d'écrire les chaines de caractères dans le code de l'application, de façon à ce qu'elles soient automatiquement reconnues par poEdit, et surtout qu'elles soient différenciées des chaines à ne pas traduire...

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
cfdev (Membre)
Lieu: Alpes de Haut Provence
Inscrit le : 08-11-2007
Messages: 127
Snippets: 4
Tutoriels: 0
Site web
Hors ligne
En effet, c'est ajouté !
La prochaine étape sera le changement de langue en dynamique (plus chaud) :)

GNU Linux Power !
Slacker
gbdivers (Membre)
Inscrit le : 05-03-2008
Messages: 92
Snippets: 2
Tutoriels: 0
Hors ligne
Pour le changement de langue en dynamique, pas de difficulté particulière. La seule chose est que cela s'applique aux nouveaux controls créés... Il faut donc mettre à jour les fenêtres (barre de titre, menus..)

Code wxWidgets:

void MyApp::SetUILanguage(wxLanguage language, bool init)
// "init" indique si la fonction est appelée depuis OnInit (initialisation) ou d'ailleur (changement de langue)
{
    if(!init)
        delete m_Locale;
    wxLocale::AddCatalogLookupPathPrefix(wxT("locale"));
    m_Locale = new wxLocale( language );
    m_Locale->AddCatalog(GetAppName());
    if(!init)
        m_MainFrame->RefreshUI();
}
 
bool MyApp::OnInit()
{
    ... // On peut ici ouvrir une config (wxConfig) et la langue selectionnée par l'utilisateur
    SetUILanguage(wxLANGUAGE_FRENCH, true);
    ...
}



Code wxWidgets:

void MyFrame::RefreshUI()
{
    wxMenuBar* oldMenuBar = GetMenuBar();
    SetMenuBar(CreateMenuBar());
    delete oldMenuBar;
    SetStatusText(_("Thanks to use MyApp"),0);
    SetTitle(_("MyApp");
}
 
void MyFrame::SelectEnglish(wxCommandEvent &event)
{
    wxGetApp().SetUILanguage(wxLANGUAGE_ENGLISH, false);
}
 
void MyFrame::SelectFrench(wxCommandEvent &event)
{
    wxGetApp().SetUILanguage(wxLANGUAGE_FRENCH, false);
}
 
wxMenuBar* MyFrame::CreateMenuBar()
{
    ...
}


Remarques :
1. Je ne suis pas sur qu'il soit nécessaire conserver un pointeur vers wxLocale (m_Locale ici)
2. Si quelqu'un a un moyen de connaitre la liste des langues disponibles (à part en passant par une recherche des fichiers dans le repertoire /locale/)

Dernière modification par gbdivers (18-11-2008 10:56:17)

maspero (Membre)
Inscrit le : 19-05-2009
Messages: 81
Snippets: 0
Tutoriels: 0
Hors ligne
Je rajouterai une chose :

C'est peut etre trivial, mais j'ai été confronté au probleme...

LE FICHIER .MO GENERE PAR POEDIT DOIT POSSEDER LE MEME NOM QUE L'APPLICATION...

Sinon ca marche nickel merci.
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1367
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Pas obligatoirement !
L'explication se trouve ici

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Système
» Application multilangues