problem mixing gettext and properties

André andre.roberge at gmail.com
Tue Jun 26 16:46:27 EDT 2007


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!!!
>
> > > #  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) ?

André




More information about the Python-list mailing list