Seite 1 von 1

tr() richtig anwenden

Verfasst: Sonntag 4. Oktober 2009, 13:31
von newhippie
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]

Verfasst: Sonntag 4. Oktober 2009, 14:05
von franzf
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 ;)

Verfasst: Sonntag 4. Oktober 2009, 14:13
von newhippie
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_())

Verfasst: Sonntag 4. Oktober 2009, 14:17
von franzf
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.)

Verfasst: Sonntag 4. Oktober 2009, 15:08
von newhippie
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?

Verfasst: Sonntag 4. Oktober 2009, 16:01
von 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?

Verfasst: Sonntag 4. Oktober 2009, 16:04
von newhippie
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.

Verfasst: Sonntag 4. Oktober 2009, 16:10
von cofi
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.

Verfasst: Sonntag 4. Oktober 2009, 16:14
von 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.

Verfasst: Sonntag 4. Oktober 2009, 16:19
von newhippie
OK, danke dir, dann werde ich wohl erstmal einfach bei einer Sprache bleiben und bei Bedarf mich erkundigen.

Verfasst: Sonntag 4. Oktober 2009, 16:27
von franzf
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')

Verfasst: Sonntag 4. Oktober 2009, 16:35
von newhippie
Na, das hört sich auch sinnvoll an )))