misc: fix selecting language from HTTP request header (#54297)
This commit is contained in:
parent
2f958d64f5
commit
c392804608
|
@ -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'
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue