One thing I see a lot of in professional Django is the importation of ugettext, Django's
internationalization library that leverages the GNU gettext project's toolkit for generating
translation catalogs. Laying the groundwork for translation is important to larger projects intended
for universal appeal. Because the underscore is a valid leading character in a function name in both
C and Python, it's also a valid function name in its own right, and gettext recognizes that single
function, _()
, as the wrapper for a string to be recorded in the translation catalog, and for that
string to be the "key" for translations into other languanges.
However, it gets a little old, after a while, typing in the same "import-as" string in module after module. So I decided, to heck with it, I'm just going to make the gettext function (or in Django's case, ugettext) absolutely everywhere:
<dfn><__init.py__>=</dfn>
from django.utils.translation import ugettext
import __builtin__
__builtin__.__dict__['_'] = ugettext
Put this into the init.py file in the root of your project (the same directory level as urls.py
and settings.py) and this installs _()
as a global reference into the current running python VM,
and now it's as universally available as int()
, map()
, or str()
.
This is, of course, controversial. Modifying the python global namespace to add a function can be
considered maintenance-hostile. But the gettext feature is so universal-- at least to me-- that
__init__.py
is where it belongs.