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"{translation['type']}"
+
+ for word in translation["list"]:
+ infobox += f"
- {word['word']}
"
+
+ for meaning in word["meanings"]:
+ infobox += f"- {meaning}
"
+
+ infobox += "
"
+
+ results.append(
+ {
+ 'infobox': result["translation"],
+ 'content': infobox,
+ }
+ )
+
+ return results
diff --git a/searx/settings.yml b/searx/settings.yml
index 3ecad0df5..a8ec798e7 100644
--- a/searx/settings.yml
+++ b/searx/settings.yml
@@ -886,6 +886,12 @@ engines:
shortcut: loc
categories: images
+ - name: lingva
+ engine: lingva
+ shortcut: lv
+ # set lingva instance in url, by default it will use the official instance
+ # url: https://lingva.ml
+
- name: lobste.rs
engine: xpath
search_url: https://lobste.rs/search?utf8=%E2%9C%93&q={query}&what=stories&order=relevance
diff --git a/searx/static/themes/simple/css/searxng-rtl.min.css b/searx/static/themes/simple/css/searxng-rtl.min.css
index 7b5b22312..8316845ee 100644
Binary files a/searx/static/themes/simple/css/searxng-rtl.min.css and b/searx/static/themes/simple/css/searxng-rtl.min.css differ
diff --git a/searx/static/themes/simple/css/searxng-rtl.min.css.map b/searx/static/themes/simple/css/searxng-rtl.min.css.map
index fc21e6b00..14dfe9afa 100644
Binary files a/searx/static/themes/simple/css/searxng-rtl.min.css.map and b/searx/static/themes/simple/css/searxng-rtl.min.css.map differ
diff --git a/searx/static/themes/simple/css/searxng.min.css b/searx/static/themes/simple/css/searxng.min.css
index 8f1754a11..aea16f74c 100644
Binary files a/searx/static/themes/simple/css/searxng.min.css and b/searx/static/themes/simple/css/searxng.min.css differ
diff --git a/searx/static/themes/simple/css/searxng.min.css.map b/searx/static/themes/simple/css/searxng.min.css.map
index fe5ba7368..4494b585c 100644
Binary files a/searx/static/themes/simple/css/searxng.min.css.map and b/searx/static/themes/simple/css/searxng.min.css.map differ
diff --git a/searx/static/themes/simple/src/less/style.less b/searx/static/themes/simple/src/less/style.less
index b97e113fe..11d2ef58d 100644
--- a/searx/static/themes/simple/src/less/style.less
+++ b/searx/static/themes/simple/src/less/style.less
@@ -594,24 +594,29 @@ article[data-vim-selected].category-social {
padding: 0;
}
- dl {
- margin: 0.5em 0;
- }
-
dt {
- display: inline;
- margin-top: 0.5em;
- .ltr-margin-right(0.25em);
- margin-bottom: 0.5em;
- .ltr-margin-left(0);
- padding: 0;
font-weight: bold;
}
- dd {
- display: inline;
- margin: 0.5em 0;
- padding: 0;
+ .attributes {
+ dl {
+ margin: 0.5em 0;
+ }
+
+ dt {
+ display: inline;
+ margin-top: 0.5em;
+ .ltr-margin-right(0.25em);
+ margin-bottom: 0.5em;
+ .ltr-margin-left(0);
+ padding: 0;
+ }
+
+ dd {
+ display: inline;
+ margin: 0.5em 0;
+ padding: 0;
+ }
}
input {