Clean up post-middleware language activation

See #161
This commit is contained in:
Klaas van Schelven
2025-08-28 13:17:19 +02:00
parent ef126814bf
commit 02c7c2e43d
2 changed files with 15 additions and 11 deletions

View File

@@ -150,17 +150,17 @@ def language_from_accept_language(request):
return settings.LANGUAGE_CODE
def get_chosen_language(request_user, request):
if request_user.is_authenticated and request_user.language != "auto":
return get_supported_language_variant(request_user.language, strict=False)
return language_from_accept_language(request)
class UserLanguageMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated and request.user.language != "auto":
normalized_explicit_lang = get_supported_language_variant(request.user.language, strict=False)
translation.activate(normalized_explicit_lang)
else:
auto_lang = language_from_accept_language(request)
translation.activate(auto_lang)
translation.activate(get_chosen_language(request.user, request))
response = self.get_response(request)
return response

View File

@@ -7,10 +7,12 @@ from django.http import Http404
from django.utils import timezone
from django.contrib import messages
from django.contrib.auth.decorators import login_required, user_passes_test
from django.utils.translation import gettext as _
from django.utils.translation import gettext as _
from django.utils import translation
from bugsink.app_settings import get_settings, CB_ANYBODY
from bugsink.decorators import atomic_for_request_method
from bugsink.middleware import get_chosen_language
from .forms import (
UserCreationForm, ResendConfirmationForm, RequestPasswordResetForm, SetPasswordForm, PreferencesForm, UserEditForm)
@@ -226,9 +228,11 @@ def preferences(request):
form = PreferencesForm(request.POST, instance=user)
if form.is_valid():
form.save()
from django.utils import translation
translation.activate(user.language if user.language != 'auto' else translation.get_language())
user = form.save()
# activate the selected language immediately for the Success message; we've already passed the middleware
# stage (which looked at the pre-change language), so we need to do this ourselves with the fresh value.
translation.activate(get_chosen_language(user, request))
messages.success(request, _("Updated preferences"))
return redirect('preferences')