diff options
| author | Alexandre Flament <alex@al-f.net> | 2023-02-20 12:17:38 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-20 12:17:38 +0100 |
| commit | d669da81fbe820df2d97c98560d00dee32979dc9 (patch) | |
| tree | 4cbaf3332893934640c8ff0724bcc2019b579618 /searx/search/__init__.py | |
| parent | 60e181607def7b48185728e1fd395c0036bd65fb (diff) | |
| parent | 0b1444b61eb12a2d23d4c95e2440f24161daaec7 (diff) | |
Merge pull request #2027 from dalf/fix_2018
Add "auto" as a language.
Diffstat (limited to 'searx/search/__init__.py')
| -rw-r--r-- | searx/search/__init__.py | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/searx/search/__init__.py b/searx/search/__init__.py index 9d337916c..c5f225aa4 100644 --- a/searx/search/__init__.py +++ b/searx/search/__init__.py @@ -3,10 +3,12 @@ # pylint: disable=missing-module-docstring, too-few-public-methods import threading +from copy import copy from timeit import default_timer from uuid import uuid4 import flask +import babel from searx import settings from searx.answerers import ask @@ -20,6 +22,7 @@ from searx.network import initialize as initialize_network, check_network_config from searx.metrics import initialize as initialize_metrics, counter_inc, histogram_observe_time from searx.search.processors import PROCESSORS, initialize as initialize_processors from searx.search.checker import initialize as initialize_checker +from searx.utils import detect_language logger = logger.getChild('search') @@ -37,18 +40,57 @@ def initialize(settings_engines=None, enable_checker=False, check_network=False, initialize_checker() +def replace_auto_language(search_query: SearchQuery): + """ + Do nothing except if `search_query.lang` is "auto". + In this case: + * the value "auto" is replaced by the detected language of the query. + The default value is "all" when no language is detected. + * `search_query.locale` is updated accordingly + + Use :py:obj:`searx.utils.detect_language` with `only_search_languages=True` to keep + only languages supported by the engines. + """ + if search_query.lang != 'auto': + return + + detected_lang = detect_language(search_query.query, threshold=0.0, only_search_languages=True) + if detected_lang is None: + # fallback to 'all' if no language has been detected + search_query.lang = 'all' + search_query.locale = None + return + search_query.lang = detected_lang + try: + search_query.locale = babel.Locale.parse(search_query.lang) + except babel.core.UnknownLocaleError: + search_query.locale = None + + class Search: """Search information container""" __slots__ = "search_query", "result_container", "start_time", "actual_timeout" def __init__(self, search_query: SearchQuery): + """Initialize the Search + + search_query is copied + """ # init vars super().__init__() - self.search_query = search_query self.result_container = ResultContainer() self.start_time = None self.actual_timeout = None + self.search_query = copy(search_query) + self.update_search_query(self.search_query) + + def update_search_query(self, search_query: SearchQuery): + """Update search_query. + + call replace_auto_language to replace the "auto" language + """ + replace_auto_language(search_query) def search_external_bang(self): """ |