Auf dieser Seite

Beispiel für einen Troll-Druck

Aktualisierung der Übersetzungen für spätere Versionen.

„Troll Print“ ist eine Beispielanwendung, mit der der Benutzer Druckereinstellungen auswählen kann. Sie ist in zwei Versionen verfügbar: Englisch und Portugiesisch.

Screenshot, der die Benutzeroberfläche des Beispiels „Troll Print“ in englischer Sprache zeigt

Wir haben eine Übersetzungsdatei beigefügt, „ trollprint_pt.ts “, die einige portugiesische Übersetzungen für dieses Beispiel enthält.

Wir betrachten zwei Versionen derselben Anwendung: „Troll Print“ 1.0 und 1.1. Wir werden lernen, wie man die für eine Version erstellten Übersetzungen in einer nachfolgenden Version wiederverwenden kann. (In diesem Tutorial müssen Sie einige Quelldateien bearbeiten. Es empfiehlt sich, alle Dateien in ein neues temporäres Verzeichnis zu kopieren und von dort aus zu arbeiten.)

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

Schritt-für-Schritt-Anleitung

Die Klasse „ PrintPanel “ ist in „ printpanel.h “ definiert.

class PrintPanel : public QWidget
{
    Q_OBJECT

PrintPanel ist ein ` QWidget`. Damit ` tr() ` ordnungsgemäß funktioniert, benötigt es das Makro ` Q_OBJECT `.

Die Implementierungsdatei lautet „ printpanel.cpp “.

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

Ein Teil des Codes ist in Troll Print 1.0 auskommentiert; Sie werden ihn später für Troll Print 1.1 wieder einkommentieren.

    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"));

Beachten Sie die beiden Vorkommen von „ tr("Enabled") “ und „ tr("Disabled") “ in „PrintPanel“. Da sowohl „Enabled“ als auch „Disabled“ im selben Kontext vorkommen Qt Linguist wird jeweils nur ein Vorkommen angezeigt, und für die nicht angezeigten Duplikate werden dieselben Übersetzungen verwendet. Das spart zwar Zeit, doch in einigen Sprachen, wie beispielsweise Portugiesisch, erfordert das zweite Vorkommen eine separate Übersetzung. Wir werden sehen, wie Qt Linguist es in Kürze so gestaltet werden kann, dass alle Vorkommen zur separaten Übersetzung angezeigt werden.

Die Header-Datei für „ MainWindow “, mainwindow.h, enthält keine Überraschungen. In der Implementierung, mainwindow.cpp, haben wir einige für den Benutzer sichtbare Quelltexte, die zur Übersetzung markiert werden müssen.

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

Wir müssen den Fenstertitel übersetzen.

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

Außerdem müssen wir die Aktionen und Menüs übersetzen. Beachten Sie, dass die Form von ` tr() ` mit zwei Argumenten für die Tastenkombination „Strg+Q“ verwendet wird, da das zweite Argument der einzige Hinweis für den Übersetzer ist, welche Funktion diese Tastenkombination ausführt.

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

Die Funktion ` main() ` in ` main.cpp ` ist dieselbe wie im Beispiel „Arrow Pad “. Insbesondere wählt sie eine Übersetzungsdatei basierend auf der aktuellen Locale aus.

Ausführen von Troll Print 1.0 auf Englisch und Portugiesisch

Wir werden die Übersetzungen aus der mitgelieferten Datei „ trollprint_pt.ts “ verwenden.

Setzen Sie die Umgebungsvariable ` LANG ` auf ` pt` und führen Sie anschließend ` trollprint` aus. Sie sollten weiterhin die englische Version sehen. Führen Sie nun ` lrelease` aus, z. B. ` lrelease trollprint.pro`, und starten Sie das Beispiel anschließend erneut. Nun sollten Sie die portugiesische Version (Troll Imprimir 1.0) sehen:

Screenshot, der die Benutzeroberfläche von „Troll Print“ auf Portugiesisch zeigt

Obwohl die Übersetzung korrekt angezeigt wird, ist sie tatsächlich falsch. Im korrekten Portugiesisch sollte das zweite Vorkommen von „Enabled“ „Ativadas“ lauten, nicht „Ativado“, und die Endung der zweiten Übersetzung von „Disabled“ muss ebenfalls entsprechend geändert werden.

Wenn Sie „ trollprint_pt.ts “ mit Qt Linguist, werden Sie feststellen, dass in der Übersetzungsquelldatei jeweils nur ein Vorkommen von „Enabled“ und „Disabled“ vorhanden ist, obwohl im Quellcode jeweils zwei davon vorkommen. Das liegt daran, dass Qt Linguist versucht, den Arbeitsaufwand für den Übersetzer zu minimieren, indem für doppelte Quelltexte dieselbe Übersetzung verwendet wird. In Fällen wie diesem, in denen eine identische Übersetzung falsch ist, muss der Programmierer die doppelten Vorkommen voneinander unterscheiden. Dies lässt sich leicht mit der Zwei-Argument-Form von ` tr()` erreichen.

Wir können leicht feststellen, welche Datei geändert werden muss, da der „Kontext“ des Übersetzers tatsächlich der Klassenname der Klasse ist, in der die zu ändernden Texte vorkommen. In diesem Fall ist die Datei „ printpanel.cpp “, in der vier Zeilen geändert werden müssen. Fügen Sie das zweite Argument „two-sided“ in die entsprechenden Aufrufe von „ tr() “ für das erste Paar von Optionsfeldern ein:

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

und fügen Sie das zweite Argument „colors“ in die entsprechenden Aufrufe von ` tr() ` für das zweite Paar von Optionsfeldern ein:

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

Kompilieren Sie nun erneut, führen Sie „ lupdate “ aus und öffnen Sie „ trollprint_pt.ts “ mit Qt Linguist. Sie sollten nun zwei Änderungen sehen.

Erstens enthält die Übersetzungsquelldatei nun drei Paare aus „Enabled“ und „Disabled“. Das erste Paar ist mit „(obs.)“ gekennzeichnet, was bedeutet, dass diese Einträge veraltet sind. Dies liegt daran, dass diese Texte in „ tr() “-Aufrufen vorkamen, die durch neue Aufrufe mit zwei Argumenten ersetzt wurden. Das zweite Paar trägt den Kommentar „two-sided“, das dritte Paar den Kommentar „colors“. Die Kommentare werden im Bereich „ Source text and comments “ in Qt Linguist.

Zweitens wurden die Übersetzungstexte „Ativado“ und „Desativado“ automatisch als Übersetzungen für die neuen Texte „Enabled“ und „Disabled“ verwendet, um wiederum den Arbeitsaufwand für den Übersetzer zu minimieren. Natürlich sind diese in diesem Fall für das zweite Vorkommen der jeweiligen Wörter nicht korrekt, bieten aber einen guten Ausgangspunkt.

Ändern Sie das zweite „Ativado“ in „Ativadas“ und das zweite „Desativado“ in „Desativadas“, speichern Sie anschließend und beenden Sie das Programm. Führen Sie „ lrelease “ aus, um eine aktuelle Binärdatei „ trollprint_pt.qm “ zu erhalten, und starten Sie dann Troll Print (bzw. Troll Imprimir).

Screenshot, der den Troll-Druck auf Portugiesisch zeigt

Das zweite Argument von tr(), das als „comments“ bezeichnet wird, Qt Linguist, und dient dazu, zwischen identischen Quelltexten zu unterscheiden, die im selben Kontext (Klasse) vorkommen. Sie sind auch in anderen Fällen nützlich, um dem Übersetzer Hinweise zu geben, und im Falle von Strg-Tastenkombinationen sind sie das einzige Mittel, um dem Übersetzer die durch die Tastenkombination ausgeführte Funktion zu vermitteln.

Eine weitere Möglichkeit, dem Übersetzer zu helfen, besteht darin, Informationen darüber bereitzustellen, wie er zu dem bestimmten Teil der Anwendung navigieren kann, der die zu übersetzenden Quelltexte enthält. Dies hilft ihm, den Kontext zu erkennen, in dem die Übersetzung erscheint, und erleichtert ihm zudem das Auffinden und Testen der Übersetzungen. Dies lässt sich durch die Verwendung eines „ TRANSLATOR “-Kommentars im Quellcode erreichen:

/*
   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.

   ...
*/

Fügen Sie diese Kommentare in einige Quelldateien ein, insbesondere in Dialogklassen, und beschreiben Sie dabei die Navigation, die erforderlich ist, um zu den Dialogen zu gelangen. Sie können sie auch in die Beispieldateien einfügen; geeignet sind beispielsweise die Dateien „ mainwindow.cpp “ und „ printpanel.cpp “. Führen Sie „ lupdate “ aus und starten Sie anschließend Qt Linguist und laden Sie trollprint_pt.ts ein. Beim Durchblättern der Liste der Quelltexte sollten Sie die Kommentare im Bereich Source text and comments sehen.

Manchmal, insbesondere bei großen Programmen, kann es für den Übersetzer schwierig sein, seine Übersetzungen zu finden und deren Richtigkeit zu überprüfen. Kommentare, die gute Navigationshinweise enthalten, können ihm Zeit sparen:

/*
   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

Wir werden nun die Version 1.1 von Troll Print vorbereiten. Starten Sie Ihren bevorzugten Texteditor und befolgen Sie diese Schritte:

  • Entfernen Sie die Auskommentierung der beiden Zeilen, die eine „ QLabel “ mit dem Text „<b>TROLL PRINT</b>“ in „ printpanel.cpp “ erstellen.
  • Sprachliche Überarbeitung: Ersetze „2-sided“ durch „Two-sided“ in der Datei „ printpanel.cpp “.
  • Ersetzen Sie „1.0“ überall dort, wo es in der Datei „ mainwindow.cpp “ vorkommt, durch „1.1“.
  • Aktualisieren Sie das Copyright-Jahr auf 1999–2000 in mainwindow.cpp.

(In einer echten Anwendung wären die Versionsnummer und das Copyright-Jahr natürlich Konstanten oder #defines.)

Wenn Sie fertig sind, führen Sie „ lupdate “ aus und öffnen Sie anschließend „ trollprint_pt.ts “ in Qt Linguist. Die folgenden Punkte sind von besonderem Interesse:

  • PrintPanel
    • 2-sided – mit dem Vermerk „(obs.)“, veraltet
    • <b>TROLL PRINT</b> – nicht gekennzeichnet, d. h. nicht übersetzt
    • Beidseitig – nicht gekennzeichnet, d. h. nicht übersetzt.

Um Überarbeitungen zu vereinfachen, können Sie anstelle von tr("Troll Print 1.0") tr("Troll Print %1").arg("1.0") oder Ähnliches verwenden, um zu vermeiden, dass die Zeichenfolge bei jeder neuen Version aktualisiert werden muss.

Gehen Sie die Übersetzungen unter MainWindow durch und markieren Sie diese als „fertig“. Übersetzen Sie „<b>TROLL PRINT</b>“ als „<b>TROLL IMPRIMIR</b>“. Wenn Sie „Two-sided“ übersetzen, klicken Sie auf die Schaltfläche „ Guess Again “, um „Two-sided“ zu übersetzen, ändern Sie dabei jedoch die „2“ in „Dois“.

Speichern und beenden Sie das Programm und führen Sie anschließend lrelease aus. Die portugiesische Version sollte nun wie folgt aussehen:

Screenshot, der den Troll-Druck auf Portugiesisch zeigt

Wählen Sie „ Ajuda|Sobre “ (Help|About), um das „Über“-Fenster anzuzeigen.

Wenn Sie „ Ajuda|Sobre Qt “ (Help|About Qt) wählen, erhalten Sie einen englischen Dialog. Hoppla! Qt selbst muss übersetzt werden. Weitere Informationen finden Sie unter „Internationalisierung mit Qt “.

Stellen Sie nun „ LANG=en “ ein, um die ursprüngliche englische Version zu erhalten:

Screenshot, der den Troll-Druck auf Englisch zeigt

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.