Skip to content

Commit

Permalink
Patch #1349274: gettext.install() now optionally installs additional
Browse files Browse the repository at this point in the history
translation functions other than _() in the builtin namespace.
  • Loading branch information
birkenfeld committed Feb 19, 2006
1 parent e466217 commit 602b9ba
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 5 deletions.
19 changes: 17 additions & 2 deletions Doc/lib/libgettext.tex
Original file line number Diff line number Diff line change
Expand Up @@ -219,13 +219,16 @@ \subsection{Class-based API}
\end{funcdesc}

\begin{funcdesc}{install}{domain\optional{, localedir\optional{, unicode
\optional{, codeset}}}}
\optional{, codeset\optional{, names}}}}}
This installs the function \function{_} in Python's builtin namespace,
based on \var{domain}, \var{localedir}, and \var{codeset} which are
passed to the function \function{translation()}. The \var{unicode}
flag is passed to the resulting translation object's \method{install}
method.

For the \var{names} parameter, please see the description of the
translation object's \method{install} method.

As seen below, you usually mark the strings in your application that are
candidates for translation, by wrapping them in a call to the
\function{_()} function, like this:
Expand All @@ -239,6 +242,7 @@ \subsection{Class-based API}
of your application.

\versionchanged[Added the \var{codeset} parameter]{2.4}
\versionchanged[Added the \var{names} parameter]{2.5}
\end{funcdesc}

\subsubsection{The \class{NullTranslations} class}
Expand Down Expand Up @@ -332,12 +336,21 @@ \subsubsection{The \class{NullTranslations} class}
\versionadded{2.4}
\end{methoddesc}

\begin{methoddesc}[NullTranslations]{install}{\optional{unicode}}
\begin{methoddesc}[NullTranslations]{install}{\optional{unicode
\optional{, names}}}
If the \var{unicode} flag is false, this method installs
\method{self.gettext()} into the built-in namespace, binding it to
\samp{_}. If \var{unicode} is true, it binds \method{self.ugettext()}
instead. By default, \var{unicode} is false.

If the \var{names} parameter is given, it must be a sequence containing
the names of functions you want to install in the builtin namespace in
addition to \function{_()}. Supported names are \code{'gettext'} (bound
to \method{self.gettext()} or \method{self.ugettext()} according to the
\var{unicode} flag), \code{'ngettext'} (bound to \method{self.ngettext()}
or \method{self.ungettext()} according to the \var{unicode} flag),
\code{'lgettext'} and \code{'lngettext'}.

Note that this is only one way, albeit the most convenient way, to
make the \function{_} function available to your application. Because it
affects the entire application globally, and specifically the built-in
Expand All @@ -353,6 +366,8 @@ \subsubsection{The \class{NullTranslations} class}

This puts \function{_} only in the module's global namespace and so
only affects calls within this module.

\versionchanged[Added the \var{names} parameter]{2.5}
\end{methoddesc}

\subsubsection{The \class{GNUTranslations} class}
Expand Down
16 changes: 13 additions & 3 deletions Lib/gettext.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,9 +239,19 @@ def output_charset(self):
def set_output_charset(self, charset):
self._output_charset = charset

def install(self, unicode=False):
def install(self, unicode=False, names=None):
import __builtin__
__builtin__.__dict__['_'] = unicode and self.ugettext or self.gettext
if hasattr(names, "__contains__"):
if "gettext" in names:
__builtin__.__dict__['gettext'] = __builtin__.__dict__['_']
if "ngettext" in names:
__builtin__.__dict__['ngettext'] = (unicode and self.ungettext
or self.ngettext)
if "lgettext" in names:
__builtin__.__dict__['lgettext'] = self.lgettext
if "lngettext" in names:
__builtin__.__dict__['lngettext'] = self.lngettext


class GNUTranslations(NullTranslations):
Expand Down Expand Up @@ -479,9 +489,9 @@ def translation(domain, localedir=None, languages=None,
return result


def install(domain, localedir=None, unicode=False, codeset=None):
def install(domain, localedir=None, unicode=False, codeset=None, names=None):
t = translation(domain, localedir, fallback=True, codeset=codeset)
t.install(unicode)
t.install(unicode, names)



Expand Down
8 changes: 8 additions & 0 deletions Lib/test/test_gettext.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,14 @@ def test_the_alternative_interface(self):
# Try unicode return type
t.install(unicode=True)
eq(_('mullusk'), 'bacon')
# Test installation of other methods
import __builtin__
t.install(unicode=True, names=["gettext", "lgettext"])
eq(_, t.ugettext)
eq(__builtin__.gettext, t.ugettext)
eq(lgettext, t.lgettext)
del __builtin__.gettext
del __builtin__.lgettext


class GettextTestCase2(GettextBaseTest):
Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,9 @@ Extension Modules
Library
-------

- Patch #1349274: gettext.install() now optionally installs additional
translation functions other than _() in the builtin namespace.

- Patch #1337756: fileinput now accepts Unicode filenames.

- Patch #1373643: The chunk module can now read chunks larger than
Expand Down

0 comments on commit 602b9ba

Please sign in to comment.