#16449 closed Bug (worksforme)
i18n_pattern URLs reversed from shell and tests have incorrect language prefix
| Reported by: | Jakub Roztočil | Owned by: | nobody |
|---|---|---|---|
| Component: | Translations | Version: | dev |
| Severity: | Normal | Keywords: | urlconf, reverse, i18n_patterns, tests, shell |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I've been trying out the new i18n_patterns from trunk and have run into the following issue:
The django.core.urlresolvers.reverse() function always returns /en-us as the language prefix for i18n URLs when it is called from a shell session or tests. I don't have en-us in my settings.LANGUAGES so requests to such URLs result in 404s.
After some digging I've found out that the above is probably just a symptom of another issue which is that the language specified in settings.LANGUAGE_CODE isn't automatically activated for shell sessions and when running tests:
$ ./manage.py shell
>>> from django.conf import settings
>>> settings.LANGUAGE_CODE
'es'
>>> from django.utils import translation
>>> translation.get_language()
'en-us'
>>> from django.core.urlresolvers import reverse
>>> reverse('test')
'/en-us/'
I've also tried adding en-us as settings.LANGUAGE_CODE and to settings.LANGUAGES, after which I was able to run my tests, but there was another issue: the get_language_info template tag raises an exception when the language code is en-us, because it isn't defined in django.conf.locale.LANG_INFO:
$ ./manage.py shell
>>> from django.utils import translation
>>> translation.get_language_info('en-us')
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
django/utils/translation/__init__.pyc in get_language_info(lang_code)
165 from django.conf.locale import LANG_INFO
166 try:
167 return LANG_INFO[lang_code]
168 except KeyError:
--> 169 raise KeyError("Unknown language code %r." % lang_code)
KeyError: "Unknown language code 'en-us'."
Attachments (1)
Change History (4)
comment:1 by , 14 years ago
| Resolution: | → worksforme |
|---|---|
| Status: | new → closed |
comment:2 by , 14 years ago
Okay, thanks. It's actually documented here. I was looking at the documentation for LANGUAGE_CODE and i18n in general where it isn't mentioned (patch attached).
It's just a shame that the language gets deactivated already in BaseCommand and not only for the core/contrib commands that actually do create some database content. I find this exception unintuitive/inconsistent.
by , 14 years ago
| Attachment: | language-code-in-commands-note-ticket-16449.patch added |
|---|
comment:3 by , 13 years ago
I understand that some management commands need a neutral language, but it does not seem right that tests are run with a language code that is not the default language code of the project.
That has something to do with how the base management command sets the current language to
en-usby default, notsettings.LANGUAGE_CODE.See https://code.djangoproject.com/browser/django/trunk/django/core/management/base.py?rev=13993#L202 for the explanation.
Simply use
translation.activate(settings.LANGUAGE_CODE)or similar to enable the language you need before reversing the URL you want.