Pyqt und gettext

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hallo alle, da ich nach langem suchen nichts gefunden hab, wende ich mich mal wieder an euch.
Und zwar habe ich ein Programm geschrieben, bei dem die Gui über den QTdesigner erstellt wurde und dann mit pyuic4 in pyqt umgewandelt wurde.

Nun möchte ich das Programm übersetzen und hab dafür mit gettext angefangen, nur stoße ich da auf Probleme mit den pyqt Dateien, da diese eigentlich für das Qt eigene Übersetzungstool konfiguriert sind. Ich könnte die Dateien von Hand umschreiben, dass sie mit gettext laufen, jedoch will ich die GUI wahrscheinlich auch später noch modifizieren, und dann würden meine Veränderungen immer verloren gehen.

Gibt es eine Möglichkeit, die von pyuic erstellten Dateien für gettext brauchbar zu machen? Oder sollte ich dann doch lieber auf das Qt Übersetzungstool wechseln? Wenn ja wo finde ich eine brauchbare Dokumentation für pyqt?

LG
lunar

Wenn Du "gettext" in Qt nutzen möchtest, dann musst Du von "QTranslator" ableiten, und dessen Methoden so überschreiben, dass sie intern "gettext" nutzen.

Falls Du Dich doch für das Qt-Werkzeug entscheidest, so findest Du Dokumentation dazu in der offiziellen Qt-Dokumentation. Die Python-spezifischen Dinge sind im PyQt4 Reference Guide dokumentiert.
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Danke erstmal für die Antwort!

Und wie kann ich das ableiten bzw. überschreiben?
Beispielcode:

Code: Alles auswählen

self.right.setText(QtGui.QApplication.translate("Dialog", "Richtig!", None, QtGui.QApplication.UnicodeUTF8))
Ich hatte bereits versucht "QtGui.QApplication.translate" durch _( zu ersetzen, jedoch führt dass ja zu mehreren Problemen, da nicht nur ein String übergeben wird, sondern mehrere.
deets

Ich denke nicht, dass das ist, was Lunar meinte.

Stattdessen setzt du einen anderen Translator auf deiner Applikation. Wie zB hier gezeigt:

http://doc.qt.nokia.com/qq/qq08-swedish ... stribution

Und dieser Translator benutzt dann gettext.

Ein Problem bleibt natuerlich noch: wie kommst du an die zu uebersetzenden Strings? Ich kenne die qm-Files nicht, aber uU kann man die einfach konvertieren in PO-Files. Oder man bringt zB dem Babel-Projekt bei, Strings aus ui-files zu extrahieren, die mit translate() markiert sind.
lunar

@Trubinial Guru: Das sind Grundbegriffe aus der objektorientierten Programmierung. Das Konzept der Vererbung muss Dir klar sein, bevor Du mit Qt Oberflächen entwickelst.

In jedem Fall kannst Du wie folgt von QTranslator ableiten:

Code: Alles auswählen

class MyTranslator(QTranslator):
    def translate(self, context, source, comment):
        return translate_with_gettext(source)
"translate_with_gettext()" musst Du natürlich entsprechend ersetzen.

Leider funktioniert das nur für Zeichenketten im Singular. Für Plural-Übersetzungen lässt sich das aufgrund der Art, wie QTranslator implementiert ist, nicht verwenden.

Die Alternative ist, die UI-Dateien so zu laden, dass gettext zur Übersetzung genutzt wird. Dazu muss man den UI-Compiler von PyQt anpassen (Beispiel, "tr2i18n()" muss entsprechend ersetzt werden). Das Beispiel funktioniert nur beim dynamischen Laden von UI-Dateien mittels ".loadUi()", die Anpassung zur Kompilierung von UI-Dateien überlasse ich Dir. Allerdings ist es sowieso empfehlenswert, UI-Dateien dynamisch zu laden.

Im Allgemeinen rate ich Dir allerdings, einfach das Qt-Übersetzungssystem zu nutzen, alles andere ist nur komplizierter.

@deets: Das verlinkte Beispiel hat mit der Frage des OP wenig zu tun. Installieren muss man QTranslator-Objekte so oder so, egal ob man Qts Übersetzungssystem nutzt oder ein eigenes. Falls man gettext nutzen möchte, muss man überhaupt erst einmal eine QTranslator-Klasse implementieren, der gettext nutzt, denn Qt kann das nicht von Haus aus. Das ist es, was der OP wissen möchte.
Antworten