diff options
| author | Markus Heiser <markus.heiser@darmarIT.de> | 2023-04-25 15:46:26 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-25 15:46:26 +0200 |
| commit | 45529f51a11c30e484dcce566108681003ea076d (patch) | |
| tree | 38cbf0fddd3adcf85d67eceb97045605ba736fc0 /searx/webapp.py | |
| parent | 12df30070be65d655611365042cccb7dabc0cd5e (diff) | |
| parent | 8adbc4fcecd3c3acb50e719bfe3794615649c793 (diff) | |
Merge pull request #2347 from return42/mod-lang-detection
If language recognition fails use the Accept-Language
Diffstat (limited to 'searx/webapp.py')
| -rwxr-xr-x | searx/webapp.py | 39 |
1 files changed, 14 insertions, 25 deletions
diff --git a/searx/webapp.py b/searx/webapp.py index 388b28c38..79255652f 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -84,6 +84,7 @@ from searx.webutils import ( from searx.webadapter import ( get_search_query_from_webapp, get_selected_categories, + parse_lang, ) from searx.utils import ( html_to_text, @@ -96,6 +97,7 @@ from searx.plugins import Plugin, plugins, initialize as plugin_initialize from searx.plugins.oa_doi_rewrite import get_doi_resolver from searx.preferences import ( Preferences, + ClientPref, ValidationException, ) from searx.answerers import ( @@ -221,16 +223,9 @@ babel = Babel(app, locale_selector=get_locale) def _get_browser_language(req, lang_list): - for lang in req.headers.get("Accept-Language", "en").split(","): - if ';' in lang: - lang = lang.split(';')[0] - if '-' in lang: - lang_parts = lang.split('-') - lang = "{}-{}".format(lang_parts[0], lang_parts[-1].upper()) - locale = match_locale(lang, lang_list, fallback=None) - if locale is not None: - return locale - return 'en' + client = ClientPref.from_http_request(req) + locale = match_locale(client.locale_tag, lang_list, fallback='en') + return locale def _get_locale_rfc5646(locale): @@ -446,11 +441,7 @@ def render(template_name: str, **kwargs): kwargs['rtl'] = True if 'current_language' not in kwargs: - _locale = request.preferences.get_value('language') - if _locale in ('auto', 'all'): - kwargs['current_language'] = _locale - else: - kwargs['current_language'] = match_locale(_locale, settings['search']['languages']) + kwargs['current_language'] = parse_lang(request.preferences, {}, RawTextQuery('', [])) # values from settings kwargs['search_formats'] = [x for x in settings['search']['formats'] if x != 'html'] @@ -512,7 +503,10 @@ def pre_request(): request.timings = [] # pylint: disable=assigning-non-slot request.errors = [] # pylint: disable=assigning-non-slot - preferences = Preferences(themes, list(categories.keys()), engines, plugins) # pylint: disable=redefined-outer-name + client_pref = ClientPref.from_http_request(request) + # pylint: disable=redefined-outer-name + preferences = Preferences(themes, list(categories.keys()), engines, plugins, client_pref) + user_agent = request.headers.get('User-Agent', '').lower() if 'webkit' in user_agent and 'android' in user_agent: preferences.key_value_settings['method'].value = 'GET' @@ -681,7 +675,9 @@ def search(): raw_text_query = None result_container = None try: - search_query, raw_text_query, _, _ = get_search_query_from_webapp(request.preferences, request.form) + search_query, raw_text_query, _, _, selected_locale = get_search_query_from_webapp( + request.preferences, request.form + ) # search = Search(search_query) # without plugins search = SearchWithPlugins(search_query, request.user_plugins, request) # pylint: disable=redefined-outer-name @@ -812,13 +808,6 @@ def search(): ) ) - if search_query.lang in ('auto', 'all'): - current_language = search_query.lang - else: - current_language = match_locale( - search_query.lang, settings['search']['languages'], fallback=request.preferences.get_value("language") - ) - # search_query.lang contains the user choice (all, auto, en, ...) # when the user choice is "auto", search.search_query.lang contains the detected language # otherwise it is equals to search_query.lang @@ -841,7 +830,7 @@ def search(): result_container.unresponsive_engines ), current_locale = request.preferences.get_value("locale"), - current_language = current_language, + current_language = selected_locale, search_language = match_locale( search.search_query.lang, settings['search']['languages'], |