Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt - Traductions dynamiques

Comment traduire mon application ?

    11 décembre 2022 à 18:38:52

    Bonjour,

    Je cherche à traduire mon application sans devoir la redémarrer à chaque changement de langue, donc avec des traductions dynamiques. A l'aide d'un menu "Language" qui permet à l'utilisateur de sélectionner sa langue. J'ai donc créé des fichiers .ts et .qm. Mais ça ne marche pas, voici mon code :

    #include "FenPrincipale.h"
    #include <QApplication>
    
    FenPrincipale::FenPrincipale()
    {
        // Génération des widgets de la fenêtre principale
        creerActions();
        creerMenus();
        creerBarresOutils();
        creerBarreEtat();
    
        // Génération des onglets et chargement de la page d'accueil
        onglets = new QTabWidget;
        onglets->addTab(creerOngletPageWeb(tr("http://www.duckduckgo.com")), tr("(New page)"));
        connect(onglets, SIGNAL(currentChanged(int)), this, SLOT(changementOnglet(int)));
        setCentralWidget(onglets);
    
        // Définition de quelques propriétés de la fenêtre
        setMinimumSize(500, 350);
        setWindowIcon(QIcon(":images/navigo.png"));
        setWindowTitle(tr("Navigo"));
    
        translator = new QTranslator(0);
        translator->load("navigo_en.qm");
        qApp->installTranslator(translator);
    }
    
    void FenPrincipale::creerActions()
    {
        actionNouvelOnglet = new QAction(tr("&New tab"), this);
        actionNouvelOnglet->setShortcut(tr("Ctrl+T"));
        connect(actionNouvelOnglet, SIGNAL(triggered()), this, SLOT(nouvelOnglet()));
        actionFermerOnglet = new QAction(tr("&Close the tab"), this);
        actionFermerOnglet->setShortcut(tr("Ctrl+W"));
        connect(actionFermerOnglet, SIGNAL(triggered()), this, SLOT(fermerOnglet()));
        actionQuitter = new QAction(tr("&Exit"), this);
        actionQuitter->setShortcut(tr("Ctrl+Q"));
        connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
    
        actionPrecedente = new QAction(QIcon(":images/precedente.png"), tr("&Back"), this);
        actionPrecedente->setShortcut(QKeySequence::Back);
        connect(actionPrecedente, SIGNAL(triggered()), this, SLOT(precedente()));
        actionSuivante = new QAction(QIcon(":images/suivante.png"), tr("&Forward"), this);
        actionSuivante->setShortcut(QKeySequence::Forward);
        connect(actionSuivante, SIGNAL(triggered()), this, SLOT(suivante()));
        actionStop = new QAction(QIcon(":images/stop.png"), tr("S&top"), this);
        connect(actionStop, SIGNAL(triggered()), this, SLOT(stop()));
        actionActualiser = new QAction(QIcon(":images/actualiser.png"), tr("&Refresh"), this);
        actionActualiser->setShortcut(QKeySequence::Refresh);
        connect(actionActualiser, SIGNAL(triggered()), this, SLOT(actualiser()));
        actionAccueil = new QAction(QIcon(":images/accueil.png"), tr("H&ome"), this);
        connect(actionAccueil, SIGNAL(triggered()), this, SLOT(accueil()));
        actionGo = new QAction(QIcon(":images/go.png"), tr("G&o to ெ"), this);
        connect(actionGo, SIGNAL(triggered()), this, SLOT(chargerPage()));
    
        actionEN = new QAction(QIcon(":images/en.png"), tr("English"), this);
        connect(actionEN, SIGNAL(triggered()), this, SLOT(changementLangue(int indice=0)));
        actionES = new QAction(QIcon(":images/es.png"), tr("Español"), this);
        connect(actionES, SIGNAL(triggered()), this, SLOT(changementLangue(int indice=1)));
        actionFR = new QAction(QIcon(":images/fr.png"), tr("Français"), this);
        connect(actionFR, SIGNAL(triggered()), this, SLOT(changementLangue(int indice=2)));
    
    
        actionAPropos = new QAction(tr("&About us..."), this);
        connect(actionAPropos, SIGNAL(triggered()), this, SLOT(aPropos()));
        actionAPropos->setShortcut(QKeySequence::HelpContents);
        actionMAJ = new QAction (tr("Check for updates..."), this);
        connect(actionMAJ, SIGNAL(triggered()), this, SLOT(MAJ()));
    
    }
    
    void FenPrincipale::creerMenus()
    {
        QMenu *menuFichier = menuBar()->addMenu(tr("&File"));
    
        menuFichier->addAction(actionNouvelOnglet);
        menuFichier->addAction(actionFermerOnglet);
        menuFichier->addSeparator();
        menuFichier->addAction(actionQuitter);
    
        QMenu *menuNavigation = menuBar()->addMenu(tr("&Navigation"));
    
        menuNavigation->addAction(actionPrecedente);
        menuNavigation->addAction(actionSuivante);
        menuNavigation->addAction(actionStop);
        menuNavigation->addAction(actionActualiser);
        menuNavigation->addAction(actionAccueil);
    
        QMenu *menuLanguage = menuBar()->addMenu(tr("&Language"));
    
        menuLanguage->addAction(actionEN);
        menuLanguage->addAction(actionFR);
        menuLanguage->addAction(actionES);
    
        QMenu *menuAide = menuBar()->addMenu(tr("&?"));
    
        menuAide->addAction(actionAPropos);
        menuAide->addAction(actionMAJ);
    
    }
    
    void FenPrincipale::creerBarresOutils()
    {
        champAdresse = new QLineEdit;
        connect(champAdresse, SIGNAL(returnPressed()), this, SLOT(chargerPage()));
    
        QToolBar *toolBarNavigation = addToolBar(tr("Navigation"));
    
        toolBarNavigation->addAction(actionPrecedente);
        toolBarNavigation->addAction(actionSuivante);
        toolBarNavigation->addAction(actionStop);
        toolBarNavigation->addAction(actionActualiser);
        toolBarNavigation->addAction(actionAccueil);
        toolBarNavigation->addWidget(champAdresse);
        toolBarNavigation->addAction(actionGo);
    }
    
    void FenPrincipale::creerBarreEtat()
    {
        progression = new QProgressBar(this);
        progression->setVisible(false);
        progression->setMaximumHeight(14);
        statusBar()->addWidget(progression, 1);
    }
    
    // Slots
    
    void FenPrincipale::precedente()
    {
        pageActuelle()->back();
    }
    
    void FenPrincipale::suivante()
    {
        pageActuelle()->forward();
    }
    
    void FenPrincipale::accueil()
    {
        pageActuelle()->load(QUrl(tr("http://www.duckduckgo.com")));
    }
    
    void FenPrincipale::stop()
    {
        pageActuelle()->stop();
    }
    
    void FenPrincipale::actualiser()
    {
        pageActuelle()->reload();
    }
    
    
    void FenPrincipale::aPropos()
    {
        QMessageBox::information(this, tr("About us..."), tr("Navigo is a web browser made by ...."));
    }
    
    void FenPrincipale::MAJ()
    {
        QMessageBox::information(this, tr("Update done!"), tr("Navigo 1.1.4 is currently the most recent version available.<br>"
                                                             "<br><strong>Coming soon</strong> 📣"
                                                             "<br>-Displaying the history in a menu<br>"
                                                             "-Search in the page<br>"
                                                             "-Options window<br>"
                                                             "-Bookmark management"));
    }
    
    void FenPrincipale::nouvelOnglet()
    {
        int indexNouvelOnglet = onglets->addTab(creerOngletPageWeb(), tr("(New page)"));
        onglets->setCurrentIndex(indexNouvelOnglet);
    
        champAdresse->setText("");
        champAdresse->setFocus(Qt::OtherFocusReason);
    }
    
    void FenPrincipale::fermerOnglet()
    {
        // On ne doit pas fermer le dernier onglet, sinon le QTabWidget ne marche plus
        if (onglets->count() > 1)
        {
            onglets->removeTab(onglets->currentIndex());
        }
        else
        {
            QMessageBox::critical(this, tr("Error"), tr("At least one tab is needed!"));
        }
    }
    
    void FenPrincipale::chargerPage()
    {
        QString url = champAdresse->text();
    
        // On rajoute le "http://" s'il n'est pas déjà dans l'adresse
        if (url.left(7) != "http://")
        {
            url = "http://" + url;
            champAdresse->setText(url);
        }
    
        pageActuelle()->load(QUrl(url));
    }
    
    void FenPrincipale::changementOnglet(int index)
    {
        changementTitre(pageActuelle()->title());
        changementUrl(pageActuelle()->url());
    }
    
    void FenPrincipale::changementTitre(const QString & titreComplet)
    {
        QString titreCourt = titreComplet;
    
        // On tronque le titre pour éviter des onglets trop larges
        if (titreComplet.size() > 40)
        {
            titreCourt = titreComplet.left(40) + "...";
        }
    
        setWindowTitle(titreCourt + " - " + tr("Navigo"));
        onglets->setTabText(onglets->currentIndex(), titreCourt);
    }
    
    void FenPrincipale::changementUrl(const QUrl & url)
    {
        if (url.toString() != tr(":autres/page_blanche.html"))
        {
            champAdresse->setText(url.toString());
        }
    }
    
    void FenPrincipale::chargementDebut()
    {
        progression->setVisible(true);
    }
    
    void FenPrincipale::chargementEnCours(int pourcentage)
    {
        progression->setValue(pourcentage);
    }
    
    void FenPrincipale::chargementTermine(bool ok)
    {
        progression->setVisible(false);
        statusBar()->showMessage(tr("Loan"), 2000);
    }
    
    void FenPrincipale::changementLangue(int indice)
    {
        QString s_langueChoisie;
        if(indice == 0)
        {
            s_langueChoisie = "en";
        }
        else if (indice == 1)
        {
            s_langueChoisie = "es";
        }
        else if (indice == 2)
        {
            s_langueChoisie = "fr";
        }
    
        if (!s_langueChoisie.isEmpty())
        {
            retranslateInterface(&s_langueChoisie);
        }
    }
    
    void FenPrincipale::retranslateInterface(QString *language)
    {
        QString lang = language->toLower();
    
        lang = "navigo_" + lang + ".qm";
    
        if ( translator )
            qApp->removeTranslator( translator );
    
        translator->load( lang);
        qApp->installTranslator( translator );
    
    // ici on remet tous les textes à changer ...
    
        actionAPropos = new QAction(tr("&About us..."), this);
    
        // etc.
    }
    
    // Autres méthodes
    
    QWidget *FenPrincipale::creerOngletPageWeb(QString url)
    {
        QWidget *pageOnglet = new QWidget;
        QWebEngineView *pageWeb = new QWebEngineView;
    
        QVBoxLayout *layout = new QVBoxLayout;
        layout->setContentsMargins(0,0,0,0);
        layout->addWidget(pageWeb);
        pageOnglet->setLayout(layout);
    
        if (url.isEmpty())
        {
            pageWeb->load(QUrl(tr(":autres/page_blanche.html")));
        }
        else
        {
            if (url.left(7) != "http://")
            {
                url = "http://" + url;
            }
            pageWeb->load(QUrl(url));
        }
    
        // Gestion des signaux envoyés par la page web
        connect(pageWeb, SIGNAL(titleChanged(QString)), this, SLOT(changementTitre(QString)));
        connect(pageWeb, SIGNAL(urlChanged(QUrl)), this, SLOT(changementUrl(QUrl)));
        connect(pageWeb, SIGNAL(loadStarted()), this, SLOT(chargementDebut()));
        connect(pageWeb, SIGNAL(loadProgress(int)), this, SLOT(chargementEnCours(int)));
        connect(pageWeb, SIGNAL(loadFinished(bool)), this, SLOT(chargementTermine(bool)));
    
        return pageOnglet;
    }
    
    QWebEngineView *FenPrincipale::pageActuelle()
    {
        return onglets->currentWidget()->findChild<QWebEngineView *>();
    }
    

    Voilà mon fichier .cpp ! Pouvez m'aidez ?

    Merci beaucoup par avance,

    Alexis

    -
    Edité par AlexisOff1 11 décembre 2022 à 18:44:41

    • Partager sur Facebook
    • Partager sur Twitter

    Qt - Traductions dynamiques

    × 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