Opened 10 years ago
Closed 6 years ago
#22900 closed Cleanup/optimization (fixed)
ugettext_lazy with arguments causes RuntimeError
Reported by: | Karmo Rosental | Owned by: | nobody |
---|---|---|---|
Component: | Documentation | Version: | 1.7 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
If I use arguments with translations I get RuntimeError.
help_text=_('e.g. %(foo)s or %(bar)s') % { 'foo': 'footxt', 'bar': 'bartxt'})
This code causes following error:
Traceback (most recent call last): File "./manage", line 13, in <module> django.setup() File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 21, in setup apps.populate(settings.INSTALLED_APPS) File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 106, in populate app_config.import_models(all_models) File "/usr/local/lib/python2.7/dist-packages/django/apps/config.py", line 190, in import_models self.models_module = import_module(models_module_name) File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module __import__(name) File "/home/karmo/Dev/project/api/models.py", line 205, in <module> class Test(Model): File "/home/karmo/Dev/project/api/models.py", line 222, in Test 'foo': 'footxt', 'bar': 'bartxt'}) File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 179, in __mod__ return six.text_type(self) % rhs File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 144, in __text_cast return func(*self.__args, **self.__kw) File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/__init__.py", line 83, in ugettext return _trans.ugettext(message) File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 317, in ugettext return do_translate(message, 'ugettext') File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 298, in do_translate _default = translation(settings.LANGUAGE_CODE) File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 201, in translation default_translation = _fetch(settings.LANGUAGE_CODE) File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 184, in _fetch for app_config in reversed(list(apps.get_app_configs())): File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 125, in get_app_configs self.check_ready() File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 119, in check_ready raise RuntimeError("App registry isn't ready yet.") RuntimeError: App registry isn't ready yet.
Seems it uses non-lazy ugettext in django/utils/translation/init.py.
If I remove dictionary from the end of _() then this error disappears.
I'm using Django 1.7b4.
Change History (8)
comment:1 by , 10 years ago
Keywords: | app-loading added |
---|
comment:2 by , 10 years ago
comment:3 by , 10 years ago
Component: | Translations → Internationalization |
---|---|
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → New feature |
This is expected behavior with the current implementation, the %
(mod) operator on lazy strings does produce the final string.
We might experiment with delaying the translation in this case and find out (a) if it's possible and (b) if the behavior change is not too much backwards incompatible.
At the very least, we could improve the documentation.
comment:4 by , 10 years ago
Keywords: | app-loading removed |
---|
This code was silently doing the wrong thing in Django < 1.7. Now it's failing loudly. That's an intended and documented consequence of the app-loading refactor.
comment:5 by , 10 years ago
Component: | Internationalization → Documentation |
---|---|
Type: | New feature → Cleanup/optimization |
Version: | 1.7-beta-2 → 1.7 |
comment:6 by , 8 years ago
Claude, do you think we need a documentation enhancement now that we have the "The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time." error message? If so, maybe you could suggest a location for that documentation and retitle the ticket to make it more suitable for beginners to contribute?
comment:7 by , 8 years ago
I think the section in https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#working-with-lazy-translation-objects will need to be updated, particularly after format_lazy
will be added (#26866 / #27067).
comment:8 by , 6 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
I guess that the format_lazy
addition in docs should now be sufficient.
Note this will raise a different message on master due to 9618d68b345fe69c787f8426b07e920e647e05f3.