Probème de traduction de langue d'une application

a marqué ce sujet comme résolu.

Bonjour ou bonsoir,

je suis un tutoriel sur le langage C++. En lisant le cours sur la traduction d'applications, j'ai essayé de l'adapté au 1er TP que j'avais fais. Il consiste grosso-modo à produire une fenêtre modale à partir des renseignements fournies à une première fenêtre. Quand je lance l'appli, donc ma 1ère fenêtre, la traduction marche, mais quand je génère la seconde fenêtre, il n'y a pas de traduction.

Voici le code source de mes classes

Fenêtre principale

  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
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include "FenPrincipale.h"

FenetrePrincipale::FenetrePrincipale() : QWidget()
{
    //titre de la fenêtre
    setWindowTitle(tr("Générateur de code de fichier d'entête"));
    //icône de la fenêtre
    setWindowIcon(QIcon("icone.png"));

    //création du layout principal
    layoutPrincipal = new QVBoxLayout(this);

    //création du 1er groupbox (définition de la classe) et de ses éléments
    definitionClasse = new QGroupBox(tr("Définition de la classe"));
    form1 = new QFormLayout();
    nom = new QLineEdit();
    classeMere = new QLineEdit();

    //association des éléments au formulaire
    form1->addRow(tr("&Nom"), nom);
    form1->addRow(tr("Classe &mère"), classeMere);

    //association du groupbox au layout formulaire
    definitionClasse->setLayout(form1);

    //création du second groupbox (options pour header, constructeur,..) et de ses éléments
    options = new QGroupBox(tr("Options"));
    layoutOptions = new QVBoxLayout();
    header = new QCheckBox(tr("Protéger le &header contre les intrusions multiples"));
    //par défaut on protège l'utilisateur des inclusions multiples
    header->setChecked(true);
    constructeur = new QCheckBox(tr("Générer le &constructeur par défaut"));
    destructeur = new QCheckBox(tr("Générer un &destructeur"));

    //ajout des éléments au layout vertical
    layoutOptions->addWidget(header);
    layoutOptions->addWidget(constructeur);
    layoutOptions->addWidget(destructeur);

    //association du groupbox au layout vertical
    options->setLayout(layoutOptions);

    //création du 3e groupbox sur les commentaires et de ses éléments
    commentaires = new QGroupBox(tr("Ajouter des commentaires"));
    commentaires->setCheckable(true);
    form2 = new QFormLayout();
    auteur = new QLineEdit();
    dateCreation = new QDateEdit(QDate::currentDate());
    roleClasse = new QTextEdit();

    //ajout des éléments au formulaire
    form2->addRow(tr("&Auteur"), auteur);
    form2->addRow(tr("Da&te de création"), dateCreation);
    form2->addRow(tr("&Rôle de la classe"), roleClasse);

    //association du groupbox au formulaire
    commentaires->setLayout(form2);

    //dernier compartiment de la fenêtre constituée d'une box de boutons générer et quitter
    layoutBouton = new QHBoxLayout();
    layoutBouton->setAlignment(Qt::AlignRight); //alignement de la droite vers la gauche

    generer = new QPushButton(tr("Générer"));
    quitter = new QPushButton(tr("Quitter"));

    //ajout des boutons à la grille
    layoutBouton->addWidget(generer);
    layoutBouton->addWidget(quitter);

    //assciation des groupbox et grille au layout principal
    layoutPrincipal->addWidget(definitionClasse);
    layoutPrincipal->addWidget(options);
    layoutPrincipal->addWidget(commentaires);
    layoutPrincipal->addLayout(layoutBouton);

    //gestion du bouton quitter
    connect(quitter, SIGNAL(clicked()), qApp, SLOT(quit()));

    //gestion de la fenetre générée
    connect(generer, SIGNAL(clicked()), this, SLOT(ouvrirCodeGenere()));

}

void FenetrePrincipale::ouvrirCodeGenere()
 {
    /*on vide la chaine au début pour éviter que si l'on regénère le code, le nouveau code s'ajoute sur l'ancien
      il faut d'abord supprimer l'ancien code généré s'il y en avait un */
    chaine.clear();

     //si le nom de la classe n'est pas inscrit, ça ne sert à rien de continuer, c'est l'élément indispensable
    if(nom->text() == "")
    {
        QMessageBox::warning(this,tr("Attention"),tr("Il faut impérativement renseigner le nom de la classe"));
        return;
    }

    //on précise ou pas le nom de la classe mère
    if(classeMere->text() != "")
    {
        chaine += "class " + nom->text() + " : public " + classeMere->text() + "\n";
    }
    else
    {
        chaine += "class " + nom->text() + "\n";
    }
    //on commence le formatage du squelette de la classe
    chaine += "{\n";
    chaine += "   public:\n";

    /*on ajoute des constantes de préprocesseur à la demande de l'utilisateur pour éviter des inclusions
     * infinies de l'entête */
    if(header->isChecked())
    {
        chaine.prepend("#ifndef HEADER_" + nom->text().toUpper() + "\ndefine HEADER_" + nom->text().toUpper() + "\n\n");
    }
    //on ajoute un constructuer par défaut si l'utilisateur le demande
    if(constructeur->isChecked())
    {
        chaine += "      " + nom->text() + "();\n";
    }
    //on ajoute un destructeur si l'utilisateur le demande;
    if(destructeur->isChecked())
    {
        chaine += "      ~" + nom->text() + "();\n";
    }

    //on termine le formatage du squelette de la classe
    chaine += "\n   protected:\n\n";
    chaine += "   private:\n\n";
    chaine += "};\n\n";
    if(header->isChecked()) //on rajoute une dernière commande de préprocesseur pour compléter les premières
        chaine += "#endif";

    //on ajoute des commentaires sur la classe à la demande de l'utilisateur
    if(commentaires->isChecked())
    {
        //on forme la chaîne des commentaires
        chaine.prepend("/* \nAuteur: "
                       + auteur->text() + "\n"
                       + "Date de création : " + dateCreation->date().toString() + "\n\n"
                       + "Rôle:\n"
                       + roleClasse->toPlainText()
                       + "\n*/\n\n\n");
    }

    //on génère la fenêtre qui contient le code fabriqué
    fenetre = new FenetreGeneree(this, chaine);
    fenetre->exec();


 }

la fenêtre générée

 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
#include <QApplication>
#include "FenCodeGenere.h"

FenetreGeneree::FenetreGeneree(QWidget *parent, QString const& code) : QDialog(parent)
{
    //on choisit la taille de la fenêtre
    resize(380, 520);
    //on choisit le nom de la fenêtre
    setWindowTitle(tr("Code généré"));

    //création du layout vertical
    layout = new QVBoxLayout(this);

    //création du champ de texte qui contiendra le code généré
    texte = new QTextEdit();
    //on charge le code recupéré dans le constructeur
    texte->setText(code);
    //on change la police
    texte->setFont(QFont("Courier"));
    //on passe le texte en mode lecture seule
    texte->setReadOnly(true);
    //on évite que le code soit "coupé" si on diminue la fenêtre
    texte->setLineWrapMode(QTextEdit::NoWrap);

    //création du bouton fermer
    fermer = new QPushButton(tr("fermer"));

    //association des éléments au layout
    layout->addWidget(texte);
    layout->addWidget(fermer);

    //gestion du bouton fermer
    connect(fermer, SIGNAL(clicked()), this, SLOT(close()));
}

le main.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <QApplication>
#include <QTranslator>
#include "FenPrincipale.h"
#include "FenCodeGenere.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    //QString locale = QLocale::system().name().section('_', 0, 0);

    QTranslator translator;
    translator.load(QString("zeroclassgenerator_") + QString("en"));
    app.installTranslator(&translator);

    FenetrePrincipale fenetre;
    fenetre.show();

    return app.exec();
}

Je vous remercie d'avance pour vos explications

+0 -0

Oui, mais quelle partie ? Les boutons, le contenu, le titre, etc. ?

Si c'est le contenu, c'est tout à fait normal vu que tu n'utilises pas tr pour la construction de ta chaîne. Si c'est les autres textes, c'est que tu as un problème dans ton fichier de traduction.

Voici ce que contient mon fichier de traduction

  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
 95
 96
 97
 98
 99
100
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
    <name>FenetreGeneree</name>
    <message>
        <location filename="FenCodeGenere.cpp" line="9"/>
        <source>Code généré</source>
        <translation>Generated code</translation>
    </message>
    <message>
        <location filename="FenCodeGenere.cpp" line="26"/>
        <source>fermer</source>
        <translation>close</translation>
    </message>
</context>
<context>
    <name>FenetrePrincipale</name>
    <message>
        <location filename="FenPrincipale.cpp" line="6"/>
        <source>Générateur de code de fichier d&apos;entête</source>
        <translation>head file code generator</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="14"/>
        <source>Définition de la classe</source>
        <translation>Class definition</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="20"/>
        <source>&amp;Nom</source>
        <translation>&amp;Name</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="21"/>
        <source>Classe &amp;mère</source>
        <translation>&amp;Base class</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="27"/>
        <source>Options</source>
        <translation>Options</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="29"/>
        <source>Protéger le &amp;header contre les intrusions multiples</source>
        <translation>Protect &amp;header against multiple inclusions</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="32"/>
        <source>Générer le &amp;constructeur par défaut</source>
        <translation>Generate a default &amp;constructor</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="33"/>
        <source>Générer un &amp;destructeur</source>
        <translation>Generate a &amp;destructor</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="44"/>
        <source>Ajouter des commentaires</source>
        <translation>Add comments</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="52"/>
        <source>&amp;Auteur</source>
        <translation>&amp;Author</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="53"/>
        <source>Da&amp;te de création</source>
        <translation>Creation da&amp;te</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="54"/>
        <source>&amp;Rôle de la classe</source>
        <translation>&amp;Role of class</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="63"/>
        <source>Générer</source>
        <translation>Generate</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="64"/>
        <source>Quitter</source>
        <translation>Quit</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="93"/>
        <source>Attention</source>
        <translation>Notice</translation>
    </message>
    <message>
        <location filename="FenPrincipale.cpp" line="93"/>
        <source>Il faut impérativement renseigner le nom de la classe</source>
        <translation>it is imperative to specify the name of the class</translation>
    </message>
</context>
</TS>
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte