From 83d91fa7ff48b1bef48862134f898ca9a9f66d06 Mon Sep 17 00:00:00 2001 From: Juanan Pereira Date: Wed, 14 Dec 2016 23:03:12 +0100 Subject: [PATCH] Honor browser defined language preferences when possible --- .../core/djangoapps/lang_pref/middleware.py | 12 ++++++--- .../lang_pref/tests/test_middleware.py | 27 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/openedx/core/djangoapps/lang_pref/middleware.py b/openedx/core/djangoapps/lang_pref/middleware.py index 685d94ff82..52362d9ad0 100644 --- a/openedx/core/djangoapps/lang_pref/middleware.py +++ b/openedx/core/djangoapps/lang_pref/middleware.py @@ -39,9 +39,15 @@ class LanguagePreferenceMiddleware(object): preferred_language = request.META.get('HTTP_ACCEPT_LANGUAGE', '') lang_headers = [seq[0] for seq in parse_accept_lang_header(preferred_language)] + prefixes = [prefix.split("-")[0] for prefix in system_released_languages] # Setting the session language to the browser language, if it is supported. for browser_lang in lang_headers: if browser_lang in system_released_languages: - if request.session.get(LANGUAGE_SESSION_KEY, None) is None: - request.session[LANGUAGE_SESSION_KEY] = unicode(browser_lang) - break + pass + elif browser_lang in prefixes: + browser_lang = system_released_languages[prefixes.index(browser_lang)] + else: + continue + if request.session.get(LANGUAGE_SESSION_KEY, None) is None: + request.session[LANGUAGE_SESSION_KEY] = unicode(browser_lang) + break diff --git a/openedx/core/djangoapps/lang_pref/tests/test_middleware.py b/openedx/core/djangoapps/lang_pref/tests/test_middleware.py index a622d8d890..d1b9a6d8b2 100644 --- a/openedx/core/djangoapps/lang_pref/tests/test_middleware.py +++ b/openedx/core/djangoapps/lang_pref/tests/test_middleware.py @@ -100,3 +100,30 @@ class TestUserPreferenceMiddleware(TestCase): set_user_preference(self.user, LANGUAGE_KEY, 'eo') self.middleware.process_request(self.request) self.assertEqual(get_user_preference(self.request.user, LANGUAGE_KEY), None) + + @mock.patch( + 'openedx.core.djangoapps.lang_pref.middleware.released_languages', + mock.Mock(return_value=[('eu-es', 'euskara (Espainia)'), ('en', 'english')]) + ) + def test_supported_browser_language_prefix_in_session(self): + """ + test: browser language should be set in user session if it's prefix is supported by system for + unathenticated users + """ + self.request.META['HTTP_ACCEPT_LANGUAGE'] = 'eu;q=1.0' # pylint: disable=no-member + self.request.user = self.anonymous_user + self.middleware.process_request(self.request) + self.assertEqual(self.request.session.get(LANGUAGE_SESSION_KEY), 'eu-es') # pylint: disable=no-member + + @mock.patch( + 'openedx.core.djangoapps.lang_pref.middleware.released_languages', + mock.Mock(return_value=[('en', 'english')]) + ) + def test_unsupported_browser_language_prefix(self): + """ + test: browser language should not be set in user session if it's prefix is not supported by system. + """ + self.request.META['HTTP_ACCEPT_LANGUAGE'] = 'eu;q=1.0' # pylint: disable=no-member + self.request.user = self.anonymous_user + self.middleware.process_request(self.request) + self.assertNotEqual(self.request.session.get(LANGUAGE_SESSION_KEY), 'eu-es') # pylint: disable=no-member