Seite 1 von 1
self.tr() und dynamischer Text?
Verfasst: Montag 17. Dezember 2012, 16:57
von AngelusNoctis
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?
Re: self.tr() und dynamischer Text?
Verfasst: Montag 17. Dezember 2012, 17:13
von 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.
Re: self.tr() und dynamischer Text?
Verfasst: Montag 17. Dezember 2012, 17:14
von EmaNymton
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

Re: self.tr() und dynamischer Text?
Verfasst: Montag 17. Dezember 2012, 18:38
von AngelusNoctis
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?
Re: self.tr() und dynamischer Text?
Verfasst: Montag 17. Dezember 2012, 19:16
von 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:
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.
Re: self.tr() und dynamischer Text?
Verfasst: Montag 17. Dezember 2012, 19:20
von AngelusNoctis
lunar hat geschrieben:
Oder Du verwendest die von "QString" zur Verfügung gestellten Methoden:
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!