Sur cette page

Exemple de pavé fléché

Comprendre le concept de Qt Linguist contextes et utiliser deux langues ou plus.

Capture d'écran de Arrow Pad en anglais

Nous utiliserons deux traductions, le français et le néerlandais, bien qu'il n'y ait pas de limite réelle au nombre de traductions possibles pouvant être utilisées avec une application.

Si vous utilisez qmake, les lignes correspondantes dans arrowpad.pro sont les suivantes :

HEADERS      = arrowpad.h \
               mainwindow.h
SOURCES      = arrowpad.cpp \
               main.cpp \
               mainwindow.cpp

TRANSLATIONS = arrowpad_fr.ts \
               arrowpad_nl.ts

Si vous utilisez CMake, les lignes correspondantes dans CMakeLists.txt sont les suivantes :

find_package(Qt6 REQUIRED COMPONENTS LinguistTools)

qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES fr nl)

qt6_add_translations(arrowpad
    QM_FILES_OUTPUT_VARIABLE qm_files)
install(FILES ${qm_files} DESTINATION ${INSTALL_EXAMPLEDIR})

Exécutez lupdate. Il devrait produire deux fichiers de messages identiques arrowpad_fr.ts et arrowpad_nl.ts. Ces fichiers contiendront tous les textes sources marqués pour la traduction avec les appels tr() et leurs contextes.

Si vous utilisez qmake, lupdate doit être exécuté manuellement :

lupdate arrowpad.pro

Si vous utilisez CMake, construisez la cible update_translations pour exécuter lupdate:

cmake --build . --target update_translations

Voir le manuelQt Linguist pour plus d'informations sur la traduction des applications Qt.

Visite guidée ligne par ligne

Dans arrowpad.h, nous définissons la sous-classe ArrowPad qui est une sous-classe de QWidget. Dans la capture d'écran ci-dessus, le widget central avec les quatre boutons est un ArrowPad.

class ArrowPad : public QWidget
{
    Q_OBJECT

Lorsque lupdate est exécuté, il ne se contente pas d'extraire les textes sources, il les regroupe également dans des contextes. Un contexte est le nom de la classe dans laquelle le texte source apparaît. Ainsi, dans cet exemple, "ArrowPad" est un contexte : c'est le contexte des textes de la classe ArrowPad. La macro Q_OBJECT définit ainsi tr(x) dans ArrowPad:

qApp->translate("ArrowPad", x)

Connaître la classe dans laquelle apparaît chaque texte source permet de Qt Linguist de regrouper les textes qui sont logiquement liés, par exemple, tous les textes d'un dialogue auront pour contexte le nom de la classe du dialogue et seront affichés ensemble. Cela fournit des informations utiles au traducteur, car le contexte dans lequel le texte apparaît peut influencer la manière dont il doit être traduit. Pour certaines traductions, il peut être nécessaire de modifier les accélérateurs de clavier et le fait de regrouper tous les textes sources dans un contexte particulier (classe) permet au traducteur d'effectuer plus facilement les changements d'accélérateurs sans introduire de conflits.

Dans arrowpad.cpp, nous implémentons la classe ArrowPad.

    upButton = new QPushButton(tr("&Up"));
    downButton = new QPushButton(tr("&Down"));
    leftButton = new QPushButton(tr("&Left"));
    rightButton = new QPushButton(tr("&Right"));

Nous appelons ArrowPad::tr() pour l'étiquette de chaque bouton car les étiquettes sont du texte visible par l'utilisateur.

Capture d'écran de Arrow Pad en anglais

class MainWindow : public QMainWindow
{
    Q_OBJECT

Dans la capture d'écran ci-dessus, la fenêtre entière est une classe MainWindow, définie dans le fichier d'en-tête mainwindow.h. Ici aussi, nous utilisons Q_OBJECT, de sorte que MainWindow devienne un contexte dans Qt Linguist.

    arrowPad = new ArrowPad;

Dans l'implémentation de MainWindow, mainwindow.cpp, nous créons une instance de notre classe ArrowPad.

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

Nous appelons également MainWindow::tr() deux fois, une fois pour l'action et une fois pour le raccourci.

Notez l'utilisation de tr() pour prendre en charge différentes touches dans d'autres langues. "Ctrl+Q" est un bon choix pour Quit en anglais, mais un traducteur néerlandais voudra peut-être utiliser "Ctrl+A" (pour Afsluiten) et un traducteur allemand "Strg+E" (pour Beenden). Lorsque vous utilisez tr() pour les accélérateurs de touches Ctrl, la forme à deux arguments doit être utilisée, le second argument décrivant la fonction exécutée par l'accélérateur.

Notre fonction main() est définie dans main.cpp comme d'habitude.

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

Nous choisissons la traduction à utiliser en fonction de la locale actuelle. QLocale::system() peut être influencé par la définition de la variable d'environnement LANG, par exemple. Notez que l'utilisation d'une convention de dénomination qui incorpore la locale pour les fichiers de messages .qm (et les fichiers TS) facilite la mise en œuvre du choix du fichier de traduction en fonction de la locale.

S'il n'existe pas de fichier de messages QM pour la langue choisie, le texte source original sera utilisé et aucune erreur ne sera soulevée.

Traduction en français et en néerlandais

Nous commencerons par traduire l'application d'exemple en français. Commencez par Qt Linguist avec arrowpad_fr.ts. Vous devriez obtenir les sept textes sources ("&Up", "&Left", etc.) regroupés dans deux contextes ("ArrowPad" et "MainWindow").

Entrez maintenant les traductions suivantes :

  • ArrowPad
    • &Up - &Haut
    • &Left - &Gauche
    • &Right - &Droite
    • &Down - &Bas
  • MainWindow
    • E&xit - &Quitter
    • Ctrl+Q - Ctrl+Q
    • &File - &Fichier

Le bouton Done & Next marque la traduction comme terminée et passe au texte source suivant. Il est plus rapide d'utiliser son raccourci (voir la barre de menu Traduction) après avoir tapé chaque traduction.

Sauvegardez le fichier et faites de même pour le néerlandais en travaillant avec arrowpad_nl.ts:

  • ArrowPad
    • &Haut - &Omhoog
    • &Left - &Links
    • &Right - &Rechts
    • &Down - Omlaa&g
  • MainWindow
    • E&xit - &Afsluiten
    • Ctrl+Q - Ctrl+A
    • Fichier - &Bestand

Nous devons convertir les fichiers sources de traduction tt1_fr.ts et tt1_nl.ts en fichiers QM. Nous pourrions utiliser Qt Linguist comme nous l'avons déjà fait, mais l'utilisation de l'outil en ligne de commande lrelease garantit la création de tous les fichiers QM pour l'application sans que nous ayons à nous rappeler de charger et de File|Release chacun d'entre eux individuellement à partir de Qt Linguist.

Tapez

lrelease arrowpad.pro

si vous utilisez CMake, tapez

cmake --build . --target release_translations

Cela devrait créer arrowpad_fr.qm et arrowpad_nl.qm.

Pour utiliser arrowpad_fr.qm, changez la langue de votre système en français. Sous Unix, l'une des deux commandes suivantes devrait fonctionner :

export LANG=fr
setenv LANG fr

Sous Windows ou Mac, réglez votre langue d'affichage sur le français.

Lorsque vous exécutez le programme, vous devriez maintenant voir la version française :

Capture d'écran de Arrow Pad en français

Essayez la même chose avec le néerlandais (utilisez LANG=nl sous Unix). La version néerlandaise devrait apparaître :

Capture d'écran de Arrow Pad en néerlandais

Exercices

Marquez une des traductions dans Qt Linguist comme non faite, c'est-à-dire en décochant la case "faite" ; exécutez lupdate, puis lrelease, puis l'exemple. Quel est l'effet de ce changement ?

Réglez LANG=fr_CA (Canada français) et exécutez à nouveau le programme d'exemple. Expliquez pourquoi le résultat est le même qu'avec LANG=fr.

Modifiez l'un des accélérateurs dans la traduction néerlandaise pour éliminer le conflit entre &Bestand et &Boven.

Exemple de projet @ 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.