André wrote: > On Jun 26, 4:17 pm, André <[EMAIL PROTECTED]> wrote: >> On Jun 26, 3:56 pm, Peter Otten <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list