diff --git a/CHANGELOG.txt b/CHANGELOG.txt index e4ec8d934..9e9d5d3c6 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -31,6 +31,7 @@ Changelog * Fix: Remove ASCII conversion from Postgres search backend, to support stemming in non-Latin alphabets (Pavel Denisov) * Fix: Prevent tab labels on page edit view from being cut off on very narrow screens (Kevin Howbrook) * Fix: Very long words in page listings are now broken where necessary (Kevin Howbrook) + * Fix: Language chosen in user preferences no longer persists on subsequent requests (Bojan Mihelac) 2.6.1 (05.08.2019) diff --git a/docs/releases/2.7.rst b/docs/releases/2.7.rst index c2991cb21..fc47f9a43 100644 --- a/docs/releases/2.7.rst +++ b/docs/releases/2.7.rst @@ -55,6 +55,7 @@ Bug fixes * Remove ASCII conversion from Postgres search backend, to support stemming in non-Latin alphabets (Pavel Denisov) * Prevent tab labels on page edit view from being cut off on very narrow screens (Kevin Howbrook) * Very long words in page listings are now broken where necessary (Kevin Howbrook) + * Language chosen in user preferences no longer persists on subsequent requests (Bojan Mihelac) Upgrade considerations diff --git a/wagtail/admin/auth.py b/wagtail/admin/auth.py index bad4198e5..f90a89ed4 100644 --- a/wagtail/admin/auth.py +++ b/wagtail/admin/auth.py @@ -7,8 +7,8 @@ from django.db.models import Q from django.shortcuts import redirect from django.urls import reverse from django.utils.timezone import activate as activate_tz -from django.utils.translation import activate as activate_lang from django.utils.translation import ugettext as _ +from django.utils.translation import override from wagtail.admin import messages from wagtail.core.models import GroupPagePermission @@ -154,13 +154,17 @@ def require_admin_access(view_func): return reject_request(request) if user.has_perms(['wagtailadmin.access_admin']): + preferred_language = None if hasattr(user, 'wagtail_userprofile'): - language = user.wagtail_userprofile.get_preferred_language() - l18n.set_language(language) - activate_lang(language) + preferred_language = user.wagtail_userprofile.get_preferred_language() + l18n.set_language(preferred_language) time_zone = user.wagtail_userprofile.get_current_time_zone() activate_tz(time_zone) - return view_func(request, *args, **kwargs) + if preferred_language: + with override(preferred_language): + return view_func(request, *args, **kwargs) + else: + return view_func(request, *args, **kwargs) if not request.is_ajax(): messages.error(request, _('You do not have permission to access the admin')) diff --git a/wagtail/admin/tests/test_account_management.py b/wagtail/admin/tests/test_account_management.py index ebb75e9fb..510930ecd 100644 --- a/wagtail/admin/tests/test_account_management.py +++ b/wagtail/admin/tests/test_account_management.py @@ -11,6 +11,7 @@ from django.contrib.auth.tokens import PasswordResetTokenGenerator from django.core import mail from django.test import TestCase, override_settings from django.urls import reverse +from django.utils.translation import get_language from wagtail.admin.locale import ( WAGTAILADMIN_PROVIDED_LANGUAGES, get_available_admin_languages, get_available_admin_time_zones) @@ -411,6 +412,15 @@ class TestAccountSection(TestCase, WagtailTestUtils): # Check that the current language is assumed as English self.assertEqual(profile.get_preferred_language(), "en") + def test_language_preferences_reapplies_original_language(self): + post_data = { + 'preferred_language': 'es' + } + response = self.client.post(reverse('wagtailadmin_account_language_preferences'), post_data) + self.assertRedirects(response, reverse('wagtailadmin_account')) + + self.assertEqual(get_language(), "en") + def test_change_name(self): """ This tests that the change name view responds with a change name page diff --git a/wagtail/admin/views/account.py b/wagtail/admin/views/account.py index 5bcfc36a2..5c0fa3593 100644 --- a/wagtail/admin/views/account.py +++ b/wagtail/admin/views/account.py @@ -7,7 +7,7 @@ from django.http import Http404 from django.shortcuts import redirect, render from django.urls import reverse, reverse_lazy from django.utils.translation import ugettext as _ -from django.utils.translation import activate +from django.utils.translation import override from wagtail.admin.forms.auth import LoginForm, PasswordResetForm from wagtail.core import hooks @@ -174,8 +174,8 @@ def language_preferences(request): user_profile = form.save() # This will set the language only for this request/thread # (so that the 'success' messages is in the right language) - activate(user_profile.get_preferred_language()) - messages.success(request, _("Your preferences have been updated.")) + with override(user_profile.get_preferred_language()): + messages.success(request, _("Your preferences have been updated.")) return redirect('wagtailadmin_account') else: form = PreferredLanguageForm(instance=UserProfile.get_for_user(request.user))