Sur cette page

Exemple d'impression Troll

Mise à jour des traductions pour les prochaines versions.

Troll Print est un exemple d'application qui permet à l'utilisateur de choisir les paramètres d'impression. Elle existe en deux versions : en anglais et en portugais.

Capture d'écran présentant l'interface utilisateur de l'exemple « Troll Print » en anglais

Nous avons inclus un fichier de traduction, trollprint_pt.ts, qui contient quelques traductions en portugais pour cet exemple.

Nous allons considérer deux versions de la même application : Troll Print 1.0 et 1.1. Nous allons apprendre à réutiliser les traductions créées pour une version dans une version ultérieure. (Dans ce tutoriel, vous devrez modifier certains fichiers source. Il est probablement préférable de copier tous les fichiers dans un nouveau répertoire temporaire et de travailler à partir de là.)

Consultez le manuel deQt Linguist pour plus d’informations sur la traduction d’applications Qt.

Explication ligne par ligne

La classe ` PrintPanel ` est définie dans ` printpanel.h`.

class PrintPanel : public QWidget
{
    Q_OBJECT

PrintPanel est une classe ` QWidget`. Elle nécessite la macro ` Q_OBJECT ` pour que ` tr() ` fonctionne correctement.

Le fichier d'implémentation est printpanel.cpp.

PrintPanel::PrintPanel(QWidget *parent)
    : QWidget(parent)
{
/*
    QLabel *label = new QLabel(tr("<b>TROLL PRINT</b>"));
    label->setAlignment(Qt::AlignCenter);
*/

Une partie du code est commentée dans Troll Print 1.0 ; vous la décommenterez plus tard, pour Troll Print 1.1.

    twoSidedGroupBox = new QGroupBox(tr("2-sided"));
    twoSidedEnabledRadio = new QRadioButton(tr("Enabled"));
    twoSidedDisabledRadio = new QRadioButton(tr("Disabled"));
    twoSidedDisabledRadio->setChecked(true);

    colorsGroupBox = new QGroupBox(tr("Colors"));
    colorsEnabledRadio = new QRadioButton(tr("Enabled"));
    colorsDisabledRadio = new QRadioButton(tr("Disabled"));

Remarquez les deux occurrences de tr("Enabled") et de tr("Disabled") dans PrintPanel. Étant donné que les « Enabled » et les « Disabled » apparaissent dans le même contexte Qt Linguist n'affichera qu'une seule occurrence de chaque et utilisera les mêmes traductions pour les doublons qu'il n'affiche pas. Bien que cela permette de gagner du temps, dans certaines langues, comme le portugais, la deuxième occurrence nécessite une traduction distincte. Nous verrons comment Qt Linguist faire en sorte que toutes les occurrences s'affichent pour être traduites séparément.

Le fichier d’en-tête de MainWindow, mainwindow.h, ne réserve aucune surprise. Dans l’implémentation, mainwindow.cpp, nous avons quelques textes sources visibles par l’utilisateur qui doivent être marqués pour traduction.

    setWindowTitle(tr("Troll Print %1").arg(version));

Nous devons traduire le titre de la fenêtre.

void MainWindow::createActions()
{
    exitAct = new QAction(tr("E&xit"), this);
    exitAct->setShortcut(tr("Ctrl+Q", "Quit"));
    connect(exitAct, &QAction::triggered, this, &MainWindow::close);

    aboutAct = new QAction(tr("&About"), this);
    aboutAct->setShortcut(Qt::Key_F1);
    connect(aboutAct, &QAction::triggered, this, &MainWindow::about);

    aboutQtAct = new QAction(tr("About &Qt"), this);
    connect(aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt);
}

void MainWindow::createMenus()
{
    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(exitAct);

    menuBar()->addSeparator();

    QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
    helpMenu->addAction(aboutAct);
    helpMenu->addAction(aboutQtAct);
}

Nous devons également traduire les actions et les menus. Notez que la forme à deux arguments de ` tr() ` est utilisée pour le raccourci clavier « Ctrl+Q », car le deuxième argument est le seul indice dont dispose le traducteur pour déterminer quelle fonction ce raccourci va exécuter.

    QTranslator translator;
    if (translator.load(locale, u"trollprint"_s, u"_"_s))
        app.installTranslator(&translator);

La fonction main() de main.cpp est identique à celle de l’exemple Arrow Pad. Elle choisit notamment un fichier de traduction en fonction des paramètres régionaux actuels.

Exécution de Troll Print 1.0 en anglais et en portugais

Nous utiliserons les traductions contenues dans le fichier trollprint_pt.ts fourni.

Définissez la variable d'environnement ` LANG ` sur ` pt`, puis exécutez ` trollprint`. Vous devriez toujours voir la version anglaise. Exécutez maintenant ` lrelease`, par exemple ` lrelease trollprint.pro`, puis relancez l'exemple. Vous devriez alors voir la version portugaise (Troll Imprimir 1.0) :

Capture d'écran présentant l'interface utilisateur de « Troll Print » en portugais

Bien que la traduction s'affiche correctement, elle est en réalité erronée. En portugais correct, la deuxième occurrence de « Enabled » devrait être « Ativadas », et non « Ativado », et la terminaison de la deuxième traduction de « Disabled » doit également être modifiée de la même manière.

Si vous ouvrez trollprint_pt.ts à l’aide de Qt Linguist, vous constaterez qu’il n’y a qu’une seule occurrence de « Enabled » et de « Disabled » dans le fichier source de traduction, bien qu’il y en ait deux de chaque dans le code source. Cela s’explique par le fait que Qt Linguist tente de réduire au minimum le travail du traducteur en utilisant la même traduction pour les textes sources en double. Dans des cas comme celui-ci, où une traduction identique est erronée, le programmeur doit lever l’ambiguïté entre les occurrences en double. Cela s’effectue facilement en utilisant la forme à deux arguments de ` tr()`.

Nous pouvons facilement déterminer quel fichier doit être modifié, car le « contexte » du traducteur correspond en fait au nom de la classe dans laquelle apparaissent les textes à modifier. Dans ce cas précis, le fichier concerné est ` printpanel.cpp`, où quatre lignes doivent être modifiées. Ajoutez le deuxième argument « two-sided » dans les appels appropriés à ` tr() ` correspondant à la première paire de boutons radio :

twoSidedEnabledRadio = new QRadioButton(tr("Enabled", "two-sided"));
twoSidedDisabledRadio = new QRadioButton(tr("Disabled", "two-sided"));

et ajoutez le deuxième argument « colors » dans les appels correspondants à tr() pour la deuxième paire de boutons radio :

colorsEnabledRadio = new QRadioButton(tr("Enabled", "colors"), colors);
colorsDisabledRadio = new QRadioButton(tr("Disabled", "colors"), colors);

Recompilez maintenant, exécutez lupdate et ouvrez trollprint_pt.ts avec Qt Linguist. Vous devriez maintenant constater deux changements.

Tout d’abord, le fichier source de traduction contient désormais trois paires « Enabled », « Disabled ». La première paire est marquée « (obs.) », ce qui signifie qu’elle est obsolète. En effet, ces textes figuraient dans des appels à l’ tr() qui ont été remplacés par de nouveaux appels à deux arguments. La deuxième paire comporte le commentaire « two-sided », et la troisième paire le commentaire « colors ». Les commentaires s’affichent dans la zone d’ Source text and comments dans Qt Linguist.

Deuxièmement, les textes de traduction « Ativado » et « Desativado » ont été automatiquement utilisés comme traductions des nouveaux textes « Enabled » et « Disabled », là encore afin de réduire au minimum le travail du traducteur. Bien sûr, dans ce cas précis, ils ne sont pas corrects pour la deuxième occurrence de chaque mot, mais ils constituent un bon point de départ.

Remplacez le deuxième « Ativado » par « Ativadas » et le deuxième « Desativado » par « Desativadas », puis enregistrez et quittez. Exécutez lrelease pour obtenir un fichier binaire d’ trollprint_pt.qm s à jour, puis lancez Troll Print (ou plutôt Troll Imprimir).

Capture d'écran montrant le message de troll en portugais

Le deuxième argument de l’appel à tr(), appelé « comments » dans Qt Linguist, permet de distinguer des textes sources identiques apparaissant dans le même contexte (classe). Ces commentaires sont également utiles dans d’autres cas pour fournir des indications au traducteur, et, dans le cas des raccourcis clavier utilisant la touche Ctrl, ils constituent le seul moyen de lui faire connaître la fonction exécutée par le raccourci.

Une autre façon d’aider le traducteur consiste à fournir des informations sur la manière d’accéder à la partie spécifique de l’application qui contient les textes sources qu’il doit traduire. Cela lui permet de visualiser le contexte dans lequel la traduction apparaît et l’aide également à trouver et à tester les traductions. Pour ce faire, utilisez un commentaire « TRANSLATOR » dans le code source :

/*
   TRANSLATOR MainWindow

   In this application the whole application is a MainWindow.
   Choose Help|About from the menu bar to see some text
   belonging to MainWindow.

   ...
*/

Essayez d’ajouter ces commentaires à certains fichiers source, en particulier aux classes de boîtes de dialogue, en décrivant la navigation nécessaire pour accéder aux boîtes de dialogue. Vous pouvez également les ajouter aux fichiers d’exemple ; par exemple, « mainwindow.cpp » et « printpanel.cpp » sont des fichiers appropriés. Exécutez « lupdate », puis lancez Qt Linguist et chargez trollprint_pt.ts. Vous devriez voir les commentaires s’afficher dans la zone Source text and comments lorsque vous parcourez la liste des textes sources.

Parfois, en particulier avec des programmes volumineux, il peut être difficile pour le traducteur de retrouver ses traductions et de vérifier qu’elles sont correctes. Des commentaires fournissant des informations de navigation utiles peuvent lui faire gagner du temps :

/*
   TRANSLATOR ZClientErrorDialog

   Choose Client|Edit to reach the Client Edit dialog, then choose
   Client Specification from the drop down list at the top and pick
   client Bartel Leendert van der Waerden. Now check the Profile
   checkbox and then click the Start Processing button. You should
   now see a pop up window with the text "Error: Name too long!".
   This window is a ZClientErrorDialog.
*/

Troll Print 1.1

Nous allons maintenant préparer la version 1.1 de Troll Print. Lancez votre éditeur de texte préféré et suivez ces étapes :

  • Décommentez les deux lignes qui créent une balise QLabel avec le texte « <b>TROLL PRINT</b> » dans le fichier printpanel.cpp.
  • Correction de formulation : remplacez « 2-sided » par « Two-sided » dans printpanel.cpp.
  • Remplacez « 1.0 » par « 1.1 » partout où il apparaît dans le fichier mainwindow.cpp.
  • Mettre à jour l’année de copyright en 1999-2000 dans mainwindow.cpp.

(Bien sûr, dans une application réelle, le numéro de version et l'année de copyright seraient des constantes ou des #define.)

Une fois cette opération terminée, exécutez lupdate, puis ouvrez trollprint_pt.ts dans Qt Linguist. Les éléments suivants présentent un intérêt particulier :

  • PrintPanel
    • 2-sided - marqué « (obs.) », obsolète
    • <b>TROLL PRINT</b> – non marqué, c’est-à-dire non traduit
    • Recto-verso - non marqué, c'est-à-dire non traduit.

Afin de faciliter les révisions, au lieu de tr("Troll Print 1.0"), vous pouvez utiliser tr("Troll Print %1").arg("1.0") ou une formulation similaire pour éviter d'avoir à mettre à jour la chaîne à chaque nouvelle version.

Passez en revue les traductions dans MainWindow et marquez-les comme « terminées ». Traduisez « <b>TROLL PRINT</b> » par « <b>TROLL IMPRIMIR</b> ». Lorsque vous traduisez « Recto-verso », cliquez sur le bouton « Guess Again » pour traduire « Two-sided », mais remplacez le « 2 » par « Dois ».

Enregistrez et quittez, puis lancez lrelease. La version portugaise devrait ressembler à ceci :

Capture d'écran montrant le message de troll en portugais

Sélectionnez « Ajuda|Sobre » (Help|About) pour afficher la boîte de dialogue « À propos ».

Si vous choisissez « Ajuda|Sobre Qt » (Help|About Qt), vous obtiendrez une boîte de dialogue en anglais. Oups ! Qt lui-même doit être traduit. Voir Internationalisation avec Qt pour plus de détails.

Configurez maintenant LANG=en pour obtenir la version originale en anglais :

Capture d'écran montrant l'impression du troll en anglais

Exemple de projet sur code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.