Merge remote-tracking branch 'refs/remotes/upstream/master'

This commit is contained in:
Sky Splash 2024-05-30 09:38:50 +02:00
commit b71882681d
195 changed files with 13720 additions and 2229 deletions

View file

@ -172,3 +172,4 @@ features or generally made searx better:
- Bernie Huang `<https://github.com/BernieHuang2008>`
- Austin Olacsi `<https://github.com/Austin-Olacsi>`
- @micsthepick
- Daniel Kukula `<https://github.com/dkuku>`

View file

@ -563,3 +563,7 @@ type.
* - source_code_url
- :py:class:`str`
- the location of the project's source code
* - links
- :py:class:`dict`
- additional links in the form of ``{'link_name': 'http://example.com'}``

View file

@ -0,0 +1,8 @@
.. _gitea engine:
=====
Gitea
=====
.. automodule:: searx.engines.gitea
:members:

View file

@ -17,7 +17,7 @@ If you don't trust anyone, you can set up your own, see :ref:`installation`.
- :ref:`no user tracking / no profiling <SearXNG protect privacy>`
- script & cookies are optional
- secure, encrypted connections
- :ref:`about 130 search engines <configured engines>`
- :ref:`about 200 search engines <configured engines>`
- `about 60 translations <https://translate.codeberg.org/projects/searxng/searxng/>`_
- about 100 `well maintained <https://uptime.searxng.org/>`__ instances on searx.space_
- :ref:`easy integration of search engines <demo online engine>`

View file

@ -0,0 +1,9 @@
.. _unit converter plugin:
=====================
Unit converter plugin
=====================
.. automodule:: searx.plugins.unit_converter
:members:

View file

@ -1,11 +1,11 @@
mock==5.1.0
nose2[coverage_plugin]==0.14.1
nose2[coverage_plugin]==0.14.2
cov-core==1.15.0
black==24.3.0
pylint==3.1.0
pylint==3.2.2
splinter==0.21.0
selenium==4.20.0
Pallets-Sphinx-Themes==2.1.2
selenium==4.21.0
Pallets-Sphinx-Themes==2.1.3
Sphinx<=7.1.2; python_version == '3.8'
Sphinx==7.3.7; python_version > '3.8'
sphinx-issues==4.1.0
@ -13,10 +13,13 @@ sphinx-jinja==2.0.2
sphinx-tabs==3.4.5
sphinxcontrib-programoutput==0.17
sphinx-autobuild==2021.3.14
sphinx-notfound-page==1.0.0
myst-parser==2.0.0
linuxdoc==20231020
sphinx-notfound-page==1.0.2
myst-parser==3.0.1
linuxdoc==20240509
aiounittest==1.4.2
yamllint==1.35.1
wlc==1.14
coloredlogs==15.0.1
docutils<=0.21; python_version == '3.8'
docutils>=0.21.2; python_version > '3.8'

View file

@ -1,10 +1,10 @@
certifi==2024.2.2
babel==2.14.0
babel==2.15.0
flask-babel==4.0.0
flask==3.0.3
jinja2==3.1.3
lxml==5.2.1
pygments==2.17.2
jinja2==3.1.4
lxml==5.2.2
pygments==2.18.0
python-dateutil==2.9.0.post0
pyyaml==6.0.1
httpx[http2]==0.24.1
@ -15,4 +15,4 @@ setproctitle==1.3.3
redis==5.0.4
markdown-it-py==3.0.0
fasttext-predict==0.9.2.2
pytomlpp==1.0.13
pytomlpp==1.0.13; python_version < '3.11'

View file

@ -13,7 +13,18 @@ import copy
import typing
import logging
import pathlib
import pytomlpp as toml
try:
import tomllib
pytomlpp = None
USE_TOMLLIB = True
except ImportError:
import pytomlpp
tomllib = None
USE_TOMLLIB = False
__all__ = ['Config', 'UNSET', 'SchemaIssue']
@ -61,7 +72,7 @@ class Config:
# init schema
log.debug("load schema file: %s", schema_file)
cfg = cls(cfg_schema=toml.load(schema_file), deprecated=deprecated)
cfg = cls(cfg_schema=toml_load(schema_file), deprecated=deprecated)
if not cfg_file.exists():
log.warning("missing config file: %s", cfg_file)
return cfg
@ -69,12 +80,7 @@ class Config:
# load configuration
log.debug("load config file: %s", cfg_file)
try:
upd_cfg = toml.load(cfg_file)
except toml.DecodeError as exc:
msg = str(exc).replace('\t', '').replace('\n', ' ')
log.error("%s: %s", cfg_file, msg)
raise
upd_cfg = toml_load(cfg_file)
is_valid, issue_list = cfg.validate(upd_cfg)
for msg in issue_list:
@ -176,6 +182,25 @@ class Config:
return getattr(m, name)
def toml_load(file_name):
if USE_TOMLLIB:
# Python >= 3.11
try:
with open(file_name, "rb") as f:
return tomllib.load(f)
except tomllib.TOMLDecodeError as exc:
msg = str(exc).replace('\t', '').replace('\n', ' ')
log.error("%s: %s", file_name, msg)
raise
# fallback to pytomlpp for Python < 3.11
try:
return pytomlpp.load(file_name)
except pytomlpp.DecodeError as exc:
msg = str(exc).replace('\t', '').replace('\n', ' ')
log.error("%s: %s", file_name, msg)
raise
# working with dictionaries

File diff suppressed because it is too large Load diff

View file

@ -569,6 +569,7 @@
"pl": "Dinar Bahrajnu",
"pt": "dinar bareinita",
"ru": "бахрейнский динар",
"sl": "bahrajnski dinar",
"sr": "бахреински динар",
"sv": "Bahrainsk dinar",
"ta": "பஹ்ரேன் தினார்",
@ -601,6 +602,7 @@
"pt": "Franco do Burúndi",
"ro": "franc burundez",
"ru": "бурундийский франк",
"sl": "burundijski frank",
"sr": "бурундски франак",
"sv": "Burundisk franc",
"ta": "புரூண்டி பிராங்க்",
@ -1461,6 +1463,7 @@
"eu": "Peso dominikar",
"fi": "Dominikaanisen tasavallan peso",
"fr": "peso dominicain",
"gl": "peso dominicano",
"he": "פסו דומיניקני",
"hr": "Dominikanski pezo",
"hu": "dominikai peso",
@ -1735,6 +1738,7 @@
"pt": "libra das Malvinas",
"ro": "Liră din Insulele Falkland",
"ru": "фунт Фолклендских островов",
"sl": "falklandski funt",
"sv": "Falklandspund",
"tr": "Falkland Adaları poundu",
"uk": "Фолклендський фунт"
@ -2116,9 +2120,9 @@
"ar": "جوردة هايتية",
"ca": "gourde",
"cs": "Haitský gourde",
"da": "Gourde",
"da": "gourde",
"de": "Gourde",
"en": "Gourde",
"en": "gourde",
"eo": "haitia gurdo",
"es": "gourde",
"eu": "Gourde",
@ -2127,20 +2131,20 @@
"he": "גורד",
"hr": "Haićanski gourd",
"hu": "haiti gourde",
"id": "Gourde Haiti",
"it": "Gourde haitiano",
"id": "gourde Haiti",
"it": "gourde haitiano",
"ja": "グールド",
"ko": "아이티 구르드",
"lt": "Gurdas",
"ms": "Gourde Haiti",
"ms": "gourde Haiti",
"nl": "Haïtiaanse gourde",
"pa": "ਹੈਤੀਆਈ ਗੂਰਦ",
"pl": "Gourde",
"pt": "Gourde",
"pl": "gourde",
"pt": "gourde",
"ru": "гаитянский гурд",
"sr": "хаићански гурд",
"sv": "Gourde",
"tr": "Gourde",
"sv": "gourde",
"tr": "gourde",
"uk": "Гаїтянський гурд"
},
"HUF": {
@ -2790,6 +2794,7 @@
"pl": "Dinar kuwejcki",
"pt": "dinar kuwaitiano",
"ru": "кувейтский динар",
"sl": "kuvajtski dinar",
"sr": "кувајтски динар",
"sv": "Kuwaitisk dinar",
"ta": "குவைத் தினார்",
@ -3665,7 +3670,7 @@
"oc": "Córdoba (moneda)",
"pa": "ਨਿਕਾਰਾਗੁਆਈ ਕੋਰਦੋਬਾ",
"pl": "Cordoba oro",
"pt": "Córdoba (moeda)",
"pt": "Córdoba",
"ro": "Córdoba",
"ru": "никарагуанская кордоба",
"sr": "никарагванска кордоба",
@ -3823,6 +3828,7 @@
"pl": "Rial omański",
"pt": "Rial omanense",
"ru": "оманский риал",
"sl": "omanski rial",
"sr": "омански ријал",
"sv": "Omansk rial",
"ta": "ஓமானி ரியால்",
@ -3924,6 +3930,7 @@
"pt": "Kina",
"ro": "Kina",
"ru": "Кина",
"sl": "kina",
"sr": "папуанска кина",
"sv": "Papuansk Kina",
"th": "กีนา",
@ -4324,6 +4331,7 @@
"bn": "সৌদি রিয়াল",
"ca": "riyal saudita",
"cs": "saúdský rijál",
"da": "Saudiske riyal",
"de": "Saudi-Rial",
"en": "Saudi riyal",
"eo": "sauda rialo",
@ -5734,7 +5742,7 @@
"ca": "rial iemenita",
"cs": "Jemenský rijál",
"de": "Jemen-Rial",
"en": "Yemeni rial",
"en": "rial",
"eo": "jemena rialo",
"es": "rial yemení",
"fi": "Jemenin rial",
@ -6278,6 +6286,7 @@
"bahraini dinar": "BHD",
"bahrainin dinaari": "BHD",
"bahrainsk dinar": "BHD",
"bahrajnski dinar": "BHD",
"bahrajnský dinár": "BHD",
"bahreini dinár": "BHD",
"bahreino dinaras": "BHD",
@ -6554,6 +6563,7 @@
"burundi frangı": "BIF",
"burundi frank": "BIF",
"burundian franc": "BIF",
"burundijski frank": "BIF",
"burundin frangi": "BIF",
"burundisk franc": "BIF",
"burundski franak": "BIF",
@ -7824,6 +7834,7 @@
"falklandin punta": "FKP",
"falklandska funta": "FKP",
"falklandská libra": "FKP",
"falklandski funt": "FKP",
"falklandspund": "FKP",
"fas dirhemi": "MAD",
"fbu": "BIF",
@ -9835,6 +9846,7 @@
"ny sol": "PEN",
"ny taiwan dollar": "TWD",
"nyderlandų antilų guldenas": "ANG",
"nytaiwanske dollar": "TWD",
"nyzeeländsk dollar": "NZD",
"nz$": "NZD",
"nzd": "NZD",
@ -9855,6 +9867,7 @@
"omanitische rial": "OMR",
"omano rialas": "OMR",
"omansk rial": "OMR",
"omanski rial": "OMR",
"omanski rijal": "OMR",
"ománi riál": "OMR",
"ománský rial": "OMR",
@ -10225,7 +10238,6 @@
"pound sudan selatan": "SSP",
"pound suriah": "SYP",
"pounds": "GBP",
"poundsterling": "GBP",
"põhja korea vonn": "KPW",
"põhja korea won": "KPW",
"põhja makedoonia denaar": "MKD",
@ -10325,6 +10337,7 @@
"rf.": "MVR",
"rial": [
"YER",
"OMR",
"SAR",
"IRR"
],
@ -10724,6 +10737,7 @@
"saudiarabisk rial": "SAR",
"saudijski rijal": "SAR",
"saudische riyal": "SAR",
"saudiske riyal": "SAR",
"saudo arabijos rialas": "SAR",
"saudski rial": "SAR",
"saúdský rijál": "SAR",

File diff suppressed because one or more lines are too long

View file

@ -1746,7 +1746,9 @@
"custom": {
"ui_lang": {
"ca": "ca",
"cs": "cs",
"de-DE": "de-de",
"el": "el",
"en-CA": "en-ca",
"en-GB": "en-gb",
"en-US": "en-us",
@ -1754,13 +1756,17 @@
"fi-FI": "fi-fi",
"fr-CA": "fr-ca",
"fr-FR": "fr-fr",
"hr": "hr",
"hu": "hu",
"it": "it",
"ja-JP": "ja-jp",
"nl": "nl",
"pl": "pl",
"pt-BR": "pt-br",
"ro": "ro",
"sq-AL": "sq-al",
"sw-KE": "sw-ke"
"sw-KE": "sw-ke",
"tr": "tr"
}
},
"data_type": "traits_v1",
@ -1821,7 +1827,9 @@
"custom": {
"ui_lang": {
"ca": "ca",
"cs": "cs",
"de-DE": "de-de",
"el": "el",
"en-CA": "en-ca",
"en-GB": "en-gb",
"en-US": "en-us",
@ -1829,13 +1837,17 @@
"fi-FI": "fi-fi",
"fr-CA": "fr-ca",
"fr-FR": "fr-fr",
"hr": "hr",
"hu": "hu",
"it": "it",
"ja-JP": "ja-jp",
"nl": "nl",
"pl": "pl",
"pt-BR": "pt-br",
"ro": "ro",
"sq-AL": "sq-al",
"sw-KE": "sw-ke"
"sw-KE": "sw-ke",
"tr": "tr"
}
},
"data_type": "traits_v1",
@ -1896,7 +1908,9 @@
"custom": {
"ui_lang": {
"ca": "ca",
"cs": "cs",
"de-DE": "de-de",
"el": "el",
"en-CA": "en-ca",
"en-GB": "en-gb",
"en-US": "en-us",
@ -1904,13 +1918,17 @@
"fi-FI": "fi-fi",
"fr-CA": "fr-ca",
"fr-FR": "fr-fr",
"hr": "hr",
"hu": "hu",
"it": "it",
"ja-JP": "ja-jp",
"nl": "nl",
"pl": "pl",
"pt-BR": "pt-br",
"ro": "ro",
"sq-AL": "sq-al",
"sw-KE": "sw-ke"
"sw-KE": "sw-ke",
"tr": "tr"
}
},
"data_type": "traits_v1",
@ -1971,7 +1989,9 @@
"custom": {
"ui_lang": {
"ca": "ca",
"cs": "cs",
"de-DE": "de-de",
"el": "el",
"en-CA": "en-ca",
"en-GB": "en-gb",
"en-US": "en-us",
@ -1979,13 +1999,17 @@
"fi-FI": "fi-fi",
"fr-CA": "fr-ca",
"fr-FR": "fr-fr",
"hr": "hr",
"hu": "hu",
"it": "it",
"ja-JP": "ja-jp",
"nl": "nl",
"pl": "pl",
"pt-BR": "pt-br",
"ro": "ro",
"sq-AL": "sq-al",
"sw-KE": "sw-ke"
"sw-KE": "sw-ke",
"tr": "tr"
}
},
"data_type": "traits_v1",
@ -6380,9 +6404,11 @@
"wo": "wolof",
"xh": "xhosa",
"yi": "yiddish",
"yo": "yoruba",
"yue": "cantonese",
"zh": "chinese",
"zh_Hans": "mandarin"
"zh_Hans": "mandarin",
"zu": "zulu"
},
"regions": {}
},
@ -6515,6 +6541,7 @@
"en-AU": "en_AU",
"en-CA": "en_CA",
"en-GB": "en-GB_GB",
"en-ID": "en_ID",
"en-IE": "en_IE",
"en-IN": "en_IN",
"en-MY": "en_MY",
@ -6745,6 +6772,7 @@
"din",
"diq",
"dsb",
"dtp",
"dty",
"dv",
"dz",
@ -7841,6 +7869,7 @@
"xh": "xhosa",
"yi": "yiddish",
"yo": "yoruba",
"za": "zhuang",
"zh": "chinese",
"zu": "zulu"
},

View file

@ -5,7 +5,7 @@
],
"ua": "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}",
"versions": [
"125.0",
"124.0"
"126.0",
"125.0"
]
}

View file

@ -1084,41 +1084,6 @@
"symbol": "cr",
"to_si_factor": null
},
"Q114002440": {
"si_name": null,
"symbol": "𒄀",
"to_si_factor": null
},
"Q114002534": {
"si_name": null,
"symbol": "𒃻",
"to_si_factor": null
},
"Q114002639": {
"si_name": null,
"symbol": "𒈨𒊑",
"to_si_factor": null
},
"Q114002796": {
"si_name": null,
"symbol": "𒂆",
"to_si_factor": null
},
"Q114002930": {
"si_name": null,
"symbol": "𒀺",
"to_si_factor": null
},
"Q114002955": {
"si_name": null,
"symbol": "𒀹𒃷",
"to_si_factor": null
},
"Q114002974": {
"si_name": null,
"symbol": "𒃷",
"to_si_factor": null
},
"Q1140444": {
"si_name": null,
"symbol": "Zb",
@ -1404,6 +1369,141 @@
"symbol": "cm H₂O",
"to_si_factor": 98.0665
},
"Q125387265": {
"si_name": "Q11574",
"symbol": "qs",
"to_si_factor": 1e-30
},
"Q125387281": {
"si_name": "Q11574",
"symbol": "rs",
"to_si_factor": 1e-27
},
"Q125389370": {
"si_name": "Q11579",
"symbol": "rK",
"to_si_factor": 1e-27
},
"Q125389387": {
"si_name": "Q11579",
"symbol": "qK",
"to_si_factor": 1e-30
},
"Q125389519": {
"si_name": "Q11579",
"symbol": "RK",
"to_si_factor": 1e+27
},
"Q125389534": {
"si_name": "Q11579",
"symbol": "QK",
"to_si_factor": 1e+30
},
"Q125390959": {
"si_name": "Q41509",
"symbol": "rmol",
"to_si_factor": 1e-27
},
"Q125390987": {
"si_name": "Q41509",
"symbol": "qmol",
"to_si_factor": 1e-30
},
"Q125392001": {
"si_name": "Q41509",
"symbol": "Rmol",
"to_si_factor": 1e+27
},
"Q125392014": {
"si_name": "Q41509",
"symbol": "Qmol",
"to_si_factor": 1e+30
},
"Q125470272": {
"si_name": "Q102573",
"symbol": "rBq",
"to_si_factor": 1e-27
},
"Q125470277": {
"si_name": "Q102573",
"symbol": "qBq",
"to_si_factor": 1e-30
},
"Q125470426": {
"si_name": "Q102573",
"symbol": "RBq",
"to_si_factor": 1e+27
},
"Q125470445": {
"si_name": "Q102573",
"symbol": "QBq",
"to_si_factor": 1e+30
},
"Q125470704": {
"si_name": "Q25406",
"symbol": "rC",
"to_si_factor": 1e-27
},
"Q125470716": {
"si_name": "Q25406",
"symbol": "qC",
"to_si_factor": 1e-30
},
"Q125471094": {
"si_name": "Q25406",
"symbol": "RC",
"to_si_factor": 1e+27
},
"Q125471109": {
"si_name": "Q25406",
"symbol": "QC",
"to_si_factor": 1e+30
},
"Q125471199": {
"si_name": null,
"symbol": "r°C",
"to_si_factor": null
},
"Q125471200": {
"si_name": null,
"symbol": "q°C",
"to_si_factor": null
},
"Q125471246": {
"si_name": null,
"symbol": "R°C",
"to_si_factor": null
},
"Q125471247": {
"si_name": null,
"symbol": "Q°C",
"to_si_factor": null
},
"Q125471334": {
"si_name": "Q131255",
"symbol": "rF",
"to_si_factor": 1e-27
},
"Q125471344": {
"si_name": "Q131255",
"symbol": "qF",
"to_si_factor": 1e-30
},
"Q125471409": {
"si_name": "Q131255",
"symbol": "RF",
"to_si_factor": 1e+27
},
"Q125471423": {
"si_name": "Q131255",
"symbol": "QF",
"to_si_factor": 1e+30
},
"Q125962250": {
"si_name": null,
"symbol": "Ry",
"to_si_factor": null
},
"Q12714022": {
"si_name": "Q11570",
"symbol": "cwt",
@ -4506,7 +4606,7 @@
},
"Q829073": {
"si_name": "Q33680",
"symbol": null,
"symbol": "\"",
"to_si_factor": 4.84813681109536e-06
},
"Q83216": {
@ -6274,4 +6374,4 @@
"symbol": "m Hg",
"to_si_factor": 133322.0
}
}
}

View file

@ -133,7 +133,7 @@ def _get_result(item):
'publisher': extract_text(eval_xpath(item, './/div[contains(@class, "text-sm")]')),
'authors': [extract_text(eval_xpath(item, './/div[contains(@class, "italic")]'))],
'content': extract_text(eval_xpath(item, './/div[contains(@class, "text-xs")]')),
'img_src': item.xpath('.//img/@src')[0],
'thumbnail': item.xpath('.//img/@src')[0],
}

View file

@ -53,8 +53,8 @@ def response(resp):
url = base_url + link.attrib.get('href') + '#downloads'
title = extract_text(link)
img_src = base_url + eval_xpath_getindex(result, './/img/@src', 0)
res = {'url': url, 'title': title, 'img_src': img_src}
thumbnail = base_url + eval_xpath_getindex(result, './/img/@src', 0)
res = {'url': url, 'title': title, 'thumbnail': thumbnail}
results.append(res)

View file

@ -47,7 +47,7 @@ def response(resp):
'url': result['trackViewUrl'],
'title': result['trackName'],
'content': result['description'],
'img_src': result['artworkUrl100'],
'thumbnail': result['artworkUrl100'],
'publishedDate': parse(result['currentVersionReleaseDate']),
'author': result['sellerName'],
}

View file

@ -66,7 +66,7 @@ def response(resp):
"title": item['title'],
"content": item['abstract'],
"publishedDate": pubdate_original,
# "img_src": item.get('image_url') or None, # these are not thumbs / to large
# "thumbnail": item.get('image_url') or None, # these are not thumbs / to large
"metadata": ' | '.join(metadata),
}
)

View file

@ -68,7 +68,7 @@ def response(resp):
thumbnail = result.xpath('.//div[@class="art"]/img/@src')
if thumbnail:
new_result['img_src'] = thumbnail[0]
new_result['thumbnail'] = thumbnail[0]
result_id = parse_qs(urlparse(link.get('href')).query)["search_item_id"][0]
itemtype = extract_text(result.xpath('.//div[@class="itemtype"]')).lower()

View file

@ -80,8 +80,10 @@ def response(resp):
for entry in search_results.xpath('./result/doc'):
content = "No description available"
url = ""
title = ""
date = datetime.now() # needed in case no dcdate is available for an item
for item in entry:
if item.attrib["name"] == "dcdate":
date = item.text

View file

@ -130,7 +130,7 @@ def response(resp):
'url': url,
'title': title,
'content': content,
'img_src': thumbnail,
'thumbnail': thumbnail,
'metadata': metadata,
}
)

View file

@ -40,9 +40,9 @@ def response(resp):
json_resp = resp.json()
for result in json_resp['teaser']:
img_src = None
thumbnail = None
if result['teaser']['image']:
img_src = base_url + result['teaser']['image']['sources'][-1]['url']
thumbnail = base_url + result['teaser']['image']['sources'][-1]['url']
metadata = result['extension']['overline']
authors = ', '.join(author['name'] for author in result['extension'].get('authors', []))
@ -58,7 +58,7 @@ def response(resp):
'url': base_url + result['teaser']['link']['url'],
'title': result['teaser']['title'],
'content': result['teaser']['text'],
'img_src': img_src,
'thumbnail': thumbnail,
'publishedDate': publishedDate,
'metadata': metadata,
}

View file

@ -132,6 +132,7 @@ from lxml import html
from searx import locales
from searx.utils import (
extract_text,
extr,
eval_xpath,
eval_xpath_list,
eval_xpath_getindex,
@ -252,11 +253,7 @@ def response(resp):
if brave_category in ('search', 'goggles'):
return _parse_search(resp)
datastr = ""
for line in resp.text.split("\n"):
if "const data = " in line:
datastr = line.replace("const data = ", "").strip()[:-1]
break
datastr = extr(resp.text, "const data = ", ";\n").strip()
json_data = js_variable_to_python(datastr)
json_resp = json_data[1]['data']['body']['response']
@ -296,14 +293,14 @@ def _parse_search(resp):
content_tag = eval_xpath_getindex(result, './/div[contains(@class, "snippet-description")]', 0, default='')
pub_date_raw = eval_xpath(result, 'substring-before(.//div[contains(@class, "snippet-description")], "-")')
img_src = eval_xpath_getindex(result, './/img[contains(@class, "thumb")]/@src', 0, default='')
thumbnail = eval_xpath_getindex(result, './/img[contains(@class, "thumb")]/@src', 0, default='')
item = {
'url': url,
'title': extract_text(title_tag),
'content': extract_text(content_tag),
'publishedDate': _extract_published_date(pub_date_raw),
'img_src': img_src,
'thumbnail': thumbnail,
}
video_tag = eval_xpath_getindex(
@ -324,7 +321,7 @@ def _parse_search(resp):
)
item['publishedDate'] = _extract_published_date(pub_date_raw)
else:
item['img_src'] = eval_xpath_getindex(video_tag, './/img/@src', 0, default='')
item['thumbnail'] = eval_xpath_getindex(video_tag, './/img/@src', 0, default='')
result_list.append(item)
@ -351,7 +348,7 @@ def _parse_news(json_resp):
'publishedDate': _extract_published_date(result['age']),
}
if result['thumbnail'] is not None:
item['img_src'] = result['thumbnail']['src']
item['thumbnail'] = result['thumbnail']['src']
result_list.append(item)
return result_list

View file

@ -46,23 +46,20 @@ def response(resp):
if recipe['submissionDate']:
publishedDate = datetime.strptime(result['recipe']['submissionDate'][:19], "%Y-%m-%dT%H:%M:%S")
content = (
"difficulity: "
+ str(recipe['difficulty'])
+ " / preparation time: "
+ str(recipe['preparationTime'])
+ "min / ingredient count: "
+ str(recipe['ingredientCount'])
)
content = [
f"Schwierigkeitsstufe (1-3): {recipe['difficulty']}",
f"Zubereitungszeit: {recipe['preparationTime']}min",
f"Anzahl der Zutaten: {recipe['ingredientCount']}",
]
if recipe['subtitle']:
content = f"{recipe['subtitle']} / {content}"
content.insert(0, recipe['subtitle'])
results.append(
{
'url': recipe['siteUrl'],
'title': recipe['title'],
'content': content,
'content': " | ".join(content),
'thumbnail': recipe['previewImageUrlTemplate'].replace("<format>", thumbnail_format),
'publishedDate': publishedDate,
}

70
searx/engines/crates.py Normal file
View file

@ -0,0 +1,70 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Cargo search on crates.io"""
from collections import OrderedDict
from urllib.parse import urlencode
from dateutil import parser
about = {
"website": "https://crates.io/",
"wikidata_id": None,
"official_api_documentation": "https://crates.io/data-access",
"use_official_api": True,
"require_api_key": False,
"results": "JSON",
}
categories = ["it", "packages", "cargo"]
# engine dependent config
paging = True
page_size = 10
search_url = "https://crates.io/api/v1/crates"
linked_terms = OrderedDict(
[
("homepage", "Project homepage"),
("documentation", "Documentation"),
("repository", "Source code"),
]
)
def request(query: str, params):
args = urlencode({"page": params["pageno"], "q": query, "per_page": page_size})
params["url"] = f"{search_url}?{args}"
return params
def response(resp):
results = []
for package in resp.json()["crates"]:
published_date = package.get("updated_at")
published_date = parser.parse(published_date)
links = {}
for k, v in linked_terms.items():
l = package.get(k)
if l:
links[v] = l
results.append(
{
"template": "packages.html",
"url": f'https://crates.io/crates/{package["name"]}',
"title": package["name"],
"package_name": package["name"],
"tags": package["keywords"],
"content": package["description"],
"version": package["newest_version"] or package["max_version"] or package["max_stable_version"],
"publishedDate": published_date,
"links": links,
}
)
return results

View file

@ -47,7 +47,7 @@ def response(resp):
'url': base_url + ("_/" if is_official else "r/") + item.get("slug", ""),
'title': item.get("name"),
'content': item.get("short_description"),
'img_src': item["logo_url"].get("large") or item["logo_url"].get("small"),
'thumbnail': item["logo_url"].get("large") or item["logo_url"].get("small"),
'package_name': item.get("name"),
'maintainer': item["publisher"].get("name"),
'publishedDate': parser.parse(item.get("updated_at") or item.get("created_at")),

View file

@ -328,6 +328,19 @@ def response(resp):
len_tr_rows = len(tr_rows)
offset = 0
zero_click_info_xpath = '//html/body/form/div/table[2]/tr[2]/td/text()'
zero_click = extract_text(eval_xpath(doc, zero_click_info_xpath)).strip()
if zero_click and "Your IP address is" not in zero_click:
current_query = resp.search_params["data"].get("q")
results.append(
{
'answer': zero_click,
'url': "https://duckduckgo.com/?" + urlencode({"q": current_query}),
}
)
while len_tr_rows >= offset + 4:
# assemble table rows we need to scrap
@ -379,7 +392,9 @@ def fetch_traits(engine_traits: EngineTraits):
SearXNG's locale.
"""
# pylint: disable=too-many-branches, too-many-statements
# pylint: disable=too-many-branches, too-many-statements, disable=import-outside-toplevel
from searx.utils import extr, js_variable_to_python
# fetch regions
engine_traits.all_locale = 'wt-wt'
@ -390,11 +405,9 @@ def fetch_traits(engine_traits: EngineTraits):
if not resp.ok: # type: ignore
print("ERROR: response from DuckDuckGo is not OK.")
pos = resp.text.find('regions:{') + 8 # type: ignore
js_code = resp.text[pos:] # type: ignore
pos = js_code.find('}') + 1
regions = json.loads(js_code[:pos])
js_code = extr(resp.text, 'regions:', ',snippetLengths')
regions = json.loads(js_code)
for eng_tag, name in regions.items():
if eng_tag == 'wt-wt':
@ -426,12 +439,9 @@ def fetch_traits(engine_traits: EngineTraits):
engine_traits.custom['lang_region'] = {}
pos = resp.text.find('languages:{') + 10 # type: ignore
js_code = resp.text[pos:] # type: ignore
pos = js_code.find('}') + 1
js_code = '{"' + js_code[1:pos].replace(':', '":').replace(',', ',"')
languages = json.loads(js_code)
js_code = extr(resp.text, 'languages:', ',regions')
languages = js_variable_to_python(js_code)
for eng_lang, name in languages.items():
if eng_lang == 'wt_WT':

View file

@ -47,8 +47,8 @@ def response(resp):
+ ' - '
+ extract_text(app.xpath('./div/div/span[@class="package-license"]')).strip()
)
app_img_src = app.xpath('./img[@class="package-icon"]/@src')[0]
thumbnail = app.xpath('./img[@class="package-icon"]/@src')[0]
results.append({'url': app_url, 'title': app_title, 'content': app_content, 'img_src': app_img_src})
results.append({'url': app_url, 'title': app_title, 'content': app_content, 'thumbnail': thumbnail})
return results

View file

@ -0,0 +1,54 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""FindThatMeme (Images)"""
from json import dumps
from datetime import datetime
from searx.utils import humanize_bytes
about = {
"website": 'https://findthatmeme.com',
"official_api_documentation": None,
"use_official_api": False,
"require_api_key": False,
"results": "JSON",
}
base_url = "https://findthatmeme.com/api/v1/search"
categories = ['images']
paging = True
def request(query, params):
start_index = (params["pageno"] - 1) * 50
data = {"search": query, "offset": start_index}
params["url"] = base_url
params["method"] = 'POST'
params['headers']['content-type'] = "application/json"
params['data'] = dumps(data)
return params
def response(resp):
search_res = resp.json()
results = []
for item in search_res:
img = 'https://findthatmeme.us-southeast-1.linodeobjects.com/' + item['image_path']
thumb = 'https://findthatmeme.us-southeast-1.linodeobjects.com/thumb/' + item.get('thumbnail', '')
date = datetime.strptime(item["updated_at"].split("T")[0], "%Y-%m-%d")
formatted_date = datetime.utcfromtimestamp(date.timestamp())
results.append(
{
'url': item['source_page_url'],
'title': item['source_site'],
'img_src': img if item['type'] == 'IMAGE' else thumb,
'filesize': humanize_bytes(item['meme_file_size']),
'publishedDate': formatted_date,
'template': 'images.html',
}
)
return results

View file

@ -50,7 +50,7 @@ def parse_lyric(hit):
'url': hit['result']['url'],
'title': hit['result']['full_title'],
'content': content,
'img_src': hit['result']['song_art_image_thumbnail_url'],
'thumbnail': hit['result']['song_art_image_thumbnail_url'],
}
if timestamp:
result.update({'publishedDate': datetime.fromtimestamp(timestamp)})
@ -68,7 +68,7 @@ def parse_artist(hit):
'url': hit['result']['url'],
'title': hit['result']['name'],
'content': '',
'img_src': hit['result']['image_url'],
'thumbnail': hit['result']['image_url'],
}
return result
@ -84,7 +84,7 @@ def parse_album(hit):
return {
'url': res['url'],
'title': res['full_title'],
'img_src': res['cover_art_url'],
'thumbnail': res['cover_art_url'],
'content': content.strip(),
}

109
searx/engines/gitea.py Normal file
View file

@ -0,0 +1,109 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Engine to search in collaborative software platforms based on Gitea_.
.. _Gitea: https://about.gitea.com/
Configuration
=============
The engine has the following mandatory setting:
- :py:obj:`base_url`
Optional settings are:
- :py:obj:`sort`
- :py:obj:`order`
- :py:obj:`page_size`
.. code:: yaml
- name: gitea.com
engine: gitea
base_url: https://gitea.com
shortcut: gitea
If you would like to use additional instances, just configure new engines in the
:ref:`settings <settings engine>` and set the ``base_url``.
Implementation
==============
"""
from urllib.parse import urlencode
from dateutil import parser
about = {
"website": 'https://about.gitea.com',
"wikidata_id": None,
"official_api_documentation": 'https://docs.gitea.com/next/development/api-usage',
"use_official_api": True,
"require_api_key": False,
"results": 'JSON',
}
categories = ['it', 'repos']
paging = True
base_url: str = ''
"""URL of the Gitea_ instance."""
sort: str = "updated"
"""Sort criteria, possible values:
- ``updated`` (default)
- ``alpha``
- ``created``
- ``size``
- ``id``
"""
order = "desc"
"""Sort order, possible values:
- ``desc`` (default)
- ``asc``
"""
page_size: int = 10
"""Maximum number of results per page (default 10)."""
def init(_):
if not base_url:
raise ValueError('gitea engine: base_url is unset')
def request(query, params):
args = {'q': query, 'limit': page_size, 'sort': sort, 'order': order, 'page': params['pageno']}
params['url'] = f"{base_url}/api/v1/repos/search?{urlencode(args)}"
return params
def response(resp):
results = []
for item in resp.json().get('data', []):
content = [item.get(i) for i in ['language', 'description'] if item.get(i)]
results.append(
{
'template': 'packages.html',
'url': item.get('html_url'),
'title': item.get('full_name'),
'content': ' / '.join(content),
'img_src': item.get('owner', {}).get('avatar_url'),
'package_name': item.get('name'),
'maintainer': item.get('owner', {}).get('login'),
'publishedDate': parser.parse(item.get("updated_at") or item.get("created_at")),
'tags': item.get('topics', []),
'popularity': item.get('stargazers_count'),
'homepage': item.get('homepage'),
'source_code_url': item.get('clone_url'),
}
)
return results

View file

@ -50,7 +50,7 @@ def response(resp):
'url': item.get('html_url'),
'title': item.get('full_name'),
'content': ' / '.join(content),
'img_src': item.get('owner', {}).get('avatar_url'),
'thumbnail': item.get('owner', {}).get('avatar_url'),
'package_name': item.get('name'),
# 'version': item.get('updated_at'),
'maintainer': item.get('owner', {}).get('login'),

View file

@ -48,7 +48,7 @@ def response(resp):
{
'url': base_url + extract_text(eval_xpath(result, url_xpath)),
'title': extract_text(eval_xpath(result, title_xpath)),
'img_src': extract_text(eval_xpath(result, thumbnail_xpath)),
'thumbnail': extract_text(eval_xpath(result, thumbnail_xpath)),
'content': extract_text(eval_xpath(result, info_text_xpath)),
'metadata': extract_text(eval_xpath(result, author_xpath)),
}

View file

@ -62,7 +62,7 @@ filter_mapping = {0: 'off', 1: 'medium', 2: 'high'}
results_xpath = './/div[contains(@jscontroller, "SC7lYd")]'
title_xpath = './/a/h3[1]'
href_xpath = './/a[h3]/@href'
content_xpath = './/div[@data-sncf]'
content_xpath = './/div[@data-sncf="1"]'
# Suggestions are links placed in a *card-section*, we extract only the text
# from the links not the links itself.
@ -365,17 +365,17 @@ def response(resp):
logger.debug('ignoring item from the result_xpath list: missing content of title "%s"', title)
continue
img_src = content_nodes[0].xpath('.//img/@src')
if img_src:
img_src = img_src[0]
if img_src.startswith('data:image'):
thumbnail = content_nodes[0].xpath('.//img/@src')
if thumbnail:
thumbnail = thumbnail[0]
if thumbnail.startswith('data:image'):
img_id = content_nodes[0].xpath('.//img/@id')
if img_id:
img_src = data_image_map.get(img_id[0])
thumbnail = data_image_map.get(img_id[0])
else:
img_src = None
thumbnail = None
results.append({'url': url, 'title': title, 'content': content, 'img_src': img_src})
results.append({'url': url, 'title': title, 'content': content, 'thumbnail': thumbnail})
except Exception as e: # pylint: disable=broad-except
logger.error(e, exc_info=True)

View file

@ -165,14 +165,14 @@ def response(resp):
# "https://lh3.googleusercontent.com/DjhQh7DMszk.....z=-p-h100-w100"
# These URL are long but not personalized (double checked via tor).
img_src = extract_text(result.xpath('preceding-sibling::a/figure/img/@src'))
thumbnail = extract_text(result.xpath('preceding-sibling::a/figure/img/@src'))
results.append(
{
'url': href,
'title': title,
'content': content,
'img_src': img_src,
'thumbnail': thumbnail,
}
)

View file

@ -64,13 +64,13 @@ def response_movies(resp):
title = extract_text(eval_xpath(div_2, './div[@title]'))
metadata = extract_text(eval_xpath(div_2, './div[@class]'))
img = eval_xpath(div_1, './/img')[0]
img_src = img.get('src')
thumbnail = img.get('src')
results.append(
{
"url": url,
"title": title,
"content": sec_name,
"img_src": img_src,
"thumbnail": thumbnail,
'metadata': metadata,
'template': 'videos.html',
}

View file

@ -107,8 +107,8 @@ def response(resp):
# parse results
for result in eval_xpath_list(dom, '//div[contains(@class, "g ")]'):
img_src = eval_xpath_getindex(result, './/img/@src', 0, None)
if img_src is None:
thumbnail = eval_xpath_getindex(result, './/img/@src', 0, None)
if thumbnail is None:
continue
title = extract_text(eval_xpath_getindex(result, './/a/h3[1]', 0))
@ -124,7 +124,7 @@ def response(resp):
'title': title,
'content': content,
'author': pub_info,
'thumbnail': img_src,
'thumbnail': thumbnail,
'template': 'videos.html',
}
)

81
searx/engines/hex.py Normal file
View file

@ -0,0 +1,81 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""hex.pm"""
from urllib.parse import urlencode
from dateutil import parser
about = {
# pylint: disable=line-too-long
"website": "https://hex.pm/",
"wikidata_id": None,
"official_api_documentation": "https://github.com/hexpm/hexpm/blob/main/lib/hexpm_web/controllers/api/package_controller.ex",
"use_official_api": True,
"require_api_key": False,
"results": "JSON",
}
categories = ["it", "packages"]
# engine dependent config
paging = True
search_url = "https://hex.pm/api/packages/"
# Valid values: name inserted_at updated_at total_downloads recent_downloads
sort_criteria = "recent_downloads"
page_size = 10
linked_terms = {
# lower-case : replacement
"author": "Author",
"bitbucket": "Bitbucket",
"bug tracker": "Issue tracker",
"changelog": "Changelog",
"doc": "Documentation",
"docs": "Documentation",
"documentation": "Documentation",
"github repository": "GitHub",
"github": "GitHub",
"gitlab": "GitLab",
"issues": "Issue tracker",
"project source code": "Source code",
"repository": "Source code",
"scm": "Source code",
"sourcehut": "SourceHut",
"sources": "Source code",
"sponsor": "Sponsors",
"sponsors": "Sponsors",
"website": "Homepage",
}
def request(query: str, params):
args = urlencode({"page": params["pageno"], "per_page": page_size, "sort": sort_criteria, "search": query})
params["url"] = f"{search_url}?{args}"
return params
def response(resp):
results = []
for package in resp.json():
meta = package["meta"]
published_date = package.get("updated_at")
published_date = parser.parse(published_date)
links = {linked_terms.get(k.lower(), k): v for k, v in meta.get("links").items()}
results.append(
{
"template": "packages.html",
"url": package["html_url"],
"title": package["name"],
"package_name": package["name"],
"content": meta.get("description", ""),
"version": meta.get("latest_version"),
"maintainer": ", ".join(meta.get("maintainers", [])),
"publishedDate": published_date,
"license_name": ", ".join(meta.get("licenses", [])),
"homepage": package["docs_html_url"],
"links": links,
}
)
return results

View file

@ -90,7 +90,7 @@ def response(resp):
"title": title,
"url": href_base.format(category=categ, entry_id=entry_id),
"content": content,
"img_src": image_url,
"thumbnail": image_url,
}
)

View file

@ -91,7 +91,7 @@ def _get_communities(json):
'url': result['community']['actor_id'],
'title': result['community']['title'],
'content': markdown_to_text(result['community'].get('description', '')),
'img_src': result['community'].get('icon', result['community'].get('banner')),
'thumbnail': result['community'].get('icon', result['community'].get('banner')),
'publishedDate': datetime.strptime(counts['published'][:19], '%Y-%m-%dT%H:%M:%S'),
'metadata': metadata,
}
@ -120,9 +120,9 @@ def _get_posts(json):
for result in json["posts"]:
user = result['creator'].get('display_name', result['creator']['name'])
img_src = None
thumbnail = None
if result['post'].get('thumbnail_url'):
img_src = result['post']['thumbnail_url'] + '?format=webp&thumbnail=208'
thumbnail = result['post']['thumbnail_url'] + '?format=webp&thumbnail=208'
metadata = (
f"&#x25B2; {result['counts']['upvotes']} &#x25BC; {result['counts']['downvotes']}"
@ -140,7 +140,7 @@ def _get_posts(json):
'url': result['post']['ap_id'],
'title': result['post']['name'],
'content': content,
'img_src': img_src,
'thumbnail': thumbnail,
'publishedDate': datetime.strptime(result['post']['published'][:19], '%Y-%m-%dT%H:%M:%S'),
'metadata': metadata,
}

View file

@ -44,7 +44,7 @@ def response(resp):
'url': r_url,
'title': result['name'],
'iframe_src': iframe_src.format(url=r_url),
'img_src': result['pictures']['medium'],
'thumbnail': result['pictures']['medium'],
'publishedDate': publishedDate,
'content': result['user']['name'],
}

View file

@ -104,11 +104,11 @@ def response(resp):
item['metadata'] = html_to_text(result.get('meta_short', ''))
if result.get('image'):
item['img_src'] = image_url.format(image_id=result['image'], filename=result['image_filename'])
item['thumbnail'] = image_url.format(image_id=result['image'], filename=result['image_filename'])
else:
item['url'] = result['url']
item['content'] = ', '.join([result['class'], result['info'], result['more']])
item['img_src'] = result['image']
item['thumbnail'] = result['image']
results.append(item)

View file

@ -178,7 +178,7 @@ def response(resp):
continue
url, osm, geojson = get_url_osm_geojson(result)
img_src = get_thumbnail(get_img_src(result))
thumbnail = get_thumbnail(get_img_src(result))
links, link_keys = get_links(result, user_language)
data = get_data(result, user_language, link_keys)
@ -191,7 +191,7 @@ def response(resp):
'url': url,
'osm': osm,
'geojson': geojson,
'img_src': img_src,
'thumbnail': thumbnail,
'links': links,
'data': data,
'type': get_tag_label(result.get('category'), result.get('type', ''), user_language),

View file

@ -65,18 +65,18 @@ def construct_body(result):
page='',
year=result['release_year'],
)
img_src = pdbe_preview_url.format(pdb_id=result['pdb_id'])
thumbnail = pdbe_preview_url.format(pdb_id=result['pdb_id'])
except KeyError:
content = None
img_src = None
thumbnail = None
# construct url for preview image
try:
img_src = pdbe_preview_url.format(pdb_id=result['pdb_id'])
thumbnail = pdbe_preview_url.format(pdb_id=result['pdb_id'])
except KeyError:
img_src = None
thumbnail = None
return [title, content, img_src]
return [title, content, thumbnail]
def response(resp):
@ -106,16 +106,16 @@ def response(resp):
)
# obsoleted entries don't have preview images
img_src = None
thumbnail = None
else:
title, content, img_src = construct_body(result)
title, content, thumbnail = construct_body(result)
results.append(
{
'url': pdbe_entry_url.format(pdb_id=result['pdb_id']),
'title': title,
'content': content,
'img_src': img_src,
'thumbnail': thumbnail,
}
)

View file

@ -151,7 +151,7 @@ def response(resp):
elif piped_filter == 'music_songs':
item["template"] = "default.html"
item["img_src"] = result.get("thumbnail", "")
item["thumbnail"] = result.get("thumbnail", "")
item["content"] = result.get("uploaderName", "") or ""
results.append(item)

View file

@ -162,7 +162,7 @@ def parse_search_query(json_results):
result = {
'url': item['link'],
'title': item['title'],
'img_src': item['image'],
'thumbnail': item['image'],
'content': '',
'metadata': item.get('source'),
}
@ -244,7 +244,7 @@ def response(resp):
'url': item.get('link'),
'content': '',
'metadata': ' / '.join(metadata),
'img_src': item.get('image'),
'thumbnail': item.get('image'),
}
)
@ -257,7 +257,7 @@ def response(resp):
'url': item.get('link'),
'content': item.get('description', ''),
'metadata': ' / '.join(metadata),
'img_src': item.get('image'),
'thumbnail': item.get('image'),
}
)

View file

@ -242,15 +242,15 @@ def parse_web_api(resp):
if pub_date is not None:
pub_date = datetime.fromtimestamp(pub_date)
news_media = item.get('media', [])
img_src = None
thumbnail = None
if news_media:
img_src = news_media[0].get('pict', {}).get('url', None)
thumbnail = news_media[0].get('pict', {}).get('url', None)
results.append(
{
'title': title,
'url': res_url,
'publishedDate': pub_date,
'img_src': img_src,
'thumbnail': thumbnail,
}
)
@ -312,13 +312,12 @@ def fetch_traits(engine_traits: EngineTraits):
# pylint: disable=import-outside-toplevel
from searx import network
from searx.locales import region_tag
from searx.utils import extr
resp = network.get(about['website'])
text = resp.text
text = text[text.find('INITIAL_PROPS') :]
text = text[text.find('{') : text.find('</script>')]
json_string = extr(resp.text, 'INITIAL_PROPS = ', '</script>')
q_initial_props = loads(text)
q_initial_props = loads(json_string)
q_locales = q_initial_props.get('locales')
eng_tag_list = set()

View file

@ -114,7 +114,7 @@ def response(resp):
{
'url': url,
'title': result['name'],
'img_src': result.get('favicon', '').replace("http://", "https://"),
'thumbnail': result.get('favicon', '').replace("http://", "https://"),
'content': ' | '.join(content),
'metadata': ' | '.join(metadata),
'iframe_src': result['url_resolved'].replace("http://", "https://"),

View file

@ -133,7 +133,7 @@ def response(resp):
)
if mtype in ['image'] and subtype in ['bmp', 'gif', 'jpeg', 'png']:
item['img_src'] = url
item['thumbnail'] = url
results.append(item)

View file

@ -22,7 +22,7 @@ base_url = "https://www.rottentomatoes.com"
results_xpath = "//search-page-media-row"
url_xpath = "./a[1]/@href"
title_xpath = "./a/img/@alt"
img_src_xpath = "./a/img/@src"
thumbnail_xpath = "./a/img/@src"
release_year_xpath = "concat('From ', string(./@releaseyear))"
score_xpath = "concat('Score: ', string(./@tomatometerscore))"
cast_xpath = "concat('Starring ', string(./@cast))"
@ -52,7 +52,7 @@ def response(resp):
'url': extract_text(eval_xpath(result, url_xpath)),
'title': extract_text(eval_xpath(result, title_xpath)),
'content': ', '.join(content),
'img_src': extract_text(eval_xpath(result, img_src_xpath)),
'thumbnail': extract_text(eval_xpath(result, thumbnail_xpath)),
}
)

View file

@ -77,8 +77,7 @@ def response(resp):
{
'url': url + 'structure/' + result['id'],
'title': result['label'],
# 'thumbnail': thumbnail,
'img_src': thumbnail,
'thumbnail': thumbnail,
'content': html_to_text(content),
}
)

View file

@ -94,9 +94,9 @@ def response(resp):
'publishedDate': parser.parse(result['last_modified']),
'iframe_src': "https://w.soundcloud.com/player/?url=" + uri,
}
img_src = result['artwork_url'] or result['user']['avatar_url']
if img_src:
res['img_src'] = img_src
thumbnail = result['artwork_url'] or result['user']['avatar_url']
if thumbnail:
res['thumbnail'] = thumbnail
results.append(res)
return results

View file

@ -78,6 +78,7 @@ Startpage's category (for Web-search, News, Videos, ..) is set by
yet implemented.
"""
# pylint: disable=too-many-statements
from typing import TYPE_CHECKING
from collections import OrderedDict
@ -88,7 +89,7 @@ from datetime import datetime, timedelta
import dateutil.parser
import lxml.html
import babel
import babel.localedata
from searx.utils import extract_text, eval_xpath, gen_useragent
from searx.network import get # see https://github.com/searxng/searxng/issues/762
@ -142,9 +143,6 @@ search_url = base_url + '/sp/search'
# specific xpath variables
# ads xpath //div[@id="results"]/div[@id="sponsored"]//div[@class="result"]
# not ads: div[@class="result"] are the direct childs of div[@id="results"]
results_xpath = '//div[@class="w-gl__result__main"]'
link_xpath = './/a[@class="w-gl__result-title result-link"]'
content_xpath = './/p[@class="w-gl__description"]'
search_form_xpath = '//form[@id="search"]'
"""XPath of Startpage's origin search form
@ -334,8 +332,8 @@ def _response_cat_web(dom):
results = []
# parse results
for result in eval_xpath(dom, results_xpath):
links = eval_xpath(result, link_xpath)
for result in eval_xpath(dom, '//div[@class="w-gl"]/div[contains(@class, "result")]'):
links = eval_xpath(result, './/a[contains(@class, "result-title result-link")]')
if not links:
continue
link = links[0]
@ -349,12 +347,9 @@ def _response_cat_web(dom):
if re.match(r"^http(s|)://(www\.)?startpage\.com/do/search\?.*$", url):
continue
title = extract_text(link)
if eval_xpath(result, content_xpath):
content: str = extract_text(eval_xpath(result, content_xpath)) # type: ignore
else:
content = ''
title = extract_text(eval_xpath(link, 'h2'))
content = eval_xpath(result, './/p[contains(@class, "description")]')
content = extract_text(content, allow_none=True) or ''
published_date = None
@ -445,10 +440,12 @@ def fetch_traits(engine_traits: EngineTraits):
# get the native name of every language known by babel
for lang_code in filter(
lambda lang_code: lang_code.find('_') == -1, babel.localedata.locale_identifiers() # type: ignore
):
native_name = babel.Locale(lang_code).get_language_name().lower() # type: ignore
for lang_code in filter(lambda lang_code: lang_code.find('_') == -1, babel.localedata.locale_identifiers()):
native_name = babel.Locale(lang_code).get_language_name()
if not native_name:
print(f"ERROR: language name of startpage's language {lang_code} is unknown by babel")
continue
native_name = native_name.lower()
# add native name exactly as it is
catalog_engine2code[native_name] = lang_code

View file

@ -7,6 +7,8 @@ from urllib.parse import urlencode
from json import loads
from dateutil import parser
from searx.utils import extr
# about
about = {
"website": 'https://vimeo.com/',
@ -23,7 +25,7 @@ paging = True
# search-url
base_url = 'https://vimeo.com/'
search_url = base_url + '/search/page:{pageno}?{query}'
search_url = base_url + 'search/page:{pageno}?{query}'
# do search-request
@ -36,9 +38,8 @@ def request(query, params):
# get response from search-request
def response(resp):
results = []
data_start_pos = resp.text.find('{"filtered"')
data_end_pos = resp.text.find(';\n', data_start_pos + 1)
data = loads(resp.text[data_start_pos:data_end_pos])
data = loads(extr(resp.text, 'var data = ', ';\n'))
# parse results
for result in data['filtered']['data']:

View file

@ -3,6 +3,8 @@
"""
import datetime
from urllib.parse import urlencode
# about
@ -14,6 +16,8 @@ about = {
"require_api_key": False,
"results": 'JSON',
}
categories = ['images']
search_type = 'images'
base_url = "https://commons.wikimedia.org"
search_prefix = (
@ -29,17 +33,29 @@ search_prefix = (
paging = True
number_of_results = 10
search_types = {
'images': 'bitmap|drawing',
'videos': 'video',
'audio': 'audio',
'files': 'multimedia|office|archive|3d',
}
def request(query, params):
language = 'en'
if params['language'] != 'all':
language = params['language'].split('-')[0]
if search_type not in search_types:
raise ValueError(f"Unsupported search type: {search_type}")
filetype = search_types[search_type]
args = {
'uselang': language,
'gsrlimit': number_of_results,
'gsroffset': number_of_results * (params["pageno"] - 1),
'gsrsearch': "filetype:bitmap|drawing " + query,
'gsrsearch': f"filetype:{filetype} {query}",
}
params["url"] = f"{base_url}/w/api.php{search_prefix}&{urlencode(args, safe=':|')}"
@ -52,7 +68,6 @@ def response(resp):
if not json.get("query", {}).get("pages"):
return results
for item in json["query"]["pages"].values():
imageinfo = item["imageinfo"][0]
title = item["title"].replace("File:", "").rsplit('.', 1)[0]
@ -60,11 +75,28 @@ def response(resp):
'url': imageinfo["descriptionurl"],
'title': title,
'content': item["snippet"],
'img_src': imageinfo["url"],
'resolution': f'{imageinfo["width"]} x {imageinfo["height"]}',
'thumbnail_src': imageinfo["thumburl"],
'template': 'images.html',
}
if search_type == "images":
result['template'] = 'images.html'
result['img_src'] = imageinfo["url"]
result['thumbnail_src'] = imageinfo["thumburl"]
result['resolution'] = f'{imageinfo["width"]} x {imageinfo["height"]}'
else:
result['thumbnail'] = imageinfo["thumburl"]
if search_type == "videos":
result['template'] = 'videos.html'
if imageinfo.get('duration'):
result['length'] = datetime.timedelta(seconds=int(imageinfo['duration']))
result['iframe_src'] = imageinfo['url']
elif search_type == "files":
result['template'] = 'files.html'
result['metadata'] = imageinfo['mime']
result['size'] = imageinfo['size']
elif search_type == "audio":
result['iframe_src'] = imageinfo['url']
results.append(result)
return results

View file

@ -762,7 +762,8 @@ def debug_explain_wikidata_query(query, method='GET'):
def init(engine_settings=None): # pylint: disable=unused-argument
# WIKIDATA_PROPERTIES : add unit symbols
WIKIDATA_PROPERTIES.update(WIKIDATA_UNITS)
for k, v in WIKIDATA_UNITS.items():
WIKIDATA_PROPERTIES[k] = v['symbol']
# WIKIDATA_PROPERTIES : add property labels
wikidata_property_names = []

View file

@ -135,7 +135,7 @@ title_xpath = None
'''`XPath selector`_ of result's ``title``.'''
thumbnail_xpath = False
'''`XPath selector`_ of result's ``img_src``.'''
'''`XPath selector`_ of result's ``thumbnail``.'''
suggestion_xpath = ''
'''`XPath selector`_ of result's ``suggestion``.'''
@ -266,7 +266,7 @@ def response(resp): # pylint: disable=too-many-branches
if thumbnail_xpath:
thumbnail_xpath_result = eval_xpath_list(result, thumbnail_xpath)
if len(thumbnail_xpath_result) > 0:
tmp_result['img_src'] = extract_url(thumbnail_xpath_result, search_url)
tmp_result['thumbnail'] = extract_url(thumbnail_xpath_result, search_url)
# add alternative cached url if available
if cached_xpath:

View file

@ -22,20 +22,26 @@ The engine has the following (additional) settings:
- :py:obj:`search_mode`
- :py:obj:`search_type`
The :py:obj:`base_url` has to be set in the engine named `yacy` and is used by
all yacy engines.
.. code:: yaml
- name: yacy
engine: yacy
categories: general
search_type: text
base_url: https://yacy.searchlab.eu
shortcut: ya
base_url:
- https://yacy.searchlab.eu
- https://search.lomig.me
- https://yacy.ecosys.eu
- https://search.webproject.link
- name: yacy images
engine: yacy
categories: images
search_type: image
base_url: https://yacy.searchlab.eu
shortcut: yai
disabled: true
@ -45,6 +51,9 @@ Implementations
"""
# pylint: disable=fixme
from __future__ import annotations
import random
from json import loads
from urllib.parse import urlencode
from dateutil import parser
@ -87,15 +96,10 @@ search_type = 'text'
``video`` are not yet implemented (Pull-Requests are welcome).
"""
# search-url
base_url = 'https://yacy.searchlab.eu'
search_url = (
'/yacysearch.json?{query}'
'&startRecord={offset}'
'&maximumRecords={limit}'
'&contentdom={search_type}'
'&resource={resource}'
)
base_url: list | str = 'https://yacy.searchlab.eu'
"""The value is an URL or a list of URLs. In the latter case instance will be
selected randomly.
"""
def init(_):
@ -108,23 +112,34 @@ def init(_):
raise ValueError('search_type "%s" is not one of %s' % (search_type, valid_types))
def _base_url() -> str:
from searx.engines import engines # pylint: disable=import-outside-toplevel
url = engines['yacy'].base_url # type: ignore
if isinstance(url, list):
url = random.choice(url)
return url
def request(query, params):
offset = (params['pageno'] - 1) * number_of_results
params['url'] = base_url + search_url.format(
query=urlencode({'query': query}),
offset=offset,
limit=number_of_results,
search_type=search_type,
resource=search_mode,
)
if http_digest_auth_user and http_digest_auth_pass:
params['auth'] = DigestAuth(http_digest_auth_user, http_digest_auth_pass)
args = {
'query': query,
'startRecord': offset,
'maximumRecords': number_of_results,
'contentdom': search_type,
'resource': search_mode,
}
# add language tag if specified
if params['language'] != 'all':
params['url'] += '&lr=lang_' + params['language'].split('-')[0]
args['lr'] = 'lang_' + params['language'].split('-')[0]
params["url"] = f"{_base_url()}/yacysearch.json?{urlencode(args)}"
if http_digest_auth_user and http_digest_auth_pass:
params['auth'] = DigestAuth(http_digest_auth_user, http_digest_auth_pass)
return params

View file

@ -77,9 +77,9 @@ def response(resp):
url = parse_url(url)
title = extract_text(result.xpath('.//h4/a'))
content = extract_text(result.xpath('.//p'))
img_src = eval_xpath_getindex(result, './/img/@data-src', 0, None)
thumbnail = eval_xpath_getindex(result, './/img/@data-src', 0, None)
item = {'url': url, 'title': title, 'content': content, 'img_src': img_src}
item = {'url': url, 'title': title, 'content': content, 'thumbnail': thumbnail}
pub_date = extract_text(result.xpath('.//span[contains(@class,"s-time")]'))
ago = AGO_RE.search(pub_date)

View file

@ -7,6 +7,8 @@ from functools import reduce
from json import loads, dumps
from urllib.parse import quote_plus
from searx.utils import extr
# about
about = {
"website": 'https://www.youtube.com/',
@ -109,8 +111,8 @@ def parse_next_page_response(response_text):
def parse_first_page_response(response_text):
results = []
results_data = response_text[response_text.find('ytInitialData') :]
results_data = results_data[results_data.find('{') : results_data.find(';</script>')]
results_data = extr(response_text, 'ytInitialData = ', ';</script>')
results_json = loads(results_data) if results_data else {}
sections = (
results_json.get('contents', {})

View file

@ -52,11 +52,11 @@ def response(resp):
if description is not None:
content = markdown_to_text(description['text'])
img_src = None
thumbnail = None
if result['display']['images']:
img_src = result['display']['images'][0]
thumbnail = result['display']['images'][0]
elif result['content']['details']['images']:
img_src = result['content']['details']['images'][0]['resizableImageUrl']
thumbnail = result['content']['details']['images'][0]['resizableImageUrl']
url = result['display']['source']['sourceRecipeUrl']
if 'www.yummly.com/private' in url:
@ -67,7 +67,7 @@ def response(resp):
'url': url,
'title': result['display']['displayName'],
'content': content,
'img_src': img_src,
'thumbnail': thumbnail,
'metadata': gettext('Language') + f": {result['locale'].split('-')[0]}",
}
)

View file

@ -141,9 +141,12 @@ def _parse_result(item) -> Dict[str, Any]:
"authors": [extract_text(author) for author in author_elements],
"publisher": _text(item, './/a[@title="Publisher"]'),
"type": _text(item, './/div[contains(@class, "property__file")]//div[contains(@class, "property_value")]'),
"img_src": _text(item, './/img[contains(@class, "cover")]/@data-src'),
}
thumbnail = _text(item, './/img[contains(@class, "cover")]/@data-src')
if not thumbnail.startswith('/'):
result["thumbnail"] = thumbnail
year = _text(item, './/div[contains(@class, "property_year")]//div[contains(@class, "property_value")]')
if year:
result["publishedDate"] = datetime.strptime(year, '%Y')

View file

@ -17,6 +17,8 @@ Usage in a Flask app route:
"""
from __future__ import annotations
__all__ = ['InfoPage', 'InfoPageSet']
import os
@ -37,6 +39,16 @@ from ..locales import LOCALE_NAMES
logger = logging.getLogger('searx.infopage')
_INFO_FOLDER = os.path.abspath(os.path.dirname(__file__))
INFO_PAGES: 'InfoPageSet'
def __getattr__(name):
if name == 'INFO_PAGES':
global INFO_PAGES # pylint: disable=global-statement
INFO_PAGES = InfoPageSet()
return INFO_PAGES
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
class InfoPage:

View file

@ -0,0 +1,88 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Calculate mathematical expressions using ack#eval
"""
import ast
import operator
from flask_babel import gettext
from searx import settings
name = "Basic Calculator"
description = gettext("Calculate mathematical expressions via the search bar")
default_on = False
preference_section = 'general'
plugin_id = 'calculator'
operators = {
ast.Add: operator.add,
ast.Sub: operator.sub,
ast.Mult: operator.mul,
ast.Div: operator.truediv,
ast.Pow: operator.pow,
ast.BitXor: operator.xor,
ast.USub: operator.neg,
}
def _eval_expr(expr):
"""
>>> _eval_expr('2^6')
4
>>> _eval_expr('2**6')
64
>>> _eval_expr('1 + 2*3**(4^5) / (6 + -7)')
-5.0
"""
return _eval(ast.parse(expr, mode='eval').body)
def _eval(node):
if isinstance(node, ast.Constant) and isinstance(node.value, int):
return node.value
if isinstance(node, ast.BinOp):
return operators[type(node.op)](_eval(node.left), _eval(node.right))
if isinstance(node, ast.UnaryOp):
return operators[type(node.op)](_eval(node.operand))
raise TypeError(node)
def post_search(_request, search):
# don't run on public instances due to possible attack surfaces
if settings['server']['public_instance']:
return True
# only show the result of the expression on the first page
if search.search_query.pageno > 1:
return True
query = search.search_query.query
# in order to avoid DoS attacks with long expressions, ignore long expressions
if len(query) > 100:
return True
# replace commonly used math operators with their proper Python operator
query = query.replace("x", "*").replace(":", "/")
# only numbers and math operators are accepted
if any(str.isalpha(c) for c in query):
return True
# in python, powers are calculated via **
query_py_formatted = query.replace("^", "**")
try:
result = str(_eval_expr(query_py_formatted))
if result != query:
search.result_container.answers['calculate'] = {'answer': f"{query} = {result}"}
except (TypeError, SyntaxError, ArithmeticError):
pass
return True
def is_allowed():
return not settings['server']['public_instance']

View file

@ -1,58 +1,245 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Calculate mathematical expressions using ack#eval
"""A plugin for converting measured values from one unit to another unit (a
unit converter).
The plugin looks up the symbols (given in the query term) in a list of
converters, each converter is one item in the list (compare
:py:obj:`ADDITIONAL_UNITS`). If the symbols are ambiguous, the matching units
of measurement are evaluated. The weighting in the evaluation results from the
sorting of the :py:obj:`list of unit converters<symbol_to_si>`.
Enable in ``settings.yml``:
.. code:: yaml
enabled_plugins:
..
- 'Unit converter plugin'
"""
from flask_babel import gettext
import re
import babel.numbers
from flask_babel import gettext, get_locale
from searx import data
from searx.data import WIKIDATA_UNITS
name = "Unit converter plugin"
description = gettext("Convert between units")
default_on = True
plugin_id = "unit_converter"
preference_section = "general"
CONVERT_KEYWORDS = ["in", "to", "as"]
def _convert(from_value, source_si_factor, target_si_factor):
return from_value * source_si_factor / target_si_factor
# inspired from https://stackoverflow.com/a/42475086
RE_MEASURE = r'''
(?P<sign>[-+]?) # +/- or nothing for positive
(\s*) # separator: white space or nothing
(?P<number>[\d\.,]*) # number: 1,000.00 (en) or 1.000,00 (de)
(?P<E>[eE][-+]?\d+)? # scientific notation: e(+/-)2 (*10^2)
(\s*) # separator: white space or nothing
(?P<unit>\S+) # unit of measure
'''
def _parse_text_and_convert(search, splitted_query):
if len(splitted_query) != 2 or splitted_query[0].strip() == "" or splitted_query[1].strip() == "":
ADDITIONAL_UNITS = [
{
"si_name": "Q11579",
"symbol": "°C",
"to_si": lambda val: val + 273.15,
"from_si": lambda val: val - 273.15,
},
{
"si_name": "Q11579",
"symbol": "°F",
"to_si": lambda val: (val + 459.67) * 5 / 9,
"from_si": lambda val: (val * 9 / 5) - 459.67,
},
]
"""Additional items to convert from a measure unit to a SI unit (vice versa).
.. code:: python
{
"si_name": "Q11579", # Wikidata item ID of the SI unit (Kelvin)
"symbol": "°C", # symbol of the measure unit
"to_si": lambda val: val + 273.15, # convert measure value (val) to SI unit
"from_si": lambda val: val - 273.15, # convert SI value (val) measure unit
},
{
"si_name": "Q11573",
"symbol": "mi",
"to_si": 1609.344, # convert measure value (val) to SI unit
"from_si": 1 / 1609.344 # convert SI value (val) measure unit
},
The values of ``to_si`` and ``from_si`` can be of :py:obj:`float` (a multiplier)
or a callable_ (val in / converted value returned).
.. _callable: https://docs.python.org/3/glossary.html#term-callable
"""
ALIAS_SYMBOLS = {
'°C': ('C',),
'°F': ('F',),
'mi': ('L',),
}
"""Alias symbols for known unit of measure symbols / by example::
'°C': ('C', ...), # list of alias symbols for °C (Q69362731)
'°F': ('F', ...), # list of alias symbols for °F (Q99490479)
'mi': ('L',), # list of alias symbols for mi (Q253276)
"""
SYMBOL_TO_SI = []
def symbol_to_si():
"""Generates a list of tuples, each tuple is a measure unit and the fields
in the tuple are:
0. Symbol of the measure unit (e.g. 'mi' for measure unit 'miles' Q253276)
1. SI name of the measure unit (e.g. Q11573 for SI unit 'metre')
2. Factor to get SI value from measure unit (e.g. 1mi is equal to SI 1m
multiplied by 1609.344)
3. Factor to get measure value from from SI value (e.g. SI 100m is equal to
100mi divided by 1609.344)
The returned list is sorted, the first items are created from
``WIKIDATA_UNITS``, the second group of items is build from
:py:obj:`ADDITIONAL_UNITS` and items created from :py:obj:`ALIAS_SYMBOLS`.
If you search this list for a symbol, then a match with a symbol from
Wikidata has the highest weighting (first hit in the list), followed by the
symbols from the :py:obj:`ADDITIONAL_UNITS` and the lowest weighting is
given to the symbols resulting from the aliases :py:obj:`ALIAS_SYMBOLS`.
"""
global SYMBOL_TO_SI # pylint: disable=global-statement
if SYMBOL_TO_SI:
return SYMBOL_TO_SI
# filter out units which can't be normalized to a SI unit and filter out
# units without a symbol / arcsecond does not have a symbol
# https://www.wikidata.org/wiki/Q829073
for item in data.WIKIDATA_UNITS.values():
if item['to_si_factor'] and item['symbol']:
SYMBOL_TO_SI.append(
(
item['symbol'],
item['si_name'],
1 / item['to_si_factor'], # from_si
item['to_si_factor'], # to_si
item['symbol'],
)
)
for item in ADDITIONAL_UNITS:
SYMBOL_TO_SI.append(
(
item['symbol'],
item['si_name'],
item['from_si'],
item['to_si'],
item['symbol'],
)
)
alias_items = []
for item in SYMBOL_TO_SI:
for alias in ALIAS_SYMBOLS.get(item[0], ()):
alias_items.append(
(
alias,
item[1],
item[2], # from_si
item[3], # to_si
item[0], # origin unit
)
)
SYMBOL_TO_SI = SYMBOL_TO_SI + alias_items
return SYMBOL_TO_SI
def _parse_text_and_convert(search, from_query, to_query):
# pylint: disable=too-many-branches, too-many-locals
if not (from_query and to_query):
return
from_value = ""
from_unit_key = ""
# only parse digits as value that belong together
read_alpha = False
for c in splitted_query[0]:
if not read_alpha and (c in ("-", ".") or str.isdigit(c)):
from_value += c
read_alpha = True
elif c != " ":
from_unit_key += c
to_unit_key = splitted_query[1].strip()
from_unit = None
to_unit = None
for unit in WIKIDATA_UNITS.values():
if unit['symbol'] == from_unit_key:
from_unit = unit
if unit['symbol'] == to_unit_key:
to_unit = unit
if from_unit and to_unit:
break
if from_unit is None or to_unit is None or to_unit.get('si_name') != from_unit.get('si_name'):
measured = re.match(RE_MEASURE, from_query, re.VERBOSE)
if not (measured and measured.group('number'), measured.group('unit')):
return
result = _convert(float(from_value), from_unit['to_si_factor'], to_unit['to_si_factor'])
search.result_container.answers['conversion'] = {'answer': f"{result:g} {to_unit['symbol']}"}
# Symbols are not unique, if there are several hits for the from-unit, then
# the correct one must be determined by comparing it with the to-unit
# https://github.com/searxng/searxng/pull/3378#issuecomment-2080974863
# first: collecting possible units
source_list, target_list = [], []
for symbol, si_name, from_si, to_si, orig_symbol in symbol_to_si():
if symbol == measured.group('unit'):
source_list.append((si_name, to_si))
if symbol == to_query:
target_list.append((si_name, from_si, orig_symbol))
if not (source_list and target_list):
return
source_to_si = target_from_si = target_symbol = None
# second: find the right unit by comparing list of from-units with list of to-units
for source in source_list:
for target in target_list:
if source[0] == target[0]: # compare si_name
source_to_si = source[1]
target_from_si = target[1]
target_symbol = target[2]
if not (source_to_si and target_from_si):
return
_locale = get_locale() or 'en_US'
value = measured.group('sign') + measured.group('number') + (measured.group('E') or '')
value = babel.numbers.parse_decimal(value, locale=_locale)
# convert value to SI unit
if isinstance(source_to_si, (float, int)):
value = float(value) * source_to_si
else:
value = source_to_si(float(value))
# convert value from SI unit to target unit
if isinstance(target_from_si, (float, int)):
value = float(value) * target_from_si
else:
value = target_from_si(float(value))
if measured.group('E'):
# when incomming notation is scientific, outgoing notation is scientific
result = babel.numbers.format_scientific(value, locale=_locale)
else:
result = babel.numbers.format_decimal(value, locale=_locale, format='#,##0.##########;-#')
search.result_container.answers['conversion'] = {'answer': f'{result} {target_symbol}'}
def post_search(_request, search):
@ -69,8 +256,8 @@ def post_search(_request, search):
for query_part in query_parts:
for keyword in CONVERT_KEYWORDS:
if query_part == keyword:
keyword_split = query.split(keyword, 1)
_parse_text_and_convert(search, keyword_split)
from_query, to_query = query.split(keyword, 1)
_parse_text_and_convert(search, from_query.strip(), to_query.strip())
return True
return True

View file

@ -430,21 +430,38 @@ class ResultContainer:
"""Returns the average of results number, returns zero if the average
result number is smaller than the actual result count."""
resultnum_sum = sum(self._number_of_results)
if not resultnum_sum or not self._number_of_results:
return 0
with self._lock:
if not self._closed:
logger.error("call to ResultContainer.number_of_results before ResultContainer.close")
return 0
average = int(resultnum_sum / len(self._number_of_results))
if average < self.results_length():
average = 0
return average
resultnum_sum = sum(self._number_of_results)
if not resultnum_sum or not self._number_of_results:
return 0
average = int(resultnum_sum / len(self._number_of_results))
if average < self.results_length():
average = 0
return average
def add_unresponsive_engine(self, engine_name: str, error_type: str, suspended: bool = False):
if engines[engine_name].display_error_messages:
self.unresponsive_engines.add(UnresponsiveEngine(engine_name, error_type, suspended))
with self._lock:
if self._closed:
logger.error("call to ResultContainer.add_unresponsive_engine after ResultContainer.close")
return
if engines[engine_name].display_error_messages:
self.unresponsive_engines.add(UnresponsiveEngine(engine_name, error_type, suspended))
def add_timing(self, engine_name: str, engine_time: float, page_load_time: float):
self.timings.append(Timing(engine_name, total=engine_time, load=page_load_time))
with self._lock:
if self._closed:
logger.error("call to ResultContainer.add_timing after ResultContainer.close")
return
self.timings.append(Timing(engine_name, total=engine_time, load=page_load_time))
def get_timings(self):
return self.timings
with self._lock:
if not self._closed:
logger.error("call to ResultContainer.get_timings before ResultContainer.close")
return []
return self.timings

View file

@ -220,6 +220,7 @@ outgoing:
# - 'Ahmia blacklist' # activation depends on outgoing.using_tor_proxy
# # these plugins are disabled if nothing is configured ..
# - 'Hostname replace' # see hostname_replace configuration below
# - 'Calculator plugin'
# - 'Open Access DOI rewrite'
# - 'Tor check plugin'
# # Read the docs before activate: auto-detection of the language could be
@ -726,6 +727,11 @@ engines:
shortcut: fd
disabled: true
- name: findthatmeme
engine: findthatmeme
shortcut: ftm
disabled: true
- name: flickr
categories: images
shortcut: fl
@ -800,26 +806,18 @@ engines:
engine: github
shortcut: gh
# This a Gitea service. If you would like to use a different instance,
# change codeberg.org to URL of the desired Gitea host. Or you can create a
# new engine by copying this and changing the name, shortcut and search_url.
- name: codeberg
engine: json_engine
search_url: https://codeberg.org/api/v1/repos/search?q={query}&limit=10
url_query: html_url
title_query: name
content_query: description
categories: [it, repos]
# https://docs.searxng.org/dev/engines/online/gitea.html
engine: gitea
base_url: https://codeberg.org
shortcut: cb
disabled: true
about:
website: https://codeberg.org/
wikidata_id:
official_api_documentation: https://try.gitea.io/api/swagger
use_official_api: false
require_api_key: false
results: JSON
- name: gitea.com
engine: gitea
base_url: https://gitea.com
shortcut: gitea
disabled: true
- name: goodreads
engine: goodreads
@ -926,6 +924,20 @@ engines:
shortcut: hn
disabled: true
- name: hex
engine: hex
shortcut: hex
disabled: true
# Valid values: name inserted_at updated_at total_downloads recent_downloads
sort_criteria: "recent_downloads"
page_size: 10
- name: crates.io
engine: crates
shortcut: crates
disabled: true
timeout: 6.0
- name: hoogle
engine: xpath
search_url: https://hoogle.haskell.org/?hoogle={query}
@ -1907,6 +1919,28 @@ engines:
engine: wikicommons
shortcut: wc
categories: images
search_type: images
number_of_results: 10
- name: wikicommons.videos
engine: wikicommons
shortcut: wcv
categories: videos
search_type: videos
number_of_results: 10
- name: wikicommons.audio
engine: wikicommons
shortcut: wca
categories: music
search_type: audio
number_of_results: 10
- name: wikicommons.files
engine: wikicommons
shortcut: wcf
categories: files
search_type: files
number_of_results: 10
- name: wolframalpha
@ -2058,7 +2092,11 @@ engines:
engine: yacy
categories: general
search_type: text
base_url: https://yacy.searchlab.eu
base_url:
- https://yacy.searchlab.eu
- https://search.lomig.me
- https://yacy.ecosys.eu
- https://search.webproject.link
shortcut: ya
disabled: true
# required if you aren't using HTTPS for your local yacy instance
@ -2071,7 +2109,6 @@ engines:
engine: yacy
categories: images
search_type: image
base_url: https://yacy.searchlab.eu
shortcut: yai
disabled: true

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,6 @@
/*
this file is generated automatically by searxng_extra/update/update_pygments.py
using pygments version 2.17.2
using pygments version 2.18.0
*/

View file

@ -281,24 +281,12 @@ article[data-vim-selected].category-social {
color: var(--color-result-description-highlight-font);
}
img {
&.thumbnail {
.ltr-float-left();
padding-top: 0.6rem;
.ltr-padding-right(1rem);
width: 20rem;
height: unset; // remove heigth value that was needed for lazy loading
}
&.image {
.ltr-float-left();
padding-top: 0.6rem;
.ltr-padding-right(1rem);
width: 7rem;
max-height: 7rem;
object-fit: scale-down;
object-position: right top;
}
img.thumbnail {
.ltr-float-left();
padding-top: 0.6rem;
.ltr-padding-right(1rem);
width: 7rem;
height: unset; // remove heigth value that was needed for lazy loading
}
.break {
@ -394,6 +382,16 @@ article[data-vim-selected].category-social {
padding: 10px 0 0 0;
}
.result-videos {
img.thumbnail {
.ltr-float-left();
padding-top: 0.6rem;
.ltr-padding-right(1rem);
width: 20rem;
height: unset; // remove heigth value that was needed for lazy loading
}
}
.result-videos .content {
overflow: hidden;
}

View file

@ -25,8 +25,7 @@
<span class="url_o{{loop.index}}"><span class="url_i{{loop.index}}">{{- part -}}</span></span>
{%- endfor %}
{{- result_close_link() -}}
{%- if result.img_src %}{{ result_open_link(result.url) }}<img class="image" src="{{ image_proxify(result.img_src) }}" title="{{ result.title|striptags }}" loading="lazy" width="200" height="200">{{ result_close_link() }}{% endif -%}
{%- if result.thumbnail %}{{ result_open_link(result.url) }}<img class="thumbnail" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" loading="lazy" width="200" height="200">{{ result_close_link() }}{% endif -%}
{%- if result.thumbnail %}{{ result_open_link(result.url) }}<img class="thumbnail" src="{{ image_proxify(result.thumbnail) }}" title="{{ result.title|striptags }}" loading="lazy">{{ result_close_link() }}{% endif -%}
<h3>{{ result_link(result.url, result.title|safe) }}</h3>
{%- endmacro -%}

View file

@ -38,7 +38,7 @@
{%- macro plugin_preferences(section) -%}
{%- for plugin in plugins -%}
{%- if plugin.preference_section == section -%}
{%- if plugin.preference_section == section and (plugin.is_allowed() if plugin.is_allowed else True) -%}
<fieldset>{{- '' -}}
<legend>{{ _(plugin.name) }}</legend>{{- '' -}}
<div class="value">

View file

@ -47,7 +47,7 @@
{%- endif -%}
</div>
{%- endif -%}
{%- if result.homepage or result.source_code_url -%}
{%- if result.homepage or result.source_code_url or result.links -%}
<div class="result_project">{{- '' -}}
<span>{{ _('Project') }}</span>
<span>{{- '' -}}
@ -58,6 +58,14 @@
{%- if result.source_code_url -%}
<a href="{{ result.source_code_url }}" target="_blank">{{ _('Source code') }}</a>
{%- endif -%}
{%- if result.links %}
{%- for name, link in result.links.items() -%}
{% if not loop.first or result.homepage or result.source_code_url %} | {% endif %}
<a href="{{ link }}" target="_blank">
{{- _(name) -}}
</a>
{%- endfor -%}
{%- endif -%}
</span>{{- '' -}}
</div>
{%- endif -%}

View file

@ -24,8 +24,12 @@
{%- for answer in answers.values() -%}
<div class="answer">
<span>{{ answer.answer }}</span>
{% if answer.url -%}
<a href="{{ answer.url }}" class="answer-url">{{ urlparse(answer.url).hostname }}</a>
{%- if answer.url -%}
<a href="{{ answer.url }}" class="answer-url"
{%- if results_on_new_tab %} target="_blank" rel="noopener noreferrer"
{%- else -%} rel="noreferrer"
{%- endif -%}
>{{ urlparse(answer.url).hostname }}</a>
{% endif -%}
</div>
{%- endfor -%}

View file

@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2024-03-12 17:28+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>"
"\n"
@ -488,6 +488,10 @@ msgstr "boekgradering"
msgid "File quality"
msgstr "Lêer kwaliteit"
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr ""
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr "Skakel snare om na verskillende hash digests."
@ -573,6 +577,10 @@ msgstr "Spoorsnyer URL verwyderaar"
msgid "Remove trackers arguments from the returned URL"
msgstr "Verwyder spoorsnyersargumente van die teruggestuurde URL"
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr ""
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr "Bladsy nie gevind"
@ -750,27 +758,27 @@ msgstr "Koekies"
msgid "Answers"
msgstr "Antwoord"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "Aantal resultate"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr "Info"
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "Probeer soek na:"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr "Terug na bo"
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr "Vorige bladsy"
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr "Volgende bladsy"
@ -797,7 +805,7 @@ msgstr "soek"
msgid "There is currently no data available. "
msgstr "Daar is tans geen data beskikbaar nie."
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr "Enjin naam"
@ -810,12 +818,12 @@ msgstr "Tellings"
msgid "Result count"
msgstr "Resultaattelling"
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr "Reaksietyd"
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr "Betroubaarheid"
@ -934,7 +942,7 @@ msgstr "Outo-bespeur"
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr "VeiligeSoek"
@ -955,7 +963,7 @@ msgid "None"
msgstr "Geen"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "Tydreeks"
@ -1024,7 +1032,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr "Gaan terug na die vorige bladsy deur die vorige bladsy-knoppie te gebruik."
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "Laat toe"
@ -1141,19 +1149,27 @@ msgstr ""
"Hierdie oortjie bestaan nie in die gebruikerskoppelvlak nie, maar jy kan "
"in hierdie enjins soek volgens sy !bangs."
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr "!bang"
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "Ondersteun gekose taal"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr "Gewig"
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr "Maks tyd"

View file

@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2024-04-21 16:49+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>"
"\n"
@ -494,6 +494,10 @@ msgstr "تقييم الكتاب"
msgid "File quality"
msgstr "جودة الملف"
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr ""
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr "يحول السلسلة إلى ملخص التجزئة."
@ -574,6 +578,10 @@ msgstr ""
"إزالة وسيطات التتبع من \"URL\" الذي تم إرجاعه , إزالة وسيطات التتبع من "
"محدد موقع الموارد الموحد الذي تم إرجاعه"
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr ""
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr "تعذر العثور على الصفحة"
@ -749,27 +757,27 @@ msgstr "كعكات الكوكيز"
msgid "Answers"
msgstr "الإجابات"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "حصيلة نتائج البحث"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr "معلومات"
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "حاول البحث عن :"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr "العودة للأعلى"
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr "الصفحة السابقة"
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr "الصفحة التالية"
@ -796,7 +804,7 @@ msgstr "بحث"
msgid "There is currently no data available. "
msgstr "لم يتم العثور على أية بيانات في الوقت الحالي. "
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr "إسم المحرك"
@ -809,12 +817,12 @@ msgstr "نتائج"
msgid "Result count"
msgstr "نتيجة العد"
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr "مدة الإستجابة"
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr "إمكانية الإشتغال"
@ -933,7 +941,7 @@ msgstr "الاكتشاف التلقائي"
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr "البحث المؤمَّن"
@ -954,7 +962,7 @@ msgid "None"
msgstr "لا شيء"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "الفترة"
@ -1023,7 +1031,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr "إرجع إلى الصفحة السابقة باستخدام زر العودة."
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "تمكين"
@ -1140,19 +1148,27 @@ msgstr ""
"علامة التبويب هذه غير موجودة في واجهة المستخدم ، ولكن يمكنك البحث في هذه "
"المحركات من خلال !bangs"
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr "!bang"
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "يدعم اللغة المختارة"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr "وَزن"
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr "أقصى مدّة"

View file

@ -15,8 +15,8 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"PO-Revision-Date: 2024-03-22 07:09+0000\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2024-04-28 18:18+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>"
"\n"
"Language: bg\n"
@ -76,7 +76,7 @@ msgstr "радио"
#. CATEGORY_NAMES['TV']
#: searx/searxng.msg
msgid "tv"
msgstr ""
msgstr "телевизия"
#. CATEGORY_NAMES['IT']
#: searx/searxng.msg
@ -201,12 +201,12 @@ msgstr "Вечер"
#. WEATHER_TERMS['FEELS LIKE']
#: searx/searxng.msg
msgid "Feels like"
msgstr ""
msgstr "Усеща се като"
#. WEATHER_TERMS['HUMIDITY']
#: searx/searxng.msg
msgid "Humidity"
msgstr ""
msgstr "Влажност"
#. WEATHER_TERMS['MAX TEMP.']
#: searx/searxng.msg
@ -236,47 +236,47 @@ msgstr "Обяд"
#. WEATHER_TERMS['PRESSURE']
#: searx/searxng.msg
msgid "Pressure"
msgstr ""
msgstr "Налягане"
#. WEATHER_TERMS['SUNRISE']
#: searx/searxng.msg
msgid "Sunrise"
msgstr ""
msgstr "Изгрев"
#. WEATHER_TERMS['SUNSET']
#: searx/searxng.msg
msgid "Sunset"
msgstr ""
msgstr "Залез"
#. WEATHER_TERMS['TEMPERATURE']
#: searx/searxng.msg
msgid "Temperature"
msgstr ""
msgstr "Температура"
#. WEATHER_TERMS['UV INDEX']
#: searx/searxng.msg
msgid "UV index"
msgstr ""
msgstr "UV индекс"
#. WEATHER_TERMS['VISIBILITY']
#: searx/searxng.msg
msgid "Visibility"
msgstr ""
msgstr "Видимост"
#. WEATHER_TERMS['WIND']
#: searx/searxng.msg
msgid "Wind"
msgstr ""
msgstr "Вятър"
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
#: searx/searxng.msg
msgid "subscribers"
msgstr ""
msgstr "Абонати"
#. SOCIAL_MEDIA_TERMS['POSTS']
#: searx/searxng.msg
msgid "posts"
msgstr ""
msgstr "Публикации"
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
#: searx/searxng.msg
@ -286,12 +286,12 @@ msgstr ""
#. SOCIAL_MEDIA_TERMS['COMMENTS']
#: searx/searxng.msg
msgid "comments"
msgstr ""
msgstr "Коментари"
#. SOCIAL_MEDIA_TERMS['USER']
#: searx/searxng.msg
msgid "user"
msgstr ""
msgstr "Потребител"
#. SOCIAL_MEDIA_TERMS['COMMUNITY']
#: searx/searxng.msg
@ -301,17 +301,17 @@ msgstr ""
#. SOCIAL_MEDIA_TERMS['POINTS']
#: searx/searxng.msg
msgid "points"
msgstr ""
msgstr "Точки"
#. SOCIAL_MEDIA_TERMS['TITLE']
#: searx/searxng.msg
msgid "title"
msgstr ""
msgstr "Заглавие"
#. SOCIAL_MEDIA_TERMS['AUTHOR']
#: searx/searxng.msg
msgid "author"
msgstr ""
msgstr "Автор"
#: searx/webapp.py:330
msgid "No item found"
@ -490,6 +490,10 @@ msgstr "Рейтинг на книги"
msgid "File quality"
msgstr "Качество на файл"
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr ""
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr "Преобразува низове в различни хаш-извлечение."
@ -568,6 +572,10 @@ msgstr "Премахвач на URL тракери"
msgid "Remove trackers arguments from the returned URL"
msgstr "Премахни следящите аргументи от върнатия URL"
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr ""
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr "Страницата не е намерена"
@ -747,27 +755,27 @@ msgstr "Бисквитки"
msgid "Answers"
msgstr "Отговори"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "Брой резултати"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr "Инф."
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "Пробвайте да потърсите:"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr "Обратно към началото"
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr "Предишна страница"
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr "Следваща страница"
@ -794,7 +802,7 @@ msgstr "търси"
msgid "There is currently no data available. "
msgstr "Няма налична достъпна информация."
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr "Име на търсачка"
@ -807,12 +815,12 @@ msgstr "Резултати"
msgid "Result count"
msgstr "Брой резултати"
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr "Време за отговор"
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr "Надеждност"
@ -931,7 +939,7 @@ msgstr "Автоматично разпознаване"
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr "Безопасно търсене"
@ -952,7 +960,7 @@ msgid "None"
msgstr "Нищо"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "Времева зона"
@ -1021,7 +1029,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr ""
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "Позволи"
@ -1141,19 +1149,27 @@ msgstr ""
"Този раздел несъществува в потребителския интерфейс, но може да търсиш "
"със следните търсачки по !bangs."
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr "!bang"
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "Поддържка на избраният език"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr "Тегло"
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr "Максимално време"

View file

@ -11,21 +11,22 @@
# MonsoonFire <re1qnb5mq@mozmail.com>, 2023.
# return42 <return42@users.noreply.translate.codeberg.org>, 2024.
# MonsoonRain <MonsoonRain@users.noreply.translate.codeberg.org>, 2024.
# Utsushime <Utsushime@users.noreply.translate.codeberg.org>, 2024.
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"PO-Revision-Date: 2024-03-16 19:53+0000\n"
"Last-Translator: MonsoonRain "
"<MonsoonRain@users.noreply.translate.codeberg.org>\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2024-05-17 06:18+0000\n"
"Last-Translator: Utsushime <Utsushime@users.noreply.translate.codeberg.org>\n"
"Language-Team: Bengali <https://translate.codeberg.org/projects/searxng/"
"searxng/bn/>\n"
"Language: bn\n"
"Language-Team: Bengali "
"<https://translate.codeberg.org/projects/searxng/searxng/bn/>\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.5.5\n"
"Generated-By: Babel 2.14.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
@ -76,7 +77,7 @@ msgstr "বেতার"
#. CATEGORY_NAMES['TV']
#: searx/searxng.msg
msgid "tv"
msgstr ""
msgstr "দূরদর্শন"
#. CATEGORY_NAMES['IT']
#: searx/searxng.msg
@ -176,22 +177,22 @@ msgstr "সম্বন্ধে"
#. WEATHER_TERMS['AVERAGE TEMP.']
#: searx/searxng.msg
msgid "Average temp."
msgstr ""
msgstr "গড় তাপমাত্রা"
#. WEATHER_TERMS['CLOUD COVER']
#: searx/searxng.msg
msgid "Cloud cover"
msgstr ""
msgstr "মেঘলা"
#. WEATHER_TERMS['CONDITION']
#: searx/searxng.msg
msgid "Condition"
msgstr ""
msgstr "অবস্থা"
#. WEATHER_TERMS['CURRENT CONDITION']
#: searx/searxng.msg
msgid "Current condition"
msgstr ""
msgstr "বর্তমান অবস্থা"
#. WEATHER_TERMS['EVENING']
#: searx/engines/wttr.py:100 searx/searxng.msg
@ -201,22 +202,22 @@ msgstr "সন্ধ্যা"
#. WEATHER_TERMS['FEELS LIKE']
#: searx/searxng.msg
msgid "Feels like"
msgstr ""
msgstr "অনুভব হয়"
#. WEATHER_TERMS['HUMIDITY']
#: searx/searxng.msg
msgid "Humidity"
msgstr ""
msgstr "আদ্রতা"
#. WEATHER_TERMS['MAX TEMP.']
#: searx/searxng.msg
msgid "Max temp."
msgstr ""
msgstr "সর্বোচ্চ তাপমাত্রা"
#. WEATHER_TERMS['MIN TEMP.']
#: searx/searxng.msg
msgid "Min temp."
msgstr ""
msgstr "সর্বনিন্ম তাপমাত্রা"
#. WEATHER_TERMS['MORNING']
#: searx/engines/wttr.py:100 searx/searxng.msg
@ -236,82 +237,82 @@ msgstr "দুপুর"
#. WEATHER_TERMS['PRESSURE']
#: searx/searxng.msg
msgid "Pressure"
msgstr ""
msgstr "চাপ"
#. WEATHER_TERMS['SUNRISE']
#: searx/searxng.msg
msgid "Sunrise"
msgstr ""
msgstr "সূর্যোদয়"
#. WEATHER_TERMS['SUNSET']
#: searx/searxng.msg
msgid "Sunset"
msgstr ""
msgstr "সূর্যাস্ত"
#. WEATHER_TERMS['TEMPERATURE']
#: searx/searxng.msg
msgid "Temperature"
msgstr ""
msgstr "তাপমাত্রা"
#. WEATHER_TERMS['UV INDEX']
#: searx/searxng.msg
msgid "UV index"
msgstr ""
msgstr "ইউ ভি ইনডেক্স"
#. WEATHER_TERMS['VISIBILITY']
#: searx/searxng.msg
msgid "Visibility"
msgstr ""
msgstr "দৃশ্যগোচর"
#. WEATHER_TERMS['WIND']
#: searx/searxng.msg
msgid "Wind"
msgstr ""
msgstr "বায়ু"
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
#: searx/searxng.msg
msgid "subscribers"
msgstr ""
msgstr "সাবস্ক্রাইবারস"
#. SOCIAL_MEDIA_TERMS['POSTS']
#: searx/searxng.msg
msgid "posts"
msgstr ""
msgstr "পোস্টস"
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
#: searx/searxng.msg
msgid "active users"
msgstr ""
msgstr "সক্রিয় ইউজারস"
#. SOCIAL_MEDIA_TERMS['COMMENTS']
#: searx/searxng.msg
msgid "comments"
msgstr ""
msgstr "কমেন্ট"
#. SOCIAL_MEDIA_TERMS['USER']
#: searx/searxng.msg
msgid "user"
msgstr ""
msgstr "ইউজার"
#. SOCIAL_MEDIA_TERMS['COMMUNITY']
#: searx/searxng.msg
msgid "community"
msgstr ""
msgstr "কমিউনিটি"
#. SOCIAL_MEDIA_TERMS['POINTS']
#: searx/searxng.msg
msgid "points"
msgstr ""
msgstr "পয়েন্টস"
#. SOCIAL_MEDIA_TERMS['TITLE']
#: searx/searxng.msg
msgid "title"
msgstr ""
msgstr "শিরোনাম"
#. SOCIAL_MEDIA_TERMS['AUTHOR']
#: searx/searxng.msg
msgid "author"
msgstr ""
msgstr "লেখক"
#: searx/webapp.py:330
msgid "No item found"
@ -489,6 +490,10 @@ msgstr "বই পর্যালোচনা"
msgid "File quality"
msgstr "নথি মান"
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr ""
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr "স্ট্রিংগুলিকে বিভিন্ন হ্যাশ ডাইজেস্টে রূপান্তর করে।"
@ -570,6 +575,10 @@ msgstr "ট্র্যাকার URL রিমুভার"
msgid "Remove trackers arguments from the returned URL"
msgstr "ফিরে আসা URL থেকে ট্র্যাকার আর্গুমেন্টগুলি সরান৷"
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr ""
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr "পৃষ্ঠা খুঁজে পাওয়া যায়নি"
@ -749,27 +758,27 @@ msgstr "কুকি"
msgid "Answers"
msgstr "উত্তর"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "ফলাফলের সংখ্যা"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr "তথ্য"
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "এটি খোঁজার চেষ্টা করুন:"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr "উপরে ফিরে যান"
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr "পূর্ববর্তী পেইজ"
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr "পরবর্তী পেইজ"
@ -796,7 +805,7 @@ msgstr "অনুসন্ধান"
msgid "There is currently no data available. "
msgstr "বর্তমানে কোন তথ্য পাওয়া যায়নি."
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr "ইঞ্জিনের নাম"
@ -809,12 +818,12 @@ msgstr "স্কোর"
msgid "Result count"
msgstr "ফলাফল গণনা"
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr "প্রতিক্রিয়া সময়"
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr "নির্ভরযোগ্যতা"
@ -933,7 +942,7 @@ msgstr "স্বয়ং সনাক্ত"
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr "নিরাপদ সার্চ"
@ -954,7 +963,7 @@ msgid "None"
msgstr "নেই"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "সময়সীমা"
@ -1023,7 +1032,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr "আগের পাতায় ফিরত যেতে পিছনে যাওয়ার বোতামে টিপ দাও।"
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "অনুমোদন"
@ -1138,19 +1147,27 @@ msgstr ""
"এই ট্যাবটি ইউজার ইন্টারফেসে নেই, কিন্তু আপনি এই ইঞ্জিনের !bangs ব্যবহার "
"করে সার্চ করতে পারেন।"
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr "!bang"
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "নির্বাচিত ভাষা সমর্থন করে"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr "ওজন"
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr "সর্বোচ্চ সময়"
@ -1653,4 +1670,3 @@ msgstr "ভিডিও লুকিয়ে ফেলুন"
#~ "আমরা কোন ফলাফল খুঁজে পাইনি. অনুগ্রহ "
#~ "করে অন্য কোনো প্রশ্ন ব্যবহার করুন "
#~ "বা আরও বিভাগে অনুসন্ধান করুন।"

View file

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2023-06-02 07:07+0000\n"
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
"Language: bo\n"
@ -476,6 +476,10 @@ msgstr ""
msgid "File quality"
msgstr ""
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr ""
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr ""
@ -546,6 +550,10 @@ msgstr "དྲ་གནས་རྗེས་འདེད་སྤོ་འབུ
msgid "Remove trackers arguments from the returned URL"
msgstr ""
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr ""
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr "དྲ་ངོས་རྙེད་རྒྱུ་མ་བྱུང་།"
@ -721,27 +729,27 @@ msgstr "རྐང་རྗེས།"
msgid "Answers"
msgstr "ལན།"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "འཚོལ་འབྲས་ཀྱི་ཁ་གྲངས།"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr ""
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "འཚོལ་བཤེར་ནང་དོན་ནི།"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr ""
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr ""
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr ""
@ -768,7 +776,7 @@ msgstr ""
msgid "There is currently no data available. "
msgstr "ཉེ་བར་ཐོབ་རུང་བའི་ཡིག་ཆ་གང་ཡང་མེད།"
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr "སྒུལ་བྱེད་ཀྱི་མིང་།"
@ -781,12 +789,12 @@ msgstr "ཐོབ་སྐར།"
msgid "Result count"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr ""
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr ""
@ -905,7 +913,7 @@ msgstr ""
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr "བདེ་འཇགས་འཚོལ་བཤེར།"
@ -926,7 +934,7 @@ msgid "None"
msgstr "གང་ཡང་མེད།"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "དུས་ཀྱི་ཁྱབ་ཁོངས།"
@ -995,7 +1003,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr ""
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "ཆོག་མཆན།"
@ -1104,19 +1112,27 @@ msgid ""
"these engines by its !bangs."
msgstr ""
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr ""
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "རྒྱབ་སྐྱོར་ཐོབ་པའི་སྐད་རིགས་གདམ་གསེས།"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr ""
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr "མང་མཐའི་དུས་ཚོད།"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2024-04-06 00:18+0000\n"
"Last-Translator: sserra <sserra@users.noreply.translate.codeberg.org>\n"
"Language: ca\n"
@ -494,6 +494,10 @@ msgstr "Valoració de llibre"
msgid "File quality"
msgstr "Qualitat del fitxer"
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr ""
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr "Converteix cadenes en diferents empremtes de hash."
@ -573,6 +577,10 @@ msgstr "Suprimeix l'URL de rastreig"
msgid "Remove trackers arguments from the returned URL"
msgstr "Suprimeix els arguments de rastreig dels URL retornats"
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr ""
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr "No s'ha trobat la pàgina"
@ -752,27 +760,27 @@ msgstr "Galetes"
msgid "Answers"
msgstr "Respostes"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "Nombre de resultats"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr "Informació"
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "Proveu a cercar:"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr "Torna al capdemunt"
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr "Pàgina anterior"
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr "Pàgina següent"
@ -799,7 +807,7 @@ msgstr "cerca"
msgid "There is currently no data available. "
msgstr "Actualment no hi ha dades disponibles. "
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr "Nom del cercador"
@ -812,12 +820,12 @@ msgstr "Valoració"
msgid "Result count"
msgstr "Resultats"
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr "Temps de resposta"
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr "Fiabilitat"
@ -936,7 +944,7 @@ msgstr "Detecció automàtica"
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr "Cerca segura"
@ -957,7 +965,7 @@ msgid "None"
msgstr "Desactivat"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "Interval de temps"
@ -1026,7 +1034,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr "Torna a la pàgina anterior usant el botó de pàgina anterior."
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "Permetre"
@ -1144,19 +1152,27 @@ msgstr ""
"Aquesta pestanya no existeix en la interfície d'usuari, però pots buscar "
"en aquests motors de cerca mitjançant els seus !bangs."
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr "!bang"
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "Suporta la llengua seleccionada"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr "Pes"
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr "Temps màxim"

View file

@ -13,21 +13,23 @@
# zenobit <zen@osowoso.xyz>, 2023.
# return42 <markus.heiser@darmarit.de>, 2023, 2024.
# Fjuro <ifjuro@proton.me>, 2023, 2024.
# Fjuro <fjuro@alius.cz>, 2024.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"PO-Revision-Date: 2024-02-26 16:56+0000\n"
"Last-Translator: Fjuro <ifjuro@proton.me>\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2024-05-10 06:13+0000\n"
"Last-Translator: Fjuro <fjuro@alius.cz>\n"
"Language-Team: Czech <https://translate.codeberg.org/projects/searxng/"
"searxng/cs/>\n"
"Language: cs\n"
"Language-Team: Czech "
"<https://translate.codeberg.org/projects/searxng/searxng/cs/>\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && "
"n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
"X-Generator: Weblate 5.5.2\n"
"Generated-By: Babel 2.14.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
@ -78,7 +80,7 @@ msgstr "rádio"
#. CATEGORY_NAMES['TV']
#: searx/searxng.msg
msgid "tv"
msgstr ""
msgstr "tv"
#. CATEGORY_NAMES['IT']
#: searx/searxng.msg
@ -178,22 +180,22 @@ msgstr "O SearXNG"
#. WEATHER_TERMS['AVERAGE TEMP.']
#: searx/searxng.msg
msgid "Average temp."
msgstr ""
msgstr "Prům. teplota"
#. WEATHER_TERMS['CLOUD COVER']
#: searx/searxng.msg
msgid "Cloud cover"
msgstr ""
msgstr "Pokrytí mraky"
#. WEATHER_TERMS['CONDITION']
#: searx/searxng.msg
msgid "Condition"
msgstr ""
msgstr "Stav"
#. WEATHER_TERMS['CURRENT CONDITION']
#: searx/searxng.msg
msgid "Current condition"
msgstr ""
msgstr "Aktuální stav"
#. WEATHER_TERMS['EVENING']
#: searx/engines/wttr.py:100 searx/searxng.msg
@ -203,22 +205,22 @@ msgstr "Večer"
#. WEATHER_TERMS['FEELS LIKE']
#: searx/searxng.msg
msgid "Feels like"
msgstr ""
msgstr "Pocitová teplota"
#. WEATHER_TERMS['HUMIDITY']
#: searx/searxng.msg
msgid "Humidity"
msgstr ""
msgstr "Vlhkost"
#. WEATHER_TERMS['MAX TEMP.']
#: searx/searxng.msg
msgid "Max temp."
msgstr ""
msgstr "Max. teplota"
#. WEATHER_TERMS['MIN TEMP.']
#: searx/searxng.msg
msgid "Min temp."
msgstr ""
msgstr "Min. teplota"
#. WEATHER_TERMS['MORNING']
#: searx/engines/wttr.py:100 searx/searxng.msg
@ -238,82 +240,82 @@ msgstr "Poledne"
#. WEATHER_TERMS['PRESSURE']
#: searx/searxng.msg
msgid "Pressure"
msgstr ""
msgstr "Tlak"
#. WEATHER_TERMS['SUNRISE']
#: searx/searxng.msg
msgid "Sunrise"
msgstr ""
msgstr "Východ slunce"
#. WEATHER_TERMS['SUNSET']
#: searx/searxng.msg
msgid "Sunset"
msgstr ""
msgstr "Západ slunce"
#. WEATHER_TERMS['TEMPERATURE']
#: searx/searxng.msg
msgid "Temperature"
msgstr ""
msgstr "Teplota"
#. WEATHER_TERMS['UV INDEX']
#: searx/searxng.msg
msgid "UV index"
msgstr ""
msgstr "UV index"
#. WEATHER_TERMS['VISIBILITY']
#: searx/searxng.msg
msgid "Visibility"
msgstr ""
msgstr "Viditelnost"
#. WEATHER_TERMS['WIND']
#: searx/searxng.msg
msgid "Wind"
msgstr ""
msgstr "Vítr"
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
#: searx/searxng.msg
msgid "subscribers"
msgstr ""
msgstr "odběratelé"
#. SOCIAL_MEDIA_TERMS['POSTS']
#: searx/searxng.msg
msgid "posts"
msgstr ""
msgstr "příspěvky"
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
#: searx/searxng.msg
msgid "active users"
msgstr ""
msgstr "aktivní uživatelé"
#. SOCIAL_MEDIA_TERMS['COMMENTS']
#: searx/searxng.msg
msgid "comments"
msgstr ""
msgstr "komentáře"
#. SOCIAL_MEDIA_TERMS['USER']
#: searx/searxng.msg
msgid "user"
msgstr ""
msgstr "uživatel"
#. SOCIAL_MEDIA_TERMS['COMMUNITY']
#: searx/searxng.msg
msgid "community"
msgstr ""
msgstr "komunita"
#. SOCIAL_MEDIA_TERMS['POINTS']
#: searx/searxng.msg
msgid "points"
msgstr ""
msgstr "body"
#. SOCIAL_MEDIA_TERMS['TITLE']
#: searx/searxng.msg
msgid "title"
msgstr ""
msgstr "název"
#. SOCIAL_MEDIA_TERMS['AUTHOR']
#: searx/searxng.msg
msgid "author"
msgstr ""
msgstr "autor"
#: searx/webapp.py:330
msgid "No item found"
@ -491,6 +493,10 @@ msgstr "Hodnocení knih"
msgid "File quality"
msgstr "Množství souborů"
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr "Vypočítejte matematické výrazy pomocí vyhledávací lišty"
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr "Převádí řetězce na různé hash hodnoty."
@ -570,6 +576,10 @@ msgstr "Odstraňovač sledovacích URL"
msgid "Remove trackers arguments from the returned URL"
msgstr "Odstranit sledovací parametry z načtených URL"
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr "Převod mezi jednotkami"
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr "Stránka nenalezena"
@ -747,27 +757,27 @@ msgstr "Cookies"
msgid "Answers"
msgstr "Odpovědi"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "Počet výsledků"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr "Informace"
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "Zkuste vyhledat:"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr "Nahoru"
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr "Předchozí stránka"
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr "Další stránka"
@ -794,7 +804,7 @@ msgstr "vyhledat"
msgid "There is currently no data available. "
msgstr "Aktuálně nejsou k dispozici žádná data. "
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr "Jméno vyhledávače"
@ -807,12 +817,12 @@ msgstr "Skóre"
msgid "Result count"
msgstr "Počet výsledků"
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr "Čas odpovědi"
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr "Spolehlivost"
@ -931,7 +941,7 @@ msgstr "Automatická detekce"
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr "Bezpečné vyhledávání"
@ -952,7 +962,7 @@ msgid "None"
msgstr "Vypnuto"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "Čásový interval"
@ -1021,7 +1031,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr "Vrátit se zpět na předchozí stranu."
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "Povolit"
@ -1138,19 +1148,27 @@ msgstr ""
"Tato karta v uživatelském rozhraní neexistuje, ale můžete v těchto "
"vyhledávačích vyhledávat podle jejích !bang."
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr "Povolit vše"
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr "Zakázat vše"
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr "!bang"
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "Podporuje vybraný jazyk"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr "Váha"
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr "Max. čas"
@ -1905,4 +1923,3 @@ msgstr "skrýt video"
#~ "Nenašli jsme žádné výsledky. Použijte "
#~ "prosím jiný dotaz nebo hledejte ve "
#~ "více kategoriích."

View file

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2023-11-23 06:13+0000\n"
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
"Language: cy\n"
@ -486,6 +486,10 @@ msgstr "Gradd llyfr"
msgid "File quality"
msgstr ""
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr ""
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr "Trosi llinynnau i wahanol dreuliadau hash."
@ -556,6 +560,10 @@ msgstr ""
msgid "Remove trackers arguments from the returned URL"
msgstr ""
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr ""
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr ""
@ -731,27 +739,27 @@ msgstr "Cwcis"
msgid "Answers"
msgstr "Atebion"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "Nifer o ganlyniadau"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr "Gwybodaeth"
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "Rho gynnig ar chwilio am:"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr ""
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr ""
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr ""
@ -778,7 +786,7 @@ msgstr "chwilio"
msgid "There is currently no data available. "
msgstr "Does dim data ar gael ar hyn o bryd."
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr ""
@ -791,12 +799,12 @@ msgstr "Sgoriau"
msgid "Result count"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr ""
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr ""
@ -915,7 +923,7 @@ msgstr ""
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr ""
@ -936,7 +944,7 @@ msgid "None"
msgstr "Dim"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "Cyfnod amser"
@ -1005,7 +1013,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr ""
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "Caniatáu"
@ -1114,19 +1122,27 @@ msgid ""
"these engines by its !bangs."
msgstr ""
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr ""
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "Cefnogir yr iaith a ddewiswyd"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr ""
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr ""

View file

@ -8,21 +8,22 @@
# Markus Heiser <markus.heiser@darmarit.de>, 2022.
# return42 <markus.heiser@darmarit.de>, 2023.
# return42 <return42@users.noreply.translate.codeberg.org>, 2024.
# lolmeOzzi <lolmeOzzi@users.noreply.translate.codeberg.org>, 2024.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"PO-Revision-Date: 2024-04-04 14:18+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>"
"\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2024-05-23 23:17+0000\n"
"Last-Translator: lolmeOzzi <lolmeOzzi@users.noreply.translate.codeberg.org>\n"
"Language-Team: Danish <https://translate.codeberg.org/projects/searxng/"
"searxng/da/>\n"
"Language: da\n"
"Language-Team: Danish "
"<https://translate.codeberg.org/projects/searxng/searxng/da/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5.5\n"
"Generated-By: Babel 2.14.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
@ -73,7 +74,7 @@ msgstr "Radio"
#. CATEGORY_NAMES['TV']
#: searx/searxng.msg
msgid "tv"
msgstr ""
msgstr "tv"
#. CATEGORY_NAMES['IT']
#: searx/searxng.msg
@ -173,22 +174,22 @@ msgstr "Om"
#. WEATHER_TERMS['AVERAGE TEMP.']
#: searx/searxng.msg
msgid "Average temp."
msgstr ""
msgstr "Gennemsnitlig temp."
#. WEATHER_TERMS['CLOUD COVER']
#: searx/searxng.msg
msgid "Cloud cover"
msgstr ""
msgstr "Skydække"
#. WEATHER_TERMS['CONDITION']
#: searx/searxng.msg
msgid "Condition"
msgstr ""
msgstr "Forhold"
#. WEATHER_TERMS['CURRENT CONDITION']
#: searx/searxng.msg
msgid "Current condition"
msgstr ""
msgstr "Nuværende forhold"
#. WEATHER_TERMS['EVENING']
#: searx/engines/wttr.py:100 searx/searxng.msg
@ -198,22 +199,22 @@ msgstr "Aften"
#. WEATHER_TERMS['FEELS LIKE']
#: searx/searxng.msg
msgid "Feels like"
msgstr ""
msgstr "Føles som"
#. WEATHER_TERMS['HUMIDITY']
#: searx/searxng.msg
msgid "Humidity"
msgstr ""
msgstr "Luftfugtighed"
#. WEATHER_TERMS['MAX TEMP.']
#: searx/searxng.msg
msgid "Max temp."
msgstr ""
msgstr "Maks. temp."
#. WEATHER_TERMS['MIN TEMP.']
#: searx/searxng.msg
msgid "Min temp."
msgstr ""
msgstr "Min. temp."
#. WEATHER_TERMS['MORNING']
#: searx/engines/wttr.py:100 searx/searxng.msg
@ -233,82 +234,82 @@ msgstr "Middag"
#. WEATHER_TERMS['PRESSURE']
#: searx/searxng.msg
msgid "Pressure"
msgstr ""
msgstr "Tryk"
#. WEATHER_TERMS['SUNRISE']
#: searx/searxng.msg
msgid "Sunrise"
msgstr ""
msgstr "Solopgang"
#. WEATHER_TERMS['SUNSET']
#: searx/searxng.msg
msgid "Sunset"
msgstr ""
msgstr "Solnedgang"
#. WEATHER_TERMS['TEMPERATURE']
#: searx/searxng.msg
msgid "Temperature"
msgstr ""
msgstr "Temperatur"
#. WEATHER_TERMS['UV INDEX']
#: searx/searxng.msg
msgid "UV index"
msgstr ""
msgstr "UV index"
#. WEATHER_TERMS['VISIBILITY']
#: searx/searxng.msg
msgid "Visibility"
msgstr ""
msgstr "Sigtbarhed"
#. WEATHER_TERMS['WIND']
#: searx/searxng.msg
msgid "Wind"
msgstr ""
msgstr "Vind"
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
#: searx/searxng.msg
msgid "subscribers"
msgstr ""
msgstr "abonnenter"
#. SOCIAL_MEDIA_TERMS['POSTS']
#: searx/searxng.msg
msgid "posts"
msgstr ""
msgstr "opslag"
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
#: searx/searxng.msg
msgid "active users"
msgstr ""
msgstr "aktive brugere"
#. SOCIAL_MEDIA_TERMS['COMMENTS']
#: searx/searxng.msg
msgid "comments"
msgstr ""
msgstr "kommentare"
#. SOCIAL_MEDIA_TERMS['USER']
#: searx/searxng.msg
msgid "user"
msgstr ""
msgstr "bruger"
#. SOCIAL_MEDIA_TERMS['COMMUNITY']
#: searx/searxng.msg
msgid "community"
msgstr ""
msgstr "fællesskab"
#. SOCIAL_MEDIA_TERMS['POINTS']
#: searx/searxng.msg
msgid "points"
msgstr ""
msgstr "point"
#. SOCIAL_MEDIA_TERMS['TITLE']
#: searx/searxng.msg
msgid "title"
msgstr ""
msgstr "titel"
#. SOCIAL_MEDIA_TERMS['AUTHOR']
#: searx/searxng.msg
msgid "author"
msgstr ""
msgstr "forfatter"
#: searx/webapp.py:330
msgid "No item found"
@ -487,6 +488,10 @@ msgstr "Bogbedømmelse"
msgid "File quality"
msgstr "Filkvalitet"
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr "Udregn matematiske udtryk via søgefeltet"
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr "Konverterer strenge til forskellige hash-digests."
@ -568,6 +573,10 @@ msgstr "Fjernelse af tracker URL"
msgid "Remove trackers arguments from the returned URL"
msgstr "Fjern trackeres parametre fra den returnerede URL"
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr "Konverter mellem enheder"
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr "Side ikke fundet"
@ -747,27 +756,27 @@ msgstr "Cookies"
msgid "Answers"
msgstr "Svar"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "Antal resultater"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr "Info"
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "Prøv at søge efter:"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr "Tilbage til toppen"
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr "Forrige side"
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr "Næste side"
@ -794,7 +803,7 @@ msgstr "søg"
msgid "There is currently no data available. "
msgstr "Der er pt. ingen tilgængelige data. "
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr "Søgemaskinenavn"
@ -807,12 +816,12 @@ msgstr "Vægtninger"
msgid "Result count"
msgstr "Antal resultater"
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr "Svartid"
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr "Driftsikkerhed"
@ -931,7 +940,7 @@ msgstr "Automatisk registrering"
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr "Sikker Søgning"
@ -952,7 +961,7 @@ msgid "None"
msgstr "Ingen"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "Tidsinterval"
@ -1021,7 +1030,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr "Gå til den forrige side med Forrige-side-knappen."
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "Tillad"
@ -1121,7 +1130,7 @@ msgstr "Indsæt kopieret indstillinger-hash (uden URL) for at gendanne"
#: searx/templates/simple/preferences/cookies.html:59
msgid "Preferences hash"
msgstr ""
msgstr "Præference hash"
#: searx/templates/simple/preferences/doi_resolver.html:2
msgid "Open Access DOI resolver"
@ -1139,19 +1148,27 @@ msgstr ""
"Denne fane eksisterer ikke i brugergrænsefladen, men du kan søge i disse "
"søgemaskiner via dens !bangs."
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr "Aktiver alle"
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr "Deaktiver alle"
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr "!bang"
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "Understøtter valgte sprog"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr "Vægt"
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr "Maks-tid"
@ -1397,11 +1414,11 @@ msgstr "Version"
#: searx/templates/simple/result_templates/packages.html:18
msgid "Maintainer"
msgstr ""
msgstr "Vedligeholder"
#: searx/templates/simple/result_templates/packages.html:24
msgid "Updated at"
msgstr ""
msgstr "Opdateret ved"
#: searx/templates/simple/result_templates/packages.html:30
#: searx/templates/simple/result_templates/paper.html:25
@ -1410,7 +1427,7 @@ msgstr "Tags"
#: searx/templates/simple/result_templates/packages.html:36
msgid "Popularity"
msgstr ""
msgstr "Popularitet"
#: searx/templates/simple/result_templates/packages.html:42
msgid "License"
@ -1418,11 +1435,11 @@ msgstr "Licens"
#: searx/templates/simple/result_templates/packages.html:52
msgid "Project"
msgstr ""
msgstr "Projekt"
#: searx/templates/simple/result_templates/packages.html:55
msgid "Project homepage"
msgstr ""
msgstr "Projekt hjemmeside"
#: searx/templates/simple/result_templates/paper.html:5
msgid "Published date"
@ -1906,4 +1923,3 @@ msgstr "skjul video"
#~ "Vi fandt ingen resultater. Benyt "
#~ "venligst en anden søge-streng eller "
#~ "søg i flere kategorier."

View file

@ -20,26 +20,29 @@
# Markus Heiser <markus.heiser@darmarit.de>, 2022.
# Peter Martin <weblate@pe7er.com>, 2022.
# return42 <markus.heiser@darmarit.de>, 2023, 2024.
# return42 <return42@users.noreply.translate.codeberg.org>, 2024.
# German <German@users.noreply.translate.codeberg.org>, 2024.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"PO-Revision-Date: 2024-02-26 16:56+0000\n"
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2024-05-10 06:13+0000\n"
"Last-Translator: German <German@users.noreply.translate.codeberg.org>\n"
"Language-Team: German <https://translate.codeberg.org/projects/searxng/"
"searxng/de/>\n"
"Language: de\n"
"Language-Team: German "
"<https://translate.codeberg.org/projects/searxng/searxng/de/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5.2\n"
"Generated-By: Babel 2.14.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
#: searx/searxng.msg
msgid "without further subgrouping"
msgstr "ohne weitere Untergruppierung"
msgstr "keine weitere Untergruppierung"
#. CONSTANT_NAMES['DEFAULT_CATEGORY']
#: searx/searxng.msg
@ -84,7 +87,7 @@ msgstr "Radio"
#. CATEGORY_NAMES['TV']
#: searx/searxng.msg
msgid "tv"
msgstr ""
msgstr "TV"
#. CATEGORY_NAMES['IT']
#: searx/searxng.msg
@ -104,7 +107,7 @@ msgstr "Karte"
#. CATEGORY_NAMES['ONIONS']
#: searx/searxng.msg
msgid "onions"
msgstr "Onion"
msgstr "Zwiebel"
#. CATEGORY_NAMES['SCIENCE']
#: searx/searxng.msg
@ -159,7 +162,7 @@ msgstr "wissenschaftliche Veröffentlichungen"
#. STYLE_NAMES['AUTO']
#: searx/searxng.msg
msgid "auto"
msgstr "auto"
msgstr "automatisch"
#. STYLE_NAMES['LIGHT']
#: searx/searxng.msg
@ -184,22 +187,22 @@ msgstr "Über"
#. WEATHER_TERMS['AVERAGE TEMP.']
#: searx/searxng.msg
msgid "Average temp."
msgstr ""
msgstr "Mittlere Temp."
#. WEATHER_TERMS['CLOUD COVER']
#: searx/searxng.msg
msgid "Cloud cover"
msgstr ""
msgstr "Bewölkung"
#. WEATHER_TERMS['CONDITION']
#: searx/searxng.msg
msgid "Condition"
msgstr ""
msgstr "Bedingung"
#. WEATHER_TERMS['CURRENT CONDITION']
#: searx/searxng.msg
msgid "Current condition"
msgstr ""
msgstr "Aktuelle Bedingung"
#. WEATHER_TERMS['EVENING']
#: searx/engines/wttr.py:100 searx/searxng.msg
@ -209,22 +212,22 @@ msgstr "Abends"
#. WEATHER_TERMS['FEELS LIKE']
#: searx/searxng.msg
msgid "Feels like"
msgstr ""
msgstr "Gefühlt wie"
#. WEATHER_TERMS['HUMIDITY']
#: searx/searxng.msg
msgid "Humidity"
msgstr ""
msgstr "Luftfeuchtigkeit"
#. WEATHER_TERMS['MAX TEMP.']
#: searx/searxng.msg
msgid "Max temp."
msgstr ""
msgstr "Max."
#. WEATHER_TERMS['MIN TEMP.']
#: searx/searxng.msg
msgid "Min temp."
msgstr ""
msgstr "Min."
#. WEATHER_TERMS['MORNING']
#: searx/engines/wttr.py:100 searx/searxng.msg
@ -244,82 +247,82 @@ msgstr "Mittags"
#. WEATHER_TERMS['PRESSURE']
#: searx/searxng.msg
msgid "Pressure"
msgstr ""
msgstr "Luftdruck"
#. WEATHER_TERMS['SUNRISE']
#: searx/searxng.msg
msgid "Sunrise"
msgstr ""
msgstr "Sonnenaufgang"
#. WEATHER_TERMS['SUNSET']
#: searx/searxng.msg
msgid "Sunset"
msgstr ""
msgstr "Sonnenuntergang"
#. WEATHER_TERMS['TEMPERATURE']
#: searx/searxng.msg
msgid "Temperature"
msgstr ""
msgstr "Temperatur"
#. WEATHER_TERMS['UV INDEX']
#: searx/searxng.msg
msgid "UV index"
msgstr ""
msgstr "UV-Index"
#. WEATHER_TERMS['VISIBILITY']
#: searx/searxng.msg
msgid "Visibility"
msgstr ""
msgstr "Sichtweite"
#. WEATHER_TERMS['WIND']
#: searx/searxng.msg
msgid "Wind"
msgstr ""
msgstr "Sturm"
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
#: searx/searxng.msg
msgid "subscribers"
msgstr ""
msgstr "Abonnenten"
#. SOCIAL_MEDIA_TERMS['POSTS']
#: searx/searxng.msg
msgid "posts"
msgstr ""
msgstr "Beiträge"
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
#: searx/searxng.msg
msgid "active users"
msgstr ""
msgstr "aktive Nutzer"
#. SOCIAL_MEDIA_TERMS['COMMENTS']
#: searx/searxng.msg
msgid "comments"
msgstr ""
msgstr "Kommentare"
#. SOCIAL_MEDIA_TERMS['USER']
#: searx/searxng.msg
msgid "user"
msgstr ""
msgstr "Benutzer"
#. SOCIAL_MEDIA_TERMS['COMMUNITY']
#: searx/searxng.msg
msgid "community"
msgstr ""
msgstr "Community"
#. SOCIAL_MEDIA_TERMS['POINTS']
#: searx/searxng.msg
msgid "points"
msgstr ""
msgstr "Punkte"
#. SOCIAL_MEDIA_TERMS['TITLE']
#: searx/searxng.msg
msgid "title"
msgstr ""
msgstr "Titel"
#. SOCIAL_MEDIA_TERMS['AUTHOR']
#: searx/searxng.msg
msgid "author"
msgstr ""
msgstr "Autor/-in"
#: searx/webapp.py:330
msgid "No item found"
@ -498,6 +501,10 @@ msgstr "Buchbewertung"
msgid "File quality"
msgstr "Dateiqualität"
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr "Rechne mathematische Ausdrücke mit der Suchleiste aus"
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr "Konvertiert Zeichenketten in verschiedene Hashwerte."
@ -583,6 +590,10 @@ msgstr "Tracker-URL-Entferner"
msgid "Remove trackers arguments from the returned URL"
msgstr "Tracker-Argumente von den zurückgegebenen URLs entfernen"
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr "Einheiten umrechnen"
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr "Seite nicht gefunden"
@ -764,27 +775,27 @@ msgstr "Cookies"
msgid "Answers"
msgstr "Antworten"
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr "Trefferanzahl"
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr "Information"
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr "Suche nach:"
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr "Zurück zum Anfang"
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr "Vorherige Seite"
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr "Nächste Seite"
@ -811,7 +822,7 @@ msgstr "suchen"
msgid "There is currently no data available. "
msgstr "Es sind derzeit keine Daten vorhanden. "
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr "Suchmaschinenname"
@ -824,12 +835,12 @@ msgstr "Punkte"
msgid "Result count"
msgstr "Ergebnisanzahl"
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr "Antwortzeit"
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr "Zuverlässigkeit"
@ -948,7 +959,7 @@ msgstr "Spracherkennung"
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr "Sichere Suche"
@ -969,7 +980,7 @@ msgid "None"
msgstr "Keine"
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr "Zeitbereich"
@ -1015,15 +1026,15 @@ msgstr "Es gibt keine weiteren Ergebnisse zu dem Suchbegriff:"
#: searx/templates/simple/messages/no_results.html:19
msgid "Refresh the page."
msgstr "Suche wiederholen"
msgstr "Die Seite neuladen."
#: searx/templates/simple/messages/no_results.html:20
msgid "Search for another query or select another category (above)."
msgstr "einen anderen Suchbegriff verwenden oder die Kategorie (oben) wechseln"
msgstr "Einen anderen Suchbegriff verwenden oder die Kategorie (oben) wechseln."
#: searx/templates/simple/messages/no_results.html:21
msgid "Change the search engine used in the preferences:"
msgstr "Anpassen der verwendeten Suchmaschinen in den Einstellungen"
msgstr "Ändern der verwendeten Suchmaschinen in den Einstellungen:"
#: searx/templates/simple/messages/no_results.html:22
msgid "Switch to another instance:"
@ -1038,7 +1049,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr "Zurück zur vorherigen Seite über unten stehenden Button."
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr "Erlauben"
@ -1156,19 +1167,27 @@ msgstr ""
"Diese Registerkarte ist in der Benutzeroberfläche nicht vorhanden, aber "
"in Suchmaschinen kann mittels !bang gesucht werden."
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr "Alle aktivieren"
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr "Alle deaktivieren"
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr "!bang"
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr "Sprachen"
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr "Gewichtung"
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr "max. Zeit"
@ -1202,7 +1221,7 @@ msgstr "Zurück"
#: searx/templates/simple/preferences/hotkeys.html:2
msgid "Hotkeys"
msgstr "Hotkeys"
msgstr "Funktionstasten"
#: searx/templates/simple/preferences/hotkeys.html:13
msgid "Vim-like"
@ -1939,4 +1958,3 @@ msgstr "Video verstecken"
#~ "werden. Bitte nutze einen anderen "
#~ "Suchbegriff, oder suche das gewünschte "
#~ "in einer anderen Kategorie."

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-04-26 05:37+0000\n"
"POT-Creation-Date: 2024-05-09 15:27+0000\n"
"PO-Revision-Date: 2022-11-04 07:18+0000\n"
"Last-Translator: Landhoo School Students "
"<landhooschoolstudents@gmail.com>\n"
@ -474,6 +474,10 @@ msgstr ""
msgid "File quality"
msgstr ""
#: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar"
msgstr ""
#: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests."
msgstr ""
@ -544,6 +548,10 @@ msgstr ""
msgid "Remove trackers arguments from the returned URL"
msgstr ""
#: searx/plugins/unit_converter.py:29
msgid "Convert between units"
msgstr ""
#: searx/templates/simple/404.html:4
msgid "Page not found"
msgstr ""
@ -719,27 +727,27 @@ msgstr ""
msgid "Answers"
msgstr ""
#: searx/templates/simple/results.html:38
#: searx/templates/simple/results.html:42
msgid "Number of results"
msgstr ""
#: searx/templates/simple/results.html:44
#: searx/templates/simple/results.html:48
msgid "Info"
msgstr ""
#: searx/templates/simple/results.html:73
#: searx/templates/simple/results.html:77
msgid "Try searching for:"
msgstr ""
#: searx/templates/simple/results.html:105
#: searx/templates/simple/results.html:109
msgid "Back to top"
msgstr ""
#: searx/templates/simple/results.html:123
#: searx/templates/simple/results.html:127
msgid "Previous page"
msgstr ""
#: searx/templates/simple/results.html:141
#: searx/templates/simple/results.html:145
msgid "Next page"
msgstr ""
@ -766,7 +774,7 @@ msgstr ""
msgid "There is currently no data available. "
msgstr ""
#: searx/templates/simple/preferences/engines.html:18
#: searx/templates/simple/preferences/engines.html:24
#: searx/templates/simple/stats.html:25
msgid "Engine name"
msgstr ""
@ -779,12 +787,12 @@ msgstr ""
msgid "Result count"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/preferences/engines.html:31
#: searx/templates/simple/stats.html:28
msgid "Response time"
msgstr ""
#: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/preferences/engines.html:35
#: searx/templates/simple/stats.html:29
msgid "Reliability"
msgstr ""
@ -903,7 +911,7 @@ msgstr ""
#: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/filters/safesearch.html:4
#: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch"
msgstr ""
@ -924,7 +932,7 @@ msgid "None"
msgstr ""
#: searx/templates/simple/filters/time_range.html:1
#: searx/templates/simple/preferences/engines.html:22
#: searx/templates/simple/preferences/engines.html:28
msgid "Time range"
msgstr ""
@ -993,7 +1001,7 @@ msgid "Go back to the previous page using the previous page button."
msgstr ""
#: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17
#: searx/templates/simple/preferences/engines.html:23
msgid "Allow"
msgstr ""
@ -1102,19 +1110,27 @@ msgid ""
"these engines by its !bangs."
msgstr ""
#: searx/templates/simple/preferences/engines.html:19
#: searx/templates/simple/preferences/engines.html:15
msgid "Enable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:16
msgid "Disable all"
msgstr ""
#: searx/templates/simple/preferences/engines.html:25
msgid "!bang"
msgstr ""
#: searx/templates/simple/preferences/engines.html:20
#: searx/templates/simple/preferences/engines.html:26
msgid "Supports selected language"
msgstr ""
#: searx/templates/simple/preferences/engines.html:23
#: searx/templates/simple/preferences/engines.html:29
msgid "Weight"
msgstr ""
#: searx/templates/simple/preferences/engines.html:27
#: searx/templates/simple/preferences/engines.html:33
msgid "Max time"
msgstr ""

Some files were not shown because too many files have changed in this diff Show more