problem mixing gettext and properties

Peter Otten __peter__ at web.de
Tue Jun 26 22:55:08 CEST 2007


André wrote:

> On Jun 26, 4:17 pm, André <andre.robe... at gmail.com> wrote:
>> On Jun 26, 3:56 pm, Peter Otten <__pete... at web.de> wrote:
>>
>>
>>
>> > 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!!!_("HELP!")
>>
>> > > #  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
>>
>> Thanks, that works ... but,
> [snip...]
> One more question (back to the original) post.
> Why does
> i18n_test.help
> does the right thing
> but
> i18n_test.test.help_prop
> does not?   Both use _() ...
> 
> Is it because help = _(...) is defined at the module level but
> test.help_prop is defined locally, and that the lookup for _() is done
> first locally (finds nothing) and then globally (outside the module
> scope) ?

No, it has nothing to do with the scope. It is just that (assuming a
single-threaded environment)

help = _("Help me!") 

is evaluated once immediately after the install() call which sets
__builtin__._ to gettext().

i18n_test.test.help_prop on the other hand invokes __builtin__._() every
time, and because you implicitly set it to a string with

>>> i18n_test.help

you saw the exception.

Peter




More information about the Python-list mailing list