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 -- http://mail.python.org/mailman/listinfo/python-list