#35034: In some cases i18n set_language does not change url language
-------------------------------------+-------------------------------------
Reporter: EricSoroos | Owner: nobody
Type: Bug | Status: new
Component: | Version: 4.2
Internationalization |
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by EricSoroos:
Old description:
> Related to #29281, but this time with repro
>
> When posting to `/i18n/setlang/`:
> * with a referrer in a language that's not the current django cooke
> language like `/km/admin/foo/bar`,
> * with a current language cookie of `django_language=en`
> * and a post content of `next=&language=en`
>
> `django.urls.translate_urls` attempts to resolve the url using the
> current request language (in this case, en) and fails, because the url is
> in a different language (km).
>
> `i18n.set_language` then returns the original referrer in the location
> header of the redirect, and the language doesn't apparently change,
> confusing the user.
>
> The patch for `translate_urls` is approximately:
>
> {{{
> #!python
> from django.utils.translation import override, check_for_language,
> get_language_from_path
>
> ...
>
> def translate_url(url, lang_code):
> """
> Given a URL (absolute or relative), try to get its translated version
> in
> the `lang_code` language (either by i18n_patterns or by translated
> regex).
> Return the original URL if no translated version is found.
> """
> parsed = urlsplit(url)
> try:
> # URL may be encoded.
> try:
> match = resolve(unquote(parsed.path))
> except Resolver404:
> url_lang_code = get_language_from_path(unquote(parsed.path))
> if url_lang_code and check_for_language(url_lang_code):
> with override(url_lang_code):
> match = resolve(unquote(parsed.path))
> else:
> raise
> except Resolver404:
> pass
> else:
> ...
> }}}
>
> https://github.com/django/django/compare/main...EricSoroos:django:35034
> -translate-url
New description:
Related to #29281, but this time with repro. Possibly also related to
#26556.
When posting to `/i18n/setlang/`:
* with a referrer in a language that's not the current django cooke
language like `/km/admin/foo/bar`,
* with a current language cookie of `django_language=en`
* and a post content of `next=&language=en`
`django.urls.translate_urls` attempts to resolve the url using the current
request language (in this case, en) and fails, because the url is in a
different language (km).
`i18n.set_language` then returns the original referrer in the location
header of the redirect, and the language doesn't apparently change,
confusing the user.
The patch for `translate_urls` is approximately:
{{{
#!python
from django.utils.translation import override, check_for_language,
get_language_from_path
...
def translate_url(url, lang_code):
"""
Given a URL (absolute or relative), try to get its translated version
in
the `lang_code` language (either by i18n_patterns or by translated
regex).
Return the original URL if no translated version is found.
"""
parsed = urlsplit(url)
try:
# URL may be encoded.
try:
match = resolve(unquote(parsed.path))
except Resolver404:
url_lang_code = get_language_from_path(unquote(parsed.path))
if url_lang_code and check_for_language(url_lang_code):
with override(url_lang_code):
match = resolve(unquote(parsed.path))
else:
raise
except Resolver404:
pass
else:
...
}}}
https://github.com/django/django/compare/main...EricSoroos:django:35034
-translate-url
--
--
Ticket URL: <https://code.djangoproject.com/ticket/35034#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/0107018c642c01c9-018c935a-711c-4700-8419-eab9341bb366-000000%40eu-central-1.amazonses.com.