[PyQt] i18n

Giovanni Bajo rasky at develer.com
Wed Feb 11 17:55:28 GMT 2009

On 2/11/2009 6:49 PM, David Boddie wrote:
> On Wednesday 11 February 2009, Giovanni Bajo wrote:
>> On 2/11/2009 6:24 PM, David Boddie wrote:
>>> To avoid problems, I have previously defined a helper method in subclasses
>>> where I thought it was necessary, like this:
>>> class ActionEditorWidget(QLabel):
>>>     def tr(self, text):
>>>         return qApp.translate("ActionEditorWidget", text)
>> I don't see what this code is supposed to help.
>> The problem at hand occurs when you use self.tr() in a class that you 
>> later inherit. I don't see how redefining tr() in the base class is 
>> going to help.
> Good point. Usually I don't use it at all, but I seem to remember that I
> wanted to enforce the C++ behaviour referred to in the Reference Guide:
> http://www.riverbankcomputing.com/static/Docs/PyQt4/pyqt4ref.html#differences-between-pyqt-and-qt

I see, but the enforcement does not happen with the code you showed us.

> If you want to use a different set of translations in the subclass, you'll
> get the behaviour you want by just calling self.tr() without creating any
> helper methods. You won't inherit any translations, though, or will you?

They are not, and that's the whole point. The bug is that shown in the 
link above: the *derived* class won't display the translated strings 
because those strings are bound to the base classe context.

In those cases (which, in my exprience, are not so common to call for 
the adoption of a different convention everywhere in the code), I simply 

    def hello(self):
        return self.tr("Hello")

into this:

    def hello(self):
        return qApp.translate("A", "Hello")

Oh, yeah, throw in some 5-6 useless characters somewhere if you object 
to star imports :), but my point stands: I suggest using self.tr() as a 
default, and turn to something else only where required.
Giovanni Bajo
Develer S.r.l.

More information about the PyQt mailing list