summaryrefslogtreecommitdiff
path: root/searx/engines
diff options
context:
space:
mode:
authorta <alt3753.7@gmail.com>2022-06-22 14:08:19 +0700
committerMarkus Heiser <markus.heiser@darmarit.de>2022-07-04 19:06:45 +0200
commit14756a267444614dbed2c8a456ef088f2755198c (patch)
treee85c4e3fd1dfc1f60f81b647a6bf3b35ebdb02f1 /searx/engines
parent7a9beb4fa4c705c4871d753826a73ac2a4d7a423 (diff)
downloadsearxng-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')
-rw-r--r--searx/engines/lingva.py68
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