#19272 closed Bug (fixed)
gettext_lazy returns "unexpected type"
| Reported by: | Germano Gabbianelli | Owned by: | nobody |
|---|---|---|---|
| Component: | Translations | Version: | dev |
| Severity: | Release blocker | Keywords: | |
| Cc: | regression | Triage Stage: | Ready for checkin |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
>>> from django.utils.translation import gettext_lazy
>>> gettext_lazy("test").upper()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/tyrion/.virtualenvs/djangobug/src/django/django/utils/functional.py", line 121, in __wrapper__
raise TypeError("Lazy object returned unexpected type.")
TypeError: Lazy object returned unexpected type.
>>>
This is because gettext returns an unicode string, but gettext_lazy is defined as:
gettext_lazy = lazy(gettext, str)
>>> from django.utils.translation import gettext
>>> from django.utils.functional import lazy
>>> gettext("test")
u'test'
>>> gettext_lazy = lazy(gettext, unicode)
>>> gettext_lazy("test")
<django.utils.functional.__proxy__ object at 0x975cfec>
>>> _.upper()
u'TEST'
Attachments (1)
Change History (10)
comment:1 by , 13 years ago
| Cc: | added |
|---|---|
| Severity: | Normal → Release blocker |
| Triage Stage: | Unreviewed → Accepted |
comment:2 by , 13 years ago
| Has patch: | set |
|---|
comment:3 by , 13 years ago
| Triage Stage: | Accepted → Ready for checkin |
|---|
The patch looks good to me. (I didn't apply it or run the tests.)
comment:4 by , 13 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
comment:7 by , 12 years ago
| Resolution: | fixed |
|---|---|
| Status: | closed → new |
The issue still occurs with pgettext_lazy:
In [1]: from django.utils.translation import pgettext_lazy
In [2]: s = pgettext_lazy("a context", "foo bar") # using bytestring
In [3]: s.upper()
/usr/lib/python2.7/dist-packages/django/db/backends/sqlite3/base.py:53: RuntimeWarning: SQLite received a naive datetime (2014-04-29 12:18:28.940685) while time zone support is active.
RuntimeWarning)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 s.upper()
/usr/lib/python2.7/dist-packages/django/utils/functional.pyc in __wrapper__(self, *args, **kw)
121 if t in self.__dispatch:
122 return self.__dispatch[t][funcname](res, *args, **kw)
--> 123 raise TypeError("Lazy object returned unexpected type.")
124
125 if klass not in cls.__dispatch:
TypeError: Lazy object returned unexpected type.
In [4]: s = pgettext_lazy("a context", u"foo bar") # using unicode string
In [5]: s.upper()
Out[5]: u'FOO BAR'
comment:8 by , 12 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Please don't re-open a ticket that has been closed and fixed (the reported issue here is about gettext_lazy).
Open a new ticket that refers to this one for the pgettext_lazy issue by making sure to use formatting (wrap your code between {{{ and }}}).
You can go ahead and mark the ticket as an accepted bug from the beginning since I managed to reproduce with you provided test case.
I'm not a fan of non-unicode gettext calls, so my suggestion would be to replace it by
ugettext_lazy. However this is a regression and gettext_lazy should not transform the message to unicode on Python 2.