Text-ID-basierte Übersetzungen
Der Text-ID-Übersetzungsmechanismus ist ein industrietaugliches System für die Internationalisierung und Lokalisierung. Jeder Text in der Anwendung hat einen eindeutigen Bezeichner (Text-ID), den Sie im Quellcode anstelle von Text verwenden. Dies erleichtert die Verwaltung einer großen Anzahl von übersetzten Texten erheblich.
Internationalisierung mit Text-IDs
Bei der Verwendung von Text-IDs anstelle von reinem Text ist die allgemeine Methode zur Internationalisierung einer Anwendung die gleiche, aber die Details sind etwas anders:
- Die Funktionen und Makros für das text-ID-basierte Übersetzungssystem unterscheiden sich vom Klartextsystem. Sie verwenden die Funktion qsTrId() anstelle von qsTr(), das Makro QT_TRID_NOOP() anstelle von QT_TR_NOOP(), und das Makro QT_TRID_N_NOOP() anstelle von QT_TR_N_NOOP()).
- Verwenden Sie Text-IDs als Zeichenfolgen für die Benutzeroberfläche und nicht als reine Textzeichenfolgen. Ein Beispiel,
qsTrId("id-back-not-front")
- Sie können einen Kontextparameter nicht mit einer Text-ID angeben, und daher benötigen gleich geschriebene Wörter mit unterschiedlichen Bedeutungen separate Text-IDs. Zum Beispiel unterscheidet
qsTrId("id-back-backstep")
den Back-Step Back vonid-back-not-front
Back. - Da Kontextnamen für text-ID-basierte Übersetzungen nicht zulässig sind, listet Qt Linguist die IDs in einer Datei ohne Kontextnamen auf.
- Der technische englische Text, den Sie in der Benutzeroberfläche für Entwicklungs-Builds sehen, wird mit einem
//%
Kommentar gekennzeichnet. Wenn Sie diesen nicht einfügen, wird die Text-ID in der Benutzeroberfläche angezeigt. Dies ist besonders wichtig, wenn Sie Texte mit Parametern haben. Der Kommentar//%
muss die Parameterindikatoren in der Zeichenkette enthalten. Ein Beispiel,//% "Number of files: %1"
- Die
//:
Kommentare, die dem Übersetzer zusätzliche Informationen liefern, sind im Klartextsystem optional. Im Text-ID-basierten System sind diese zusätzlichen Informationen jedoch unerlässlich, da man ohne sie nur die Text-ID hat und der Übersetzer ohne weiteren Kontext möglicherweise keine sinnvolle Übersetzung daraus erstellen kann. Sie können lange beschreibende Text-IDs und keine Kommentare verwenden, aber Kommentare sind oft leichter zu verstehen.
Die folgenden Codeschnipsel zeigen einen Vergleich von text-ID-basierten und rein textbasierten Übersetzungen:
text-ID-basiert | Klartext-basiert |
---|---|
Text { id: backTxt; //: The back of the object, not the front //% "Back" //~ Context Not related to back-stepping text: qsTrId("id-back-not-front"); } | Text { id: backTxt; //: The back of the object, not the front //~ Context Not related to back-stepping text: qsTr("Back","Not front") } |
Lokalisierung mit Text-IDs
Die Lokalisierung mit Text-IDs läuft ähnlich ab wie die mit reinem Text.
Sie verwenden das Tool lupdate, um die TS-Dateien zu erzeugen, in die Sie die Übersetzungen einfügen. Die Ausgangswerte in den Übersetzungsdateien sind Text-IDs und kein reiner Text. Daher benötigen Sie entweder beschreibende Text-IDs oder gute zusätzliche Kommentare oder beides, um sicherzustellen, dass die Übersetzungen korrekt sind.
Das Beispiel der Text-ID-basierten Benutzeroberfläche von oben ergibt den folgenden Inhalt in der .ts-Datei:
<message id="id-back-not-front"> <source>Back</source> <extracomment>The back of the object, not the front</extracomment> <translation type="unfinished"></translation> <extra-Context>Not related to back-stepping</extra-Context> </message>
Wenn für einen bestimmten Text keine Übersetzung verfügbar ist (was in der Regel erst spät in der Entwicklung der Fall ist), wird in der Benutzeroberfläche die Text-ID anstelle eines richtigen Textes angezeigt. Um die Anwendung für Tests besser nutzbar zu machen, können Sie lrelease
veranlassen, den englischen Ausgangstext des Engineerings (aus den Kommentaren von //%
) als übersetzten Text zu verwenden und ihn mit einem Indikator, z. B. einem Ausrufezeichen (!), zu kennzeichnen, damit Sie sehen können, welche Texte noch nicht übersetzt sind.
ID-basierte Übersetzungen gruppieren
Sie können jeder ID-basierten Übersetzung eine Bezeichnung zuweisen, um ID-basierte Einträge großer Projekte in kleineren Gruppen zu organisieren. Um einem ID-basierten Eintrag ein Label zuzuweisen, fügen Sie einen //@
Kommentar hinzu, der das Label benennt, z. B. in C++:
//% "Open file" //@ FileOperations qtTrId("msg.open");
Oder in QML:
//% "Open file" //@ FileOperations qsTrId("msg.open");
Wenn Sie die TS-Datei in Qt Linguistöffnen, werden die ID-basierten Einträge mit demselben Label gruppiert, ähnlich wie textbasierte Einträge, die nach Kontext gruppiert sind. Jeder Eintrag ohne Label erscheint unter <unnamed label>
.
Hinweis: Labelnamen haben keinen Einfluss auf die Suche oder Eindeutigkeit: IDs bleiben global eindeutig und können weiterhin über qtTrId("msgid")
geladen werden, ohne auf ein Label zu verweisen. Das Label-Tag wird nur verwendet, um die Navigation des Übersetzers zu verbessern und verändert nicht das Laufzeitverhalten.
CMake-Konfiguration
Wenn Sie mit CMake bauen, verwenden Sie das Präfix qml_
für .ts-Dateien. Zum Beispiel qml_en.ts
. Fügen Sie in der Datei CMakeLists.txt die Funktion qt_add_translations hinzu, in der Sie die *.ts-Dateien als Werte von TS_FILES
auflisten, und setzen Sie den Wert von RESOURCE_PREFIX auf die URI der Datei main.qml für das Projekt, gefolgt von /i18n:
qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES i18n/qml_de_DE.ts i18n/qml_en_US.ts RESOURCE_PREFIX Main/i18n )
Erweiterte Verwendung mit qmake
Für Projekte, die auf eine große Anzahl von Sprachumgebungen abzielen, können Sie die TRANSLATIONS-Information aus der .pro-Datei entfernen und stattdessen die Übersetzungen mit einem separaten Skript verwalten. Das Skript kann lrelease
und lupdate
für jedes der gewünschten Ziele aufrufen.
Die Aktualisierungen könnten etwa so ablaufen:
lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_GB.ts lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_US.ts ...
Die Erzeugung der endgültigen .qm-Dateien könnte etwa so programmiert werden:
lrelease <project-dir>/i18n/myapp-text_en_GB.ts lrelease <project-dir>/i18n/myapp-text_en_US.ts ...
© 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.