Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changer dynamiquement la langue d'une application Qt

    4 juin 2008 à 17:45:07

    Bonjour !

    J'ai lu le dernier chapitre du cours sur Qt et je sais donc maintenant traduire une application Qt.
    Tout cela fonctionne bien ; mais j'ai un problème :
    Comment donner la possibilité à l'utilisateur de modifier la langue dynamiquement (sans quitter le programme donc) ?

    J'ai trouvé une piste dans la doc : http://doc.trolltech.com/4.3/i18n.html [...] c-translation
    Seulement je n'arrive pas à exploiter ce bout d'explication...

    Quelqu'un pourrait-il m'éclairer un peu sur ce sujet ?

    Note : c'est la doc de Qt 4.3 (Kubuntu oblige), mais la doc de Qt 4.4 est identique sur ce paragraphe.
    • Partager sur Facebook
    • Partager sur Twitter
      5 juin 2008 à 11:53:45

      Pour chaque widget, tu rajoute dans la partie changeEvent:


      if (e->type() == QEvent::LanguageChange) {
               titleLabel->setText(tr("LE TEXTE DE TON WIDGET"));
               ...
               okPushButton->setText(tr("&OK"));
           } else
               //tes autres evenements
           }
      


      Et je te conseille, de remplacer l'initialisation du texte ton widget par tonwidget::changeEvent(QEvent::LanguageChange) pour éviter d'avoir des chaines dupliquées un peu partout dans ton code.
      • Partager sur Facebook
      • Partager sur Twitter
        5 juin 2008 à 20:31:45

        La partie changeEvent ???
        J'ai du mal à voir concrètement ce qu'il faudrait faire :(
        • Partager sur Facebook
        • Partager sur Twitter
          5 juin 2008 à 21:26:23

          Je suppose qu'il parle de ça :
          http://doc.trolltech.com/4.4/qwidget.html#changeEvent

          Faut peut-être que tu hérites des widgets pour implémenter cette méthode, qui sera appelée dès qu'on aura demandé à changer la langue.
          • Partager sur Facebook
          • Partager sur Twitter

          If you'd like to join us, read "How do we work at OpenClassrooms"! :)

            5 juin 2008 à 22:35:18

            OK merci !
            Je vais regarder ça de plus près quand j'aurais un peu plus de temps.

            Cela dit je demandais ça plus par curiosité que par besoin.
            Dommage que ça ne soit pas plus simple à faire (mais j'essairais !)
            • Partager sur Facebook
            • Partager sur Twitter
              13 juin 2008 à 2:30:36

              Hum, je relance ce sujet étant intéressé.

              Donc, en me basant sur la doc tout ça, je suis parvenu à :

              void FenPad::ChoixLangue() {
              		
                  QEvent *translate = new QEvent(QEvent::LanguageChange);
                  changeEvent(translate);
              }
              
              void FenPad::changeEvent(QEvent *event) {
                  if (event->type() == QEvent::LanguageChange) {
                      retranslateInterface();
                  }
                  QWidget::changeEvent(event);
              }
              
              void FenPad::retranslateInterface() {
                  setWindowTitle(tr("UnitedPad - ==="));
                  menuFichier->setTitle("tata");
              }
              


              On appelle le slot choixLangue(), qui entre dans changeEvent(), qui entre dans retranslateInterface().
              Ce code marche, seulement, comme vous voyez, la traduction est faite en "dure".
              N'y aurait il pas un moyen plus simple de cette manière de façon à utiliser un QTranslator ? :)
              Car faire un
              if(langue == 'fr') tout le texte fr
              else if(langue == 'en') tout le texte en anglais
              ça fait extrèmement lourd à mon humble avis. :-°
              • Partager sur Facebook
              • Partager sur Twitter
                13 juin 2008 à 10:00:30

                Il faut utiliser la fonction tr

                if(langue == "fr")     { ... "Mon tailleur est riche" ... }
                else if(langue == "en"){ ... "My taylor is rich" ... }
                


                Donnera
                tr("Mon tailleur est riche")
                


                Puis dans Qtranslator tu utilisera :
                "Mon tailleur est riche" --> "My taylor is rich"
                A ce sujet va voir le tuto traduire de mateo.
                • Partager sur Facebook
                • Partager sur Twitter
                  13 juin 2008 à 14:04:05

                  Plop merci, ça marche... enfin presque... :D
                  Il y a juste un petit bug : il ne me met pas la langue à jour de suite mais la 2nde fois que je clique sur changer de langue.
                  Exemple :
                  je lance le soft, la langue affichée est en français.
                  Je fais options => changer langue => anglais, le soft reste en français.
                  Je refais options => changer langue => (n'importe quelle langue), le soft passe en anglais.

                  Bref, j'ai toujours un décalage, la question est pourquoi ?

                  void FenPad::retranslateInterface(QString *language) {
                      
                      
                      QString lang = language->remove(2, language->length());
                      lang = lang.toLower();
                  
                      lang = "UnitedPad_" + lang + ".qm";
                      QFileInfo fi( lang );
                  
                      if ( !fi.exists() )
                          QMessageBox::warning( 0, "File error", QString("Cannot find translation for language: "+lang) );
                  	
                      if ( translator )
                          qApp->removeTranslator( translator );
                      
                      translator->load( lang, "." );
                      qApp->installTranslator( translator );
                  }
                  


                  translator est membre de la classe, instancié dans le constructeur.
                  Quelqu'un aurait une idée du pourquoi du comment ? ^^

                  EDIT : je n'ai rien dit, ça marche maintenant. Juste inverser un morceau... :/
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 juin 2008 à 15:43:16

                    Alors ton code fonctionne ??

                    Moi quand je l'essaye, ça m'indique que "translator" (déclaré dans main()) n'est pas accessible ici...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juin 2008 à 16:40:23

                      Ben normal, il faut le déclarer dans ton .h ;)
                      Ca donne ça :

                      Le .h
                      #ifndef HEADER_FENPAD
                      #define HEADER_FENPAD
                      
                      #include <QtGui>
                      
                      class FenPad : public QMainWindow {
                      	
                         Q_OBJECT
                      
                         public:
                      	FenPad();
                      	void FenPad::changeEvent(QEvent*, QString*);
                      	void FenPad::retranslateInterface(QString*);
                      
                         public slots:
                      	void ChoixLangue();
                      
                          private:
                      	QTranslator *translator;
                      };
                      #endif
                      


                      Le .cpp

                      FenPad::FenPad() {
                      	
                          translator = new QTranslator( 0 );
                          //ne pas oublier de déclarer actionChoixLangue
                          connect(actionChoixLangue, SIGNAL(triggered()), this, SLOT(ChoixLangue()));
                      }
                      
                      void FenPad::changeEvent(QEvent *event, QString *language) {
                          if (event->type() == QEvent::LanguageChange) {
                              retranslateInterface(language);
                          }
                          QWidget::changeEvent(event);
                      }
                      
                      void FenPad::retranslateInterface(QString *language) {
                          
                          QString lang = language->remove(2, language->length());
                          lang = lang.toLower();
                      
                          lang = "UnitedPad_" + lang + ".qm";
                      
                          if ( translator )
                              qApp->removeTranslator( translator );
                          
                          translator->load( lang);
                          qApp->installTranslator( translator );
                      	
                          setWindowTitle(tr("UnitedPad - Le texte en français"));
                          //tu mets ici tous tes tr() à traduire
                      
                      }
                      
                      void FenPad::ChoixLangue() {
                      
                          bool ok = false;
                          QString langueChoisie = QInputDialog::getItem(this, "Changer la langue de UnitedPad", "Choisissez la langue dans laquelle vous souhaitez utiliser UnitedPad !", langue, 0, true, &ok);
                      
                          if (ok && !langueChoisie.isEmpty()) {
                      		
                              QEvent *translate = new QEvent(QEvent::LanguageChange);
                      	changeEvent(translate, &langueChoisie);
                          }
                      }
                      


                      Tout ça pour pas grand chose au final. Mais ça marche. ^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 juin 2008 à 17:02:42

                        Ok merci beaucoup ! ça peut toujours servir ^^
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Changer dynamiquement la langue d'une application Qt

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown