Pfeil-Pad Beispiel
Verstehen des Konzepts Qt Linguist contexts und Verwendung von zwei oder mehr Sprachen.
Wir werden zwei Übersetzungen verwenden, Französisch und Niederländisch, obwohl es keine effektive Begrenzung der Anzahl der möglichen Übersetzungen gibt, die in einer Anwendung verwendet werden können.
Bei Verwendung von qmake sind die relevanten Zeilen in arrowpad.pro
:
HEADERS = arrowpad.h \ mainwindow.h SOURCES = arrowpad.cpp \ main.cpp \ mainwindow.cpp TRANSLATIONS = arrowpad_fr.ts \ arrowpad_nl.ts
Wenn Sie CMake verwenden, lauten die relevanten Zeilen in CMakeLists.txt
:
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. Es sollten zwei identische Nachrichtendateien arrowpad_fr.ts
und arrowpad_nl.ts
erzeugt werden. Diese Dateien enthalten alle Quelltexte, die mit den Aufrufen von tr()
zur Übersetzung markiert wurden, sowie deren Kontexte.
Wenn Sie qmake verwenden, muss lupdate
manuell ausgeführt werden:
lupdate arrowpad.pro
Wenn Sie CMake verwenden, erstellen Sie das Ziel update_translations
, um lupdate
auszuführen:
cmake --build . --target update_translations
Weitere Informationen zum Übersetzen von Qt-Anwendungen finden Sie im Qt Linguist Handbuch.
Zeile für Zeile durchgehen
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 sie auch in Kontexte. Ein Kontext ist der Name der Klasse, in der der Quelltext vorkommt. In diesem Beispiel ist also "ArrowPad" 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)
Wenn man weiß, in welcher Klasse jeder Ausgangstext erscheint, kann man Qt Linguist Texte zu gruppieren, die logisch zusammenhängen, z.B. haben alle Texte in einem Dialog den Kontext des Klassennamens des Dialogs und werden zusammen angezeigt. Dies ist eine nützliche Information für den Übersetzer, da der Kontext, in dem der Text erscheint, Einfluss darauf haben kann, wie er übersetzt werden soll. Bei einigen Übersetzungen müssen möglicherweise Tastaturbeschleuniger geändert werden, und wenn alle Quelltexte in einem bestimmten Kontext (Klasse) gruppiert sind, ist es für den Übersetzer einfacher, Änderungen an den Beschleunigern vorzunehmen, ohne Konflikte zu verursachen.
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 Beschriftungen der einzelnen Schaltflächen auf, da die Beschriftungen für den Benutzer sichtbarer Text sind.
class MainWindow : public QMainWindow { Q_OBJECT
Im obigen Screenshot ist das gesamte Fenster eine MainWindow
. Diese ist in der Header-Datei mainwindow.h
definiert. Auch hier verwenden wir Q_OBJECT
, so dass MainWindow
zu einem Kontext in Qt Linguist.
arrowPad = new ArrowPad;
In der Implementierung von MainWindow
, mainwindow.cpp
, erzeugen 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);
Wir rufen auch MainWindow::tr()
zweimal auf, einmal für die Aktion und einmal für die Verknüpfung.
Beachten Sie die Verwendung von tr()
zur Unterstützung verschiedener Tasten in anderen Sprachen. "Ctrl+Q" ist eine gute Wahl für Quit im Englischen, aber ein niederländischer Übersetzer möchte vielleicht "Ctrl+A" (für Afsluiten) und ein deutscher Übersetzer "Strg+E" (für Beenden) verwenden. Wenn Sie tr()
für Ctrl Tastenbeschleuniger verwenden, sollten Sie die Zwei-Argument-Form verwenden, wobei das zweite Argument die Funktion beschreibt, die der Beschleuniger ausführt.
Unsere Funktion main()
ist wie üblich 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 dem aktuellen Gebietsschema. QLocale::system() kann zum Beispiel durch Setzen der Umgebungsvariablen LANG
beeinflusst werden. Beachten Sie, dass die Verwendung einer Namenskonvention, die das Gebietsschema für .qm
-Nachrichtendateien (und TS-Dateien) einbezieht, die Auswahl der Übersetzungsdatei je nach Gebietsschema erleichtert.
Gibt es keine QM-Meldungsdatei für das gewählte Gebietsschema, wird der ursprüngliche Quelltext verwendet, ohne dass ein Fehler auftritt.
Übersetzen ins Französische und Niederländische
Wir beginnen mit der Übersetzung der Beispielanwendung ins Französische. Starten Sie Qt Linguist mit arrowpad_fr.ts
. Sie sollten die sieben Ausgangstexte ("&Hoch", "&Links", usw.) in zwei Kontexten ("Pfeiltasten" und "Hauptfenster") gruppiert erhalten.
Geben Sie nun die folgenden Übersetzungen ein:
ArrowPad
- &Hoch - &Haut
- &Links - &Gauche
- &Rechts - &Droite
- &Unten - &Bas
MainWindow
- E&Beenden - &Quitter
- Strg+Q - &Strg+Q
- &Datei - &Fichier
Die Schaltfläche Done & Next markiert die Übersetzung als abgeschlossen und geht zum nächsten Quelltext über. Schneller geht es, wenn Sie die Abkürzung (siehe Menüleiste Übersetzung) nach dem Eintippen jeder Übersetzung verwenden.
Speichern Sie die Datei und machen Sie dasselbe für Niederländisch, wenn Sie mit arrowpad_nl.ts
arbeiten:
ArrowPad
- &Oben - &Omhoog
- &Links - &Links
- &Rechts - &Rechts
- &Abwärts - Omlaa&g
MainWindow
- E&Ausgang - &Afsluiten
- Strg+Q - Strg+A
- Datei - &Bestand
Wir müssen die Quelldateien der Übersetzungen tt1_fr.ts
und tt1_nl.ts
in QM-Dateien umwandeln. Wir könnten Qt Linguist verwenden, wie wir es zuvor getan haben; 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 von File|Release zu laden und von Qt Linguist.
Geben Sie
lrelease arrowpad.pro
wenn Sie CMake verwenden, geben Sie
cmake --build . --target release_translations
Dies sollte sowohl arrowpad_fr.qm
als auch arrowpad_nl.qm
erzeugen.
Um arrowpad_fr.qm
zu verwenden, ändern Sie Ihre Systemsprache auf Französisch. 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:
Versuchen Sie dasselbe mit Niederländisch (verwenden Sie LANG=nl
unter Unix). Jetzt sollte die niederländische Version erscheinen:
Übungen
Markieren Sie eine der Übersetzungen in Qt Linguist als nicht fertig, d.h. indem Sie das Häkchen bei "fertig" entfernen; führen Sie lupdate
aus, dann lrelease
und dann das Beispiel. Welche Auswirkung hatte diese Änderung?
Stellen Sie LANG=fr_CA
(Französisch-Kanada) ein und führen Sie das Beispielprogramm erneut aus. Erklären Sie, warum das Ergebnis dasselbe ist wie bei LANG=fr
.
Ändern Sie einen der Beschleuniger in der niederländischen Übersetzung, um den Konflikt zwischen &Bestand und &Boven zu beseitigen.
© 2025 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.