self.tr() und dynamischer Text?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

Hi

Ich hab ein kleines Problem mit QMessageDialog und setToolTip und zwas werden die Texte nicht übersetzet.

Die einzige "logische" erklärung wäre das die Sätze "dynamisch" sind, aber wie lass ich die nun übersetzen?

Folgendes lässt sich z.B. nicht übersetzen:

Code: Alles auswählen

version = '1.0'
self.tr('Dies ist das Example in Version %s') % version
oder

Code: Alles auswählen

version = '1.0'
self.tr('Dies ist das Example in Version' + version)
Konkretes Codebeispiel:

Code: Alles auswählen

    def checkUpdate(self):
        try:
            new_version = urllib2.urlopen(URL).read()[:-1]
            if version < new_version:
                QtGui.QMessageBox.information(self, self.tr('Update available!'),
                    self.tr('''<center><b>KWipe v%s available!</b><br>Please visit:<br>
                    <a href=http://2blabla.ch> http://2blabla.ch</a></center>''' % new_version), QtGui.QMessageBox.Close)
        except urllib2.URLError, urllib2.HTTPError:
            pass

Alle "statischen" Texte werden übersetzt, aber sowas nicht :(


Wie kann ich das lösen?
lunar

AngelusNoctis hat geschrieben:Folgendes lässt sich z.B. nicht übersetzen:

Code: Alles auswählen

version = '1.0'
self.tr('Dies ist das Example in Version %s') % version
Oh doch, das lässt sich korrekt übersetzen. Besser wäre allerdings:

Code: Alles auswählen

self.tr('Dies ist das Example in Version {version}').format(version=version)
So ist zum einen die Bedeutung des Platzhalters klar, zum anderen kann die Reihenfolge der Platzhalter verändert wird. Nicht jede Sprache hat schließlich die gleiche Satzstellung.

Ist halt nur nicht das, was Du tatsächlich verwendest, denn in Deinem „konkreten Code-Beispiel“ [1] ist die schließende Klammer anders positioniert:

Code: Alles auswählen

self.tr('Dies ist das Example in Version %s' % version)
Es ist offensichtlich, dass das gar nicht funktionieren kann. Wie sollte "pylupdate" daraus einen konstanten Text für die Übersetzung extrahieren?!

Im Übrigen ist es üblich, im Quelltext Englisch als Standardsprache zu verwenden.

[1]: Im Übrigen ein hervorragendes Beispiel dafür, warum man den tatsächlichen Quelltext zeigen sollte, und nicht eine Abstraktion oder Zusammenstellung desselben.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

In dem du die format()-Methode eines Strings nutzt.
http://docs.python.org/2/library/string ... matstrings

Code: Alles auswählen

version = self.tr('1.0')
'''<center><b>KWipe v{0} available!</b><br>Please visit:<br><a href=http://2blabla.ch> http://2blabla.ch</a></center>'''.format(version)
btw, hab ich jetzt nicht getestet,

Code: Alles auswählen

version = self.tr('1.0')
'Dies ist das Example in Version %s' % version
klappt nicht?

Edit: Ok, lunars Antwort war schneller und besser/vollständiger :oops:
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

Hi

Danke ersmal...



Bei dem Versuch, meckerter nicht mehr wegen QString aber die Übersetzung ging trotzdem nicht (TypeError: unsupported operand type(s) for %: 'QString' and 'str'

Code: Alles auswählen

    def checkUpdate(self):
        try:
            new_version = urllib2.urlopen(URL).read()[:-1]
            if version < new_version:
                QtGui.QMessageBox.information(self, self.tr('Update available!'),
                    self.tr('''<center><b>KWipe v%s available!</b><br>Please visit:<br>
                    <a href=http://2blabla.ch> http://2blabla.ch</a></center>''') % new_version, QtGui.QMessageBox.Close)
        except urllib2.URLError, urllib2.HTTPError:
            pass
Hier meckert er auch mit Format()

Code: Alles auswählen

    def checkUpdate(self):
        try:
            new_version = urllib2.urlopen(URL).read()[:-1]
            if version < new_version:
                QtGui.QMessageBox.information(self, self.tr('Update available!'),
                    self.tr('''<center><b>KWipe v{version} available!</b><br>Please visit:<br>
                    <a href=http://2blabla.ch> http://2blabla.ch</a></center>''').format(version=new_version), QtGui.QMessageBox.Close)
        except urllib2.URLError, urllib2.HTTPError:
            pass

Traceback (most recent call last):
File "main.py", line 38, in <module>
main = kwipe()
File "/home/pycoder/Desktop/kwipe/KWipe.py", line 49, in __init__
self.checkUpdate()
File "/home/pycoder/Desktop/kwipe/KWipe.py", line 206, in checkUpdate
<a href=http://2blabla.ch> http://2blabla.ch</a></center>''').format(version=new_version), QtGui.QMessageBox.Close)
AttributeError: 'QString' object has no attribute 'format'
Was genau ist also an dem Code falsch?
lunar

@AngelusNoctis Ich ging ob Deiner obigen Versuch davon aus, dass Du Python 3 benutzt, was offensichtlich nicht der Fall ist, ergo eben:

Code: Alles auswählen

unicode(self.tr('Spam with eggs in version {version}')).format(version=version)
Oder Du verwendest die von "QString" zur Verfügung gestellten Methoden:

Code: Alles auswählen

self.tr('Spam with eggs in version %1').arg(version)
Dazu würde ich im Kontext von Python allerdings nicht unbedingt raten.

Bei allem Respekt: Lese bitte die Fehlermeldung, und versuche sie zu verstehen anstatt einfach wahlfrei herumzuprobieren. Die Fehlermeldung ist deutlich genug, und das Wissen um "QString" gehört zu den essentiellen Grundlagen im Umgang mit PyQt. Ich gebe zu, dass mein Beitrag weder besonders präzise noch besonders umfangreich war, und dass ich nach der Python-Version hätte fragen müssen, doch ich erlaube mir auch, zumindest die absoluten Grundlagen – zu denen "QString" gehört – vorauszusetzen.
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

lunar hat geschrieben: Oder Du verwendest die von "QString" zur Verfügung gestellten Methoden:

Code: Alles auswählen

self.tr('Spam with eggs in version %1').arg(version)
Dazu würde ich im Kontext von Python allerdings nicht unbedingt raten.
QString.arg() hatte ich auch schon probiert, da klappte die Übersetzung auch nicht.

Ich hab die Meldung gelesen, aber wenn ihr mir sagt es geht so und bei mir gehts eben nicht post ich es halt und frage ;)


Edit: unicode().format() funktioniert, danke!
Antworten