Commit 790a642a by Gregory Martin Committed by GitHub

Merge pull request #13441 from juananpe/honorbrowserdefinedlangs

Honor browser defined language preferences when possible
parents a42ebd9b 67d0245e
...@@ -39,9 +39,15 @@ class LanguagePreferenceMiddleware(object): ...@@ -39,9 +39,15 @@ class LanguagePreferenceMiddleware(object):
preferred_language = request.META.get('HTTP_ACCEPT_LANGUAGE', '') preferred_language = request.META.get('HTTP_ACCEPT_LANGUAGE', '')
lang_headers = [seq[0] for seq in parse_accept_lang_header(preferred_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. # Setting the session language to the browser language, if it is supported.
for browser_lang in lang_headers: for browser_lang in lang_headers:
if browser_lang in system_released_languages: if browser_lang in system_released_languages:
if request.session.get(LANGUAGE_SESSION_KEY, None) is None: pass
request.session[LANGUAGE_SESSION_KEY] = unicode(browser_lang) elif browser_lang in prefixes:
break 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
...@@ -100,3 +100,30 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -100,3 +100,30 @@ class TestUserPreferenceMiddleware(TestCase):
set_user_preference(self.user, LANGUAGE_KEY, 'eo') set_user_preference(self.user, LANGUAGE_KEY, 'eo')
self.middleware.process_request(self.request) self.middleware.process_request(self.request)
self.assertEqual(get_user_preference(self.request.user, LANGUAGE_KEY), None) 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'
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'
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment