tr() richtig anwenden

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
newhippie
User
Beiträge: 13
Registriert: Freitag 2. Oktober 2009, 18:53

Hallo, in der Pyqt doku steht, dass "tr()" nicht eins zu eins in pythin-skripten funktioniert.
wenn ich fogeldes mache:

Code: Alles auswählen

from PyQt4.QtCore import QTranslator
...
fD = QFileDialog.getOpenFileName(self, tr("Open File"),"/home/stanislav","Text files (*.txt)");

Dann gibd Eric4 mir dem Fehler aus: "tr() not defined"

und bei:

Code: Alles auswählen

fD = QFileDialog.getOpenFileName(self, QTranslator.tr("Open File"),"/home/stanislav","Text files (*.txt)");
meldet er: " the first argument must be a QObject ... "

Wie setzte ich tr() nun richtig ein? Bzw wie kann ich sonst Texte und Labels uns so weiter richtig übersetzen?[/code]
Es kann nur ein Monopol geben: Linux.
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Dass QTranslator.tr() "funktioniert" ist dem Umstand zu verdanken, dass QTranslator von QObject erbt.
PyQt4 ändert aber die Qt4-Api insoweit, dass es die statische Variante von tr() verbietet. Demnach funktioniert tr() nur, wenn es auf einem QObject aufgerufen wird. Und das sagt dir die Fehlermeldung.
Der erste Funktionsparameter ist "self", der Zeiger auf das aktuelle Objekt.

Da du tr() ja scheinbar "global" (also außerhalb einer Klasse/Methode) verwendest, bleibt dir nur die Option, ein QObject-Objekt zu erstellen, auf dem du tr() aufrufst:

Code: Alles auswählen

transObj = QObject()
fD = QFileDialog.getOpenFileName(self, transObj.tr("Open File"),"/home/stanislav","Text files (*.txt)");
Oder gleich QCoreApplication.translate() [statisch] verwenden:

Code: Alles auswählen

>>> QCoreApplication.translate("", "Hello world")
PyQt4.QtCore.QString(u'Hello world')
Wobei ich mir nicht sicher bin, ob das mit dem leeren Context-Identifier ("") funktioniert ;)
Benutzeravatar
newhippie
User
Beiträge: 13
Registriert: Freitag 2. Oktober 2009, 18:53

Danke,

nun, ich verwende tr in einer Klasse, QMainWindow, und dort in einer Funktion, wo ein Dialog zum Öffnen einer Datei aufgemacht werden soll.

Dass muss doch irgendwie möglich sein, dass ich die Beschriftungen übersetzen lasse.

Und am Anfang wird das ganze schon mit Translator geöfnet:

Code: Alles auswählen

trans = QTranslator()
trans.load( "qt_de", QLibraryInfo.location(QLibraryInfo.TranslationsPath)) 
app = QApplication(sys.argv)
app.installTranslator(trans) 
mainWind = mainWindow() 
mainWind.show()
sys.exit(app.exec_())
Es kann nur ein Monopol geben: Linux.
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

newhippie hat geschrieben:nun, ich verwende tr in einer Klasse, QMainWindow, und dort in einer Funktion, wo ein Dialog zum Öffnen einer Datei aufgemacht werden soll.
"In einer Klasse" deckt sich aber nicht mit deinem geposteten Codefragement :P

Die Lösung ist simpel:
Ersetze "tr()" durch "self.tr()", so hast du einen "ersten Funktionsparameter vom Typ QObject", und Eric beschwert sich nimmer :)
(Vorausgesetzt, du hältst dich an die Python-Konvention, den ersten Parameter bei der Definition deiner Methoden mit "self" zu bezeichnen.)
Benutzeravatar
newhippie
User
Beiträge: 13
Registriert: Freitag 2. Oktober 2009, 18:53

Er meldet jetzt bei self.tr keinen Fehler mehr, aber übersetzt "Open File" auch nicht.

Muss ich in der Klasse von QTraslator erben oder sowas is der Art noch ausführen?
Es kann nur ein Monopol geben: Linux.
lunar

Was hast Du denn erwartet? Eigene Texte musst Du auch selbst übersetzen, die mitgelieferten Übersetzungen betreffen logischerweise nur Qt4. Überlege mal, woher sollte Qt4 denn wissen, was "Open File" im Kontext Deiner Klasse bedeutet?
Benutzeravatar
newhippie
User
Beiträge: 13
Registriert: Freitag 2. Oktober 2009, 18:53

ich dachte, es gibt eine Bibliothek mit Standardausdrücken, die nicht explizit aufgezählt und übersetzt werden müssen.

Bei StandardButtons zum Beispiel klappt es ja.
Es kann nur ein Monopol geben: Linux.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

newhippie hat geschrieben:Bei StandardButtons zum Beispiel klappt es ja.
Ja, weil Qt die Uebersetzungen fuer seine Widgets mitliefert. Die Frage nach i18n hatten wir schon oefters, wirf mal die Suche an.
lunar

QDialogButtonBox ist eine Qt-Klasse. Ein Mitglied des Trolltech-Übersetzungsteams hat sich also die Mühe gemacht, jeden einzelnen Button in verschiedene Sprachen zu übersetzen.

Übersetzungen aber funktionieren immer nur für einzelne Teile getrennt. Um korrekt zu übersetzen, bedarf es eines Kontexts, der der Phrase ihre Bedeutung verleiht. Diesen Kontext aber kann Qt nicht erraten, und ergo auch keine "Standardausdrücke" bereitstellen.

Auf das konkrete Beispiel bezogen: Woher soll Qt denn wissen, dass "Open File" mit "Datei öffnen" übersetzen werden soll? Vielleicht bevorzugt der Entwickler ja einen anderen Stil und hätte lieber "Öffne Datei". "Open File" kann beides bedeuten. Verkompliziert wird dieses Problem noch durch synonyme Bedeutungen. In einer Aktenverwaltungssoftware für Anwaltskanzleien aber möchte man vielleicht keine "Dateien" öffnen, sondern "Akten". Auf Englisch heißt beides "file", die genaue Bedeutung und somit auch die richtige Übersetzung erschließt sich nur aus dem Kontext der spezifischen Anwendung.
Benutzeravatar
newhippie
User
Beiträge: 13
Registriert: Freitag 2. Oktober 2009, 18:53

OK, danke dir, dann werde ich wohl erstmal einfach bei einer Sprache bleiben und bei Bedarf mich erkundigen.
Es kann nur ein Monopol geben: Linux.
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Wenn du die Übersetzung von "Cancel" oder "Open" aus dem QFileDialog (sprich QDialogButtonBox) verwenden willst, kannst du natürlich auch tun:

Code: Alles auswählen

>>> QApplication.translate("QDialogButtonBox", "Cancel")
PyQt4.QtCore.QString(u'Abbrechen')
>>> QApplication.translate("QDialogButtonBox", "Open")
PyQt4.QtCore.QString(u'\xd6ffnen')
Benutzeravatar
newhippie
User
Beiträge: 13
Registriert: Freitag 2. Oktober 2009, 18:53

Na, das hört sich auch sinnvoll an )))
Es kann nur ein Monopol geben: Linux.
Antworten