problem mixing gettext and properties
Peter Otten
__peter__ at web.de
Tue Jun 26 14:56:03 EDT 2007
André wrote:
> I've encountered a problem using gettext with properties while using a
> Python interpreter.
>
> Here's a simple program that illustrate the problem.
> ==============
> # i18n_test.py: test of gettext & properties
>
> import gettext
>
> fr = gettext.translation('i18n_test', './translations',
> languages=['fr'])
_ = fr.gettext # untested
> help = _("Help me!")
>
> class Test_i18n(object):
> def get(self):
> __help = _("HELP!")
> return __help
> help_prop = property(get, None, None, 'help')
>
> test = Test_i18n()
>
> print help
> print test.help_prop
> #### end of file
>
> To run the above program, you need to have the strings translated and
> the proper ".po" and ".mo" files created. (for those interested, I
> can send the whole lot in a zip file)
>
> If I run the program as is, the output is:
> Aidez-moi!
> AIDE!!!
>
> Ok, let's try with the Python interpreter:
>
> ActivePython 2.4.2 Build 248 (ActiveState Corp.) based on
> Python 2.4.2 (#67, Oct 30 2005, 16:11:18) [MSC v.1310 32 bit (Intel)]
> on win32
> Type "help", "copyright", "credits" or "license" for more information.
>>>> import i18n_test
> Aidez-moi!
> AIDE!!!
>
> # No surprise there so far.
>
>>>> print i18n_test.help
> Aidez-moi!
>>>> print i18n_test.test.help_prop
> AIDE!!!
>>>> i18n_test.help
> 'Aidez-moi!'
>
> # all of the above are as expected; now for the first surprise
>
>>>> i18n_test.test.help_prop
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "i18n_test.py", line 12, in get
> __help = _("HELP!")
> TypeError: 'str' object is not callable
>
> # and a second surprise where we try to repeat something that used to
> work
>
>>>> print i18n_test.test.help_prop
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "i18n_test.py", line 12, in get
> __help = _("HELP!")
> TypeError: 'str' object is not callable
>
> #=============
>
> Dare I say: "Help!" I really need to use the above at the
> interpreter prompt.
>
> André
The _ builtin is set to the result of the last expression evaluated by the
interpreter:
>>> for i in range(3):
... i
...
0
1
2
>>> _
2
>>> import __builtin__
>>> __builtin__._
2
Therefore you get a name clash with _() as an alias for gettext(). Use
module-global aliases instead, e. g.
_ = fr.gettext
in the above code.
Peter
More information about the Python-list
mailing list