Opened 4 years ago
Last modified 2 years ago
#32886 assigned Bug
Translation: clash between language cookie and i18n_patterns URLs
Reported by: | Seb G | Owned by: | Charlie Overton |
---|---|---|---|
Component: | Internationalization | Version: | 3.2 |
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 |
Pull Requests: | How to create a pull request | ||
Description ¶
Summary ¶
When using i18n_patterns
, language cookie is disregarded, even in non-i18n_patterns
views.
Description ¶
Given the following project urls.py
file:
from django.conf.urls.i18n import i18n_patterns from django.contrib import admin from django.urls import path, include urlpatterns = [ path("admin/", admin.site.urls), ] urlpatterns += i18n_patterns( path("app/", include("app.urls", namespace="app")), prefix_default_language=False, )
Browsing to /admin/
with a valid django_language
cookie whose value is fr
still returns an english-translated page.
This behavior seems to emerge from the LocaleMiddleware.process_request
method:
def process_request(self, request): urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) # This returns (True, False) because i18n_patterns are indeed used (albeit not on the requested route) i18n_patterns_used, prefixed_default_language = is_language_prefix_patterns_used(urlconf) # This returns "fr" as expected from the django_language cookie language = translation.get_language_from_request(request, check_path=i18n_patterns_used) # This returns None since, indeed, this route does not use i18n_patterns language_from_path = translation.get_language_from_path(request.path_info) # This test passes (somewhat unfortunately) if not language_from_path and i18n_patterns_used and not prefixed_default_language: # This gets executed and reverts language to default language (en) language = settings.LANGUAGE_CODE # "en" gets activated instead of "fr" translation.activate(language) request.LANGUAGE_CODE = translation.get_language()
Steps to reproduce ¶
Using the provided test project
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
- Browse to
/admin/
- Login as superuser
- Edit your own user to set its language to "fr". Verify that you now have a
django_language=fr
cookie - Browse to any admin page => not translated to "fr"
Expected behavior ¶
Cookie language should be respected on routes that do not use i18n_patterns. It is ok though that path language overrides cookie language on routes that do use i18n_patterns.
According to the ticket's flags, the next step(s) to move this issue forward are:
- To provide a patch by sending a pull request. Claim the ticket when you start working so that someone else doesn't duplicate effort. Before sending a pull request, review your work against the patch review checklist. Check the "Has patch" flag on the ticket after sending a pull request and include a link to the pull request in the ticket comment when making that update. The usual format is:
[https://github.com/django/django/pull/#### PR]
.
Change History (4)
by , 4 years ago
Attachment: | test_project.zip added |
---|
comment:1 by , 4 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:2 by , 4 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
I'll start working on this issue.
comment:3 by , 2 years ago
I've drafted something that I think will solve this issue:
https://github.com/django/django/pull/16142
Thanks for the well-prepared ticket.