|
@@ -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'],
|