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>` - Bernie Huang `<https://github.com/BernieHuang2008>`
- Austin Olacsi `<https://github.com/Austin-Olacsi>` - Austin Olacsi `<https://github.com/Austin-Olacsi>`
- @micsthepick - @micsthepick
- Daniel Kukula `<https://github.com/dkuku>`

View file

@ -563,3 +563,7 @@ type.
* - source_code_url * - source_code_url
- :py:class:`str` - :py:class:`str`
- the location of the project's source code - 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>` - :ref:`no user tracking / no profiling <SearXNG protect privacy>`
- script & cookies are optional - script & cookies are optional
- secure, encrypted connections - 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 60 translations <https://translate.codeberg.org/projects/searxng/searxng/>`_
- about 100 `well maintained <https://uptime.searxng.org/>`__ instances on searx.space_ - about 100 `well maintained <https://uptime.searxng.org/>`__ instances on searx.space_
- :ref:`easy integration of search engines <demo online engine>` - :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 mock==5.1.0
nose2[coverage_plugin]==0.14.1 nose2[coverage_plugin]==0.14.2
cov-core==1.15.0 cov-core==1.15.0
black==24.3.0 black==24.3.0
pylint==3.1.0 pylint==3.2.2
splinter==0.21.0 splinter==0.21.0
selenium==4.20.0 selenium==4.21.0
Pallets-Sphinx-Themes==2.1.2 Pallets-Sphinx-Themes==2.1.3
Sphinx<=7.1.2; python_version == '3.8' Sphinx<=7.1.2; python_version == '3.8'
Sphinx==7.3.7; python_version > '3.8' Sphinx==7.3.7; python_version > '3.8'
sphinx-issues==4.1.0 sphinx-issues==4.1.0
@ -13,10 +13,13 @@ sphinx-jinja==2.0.2
sphinx-tabs==3.4.5 sphinx-tabs==3.4.5
sphinxcontrib-programoutput==0.17 sphinxcontrib-programoutput==0.17
sphinx-autobuild==2021.3.14 sphinx-autobuild==2021.3.14
sphinx-notfound-page==1.0.0 sphinx-notfound-page==1.0.2
myst-parser==2.0.0 myst-parser==3.0.1
linuxdoc==20231020 linuxdoc==20240509
aiounittest==1.4.2 aiounittest==1.4.2
yamllint==1.35.1 yamllint==1.35.1
wlc==1.14 wlc==1.14
coloredlogs==15.0.1 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 certifi==2024.2.2
babel==2.14.0 babel==2.15.0
flask-babel==4.0.0 flask-babel==4.0.0
flask==3.0.3 flask==3.0.3
jinja2==3.1.3 jinja2==3.1.4
lxml==5.2.1 lxml==5.2.2
pygments==2.17.2 pygments==2.18.0
python-dateutil==2.9.0.post0 python-dateutil==2.9.0.post0
pyyaml==6.0.1 pyyaml==6.0.1
httpx[http2]==0.24.1 httpx[http2]==0.24.1
@ -15,4 +15,4 @@ setproctitle==1.3.3
redis==5.0.4 redis==5.0.4
markdown-it-py==3.0.0 markdown-it-py==3.0.0
fasttext-predict==0.9.2.2 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 typing
import logging import logging
import pathlib 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'] __all__ = ['Config', 'UNSET', 'SchemaIssue']
@ -61,7 +72,7 @@ class Config:
# init schema # init schema
log.debug("load schema file: %s", schema_file) 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(): if not cfg_file.exists():
log.warning("missing config file: %s", cfg_file) log.warning("missing config file: %s", cfg_file)
return cfg return cfg
@ -69,12 +80,7 @@ class Config:
# load configuration # load configuration
log.debug("load config file: %s", cfg_file) log.debug("load config file: %s", cfg_file)
try: upd_cfg = toml_load(cfg_file)
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
is_valid, issue_list = cfg.validate(upd_cfg) is_valid, issue_list = cfg.validate(upd_cfg)
for msg in issue_list: for msg in issue_list:
@ -176,6 +182,25 @@ class Config:
return getattr(m, name) 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 # working with dictionaries

File diff suppressed because it is too large Load diff

View file

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

File diff suppressed because one or more lines are too long

View file

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

View file

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

View file

@ -1084,41 +1084,6 @@
"symbol": "cr", "symbol": "cr",
"to_si_factor": null "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": { "Q1140444": {
"si_name": null, "si_name": null,
"symbol": "Zb", "symbol": "Zb",
@ -1404,6 +1369,141 @@
"symbol": "cm H₂O", "symbol": "cm H₂O",
"to_si_factor": 98.0665 "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": { "Q12714022": {
"si_name": "Q11570", "si_name": "Q11570",
"symbol": "cwt", "symbol": "cwt",
@ -4506,7 +4606,7 @@
}, },
"Q829073": { "Q829073": {
"si_name": "Q33680", "si_name": "Q33680",
"symbol": null, "symbol": "\"",
"to_si_factor": 4.84813681109536e-06 "to_si_factor": 4.84813681109536e-06
}, },
"Q83216": { "Q83216": {

View file

@ -133,7 +133,7 @@ def _get_result(item):
'publisher': extract_text(eval_xpath(item, './/div[contains(@class, "text-sm")]')), 'publisher': extract_text(eval_xpath(item, './/div[contains(@class, "text-sm")]')),
'authors': [extract_text(eval_xpath(item, './/div[contains(@class, "italic")]'))], 'authors': [extract_text(eval_xpath(item, './/div[contains(@class, "italic")]'))],
'content': extract_text(eval_xpath(item, './/div[contains(@class, "text-xs")]')), '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' url = base_url + link.attrib.get('href') + '#downloads'
title = extract_text(link) title = extract_text(link)
img_src = base_url + eval_xpath_getindex(result, './/img/@src', 0) thumbnail = base_url + eval_xpath_getindex(result, './/img/@src', 0)
res = {'url': url, 'title': title, 'img_src': img_src} res = {'url': url, 'title': title, 'thumbnail': thumbnail}
results.append(res) results.append(res)

View file

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

View file

@ -66,7 +66,7 @@ def response(resp):
"title": item['title'], "title": item['title'],
"content": item['abstract'], "content": item['abstract'],
"publishedDate": pubdate_original, "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), "metadata": ' | '.join(metadata),
} }
) )

View file

@ -68,7 +68,7 @@ def response(resp):
thumbnail = result.xpath('.//div[@class="art"]/img/@src') thumbnail = result.xpath('.//div[@class="art"]/img/@src')
if thumbnail: 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] result_id = parse_qs(urlparse(link.get('href')).query)["search_item_id"][0]
itemtype = extract_text(result.xpath('.//div[@class="itemtype"]')).lower() 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'): for entry in search_results.xpath('./result/doc'):
content = "No description available" content = "No description available"
url = ""
title = ""
date = datetime.now() # needed in case no dcdate is available for an item date = datetime.now() # needed in case no dcdate is available for an item
for item in entry: for item in entry:
if item.attrib["name"] == "dcdate": if item.attrib["name"] == "dcdate":
date = item.text date = item.text

View file

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

View file

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

View file

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

View file

@ -46,23 +46,20 @@ def response(resp):
if recipe['submissionDate']: if recipe['submissionDate']:
publishedDate = datetime.strptime(result['recipe']['submissionDate'][:19], "%Y-%m-%dT%H:%M:%S") publishedDate = datetime.strptime(result['recipe']['submissionDate'][:19], "%Y-%m-%dT%H:%M:%S")
content = ( content = [
"difficulity: " f"Schwierigkeitsstufe (1-3): {recipe['difficulty']}",
+ str(recipe['difficulty']) f"Zubereitungszeit: {recipe['preparationTime']}min",
+ " / preparation time: " f"Anzahl der Zutaten: {recipe['ingredientCount']}",
+ str(recipe['preparationTime']) ]
+ "min / ingredient count: "
+ str(recipe['ingredientCount'])
)
if recipe['subtitle']: if recipe['subtitle']:
content = f"{recipe['subtitle']} / {content}" content.insert(0, recipe['subtitle'])
results.append( results.append(
{ {
'url': recipe['siteUrl'], 'url': recipe['siteUrl'],
'title': recipe['title'], 'title': recipe['title'],
'content': content, 'content': " | ".join(content),
'thumbnail': recipe['previewImageUrlTemplate'].replace("<format>", thumbnail_format), 'thumbnail': recipe['previewImageUrlTemplate'].replace("<format>", thumbnail_format),
'publishedDate': publishedDate, '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", ""), 'url': base_url + ("_/" if is_official else "r/") + item.get("slug", ""),
'title': item.get("name"), 'title': item.get("name"),
'content': item.get("short_description"), '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"), 'package_name': item.get("name"),
'maintainer': item["publisher"].get("name"), 'maintainer': item["publisher"].get("name"),
'publishedDate': parser.parse(item.get("updated_at") or item.get("created_at")), '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) len_tr_rows = len(tr_rows)
offset = 0 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: while len_tr_rows >= offset + 4:
# assemble table rows we need to scrap # assemble table rows we need to scrap
@ -379,7 +392,9 @@ def fetch_traits(engine_traits: EngineTraits):
SearXNG's locale. 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 # fetch regions
engine_traits.all_locale = 'wt-wt' engine_traits.all_locale = 'wt-wt'
@ -390,11 +405,9 @@ def fetch_traits(engine_traits: EngineTraits):
if not resp.ok: # type: ignore if not resp.ok: # type: ignore
print("ERROR: response from DuckDuckGo is not OK.") print("ERROR: response from DuckDuckGo is not OK.")
pos = resp.text.find('regions:{') + 8 # type: ignore js_code = extr(resp.text, 'regions:', ',snippetLengths')
js_code = resp.text[pos:] # type: ignore
pos = js_code.find('}') + 1
regions = json.loads(js_code[:pos])
regions = json.loads(js_code)
for eng_tag, name in regions.items(): for eng_tag, name in regions.items():
if eng_tag == 'wt-wt': if eng_tag == 'wt-wt':
@ -426,12 +439,9 @@ def fetch_traits(engine_traits: EngineTraits):
engine_traits.custom['lang_region'] = {} engine_traits.custom['lang_region'] = {}
pos = resp.text.find('languages:{') + 10 # type: ignore js_code = extr(resp.text, 'languages:', ',regions')
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)
languages = js_variable_to_python(js_code)
for eng_lang, name in languages.items(): for eng_lang, name in languages.items():
if eng_lang == 'wt_WT': 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() + 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 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'], 'url': hit['result']['url'],
'title': hit['result']['full_title'], 'title': hit['result']['full_title'],
'content': content, 'content': content,
'img_src': hit['result']['song_art_image_thumbnail_url'], 'thumbnail': hit['result']['song_art_image_thumbnail_url'],
} }
if timestamp: if timestamp:
result.update({'publishedDate': datetime.fromtimestamp(timestamp)}) result.update({'publishedDate': datetime.fromtimestamp(timestamp)})
@ -68,7 +68,7 @@ def parse_artist(hit):
'url': hit['result']['url'], 'url': hit['result']['url'],
'title': hit['result']['name'], 'title': hit['result']['name'],
'content': '', 'content': '',
'img_src': hit['result']['image_url'], 'thumbnail': hit['result']['image_url'],
} }
return result return result
@ -84,7 +84,7 @@ def parse_album(hit):
return { return {
'url': res['url'], 'url': res['url'],
'title': res['full_title'], 'title': res['full_title'],
'img_src': res['cover_art_url'], 'thumbnail': res['cover_art_url'],
'content': content.strip(), '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'), 'url': item.get('html_url'),
'title': item.get('full_name'), 'title': item.get('full_name'),
'content': ' / '.join(content), 'content': ' / '.join(content),
'img_src': item.get('owner', {}).get('avatar_url'), 'thumbnail': item.get('owner', {}).get('avatar_url'),
'package_name': item.get('name'), 'package_name': item.get('name'),
# 'version': item.get('updated_at'), # 'version': item.get('updated_at'),
'maintainer': item.get('owner', {}).get('login'), '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)), 'url': base_url + extract_text(eval_xpath(result, url_xpath)),
'title': extract_text(eval_xpath(result, title_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)), 'content': extract_text(eval_xpath(result, info_text_xpath)),
'metadata': extract_text(eval_xpath(result, author_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")]' results_xpath = './/div[contains(@jscontroller, "SC7lYd")]'
title_xpath = './/a/h3[1]' title_xpath = './/a/h3[1]'
href_xpath = './/a[h3]/@href' 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 # Suggestions are links placed in a *card-section*, we extract only the text
# from the links not the links itself. # 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) logger.debug('ignoring item from the result_xpath list: missing content of title "%s"', title)
continue continue
img_src = content_nodes[0].xpath('.//img/@src') thumbnail = content_nodes[0].xpath('.//img/@src')
if img_src: if thumbnail:
img_src = img_src[0] thumbnail = thumbnail[0]
if img_src.startswith('data:image'): if thumbnail.startswith('data:image'):
img_id = content_nodes[0].xpath('.//img/@id') img_id = content_nodes[0].xpath('.//img/@id')
if img_id: if img_id:
img_src = data_image_map.get(img_id[0]) thumbnail = data_image_map.get(img_id[0])
else: 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 except Exception as e: # pylint: disable=broad-except
logger.error(e, exc_info=True) logger.error(e, exc_info=True)

View file

@ -165,14 +165,14 @@ def response(resp):
# "https://lh3.googleusercontent.com/DjhQh7DMszk.....z=-p-h100-w100" # "https://lh3.googleusercontent.com/DjhQh7DMszk.....z=-p-h100-w100"
# These URL are long but not personalized (double checked via tor). # 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( results.append(
{ {
'url': href, 'url': href,
'title': title, 'title': title,
'content': content, '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]')) title = extract_text(eval_xpath(div_2, './div[@title]'))
metadata = extract_text(eval_xpath(div_2, './div[@class]')) metadata = extract_text(eval_xpath(div_2, './div[@class]'))
img = eval_xpath(div_1, './/img')[0] img = eval_xpath(div_1, './/img')[0]
img_src = img.get('src') thumbnail = img.get('src')
results.append( results.append(
{ {
"url": url, "url": url,
"title": title, "title": title,
"content": sec_name, "content": sec_name,
"img_src": img_src, "thumbnail": thumbnail,
'metadata': metadata, 'metadata': metadata,
'template': 'videos.html', 'template': 'videos.html',
} }

View file

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

View file

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

View file

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

View file

@ -104,11 +104,11 @@ def response(resp):
item['metadata'] = html_to_text(result.get('meta_short', '')) item['metadata'] = html_to_text(result.get('meta_short', ''))
if result.get('image'): 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: else:
item['url'] = result['url'] item['url'] = result['url']
item['content'] = ', '.join([result['class'], result['info'], result['more']]) item['content'] = ', '.join([result['class'], result['info'], result['more']])
item['img_src'] = result['image'] item['thumbnail'] = result['image']
results.append(item) results.append(item)

View file

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

View file

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

View file

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

View file

@ -162,7 +162,7 @@ def parse_search_query(json_results):
result = { result = {
'url': item['link'], 'url': item['link'],
'title': item['title'], 'title': item['title'],
'img_src': item['image'], 'thumbnail': item['image'],
'content': '', 'content': '',
'metadata': item.get('source'), 'metadata': item.get('source'),
} }
@ -244,7 +244,7 @@ def response(resp):
'url': item.get('link'), 'url': item.get('link'),
'content': '', 'content': '',
'metadata': ' / '.join(metadata), 'metadata': ' / '.join(metadata),
'img_src': item.get('image'), 'thumbnail': item.get('image'),
} }
) )
@ -257,7 +257,7 @@ def response(resp):
'url': item.get('link'), 'url': item.get('link'),
'content': item.get('description', ''), 'content': item.get('description', ''),
'metadata': ' / '.join(metadata), '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: if pub_date is not None:
pub_date = datetime.fromtimestamp(pub_date) pub_date = datetime.fromtimestamp(pub_date)
news_media = item.get('media', []) news_media = item.get('media', [])
img_src = None thumbnail = None
if news_media: if news_media:
img_src = news_media[0].get('pict', {}).get('url', None) thumbnail = news_media[0].get('pict', {}).get('url', None)
results.append( results.append(
{ {
'title': title, 'title': title,
'url': res_url, 'url': res_url,
'publishedDate': pub_date, 'publishedDate': pub_date,
'img_src': img_src, 'thumbnail': thumbnail,
} }
) )
@ -312,13 +312,12 @@ def fetch_traits(engine_traits: EngineTraits):
# pylint: disable=import-outside-toplevel # pylint: disable=import-outside-toplevel
from searx import network from searx import network
from searx.locales import region_tag from searx.locales import region_tag
from searx.utils import extr
resp = network.get(about['website']) resp = network.get(about['website'])
text = resp.text json_string = extr(resp.text, 'INITIAL_PROPS = ', '</script>')
text = text[text.find('INITIAL_PROPS') :]
text = text[text.find('{') : text.find('</script>')]
q_initial_props = loads(text) q_initial_props = loads(json_string)
q_locales = q_initial_props.get('locales') q_locales = q_initial_props.get('locales')
eng_tag_list = set() eng_tag_list = set()

View file

@ -114,7 +114,7 @@ def response(resp):
{ {
'url': url, 'url': url,
'title': result['name'], 'title': result['name'],
'img_src': result.get('favicon', '').replace("http://", "https://"), 'thumbnail': result.get('favicon', '').replace("http://", "https://"),
'content': ' | '.join(content), 'content': ' | '.join(content),
'metadata': ' | '.join(metadata), 'metadata': ' | '.join(metadata),
'iframe_src': result['url_resolved'].replace("http://", "https://"), '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']: if mtype in ['image'] and subtype in ['bmp', 'gif', 'jpeg', 'png']:
item['img_src'] = url item['thumbnail'] = url
results.append(item) results.append(item)

View file

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

View file

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

View file

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

View file

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

View file

@ -3,6 +3,8 @@
""" """
import datetime
from urllib.parse import urlencode from urllib.parse import urlencode
# about # about
@ -14,6 +16,8 @@ about = {
"require_api_key": False, "require_api_key": False,
"results": 'JSON', "results": 'JSON',
} }
categories = ['images']
search_type = 'images'
base_url = "https://commons.wikimedia.org" base_url = "https://commons.wikimedia.org"
search_prefix = ( search_prefix = (
@ -29,17 +33,29 @@ search_prefix = (
paging = True paging = True
number_of_results = 10 number_of_results = 10
search_types = {
'images': 'bitmap|drawing',
'videos': 'video',
'audio': 'audio',
'files': 'multimedia|office|archive|3d',
}
def request(query, params): def request(query, params):
language = 'en' language = 'en'
if params['language'] != 'all': if params['language'] != 'all':
language = params['language'].split('-')[0] 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 = { args = {
'uselang': language, 'uselang': language,
'gsrlimit': number_of_results, 'gsrlimit': number_of_results,
'gsroffset': number_of_results * (params["pageno"] - 1), '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=':|')}" 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"): if not json.get("query", {}).get("pages"):
return results return results
for item in json["query"]["pages"].values(): for item in json["query"]["pages"].values():
imageinfo = item["imageinfo"][0] imageinfo = item["imageinfo"][0]
title = item["title"].replace("File:", "").rsplit('.', 1)[0] title = item["title"].replace("File:", "").rsplit('.', 1)[0]
@ -60,11 +75,28 @@ def response(resp):
'url': imageinfo["descriptionurl"], 'url': imageinfo["descriptionurl"],
'title': title, 'title': title,
'content': item["snippet"], '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) results.append(result)
return results 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 def init(engine_settings=None): # pylint: disable=unused-argument
# WIKIDATA_PROPERTIES : add unit symbols # 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_PROPERTIES : add property labels
wikidata_property_names = [] wikidata_property_names = []

View file

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

View file

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

View file

@ -77,9 +77,9 @@ def response(resp):
url = parse_url(url) url = parse_url(url)
title = extract_text(result.xpath('.//h4/a')) title = extract_text(result.xpath('.//h4/a'))
content = extract_text(result.xpath('.//p')) 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")]')) pub_date = extract_text(result.xpath('.//span[contains(@class,"s-time")]'))
ago = AGO_RE.search(pub_date) ago = AGO_RE.search(pub_date)

View file

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

View file

@ -52,11 +52,11 @@ def response(resp):
if description is not None: if description is not None:
content = markdown_to_text(description['text']) content = markdown_to_text(description['text'])
img_src = None thumbnail = None
if result['display']['images']: if result['display']['images']:
img_src = result['display']['images'][0] thumbnail = result['display']['images'][0]
elif result['content']['details']['images']: 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'] url = result['display']['source']['sourceRecipeUrl']
if 'www.yummly.com/private' in url: if 'www.yummly.com/private' in url:
@ -67,7 +67,7 @@ def response(resp):
'url': url, 'url': url,
'title': result['display']['displayName'], 'title': result['display']['displayName'],
'content': content, 'content': content,
'img_src': img_src, 'thumbnail': thumbnail,
'metadata': gettext('Language') + f": {result['locale'].split('-')[0]}", '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], "authors": [extract_text(author) for author in author_elements],
"publisher": _text(item, './/a[@title="Publisher"]'), "publisher": _text(item, './/a[@title="Publisher"]'),
"type": _text(item, './/div[contains(@class, "property__file")]//div[contains(@class, "property_value")]'), "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")]') year = _text(item, './/div[contains(@class, "property_year")]//div[contains(@class, "property_value")]')
if year: if year:
result["publishedDate"] = datetime.strptime(year, '%Y') 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'] __all__ = ['InfoPage', 'InfoPageSet']
import os import os
@ -37,6 +39,16 @@ from ..locales import LOCALE_NAMES
logger = logging.getLogger('searx.infopage') logger = logging.getLogger('searx.infopage')
_INFO_FOLDER = os.path.abspath(os.path.dirname(__file__)) _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: 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 # 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" name = "Unit converter plugin"
description = gettext("Convert between units") description = gettext("Convert between units")
default_on = True default_on = True
plugin_id = "unit_converter"
preference_section = "general"
CONVERT_KEYWORDS = ["in", "to", "as"] CONVERT_KEYWORDS = ["in", "to", "as"]
# inspired from https://stackoverflow.com/a/42475086
def _convert(from_value, source_si_factor, target_si_factor): RE_MEASURE = r'''
return from_value * source_si_factor / target_si_factor (?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): ADDITIONAL_UNITS = [
if len(splitted_query) != 2 or splitted_query[0].strip() == "" or splitted_query[1].strip() == "": {
"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 return
from_value = "" measured = re.match(RE_MEASURE, from_query, re.VERBOSE)
from_unit_key = "" if not (measured and measured.group('number'), measured.group('unit')):
# 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'):
return return
result = _convert(float(from_value), from_unit['to_si_factor'], to_unit['to_si_factor']) # Symbols are not unique, if there are several hits for the from-unit, then
search.result_container.answers['conversion'] = {'answer': f"{result:g} {to_unit['symbol']}"} # 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): def post_search(_request, search):
@ -69,8 +256,8 @@ def post_search(_request, search):
for query_part in query_parts: for query_part in query_parts:
for keyword in CONVERT_KEYWORDS: for keyword in CONVERT_KEYWORDS:
if query_part == keyword: if query_part == keyword:
keyword_split = query.split(keyword, 1) from_query, to_query = query.split(keyword, 1)
_parse_text_and_convert(search, keyword_split) _parse_text_and_convert(search, from_query.strip(), to_query.strip())
return True return True
return True return True

View file

@ -430,21 +430,38 @@ class ResultContainer:
"""Returns the average of results number, returns zero if the average """Returns the average of results number, returns zero if the average
result number is smaller than the actual result count.""" result number is smaller than the actual result count."""
resultnum_sum = sum(self._number_of_results) with self._lock:
if not resultnum_sum or not self._number_of_results: if not self._closed:
return 0 logger.error("call to ResultContainer.number_of_results before ResultContainer.close")
return 0
average = int(resultnum_sum / len(self._number_of_results)) resultnum_sum = sum(self._number_of_results)
if average < self.results_length(): if not resultnum_sum or not self._number_of_results:
average = 0 return 0
return average
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): def add_unresponsive_engine(self, engine_name: str, error_type: str, suspended: bool = False):
if engines[engine_name].display_error_messages: with self._lock:
self.unresponsive_engines.add(UnresponsiveEngine(engine_name, error_type, suspended)) 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): 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): 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 # - 'Ahmia blacklist' # activation depends on outgoing.using_tor_proxy
# # these plugins are disabled if nothing is configured .. # # these plugins are disabled if nothing is configured ..
# - 'Hostname replace' # see hostname_replace configuration below # - 'Hostname replace' # see hostname_replace configuration below
# - 'Calculator plugin'
# - 'Open Access DOI rewrite' # - 'Open Access DOI rewrite'
# - 'Tor check plugin' # - 'Tor check plugin'
# # Read the docs before activate: auto-detection of the language could be # # Read the docs before activate: auto-detection of the language could be
@ -726,6 +727,11 @@ engines:
shortcut: fd shortcut: fd
disabled: true disabled: true
- name: findthatmeme
engine: findthatmeme
shortcut: ftm
disabled: true
- name: flickr - name: flickr
categories: images categories: images
shortcut: fl shortcut: fl
@ -800,26 +806,18 @@ engines:
engine: github engine: github
shortcut: gh 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 - name: codeberg
engine: json_engine # https://docs.searxng.org/dev/engines/online/gitea.html
search_url: https://codeberg.org/api/v1/repos/search?q={query}&limit=10 engine: gitea
url_query: html_url base_url: https://codeberg.org
title_query: name
content_query: description
categories: [it, repos]
shortcut: cb shortcut: cb
disabled: true disabled: true
about:
website: https://codeberg.org/ - name: gitea.com
wikidata_id: engine: gitea
official_api_documentation: https://try.gitea.io/api/swagger base_url: https://gitea.com
use_official_api: false shortcut: gitea
require_api_key: false disabled: true
results: JSON
- name: goodreads - name: goodreads
engine: goodreads engine: goodreads
@ -926,6 +924,20 @@ engines:
shortcut: hn shortcut: hn
disabled: true 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 - name: hoogle
engine: xpath engine: xpath
search_url: https://hoogle.haskell.org/?hoogle={query} search_url: https://hoogle.haskell.org/?hoogle={query}
@ -1907,6 +1919,28 @@ engines:
engine: wikicommons engine: wikicommons
shortcut: wc shortcut: wc
categories: images 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 number_of_results: 10
- name: wolframalpha - name: wolframalpha
@ -2058,7 +2092,11 @@ engines:
engine: yacy engine: yacy
categories: general categories: general
search_type: text 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 shortcut: ya
disabled: true disabled: true
# required if you aren't using HTTPS for your local yacy instance # required if you aren't using HTTPS for your local yacy instance
@ -2071,7 +2109,6 @@ engines:
engine: yacy engine: yacy
categories: images categories: images
search_type: image search_type: image
base_url: https://yacy.searchlab.eu
shortcut: yai shortcut: yai
disabled: true 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 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); color: var(--color-result-description-highlight-font);
} }
img { img.thumbnail {
&.thumbnail { .ltr-float-left();
.ltr-float-left(); padding-top: 0.6rem;
padding-top: 0.6rem; .ltr-padding-right(1rem);
.ltr-padding-right(1rem); width: 7rem;
width: 20rem; height: unset; // remove heigth value that was needed for lazy loading
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;
}
} }
.break { .break {
@ -394,6 +382,16 @@ article[data-vim-selected].category-social {
padding: 10px 0 0 0; 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 { .result-videos .content {
overflow: hidden; overflow: hidden;
} }

View file

@ -25,8 +25,7 @@
<span class="url_o{{loop.index}}"><span class="url_i{{loop.index}}">{{- part -}}</span></span> <span class="url_o{{loop.index}}"><span class="url_i{{loop.index}}">{{- part -}}</span></span>
{%- endfor %} {%- endfor %}
{{- result_close_link() -}} {{- 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">{{ 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 -%}
<h3>{{ result_link(result.url, result.title|safe) }}</h3> <h3>{{ result_link(result.url, result.title|safe) }}</h3>
{%- endmacro -%} {%- endmacro -%}

View file

@ -38,7 +38,7 @@
{%- macro plugin_preferences(section) -%} {%- macro plugin_preferences(section) -%}
{%- for plugin in plugins -%} {%- 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>{{- '' -}} <fieldset>{{- '' -}}
<legend>{{ _(plugin.name) }}</legend>{{- '' -}} <legend>{{ _(plugin.name) }}</legend>{{- '' -}}
<div class="value"> <div class="value">

View file

@ -47,7 +47,7 @@
{%- endif -%} {%- endif -%}
</div> </div>
{%- endif -%} {%- endif -%}
{%- if result.homepage or result.source_code_url -%} {%- if result.homepage or result.source_code_url or result.links -%}
<div class="result_project">{{- '' -}} <div class="result_project">{{- '' -}}
<span>{{ _('Project') }}</span> <span>{{ _('Project') }}</span>
<span>{{- '' -}} <span>{{- '' -}}
@ -58,6 +58,14 @@
{%- if result.source_code_url -%} {%- if result.source_code_url -%}
<a href="{{ result.source_code_url }}" target="_blank">{{ _('Source code') }}</a> <a href="{{ result.source_code_url }}" target="_blank">{{ _('Source code') }}</a>
{%- endif -%} {%- 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>{{- '' -}} </span>{{- '' -}}
</div> </div>
{%- endif -%} {%- endif -%}

View file

@ -24,8 +24,12 @@
{%- for answer in answers.values() -%} {%- for answer in answers.values() -%}
<div class="answer"> <div class="answer">
<span>{{ answer.answer }}</span> <span>{{ answer.answer }}</span>
{% if answer.url -%} {%- if answer.url -%}
<a href="{{ answer.url }}" class="answer-url">{{ urlparse(answer.url).hostname }}</a> <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 -%} {% endif -%}
</div> </div>
{%- endfor -%} {%- endfor -%}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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