Made ugettext* functions aliases of gettext*

Thanks Tim Graham for the review.
This commit is contained in:
Claude Paroz 2017-01-26 20:56:34 +01:00
parent 9e9e73735e
commit e34f4e6f87
5 changed files with 36 additions and 73 deletions

View File

@ -78,16 +78,16 @@ def gettext(message):
return _trans.gettext(message) return _trans.gettext(message)
# An alias since Django 2.0
ugettext = gettext
def ngettext(singular, plural, number): def ngettext(singular, plural, number):
return _trans.ngettext(singular, plural, number) return _trans.ngettext(singular, plural, number)
def ugettext(message): # An alias since Django 2.0
return _trans.ugettext(message) ungettext = ngettext
def ungettext(singular, plural, number):
return _trans.ungettext(singular, plural, number)
def pgettext(context, message): def pgettext(context, message):
@ -98,8 +98,7 @@ def npgettext(context, singular, plural, number):
return _trans.npgettext(context, singular, plural, number) return _trans.npgettext(context, singular, plural, number)
gettext_lazy = lazy(gettext, str) gettext_lazy = ugettext_lazy = lazy(gettext, str)
ugettext_lazy = lazy(ugettext, str)
pgettext_lazy = lazy(pgettext, str) pgettext_lazy = lazy(pgettext, str)
@ -148,8 +147,8 @@ def ngettext_lazy(singular, plural, number=None):
return lazy_number(ngettext, str, singular=singular, plural=plural, number=number) return lazy_number(ngettext, str, singular=singular, plural=plural, number=number)
def ungettext_lazy(singular, plural, number=None): # An alias since Django 2.0
return lazy_number(ungettext, str, singular=singular, plural=plural, number=number) ungettext_lazy = ngettext_lazy
def npgettext_lazy(context, singular, plural, number=None): def npgettext_lazy(context, singular, plural, number=None):

View File

@ -3,7 +3,13 @@
# settings.USE_I18N = False can use this module rather than trans_real.py. # settings.USE_I18N = False can use this module rather than trans_real.py.
from django.conf import settings from django.conf import settings
from django.utils.encoding import force_text
def gettext(message):
return message
gettext_noop = gettext_lazy = _ = gettext
def ngettext(singular, plural, number): def ngettext(singular, plural, number):
@ -15,16 +21,12 @@ def ngettext(singular, plural, number):
ngettext_lazy = ngettext ngettext_lazy = ngettext
def ungettext(singular, plural, number):
return force_text(ngettext(singular, plural, number))
def pgettext(context, message): def pgettext(context, message):
return ugettext(message) return gettext(message)
def npgettext(context, singular, plural, number): def npgettext(context, singular, plural, number):
return ungettext(singular, plural, number) return ngettext(singular, plural, number)
def activate(x): def activate(x):
@ -50,17 +52,6 @@ def check_for_language(x):
return True return True
def gettext(message):
return message
def ugettext(message):
return force_text(gettext(message))
gettext_noop = gettext_lazy = _ = gettext
def to_locale(language): def to_locale(language):
p = language.find('-') p = language.find('-')
if p >= 0: if p >= 0:

View File

@ -297,10 +297,9 @@ def catalog():
return _default return _default
def do_translate(message, translation_function): def gettext(message):
""" """
Translates 'message' using the given 'translation_function' name -- which Translate the 'message' string. It uses the current thread to find the
will be either gettext or ugettext. It uses the current thread to find the
translation object to use. If no current translation is activated, the translation object to use. If no current translation is activated, the
message will be run through the default translation object. message will be run through the default translation object.
""" """
@ -316,7 +315,7 @@ def do_translate(message, translation_function):
_default = _default or translation(settings.LANGUAGE_CODE) _default = _default or translation(settings.LANGUAGE_CODE)
translation_object = getattr(_active, "value", _default) translation_object = getattr(_active, "value", _default)
result = getattr(translation_object, translation_function)(eol_message) result = translation_object.gettext(eol_message)
if isinstance(message, SafeData): if isinstance(message, SafeData):
return mark_safe(result) return mark_safe(result)
@ -324,17 +323,9 @@ def do_translate(message, translation_function):
return result return result
def gettext(message):
"""Return a string of the translation of the message."""
return do_translate(message, 'gettext')
ugettext = gettext
def pgettext(context, message): def pgettext(context, message):
msg_with_ctxt = "%s%s%s" % (context, CONTEXT_SEPARATOR, message) msg_with_ctxt = "%s%s%s" % (context, CONTEXT_SEPARATOR, message)
result = ugettext(msg_with_ctxt) result = gettext(msg_with_ctxt)
if CONTEXT_SEPARATOR in result: if CONTEXT_SEPARATOR in result:
# Translation not found # Translation not found
# force str, because the lazy version expects str. # force str, because the lazy version expects str.
@ -371,17 +362,14 @@ def ngettext(singular, plural, number):
return do_ntranslate(singular, plural, number, 'ngettext') return do_ntranslate(singular, plural, number, 'ngettext')
ungettext = ngettext
def npgettext(context, singular, plural, number): def npgettext(context, singular, plural, number):
msgs_with_ctxt = ("%s%s%s" % (context, CONTEXT_SEPARATOR, singular), msgs_with_ctxt = ("%s%s%s" % (context, CONTEXT_SEPARATOR, singular),
"%s%s%s" % (context, CONTEXT_SEPARATOR, plural), "%s%s%s" % (context, CONTEXT_SEPARATOR, plural),
number) number)
result = ungettext(*msgs_with_ctxt) result = ngettext(*msgs_with_ctxt)
if CONTEXT_SEPARATOR in result: if CONTEXT_SEPARATOR in result:
# Translation not found # Translation not found
result = ungettext(singular, plural, number) result = ngettext(singular, plural, number)
return result return result

View File

@ -1011,10 +1011,11 @@ appropriate entities.
For a complete discussion on the usage of the following see the For a complete discussion on the usage of the following see the
:doc:`translation documentation </topics/i18n/translation>`. :doc:`translation documentation </topics/i18n/translation>`.
The ``u`` prefix on the functions below comes from a difference in Python 2
between unicode and bytestrings. If your code doesn't support Python 2, use the
functions without the ``u``.
.. function:: gettext(message) .. function:: gettext(message)
Translates ``message`` and returns it in a UTF-8 bytestring.
.. function:: ugettext(message) .. function:: ugettext(message)
Translates ``message`` and returns it as a string. Translates ``message`` and returns it as a string.
@ -1042,19 +1043,15 @@ For a complete discussion on the usage of the following see the
later. later.
.. function:: ngettext(singular, plural, number) .. function:: ngettext(singular, plural, number)
Translates ``singular`` and ``plural`` and returns the appropriate string
based on ``number`` in a UTF-8 bytestring.
.. function:: ungettext(singular, plural, number) .. function:: ungettext(singular, plural, number)
Translates ``singular`` and ``plural`` and returns the appropriate string Translates ``singular`` and ``plural`` and returns the appropriate string
based on ``number`` as a string. based on ``number``.
.. function:: npgettext(context, singular, plural, number) .. function:: npgettext(context, singular, plural, number)
Translates ``singular`` and ``plural`` and returns the appropriate string Translates ``singular`` and ``plural`` and returns the appropriate string
based on ``number`` and the ``context`` as a string. based on ``number`` and the ``context``.
.. function:: ngettext_lazy(singular, plural, number) .. function:: ngettext_lazy(singular, plural, number)
.. function:: ungettext_lazy(singular, plural, number) .. function:: ungettext_lazy(singular, plural, number)

View File

@ -52,6 +52,12 @@ Specify a translation string by using the function
:func:`~django.utils.translation.ugettext`. It's convention to import this :func:`~django.utils.translation.ugettext`. It's convention to import this
as a shorter alias, ``_``, to save typing. as a shorter alias, ``_``, to save typing.
.. note::
The ``u`` prefixing of ``gettext`` functions was originally to distinguish
usage between unicode strings and bytestrings on Python 2. For code that
supports only Python 3, they can be used interchangeably. A deprecation for
the prefixed functions may happen in a future Django release.
.. note:: .. note::
Python's standard library ``gettext`` module installs ``_()`` into the Python's standard library ``gettext`` module installs ``_()`` into the
global namespace, as an alias for ``gettext()``. In Django, we have chosen global namespace, as an alias for ``gettext()``. In Django, we have chosen
@ -428,24 +434,6 @@ strings before passing them to non-Django code::
requests.post('https://example.com/send', data={'body': str(body)}) requests.post('https://example.com/send', data={'body': str(body)})
If you try to use a ``ugettext_lazy()`` result where a bytestring (a
:class:`bytes` object) is expected, things won't work as expected since a
``ugettext_lazy()`` object doesn't know how to convert itself to a bytestring.
You can't use a string inside a bytestring, either, so this is consistent with
normal Python behavior. For example, putting a string proxy into a string is
fine::
"Hello %s" % ugettext_lazy("people")
But you can't insert a string into a bytestring and nor can you insert
a string proxy there::
b"Hello %s" % ugettext_lazy("people")
If you ever see output that looks like ``"hello
<django.utils.functional...>"``, you have tried to insert the result of
``ugettext_lazy()`` into a bytestring. That's a bug in your code.
If you don't like the long ``ugettext_lazy`` name, you can just alias it as If you don't like the long ``ugettext_lazy`` name, you can just alias it as
``_`` (underscore), like so:: ``_`` (underscore), like so::