Auf dieser Seite

Beispiel für ein Pfeiltastenfeld

Das Konzept der „ Qt Linguist -Kontexte“ verstehen und zwei oder mehr Sprachen verwenden.

Screenshot von „Arrow Pad“ auf Englisch

Wir werden zwei Übersetzungen verwenden, Französisch und Niederländisch, obwohl es keine effektive Begrenzung für die Anzahl der möglichen Übersetzungen gibt, die mit einer Anwendung verwendet werden können.

Bei Verwendung von qmake lauten die relevanten Zeilen in „ arrowpad.pro “ wie folgt:

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

TRANSLATIONS = arrowpad_fr.ts \
               arrowpad_nl.ts

Bei Verwendung von CMake lauten die relevanten Zeilen in „ CMakeLists.txt “ wie folgt:

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})

Führen Sie „ lupdate “ aus. Dabei sollten zwei identische Meldungsdateien erstellt werden: „ arrowpad_fr.ts “ und „ arrowpad_nl.ts “. Diese Dateien enthalten alle Quelltexte, die mit „ tr() “-Aufrufen zur Übersetzung markiert wurden, sowie deren Kontexte.

Bei Verwendung von qmake muss „ lupdate “ manuell ausgeführt werden:

lupdate arrowpad.pro

Bei Verwendung von CMake erstellen Sie das Ziel „ update_translations “, um „ lupdate “ auszuführen:

cmake --build . --target update_translations

Weitere Informationen zur Übersetzung von Qt-Anwendungen finden Sie im Handbuch zu „Qt Linguist “.

Schritt-für-Schritt-Anleitung

In „ arrowpad.h “ definieren wir die Unterklasse „ ArrowPad “, die eine Unterklasse von „ QWidget “ ist. Im obigen Screenshot ist das zentrale Widget mit den vier Schaltflächen ein „ ArrowPad “.

class ArrowPad : public QWidget
{
    Q_OBJECT

Wenn „ lupdate “ ausgeführt wird, extrahiert es nicht nur die Quelltexte, sondern gruppiert diese auch in Kontexte. Ein Kontext ist der Name der Klasse, in der der Quelltext vorkommt. In diesem Beispiel ist „ArrowPad“ also ein Kontext: Es ist der Kontext der Texte in der Klasse „ ArrowPad “. Das Makro „ Q_OBJECT “ definiert „ tr(x) “ in „ ArrowPad “ wie folgt:

qApp->translate("ArrowPad", x)

Zu wissen, in welcher Klasse der jeweilige Quelltext vorkommt, ermöglicht es, Qt Linguist , logisch miteinander verbundene Texte zu gruppieren, z. B. haben alle Texte in einem Dialog den Kontext des Klassennamens des Dialogs und werden gemeinsam angezeigt. Dies liefert nützliche Informationen für den Übersetzer, da der Kontext, in dem ein Text erscheint, Einfluss darauf haben kann, wie er übersetzt werden sollte. Bei manchen Übersetzungen müssen möglicherweise Tastaturkürzel geändert werden, und wenn alle Quelltexte in einem bestimmten Kontext (einer Klasse) zusammengefasst sind, ist es für den Übersetzer einfacher, solche Änderungen an den Tastaturkürzeln vorzunehmen, ohne dass es zu Konflikten kommt.

In „ arrowpad.cpp “ implementieren wir die Klasse „ ArrowPad “.

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

Wir rufen „ ArrowPad::tr() “ für die Beschriftung jeder Schaltfläche auf, da es sich bei den Beschriftungen um für den Benutzer sichtbaren Text handelt.

Screenshot von „Arrow Pad“ auf Englisch

class MainWindow : public QMainWindow
{
    Q_OBJECT

Im obigen Screenshot ist das gesamte Fenster ein ` MainWindow`. Dies ist in der Header-Datei ` mainwindow.h ` definiert. Auch hier verwenden wir ` Q_OBJECT`, sodass ` MainWindow ` zu einem Kontext in Qt Linguist.

    arrowPad = new ArrowPad;

Bei der Implementierung von ` MainWindow` (` mainwindow.cpp`) erstellen wir eine Instanz unserer Klasse ` ArrowPad `.

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

Außerdem rufen wir ` MainWindow::tr() ` zweimal auf, einmal für die Aktion und einmal für die Tastenkombination.

Beachten Sie die Verwendung von ` tr() `, um verschiedene Tastenkombinationen in anderen Sprachen zu unterstützen. „Strg+Q“ ist eine gute Wahl für „Quit“ im Englischen, aber ein niederländischer Übersetzer möchte vielleicht „Strg+A“ (für „Afsluiten“) und ein deutscher Übersetzer „Strg+E“ (für „Beenden“) verwenden. Bei der Verwendung von „ tr() “ für Tastenkombinationen unter „ Ctrl “ sollte die Form mit zwei Argumenten verwendet werden, wobei das zweite Argument die Funktion beschreibt, die die Tastenkombination ausführt.

Unsere Funktion „ main() “ ist wie gewohnt in „ main.cpp “ definiert.

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

Wir wählen die zu verwendende Übersetzung entsprechend der aktuellen Locale aus. „ QLocale::system()“ kann beispielsweise durch Setzen der Umgebungsvariablen „ LANG “ beeinflusst werden. Beachten Sie, dass die Verwendung einer Namenskonvention, die die Locale für „ .qm “-Meldungsdateien (und TS-Dateien) einbezieht, die Auswahl der Übersetzungsdatei entsprechend der Locale vereinfacht.

Wenn für die ausgewählte Locale keine QM-Meldungsdatei vorhanden ist, wird der ursprüngliche Quelltext verwendet und es wird kein Fehler ausgelöst.

Übersetzung ins Französische und Niederländische

Wir beginnen damit, die Beispielanwendung ins Französische zu übersetzen. Starten Sie Qt Linguist mit „ arrowpad_fr.ts “. Sie sollten die sieben Quelltexte („&Up“, „&Left“ usw.) sehen, die in zwei Kontexte („ArrowPad“ und „MainWindow“) gruppiert sind.

Geben Sie nun die folgenden Übersetzungen ein:

  • ArrowPad
    • &Up – &Haut
    • &Left – &Gauche
    • &Right – &Droite
    • &Down – &Bas
  • MainWindow
    • E&xit – &Beenden
    • Strg+Q – Strg+Q
    • &Datei - &Fichier

Die Schaltfläche „ Done & Next “ markiert die Übersetzung als fertig und wechselt zum nächsten Quelltext. Es ist schneller, nach der Eingabe jeder Übersetzung die entsprechende Tastenkombination (siehe Menüleiste „Übersetzung“) zu verwenden.

Speichern Sie die Datei und verfahren Sie mit „ arrowpad_nl.ts “ genauso für Niederländisch:

  • ArrowPad
    • &Up – &Omhoog
    • &Links – &Links
    • &Right – &Rechts
    • &Down – Omlaa&g
  • MainWindow
    • E&xit – &Beenden
    • Strg+Q – Strg+A
    • Datei - &Bestand

Wir müssen die Übersetzungsquelldateien „ tt1_fr.ts “ und „ tt1_nl.ts “ in QM-Dateien konvertieren. Wir könnten Qt LinguistFile|Release wie schon zuvor; die Verwendung des Befehlszeilentools „ lrelease “ stellt jedoch sicher, dass alle QM-Dateien für die Anwendung erstellt werden, ohne dass wir daran denken müssen, jede einzelne Datei einzeln über Qt Linguist.

Geben Sie

lrelease arrowpad.pro

Bei Verwendung von CMake geben Sie Folgendes ein

cmake --build . --target release_translations

Dadurch sollten sowohl „ arrowpad_fr.qm “ als auch „ arrowpad_nl.qm “ erstellt werden.

Um „ arrowpad_fr.qm “ zu verwenden, stellen Sie Ihre Systemsprache auf Französisch um. Unter Unix sollte einer der beiden folgenden Befehle funktionieren:

export LANG=fr
setenv LANG fr

Unter Windows oder Mac stellen Sie Ihre Anzeigesprache auf Französisch ein.

Wenn Sie das Programm starten, sollten Sie nun die französische Version sehen:

Screenshot von „Arrow Pad“ auf Französisch

Versuchen Sie dasselbe mit Niederländisch (verwenden Sie unter Unix „ LANG=nl “). Nun sollte die niederländische Version erscheinen:

Screenshot von „Arrow Pad“ auf Niederländisch

Übungen

Markieren Sie eine der Übersetzungen als Qt Linguist als „nicht erledigt“ markieren, d. h. das Kontrollkästchen „Erledigt“ deaktivieren; führen Sie „ lupdate “ aus, dann „ lrelease “ und anschließend das Beispiel. Welche Auswirkung hatte diese Änderung?

Stellen Sie „ LANG=fr_CA “ (französisches Kanada) ein und führen Sie das Beispielprogramm erneut aus. Erläutern Sie, warum das Ergebnis dasselbe ist wie bei „ LANG=fr “.

Ändern Sie einen der Tastenbefehle in der niederländischen Übersetzung, um den Konflikt zwischen &Bestand und &Boven zu beseitigen.

Beispielprojekt @ 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.