diff options
author | ta <alt3753.7@gmail.com> | 2022-06-22 14:08:19 +0700 |
---|---|---|
committer | Markus Heiser <markus.heiser@darmarit.de> | 2022-07-04 19:06:45 +0200 |
commit | 14756a267444614dbed2c8a456ef088f2755198c (patch) | |
tree | e85c4e3fd1dfc1f60f81b647a6bf3b35ebdb02f1 /searx/engines/lingva.py | |
parent | 7a9beb4fa4c705c4871d753826a73ac2a4d7a423 (diff) | |
download | searxng-14756a267444614dbed2c8a456ef088f2755198c.tar.gz searxng-14756a267444614dbed2c8a456ef088f2755198c.zip |
[mod] Adds Lingva translate engine
Add the lingva engine (which grabs data from google translate). Results from
Lingva are added to the infobox results.
Diffstat (limited to 'searx/engines/lingva.py')
-rw-r--r-- | searx/engines/lingva.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/searx/engines/lingva.py b/searx/engines/lingva.py new file mode 100644 index 000000000..bf51b705e --- /dev/null +++ b/searx/engines/lingva.py @@ -0,0 +1,68 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# lint: pylint +"""Lingva (alternative Google Translate frontend)""" + +from json import loads + +about = { + "website": 'https://lingva.ml', + "wikidata_id": None, + "official_api_documentation": 'https://github.com/thedaviddelta/lingva-translate#public-apis', + "use_official_api": True, + "require_api_key": False, + "results": 'JSON', +} + +engine_type = 'online_dictionary' +categories = ['general'] + +url = "https://lingva.ml" +search_url = "{url}/api/v1/{from_lang}/{to_lang}/{query}" + + +def request(_query, params): + params['url'] = search_url.format( + url=url, from_lang=params['from_lang'][1], to_lang=params['to_lang'][1], query=params['query'] + ) + return params + + +def response(resp): + results = [] + + result = loads(resp.text) + info = result["info"] + from_to_prefix = "%s-%s " % (resp.search_params['from_lang'][1], resp.search_params['to_lang'][1]) + + if "typo" in info: + results.append({"suggestion": from_to_prefix + info["typo"]}) + + if 'definitions' in info: # pylint: disable=too-many-nested-blocks + for definition in info['definitions']: + if 'list' in definition: + for item in definition['list']: + if 'synonyms' in item: + for synonym in item['synonyms']: + results.append({"suggestion": from_to_prefix + synonym}) + + infobox = "" + + for translation in info["extraTranslations"]: + infobox += f"<b>{translation['type']}</b>" + + for word in translation["list"]: + infobox += f"<dl><dt>{word['word']}</dt>" + + for meaning in word["meanings"]: + infobox += f"<dd>{meaning}</dd>" + + infobox += "</dl>" + + results.append( + { + 'infobox': result["translation"], + 'content': infobox, + } + ) + + return results |