IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Traduction dynamique


Sujet :

Qt

  1. #1
    Invité
    Invité(e)
    Par défaut Traduction dynamique
    Bonjour, j'ai créer le programme suivant :



    Dans le QComboBox, il y a deux choix possible : Français ou Anglais. Selon le choix de l'utilisateur, je traduis cette application sans la redémarrer, tout se fait pendant l'exécution. Dès que l'utilisateur enfonce le QPushButton Traduire un slot translate() est appelé. Voici le code source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //main.cpp
    #include "window.hpp"
     
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
     
        Window myWindow;
     
        return app.exec();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    //window.hpp
    #ifndef WINDOW__HPP
    #define WINDOW__HPP
     
    #include <QtGlobal>
    #include <QtCore>
    #include <QtGui>
     
    class Window : public QWidget
    {
        Q_OBJECT
     
        private:
            QComboBox* m_comboBox;
            QPushButton* m_pushButton;
            QTranslator* m_translator;
     
            Q_SLOT void translate();
     
        public:
            explicit Window(QWidget* widgetParent = 0);
     
    };
     
    #endif // WINDOW__HPP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    window.cpp
    #include "window.hpp"
     
    void Window::translate()
    {
        if (m_comboBox->currentText() == "Français")
        {
            m_translator->load("test_trad_fr");
        }
        else
        {
            m_translator->load("test_trad_en");
        }
    }
     
    Window::Window(QWidget* widgetParent) :
        QWidget(widgetParent)
    {
        m_comboBox = new QComboBox(this);
            m_comboBox->addItem(QObject::tr("Français"));
            m_comboBox->addItem(QObject::tr("Anglais"));
        m_pushButton = new QPushButton(QObject::tr("Traduire"), this);
            QObject::connect(m_pushButton, SIGNAL(released()), this, SLOT(translate()));
     
        QHBoxLayout* myLayout = new QHBoxLayout(this);
            myLayout->addWidget(m_comboBox);
            myLayout->addWidget(m_pushButton);
            this->setLayout(myLayout);
     
        m_translator = new QTranslator(this);
            m_translator->load("test_trad" + QLocale::system().name().section('_', 0, 0));
            qApp->installTranslator(m_translator);
     
        this->setWindowTitle(QObject::tr("Test de traduction"));
        this->setFixedSize(300, 0);
        this->show();
    }
    A l'exécution rien ne se passe j'ai tout essayer QCoreApplication::removeTranslator(), etc... Notez que je ne veux pas passer par Qt Designer.

    A côté de l'exécutable j'ai un fichier test_trad_en.qm, mais pas de test_trad_fr.qm, puisqu'il est déjà en dur dans le code source.
    Merci pour vos réponses.
    Images attachées Images attachées  

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Par défaut
    Il te faut implémenter les fonctions suivantes pour chaque widget


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Widget::changeEvent(QEvent *event)
     {
         if (e->type() == QEvent::LanguageChange) {
           retranslate();
         } else
             QWidget::changeEvent(event);
     }
     
    void Widget::retranslate()
    {
     // Refaire tout les tr("")
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse, je ne connaissais pas ce gestionnaire, il tombe très bien.

    Cependant j'ai essayer ta solution, mais rien ne change :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    void Window::changeEvent(QEvent* myChangeEvent)
    {
        if (myChangeEvent->type() == QEvent::LanguageChange)
        {
            this->retranslate();
        }
        else
        {
            QWidget::changeEvent(myChangeEvent);
        }
    }
     
    void Window::translate()
    {
        if (m_comboBox->currentText() == "Français")
        {
            m_translator->load("test_trad_fr");
        }
        else
        {
            m_translator->load("test_trad_en");
        }
    }
     
    void Window::retranslate()
    {
        m_comboBox->clear();
        m_comboBox->addItem(QObject::tr("Français"));
        m_comboBox->addItem(QObject::tr("Anglais"));
        m_pushButton->setText(QObject::tr("Traduire"));
    }
    Pourquoi ? Mon code a l'air à priori bon...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Par défaut
    Vérifie le résultat de la fonction load de m_translator. Elle renvoie un boolean
    qui permet d'indiquer si le chargement du fichier a réussi.

    Ce n'est peut être qu'un problème d'accès fichier. Essaye avec un chemin absolu pour voir si ça ne vient pas de là.
    Pour un chemin relatif, assure toi que le fichier qm est a coté de l'exe.

    Si tu es sous MacOS X, le répertoire courant n'est pas au niveau du bundle mais du repertoire Contents/MacOS de ton bundle.

    Si tu veux t'affranchir des problèmes de chemin, tu peux intégrer tes fichiers de traduction au sein des ressources qt de ton application.

    J'ai teste chez moi en chemin absolu sous MacOS X, cela fonctionne

  5. #5
    Invité
    Invité(e)
    Par défaut
    En effet ce n'était qu'un problème de path, merci pour l'aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Sit multilingue : traduction dynamique des noms de page ?
    Par frakosun dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/07/2009, 12h53
  2. [Fast Report 4] Traduction dynamique
    Par VLDG dans le forum Autres outils décisionnels
    Réponses: 1
    Dernier message: 07/11/2008, 19h22
  3. Réponses: 3
    Dernier message: 16/10/2008, 09h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo