diff --git a/django/test/utils.py b/django/test/utils.py index 60c67e1fc6..c6ca0eda6c 100644 --- a/django/test/utils.py +++ b/django/test/utils.py @@ -427,7 +427,6 @@ class TransRealMixin(object): trans_real._translations = {} trans_real._active = local() trans_real._default = None - trans_real._accepted = {} trans_real._checked_languages = {} def tearDown(self): diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py index b79af80dd1..c8476b2bef 100644 --- a/django/utils/translation/trans_real.py +++ b/django/utils/translation/trans_real.py @@ -11,6 +11,8 @@ from importlib import import_module from threading import local import warnings +from django.dispatch import receiver +from django.test.signals import setting_changed from django.utils.encoding import force_str, force_text from django.utils.functional import memoize from django.utils._os import upath @@ -47,6 +49,17 @@ accept_language_re = re.compile(r''' language_code_prefix_re = re.compile(r'^/([\w-]+)(/|$)') +@receiver(setting_changed) +def reset_cache(**kwargs): + """ + Reset global state when LANGUAGES setting has been changed, as some + languages should no longer be accepted. + """ + if kwargs['setting'] == 'LANGUAGES': + global _accepted + _accepted = {} + + def to_locale(language, to_lower=False): """ Turns a language name (en-us) into a locale name (en_US). If 'to_lower' is diff --git a/django/views/static.py b/django/views/static.py index e55f6a1234..2437a6e2cc 100644 --- a/django/views/static.py +++ b/django/views/static.py @@ -15,7 +15,7 @@ from django.http import (Http404, HttpResponse, HttpResponseRedirect, from django.template import loader, Template, Context, TemplateDoesNotExist from django.utils.http import http_date, parse_http_date from django.utils.six.moves.urllib.parse import unquote -from django.utils.translation import ugettext as _, ugettext_noop +from django.utils.translation import ugettext as _, ugettext_lazy def serve(request, path, document_root=None, show_indexes=False): """ @@ -93,7 +93,7 @@ DEFAULT_DIRECTORY_INDEX_TEMPLATE = """ """ -template_translatable = ugettext_noop("Index of %(directory)s") +template_translatable = ugettext_lazy("Index of %(directory)s") def directory_index(path, fullpath): try: diff --git a/tests/i18n/tests.py b/tests/i18n/tests.py index 0f9bf7e4ed..c16a5f7f47 100644 --- a/tests/i18n/tests.py +++ b/tests/i18n/tests.py @@ -940,6 +940,19 @@ class MiscTests(TransRealMixin, TestCase): self.assertEqual(t_plur.render(Context({'percent': 42, 'num': 1})), '%(percent)s% represents 1 object') self.assertEqual(t_plur.render(Context({'percent': 42, 'num': 4})), '%(percent)s% represents 4 objects') + def test_cache_resetting(self): + """ + #14170 after setting LANGUAGE, cache should be cleared and languages + previously valid should not be used. + """ + g = get_language_from_request + r = self.rf.get('/') + r.COOKIES = {} + r.META = {'HTTP_ACCEPT_LANGUAGE': 'pt-br'} + self.assertEqual('pt-br', g(r)) + with self.settings(LANGUAGES=(('en', 'English'),)): + self.assertNotEqual('pt-br', g(r)) + class ResolutionOrderI18NTests(TransRealMixin, TestCase):