Commit 602b9ba6 authored by Georg Brandl's avatar Georg Brandl

Patch #1349274: gettext.install() now optionally installs additional

translation functions other than _() in the builtin namespace.
parent e466217a
...@@ -219,13 +219,16 @@ true. ...@@ -219,13 +219,16 @@ true.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{install}{domain\optional{, localedir\optional{, unicode \begin{funcdesc}{install}{domain\optional{, localedir\optional{, unicode
\optional{, codeset}}}} \optional{, codeset\optional{, names}}}}}
This installs the function \function{_} in Python's builtin namespace, This installs the function \function{_} in Python's builtin namespace,
based on \var{domain}, \var{localedir}, and \var{codeset} which are based on \var{domain}, \var{localedir}, and \var{codeset} which are
passed to the function \function{translation()}. The \var{unicode} passed to the function \function{translation()}. The \var{unicode}
flag is passed to the resulting translation object's \method{install} flag is passed to the resulting translation object's \method{install}
method. 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 As seen below, you usually mark the strings in your application that are
candidates for translation, by wrapping them in a call to the candidates for translation, by wrapping them in a call to the
\function{_()} function, like this: \function{_()} function, like this:
...@@ -239,6 +242,7 @@ Python's builtin namespace, so it is easily accessible in all modules ...@@ -239,6 +242,7 @@ Python's builtin namespace, so it is easily accessible in all modules
of your application. of your application.
\versionchanged[Added the \var{codeset} parameter]{2.4} \versionchanged[Added the \var{codeset} parameter]{2.4}
\versionchanged[Added the \var{names} parameter]{2.5}
\end{funcdesc} \end{funcdesc}
\subsubsection{The \class{NullTranslations} class} \subsubsection{The \class{NullTranslations} class}
...@@ -332,12 +336,21 @@ defines the encoding used to return translated messages. ...@@ -332,12 +336,21 @@ defines the encoding used to return translated messages.
\versionadded{2.4} \versionadded{2.4}
\end{methoddesc} \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 If the \var{unicode} flag is false, this method installs
\method{self.gettext()} into the built-in namespace, binding it to \method{self.gettext()} into the built-in namespace, binding it to
\samp{_}. If \var{unicode} is true, it binds \method{self.ugettext()} \samp{_}. If \var{unicode} is true, it binds \method{self.ugettext()}
instead. By default, \var{unicode} is false. 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 Note that this is only one way, albeit the most convenient way, to
make the \function{_} function available to your application. Because it make the \function{_} function available to your application. Because it
affects the entire application globally, and specifically the built-in affects the entire application globally, and specifically the built-in
...@@ -353,6 +366,8 @@ _ = t.gettext ...@@ -353,6 +366,8 @@ _ = t.gettext
This puts \function{_} only in the module's global namespace and so This puts \function{_} only in the module's global namespace and so
only affects calls within this module. only affects calls within this module.
\versionchanged[Added the \var{names} parameter]{2.5}
\end{methoddesc} \end{methoddesc}
\subsubsection{The \class{GNUTranslations} class} \subsubsection{The \class{GNUTranslations} class}
......
...@@ -239,9 +239,19 @@ class NullTranslations: ...@@ -239,9 +239,19 @@ class NullTranslations:
def set_output_charset(self, charset): def set_output_charset(self, charset):
self._output_charset = charset self._output_charset = charset
def install(self, unicode=False): def install(self, unicode=False, names=None):
import __builtin__ import __builtin__
__builtin__.__dict__['_'] = unicode and self.ugettext or self.gettext __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): class GNUTranslations(NullTranslations):
...@@ -479,9 +489,9 @@ def translation(domain, localedir=None, languages=None, ...@@ -479,9 +489,9 @@ def translation(domain, localedir=None, languages=None,
return result 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 = translation(domain, localedir, fallback=True, codeset=codeset)
t.install(unicode) t.install(unicode, names)
......
...@@ -145,6 +145,14 @@ trggrkg zrffntr pngnybt yvoenel.''') ...@@ -145,6 +145,14 @@ trggrkg zrffntr pngnybt yvoenel.''')
# Try unicode return type # Try unicode return type
t.install(unicode=True) t.install(unicode=True)
eq(_('mullusk'), 'bacon') 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): class GettextTestCase2(GettextBaseTest):
......
...@@ -366,6 +366,9 @@ Extension Modules ...@@ -366,6 +366,9 @@ Extension Modules
Library 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 #1337756: fileinput now accepts Unicode filenames.
- Patch #1373643: The chunk module can now read chunks larger than - Patch #1373643: The chunk module can now read chunks larger than
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment