Verwendung von gettext, um QML-Dateien übersetzbar zu machen

10

Ich möchte eine QtQuick- App schreiben, die auf Python ( PySide ) und QML basiert .

Ich weiß, dass Qt-Apps eine eigene Übersetzungstechnologie haben, aber ich würde mich gerne an gettext für diese halten. Ich würde gerne wissen, ob es möglich ist:

  • Markieren Sie Zeichenfolgen für die Übersetzung in QML-Dateien so, dass gettext-Tools sie in eine .potDatei extrahieren können
  • Lassen Sie gettext zur Laufzeit QML-Dateien übersetzen.

Ich weiß, dass dies im Unity 2D-Code in C ++ geschieht, daher frage ich mich, wie dies mit Python möglich ist.

Hinweis: Ich spreche davon, zur Laufzeit ausschließlich gettext zu verwenden und nicht zwischen gettext- und Qt Linguist-Formaten zu konvertieren.

David Planella
quelle

Antworten:

6

Im Allgemeinen gibt es keine Möglichkeit, die gettext-Übersetzung in QT zu verwenden, da die Bibliothek einen internen Übersetzungsmechanismus (Qtranslate- und .ts-Dateien) verwendet, wie hier angegeben. QTBUG-2404 .

Es gibt jedoch eine praktikable Alternative.

Beim Versand mit QT gibt es ein Toolkit namens lconvert , mit dem .ts-Dateien in .po konvertiert werden können und umgekehrt.

So können Sie Ihre gesamte Übersetzung extrahieren mit:

lupdate

Verwenden Sie dann lconvert , um eine Po-Datei zu erhalten:

lconvert -of po -o file.po file.ts

Nach der Übersetzung können Sie die po-Datei wieder in ts konvertieren:

lconvert -of ts -o file.ts file.po

Dann können Sie es in Ihrer Software verwenden.

lupdate kann sowohl für QT als auch für QtQuick verwendet werden.

Angelo
quelle
1
Danke für die Antwort!. Ich kenne die Konvertierungstools, aber sie lassen gettext die Übersetzungen zur Laufzeit nicht laden. Ich weiß, dass es technisch möglich ist, den Qt-Übersetzungsaufruf zu überschreiben, da die Unity 2D-Leute dies in C ++ tun. Ich versuche nur herauszufinden, wie es in Python geht.
David Planella
0

Sie können die Quelle des Lupdates hacken und etwas verwenden, das Sie als Ersatz für qsTr verwenden möchten. (ist einfach) und verwenden Sie dann Ihr gehacktes lupdate + lconvert + Sie erhalten libintl, um das Ziel gettext zu erreichen.

snyh
quelle
1
Erklären Sie bitte, wie.
Kaz Wolfe
Öffnen Sie die Datei qdeclarative.cpp (im lupdte-Quellcode). Suchen Sie nach "qsTr" und ersetzen Sie sie durch alles, was Sie möchten. Nehmen Sie an, Sie verwenden "dsTr". Verwenden Sie dann dsTr ("you string") in qml. Verwenden Sie lconvert, um eine Pot-Datei zu generieren, nachdem Sie das modifizierte Lupdate verwendet haben, um eine ts-Datei zu generieren. Das letzte Mal, dass Sie den dsTr implementieren und in den globalen Kontext exportieren müssen
snyh
Gehen Sie Kopf und setzen Sie das in die Antwort. Sagen Sie in der Regel immer, wie und geben Sie dann die Quelle an.
Kaz Wolfe