misc: fix selecting language from HTTP request header (#54297)

This commit is contained in:
Frédéric Péters 2021-05-26 21:25:14 +02:00
parent 2f958d64f5
commit c392804608
2 changed files with 44 additions and 9 deletions

View File

@ -343,3 +343,35 @@ def test_clean_thumbnails():
pub.clean_thumbnails()
assert os.listdir(dirname) == ['a']
def test_get_site_language():
pub = create_temporary_pub()
# no request
pub.cfg['language'] = {'language': 'en'}
assert pub.get_site_language() == 'en'
pub.cfg['language'] = {'language': 'HTTP'}
assert pub.get_site_language() is None
req = get_request()
pub._set_request(req)
pub.cfg['language'] = {'language': 'en'}
assert pub.get_site_language() == 'en'
pub.cfg['language'] = {'language': 'fr'}
assert pub.get_site_language() == 'fr'
pub.cfg['language'] = {'language': 'HTTP'}
assert pub.get_site_language() is None
req.environ['HTTP_ACCEPT_LANGUAGE'] = 'fr,en;q=0.7,es;q=0.3'
assert pub.get_site_language() == 'fr'
req.environ['HTTP_ACCEPT_LANGUAGE'] = 'xy' # non-existing
assert pub.get_site_language() is None
req.environ['HTTP_ACCEPT_LANGUAGE'] = 'xy,fr,en;q=0.7,es;q=0.3'
assert pub.get_site_language() == 'fr'

View File

@ -352,7 +352,7 @@ class QommonPublisher(Publisher):
if request:
lang = request.language
else:
lang = self.get_site_language()
lang = self.get_site_language(request)
if lang is None or lang not in [x[0] for x in settings.LANGUAGES]:
lang = 'en'
translation.activate(lang)
@ -482,7 +482,7 @@ class QommonPublisher(Publisher):
self._http_adapter = None
request.language = self.get_site_language()
request.language = self.get_site_language(request)
self.install_lang(request)
self.init_publisher_substitutions(request)
@ -493,11 +493,12 @@ class QommonPublisher(Publisher):
for extra_source in self.extra_sources:
self.substitutions.feed(extra_source(self, request))
def get_site_language(self):
def get_site_language(self, request=None):
if request is None:
request = self.get_request()
lang = self.cfg.get('language', {}).get('language', None)
if lang == 'HTTP':
request = self.get_request()
if not request:
if request is None:
return None
lang = None
accepted_languages = request.get_header('Accept-Language')
@ -505,10 +506,12 @@ class QommonPublisher(Publisher):
accepted_languages = [x.strip() for x in accepted_languages.split(',')]
# forget about subtag and quality value
accepted_languages = [x.split('-')[0] for x in accepted_languages]
for l in accepted_languages:
if l in self.translations.keys():
return l
elif lang is None:
known_languages = [x[0] for x in settings.LANGUAGES]
for lang in accepted_languages:
if lang in known_languages:
return lang
lang = None
if lang is None:
default_locale = locale.getdefaultlocale()
if default_locale and default_locale[0]:
lang = default_locale[0].split('_')[0]