From c3928046082bd7de89b8e9a8c5fd4ed2d677da90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 26 May 2021 21:25:14 +0200 Subject: [PATCH] misc: fix selecting language from HTTP request header (#54297) --- tests/test_publisher.py | 32 ++++++++++++++++++++++++++++++++ wcs/qommon/publisher.py | 21 ++++++++++++--------- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/tests/test_publisher.py b/tests/test_publisher.py index a668ce366..ba836b80c 100644 --- a/tests/test_publisher.py +++ b/tests/test_publisher.py @@ -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' diff --git a/wcs/qommon/publisher.py b/wcs/qommon/publisher.py index a32a86a00..008b9b08b 100644 --- a/wcs/qommon/publisher.py +++ b/wcs/qommon/publisher.py @@ -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]