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 :

[Qt] Problème de traduction


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Par défaut [Qt] Problème de traduction
    Coucou,

    Je suis en train de coder un programme assez conséquent (pour le moment 11 classes).
    Et j'ai besoin de le traduire en plusieurs langues.

    J'utilise une QComboBox pour que l'utilisateur puisse choisir sa langue. Puis un QPushButton Reset pour que l'utilisateur puisse remettre ses paramètres par défaut (dont la langue).

    Les paramètres sont enregistrés dans un fichier .ini, utilisé grâce à un QSettings.
    Pour changer la langue en cours j'appelle une méthode.

    Le changement de la langue fonctionne très bien à partir de la QComboBox, mais mon programme plante dès que j'appuie sur le bouton reset.

    Je ne vais pas poster le code complet de ma classe (car elle fait plus de 500 lignes), mais en voici quelques morceaux :


    le constructeur :

    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
    Reglage::Reglage()
    {
    //création de la page principale qui contiendra les boutons pour naviguer avec les autres pages
        pageReglage = new QWidget(this);
     
    //création et paramétrage du bouton associé à region
        boutonRegion = new QPushButton(pageReglage);
        boutonRegion->setIcon(QIcon("image/region.gif"));//met une image dans le bouton
        boutonRegion->setGeometry(200,100,60,60);//fixe la taille du bouton
        //connexion du bouton Région au slot qui crée la page région
        QObject::connect(boutonRegion,SIGNAL(clicked()),this,SLOT(changerPageRegion()));
     
    //création et paramétrage du bouton associé à divers
        boutonDivers = new QPushButton(pageReglage);
        boutonDivers->setIcon(QIcon("image/divers.gif"));//met une image dans le bouton
        boutonDivers->setIconSize(QSize(50,50));//fixe la taille de l'image dans le bouton
        boutonDivers->setGeometry(350,100,60,60);//fixe la taille du bouton
        //connexion du bouton Divers au slot qui crée la page Divers
        QObject::connect(boutonDivers,SIGNAL(clicked()),this,SLOT(changerPageDivers()));
     
    //création et paramétrage du bouton retour
        boutonRetour = new QPushButton(this);
        boutonRetour->setGeometry(10,200,60,60);//fixe la taille du bouton
        boutonRetour->setIcon(QIcon("image/retour.gif"));//met une image dans le bouton
        boutonRetour->setIconSize(QSize(50,50));//fixe la taille de l'image dans le bouton
        boutonRetour->hide();//on cache le bouton dans la page principale (il ne sera afficher que lorsque la page blocnote ou minuteur sera ouverte)
     
     
     
        translator = new QTranslator(this);
     
    }

    Le slot qui créée la page contenant la QComboBox (et le connecte) :

    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
    void Reglage::changerPageRegion(void)
    {
        pageReglage->hide();//on cache la page principale
        boutonRetour->show();//on affiche le bouton retour
        QObject::connect(boutonRetour,SIGNAL(clicked()),this,SLOT(changerPageReglage_Region()));
     
        pageRegion = new QWidget (this);
        pageRegion->move(80,0);
        QSettings setting ("parametre.ini", QSettings::IniFormat);
     
    /*combo Langue*****************************************************************/
        labelComboLangue = new QLabel(tr("Langue :"),pageRegion);
        labelComboLangue->setFont(QFont(0, 9, QFont::Bold));//fixe la police du label
        labelComboLangue->move(10,20);
     
        comboLangue = new QComboBox(pageRegion);
     
        comboLangue->move(190,20);
        comboLangue->addItem(tr("Français"));
        comboLangue->addItem(tr("Anglais"));
     
        QString temp = setting.value("langueAppli").toString();    
        if(temp.operator ==("en"))
            comboLangue->setCurrentIndex(1);
     
        QObject::connect(comboLangue,SIGNAL(activated(int)),this,SLOT(actualiseFichierParamLangue(int)));
    }
    Le slot qui crée la page contenant le bouton reset :


    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
    void Reglage::changerPageDivers(void)
    {
        pageReglage->hide();//on cahce la page principale
        boutonRetour->show();//on affiche le bouton retour
        QObject::connect(boutonRetour,SIGNAL(clicked()),this,SLOT(changerPageReglage_Divers()));
     
        pageDivers = new QWidget (this);
        pageDivers->setFixedWidth(500);//test pour tout afficher
     
        labelBoutonResetParametres = new QLabel(tr("Mettre la configuration des paramètres par défaut :"),pageDivers);
        labelBoutonResetParametres->move(20,20);
        labelBoutonResetParametres->setFont(QFont(0, 9, QFont::Bold));//fixe la police du label
        boutonResetParametres = new QPushButton (tr("Reset !"),pageDivers);
        boutonResetParametres->setGeometry(60,40,60,60);
     
    QObject::connect(boutonResetParametres,SIGNAL(clicked()),this,SLOT(actualiseParDefaut()));
     
        pageDivers->show();
    }
    Les slots changerPageReglage_Divers et changerPageReglage_Region appelles les destructeurs des page Divers ou Region.


    Le slot connecté à la QComboBox :

    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
    void Reglage::actualiseFichierParamLangue(int vide)
    {
        if(comboLangue->currentIndex() ==0)
        {
            QSettings setting ("parametre.ini", QSettings::IniFormat);
            setting.setValue("langueAppli","fr");
            this->actualiserLangue();
        }
        else
        {
            QSettings setting ("parametre.ini", QSettings::IniFormat);
            setting.setValue("langueAppli","en");
            this->actualiserLangue();
     
        }
    }

    Le slot connecté au bouton Reset :

    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
    void Reglage::actualiseParDefaut(void)
    {
        QSettings setting ("parametre.ini", QSettings::IniFormat);
        QSettings defaut ("parametreDefaut.ini", QSettings::IniFormat);
     
        setting.setValue("luminosite",defaut.value("luminosite"));
        setting.setValue("screensvr",defaut.value("screensvr"));
        setting.setValue("lumCavite",defaut.value("lumCavite"));
        setting.setValue("bipTouche",defaut.value("bipTouche"));
        setting.setValue("langueAppli",defaut.value("langueAppli"));
        setting.setValue("formatDate",defaut.value("formatDate"));
        setting.setValue("formatHeure",defaut.value("formatHeure"));
        setting.setValue("uniteTemp",defaut.value("uniteTemp"));
     
        qDebug("avant appel méthode");
        this->actualiserLangue();
        qDebug("apres appel methode");
     
        QString cmd;
        cmd=QString("echo "+(QString::number(((setting.value("luminosite").toInt() )*2.45)+10))+" > /sys/class/backlight/imx-bl/brightness");
    //    std::system(cmd.toLatin1().data());
     
        qDebug("apres envoie commande");
    }
    C'est donc ici que les problèmes apparaissent, le programme se quitte quand j'appuie sur le bouton reset. Mais tout les qDebug s'affichent en console.


    La méthode qui traduit (la même qui est appelée pour la QComboBox et pour la QPushButton) :

    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
    void Reglage::actualiserLangue(void)
    {
        qDebug("methode actualiser langue");
        QSettings setting ("parametre.ini", QSettings::IniFormat);
     
        qApp->removeTranslator(translator);
     
     
     
        qDebug("methode : apres remove");
        translator->load(QString("zeroclassgenerator_") + setting.value("langueAppli").toString());
        qDebug("methode apres load");
        qApp->installTranslator(translator);
        qDebug("méthode apres install");
    }

    J'ai beau cherché, je n'arrive pas à comprendre pourquoi la méthode fonctionne quand elle est appelée à un endroit (slot actualiseFichierParamLangue) et pas quand elle est appelée à un autre (slot actualiseParDefaut), si j'enlève la ligne qApp->installTranslator(translator); le programme ne plante plus (mais bien évidemment cela ne traduit rien du tout ).

    J'espère que vous pourez m'aider, si vous avez besoin de plus de détail sur mon code n'hésitez pas, j'ai tellement la tête dedans que j'ai surement oublié de préciser certaines choses.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut, et bienvenue !

    Tu pourrais donner davantage d'infos sur ton erreur ? En debug, ca donne quoi ?
    A mon avis, a premiere vue, c'est surement un probleme de pointeur NULL sur ton translator. Peut etre un "load" qui se fait mal.

    Essaie de faire du pas a pas avec un debugueur, ca aidera !

    Edit : Il doit notamment y avoir une différence entre ses deux actions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Reglage::actualiseFichierParamLangue(int vide)
    {
        ...
            QSettings setting ("parametre.ini", QSettings::IniFormat);
            setting.setValue("langueAppli","fr");
            this->actualiserLangue();
        ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Reglage::actualiseParDefaut(void)
    {
        QSettings setting ("parametre.ini", QSettings::IniFormat);
        QSettings defaut ("parametreDefaut.ini", QSettings::IniFormat);
       ...
        setting.setValue("langueAppli",defaut.value("langueAppli"));
       ...
        this->actualiserLangue();
       ...
    }
    Le deuxième doit pas charger de valeur. Donc le load après ne marche pas, et le installTranslator non plus.

    Essaie peut être de forcer l'enregistrement de tes settings avec la méthode QSettings::sync().

    G.

  3. #3
    Membre habitué
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Par défaut
    Tout d'abord, merci d'avoir répondu si rapidement !

    Citation Envoyé par Gulish Voir le message
    Tu pourrais donner davantage d'infos sur ton erreur ?
    Je n'ai pas d'erreur affichée, simplement le programme buggue et se quitte.
    En console j'ai : The program has unexpectedly finished.
    et : exited with code 0

    Citation Envoyé par Gulish Voir le message
    Edit : Il doit notamment y avoir une différence entre ses deux actions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Reglage::actualiseFichierParamLangue(int vide)
    {
        ...
            QSettings setting ("parametre.ini", QSettings::IniFormat);
            setting.setValue("langueAppli","fr");
            this->actualiserLangue();
        ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Reglage::actualiseParDefaut(void)
    {
        QSettings setting ("parametre.ini", QSettings::IniFormat);
        QSettings defaut ("parametreDefaut.ini", QSettings::IniFormat);
       ...
        setting.setValue("langueAppli",defaut.value("langueAppli"));
       ...
        this->actualiserLangue();
       ...
    }
    J'ai déjà testé en mettant exactement le même ligne, c'est à dire : setting.setValue("langueAppli","fr"); aux deux endroits, et j'avais toujours l'erreur.

    En debug, ca donne quoi ?
    A mon avis, a premiere vue, c'est surement un probleme de pointeur NULL sur ton translator. Peut etre un "load" qui se fait mal.

    Essaie de faire du pas a pas avec un debugueur, ca aidera !
    J'ai seulement testé avec plusieurs QDebug, mais pas en mode Débug. C'est un mode que je ne comprends pas très bien sous QtCréator, mais je vais essayer ça puisque je ne comprends vraiment pas le problème.

    Merci encore ^^

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Et as tu essayé le sync() ?
    Si tu rentres en dur dans le translator->load(...) la langue, sans passer par le setting.value, est ce que ca marche ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     translator->load(QString("zeroclassgenerator_") + QString("fr")/*setting.value("langueAppli").toString()*/);
    Juste pour voir si le problème vient du settings.

    G.

  5. #5
    Membre habitué
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Et as tu essayé le sync() ?
    Si tu rentres en dur dans le translator->load(...) la langue, sans passer par le setting.value, est ce que ca marche ?
    Non, j'ai exactement le même problème. Donc je ne pense pas que le problème vienne de là. Et puis j'arrive à m'en servir dans d'autre classes (notement pour afficher la bonne langue au démarage de l'apllication) et cela fonctionne.

    Je ne connais pas bien le sync, je vais voir avec ça et le mode debug. ^^

    merci

  6. #6
    Membre habitué
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Par défaut
    Bon ben j'ai trouvée.

    Le problème venait de ma méthode changeEvent que j'ai oublié de montrer, elle ré-initialisait des texte d'objet qui n'existait plus (il apartiennent à la page pageRegion qui n'existe pas quand on est dans la page pageDivers).

    Donc c'était bien un problème de pointeur (comme c'est très souvent le cas).

    Pour résoudre se problème, je teste l'existance de mes page dans cette méthode changeEvent.

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

Discussions similaires

  1. Problème de traduction dans un panel
    Par nitrous007 dans le forum C#
    Réponses: 2
    Dernier message: 24/10/2007, 11h36
  2. Encore un problème de traduction C++ delphi
    Par chuck33 dans le forum Langage
    Réponses: 5
    Dernier message: 12/09/2007, 14h14
  3. Problème de traduction : nested tree ?
    Par EJ dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 04/09/2007, 17h45
  4. Problème de traduction de caractères
    Par dev-man dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/11/2006, 15h24
  5. Problème de traduction de SQL Oracle vers PostgreSQL
    Par Montaigne dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/04/2006, 11h15

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