problem mixing gettext and properties

André andre.roberge at gmail.com
Tue Jun 26 21:17:54 CEST 2007


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, it brings many other "complications".   I
have multiple modules, and I want to be able to switch languages
easily.   Unless I am mistaken, if I do it with module-global aliases
instead, I will need to have something like

lang = {}
for code in ['en', 'fr', ...]:
   lang[code] = gettext.translation('i18n_test', './translations',
languages=[code])

def switch_language(code):
   ...
   import module1
   import module2
   ...
   module1._ = lang[code].gettext
   module2._ = lang[code].gettext
   ...

And I will need to make sure to keep track of all the modules that
require translation...  Is there an easier, less tedious way to do
this?

Am I missing something?

André




More information about the Python-list mailing list