Sur cette page

Exemple de pavé fléché

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

Capture d'écran du pavé directionnel en anglais

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

Lors de l’utilisation de qmake, les lignes concernées 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

Lorsque vous utilisez CMake, les lignes concernées dans le fichier ` 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`. Cela devrait générer deux fichiers de messages identiques : ` arrowpad_fr.ts ` et ` arrowpad_nl.ts`. Ces fichiers contiendront tous les textes sources marqués pour la traduction à l’aide des appels ` tr() `, ainsi que leurs contextes.

Lorsque vous utilisez qmake, la commande lupdate doit être exécutée manuellement :

lupdate arrowpad.pro

Si vous utilisez CMake, compilez la cible « update_translations » pour exécuter « lupdate » :

cmake --build . --target update_translations

Consultez le manuelQt Linguist pour plus d’informations sur la traduction des applications Qt.

Explication 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 comportant les quatre boutons est un ` ArrowPad`.

class ArrowPad : public QWidget
{
    Q_OBJECT

Lorsque lupdate est exécuté, il extrait non seulement les textes sources, mais il les regroupe également en contextes. Un contexte correspond au nom de la classe dans laquelle le texte source apparaît. Ainsi, dans cet exemple, « ArrowPad » est un contexte : il s’agit du contexte des textes de la classe ArrowPad. La macro Q_OBJECT définit tr(x) dans ArrowPad comme suit :

qApp->translate("ArrowPad", x)

Le fait de savoir dans quelle classe chaque texte source apparaît permet Qt Linguist de regrouper les textes qui sont logiquement liés entre eux ; par exemple, tout le texte d’une boîte de dialogue aura pour contexte le nom de la classe de cette boîte de dialogue et s’affichera ensemble. Cela fournit des informations utiles au traducteur, car le contexte dans lequel un texte apparaît peut influencer la manière dont il doit être traduit. Pour certaines traductions, il peut être nécessaire de modifier les raccourcis clavier ; le fait de regrouper tous les textes sources d’un contexte (classe) particulier permet au traducteur d’effectuer plus facilement ces modifications sans créer 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 chaque libellé de bouton, car ces libellés constituent du texte visible par l’utilisateur.

Capture d'écran du pavé directionnel en anglais

class MainWindow : public QMainWindow
{
    Q_OBJECT

Dans la capture d’écran ci-dessus, la fenêtre entière est un ` MainWindow`. Celui-ci est défini 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 pourrait vouloir utiliser « Ctrl+A » (pour « Afsluiten ») et un traducteur allemand « Strg+E » (pour « Beenden »). Lorsque vous utilisez tr() pour les raccourcis clavier Ctrl, il convient d’utiliser la forme à deux arguments, le deuxième argument décrivant la fonction exécutée par le raccourci.

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 des paramètres régionaux actuels. Il est possible d’influencer le comportement de QLocale::system() en définissant, par exemple, la variable d’environnement LANG. Notez que l’utilisation d’une convention de nommage intégrant les paramètres régionaux pour les fichiers de messages d’ .qm (et les fichiers TS) facilite la mise en œuvre du choix du fichier de traduction en fonction des paramètres régionaux.

S’il n’existe aucun fichier de messages QM pour la locale choisie, le texte source d’origine sera utilisé et aucune erreur ne sera générée.

Traduction en français et en néerlandais

Nous allons commencer par traduire l’application d’exemple en français. Lancez Qt Linguist par arrowpad_fr.ts. Vous devriez obtenir les sept textes sources (« &Up », « &Left », etc.) regroupés en deux contextes (« ArrowPad » et « MainWindow »).

Saisissez maintenant les traductions suivantes :

  • ArrowPad
    • &Up - &Haut
    • &Left - &Gauche
    • &Right - &Droite
    • &Down - &Bas
  • MainWindow
    • E&xit - &Quitter
    • Ctrl+Q - Ctrl+Q
    • &Fichier - &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 clavier (voir la barre de menu « Traduction ») après avoir saisi chaque traduction.

Enregistrez le fichier et procédez de la même manière pour le néerlandais à l'aide de « arrowpad_nl.ts » :

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

Nous devons convertir les fichiers source de traduction tt1_fr.ts et tt1_nl.ts en fichiers QM. Nous pourrions utiliser Qt Linguist comme nous l’avons déjà fait ; cependant, l’utilisation de l’outil en ligne de commande lrelease garantit que tous les fichiers QM de l’application sont créés sans que nous ayons à penser à charger et à File|Release chacun d’entre eux individuellement à partir de Qt Linguist.

Tapez

lrelease arrowpad.pro

lorsque vous utilisez CMake, tapez

cmake --build . --target release_translations

Cela devrait créer à la fois arrowpad_fr.qm et arrowpad_nl.qm.

Pour utiliser arrowpad_fr.qm, réglez la langue de votre système sur le français. Sous Unix, l’une des deux commandes suivantes devrait fonctionner :

export LANG=fr
setenv LANG fr

Sous Windows ou Mac, définissez la langue d’affichage sur le français.

Lorsque vous lancez le programme, vous devriez désormais voir la version française :

Capture d'écran du pavé directionnel en français

Essayez la même chose avec le néerlandais (utilisez LANG=nl sous Unix). La version néerlandaise devrait alors s'afficher :

Capture d'écran du pavé directionnel en néerlandais

Exercices

Marquez l’une des traductions comme Qt Linguist comme non effectuée, c'est-à-dire en décochant la case « Terminé » ; exécutez la commande ` lupdate`, puis ` lrelease`, puis l'exemple. Quel effet ce changement a-t-il eu ?

Définissez LANG=fr_CA (Canada français) et relancez le programme d’exemple. Expliquez pourquoi le résultat est identique à celui obtenu avec LANG=fr.

Modifiez l’un des raccourcis clavier de la traduction néerlandaise afin d’éliminer le conflit entre &Bestand et &Boven.

Projet d'exemple @ 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.