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

Discussion :

Un traducteur rétif

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Par défaut Un traducteur rétif
    Bonsoir,

    Je planche encore mon projet pour mon cours de programmation orienté objet. J'ai laissé de côté mon problème avec Phonon, parce que j'ai l'impression d'être dans une impasse; mais je vous rassure: ce dernier a droit à son post-it jaune fluo dédié, collé sur le mur blanc cassé qui est derrière l'écran de mon ordinateur.
    Maintenant je m'attache à un autre point concernant mon projet: l'internationalisation. En effet, l'affichage de ma fenêtre est en français (pourquoi s'embêter à programmer ça, par exemple, en anglais alors qu'on est francophone de naissance?), mais mon professeur est allemand et j'étudie en Allemagne. Il faut donc que je traduise mon programme pour que son affichage soit dans la langue de Goethe.
    J'avoue avoir batailler quelques temps (comprenez «quelques demi-heures») avec la commande tr("mon texte") et la macro QT_TRANSLATE_NOOP("maClasse", "mon texte"). Mais là n'est le problème. Mon projet-test (parce que je teste mon code dans un projet à part) refuse de charger la traduction que je lui demander de charger.
    Voici le code pertinent:
    • main.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "CustomApp.h"
     
    int main(int argc, char* argv[])
    {
        CustomApp a(argc, argv, "Escriu! - Logs");
     
        return a.exec();
    }
    • CustomApp.h

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #ifndef CUSTOMAPP_H
    #define CUSTOMAPP_H
     
    #include <QApplication>
    #include <QDir>
    #include <QTranslator>
    #include "CustomMW.h"
    #include "TreeManager.h"
     
    class CustomApp : public QApplication
    {
        Q_OBJECT
     
        public:
            CustomApp(int argc, char** argv, QString appName = "");
            ~CustomApp();
     
            enum SystemType
            {
                MS_WINDOWS, MAC_OS, UNIX_LIKE, UNKNOWN
            };
     
            QString getAppName();
            void emitFirstSignal();
            void setAppName(QString appName);
     
        signals:
            void appPathAnswerSource(QString path);
            void appMWConnectedSource();
            void filesMultiMapAnswerSource(QMultiMap<QString,QString> filesMultiMap);
            void filesMultiMapUpdateSource(QMultiMap<QString,QString> filesMultiMap);
            void systemTypeAnswerSource(SystemType sT);
            //void connectionsDoneSource();
     
        private:
            QString* m_appName;
            QString* m_appDir;
            CustomMW* m_mainWindow;
            SystemType m_systemType;
            TreeManager* m_treeManager;
            QTranslator* m_translator;
     
            void loadAppNameAndDir();
            void loadConnections();
            void loadMinimumAppDirTree();
     
        private slots:
            void appPathAskSink();
            void filesMultiMapAskSink();
            void newFileSink(QString path, QString name);
            void systemTypeAskSink();
    };
     
    #endif // CUSTOMAPP_H
    • CustomApp.cpp

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include "CustomApp.h"
     
    CustomApp::CustomApp(int argc, char** argv, QString appName) :  QApplication                (argc, argv)                    ,
                                                                    m_appName                   (new QString(appName))          ,
                                                                    m_appDir                    (new QString)                   ,
                                                                    m_mainWindow                (new CustomMW(appName))         ,
                                                                    m_treeManager               (new TreeManager(this))         ,
                                                                    m_translator                (new QTranslator)
    {
        m_mainWindow->setWindowTitle(appName);
        *m_appDir = QCoreApplication::applicationDirPath();
     
        loadMinimumAppDirTree();
        loadConnections();
     
        emit appMWConnectedSource();
     
        m_translator->load("EscriuLog_de", QCoreApplication::applicationDirPath() + "/ts");
        installTranslator(m_translator);
     
        m_mainWindow->show();
    }
     
    CustomApp::~CustomApp()
    {
        delete m_mainWindow;
        delete m_appName;
        delete m_appDir;
        delete m_treeManager;
        delete m_translator;
    }
     
    QString CustomApp::getAppName()
    {
        return *m_appName;
    }
     
    void CustomApp::emitFirstSignal()
    {
        //emit connectionsDoneSource();
    }
     
    void CustomApp::loadConnections()
    {
        connect(m_mainWindow, SIGNAL(appPathAskSource()), this, SLOT(appPathAskSink()));
        connect(this, SIGNAL(appPathAnswerSource(QString)), m_mainWindow, SLOT(appPathAnswerSink(QString)));
        connect(m_mainWindow, SIGNAL(filesMultiMapAskSource()), this, SLOT(filesMultiMapAskSink()));
        connect(this, SIGNAL(filesMultiMapAnswerSource(QMultiMap<QString,QString>)), m_mainWindow, SLOT(filesMultiMapAnswerSink(QMultiMap<QString,QString>)));
        connect(m_mainWindow, SIGNAL(newFileSource(QString, QString)), this, SLOT(newFileSink(QString,QString)));
        connect(this, SIGNAL(filesMultiMapUpdateSource(QMultiMap<QString,QString>)), m_mainWindow, SLOT(filesMultiMapUpdateSink(QMultiMap<QString,QString>)));
     
        connect(this, SIGNAL(appMWConnectedSource()), m_mainWindow, SLOT(appMWConnectedSink()));
    }
     
    void CustomApp::loadMinimumAppDirTree()
    {
        //Directories
        m_treeManager->addPath(m_appDir);
        m_treeManager->addDir(m_appDir, "settings");
        //Files
     
    }
     
    void CustomApp::appPathAskSink()
    {
        emit appPathAnswerSource(QCoreApplication::applicationDirPath());
    }
     
    void CustomApp::filesMultiMapAskSink()
    {
     
    }
     
    void CustomApp::newFileSink(QString path, QString name)
    {
     
    }
     
    void CustomApp::systemTypeAskSink()
    {
        SystemType systemType;
     
        QString appDirPath = QCoreApplication::applicationDirPath();
        if(appDirPath.left(1) == "/")
            systemType = UNIX_LIKE;
        else if(appDirPath.left(1) == ":")
            systemType = MAC_OS;
        else if((appDirPath.mid(1,2) == ":\\") || (appDirPath.mid(1,2) == ":/") || (appDirPath.left(2) == "\\\\"))
            systemType = MS_WINDOWS;
        else
            systemType = UNKNOWN;
     
        emit systemTypeAnswerSource(systemType);
    }
    Comme vous pouvez l'observer, la traduction se fait dans le constructeur de la classe CustomApp (cf. lignes 18 et 19 du fichier CustomApp.cpp). Après une séance de débogage, j'ai remarqué que la commande m_translator->load(...); me renvoie toujours la valeur true; c'est pourquoi je pense que la commande installTranslator(m_translator); est la coupable. En revanche, il est aussi possible que la commande lrelease de Qt Linguist ait cafouillée.
    En tout cas, je vous demande votre aide parce que je ne parviens à me défaire ce bogue.

    Merci d'avance pour votre aide.

    PS: En pièce jointe je vous mets mon projet-test dans sa quasi-intégralité (j'ai nettoyé le projet et enlevé l'exécutable du dossier debug).
    Fichiers attachés Fichiers attachés

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    Ta manière d'instancier le QTranslator me semble un peu étrange (on fait plus généralement ça dans le main()) : http://qt-project.org/doc/qt-5.0/i18...anslation.html. Voir également (en français, cette fois) http://qt-quarterly.developpez.com/q...-suedois/#LI-F. (Bon, je n'ai pas tout regardé non plus.)
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre éclairé
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Par défaut
    Je viens tester en utilisant une méthode plus orthodoxe mais j'ai toujours le même problème: le traducteur charge bien le fichier mais mon application reste en français alors que le fichier chargé devrait le mettre en allemand.

    Sinon, j'aimais bien mon main poids mouche.

  4. #4
    Membre éclairé
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Par défaut
    Sur un coup de chance, que seul Chuck Norris peut pourvoir, j'ai trouvé la raison du problème.

    En réalité il faut charger le(s) traducteur(s) avant de déclarer ma fenêtre principale. J'ai donc corrigé le constructeur de ma classe CustomApp.
    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
    CustomApp::CustomApp(int argc, char** argv, QString appName) :  QApplication                (argc, argv)                    ,
                                                                    m_appName                   (new QString(appName))          ,
                                                                    m_appDir                    (new QString)                   ,
                                                                    m_treeManager               (new TreeManager(this))         ,
                                                                    m_translator                (new QTranslator)
    {
        *m_appDir = QCoreApplication::applicationDirPath();
     
        m_translator->load("EscriuLog_de", QCoreApplication::applicationDirPath() + "/ts");
        installTranslator(m_translator);
     
        m_mainWindow = new CustomMW(appName);
        m_mainWindow->setWindowTitle(appName);
     
        loadMinimumAppDirTree();
        loadConnections();
     
        emit appMWConnectedSource();
     
        m_mainWindow->show();
    }
    Ce correctif ressemble plutôt à une rustine périmée, dont la propreté relègue les marées noires au rang de vulgaire petite tâche d'huile sur une nappe à l'épreuve de ce genre de tâche.
    Comment pourrait améliorer ce code? Dois-je automatiquement alourdir mon main.cpp? Est-ce qu'il y a moyen de contourner le problème grâce à la traduction dynamique?

    Bis dann.

    PS: Merci, Chuck Norris!
    PS2: Désolé pour le double post.

  5. #5
    Membre éclairé
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Par défaut
    Finalement je me suis tourné vers la traduction dynamique. Bien que je dois encore me battre pour traduire dynamiquement le titre de chacun de mes onglets, je considère mon problème comme résolu.

    Tschüß

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

Discussions similaires

  1. Réalisation d'un traducteur de C vers Pascal
    Par houyam dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 28/12/2007, 16h24
  2. Traducteurs anglais français pour un Dico UML
    Par Stessy dans le forum Contribuez
    Réponses: 8
    Dernier message: 03/08/2006, 20h34
  3. Réponses: 7
    Dernier message: 13/01/2006, 17h02
  4. [traducteur]c++ --> java
    Par babemagus dans le forum Général Java
    Réponses: 3
    Dernier message: 23/06/2005, 11h39
  5. traducteur de requete
    Par 74160 dans le forum Requêtes
    Réponses: 3
    Dernier message: 30/10/2003, 11h37

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