Merge branch 'searxng:master' into master

This commit is contained in:
Fauli1221 2022-10-12 20:32:45 +02:00 committed by GitHub
commit 9740ed836a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
213 changed files with 18116 additions and 6228 deletions

View file

@ -7,7 +7,7 @@
;;
;; If you get ``*** EPC Error ***`` (even after a jedi:install-server) in
;; your emacs session, mostly you have jedi-mode enabled but the python
;; enviroment is missed. The python environment has to be next to the
;; environment is missed. The python environment has to be next to the
;; ``<repo>/.dir-locals.el`` in::
;;
;; ./local/py3
@ -64,10 +64,10 @@
(setq-local python-environment-directory
(expand-file-name "./local" prj-root))
;; to get in use of NVM enviroment, install https://github.com/rejeep/nvm.el
;; to get in use of NVM environment, install https://github.com/rejeep/nvm.el
(setq-local nvm-dir (expand-file-name "./.nvm" prj-root))
;; use 'py3' enviroment as default
;; use 'py3' environment as default
(setq-local python-environment-default-root-name
"py3")

28
.github/workflows/security.yml vendored Normal file
View file

@ -0,0 +1,28 @@
name: "Security checks"
on:
schedule:
- cron: "42 05 * * *"
workflow_dispatch:
jobs:
dockers:
name: Trivy ${{ matrix.image }}
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'searxng/searxng:latest'
ignore-unfixed: false
vuln-type: 'os,library'
severity: 'UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL'
format: 'sarif'
output: 'trivy-results.sarif'
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: 'trivy-results.sarif'

View file

@ -323,7 +323,7 @@ Special thanks to `NLNet <https://nlnet.nl>`__ for sponsoring multiple features
- Removed engines: faroo
Special thanks to `NLNet <https://nlnet.nl>`__ for sponsoring multiple features of this release.
Special thanks to https://www.accessibility.nl/english for making accessibilty audit.
Special thanks to https://www.accessibility.nl/english for making accessibility audit.
News
~~~~

View file

@ -106,7 +106,7 @@ update_conf() {
# There is a new version
if [ "$FORCE_CONF_UPDATE" -ne 0 ]; then
# Replace the current configuration
printf '⚠️ Automaticaly update %s to the new version\n' "${CONF}"
printf '⚠️ Automatically update %s to the new version\n' "${CONF}"
if [ ! -f "${OLD_CONF}" ]; then
printf 'The previous configuration is saved to %s\n' "${OLD_CONF}"
mv "${CONF}" "${OLD_CONF}"

View file

@ -10,7 +10,7 @@ threads = 4
# The right granted on the created socket
chmod-socket = 666
# Plugin to use and interpretor config
# Plugin to use and interpreter config
single-interpreter = true
master = true
plugin = python3

View file

@ -25,7 +25,7 @@ place the templates at::
searx/templates/{theme_name}/result_templates/{template_name}
Futhermore, if you do not wish to expose these engines on a public instance, you
Furthermore, if you do not wish to expose these engines on a public instance, you
can still add them and limit the access by setting ``tokens`` as described in
section :ref:`private engines`.

View file

@ -39,7 +39,7 @@ Example
Scenario:
#. Recoll indexes a local filesystem mounted in ``/export/documents/reference``,
#. the Recoll search inteface can be reached at https://recoll.example.org/ and
#. the Recoll search interface can be reached at https://recoll.example.org/ and
#. the contents of this filesystem can be reached though https://download.example.org/reference
.. code:: yaml

View file

@ -21,7 +21,7 @@ above are added to ``settings.yml`` just commented out, as you have to
Please note that if you are not using HTTPS to access these engines, you have to enable
HTTP requests by setting ``enable_http`` to ``True``.
Futhermore, if you do not want to expose these engines on a public instance, you
Furthermore, if you do not want to expose these engines on a public instance, you
can still add them and limit the access by setting ``tokens`` as described in
section :ref:`private engines`.

View file

@ -240,6 +240,7 @@ Global Settings
query_in_title: false
infinite_scroll: false
center_alignment: false
cache_url: https://web.archive.org/web/
default_theme: simple
theme_args:
simple_style: auto
@ -267,6 +268,15 @@ Global Settings
side of the screen. This setting only affects the *desktop layout*
(:origin:`min-width: @tablet <searx/static/themes/simple/src/less/definitions.less>`)
.. cache_url:
``cache_url`` : ``https://web.archive.org/web/``
URL prefix of the internet archive or cache, don't forgett trailing slash (if
needed). The default is https://web.archive.org/web/ alternatives are:
- https://webcache.googleusercontent.com/search?q=cache:
- https://archive.today/
``default_theme`` :
Name of the theme you want to use by default on your SearXNG instance.
@ -331,7 +341,7 @@ Communication with search engines.
outgoing:
request_timeout: 2.0 # default timeout in seconds, can be override by engine
max_request_timeout: 10.0 # the maximum timeout in seconds
useragent_suffix: "" # informations like an email address to the administrator
useragent_suffix: "" # information like an email address to the administrator
pool_connections: 100 # Maximum number of allowable connections, or null
# for no limits. The default is 100.
pool_maxsize: 10 # Number of allowable keep-alive connections, or null

View file

@ -145,7 +145,7 @@ engine, you must install the package ``mysql-connector-python``.
The authentication plugin is configurable by setting ``auth_plugin`` in the
attributes. By default it is set to ``caching_sha2_password``. This is an
example configuration for quering a MySQL server:
example configuration for querying a MySQL server:
.. code:: yaml

View file

@ -47,7 +47,7 @@ Engine File
argument type information
======================= =========== ========================================================
categories list pages, in which the engine is working
paging boolean support multible pages
paging boolean support multiple pages
time_range_support boolean support search time range
engine_type str - ``online`` :ref:`[ref] <demo online engine>` by
default, other possibles values are:
@ -311,3 +311,92 @@ the parameter ``template`` must be set to the desired type.
address.postcode postcode of object
address.country country of object
========================= =====================================================
.. _BibTeX format: https://www.bibtex.com/g/bibtex-format/
.. _BibTeX field types: https://en.wikipedia.org/wiki/BibTeX#Field_types
.. list-table:: Parameter of the **paper** media type /
see `BibTeX field types`_ and `BibTeX format`_
:header-rows: 2
:width: 100%
* - result-parameter
- Python type
- information
* - template
- :py:class:`str`
- is set to ``paper.html``
* - title
- :py:class:`str`
- title of the result
* - content
- :py:class:`str`
- abstract
* - comments
- :py:class:`str`
- free text display in italic below the content
* - tags
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
- free tag list
* - publishedDate
- :py:class:`datetime <datetime.datetime>`
- last publication date
* - type
- :py:class:`str`
- short description of medium type, e.g. *book*, *pdf* or *html* ...
* - authors
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
- list of authors of the work (authors with a "s")
* - editor
- :py:class:`str`
- list of editors of a book
* - publisher
- :py:class:`str`
- name of the publisher
* - journal
- :py:class:`str`
- name of the journal or magazine the article was
published in
* - volume
- :py:class:`str`
- volume number
* - pages
- :py:class:`str`
- page range where the article is
* - number
- :py:class:`str`
- number of the report or the issue number for a journal article
* - doi
- :py:class:`str`
- DOI number (like ``10.1038/d41586-018-07848-2``)
* - issn
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
- ISSN number like ``1476-4687``
* - isbn
- :py:class:`List <list>`\ [\ :py:class:`str`\ ]
- ISBN number like ``9780201896831``
* - pdf_url
- :py:class:`str`
- URL to the full article, the PDF version
* - html_url
- :py:class:`str`
- URL to full article, HTML version

View file

@ -202,7 +202,7 @@ To debug services from filtron and morty analogous use:
Another point we have to notice is that the service (:ref:`SearXNG <searxng.sh>`
runs under dedicated system user account with the same name (compare
:ref:`create searxng user`). To get a shell from theses accounts, simply call:
:ref:`create searxng user`). To get a shell from these accounts, simply call:
.. tabs::
@ -300,7 +300,7 @@ of the container:
Now we can develop as usual in the working tree of our desktop system. Every
time the software was changed, you have to restart the SearXNG service (in the
conatiner):
container):
.. tabs::
@ -359,7 +359,7 @@ We build up a fully functional SearXNG suite in a archlinux container:
$ sudo -H ./utils/lxc.sh install suite searxng-archlinux
To access HTTP from the desktop we installed nginx for the services inside the
conatiner:
container:
.. tabs::

View file

@ -15,7 +15,7 @@ generated and deployed at :docs:`github.io <.>`. For build prerequisites read
:ref:`docs build`.
The source files of Searx's documentation are located at :origin:`docs`. Sphinx
assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs.live
assumes source files to be encoded in UTF-8 by default. Run :ref:`make docs.live
<make docs.live>` to build HTML while editing.
.. sidebar:: Further reading
@ -227,13 +227,13 @@ To refer anchors use the `ref role`_ markup:
.. code:: reST
Visit chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
Visit chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo
bar <reST anchor>`.
.. admonition:: ``:ref:`` role
:class: rst-example
Visist chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
Visist chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo
bar <reST anchor>`.
.. _reST ordinary ref:
@ -494,8 +494,8 @@ Figures & Images
is flexible. To get best results in the generated output format, install
ImageMagick_ and Graphviz_.
Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scaleable here means;
scaleable in sense of the build process. Normally in absence of a converter
Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scalable here means;
scalable in sense of the build process. Normally in absence of a converter
tool, the build process will break. From the authors POV its annoying to care
about the build process when handling with images, especially since he has no
access to the build process. With :ref:`linuxdoc:kfigure` the build process
@ -503,7 +503,7 @@ continues and scales output quality in dependence of installed image processors.
If you want to add an image, you should use the ``kernel-figure`` (inheritance
of :dudir:`figure`) and ``kernel-image`` (inheritance of :dudir:`image`)
directives. E.g. to insert a figure with a scaleable image format use SVG
directives. E.g. to insert a figure with a scalable image format use SVG
(:ref:`svg image example`):
.. code:: reST
@ -1185,7 +1185,7 @@ and *targets* (e.g. a ref to :ref:`row 2 of table's body <row body 2>`).
- cell 4.4
* - row 5
- cell 5.1 with automatic span to rigth end
- cell 5.1 with automatic span to right end
* - row 6
- cell 6.1
@ -1237,7 +1237,7 @@ and *targets* (e.g. a ref to :ref:`row 2 of table's body <row body 2>`).
- cell 4.4
* - row 5
- cell 5.1 with automatic span to rigth end
- cell 5.1 with automatic span to right end
* - row 6
- cell 6.1

View file

@ -93,14 +93,14 @@ Parameters
:default:
``Hash_plugin``, ``Search_on_category_select``,
``Self_Informations``, ``Tracker_URL_remover``,
``Self_Information``, ``Tracker_URL_remover``,
``Ahmia_blacklist``
:values:
.. enabled by default
``Hash_plugin``, ``Search_on_category_select``,
``Self_Informations``, ``Tracker_URL_remover``,
``Self_Information``, ``Tracker_URL_remover``,
``Ahmia_blacklist``,
.. disabled by default

View file

@ -1,10 +1,10 @@
mock==4.0.3
nose2[coverage_plugin]==0.12.0
cov-core==1.15.0
black==22.6.0
pylint==2.14.5
black==22.10.0
pylint==2.15.3
splinter==0.18.1
selenium==4.4.0
selenium==4.5.0
twine==4.0.1
Pallets-Sphinx-Themes==2.0.2
Sphinx==5.1.1
@ -14,9 +14,9 @@ sphinx-tabs==3.4.1
sphinxcontrib-programoutput==0.17
sphinx-autobuild==2021.3.14
sphinx-notfound-page==0.8.3
myst-parser==0.18.0
myst-parser==0.18.1
linuxdoc==20211220
aiounittest==1.4.2
yamllint==1.27.1
yamllint==1.28.0
wlc==1.13
coloredlogs==15.0.1

View file

@ -1,15 +1,15 @@
certifi==2022.6.15
certifi==2022.9.24
babel==2.10.3
flask-babel==2.0.0
flask==2.2.2
jinja2==3.1.2
lxml==4.9.1
pygments==2.12.0
pygments==2.13.0
python-dateutil==2.8.2
pyyaml==6.0
httpx[http2]==0.21.2
Brotli==1.0.9
uvloop==0.16.0
uvloop==0.17.0
httpx-socks[asyncio]==0.7.2
langdetect==1.0.9
setproctitle==1.3.2

View file

@ -152,6 +152,16 @@ def wikipedia(query, lang):
return []
def yandex(query, _lang):
# yandex autocompleter
url = "https://suggest.yandex.com/suggest-ff.cgi?{0}"
resp = loads(get(url.format(urlencode(dict(part=query)))).text)
if len(resp) > 1:
return resp[1]
return []
backends = {
'dbpedia': dbpedia,
'duckduckgo': duckduckgo,
@ -162,6 +172,7 @@ backends = {
'qwant': qwant,
'wikipedia': wikipedia,
'brave': brave,
'yandex': yandex,
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -1938,8 +1938,8 @@
"name": "Bahasa Banjar"
},
"blk": {
"english_name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f",
"name": "Pa'O"
"english_name": "Pa'O",
"name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f"
},
"bm": {
"english_name": "Bambara",
@ -2661,6 +2661,10 @@
"english_name": "Picard",
"name": "Picard"
},
"pcm": {
"english_name": "Nigerian Pidgin",
"name": "Naij\u00e1"
},
"pdc": {
"english_name": "Pennsylvania German",
"name": "Deitsch"
@ -3208,8 +3212,8 @@
"name": "Bahasa Banjar"
},
"blk": {
"english_name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f",
"name": "Pa'O"
"english_name": "Pa'O",
"name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f"
},
"bm": {
"english_name": "Bambara",
@ -3931,6 +3935,10 @@
"english_name": "Picard",
"name": "Picard"
},
"pcm": {
"english_name": "Nigerian Pidgin",
"name": "Naij\u00e1"
},
"pdc": {
"english_name": "Pennsylvania German",
"name": "Deitsch"

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,10 @@
{
"versions": [
"103.0",
"102.0.1",
"102.0"
"105.0.1",
"105.0",
"104.0.2",
"104.0.1",
"104.0"
],
"os": [
"Windows NT 10.0; Win64; x64",

View file

@ -214,6 +214,20 @@
"Q110742003": "dppx",
"Q1131660": "st",
"Q1137675": "cr",
"Q114002440": "𒄀",
"Q114002534": "𒃻",
"Q114002568": "𒂠",
"Q114002639": "𒈨𒊑",
"Q114002688": "𒋗𒋛",
"Q114002734": "𒊺",
"Q114002796": "𒂆",
"Q114002897": "𒊬",
"Q114002930": "𒀺",
"Q114002955": "𒀹𒃷",
"Q114002974": "𒃷",
"Q114002998": "𒁓",
"Q114018694": "𒄥",
"Q114018781": "𒁀𒌷𒂵",
"Q1140444": "Zb",
"Q1140577": "Yb",
"Q1152074": "Pb",
@ -255,6 +269,7 @@
"Q1322380": "Ts",
"Q1323615": "oz t",
"Q132643": "kr",
"Q133011": "Ls",
"Q13400897": "g",
"Q13479685": "mm H2O",
"Q1351253": "Eib",
@ -350,6 +365,7 @@
"Q194339": "B$",
"Q1970718": "mam",
"Q1972579": "pdl",
"Q19877834": "cd-ft",
"Q199462": "LE",
"Q199471": "Afs",
"Q200323": "dm",

77
searx/engines/9gag.py Normal file
View file

@ -0,0 +1,77 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
# pylint: disable=invalid-name
"""9GAG (social media)"""
from json import loads
from datetime import datetime
from urllib.parse import urlencode
about = {
"website": 'https://9gag.com/',
"wikidata_id": 'Q277421',
"official_api_documentation": None,
"use_official_api": True,
"require_api_key": False,
"results": 'JSON',
}
categories = ['social media']
paging = True
search_url = "https://9gag.com/v1/search-posts?{query}"
page_size = 10
def request(query, params):
query = urlencode({'query': query, 'c': (params['pageno'] - 1) * page_size})
params['url'] = search_url.format(query=query)
return params
def response(resp):
results = []
json_results = loads(resp.text)['data']
for result in json_results['posts']:
result_type = result['type']
# Get the not cropped version of the thumbnail when the image height is not too important
if result['images']['image700']['height'] > 400:
thumbnail = result['images']['imageFbThumbnail']['url']
else:
thumbnail = result['images']['image700']['url']
if result_type == 'Photo':
results.append(
{
'template': 'images.html',
'url': result['url'],
'title': result['title'],
'content': result['description'],
'publishedDate': datetime.utcfromtimestamp(result['creationTs']),
'img_src': result['images']['image700']['url'],
'thumbnail_src': thumbnail,
}
)
elif result_type == 'Animated':
results.append(
{
'template': 'videos.html',
'url': result['url'],
'title': result['title'],
'content': result['description'],
'publishedDate': datetime.utcfromtimestamp(result['creationTs']),
'thumbnail': thumbnail,
'iframe_src': result['images'].get('image460sv', {}).get('url'),
}
)
if 'tags' in json_results:
for suggestion in json_results['tags']:
results.append({'suggestion': suggestion['key']})
return results

View file

@ -81,6 +81,7 @@ engine_shortcuts = {}
engine_shortcuts[engine.shortcut] = engine.name
:meta hide-value:
"""
@ -274,12 +275,12 @@ def is_engine_active(engine: Engine):
def register_engine(engine: Engine):
if engine.name in engines:
logger.error('Engine config error: ambigious name: {0}'.format(engine.name))
logger.error('Engine config error: ambiguous name: {0}'.format(engine.name))
sys.exit(1)
engines[engine.name] = engine
if engine.shortcut in engine_shortcuts:
logger.error('Engine config error: ambigious shortcut: {0}'.format(engine.shortcut))
logger.error('Engine config error: ambiguous shortcut: {0}'.format(engine.shortcut))
sys.exit(1)
engine_shortcuts[engine.shortcut] = engine.name

View file

@ -0,0 +1,57 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""
Apple App Store
"""
from json import loads
from urllib.parse import urlencode
from dateutil.parser import parse
about = {
"website": 'https://www.apple.com/app-store/',
"wikidata_id": 'Q368215',
"official_api_documentation": (
'https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/'
'iTuneSearchAPI/UnderstandingSearchResults.html#//apple_ref/doc/uid/TP40017632-CH8-SW1'
),
"use_official_api": True,
"require_api_key": False,
"results": 'JSON',
}
categories = ['files', 'apps']
safesearch = True
search_url = 'https://itunes.apple.com/search?{query}'
def request(query, params):
explicit = "Yes"
if params['safesearch'] > 0:
explicit = "No"
params['url'] = search_url.format(query=urlencode({'term': query, 'media': 'software', 'explicit': explicit}))
return params
def response(resp):
results = []
json_result = loads(resp.text)
for result in json_result['results']:
results.append(
{
'url': result['trackViewUrl'],
'title': result['trackName'],
'content': result['description'],
'img_src': result['artworkUrl100'],
'publishedDate': parse(result['currentVersionReleaseDate']),
'author': result['sellerName'],
}
)
return results

113
searx/engines/apple_maps.py Normal file
View file

@ -0,0 +1,113 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""Apple Maps"""
from json import loads
from time import time
from urllib.parse import urlencode
from searx.network import get as http_get
from searx.engines.openstreetmap import get_key_label
about = {
"website": 'https://www.apple.com/maps/',
"wikidata_id": 'Q276101',
"official_api_documentation": None,
"use_official_api": True,
"require_api_key": False,
"results": 'JSON',
}
token = {'value': '', 'last_updated': None}
categories = ['map']
paging = False
search_url = "https://api.apple-mapkit.com/v1/search?{query}&mkjsVersion=5.72.53"
def obtain_token():
update_time = time() - (time() % 1800)
try:
# use duckduckgo's mapkit token
token_response = http_get('https://duckduckgo.com/local.js?get_mk_token=1', timeout=2.0)
actual_token = http_get(
'https://cdn.apple-mapkit.com/ma/bootstrap?apiVersion=2&mkjsVersion=5.72.53&poi=1',
timeout=2.0,
headers={'Authorization': 'Bearer ' + token_response.text},
)
token['value'] = loads(actual_token.text)['authInfo']['access_token']
token['last_updated'] = update_time
# pylint: disable=bare-except
except:
pass
return token
def request(query, params):
if time() - (token['last_updated'] or 0) > 1800:
obtain_token()
params['url'] = search_url.format(query=urlencode({'q': query, 'lang': params['language']}))
params['headers'] = {'Authorization': 'Bearer ' + token['value']}
return params
def response(resp):
results = []
resp_json = loads(resp.text)
user_language = resp.search_params['language']
for result in resp_json['results']:
boundingbox = None
if 'displayMapRegion' in result:
box = result['displayMapRegion']
boundingbox = [box['southLat'], box['northLat'], box['westLng'], box['eastLng']]
links = []
if 'telephone' in result:
telephone = result['telephone']
links.append(
{
'label': get_key_label('phone', user_language),
'url': 'tel:' + telephone,
'url_label': telephone,
}
)
if result.get('urls'):
url = result['urls'][0]
links.append(
{
'label': get_key_label('website', user_language),
'url': url,
'url_label': url,
}
)
results.append(
{
'template': 'map.html',
'type': result.get('poiCategory'),
'title': result['name'],
'links': links,
'latitude': result['center']['lat'],
'longitude': result['center']['lng'],
'url': result['placecardUrl'],
'boundingbox': boundingbox,
'geojson': {'type': 'Point', 'coordinates': [result['center']['lng'], result['center']['lat']]},
'address': {
'name': result['name'],
'house_number': result.get('subThoroughfare'),
'road': result.get('thoroughfare'),
'locality': result.get('locality'),
'postcode': result.get('postCode'),
'country': result.get('country'),
},
}
)
return results

View file

@ -3,9 +3,10 @@
ArXiV (Scientific preprints)
"""
from lxml import html
from lxml import etree
from lxml.etree import XPath
from datetime import datetime
from searx.utils import eval_xpath_list, eval_xpath_getindex
from searx.utils import eval_xpath, eval_xpath_list, eval_xpath_getindex
# about
about = {
@ -17,7 +18,7 @@ about = {
"results": 'XML-RSS',
}
categories = ['science']
categories = ['science', 'scientific publications']
paging = True
base_url = (
@ -27,6 +28,23 @@ base_url = (
# engine dependent config
number_of_results = 10
# xpaths
arxiv_namespaces = {
"atom": "http://www.w3.org/2005/Atom",
"arxiv": "http://arxiv.org/schemas/atom",
}
xpath_entry = XPath('//atom:entry', namespaces=arxiv_namespaces)
xpath_title = XPath('.//atom:title', namespaces=arxiv_namespaces)
xpath_id = XPath('.//atom:id', namespaces=arxiv_namespaces)
xpath_summary = XPath('.//atom:summary', namespaces=arxiv_namespaces)
xpath_author_name = XPath('.//atom:author/atom:name', namespaces=arxiv_namespaces)
xpath_doi = XPath('.//arxiv:doi', namespaces=arxiv_namespaces)
xpath_pdf = XPath('.//atom:link[@title="pdf"]', namespaces=arxiv_namespaces)
xpath_published = XPath('.//atom:published', namespaces=arxiv_namespaces)
xpath_journal = XPath('.//arxiv:journal_ref', namespaces=arxiv_namespaces)
xpath_category = XPath('.//atom:category/@term', namespaces=arxiv_namespaces)
xpath_comment = XPath('./arxiv:comment', namespaces=arxiv_namespaces)
def request(query, params):
# basic search
@ -41,30 +59,50 @@ def request(query, params):
def response(resp):
results = []
dom = etree.fromstring(resp.content)
for entry in eval_xpath_list(dom, xpath_entry):
title = eval_xpath_getindex(entry, xpath_title, 0).text
dom = html.fromstring(resp.content)
url = eval_xpath_getindex(entry, xpath_id, 0).text
abstract = eval_xpath_getindex(entry, xpath_summary, 0).text
for entry in eval_xpath_list(dom, '//entry'):
title = eval_xpath_getindex(entry, './/title', 0).text
authors = [author.text for author in eval_xpath_list(entry, xpath_author_name)]
url = eval_xpath_getindex(entry, './/id', 0).text
# doi
doi_element = eval_xpath_getindex(entry, xpath_doi, 0, default=None)
doi = None if doi_element is None else doi_element.text
content_string = '{doi_content}{abstract_content}'
# pdf
pdf_element = eval_xpath_getindex(entry, xpath_pdf, 0, default=None)
pdf_url = None if pdf_element is None else pdf_element.attrib.get('href')
abstract = eval_xpath_getindex(entry, './/summary', 0).text
# journal
journal_element = eval_xpath_getindex(entry, xpath_journal, 0, default=None)
journal = None if journal_element is None else journal_element.text
# If a doi is available, add it to the snipppet
doi_element = eval_xpath_getindex(entry, './/link[@title="doi"]', 0, default=None)
doi_content = doi_element.text if doi_element is not None else ''
content = content_string.format(doi_content=doi_content, abstract_content=abstract)
# tags
tag_elements = eval_xpath(entry, xpath_category)
tags = [str(tag) for tag in tag_elements]
if len(content) > 300:
content = content[0:300] + "..."
# TODO: center snippet on query term
# comments
comments_elements = eval_xpath_getindex(entry, xpath_comment, 0, default=None)
comments = None if comments_elements is None else comments_elements.text
publishedDate = datetime.strptime(eval_xpath_getindex(entry, './/published', 0).text, '%Y-%m-%dT%H:%M:%SZ')
publishedDate = datetime.strptime(eval_xpath_getindex(entry, xpath_published, 0).text, '%Y-%m-%dT%H:%M:%SZ')
res_dict = {'url': url, 'title': title, 'publishedDate': publishedDate, 'content': content}
res_dict = {
'template': 'paper.html',
'url': url,
'title': title,
'publishedDate': publishedDate,
'content': abstract,
'doi': doi,
'authors': authors,
'journal': journal,
'tags': tags,
'comments': comments,
'pdf_url': pdf_url,
}
results.append(res_dict)

View file

@ -80,7 +80,7 @@ def response(resp):
dom = html.fromstring(resp.text)
for result in dom.xpath('//div[@class="dg_u"]'):
for result in dom.xpath('//div[@class="dg_u"]/div[contains(@class, "mc_vtvc")]'):
metadata = loads(result.xpath('.//div[@class="vrhdata"]/@vrhm')[0])
info = ' - '.join(result.xpath('.//div[@class="mc_vtvc_meta_block"]//span/text()')).strip()
content = '{0} - {1}'.format(metadata['du'], info)

View file

@ -4,7 +4,6 @@
"""
from json import loads
from datetime import datetime
from urllib.parse import urlencode
@ -19,7 +18,7 @@ about = {
"results": 'JSON',
}
categories = ['science']
categories = ['science', 'scientific publications']
paging = True
nb_per_page = 10
@ -42,39 +41,75 @@ def request(query, params):
)
params['url'] = base_url + search_path
logger.debug("query_url --> %s", params['url'])
return params
def response(resp):
results = []
json_data = loads(resp.text)
json_data = resp.json()
for result in json_data['data']:
source = result['_source']
url = None
if source.get('urls'):
url = source['urls'][0].replace('http://', 'https://', 1)
if url is None and source.get('doi'):
# use the DOI reference
url = 'https://doi.org/' + source['doi']
if url is None and source.get('downloadUrl'):
# use the downloadUrl
url = source['downloadUrl']
if url is None and source.get('identifiers'):
# try to find an ark id, see
# https://www.wikidata.org/wiki/Property:P8091
# and https://en.wikipedia.org/wiki/Archival_Resource_Key
arkids = [
identifier[5:] # 5 is the length of "ark:/"
for identifier in source.get('identifiers')
if isinstance(identifier, str) and identifier.startswith('ark:/')
]
if len(arkids) > 0:
url = 'https://n2t.net/' + arkids[0]
if url is None:
continue
publishedDate = None
time = source['publishedDate'] or source['depositedDate']
if time:
date = datetime.fromtimestamp(time / 1000)
else:
date = None
publishedDate = datetime.fromtimestamp(time / 1000)
metadata = []
if source['publisher'] and len(source['publisher']) > 3:
metadata.append(source['publisher'])
if source['topics']:
metadata.append(source['topics'][0])
if source['doi']:
metadata.append(source['doi'])
metadata = ' / '.join(metadata)
# sometimes the 'title' is None / filter None values
journals = [j['title'] for j in (source.get('journals') or []) if j['title']]
publisher = source['publisher']
if publisher:
publisher = source['publisher'].strip("'")
results.append(
{
'url': source['urls'][0].replace('http://', 'https://', 1),
'template': 'paper.html',
'title': source['title'],
'content': source['description'],
'publishedDate': date,
'metadata': metadata,
'url': url,
'content': source['description'] or '',
# 'comments': '',
'tags': source['topics'],
'publishedDate': publishedDate,
'type': (source['types'] or [None])[0],
'authors': source['authors'],
'editor': ', '.join(source['contributors'] or []),
'publisher': publisher,
'journal': ', '.join(journals),
# 'volume': '',
# 'pages' : '',
# 'number': '',
'doi': source['doi'],
'issn': [x for x in [source.get('issn')] if x],
'isbn': [x for x in [source.get('isbn')] if x], # exists in the rawRecordXml
'pdf_url': source.get('repositoryDocument', {}).get('pdfOrigin'),
}
)

59
searx/engines/crossref.py Normal file
View file

@ -0,0 +1,59 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""Semantic Scholar (Science)
"""
from urllib.parse import urlencode
from searx.utils import html_to_text
about = {
"website": 'https://www.crossref.org/',
"wikidata_id": 'Q5188229',
"official_api_documentation": 'https://github.com/CrossRef/rest-api-doc',
"use_official_api": False,
"require_api_key": False,
"results": 'JSON',
}
categories = ['science', 'scientific publications']
paging = True
search_url = 'https://api.crossref.org/works'
def request(query, params):
params['url'] = search_url + '?' + urlencode(dict(query=query, offset=20 * (params['pageno'] - 1)))
return params
def response(resp):
res = resp.json()
results = []
for record in res['message']['items']:
record_type = record['type']
if record_type == 'book-chapter':
title = record['container-title'][0]
if record['title'][0].lower().strip() != title.lower().strip():
title = html_to_text(title) + ' (' + html_to_text(record['title'][0]) + ')'
journal = None
else:
title = html_to_text(record['title'][0])
journal = record.get('container-title', [None])[0]
url = record.get('resource', {}).get('primary', {}).get('URL') or record['URL']
authors = [author.get('given', '') + ' ' + author.get('family', '') for author in record.get('author', [])]
isbn = record.get('isbn') or [i['value'] for i in record.get('isbn-type', [])]
results.append(
{
'template': 'paper.html',
'url': url,
'title': title,
'journal': journal,
'volume': record.get('volume'),
'type': record['type'],
'content': html_to_text(record.get('abstract', '')),
'publisher': record.get('publisher'),
'authors': authors,
'doi': record['DOI'],
'isbn': isbn,
}
)
return results

62
searx/engines/deepl.py Normal file
View file

@ -0,0 +1,62 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""Deepl translation engine"""
from json import loads
about = {
"website": 'https://deepl.com',
"wikidata_id": 'Q43968444',
"official_api_documentation": 'https://www.deepl.com/docs-api',
"use_official_api": True,
"require_api_key": True,
"results": 'JSON',
}
engine_type = 'online_dictionary'
categories = ['general']
url = 'https://api-free.deepl.com/v2/translate'
api_key = None
def request(_query, params):
'''pre-request callback
params<dict>:
- ``method`` : POST/GET
- ``headers``: {}
- ``data``: {} # if method == POST
- ``url``: ''
- ``category``: 'search category'
- ``pageno``: 1 # number of the requested page
'''
params['url'] = url
params['method'] = 'POST'
params['data'] = {'auth_key': api_key, 'text': params['query'], 'target_lang': params['to_lang'][1]}
return params
def response(resp):
results = []
result = loads(resp.text)
translations = result['translations']
infobox = "<dl>"
for translation in translations:
infobox += f"<dd>{translation['text']}</dd>"
infobox += "</dl>"
results.append(
{
'infobox': 'Deepl',
'content': infobox,
}
)
return results

View file

@ -79,7 +79,7 @@ def response(resp):
# * book / performing art / film / television / media franchise / concert tour / playwright
# * prepared food
# * website / software / os / programming language / file format / software engineer
# * compagny
# * company
content = ''
heading = search_res.get('Heading', '')

View file

@ -0,0 +1,136 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""DuckDuckGo Weather"""
from json import loads
from urllib.parse import quote
from datetime import datetime
from flask_babel import gettext
about = {
"website": 'https://duckduckgo.com/',
"wikidata_id": 'Q12805',
"official_api_documentation": None,
"use_official_api": True,
"require_api_key": False,
"results": "JSON",
}
categories = ["others"]
url = "https://duckduckgo.com/js/spice/forecast/{query}/{lang}"
def generate_condition_table(condition):
res = ""
res += f"<tr><td><b>{gettext('Condition')}</b></td>" f"<td><b>{condition['summary']}</b></td></tr>"
res += (
f"<tr><td><b>{gettext('Temperature')}</b></td>"
f"<td><b>{f_to_c(condition['temperature'])}°C / {condition['temperature']}°F</b></td></tr>"
)
res += (
f"<tr><td>{gettext('Feels like')}</td><td>{f_to_c(condition['apparentTemperature'])}°C / "
f"{condition['apparentTemperature']}°F</td></tr>"
)
res += (
f"<tr><td>{gettext('Wind')}</td><td>{condition['windBearing']}° — "
f"{'%.2f' % (condition['windSpeed'] * 1.6093440006147)} km/h / {condition['windSpeed']} mph</td></tr>"
)
res += f"<tr><td>{gettext('Visibility')}</td><td>{condition['visibility']} km</td>"
res += f"<tr><td>{gettext('Humidity')}</td><td>{condition['humidity'] * 100}%</td></tr>"
return res
def generate_day_table(day):
res = ""
res += (
f"<tr><td>{gettext('Min temp.')}</td><td>{f_to_c(day['temperatureLow'])}°C / "
f"{day['temperatureLow']}°F</td></tr>"
)
res += (
f"<tr><td>{gettext('Max temp.')}</td><td>{f_to_c(day['temperatureHigh'])}°C / "
f"{day['temperatureHigh']}°F</td></tr>"
)
res += f"<tr><td>{gettext('UV index')}</td><td>{day['uvIndex']}</td></tr>"
res += (
f"<tr><td>{gettext('Sunrise')}</td><td>{datetime.fromtimestamp(day['sunriseTime']).strftime('%H:%M')}</td></tr>"
)
res += (
f"<tr><td>{gettext('Sunset')}</td><td>{datetime.fromtimestamp(day['sunsetTime']).strftime('%H:%M')}</td></tr>"
)
return res
def request(query, params):
params["url"] = url.format(query=quote(query), lang=params['language'].split('-')[0])
return params
def f_to_c(temperature):
return "%.2f" % ((temperature - 32) / 1.8)
def response(resp):
results = []
if resp.text.strip() == "ddg_spice_forecast();":
return []
result = loads(resp.text[resp.text.find('\n') + 1 : resp.text.rfind('\n') - 2])
current = result["currently"]
title = result['flags']['ddg-location']
infobox = f"<h3>{gettext('Current condition')}</h3><table><tbody>"
infobox += generate_condition_table(current)
infobox += "</tbody></table>"
last_date = None
for time in result['hourly']['data']:
current_time = datetime.fromtimestamp(time['time'])
if last_date != current_time.date():
if last_date is not None:
infobox += "</tbody></table>"
infobox += f"<h3>{current_time.strftime('%Y-%m-%d')}</h3>"
infobox += "<table><tbody>"
for day in result['daily']['data']:
if datetime.fromtimestamp(day['time']).date() == current_time.date():
infobox += generate_day_table(day)
infobox += "</tbody></table><table><tbody>"
last_date = current_time.date()
infobox += f"<tr><td rowspan=\"7\"><b>{current_time.strftime('%H:%M')}</b></td></tr>"
infobox += generate_condition_table(time)
infobox += "</tbody></table>"
results.append(
{
"infobox": title,
"content": infobox,
}
)
return results

View file

@ -7,6 +7,7 @@ import re
from urllib.parse import quote, urljoin
from lxml import html
from searx.utils import extract_text, eval_xpath, eval_xpath_list, eval_xpath_getindex
from searx.network import raise_for_httperror
# about
about = {
@ -47,6 +48,7 @@ def request(query, params):
# after the last page of results, spelling corrections are returned after a HTTP redirect
# whatever the page number is
params['soft_max_redirects'] = 1
params['raise_for_httperror'] = False
return params
@ -56,6 +58,11 @@ def response(resp):
'''
results = []
if resp.status_code == 404:
return results
raise_for_httperror(resp)
dom = html.fromstring(resp.text)
number_of_results_element = eval_xpath_getindex(

View file

@ -40,7 +40,7 @@ def response(resp):
search_res = loads(resp.text)
# check if items are recieved
# check if items are received
if 'items' not in search_res:
return []

View file

@ -326,14 +326,14 @@ def response(resp):
# google *sections*
if extract_text(eval_xpath(result, g_section_with_header)):
logger.debug("ingoring <g-section-with-header>")
logger.debug("ignoring <g-section-with-header>")
continue
try:
title_tag = eval_xpath_getindex(result, title_xpath, 0, default=None)
if title_tag is None:
# this not one of the common google results *section*
logger.debug('ingoring item from the result_xpath list: missing title')
logger.debug('ignoring item from the result_xpath list: missing title')
continue
title = extract_text(title_tag)
url = eval_xpath_getindex(result, href_xpath, 0, None)
@ -341,7 +341,7 @@ def response(resp):
continue
content = extract_text(eval_xpath_getindex(result, content_xpath, 0, default=None), allow_none=True)
if content is None:
logger.debug('ingoring 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
logger.debug('add link to results: %s', title)

View file

@ -1,28 +1,20 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""This is the implementation of the google images engine.
"""This is the implementation of the google images engine using the google
internal API used the Google Go Android app.
.. admonition:: Content-Security-Policy (CSP)
This internal API offer results in
This engine needs to allow images from the `data URLs`_ (prefixed with the
``data:`` scheme)::
- JSON (_fmt:json)
- Protobuf (_fmt:pb)
- Protobuf compressed? (_fmt:pc)
- HTML (_fmt:html)
- Protobuf encoded in JSON (_fmt:jspb).
Header set Content-Security-Policy "img-src 'self' data: ;"
.. _data URLs:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs
"""
import re
from urllib.parse import urlencode, unquote
from lxml import html
from searx.utils import (
eval_xpath,
eval_xpath_list,
eval_xpath_getindex,
extract_text,
)
from urllib.parse import urlencode
from json import loads
from searx.engines.google import (
get_lang_info,
@ -42,12 +34,12 @@ about = {
"official_api_documentation": 'https://developers.google.com/custom-search',
"use_official_api": False,
"require_api_key": False,
"results": 'HTML',
"results": 'JSON',
}
# engine dependent config
categories = ['images', 'web']
paging = False
paging = True
use_locale_domain = True
time_range_support = True
safesearch = True
@ -56,74 +48,8 @@ send_accept_language_header = True
filter_mapping = {0: 'images', 1: 'active', 2: 'active'}
def scrap_out_thumbs(dom):
"""Scrap out thumbnail data from <script> tags."""
ret_val = {}
for script in eval_xpath(dom, '//script[contains(., "_setImgSrc(")]'):
_script = script.text
# _setImgSrc('0','data:image\/jpeg;base64,\/9j\/4AAQSkZJR ....');
_thumb_no, _img_data = _script[len("_setImgSrc(") : -2].split(",", 1)
_thumb_no = _thumb_no.replace("'", "")
_img_data = _img_data.replace("'", "")
_img_data = _img_data.replace(r"\/", r"/")
ret_val[_thumb_no] = _img_data.replace(r"\x3d", "=")
return ret_val
# [0, "-H96xjSoW5DsgM", ["https://encrypted-tbn0.gstatic.com/images?q...", 155, 324]
# , ["https://assets.cdn.moviepilot.de/files/d3bf..", 576, 1200],
_RE_JS_IMAGE_URL = re.compile(
r'"'
r'([^"]*)' # -H96xjSoW5DsgM
r'",\s*\["'
r'https://[^\.]*\.gstatic.com/images[^"]*' # https://encrypted-tbn0.gstatic.com/images?q...
r'[^\[]*\["'
r'(https?://[^"]*)' # https://assets.cdn.moviepilot.de/files/d3bf...
)
def parse_urls_img_from_js(dom):
# There are two HTML script tags starting with a JS function
# 'AF_initDataCallback(...)'
#
# <script nonce="zscm+Ab/JzBk1Qd4GY6wGQ">
# AF_initDataCallback({key: 'ds:0', hash: '1', data:[], sideChannel: {}});
# </script>
# <script nonce="zscm+Ab/JzBk1Qd4GY6wGQ">
# AF_initDataCallback({key: 'ds:1', hash: '2', data:[null,[[["online_chips",[["the big",
# ["https://encrypted-tbn0.gstatic.com/images?q...",null,null,true,[null,0],f
# ...
# </script>
#
# The second script contains the URLs of the images.
# The AF_initDataCallback(..) is called with very large dictionary, that
# looks like JSON but it is not JSON since it contains JS variables and
# constants like 'null' (we can't use a JSON parser for).
#
# The alternative is to parse the entire <script> and find all image URLs by
# a regular expression.
img_src_script = eval_xpath_getindex(dom, '//script[contains(., "AF_initDataCallback({key: ")]', 1).text
data_id_to_img_url = {}
for data_id, url in _RE_JS_IMAGE_URL.findall(img_src_script):
data_id_to_img_url[data_id] = url
return data_id_to_img_url
def get_img_url_by_data_id(data_id_to_img_url, img_node):
"""Get full image URL by @data-id from parent element."""
data_id = eval_xpath_getindex(img_node, '../../../@data-id', 0)
img_url = data_id_to_img_url.get(data_id, '')
img_url = unquote(img_url.replace(r'\u00', r'%'))
return img_url
def request(query, params):
"""Google-Video search request"""
"""Google-Image search request"""
lang_info = get_lang_info(params, supported_languages, language_aliases, False)
@ -132,7 +58,17 @@ def request(query, params):
+ lang_info['subdomain']
+ '/search'
+ "?"
+ urlencode({'q': query, 'tbm': "isch", **lang_info['params'], 'ie': "utf8", 'oe': "utf8", 'num': 30})
+ urlencode(
{
'q': query,
'tbm': "isch",
**lang_info['params'],
'ie': "utf8",
'oe': "utf8",
'asearch': 'isch',
'async': '_fmt:json,p:1,ijn:' + str(params['pageno']),
}
)
)
if params['time_range'] in time_range_dict:
@ -141,9 +77,9 @@ def request(query, params):
query_url += '&' + urlencode({'safe': filter_mapping[params['safesearch']]})
params['url'] = query_url
params['cookies']['CONSENT'] = "YES+"
params['headers'].update(lang_info['headers'])
params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
params['headers']['User-Agent'] = 'NSTN/3.60.474802233.release Dalvik/2.1.0 (Linux; U; Android 12; US) gzip'
params['headers']['Accept'] = '*/*'
return params
@ -153,78 +89,34 @@ def response(resp):
detect_google_sorry(resp)
# convert the text to dom
dom = html.fromstring(resp.text)
img_bas64_map = scrap_out_thumbs(dom)
data_id_to_img_url = parse_urls_img_from_js(dom)
json_start = resp.text.find('{"ischj":')
json_data = loads(resp.text[json_start:])
# parse results
#
# root element::
# <div id="islmp" ..>
# result div per image::
# <div jsmodel="tTXmib"> / <div jsaction="..." data-id="..."
# The data-id matches to a item in a json-data structure in::
# <script nonce="I+vqelcy/01CKiBJi5Z1Ow">AF_initDataCallback({key: 'ds:1', ... data:function(){return [ ...
# In this structure the link to the origin PNG, JPG or whatever is given
# first link per image-div contains a <img> with the data-iid for bas64 encoded image data::
# <img class="rg_i Q4LuWd" data-iid="0"
# second link per image-div is the target link::
# <a class="VFACy kGQAp" href="https://en.wikipedia.org/wiki/The_Sacrament_of_the_Last_Supper">
# the second link also contains two div tags with the *description* and *publisher*::
# <div class="WGvvNb">The Sacrament of the Last Supper ...</div>
# <div class="fxgdke">en.wikipedia.org</div>
for item in json_data["ischj"]["metadata"]:
root = eval_xpath(dom, '//div[@id="islmp"]')
if not root:
logger.error("did not find root element id='islmp'")
return results
result_item = {
'url': item["result"]["referrer_url"],
'title': item["result"]["page_title"],
'content': item["text_in_grid"]["snippet"],
'source': item["result"]["site_title"],
'img_format': f'{item["original_image"]["width"]} x {item["original_image"]["height"]}',
'img_src': item["original_image"]["url"],
'thumbnail_src': item["thumbnail"]["url"],
'template': 'images.html',
}
root = root[0]
for img_node in eval_xpath_list(root, './/img[contains(@class, "rg_i")]'):
author = item["result"].get('iptc', {}).get('creator')
if author:
result_item['author'] = ', '.join(author)
img_alt = eval_xpath_getindex(img_node, '@alt', 0)
copyright_notice = item["result"].get('iptc', {}).get('copyright_notice')
if copyright_notice:
result_item['source'] += ' / ' + copyright_notice
img_base64_id = eval_xpath(img_node, '@data-iid')
if img_base64_id:
img_base64_id = img_base64_id[0]
thumbnail_src = img_bas64_map[img_base64_id]
else:
thumbnail_src = eval_xpath(img_node, '@src')
if not thumbnail_src:
thumbnail_src = eval_xpath(img_node, '@data-src')
if thumbnail_src:
thumbnail_src = thumbnail_src[0]
else:
thumbnail_src = ''
file_size = item.get('gsa', {}).get('file_size')
if file_size:
result_item['source'] += ' (%s)' % file_size
link_node = eval_xpath_getindex(img_node, '../../../a[2]', 0)
url = eval_xpath_getindex(link_node, '@href', 0, None)
if url is None:
logger.error("missing @href in node: %s", html.tostring(link_node))
continue
pub_nodes = eval_xpath(link_node, './div/div')
pub_descr = img_alt
pub_source = ''
if pub_nodes:
pub_descr = extract_text(pub_nodes[0])
pub_source = extract_text(pub_nodes[1])
src_url = get_img_url_by_data_id(data_id_to_img_url, img_node)
if not src_url:
src_url = thumbnail_src
results.append(
{
'url': url,
'title': img_alt,
'content': pub_descr,
'source': pub_source,
'img_src': src_url,
'thumbnail_src': thumbnail_src,
'template': 'images.html',
}
)
results.append(result_item)
return results

View file

@ -141,7 +141,7 @@ def response(resp):
padding = (4 - (len(jslog) % 4)) * "="
jslog = b64decode(jslog + padding)
except binascii.Error:
# URL cant be read, skip this result
# URL can't be read, skip this result
continue
# now we have : b'[null, ... null,"https://www.cnn.com/.../index.html"]'
@ -150,24 +150,12 @@ def response(resp):
# the first <h3> tag in the <article> contains the title of the link
title = extract_text(eval_xpath(result, './article/h3[1]'))
# the first <div> tag in the <article> contains the content of the link
content = extract_text(eval_xpath(result, './article/div[1]'))
# The pub_date is mostly a string like 'yesertday', not a real
# timezone date or time. Therefore we can't use publishedDate.
pub_date = extract_text(eval_xpath(result, './article/div[1]/div[1]/time'))
pub_origin = extract_text(eval_xpath(result, './article/div[1]/div[1]/a'))
# the second <div> tag contains origin publisher and the publishing date
pub_date = extract_text(eval_xpath(result, './article/div[2]//time'))
pub_origin = extract_text(eval_xpath(result, './article/div[2]//a'))
pub_info = []
if pub_origin:
pub_info.append(pub_origin)
if pub_date:
# The pub_date is mostly a string like 'yesertday', not a real
# timezone date or time. Therefore we can't use publishedDate.
pub_info.append(pub_date)
pub_info = ', '.join(pub_info)
if pub_info:
content = pub_info + ': ' + content
content = ' / '.join([x for x in [pub_origin, pub_date] if x])
# The image URL is located in a preceding sibling <img> tag, e.g.:
# "https://lh3.googleusercontent.com/DjhQh7DMszk.....z=-p-h100-w100"

View file

@ -13,10 +13,12 @@ Definitions`_.
from urllib.parse import urlencode
from datetime import datetime
from typing import Optional
from lxml import html
from searx.utils import (
eval_xpath,
eval_xpath_getindex,
eval_xpath_list,
extract_text,
)
@ -46,7 +48,7 @@ about = {
}
# engine dependent config
categories = ['science']
categories = ['science', 'scientific publications']
paging = True
language_support = True
use_locale_domain = True
@ -99,7 +101,43 @@ def request(query, params):
return params
def response(resp):
def parse_gs_a(text: Optional[str]):
"""Parse the text written in green.
Possible formats:
* "{authors} - {journal}, {year} - {publisher}"
* "{authors} - {year} - {publisher}"
* "{authors} - {publisher}"
"""
if text is None or text == "":
return None, None, None, None
s_text = text.split(' - ')
authors = s_text[0].split(', ')
publisher = s_text[-1]
if len(s_text) != 3:
return authors, None, publisher, None
# the format is "{authors} - {journal}, {year} - {publisher}" or "{authors} - {year} - {publisher}"
# get journal and year
journal_year = s_text[1].split(', ')
# journal is optional and may contains some coma
if len(journal_year) > 1:
journal = ', '.join(journal_year[0:-1])
if journal == '':
journal = None
else:
journal = None
# year
year = journal_year[-1]
try:
publishedDate = datetime.strptime(year.strip(), '%Y')
except ValueError:
publishedDate = None
return authors, journal, publisher, publishedDate
def response(resp): # pylint: disable=too-many-locals
"""Get response from google's search request"""
results = []
@ -112,30 +150,53 @@ def response(resp):
dom = html.fromstring(resp.text)
# parse results
for result in eval_xpath_list(dom, '//div[@class="gs_ri"]'):
for result in eval_xpath_list(dom, '//div[@data-cid]'):
title = extract_text(eval_xpath(result, './h3[1]//a'))
title = extract_text(eval_xpath(result, './/h3[1]//a'))
if not title:
# this is a [ZITATION] block
continue
url = eval_xpath(result, './h3[1]//a/@href')[0]
content = extract_text(eval_xpath(result, './div[@class="gs_rs"]')) or ''
pub_info = extract_text(eval_xpath(result, './div[@class="gs_a"]'))
if pub_info:
content += "[%s]" % pub_info
pub_type = extract_text(eval_xpath(result, './/span[@class="gs_ct1"]'))
if pub_type:
title = title + " " + pub_type
pub_type = pub_type[1:-1].lower()
url = eval_xpath_getindex(result, './/h3[1]//a/@href', 0)
content = extract_text(eval_xpath(result, './/div[@class="gs_rs"]'))
authors, journal, publisher, publishedDate = parse_gs_a(
extract_text(eval_xpath(result, './/div[@class="gs_a"]'))
)
if publisher in url:
publisher = None
# cited by
comments = extract_text(eval_xpath(result, './/div[@class="gs_fl"]/a[starts-with(@href,"/scholar?cites=")]'))
# link to the html or pdf document
html_url = None
pdf_url = None
doc_url = eval_xpath_getindex(result, './/div[@class="gs_or_ggsm"]/a/@href', 0, default=None)
doc_type = extract_text(eval_xpath(result, './/span[@class="gs_ctg2"]'))
if doc_type == "[PDF]":
pdf_url = doc_url
else:
html_url = doc_url
results.append(
{
'template': 'paper.html',
'type': pub_type,
'url': url,
'title': title,
'authors': authors,
'publisher': publisher,
'journal': journal,
'publishedDate': publishedDate,
'content': content,
'comments': comments,
'html_url': html_url,
'pdf_url': pdf_url,
}
)

View file

@ -150,7 +150,7 @@ def response(resp):
# ignore google *sections*
if extract_text(eval_xpath(result, g_section_with_header)):
logger.debug("ingoring <g-section-with-header>")
logger.debug("ignoring <g-section-with-header>")
continue
# ingnore articles without an image id / e.g. news articles

View file

@ -70,7 +70,7 @@ def response(resp):
elif properties.get('osm_type') == 'R':
osm_type = 'relation'
else:
# continue if invalide osm-type
# continue if invalid osm-type
continue
url = result_base_url.format(osm_type=osm_type, osm_id=properties.get('osm_id'))

View file

@ -3,11 +3,15 @@
PubMed (Scholar publications)
"""
from flask_babel import gettext
from lxml import etree
from datetime import datetime
from urllib.parse import urlencode
from searx.network import get
from searx.utils import (
eval_xpath_getindex,
eval_xpath_list,
extract_text,
)
# about
about = {
@ -22,7 +26,7 @@ about = {
"results": 'XML',
}
categories = ['science']
categories = ['science', 'scientific publications']
base_url = (
'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi' + '?db=pubmed&{query}&retstart={offset}&retmax={hits}'
@ -63,46 +67,61 @@ def response(resp):
retrieve_url_encoded = pubmed_retrieve_api_url.format(**retrieve_notice_args)
search_results_xml = get(retrieve_url_encoded).content
search_results = etree.XML(search_results_xml).xpath('//PubmedArticleSet/PubmedArticle/MedlineCitation')
search_results_response = get(retrieve_url_encoded).content
search_results = etree.XML(search_results_response)
for entry in eval_xpath_list(search_results, '//PubmedArticle'):
medline = eval_xpath_getindex(entry, './MedlineCitation', 0)
for entry in search_results:
title = entry.xpath('.//Article/ArticleTitle')[0].text
pmid = entry.xpath('.//PMID')[0].text
title = eval_xpath_getindex(medline, './/Article/ArticleTitle', 0).text
pmid = eval_xpath_getindex(medline, './/PMID', 0).text
url = pubmed_url + pmid
content = extract_text(
eval_xpath_getindex(medline, './/Abstract/AbstractText//text()', 0, default=None), allow_none=True
)
doi = extract_text(
eval_xpath_getindex(medline, './/ELocationID[@EIdType="doi"]/text()', 0, default=None), allow_none=True
)
journal = extract_text(
eval_xpath_getindex(medline, './Article/Journal/Title/text()', 0, default=None), allow_none=True
)
issn = extract_text(
eval_xpath_getindex(medline, './Article/Journal/ISSN/text()', 0, default=None), allow_none=True
)
authors = []
for author in eval_xpath_list(medline, './Article/AuthorList/Author'):
f = eval_xpath_getindex(author, './ForeName', 0, default=None)
l = eval_xpath_getindex(author, './LastName', 0, default=None)
f = '' if f is None else f.text
l = '' if l is None else l.text
authors.append((f + ' ' + l).strip())
try:
content = entry.xpath('.//Abstract/AbstractText')[0].text
except:
content = gettext('No abstract is available for this publication.')
res_dict = {
'template': 'paper.html',
'url': url,
'title': title,
'content': content,
'journal': journal,
'issn': [issn],
'authors': authors,
'doi': doi,
}
# If a doi is available, add it to the snipppet
try:
doi = entry.xpath('.//ELocationID[@EIdType="doi"]')[0].text
content = 'DOI: {doi} Abstract: {content}'.format(doi=doi, content=content)
except:
pass
if len(content) > 300:
content = content[0:300] + "..."
# TODO: center snippet on query term
res_dict = {'url': url, 'title': title, 'content': content}
try:
publishedDate = datetime.strptime(
entry.xpath('.//DateCreated/Year')[0].text
+ '-'
+ entry.xpath('.//DateCreated/Month')[0].text
+ '-'
+ entry.xpath('.//DateCreated/Day')[0].text,
'%Y-%m-%d',
)
res_dict['publishedDate'] = publishedDate
except:
pass
accepted_date = eval_xpath_getindex(
entry, './PubmedData/History//PubMedPubDate[@PubStatus="accepted"]', 0, default=None
)
if accepted_date is not None:
year = eval_xpath_getindex(accepted_date, './Year', 0)
month = eval_xpath_getindex(accepted_date, './Month', 0)
day = eval_xpath_getindex(accepted_date, './Day', 0)
try:
publishedDate = datetime.strptime(
year.text + '-' + month.text + '-' + day.text,
'%Y-%m-%d',
)
res_dict['publishedDate'] = publishedDate
except Exception as e:
print(e)
results.append(res_dict)
return results
return results

View file

@ -6,6 +6,8 @@
from json import dumps, loads
from datetime import datetime
from flask_babel import gettext
about = {
"website": 'https://www.semanticscholar.org/',
"wikidata_id": 'Q22908627',
@ -15,6 +17,7 @@ about = {
"results": 'JSON',
}
categories = ['science', 'scientific publications']
paging = True
search_url = 'https://www.semanticscholar.org/api/1/search'
paper_url = 'https://www.semanticscholar.org/paper'
@ -45,11 +48,7 @@ def request(query, params):
def response(resp):
res = loads(resp.text)
results = []
for result in res['results']:
item = {}
metadata = []
url = result.get('primaryPaperLink', {}).get('url')
if not url and result.get('links'):
url = result.get('links')[0]
@ -60,22 +59,47 @@ def response(resp):
if not url:
url = paper_url + '/%s' % result['id']
item['url'] = url
# publishedDate
if 'pubDate' in result:
publishedDate = datetime.strptime(result['pubDate'], "%Y-%m-%d")
else:
publishedDate = None
item['title'] = result['title']['text']
item['content'] = result['paperAbstract']['text']
# authors
authors = [author[0]['name'] for author in result.get('authors', [])]
metadata = result.get('fieldsOfStudy') or []
venue = result.get('venue', {}).get('text')
if venue:
metadata.append(venue)
if metadata:
item['metadata'] = ', '.join(metadata)
# pick for the first alternate link, but not from the crawler
pdf_url = None
for doc in result.get('alternatePaperLinks', []):
if doc['linkType'] not in ('crawler', 'doi'):
pdf_url = doc['url']
break
pubDate = result.get('pubDate')
if pubDate:
item['publishedDate'] = datetime.strptime(pubDate, "%Y-%m-%d")
# comments
comments = None
if 'citationStats' in result:
comments = gettext(
'{numCitations} citations from the year {firstCitationVelocityYear} to {lastCitationVelocityYear}'
).format(
numCitations=result['citationStats']['numCitations'],
firstCitationVelocityYear=result['citationStats']['firstCitationVelocityYear'],
lastCitationVelocityYear=result['citationStats']['lastCitationVelocityYear'],
)
results.append(item)
results.append(
{
'template': 'paper.html',
'url': url,
'title': result['title']['text'],
'content': result['paperAbstract']['text'],
'journal': result.get('venue', {}).get('text') or result.get('journal', {}).get('name'),
'doi': result.get('doiInfo', {}).get('doi'),
'tags': result.get('fieldsOfStudy'),
'authors': authors,
'pdf_url': pdf_url,
'publishedDate': publishedDate,
'comments': comments,
}
)
return results

View file

@ -19,7 +19,7 @@ about = {
"results": 'JSON',
}
categories = ['science']
categories = ['science', 'scientific publications']
paging = True
nb_per_page = 10
api_key = 'unset'
@ -41,32 +41,32 @@ def response(resp):
json_data = loads(resp.text)
for record in json_data['records']:
content = record['abstract'][0:500]
if len(record['abstract']) > len(content):
content += "..."
published = datetime.strptime(record['publicationDate'], '%Y-%m-%d')
metadata = [
record[x]
for x in [
'publicationName',
'identifier',
'contentType',
]
if record.get(x) is not None
]
metadata = ' / '.join(metadata)
if record.get('startingPage') and record.get('endingPage') is not None:
metadata += " (%(startingPage)s-%(endingPage)s)" % record
authors = [" ".join(author['creator'].split(', ')[::-1]) for author in record['creators']]
tags = record.get('genre')
if isinstance(tags, str):
tags = [tags]
results.append(
{
'title': record['title'],
'template': 'paper.html',
'url': record['url'][0]['value'].replace('http://', 'https://', 1),
'content': content,
'title': record['title'],
'content': record['abstract'],
'comments': record['publicationName'],
'tags': tags,
'publishedDate': published,
'metadata': metadata,
'type': record.get('contentType'),
'authors': authors,
# 'editor': '',
'publisher': record.get('publisher'),
'journal': record.get('publicationName'),
'volume': record.get('volume') or None,
'pages': '-'.join([x for x in [record.get('startingPage'), record.get('endingPage')] if x]),
'number': record.get('number') or None,
'doi': record.get('doi'),
'issn': [x for x in [record.get('issn')] if x],
'isbn': [x for x in [record.get('isbn')] if x],
# 'pdf_url' : ''
}
)
return results

View file

@ -209,7 +209,7 @@ def _fetch_supported_languages(resp):
# native name, the English name of the writing script used by the language,
# or occasionally something else entirely.
# this cases are so special they need to be hardcoded, a couple of them are mispellings
# this cases are so special they need to be hardcoded, a couple of them are misspellings
language_names = {
'english_uk': 'en-GB',
'fantizhengwen': ['zh-TW', 'zh-HK'],

75
searx/engines/twitter.py Normal file
View file

@ -0,0 +1,75 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""Twitter (microblogging platform)"""
from json import loads
from urllib.parse import urlencode
from datetime import datetime
about = {
"website": 'https://twitter.com',
"wikidata_id": None,
"official_api_documentation": 'https://developer.twitter.com/en/docs/twitter-api',
"use_official_api": True,
"require_api_key": False,
"results": 'JSON',
}
categories = ['social media']
url = "https://api.twitter.com"
search_url = (
"{url}/2/search/adaptive.json?{query}&tweet_mode=extended&query_source=typed_query&pc=1&spelling_corrections=1"
)
def request(query, params):
params['url'] = search_url.format(url=url, query=urlencode({'q': query}))
params['headers'] = {
# This token is used in the Twitter web interface (twitter.com). Without this header, the API doesn't work.
# The value of the token has never changed (or maybe once a long time ago).
# https://github.com/zedeus/nitter/blob/5f31e86e0e8578377fa7d5aeb9631bbb2d35ef1e/src/consts.nim#L5
'Authorization': (
"Bearer AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%2F40K4moUkGsoc%3DTYfbDKb"
"T3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbw"
)
}
return params
def response(resp):
results = []
json_res = loads(resp.text)['globalObjects']
for tweet in json_res['tweets'].values():
text = tweet['full_text']
display = tweet['display_text_range']
img_src = tweet.get('extended_entities', {}).get('media', [{}])[0].get('media_url_https')
if img_src:
img_src += "?name=thumb"
results.append(
{
'url': 'https://twitter.com/i/web/status/' + tweet['id_str'],
'title': (text[:40] + '...') if len(text) > 40 else text,
'content': text[display[0] : display[1]],
'img_src': img_src,
'publishedDate': datetime.strptime(tweet['created_at'], '%a %b %d %H:%M:%S %z %Y'),
}
)
for user in json_res['users'].values():
results.append(
{
'title': user['name'],
'content': user['description'],
'url': 'https://twitter.com/' + user['screen_name'],
'img_src': user['profile_image_url_https'],
}
)
return results

View file

@ -50,7 +50,7 @@ WIKIDATA_PROPERTIES = {
# SERVICE wikibase:label: https://en.wikibooks.org/wiki/SPARQL/SERVICE_-_Label#Manual_Label_SERVICE
# https://en.wikibooks.org/wiki/SPARQL/WIKIDATA_Precision,_Units_and_Coordinates
# https://www.mediawiki.org/wiki/Wikibase/Indexing/RDF_Dump_Format#Data_model
# optmization:
# optimization:
# * https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/query_optimization
# * https://github.com/blazegraph/database/wiki/QueryHints
QUERY_TEMPLATE = """
@ -386,7 +386,7 @@ def get_attributes(language):
add_amount('P2046') # area
add_amount('P281') # postal code
add_label('P38') # currency
add_amount('P2048') # heigth (building)
add_amount('P2048') # height (building)
# Media
for p in [

View file

@ -50,7 +50,7 @@ def request(query, params):
# replace private user area characters to make text legible
def replace_pua_chars(text):
pua_chars = {
'\uf522': '\u2192', # rigth arrow
'\uf522': '\u2192', # right arrow
'\uf7b1': '\u2115', # set of natural numbers
'\uf7b4': '\u211a', # set of rational numbers
'\uf7b5': '\u211d', # set of real numbers

136
searx/engines/wttr.py Normal file
View file

@ -0,0 +1,136 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""wttr.in (weather forecast service)"""
from json import loads
from urllib.parse import quote
from flask_babel import gettext
about = {
"website": "https://wttr.in",
"wikidata_id": "Q107586666",
"official_api_documentation": "https://github.com/chubin/wttr.in#json-output",
"use_official_api": True,
"require_api_key": False,
"results": "JSON",
}
categories = ["others"]
url = "https://wttr.in/{query}?format=j1&lang={lang}"
def get_weather_condition_key(lang):
if lang == "en":
return "weatherDesc"
return "lang_" + lang.lower()
def generate_day_table(day):
res = ""
res += f"<tr><td>{gettext('Average temp.')}</td><td>{day['avgtempC']}°C / {day['avgtempF']}°F</td></tr>"
res += f"<tr><td>{gettext('Min temp.')}</td><td>{day['mintempC']}°C / {day['mintempF']}°F</td></tr>"
res += f"<tr><td>{gettext('Max temp.')}</td><td>{day['maxtempC']}°C / {day['maxtempF']}°F</td></tr>"
res += f"<tr><td>{gettext('UV index')}</td><td>{day['uvIndex']}</td></tr>"
res += f"<tr><td>{gettext('Sunrise')}</td><td>{day['astronomy'][0]['sunrise']}</td></tr>"
res += f"<tr><td>{gettext('Sunset')}</td><td>{day['astronomy'][0]['sunset']}</td></tr>"
return res
def generate_condition_table(condition, lang, current=False):
res = ""
if current:
key = "temp_"
else:
key = "temp"
res += (
f"<tr><td><b>{gettext('Condition')}</b></td>"
f"<td><b>{condition[get_weather_condition_key(lang)][0]['value']}</b></td></tr>"
)
res += (
f"<tr><td><b>{gettext('Temperature')}</b></td>"
f"<td><b>{condition[key+'C']}°C / {condition[key+'F']}°F</b></td></tr>"
)
res += (
f"<tr><td>{gettext('Feels like')}</td><td>{condition['FeelsLikeC']}°C / {condition['FeelsLikeF']}°F</td></tr>"
)
res += (
f"<tr><td>{gettext('Wind')}</td><td>{condition['winddir16Point']}"
f"{condition['windspeedKmph']} km/h / {condition['windspeedMiles']} mph</td></tr>"
)
res += (
f"<tr><td>{gettext('Visibility')}</td><td>{condition['visibility']} km / {condition['visibilityMiles']} mi</td>"
)
res += f"<tr><td>{gettext('Humidity')}</td><td>{condition['humidity']}%</td></tr>"
return res
def request(query, params):
if query.replace('/', '') in [":help", ":bash.function", ":translation"]:
return None
if params["language"] == "all":
params["language"] = "en"
else:
params["language"] = params["language"].split("-")[0]
params["url"] = url.format(query=quote(query), lang=params["language"])
params["raise_for_httperror"] = False
return params
def response(resp):
results = []
if resp.status_code == 404:
return []
result = loads(resp.text)
current = result["current_condition"][0]
location = result['nearest_area'][0]
forecast_indices = {3: gettext('Morning'), 4: gettext('Noon'), 6: gettext('Evening'), 7: gettext('Night')}
title = f"{location['areaName'][0]['value']}, {location['region'][0]['value']}"
infobox = f"<h3>{gettext('Current condition')}</h3><table><tbody>"
infobox += generate_condition_table(current, resp.search_params['language'], True)
infobox += "</tbody></table>"
for day in result["weather"]:
infobox += f"<h3>{day['date']}</h3>"
infobox += "<table><tbody>"
infobox += generate_day_table(day)
infobox += "</tbody></table>"
infobox += "<table><tbody>"
for time in forecast_indices.items():
infobox += f"<tr><td rowspan=\"7\"><b>{time[1]}</b></td></tr>"
infobox += generate_condition_table(day['hourly'][time[0]], resp.search_params['language'])
infobox += "</tbody></table>"
results.append(
{
"infobox": title,
"content": infobox,
}
)
return results

View file

@ -22,6 +22,7 @@ from urllib.parse import urlencode
from lxml import html
from searx.utils import extract_text, extract_url, eval_xpath, eval_xpath_list
from searx.network import raise_for_httperror
search_url = None
"""
@ -52,7 +53,7 @@ Replacements are:
0: none, 1: moderate, 2:strict
If not supported, the URL paramter is an empty string.
If not supported, the URL parameter is an empty string.
"""
@ -61,6 +62,14 @@ lang_all = 'en'
selected.
'''
no_result_for_http_status = []
'''Return empty result for these HTTP status codes instead of throwing an error.
.. code:: yaml
no_result_for_http_status: []
'''
soft_max_redirects = 0
'''Maximum redirects, soft limit. Record an error but don't stop the engine'''
@ -105,7 +114,7 @@ time_range_support = False
time_range_url = '&hours={time_range_val}'
'''Time range URL parameter in the in :py:obj:`search_url`. If no time range is
requested by the user, the URL paramter is an empty string. The
requested by the user, the URL parameter is an empty string. The
``{time_range_val}`` replacement is taken from the :py:obj:`time_range_map`.
.. code:: yaml
@ -177,11 +186,18 @@ def request(query, params):
params['url'] = search_url.format(**fargs)
params['soft_max_redirects'] = soft_max_redirects
params['raise_for_httperror'] = False
return params
def response(resp):
def response(resp): # pylint: disable=too-many-branches
'''Scrap *results* from the response (see :ref:`engine results`).'''
if no_result_for_http_status and resp.status_code in no_result_for_http_status:
return []
raise_for_httperror(resp)
results = []
dom = html.fromstring(resp.text)
is_onion = 'onions' in categories

View file

@ -1,5 +1,6 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
from urllib.parse import quote_plus
from searx.data import EXTERNAL_BANGS
LEAF_KEY = chr(16)
@ -39,7 +40,7 @@ def get_bang_definition_and_ac(external_bangs_db, bang):
def resolve_bang_definition(bang_definition, query):
url, rank = bang_definition.split(chr(1))
url = url.replace(chr(2), query)
url = url.replace(chr(2), quote_plus(query))
if url.startswith('//'):
url = 'https:' + url
rank = int(rank) if len(rank) > 0 else 0

View file

@ -30,7 +30,7 @@ def get_external_url(url_id, item_id, alternative="default"):
"""Return an external URL or None if url_id is not found.
url_id can take value from data/external_urls.json
The "imdb_id" value is automaticaly converted according to the item_id value.
The "imdb_id" value is automatically converted according to the item_id value.
If item_id is None, the raw URL with the $1 is returned.
"""

View file

@ -25,7 +25,10 @@ _flask_babel_get_translations = flask_babel.get_translations
LOCALE_NAMES = {}
"""Mapping of locales and their description. Locales e.g. 'fr' or 'pt-BR' (see
:py:obj:`locales_initialize`)."""
:py:obj:`locales_initialize`).
:meta hide-value:
"""
RTL_LOCALES: Set[str] = set()
"""List of *Right-To-Left* locales e.g. 'he' or 'fa-IR' (see
@ -159,7 +162,7 @@ def get_engine_locale(searxng_locale, engine_locales, default=None):
``searxng_locale``.
Argument ``engine_locales`` is a python dict that maps *SearXNG locales* to
corresponding *engine locales*:
corresponding *engine locales*::
<engine>: {
# SearXNG string : engine-string
@ -217,7 +220,7 @@ def get_engine_locale(searxng_locale, engine_locales, default=None):
locale = babel.Locale.parse(searxng_locale, sep='-')
except babel.core.UnknownLocaleError:
try:
locale = babel.Locale.parse(searxng_locale.split('-')[1])
locale = babel.Locale.parse(searxng_locale.split('-')[0])
except babel.core.UnknownLocaleError:
return default
@ -252,8 +255,12 @@ def get_engine_locale(searxng_locale, engine_locales, default=None):
terr_lang_dict[territory] = langs.get(searxng_lang)
# first: check fr-FR, de-DE .. is supported by the engine
# exception: 'en' --> 'en-US'
territory = locale.language.upper()
if territory == 'EN':
territory = 'US'
if terr_lang_dict.get(territory):
searxng_locale = locale.language + '-' + territory
engine_locale = engine_locales.get(searxng_locale)

View file

@ -67,7 +67,7 @@ def is_accepted_request() -> bool:
return False
accept_encoding_list = [l.strip() for l in request.headers.get('Accept-Encoding', '').split(',')]
if 'gzip' not in accept_encoding_list or 'deflate' not in accept_encoding_list:
if 'gzip' not in accept_encoding_list and 'deflate' not in accept_encoding_list:
logger.debug("suspicious Accept-Encoding") # pylint: disable=undefined-variable
return False

View file

@ -42,4 +42,6 @@ def on_result(request, search, result):
doi = doi[: -len(suffix)]
result['url'] = get_doi_resolver(request.preferences) + doi
result['parsed_url'] = urlparse(result['url'])
if 'doi' not in result:
result['doi'] = doi
return True

View file

@ -17,7 +17,7 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
from flask_babel import gettext
import re
name = gettext('Self Informations')
name = gettext('Self Information')
description = gettext('Displays your IP if the query is "ip" and your user agent if the query contains "user agent".')
default_on = True
preference_section = 'query'

View file

@ -52,7 +52,7 @@ class Setting:
return self.value
def save(self, name: str, resp: flask.Response):
"""Save cookie ``name`` in the HTTP reponse obect
"""Save cookie ``name`` in the HTTP response object
If needed, its overwritten in the inheritance."""
resp.set_cookie(name, self.value, max_age=COOKIE_MAX_AGE)
@ -113,7 +113,7 @@ class MultipleChoiceSetting(Setting):
self.value.append(choice)
def save(self, name: str, resp: flask.Response):
"""Save cookie ``name`` in the HTTP reponse obect"""
"""Save cookie ``name`` in the HTTP response object"""
resp.set_cookie(name, ','.join(self.value), max_age=COOKIE_MAX_AGE)
@ -146,7 +146,7 @@ class SetSetting(Setting):
self.values = set(elements)
def save(self, name: str, resp: flask.Response):
"""Save cookie ``name`` in the HTTP reponse obect"""
"""Save cookie ``name`` in the HTTP response object"""
resp.set_cookie(name, ','.join(self.values), max_age=COOKIE_MAX_AGE)
@ -193,7 +193,7 @@ class MapSetting(Setting):
self.key = data # pylint: disable=attribute-defined-outside-init
def save(self, name: str, resp: flask.Response):
"""Save cookie ``name`` in the HTTP reponse obect"""
"""Save cookie ``name`` in the HTTP response object"""
if hasattr(self, 'key'):
resp.set_cookie(name, self.key, max_age=COOKIE_MAX_AGE)
@ -239,7 +239,7 @@ class BooleanChoices:
return (k for k, v in self.choices.items() if not v)
def save(self, resp: flask.Response):
"""Save cookie in the HTTP reponse obect"""
"""Save cookie in the HTTP response object"""
disabled_changed = (k for k in self.disabled if self.default_choices[k])
enabled_changed = (k for k in self.enabled if not self.default_choices[k])
resp.set_cookie('disabled_{0}'.format(self.name), ','.join(disabled_changed), max_age=COOKIE_MAX_AGE)
@ -496,7 +496,7 @@ class Preferences:
return ret_val
def save(self, resp: flask.Response):
"""Save cookie in the HTTP reponse obect"""
"""Save cookie in the HTTP response object"""
for user_setting_name, user_setting in self.key_value_settings.items():
# pylint: disable=unnecessary-dict-index-lookup
if self.key_value_settings[user_setting_name].locked:

View file

@ -198,10 +198,10 @@ class BangParser(QueryPartParser):
self.raw_text_query.enginerefs.append(EngineRef(value, 'none'))
return True
# check if prefix is equal with categorie name
# check if prefix is equal with category name
if value in categories:
# using all engines for that search, which
# are declared under that categorie name
# are declared under that category name
self.raw_text_query.enginerefs.extend(
EngineRef(engine.name, value)
for engine in categories[value]
@ -219,7 +219,7 @@ class BangParser(QueryPartParser):
self._add_autocomplete(first_char + suggestion)
return
# check if query starts with categorie name
# check if query starts with category name
for category in categories:
if category.startswith(value):
self._add_autocomplete(first_char + category.replace(' ', '_'))
@ -311,7 +311,7 @@ class RawTextQuery:
def getFullQuery(self):
"""
get full querry including whitespaces
get full query including whitespaces
"""
return '{0} {1}'.format(' '.join(self.query_parts), self.getQuery()).strip()

View file

@ -134,9 +134,9 @@ def result_score(result):
if hasattr(engines[result_engine], 'weight'):
weight *= float(engines[result_engine].weight)
occurences = len(result['positions'])
occurrences = len(result['positions'])
return sum((occurences * weight) / position for position in result['positions'])
return sum((occurrences * weight) / position for position in result['positions'])
class Timing(NamedTuple):
@ -286,7 +286,7 @@ class ResultContainer:
if 'template' not in result:
result['template'] = 'default.html'
# strip multiple spaces and cariage returns from content
# strip multiple spaces and carriage returns from content
if result.get('content'):
result['content'] = WHITESPACE_REGEX.sub(' ', result['content'])
@ -315,7 +315,7 @@ class ResultContainer:
return merged_result
else:
# it's an image
# it's a duplicate if the parsed_url, template and img_src are differents
# it's a duplicate if the parsed_url, template and img_src are different
if result.get('img_src', '') == merged_result.get('img_src', ''):
return merged_result
return None

View file

@ -70,7 +70,7 @@ def run(engine_name_list, verbose):
stderr.write(f'{BOLD_SEQ}Engine {name:30}{RESET_SEQ}Checking\n')
checker = searx.search.checker.Checker(processor)
checker.run()
if checker.test_results.succesfull:
if checker.test_results.successful:
stdout.write(f'{BOLD_SEQ}Engine {name:30}{RESET_SEQ}{GREEN}OK{RESET_SEQ}\n')
if verbose:
stdout.write(f' {"found languages":15}: {" ".join(sorted(list(checker.test_results.languages)))}\n')

View file

@ -107,7 +107,7 @@ def run():
logger.debug('Checking %s engine', name)
checker = Checker(processor)
checker.run()
if checker.test_results.succesfull:
if checker.test_results.successful:
result['engines'][name] = {'success': True}
else:
result['engines'][name] = {'success': False, 'errors': checker.test_results.errors}

View file

@ -174,7 +174,7 @@ class TestResults:
self.languages.add(language)
@property
def succesfull(self):
def successful(self):
return len(self.errors) == 0
def __iter__(self):
@ -317,7 +317,7 @@ class ResultContainerTests:
self._record_error('No result')
def one_title_contains(self, title: str):
"""Check one of the title contains `title` (case insensitive comparaison)"""
"""Check one of the title contains `title` (case insensitive comparison)"""
title = title.lower()
for result in self.result_container.get_ordered_results():
if title in result['title'].lower():

View file

@ -75,7 +75,7 @@ class OnlineProcessor(EngineProcessor):
def _send_http_request(self, params):
# create dictionary which contain all
# informations about the request
# information about the request
request_args = dict(
headers=params['headers'], cookies=params['cookies'], verify=params['verify'], auth=params['auth']
)

View file

@ -43,6 +43,7 @@ CATEGORY_GROUPS = {
'REPOS': 'repos',
'SOFTWARE_WIKIS': 'software wikis',
'WEB': 'web',
'SCIENTIFIC PUBLICATIONS': 'scientific publications',
}
STYLE_NAMES = {

View file

@ -23,7 +23,7 @@ brand:
search:
# Filter results. 0: None, 1: Moderate, 2: Strict
safe_search: 0
# Existing autocomplete backends: "dbpedia", "duckduckgo", "google",
# Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "yandex",
# "seznam", "startpage", "swisscows", "qwant", "wikipedia" - leave blank to turn it off
# by default.
autocomplete: ""
@ -52,7 +52,7 @@ search:
server:
# If you change port, bind_address or base_url don't forget to rebuild
# instance's enviroment (make buildenv)
# instance's environment (make buildenv)
port: 8888
bind_address: "127.0.0.1"
base_url: false # Possible values: false or "https://example.org/location".
@ -95,6 +95,8 @@ ui:
default_theme: simple
# center the results ?
center_alignment: false
# URL prefix of the internet archive, don't forgett trailing slash (if needed).
# cache_url: "https://webcache.googleusercontent.com/search?q=cache:"
# Default interface locale - leave blank to detect from browser information or
# use codes from the 'locales' config section
default_locale: ""
@ -121,6 +123,7 @@ ui:
#
# result_proxy:
# url: http://127.0.0.1:3000/
# # the key is a base64 encoded string, the YAML !!binary prefix is optional
# key: !!binary "your_morty_proxy_key"
# # [true|false] enable the "proxy" button next to each result
# proxify_results: true
@ -132,7 +135,7 @@ outgoing:
request_timeout: 3.0
# the maximum timeout in seconds
# max_request_timeout: 10.0
# suffix of searx_useragent, could contain informations like an email address
# suffix of searx_useragent, could contain information like an email address
# to the administrator
useragent_suffix: ""
# The maximum number of concurrent connections that may be established.
@ -180,7 +183,7 @@ outgoing:
# # these plugins are enabled if nothing is configured ..
# - 'Hash plugin'
# - 'Search on category select'
# - 'Self Informations'
# - 'Self Information'
# - 'Tracker URL remover'
# - 'Ahmia blacklist' # activation depends on outgoing.using_tor_proxy
# # these plugins are disabled if nothing is configured ..
@ -262,12 +265,22 @@ categories_as_tabs:
social media:
engines:
- name: 9gag
engine: 9gag
shortcut: 9g
disabled: true
- name: apk mirror
engine: apkmirror
timeout: 4.0
shortcut: apkm
disabled: true
- name: apple app store
engine: apple_app_store
shortcut: aps
disabled: true
# Requires Tor
- name: ahmia
engine: ahmia
@ -306,7 +319,6 @@ engines:
- name: arxiv
engine: arxiv
shortcut: arx
categories: science
timeout: 4.0
# tmp suspended: dh key too small
@ -398,23 +410,10 @@ engines:
# api_key: 'unset'
- name: crossref
engine: json_engine
paging: true
search_url: https://search.crossref.org/dois?q={query}&page={pageno}
url_query: doi
title_query: title
title_html_to_text: true
content_query: fullCitation
content_html_to_text: true
categories: science
engine: crossref
shortcut: cr
about:
website: https://www.crossref.org/
wikidata_id: Q5188229
official_api_documentation: https://github.com/CrossRef/rest-api-doc
use_official_api: false
require_api_key: false
results: JSON
timeout: 30
disabled: true
- name: yep
engine: json_engine
@ -540,6 +539,17 @@ engines:
timeout: 3.0
disabled: true
- name: duckduckgo weather
engine: duckduckgo_weather
shortcut: ddw
disabled: true
- name: apple maps
engine: apple_maps
shortcut: apm
disabled: true
timeout: 5.0
- name: emojipedia
engine: emojipedia
timeout: 4.0
@ -1044,7 +1054,7 @@ engines:
title_query: metadata/oaf:entity/oaf:result/title/$
content_query: metadata/oaf:entity/oaf:result/description/$
content_html_to_text: true
categories: science
categories: "science"
shortcut: oad
timeout: 5.0
about:
@ -1174,7 +1184,6 @@ engines:
- name: pubmed
engine: pubmed
shortcut: pub
categories: science
timeout: 3.0
- name: pypi
@ -1322,7 +1331,6 @@ engines:
engine: semantic_scholar
disabled: true
shortcut: se
categories: science
# Spotify needs API credentials
# - name: spotify
@ -1348,8 +1356,7 @@ engines:
# # working API key, for test & debug: "a69685087d07eca9f13db62f65b8f601"
# api_key: 'unset'
# shortcut: springer
# categories: science
# timeout: 6.0
# timeout: 15.0
- name: startpage
engine: startpage
@ -1425,6 +1432,11 @@ engines:
# - 2000
# - 5000
- name: twitter
shortcut: tw
engine: twitter
disabled: true
# maybe in a fun category
# - name: uncyclopedia
# engine: mediawiki
@ -1666,6 +1678,15 @@ engines:
engine: seznam
disabled: true
# - name: deepl
# engine: deepl
# shortcut: dpl
# # You can use the engine using the official stable API, but you need an API key
# # See: https://www.deepl.com/pro-api?cta=header-pro-api
# api_key: '' # required!
# timeout: 5.0
# disabled: true
- name: mojeek
shortcut: mjk
engine: xpath
@ -1781,6 +1802,7 @@ engines:
url_xpath: //div[@class="upper-synonyms"]/a/@href
content_xpath: //div[@class="synonyms-list-group"]
title_xpath: //div[@class="upper-synonyms"]/a
no_result_for_http_status: [404]
about:
website: https://www.woxikon.de/
wikidata_id: # No Wikidata ID
@ -1816,6 +1838,11 @@ engines:
results: HTML
language: fr
- name: wttr.in
engine: wttr
shortcut: wttr
timeout: 9.0
- name: brave
shortcut: brave
engine: xpath
@ -1834,6 +1861,9 @@ engines:
month: 'pm'
year: 'py'
categories: [general, web]
disabled: true
headers:
Accept-Encoding: gzip, deflate
about:
website: https://brave.com/search/
wikidata_id: Q107355971
@ -2006,10 +2036,7 @@ doi_resolvers:
doi.org: 'https://doi.org/'
doai.io: 'https://dissem.in/'
sci-hub.se: 'https://sci-hub.se/'
sci-hub.do: 'https://sci-hub.do/'
scihubtw.tw: 'https://scihubtw.tw/'
sci-hub.st: 'https://sci-hub.st/'
sci-hub.bar: 'https://sci-hub.bar/'
sci-hub.it.nf: 'https://sci-hub.it.nf/'
sci-hub.ru: 'https://sci-hub.ru/'
default_doi_resolver: 'oadoi.org'

View file

@ -9,6 +9,7 @@ import numbers
import errno
import os
import logging
from base64 import b64decode
from os.path import dirname, abspath
from searx.languages import language_codes as languages
@ -41,16 +42,6 @@ STR_TO_BOOL = {
}
_UNDEFINED = object()
# compatibility
SEARX_ENVIRON_VARIABLES = {
'SEARX_DISABLE_ETC_SETTINGS': 'SEARXNG_DISABLE_ETC_SETTINGS',
'SEARX_SETTINGS_PATH': 'SEARXNG_SETTINGS_PATH',
'SEARX_DEBUG': 'SEARXNG_DEBUG',
'SEARX_PORT': 'SEARXNG_PORT',
'SEARX_BIND_ADDRESS': 'SEARXNG_BIND_ADDRESS',
'SEARX_SECRET': 'SEARXNG_SECRET',
}
class SettingsValue:
"""Check and update a setting value"""
@ -117,6 +108,15 @@ class SettingsDirectoryValue(SettingsValue):
return super().__call__(value)
class SettingsBytesValue(SettingsValue):
"""str are base64 decoded"""
def __call__(self, value: typing.Any) -> typing.Any:
if isinstance(value, str):
value = b64decode(value)
return super().__call__(value)
def apply_schema(settings, schema, path_list):
error = False
for key, value in schema.items():
@ -190,6 +190,7 @@ SCHEMA = {
'advanced_search': SettingsValue(bool, False),
'query_in_title': SettingsValue(bool, False),
'infinite_scroll': SettingsValue(bool, False),
'cache_url': SettingsValue(str, 'https://web.archive.org/web/'),
},
'preferences': {
'lock': SettingsValue(list, []),
@ -215,6 +216,11 @@ SCHEMA = {
'extra_proxy_timeout': SettingsValue(int, 0),
'networks': {},
},
'result_proxy': {
'url': SettingsValue((None, str), None),
'key': SettingsBytesValue((None, bytes), None),
'proxify_results': SettingsValue(bool, False),
},
'plugins': SettingsValue(list, []),
'enabled_plugins': SettingsValue((None, list), None),
'checker': {
@ -227,11 +233,5 @@ SCHEMA = {
def settings_set_defaults(settings):
# compatibility with searx variables
for searx, searxng in SEARX_ENVIRON_VARIABLES.items():
if searx in os.environ and searxng not in os.environ:
os.environ[searxng] = os.environ[searx]
logger.warning('%s uses value from %s', searxng, searx)
apply_schema(settings, SCHEMA, [])
return settings

View file

@ -1,5 +1,6 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
from typing import Optional
from os import environ
from os.path import dirname, join, abspath, isfile
from collections.abc import Mapping
@ -13,7 +14,7 @@ from searx.exceptions import SearxSettingsException
searx_dir = abspath(dirname(__file__))
def check_settings_yml(file_name):
def existing_filename_or_none(file_name: str) -> Optional[str]:
if isfile(file_name):
return file_name
return None
@ -30,29 +31,29 @@ def load_yaml(file_name):
def get_default_settings_path():
return check_settings_yml(join(searx_dir, 'settings.yml'))
return existing_filename_or_none(join(searx_dir, 'settings.yml'))
def get_user_settings_path():
# find location of settings.yml
def get_user_settings_path() -> Optional[str]:
"""Get an user settings file.
By descending priority:
1. ``environ['SEARXNG_SETTINGS_PATH']``
2. ``/etc/searxng/settings.yml`` except if ``SEARXNG_DISABLE_ETC_SETTINGS`` is ``true`` or ``1``
3. ``None``
"""
# check the environment variable SEARXNG_SETTINGS_PATH
# if the environment variable is defined, this is the last check
if 'SEARXNG_SETTINGS_PATH' in environ:
# if possible set path to settings using the
# enviroment variable SEARXNG_SETTINGS_PATH
return check_settings_yml(environ['SEARXNG_SETTINGS_PATH'])
return existing_filename_or_none(environ['SEARXNG_SETTINGS_PATH'])
# if SEARXNG_DISABLE_ETC_SETTINGS don't look any futher
if environ.get('SEARXNG_DISABLE_ETC_SETTINGS', '').lower() in ('1', 'true'):
return None
# if not, get it from searx code base or last solution from /etc/searxng
try:
return check_settings_yml('/etc/searxng/settings.yml')
except SearxSettingsException as e:
# fall back to searx settings
try:
return check_settings_yml('/etc/searx/settings.yml')
except SearxSettingsException:
# if none are found, raise the exception about SearXNG
raise e # pylint: disable=raise-missing-from
# check /etc/searxng/settings.yml
# (continue with other locations if the file is not found)
return existing_filename_or_none('/etc/searxng/settings.yml')
def update_dict(default_dict, user_dict):
@ -120,10 +121,10 @@ def is_use_default_settings(user_settings):
raise ValueError('Invalid value for use_default_settings')
def load_settings(load_user_setttings=True):
def load_settings(load_user_settings=True):
default_settings_path = get_default_settings_path()
user_settings_path = get_user_settings_path()
if user_settings_path is None or not load_user_setttings:
if user_settings_path is None or not load_user_settings:
# no user settings
return (load_yaml(default_settings_path), 'load the default settings from {}'.format(default_settings_path))
@ -135,7 +136,7 @@ def load_settings(load_user_setttings=True):
update_settings(default_settings, user_settings)
return (
default_settings,
'merge the default settings ( {} ) and the user setttings ( {} )'.format(
'merge the default settings ( {} ) and the user settings ( {} )'.format(
default_settings_path, user_settings_path
),
)

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -14,7 +14,7 @@
"ionicons": "^6.0.2",
"less": "^4.1.3",
"less-plugin-clean-css": "^1.5.1",
"sharp": "^0.30.6",
"sharp": "^0.31.0",
"stylelint": "^13.13.1",
"stylelint-config-standard": "^22.0.0",
"ejs": "^3.1.8",

View file

@ -1,6 +1,6 @@
/*
this file is generated automatically by searxng_extra/update/update_pygments.py
using pygments version 2.12.0
using pygments version 2.13.0
*/
.code-highlight .linenos {

View file

@ -68,6 +68,43 @@
}, "#" + qinput_id);
}
/*
Monkey patch autocomplete.js to fix a bug
With the POST method, the values are not URL encoded: query like "1 + 1" are sent as "1 1" since space are URL encoded as plus.
See HTML specifications:
* HTML5: https://url.spec.whatwg.org/#concept-urlencoded-serializer
* HTML4: https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
autocomplete.js does not URL encode the name and values:
https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/src/autocomplete.ts#L665
The monkey patch overrides the compiled version of the ajax function.
See https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/dist/autocomplete.js#L143-L158
The patch changes only the line 156 from
params.Request.send(params._QueryArg() + "=" + params._Pre());
to
params.Request.send(encodeURIComponent(params._QueryArg()) + "=" + encodeURIComponent(params._Pre()));
Related to:
* https://github.com/autocompletejs/autocomplete.js/issues/78
* https://github.com/searxng/searxng/issues/1695
*/
AutoComplete.prototype.ajax = function (params, request, timeout) {
if (timeout === void 0) { timeout = true; }
if (params.$AjaxTimer) {
window.clearTimeout(params.$AjaxTimer);
}
if (timeout === true) {
params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);
} else {
if (params.Request) {
params.Request.abort();
}
params.Request = request;
params.Request.send(encodeURIComponent(params._QueryArg()) + "=" + encodeURIComponent(params._Pre()));
}
};
if (!isMobile && document.querySelector('.index_endpoint')) {
qinput.focus();
}

View file

@ -302,6 +302,49 @@ article[data-vim-selected].category-social {
}
}
.result-paper {
.attributes {
display: table;
border-spacing: 0.125rem;
div {
display: table-row;
span {
font-size: 0.9rem;
margin-top: 0.25rem;
display: table-cell;
time {
font-size: 0.9rem;
}
}
span:first-child {
color: var(--color-base-font);
min-width: 10rem;
}
span:nth-child(2) {
color: var(--color-result-publishdate-font);
}
}
}
.content {
margin-top: 0.25rem;
}
.comments {
font-size: 0.9rem;
margin: 0.25rem 0 0 0;
padding: 0;
word-wrap: break-word;
line-height: 1.24;
font-style: italic;
}
}
.template_group_images {
display: flex;
flex-wrap: wrap;
@ -955,6 +998,28 @@ article[data-vim-selected].category-social {
border: none !important;
background-color: var(--color-sidebar-background);
}
.result-paper {
.attributes {
display: block;
div {
display: block;
span {
display: inline;
}
span:first-child {
font-weight: bold;
}
span:nth-child(2) {
.ltr-margin-left(0.5rem);
}
}
}
}
}
/*

View file

@ -2,7 +2,7 @@
<html class="no-js theme-{{ preferences.get_value('simple_style') or 'auto' }} center-aligment-{{ preferences.get_value('center_alignment') and 'yes' or 'no' }}" lang="{{ locale_rfc5646 }}" {% if rtl %} dir="rtl"{% endif %}>
<head>
<meta charset="UTF-8" />
<meta name="description" content="SearXNG — a privacy-respecting, hackable metasearch engine">
<meta name="description" content="SearXNG — a privacy-respecting, open metasearch engine">
<meta name="keywords" content="SearXNG, search, search engine, metasearch, meta search">
<meta name="generator" content="searxng/{{ searx_version }}">
<meta name="referrer" content="no-referrer">
@ -61,10 +61,10 @@
</main>
<footer>
<p>
{{ _('Powered by') }} <a href="{{ url_for('info', pagename='about') }}">searxng</a> - {{ searx_version }} — {{ _('a privacy-respecting, hackable metasearch engine') }}<br/>
<a href="{{ searx_git_url }}">{{ _('Source code') }}</a> |
<a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a> |
<a href="{{ url_for('stats') }}">{{ _('Engine stats') }}</a>
{{ _('Powered by') }} <a href="{{ url_for('info', pagename='about') }}">searxng</a> - {{ searx_version }} — {{ _('a privacy-respecting, open metasearch engine') }}<br/>
<a href="{{ searx_git_url }}">{{ _('Source code') }}</a>
| <a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a>
{% if enable_metrics %}| <a href="{{ url_for('stats') }}">{{ _('Engine stats') }}</a>{% endif %}
{% if get_setting('brand.public_instances') %}
| <a href="{{ get_setting('brand.public_instances') }}">{{ _('Public instances') }}</a>
{% endif %}

View file

@ -42,7 +42,7 @@
{%- macro result_sub_footer(result, proxify) -%}
<div class="engines">
{% for engine in result.engines %}<span>{{ engine }}</span>{% endfor %}
{{ result_link("https://web.archive.org/web/" + result.url, icon_small('ellipsis-vertical-outline') + _('cached'), "cache_link") }}&lrm; {% if proxify and proxify_results %} {{ result_link(proxify(result.url), icon('link') + _('proxied'), "proxyfied_link") }} {% endif %}
{{ result_link(cache_url + result.url, icon_small('ellipsis-vertical-outline') + _('cached'), "cache_link") }}&lrm; {% if proxify and proxify_results %} {{ result_link(proxify(result.url), icon('link') + _('proxied'), "proxyfied_link") }} {% endif %}
</div>{{- '' -}}
<div class="break"></div>{{- '' -}}
{%- endmacro -%}

View file

@ -261,7 +261,7 @@
<option value="GET" {% if method == 'GET' %}selected="selected"{% endif %}>GET</option>
</select>
</p>
<div class="description">{{ _('Change how forms are submited, <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods" rel="external">learn more about request methods</a>') }}</div>
<div class="description">{{ _('Change how forms are submitted, <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods" rel="external">learn more about request methods</a>') }}</div>
</fieldset>
{% endif %}
{% if 'image_proxy' not in locked_preferences %}
@ -310,9 +310,9 @@
<th>{{ _("Supports selected language") }}</th>{{- "" -}}
<th>{{ _("SafeSearch") }}</th>{{- "" -}}
<th>{{ _("Time range") }}</th>{{- "" -}}
<th>{{ _("Response time") }}</th>{{- "" -}}
{%- if enable_metrics %}<th>{{ _("Response time") }}</th>{% endif -%}
<th>{{ _("Max time") }}</th>{{- "" -}}
<th>{{ _("Reliability") }}</th>{{- "" -}}
{%- if enable_metrics %}<th>{{ _("Reliability") }}</th>{% endif -%}
</tr>
{% for group, engines in engines_by_category[categ] | group_engines_in_tab %}
{% if loop.length > 1 %}
@ -336,9 +336,9 @@
<td>{{ checkbox(None, supports[search_engine.name]['supports_selected_language'], true) }}</td>{{- "" -}}
<td>{{ checkbox(None, supports[search_engine.name]['safesearch'], true) }}</td>{{- "" -}}
<td>{{ checkbox(None, supports[search_engine.name]['time_range_support'], true) }}</td>{{- "" -}}
{{- engine_time(search_engine.name) -}}
{%- if enable_metrics %}{{- engine_time(search_engine.name) -}}{% endif -%}
<td class="{{ 'danger' if stats[search_engine.name]['warn_timeout'] else '' }}">{{ search_engine.timeout }}</td>{{- "" -}}
{{ engine_reliability(search_engine.name) -}}
{%- if enable_metrics %}{{ engine_reliability(search_engine.name) -}}{% endif -%}
</tr>
{% endif %}
{% endfor %}

View file

@ -0,0 +1,38 @@
{% from 'simple/macros.html' import result_header, result_sub_header, result_sub_footer, result_footer, result_link with context %}
{{ result_header(result, favicons, image_proxify) -}}
<div class="attributes">
{%- if result.publishedDate %}<div class="result_publishedDate"><span>{{ _("Published date") }}:</span><span><time class="published_date" datetime="{{ result.pubdate }}" >{{ result.publishedDate }}</time></span></div>{% endif -%}
{%- if result.authors %}<div class="result_authors"><span>{{ _("Author") }}:</span><span>{{ result.authors | join(", ") }}</span></div>{% endif -%}
{%- if result.journal -%}
<div class="result_journal">
<span>{{- _("Journal") }}:</span><span>{{ result.journal -}}
{%- if result.volume -%}
&nbsp;{{- result.volume -}}
{%- if result.number -%}
.{{- result.number -}}
{%- endif -%}
{%- endif -%}
{%- if result.pages -%}
&nbsp;{{- result.pages -}}
{%- endif -%}
</span>
</div>
{%- endif %}
{%- if result.editor %}<div class="result_editor"><span>{{ _("Editor") }}:</span><span>{{ result.editor }}</span></div>{% endif -%}
{%- if result.publisher %}<div class="result_publisher"><span>{{ _("Publisher") }}:</span><span>{{ result.publisher }}</span></div>{% endif -%}
{%- if result.type %}<div class="result_type"><span>{{ _("Type") }}:</span><span>{{ result.type }}</span></div>{% endif -%}
{%- if result.tags %}<div class="result_tags"><span>{{ _("Tags") }}:</span><span>{{ result.tags | join(", ")}}</span></div>{%- endif -%}
{%- if result.doi %}<div class="result_doi"><span>{{ _("DOI") }}:</span><span>{{ result_link(doi_resolver + result.doi, result.doi) }}</span></div>{% endif -%}
{%- if result.issn %}<div class="result_issn"><span>{{ _("ISSN") }}:</span><span>{{ result.issn | join(", ") }}</span></div>{% endif -%}
{%- if result.isbn %}<div class="result_isbn"><span>{{ _("ISBN") }}:</span><span>{{ result.isbn | join(", ") }}</span></div>{% endif -%}
</div>
{%- if result.content -%}<p class="content">{{- result.content | safe -}}</p>{%- endif -%}
{%- if result.comments -%}<p class="comments">{{- result.comments -}}</p>{%- endif -%}
<p class="altlink">
{%- if result.pdf_url -%}{{ result_link(result.pdf_url, _('PDF')) }}{%- endif -%}
{%- if result.html_url -%}{{ result_link(result.html_url, _('HTML')) }}{%- endif -%}
{%- if result.doi %}{{ result_link('https://www.altmetric.com/details/doi/' + result.doi, 'Altmetric') }}{% endif -%}
</p>
{{- result_sub_footer(result, proxify) -}}
{{- result_footer(result) }}

View file

@ -33,10 +33,7 @@
<td class="engine-name"><a href="{{ url_for('stats', engine=engine_stat.name|e) }}">{{ engine_stat.name }}</a></td>
<td class="engine-score">
{% if engine_stat.score %}
<span aria-labelledby="{{engine_stat.name}}_score" >{{ engine_stat.score|round(1) }}</span>
<div class="engine-tooltip" role="tooltip" id="{{engine_stat.name}}_score">{{- "" -}}
<p>{{ _('Scores per result') }}: {{ engine_stat.score_per_result | round(3) }}</p>
</div>
<span>{{ engine_stat.score_per_result|round(1) }}</span>
{% endif %}
</td>
<td class="engine-result-count">

View file

@ -1,4 +1,4 @@
# Translations template for PROJECT.
# Afrikaans translations for PROJECT.
# Copyright (C) 2022 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
@ -8,17 +8,16 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-08-12 07:18+0000\n"
"Last-Translator: Edrean Ernst <edrean@allesbeste.com>\n"
"Language-Team: Afrikaans <https://weblate.bubu1.eu/projects/searxng/searxng/"
"af/>\n"
"POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-08-19 07:18+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: af\n"
"Language-Team: Afrikaans "
"<https://weblate.bubu1.eu/projects/searxng/searxng/af/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -126,6 +125,11 @@ msgstr "programmatuur wiki's"
msgid "web"
msgstr "web"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO']
#: searx/searxng.msg
msgid "auto"
@ -141,91 +145,91 @@ msgstr "lig"
msgid "dark"
msgstr "donker"
#: searx/webapp.py:165
#: searx/webapp.py:164
msgid "timeout"
msgstr ""
msgstr "tydsverloop"
#: searx/webapp.py:166
#: searx/webapp.py:165
msgid "parsing error"
msgstr "ontledingsfout"
#: searx/webapp.py:167
#: searx/webapp.py:166
msgid "HTTP protocol error"
msgstr "HTTP protokol fout"
#: searx/webapp.py:168
#: searx/webapp.py:167
msgid "network error"
msgstr "netwerk fout"
#: searx/webapp.py:170
#: searx/webapp.py:169
msgid "unexpected crash"
msgstr "onverwagse breek"
#: searx/webapp.py:177
#: searx/webapp.py:176
msgid "HTTP error"
msgstr "HTTP fout"
#: searx/webapp.py:178
#: searx/webapp.py:177
msgid "HTTP connection error"
msgstr "HTTP koppelingsfout"
#: searx/webapp.py:184
#: searx/webapp.py:183
msgid "proxy error"
msgstr "proksie fout"
#: searx/webapp.py:185
#: searx/webapp.py:184
msgid "CAPTCHA"
msgstr "CAPTCHA"
#: searx/webapp.py:186
#: searx/webapp.py:185
msgid "too many requests"
msgstr "te veel versoeke"
#: searx/webapp.py:187
#: searx/webapp.py:186
msgid "access denied"
msgstr "toegang geweier"
#: searx/webapp.py:188
#: searx/webapp.py:187
msgid "server API error"
msgstr "bediener API fout"
#: searx/webapp.py:363
#: searx/webapp.py:362
msgid "No item found"
msgstr "Geen item gevind"
#: searx/engines/qwant.py:212
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365
#: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source"
msgstr "Bron"
#: searx/webapp.py:367
#: searx/webapp.py:366
msgid "Error loading the next page"
msgstr "Fout met die laai van die volgende bladsy"
#: searx/webapp.py:516 searx/webapp.py:960
#: searx/webapp.py:518 searx/webapp.py:950
msgid "Invalid settings, please edit your preferences"
msgstr "Ongeldige opstellings, redigeer asb jou voorkeure"
#: searx/webapp.py:532
#: searx/webapp.py:534
msgid "Invalid settings"
msgstr "Ongeldige opstellings"
#: searx/webapp.py:609 searx/webapp.py:685
#: searx/webapp.py:611 searx/webapp.py:687
msgid "search error"
msgstr "soekfout"
#: searx/webapp.py:731
#: searx/webapp.py:849
msgid "Suspended"
msgstr "Opgehef"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago"
msgstr "{minutes} minute terug"
#: searx/webapp.py:733
#: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} ure, {minutes} minute terug"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "Opgehef"
#: searx/answerers/random/answerer.py:67
msgid "Random value generator"
msgstr "Ewekansige getal genereerder"
@ -254,23 +258,25 @@ msgstr "{title} (VEROUDERD)"
msgid "This entry has been superseded by"
msgstr "Hierdie inskrywing was vervang deur"
#: searx/engines/pubmed.py:78
msgid "No abstract is available for this publication."
msgstr "Geen uittreksel is beskikbaar vir hierdie publikasie nie."
#: searx/engines/qwant.py:214
#: searx/engines/qwant.py:219
msgid "Channel"
msgstr "Kanaal"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
"Kon nie daardie prent url lees nie. Dit mag weens 'n lêer formaat wees wat "
"nie ondersteun is nie. TinEye ondersteun slegs prente wat JPEG, PNG, GIF, "
"BMP, TIFF of WebP is."
"Kon nie daardie prent url lees nie. Dit mag weens 'n lêer formaat wees "
"wat nie ondersteun is nie. TinEye ondersteun slegs prente wat JPEG, PNG, "
"GIF, BMP, TIFF of WebP is."
#: searx/engines/tineye.py:46
msgid ""
@ -278,12 +284,29 @@ msgid ""
" visual detail to successfully identify matches."
msgstr ""
"Hierdie prent is te eenvoudig om ooreenkomste te vind. TinEye benodig 'n "
"basiese vlak van visuele detail om suksesvol ooreenkomste te identifiseer."
"basiese vlak van visuele detail om suksesvol ooreenkomste te "
"identifiseer."
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr "Die prent kon nie afgelaai word nie."
#: searx/engines/wttr.py:101
msgid "Morning"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Noon"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Evening"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Night"
msgstr ""
#: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests."
msgstr ""
@ -321,20 +344,20 @@ msgid ""
"Perform search immediately if a category selected. Disable to select "
"multiple categories. (JavaScript required)"
msgstr ""
"Doen soektog onmiddelik indien 'n kategorie geselekteer is. Deaktiveer om "
"veelvoudige kategoriee te selekteer. (JavaScript benodig)"
"Doen soektog onmiddelik indien 'n kategorie geselekteer is. Deaktiveer om"
" veelvoudige kategoriee te selekteer. (JavaScript benodig)"
#: searx/plugins/self_info.py:20
msgid "Self Informations"
msgstr "Eie informasie"
msgid "Self Information"
msgstr ""
#: searx/plugins/self_info.py:21
msgid ""
"Displays your IP if the query is \"ip\" and your user agent if the query "
"contains \"user agent\"."
msgstr ""
"Vertoon jou IP indien die navraag \"ip\" is en jou gebruiker agent indien "
"die navraag \"user agent\" bevat."
"Vertoon jou IP indien die navraag \"ip\" is en jou gebruiker agent indien"
" die navraag \"user agent\" bevat."
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
@ -354,8 +377,8 @@ msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
"Die TOR uitgang nodus lys (https://check.torproject.org/exit-addresses) is "
"nie bereikbaar nie."
"Die TOR uitgang nodus lys (https://check.torproject.org/exit-addresses) "
"is nie bereikbaar nie."
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
@ -414,7 +437,7 @@ msgid "Powered by"
msgstr "Aangedryf deur"
#: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine"
msgid "a privacy-respecting, open metasearch engine"
msgstr ""
#: searx/templates/simple/base.html:65
@ -452,6 +475,7 @@ msgstr "Lengte"
#: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author"
msgstr "Outeur"
@ -495,17 +519,17 @@ msgid "View error logs and submit a bug report"
msgstr ""
#: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67
#: searx/templates/simple/stats.html:64
msgid "Median"
msgstr "Mediaan"
#: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73
#: searx/templates/simple/stats.html:70
msgid "P80"
msgstr "P80"
#: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79
#: searx/templates/simple/stats.html:76
msgid "P95"
msgstr "P95"
@ -656,8 +680,8 @@ msgstr "Oneindige blaai"
#: searx/templates/simple/preferences.html:248
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr ""
"Laai die volgende bladsy outomaties wanneer blaai na die onderkant van die "
"huidige bladsy"
"Laai die volgende bladsy outomaties wanneer blaai na die onderkant van "
"die huidige bladsy"
#: searx/templates/simple/preferences.html:254
msgid "Privacy"
@ -669,13 +693,10 @@ msgstr "HTTP Metode"
#: searx/templates/simple/preferences.html:264
msgid ""
"Change how forms are submited, <a "
"Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
msgstr ""
"Verander hoe vorms ingedien word, <a href=\"http://en.wikipedia.org/wiki/"
"Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\"> leer meer "
"oor versoek metodes</a>"
#: searx/templates/simple/preferences.html:269
msgid "Image proxy"
@ -704,8 +725,8 @@ msgid ""
"When enabled, the result page's title contains your query. Your browser "
"can record this title"
msgstr ""
"Wanneer geaktiveer sal die resultaat se bladsy titel jou navraag bevat. Jou "
"blaaier kan hierdie titel opneem"
"Wanneer geaktiveer sal die resultaat se bladsy titel jou navraag bevat. "
"Jou blaaier kan hierdie titel opneem"
#: searx/templates/simple/preferences.html:294
msgid "Engines"
@ -928,67 +949,63 @@ msgstr ""
msgid "Result count"
msgstr ""
#: searx/templates/simple/stats.html:38
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
#: searx/templates/simple/stats.html:59
msgid "Total"
msgstr ""
#: searx/templates/simple/stats.html:63
#: searx/templates/simple/stats.html:60
msgid "HTTP"
msgstr ""
#: searx/templates/simple/stats.html:64
#: searx/templates/simple/stats.html:61
msgid "Processing"
msgstr ""
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Warnings"
msgstr ""
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Errors and exceptions"
msgstr ""
#: searx/templates/simple/stats.html:108
#: searx/templates/simple/stats.html:105
msgid "Exception"
msgstr ""
#: searx/templates/simple/stats.html:110
#: searx/templates/simple/stats.html:107
msgid "Message"
msgstr ""
#: searx/templates/simple/stats.html:112
#: searx/templates/simple/stats.html:109
msgid "Percentage"
msgstr ""
#: searx/templates/simple/stats.html:114
#: searx/templates/simple/stats.html:111
msgid "Parameter"
msgstr ""
#: searx/templates/simple/stats.html:122
#: searx/templates/simple/stats.html:119
msgid "Filename"
msgstr ""
#: searx/templates/simple/stats.html:123
#: searx/templates/simple/stats.html:120
msgid "Function"
msgstr ""
#: searx/templates/simple/stats.html:124
#: searx/templates/simple/stats.html:121
msgid "Code"
msgstr ""
#: searx/templates/simple/stats.html:131
#: searx/templates/simple/stats.html:128
msgid "Checker"
msgstr ""
#: searx/templates/simple/stats.html:134
#: searx/templates/simple/stats.html:131
msgid "Failed test"
msgstr ""
#: searx/templates/simple/stats.html:135
#: searx/templates/simple/stats.html:132
msgid "Comment(s)"
msgstr ""
@ -1075,6 +1092,50 @@ msgstr ""
msgid "hide map"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:5
msgid "Published date"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:9
msgid "Journal"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:22
msgid "Editor"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:23
msgid "Publisher"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:24
msgid "Type"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:25
msgid "Tags"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:26
msgid "DOI"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:27
msgid "ISSN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:28
msgid "ISBN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:33
msgid "PDF"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:34
msgid "HTML"
msgstr ""
#: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link"
msgstr ""
@ -1126,3 +1187,27 @@ msgstr ""
#: searx/templates/simple/result_templates/videos.html:6
msgid "hide video"
msgstr ""
#~ msgid "Scores per result"
#~ msgstr ""
#~ msgid "a privacy-respecting, hackable metasearch engine"
#~ msgstr ""
#~ msgid "No abstract is available for this publication."
#~ msgstr "Geen uittreksel is beskikbaar vir hierdie publikasie nie."
#~ msgid "Self Informations"
#~ msgstr "Eie informasie"
#~ msgid ""
#~ "Change how forms are submited, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">learn more about request "
#~ "methods</a>"
#~ msgstr ""
#~ "Verander hoe vorms ingedien word, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\"> leer meer oor versoek"
#~ " metodes</a>"

View file

@ -8,21 +8,23 @@
# d506c013dc1b502e7a53f91ebcbf8f29_985b4b3, 2017-2018
# Markus Heiser <markus.heiser@darmarit.de>, 2022.
# ken kailer <kenkailer@yahoo.com>, 2022.
# George Kashkosh <kash.george@gmail.com>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-19 05:45+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-10-07 07:30+0000\n"
"Last-Translator: George Kashkosh <kash.george@gmail.com>\n"
"Language-Team: Arabic <https://weblate.bubu1.eu/projects/searxng/searxng/ar/>"
"\n"
"Language: ar\n"
"Language-Team: Arabic "
"<https://weblate.bubu1.eu/projects/searxng/searxng/ar/>\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : "
"n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 4.14.1\n"
"Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -130,6 +132,11 @@ msgstr "الموسوعات التشاركية للبرنامج"
msgid "web"
msgstr "الشبكة العالمية"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr "المنشورات العلمية"
#. STYLE_NAMES['AUTO']
#: searx/searxng.msg
msgid "auto"
@ -145,91 +152,91 @@ msgstr "فاتح"
msgid "dark"
msgstr "مظلم"
#: searx/webapp.py:165
#: searx/webapp.py:164
msgid "timeout"
msgstr "نفذ الوقت"
#: searx/webapp.py:166
#: searx/webapp.py:165
msgid "parsing error"
msgstr "خطأ تحليل"
#: searx/webapp.py:167
#: searx/webapp.py:166
msgid "HTTP protocol error"
msgstr "خطأ في بروتوكول HTTP"
#: searx/webapp.py:168
#: searx/webapp.py:167
msgid "network error"
msgstr "خطأ في الشبكة"
#: searx/webapp.py:170
#: searx/webapp.py:169
msgid "unexpected crash"
msgstr "تعطل غير متوقع"
#: searx/webapp.py:177
#: searx/webapp.py:176
msgid "HTTP error"
msgstr "خطأ HTTP"
#: searx/webapp.py:178
#: searx/webapp.py:177
msgid "HTTP connection error"
msgstr "خطأ في اتصال HTTP"
#: searx/webapp.py:184
#: searx/webapp.py:183
msgid "proxy error"
msgstr "خطأ في وكيل البروكسي"
#: searx/webapp.py:185
#: searx/webapp.py:184
msgid "CAPTCHA"
msgstr "أسئلة التحقق"
#: searx/webapp.py:186
#: searx/webapp.py:185
msgid "too many requests"
msgstr "الكثير من الطلبات"
#: searx/webapp.py:187
#: searx/webapp.py:186
msgid "access denied"
msgstr "الدخول مرفوض"
#: searx/webapp.py:188
#: searx/webapp.py:187
msgid "server API error"
msgstr "خطأ في API الخادم"
#: searx/webapp.py:363
#: searx/webapp.py:362
msgid "No item found"
msgstr "تعذر العثور على عناصر"
#: searx/engines/qwant.py:212
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365
#: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source"
msgstr "المصدر"
#: searx/webapp.py:367
#: searx/webapp.py:366
msgid "Error loading the next page"
msgstr "حدث خلل أثناء تحميل الصفحة التالية"
#: searx/webapp.py:516 searx/webapp.py:960
#: searx/webapp.py:518 searx/webapp.py:950
msgid "Invalid settings, please edit your preferences"
msgstr "إنّ الإعدادات خاطئة، يرجى تعديل خياراتك"
#: searx/webapp.py:532
#: searx/webapp.py:534
msgid "Invalid settings"
msgstr "إعدادات غير صالحة"
#: searx/webapp.py:609 searx/webapp.py:685
#: searx/webapp.py:611 searx/webapp.py:687
msgid "search error"
msgstr "خطأ في البحث"
#: searx/webapp.py:731
#: searx/webapp.py:849
msgid "Suspended"
msgstr "معلق"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago"
msgstr "قبل دقائق"
#: searx/webapp.py:733
#: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "قبل {hours} ساعات، {minutes} دقائق"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "معلق"
#: searx/answerers/random/answerer.py:67
msgid "Random value generator"
msgstr "مولّد قيمة عشوائية"
@ -258,34 +265,58 @@ msgstr "{title} (قديما)"
msgid "This entry has been superseded by"
msgstr "هذا الإدخال تم استبداله بـ"
#: searx/engines/pubmed.py:78
msgid "No abstract is available for this publication."
msgstr "لا يوجد ملخص لهذا المنشور"
#: searx/engines/qwant.py:214
#: searx/engines/qwant.py:219
msgid "Channel"
msgstr "القناة"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
"{numCitation}استجلاب من العام {firstCitationVelocityYear} إلى "
"{lastCitationVelocityYear}"
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
"تعذر قراءة عنوان url للصورة. قد يكون هذا بسبب تنسيق ملف غير مدعوم. تدعم "
"TinEye فقط الصور بتنسيق JPEG أو PNG أو GIF أو BMP أو TIFF أو WebP."
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
"الصورة أبسط من أن تجد مطابقات. يتطلب TinEye مستوى أساسيًا من التفاصيل "
"المرئية لتحديد التطابقات بنجاح."
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr ""
msgstr "لا يمكن تنزيل الصورة."
#: searx/engines/wttr.py:101
msgid "Morning"
msgstr "صباحا"
#: searx/engines/wttr.py:101
msgid "Noon"
msgstr "ظهيرة"
#: searx/engines/wttr.py:101
msgid "Evening"
msgstr "مساء"
#: searx/engines/wttr.py:101
msgid "Night"
msgstr "ليلا"
#: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests."
msgstr "يحول السلسلة إلى ملخص التجزئة"
msgstr "يحول السلسلة إلى ملخص التجزئة."
#: searx/plugins/hash_plugin.py:52
msgid "hash digest"
@ -324,8 +355,8 @@ msgstr ""
"ضروريه)"
#: searx/plugins/self_info.py:20
msgid "Self Informations"
msgstr "معلومات شخصية"
msgid "Self Information"
msgstr "نشرة المعلومات"
#: searx/plugins/self_info.py:21
msgid ""
@ -333,31 +364,35 @@ msgid ""
"contains \"user agent\"."
msgstr ""
"يعرض IP إذا كان الاستعلام \"ip\" و وكيل المستخدم الخاص بك إذا كان "
"الاستعلام يحتوي على\"user agent\""
"الاستعلام يحتوي على\"user agent\"."
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr ""
msgstr "فحص المكون الإضافي ل Tor"
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
"يتحقق هذا المكون الإضافي مما إذا كان عنوان الطلب هو عقدة خروج TOR ، ويبلغ"
" المستخدم إذا كان كذلك ، مثل check.torproject.org ولكن من searxng."
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
"لا يمكن الوصول إلى قائمة عقدة الخروج TOR (https://check.torproject.org"
"/exit-addresses)."
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
msgstr "انك تستخدم شبكة TOR. ان IP Adress الخاص بك يبدو انه: {ip_address}."
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
msgstr "انك لا تستخدم شبكة TOR. ان IP Adress الخاص بك يبدو انه: {ip_address}."
#: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover"
@ -413,16 +448,16 @@ msgid "Powered by"
msgstr "مدعوم بواسطة"
#: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "محرك بحث يحمي الخصوصية و قابل للتهكير"
msgid "a privacy-respecting, open metasearch engine"
msgstr "الخصوصية ذو الاعتبار, محرك البحث عميق عُموميا"
#: searx/templates/simple/base.html:65
msgid "Source code"
msgstr "الكود المصدري"
msgstr "شيفرة مصدرية"
#: searx/templates/simple/base.html:66
msgid "Issue tracker"
msgstr "متتبع القضايا"
msgstr "تعقب القضايا"
#: searx/templates/simple/base.html:67 searx/templates/simple/stats.html:18
msgid "Engine stats"
@ -431,7 +466,7 @@ msgstr "إحصائيات المحرك"
#: searx/templates/simple/base.html:69
#: searx/templates/simple/messages/no_results.html:15
msgid "Public instances"
msgstr "مثيلات الخوادم العمومية"
msgstr "نماذج الخوادم العمومية"
#: searx/templates/simple/base.html:72
msgid "Privacy policy"
@ -439,11 +474,11 @@ msgstr "سياسة الخصوصية"
#: searx/templates/simple/base.html:75
msgid "Contact instance maintainer"
msgstr "الإتصال بالمشرف على مثيل الخادم"
msgstr "اتصال بالمشرف المخدم النموذجي"
#: searx/templates/simple/categories.html:24
msgid "Click on the magnifier to perform search"
msgstr "انقر على المكبرة للقيام بالبحث"
msgstr "انقر على رمز المكبر للقيام بالبحث"
#: searx/templates/simple/macros.html:36
msgid "Length"
@ -451,6 +486,7 @@ msgstr "الطول"
#: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author"
msgstr "الكاتب"
@ -460,7 +496,7 @@ msgstr "النسخة المخبأة"
#: searx/templates/simple/macros.html:45
msgid "proxied"
msgstr "النفاذ عبر البروكسي"
msgstr "المخدم البروكسي"
#: searx/templates/simple/new_issue.html:64
msgid "Start submiting a new issue on GitHub"
@ -494,17 +530,17 @@ msgid "View error logs and submit a bug report"
msgstr "عرض سجلات الأخطاء وتقديم تقرير خطأ"
#: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67
#: searx/templates/simple/stats.html:64
msgid "Median"
msgstr "وسطي"
#: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73
#: searx/templates/simple/stats.html:70
msgid "P80"
msgstr "صفحة 80"
#: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79
#: searx/templates/simple/stats.html:76
msgid "P95"
msgstr "صفحة 95"
@ -668,13 +704,10 @@ msgstr "أسلوب HTTP"
#: searx/templates/simple/preferences.html:264
msgid ""
"Change how forms are submited, <a "
"Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
msgstr ""
"تغيير طريقة إرسال النماذج ، <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\"> تعرف على المزيد حول طرق الطلب </a>"
#: searx/templates/simple/preferences.html:269
msgid "Image proxy"
@ -719,6 +752,8 @@ msgid ""
"This tab does not show up for search results, but you can search the "
"engines listed here via bangs."
msgstr ""
"لا تظهر علامة التبويب هذه في نتائج البحث ، ولكن يمكنك البحث في المحركات "
"المدرجة هنا عبر bangs."
#: searx/templates/simple/preferences.html:307
#: searx/templates/simple/preferences.html:358
@ -759,7 +794,7 @@ msgstr "إمكانية الإشتغال"
#: searx/templates/simple/preferences.html:353
msgid "Special Queries"
msgstr ""
msgstr "استفسارات خاصة"
#: searx/templates/simple/preferences.html:359
msgid "Keywords"
@ -779,11 +814,11 @@ msgstr "أمثلة"
#: searx/templates/simple/preferences.html:365
msgid "This is the list of SearXNG's instant answering modules."
msgstr ""
msgstr "هذه قائمة وحدات الرد الفوري في SearXNG."
#: searx/templates/simple/preferences.html:376
msgid "This is the list of plugins."
msgstr ""
msgstr "هذه قائمة المكونات الإضافية."
#: searx/templates/simple/preferences.html:393
msgid "Cookies"
@ -794,10 +829,12 @@ msgid ""
"This is the list of cookies and their values SearXNG is storing on your "
"computer."
msgstr ""
"هذه قائمة ملفات تعريف الارتباط وقيمها التي يخزنها SearXNG على جهاز "
"الكمبيوتر الخاص بك."
#: searx/templates/simple/preferences.html:396
msgid "With that list, you can assess SearXNG transparency."
msgstr ""
msgstr "باستخدام هذه القائمة ، يمكنك تقييم شفافية SearXNG."
#: searx/templates/simple/preferences.html:401
msgid "Cookie name"
@ -809,35 +846,43 @@ msgstr "القيمة"
#: searx/templates/simple/preferences.html:414
msgid "Search URL of the currently saved preferences"
msgstr ""
msgstr "ابحث عن عنوان URL للتفضيلات المحفوظة حاليًا"
#: searx/templates/simple/preferences.html:418
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
msgstr ""
"ملاحظة: يمكن أن يؤدي تحديد إعدادات مخصصة في عنوان URL للبحث إلى تقليل "
"الخصوصية عن طريق تسريب البيانات إلى مواقع النتائج التي تم النقر عليها."
#: searx/templates/simple/preferences.html:419
msgid "URL to restore your preferences in another browser"
msgstr ""
msgstr "URL لاستعادة تفضيلاتك في متصفح آخر"
#: searx/templates/simple/preferences.html:423
msgid ""
"Specifying custom settings in the preferences URL can be used to sync "
"preferences across devices."
msgstr ""
"يمكن استخدام تحديد الإعدادات المخصصة في تفضيلات URL لمزامنة التفضيلات عبر"
" الأجهزة."
#: searx/templates/simple/preferences.html:428
msgid ""
"These settings are stored in your cookies, this allows us not to store "
"this data about you."
msgstr ""
"يتم تخزين هذه الإعدادات في ملفات تعريف الارتباط الخاصة بك ، وهذا يسمح لنا"
" بعدم تخزين هذه البيانات عنك."
#: searx/templates/simple/preferences.html:430
msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
"track you."
msgstr ""
"تخدم ملفات تعريف الارتباط هذه راحتك وحدك ، فنحن لا نستخدم ملفات تعريف "
"الارتباط هذه لتتبعك."
#: searx/templates/simple/preferences.html:433
msgid "Save"
@ -913,81 +958,77 @@ msgstr "مسح"
#: searx/templates/simple/search.html:11
#: searx/templates/simple/simple_search.html:7
msgid "search"
msgstr "بحت"
msgstr "بحث"
#: searx/templates/simple/stats.html:21
msgid "There is currently no data available. "
msgstr "لم يتم العثور على أية بيانات بعدُ."
msgstr "لم يتم العثور على أية بيانات بعد."
#: searx/templates/simple/stats.html:26
msgid "Scores"
msgstr ""
msgstr "نتائج"
#: searx/templates/simple/stats.html:27
msgid "Result count"
msgstr "نتيجة العد"
#: searx/templates/simple/stats.html:38
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
#: searx/templates/simple/stats.html:59
msgid "Total"
msgstr "إجمالي"
#: searx/templates/simple/stats.html:63
#: searx/templates/simple/stats.html:60
msgid "HTTP"
msgstr ""
msgstr "HTTP"
#: searx/templates/simple/stats.html:64
#: searx/templates/simple/stats.html:61
msgid "Processing"
msgstr ""
msgstr "يتم المعالجة"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Warnings"
msgstr "تحذيرات"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Errors and exceptions"
msgstr ""
msgstr "الأخطاء والاستثناءات"
#: searx/templates/simple/stats.html:108
#: searx/templates/simple/stats.html:105
msgid "Exception"
msgstr "استثناء"
#: searx/templates/simple/stats.html:110
#: searx/templates/simple/stats.html:107
msgid "Message"
msgstr "الرسالة"
#: searx/templates/simple/stats.html:112
#: searx/templates/simple/stats.html:109
msgid "Percentage"
msgstr "نسبة"
#: searx/templates/simple/stats.html:114
#: searx/templates/simple/stats.html:111
msgid "Parameter"
msgstr ""
msgstr "معامل"
#: searx/templates/simple/stats.html:122
#: searx/templates/simple/stats.html:119
msgid "Filename"
msgstr "اسم الملف"
#: searx/templates/simple/stats.html:123
#: searx/templates/simple/stats.html:120
msgid "Function"
msgstr ""
msgstr "وظيفة"
#: searx/templates/simple/stats.html:124
#: searx/templates/simple/stats.html:121
msgid "Code"
msgstr "كود"
msgstr "شفرة"
#: searx/templates/simple/stats.html:131
#: searx/templates/simple/stats.html:128
msgid "Checker"
msgstr "مدقّق"
#: searx/templates/simple/stats.html:134
#: searx/templates/simple/stats.html:131
msgid "Failed test"
msgstr "اختبار فاشل"
#: searx/templates/simple/stats.html:135
#: searx/templates/simple/stats.html:132
msgid "Comment(s)"
msgstr "تعليق/تعليقات"
@ -997,7 +1038,7 @@ msgstr "في أي وقت"
#: searx/templates/simple/filters/time_range.html:6
msgid "Last day"
msgstr "يوم أمس"
msgstr "آخر يوم"
#: searx/templates/simple/filters/time_range.html:9
msgid "Last week"
@ -1052,7 +1093,7 @@ msgstr "إخفاء الوسائط"
#: searx/templates/simple/result_templates/default.html:14
#: searx/templates/simple/result_templates/videos.html:14
msgid "This site did not provide any description."
msgstr "هذا الموقع لا يتوفر على أي وصف."
msgstr "هذا الموقع لم يقدم أي وصف."
#: searx/templates/simple/result_templates/images.html:19
msgid "Format"
@ -1078,6 +1119,50 @@ msgstr "عرض الخريطة"
msgid "hide map"
msgstr "إخفاء الخريطة"
#: searx/templates/simple/result_templates/paper.html:5
msgid "Published date"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:9
msgid "Journal"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:22
msgid "Editor"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:23
msgid "Publisher"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:24
msgid "Type"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:25
msgid "Tags"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:26
msgid "DOI"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:27
msgid "ISSN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:28
msgid "ISBN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:33
msgid "PDF"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:34
msgid "HTML"
msgstr ""
#: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link"
msgstr "رابط ماغنت"
@ -1372,3 +1457,25 @@ msgstr "إخفاء الفيديو"
#~ msgid "preferences"
#~ msgstr "التفضيلات"
#~ msgid "Scores per result"
#~ msgstr "درجات لكل نتيجة"
#~ msgid "a privacy-respecting, hackable metasearch engine"
#~ msgstr "محرك بحث يحمي الخصوصية و قابل للتهكير"
#~ msgid "No abstract is available for this publication."
#~ msgstr "لا يوجد ملخص متاح لهذا المنشور."
#~ msgid "Self Informations"
#~ msgstr "معلومات شخصية"
#~ msgid ""
#~ "Change how forms are submited, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">learn more about request "
#~ "methods</a>"
#~ msgstr ""
#~ "تغيير طريقة إرسال النماذج ، <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\"> تعرف على المزيد حول "
#~ "طرق الطلب </a>"

View file

@ -6,12 +6,13 @@
# ubone <van_ds_ff@mail.bg>, 2015
# ubone <van_ds_ff@mail.bg>, 2016-2017
# Markus Heiser <markus.heiser@darmarit.de>, 2022.
# NxOne14 <kiril2315@gmail.com>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-06 00:21+0000\n"
"POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-09-11 22:50+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: bg\n"
"Language-Team: Bulgarian "
@ -127,6 +128,11 @@ msgstr "софтуерни уикита"
msgid "web"
msgstr "мрежа"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO']
#: searx/searxng.msg
msgid "auto"
@ -142,91 +148,91 @@ msgstr "светъл"
msgid "dark"
msgstr "тъмен"
#: searx/webapp.py:165
#: searx/webapp.py:164
msgid "timeout"
msgstr "изчакване"
#: searx/webapp.py:166
#: searx/webapp.py:165
msgid "parsing error"
msgstr "грешка при анализа"
#: searx/webapp.py:167
#: searx/webapp.py:166
msgid "HTTP protocol error"
msgstr "Грешка в протокола HTTP"
#: searx/webapp.py:168
#: searx/webapp.py:167
msgid "network error"
msgstr "мрежова грешка"
#: searx/webapp.py:170
#: searx/webapp.py:169
msgid "unexpected crash"
msgstr "неочакван срив"
#: searx/webapp.py:177
#: searx/webapp.py:176
msgid "HTTP error"
msgstr "HTTP грешка"
#: searx/webapp.py:178
#: searx/webapp.py:177
msgid "HTTP connection error"
msgstr "HTTP грешка във връзката"
#: searx/webapp.py:184
#: searx/webapp.py:183
msgid "proxy error"
msgstr "прокси грешка"
#: searx/webapp.py:185
#: searx/webapp.py:184
msgid "CAPTCHA"
msgstr "Кепча"
#: searx/webapp.py:186
#: searx/webapp.py:185
msgid "too many requests"
msgstr "твърде много искания"
#: searx/webapp.py:187
#: searx/webapp.py:186
msgid "access denied"
msgstr "отказан достъп"
#: searx/webapp.py:188
#: searx/webapp.py:187
msgid "server API error"
msgstr "грешка в API на сървъра"
#: searx/webapp.py:363
#: searx/webapp.py:362
msgid "No item found"
msgstr "Не е намерен артикул"
#: searx/engines/qwant.py:212
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365
#: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source"
msgstr "Източник"
#: searx/webapp.py:367
#: searx/webapp.py:366
msgid "Error loading the next page"
msgstr "Грешка при зареждането на следващата страница"
#: searx/webapp.py:516 searx/webapp.py:960
#: searx/webapp.py:518 searx/webapp.py:950
msgid "Invalid settings, please edit your preferences"
msgstr "Неправилни настройки, моля проверете предпочитанията си"
#: searx/webapp.py:532
#: searx/webapp.py:534
msgid "Invalid settings"
msgstr "невалидни настройки"
#: searx/webapp.py:609 searx/webapp.py:685
#: searx/webapp.py:611 searx/webapp.py:687
msgid "search error"
msgstr "грешка при търсенето"
#: searx/webapp.py:731
#: searx/webapp.py:849
msgid "Suspended"
msgstr "преустановен"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago"
msgstr "преди {minutes} минута(минути)"
#: searx/webapp.py:733
#: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "преди {hours} час(ове), {minutes} минута(минути)"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "преустановен"
#: searx/answerers/random/answerer.py:67
msgid "Random value generator"
msgstr "Генератор на произволни стойности"
@ -241,7 +247,7 @@ msgstr "Функции за статистика"
#: searx/answerers/statistics/answerer.py:48
msgid "Compute {functions} of the arguments"
msgstr "Изчислете {функции} на аргументите"
msgstr "Изчислете {functions} на аргументите"
#: searx/engines/openstreetmap.py:160
msgid "Get directions"
@ -255,29 +261,53 @@ msgstr "{title} (ОСТАРЯЛО)"
msgid "This entry has been superseded by"
msgstr "Този запис е заменен от"
#: searx/engines/pubmed.py:78
msgid "No abstract is available for this publication."
msgstr "Няма резюме за тази публикация."
#: searx/engines/qwant.py:214
#: searx/engines/qwant.py:219
msgid "Channel"
msgstr "Канал"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
"URL адресът на изображението не можа да бъде прочетен. Това може да се "
"дължи на неподдържан файлов формат. TinEye поддържа само изображения, "
"които са JPEG, PNG, GIF, BMP, TIFF или WebP."
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
"Изображението е твърде просто за намиране на съвпадения. TinEye изисква "
"основно ниво на визуална детайлност за успешно идентифициране на "
"съвпадения."
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr "Снимката не може да бъде смъкната."
#: searx/engines/wttr.py:101
msgid "Morning"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Noon"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Evening"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Night"
msgstr ""
#: searx/plugins/hash_plugin.py:24
@ -286,7 +316,7 @@ msgstr "Преобразува низове в различни хаш-извл
#: searx/plugins/hash_plugin.py:52
msgid "hash digest"
msgstr ""
msgstr "хеш извлечение"
#: searx/plugins/hostname_replace.py:9
msgid "Hostname replace"
@ -323,7 +353,7 @@ msgstr ""
"категории. (Необходим е JavaScript)"
#: searx/plugins/self_info.py:20
msgid "Self Informations"
msgid "Self Information"
msgstr ""
#: searx/plugins/self_info.py:21
@ -334,27 +364,31 @@ msgstr "Показва IP-то ви и др. инфо, ако търсенето
#: searx/plugins/tor_check.py:25
msgid "Tor check plugin"
msgstr ""
msgstr "Проверка на Tor приставката"
#: searx/plugins/tor_check.py:28
msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
"Тази добавка проверява дали адресът на заявката е изходен възел на TOR и "
"осведомява потребителя ако е - като check.torproject.org, но от searxng."
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
"Листа с изходните възли на TOR (https://check.torproject.org/exit-"
"addresses) е недостижим."
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
msgstr "Използвате TOR. Вашият IP адрес изглежда е: {ip_address}."
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
msgstr "Не използвате TOR. Вашият IP адрес изглежда е: {ip_address}."
#: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover"
@ -366,7 +400,7 @@ msgstr "Премахни следящите аргументи от върнат
#: searx/plugins/vim_hotkeys.py:3
msgid "Vim-like hotkeys"
msgstr "\"Vim\" наподобяващи клавишни комбинации"
msgstr "Vim наподобяващи клавишни комбинации"
#: searx/plugins/vim_hotkeys.py:4
msgid ""
@ -392,7 +426,7 @@ msgstr "търси страница"
#: searx/templates/simple/base.html:46
msgid "About"
msgstr "Относно за"
msgstr "Относно"
#: searx/templates/simple/base.html:50
msgid "Donate"
@ -408,8 +442,8 @@ msgid "Powered by"
msgstr "С подкрепата на"
#: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "за спазване на поверителността, хакерска метатърсачка"
msgid "a privacy-respecting, open metasearch engine"
msgstr ""
#: searx/templates/simple/base.html:65
msgid "Source code"
@ -446,6 +480,7 @@ msgstr "Дължина"
#: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author"
msgstr "Автор"
@ -459,19 +494,21 @@ msgstr "прекарана"
#: searx/templates/simple/new_issue.html:64
msgid "Start submiting a new issue on GitHub"
msgstr ""
msgstr "Предявете нов проблем в GitHub"
#: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub"
msgstr ""
msgstr "Моля проверете за съществуващи бъгове на търсачката в GitHub"
#: searx/templates/simple/new_issue.html:69
msgid "I confirm there is no existing bug about the issue I encounter"
msgstr ""
msgstr "Потвърждавам, че няма съществуващи бъогве за проблема, който срещнах"
#: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report"
msgstr ""
"Ако това е публична инстанция, моля предоставете URL адресът в отзива за "
"бъга"
#: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information"
@ -491,17 +528,17 @@ msgid "View error logs and submit a bug report"
msgstr "Виж грешката и я докладвай"
#: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67
#: searx/templates/simple/stats.html:64
msgid "Median"
msgstr "Медиaна"
#: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73
#: searx/templates/simple/stats.html:70
msgid "P80"
msgstr ""
msgstr "P80"
#: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79
#: searx/templates/simple/stats.html:76
msgid "P95"
msgstr ""
@ -573,7 +610,7 @@ msgstr "Филтрирай съдържание"
#: searx/templates/simple/preferences.html:157
msgid "Open Access DOI resolver"
msgstr ""
msgstr "Дигитален идентификатор на обекти с отворен достъп"
#: searx/templates/simple/preferences.html:167
msgid ""
@ -665,7 +702,7 @@ msgstr "HTTP Метод"
#: searx/templates/simple/preferences.html:264
msgid ""
"Change how forms are submited, <a "
"Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
msgstr ""
@ -713,6 +750,8 @@ msgid ""
"This tab does not show up for search results, but you can search the "
"engines listed here via bangs."
msgstr ""
"Този раздел не се показва за резултатите от търсенето, но можете да "
"прегледате търсачките, изброени тук."
#: searx/templates/simple/preferences.html:307
#: searx/templates/simple/preferences.html:358
@ -932,67 +971,63 @@ msgstr "Резултати"
msgid "Result count"
msgstr "Брой резултати"
#: searx/templates/simple/stats.html:38
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
#: searx/templates/simple/stats.html:59
msgid "Total"
msgstr "Общо"
#: searx/templates/simple/stats.html:63
#: searx/templates/simple/stats.html:60
msgid "HTTP"
msgstr "HTTP"
#: searx/templates/simple/stats.html:64
#: searx/templates/simple/stats.html:61
msgid "Processing"
msgstr "Обработка"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Warnings"
msgstr "Предупреждения"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Errors and exceptions"
msgstr ""
msgstr "Грешки и изключения"
#: searx/templates/simple/stats.html:108
#: searx/templates/simple/stats.html:105
msgid "Exception"
msgstr ""
msgstr "Изключение"
#: searx/templates/simple/stats.html:110
#: searx/templates/simple/stats.html:107
msgid "Message"
msgstr "Съобщение"
#: searx/templates/simple/stats.html:112
#: searx/templates/simple/stats.html:109
msgid "Percentage"
msgstr "Процент"
#: searx/templates/simple/stats.html:114
#: searx/templates/simple/stats.html:111
msgid "Parameter"
msgstr "Параметър"
#: searx/templates/simple/stats.html:122
#: searx/templates/simple/stats.html:119
msgid "Filename"
msgstr "Име на файла"
#: searx/templates/simple/stats.html:123
#: searx/templates/simple/stats.html:120
msgid "Function"
msgstr "Функция"
#: searx/templates/simple/stats.html:124
#: searx/templates/simple/stats.html:121
msgid "Code"
msgstr "Код"
#: searx/templates/simple/stats.html:131
#: searx/templates/simple/stats.html:128
msgid "Checker"
msgstr "Проверител"
#: searx/templates/simple/stats.html:134
#: searx/templates/simple/stats.html:131
msgid "Failed test"
msgstr "Неуспешен тест"
#: searx/templates/simple/stats.html:135
#: searx/templates/simple/stats.html:132
msgid "Comment(s)"
msgstr "Коментар (и)"
@ -1081,6 +1116,50 @@ msgstr "покажи карта"
msgid "hide map"
msgstr "скрий картата"
#: searx/templates/simple/result_templates/paper.html:5
msgid "Published date"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:9
msgid "Journal"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:22
msgid "Editor"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:23
msgid "Publisher"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:24
msgid "Type"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:25
msgid "Tags"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:26
msgid "DOI"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:27
msgid "ISSN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:28
msgid "ISBN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:33
msgid "PDF"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:34
msgid "HTML"
msgstr ""
#: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link"
msgstr "магнитна връзка"
@ -1375,3 +1454,27 @@ msgstr "скрий видеото"
#~ msgid "preferences"
#~ msgstr "предпочитания"
#~ msgid "Scores per result"
#~ msgstr ""
#~ msgid "a privacy-respecting, hackable metasearch engine"
#~ msgstr "за спазване на поверителността, хакерска метатърсачка"
#~ msgid "No abstract is available for this publication."
#~ msgstr "Няма резюме за тази публикация."
#~ msgid "Self Informations"
#~ msgstr ""
#~ msgid ""
#~ "Change how forms are submited, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">learn more about request "
#~ "methods</a>"
#~ msgstr ""
#~ "Променете начина, по който се изпращат"
#~ " формите, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">learn more about request "
#~ "methods</a>"

View file

@ -8,17 +8,16 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-08-05 07:18+0000\n"
"POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-09-21 15:58+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Bengali <https://weblate.bubu1.eu/projects/searxng/searxng/bn/"
">\n"
"Language: bn\n"
"Language-Team: Bengali "
"<https://weblate.bubu1.eu/projects/searxng/searxng/bn/>\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -126,6 +125,11 @@ msgstr "সফটওয়্যার উইকি"
msgid "web"
msgstr "ওয়েব"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO']
#: searx/searxng.msg
msgid "auto"
@ -141,91 +145,91 @@ msgstr "সাদা"
msgid "dark"
msgstr "কালো"
#: searx/webapp.py:165
#: searx/webapp.py:164
msgid "timeout"
msgstr "সময় শেষ"
#: searx/webapp.py:166
#: searx/webapp.py:165
msgid "parsing error"
msgstr "পার্স ত্রুটি"
#: searx/webapp.py:167
#: searx/webapp.py:166
msgid "HTTP protocol error"
msgstr "HTTP প্রোটোকল ত্রুটি"
#: searx/webapp.py:168
#: searx/webapp.py:167
msgid "network error"
msgstr "নেটওয়ার্ক ত্রুটি"
#: searx/webapp.py:170
#: searx/webapp.py:169
msgid "unexpected crash"
msgstr "অপ্রত্যাশিত ক্র্যাশ"
#: searx/webapp.py:177
#: searx/webapp.py:176
msgid "HTTP error"
msgstr "এইচটিটিপি ত্রুটি"
#: searx/webapp.py:178
#: searx/webapp.py:177
msgid "HTTP connection error"
msgstr "এইচটিটিপি সংযোগ ত্রুটি"
#: searx/webapp.py:184
#: searx/webapp.py:183
msgid "proxy error"
msgstr "প্রক্সি ত্রুটি"
#: searx/webapp.py:185
#: searx/webapp.py:184
msgid "CAPTCHA"
msgstr "ক্যাপচা"
#: searx/webapp.py:186
#: searx/webapp.py:185
msgid "too many requests"
msgstr "অনেক বেশি অনুরোধ"
#: searx/webapp.py:187
#: searx/webapp.py:186
msgid "access denied"
msgstr "অ্যাক্সেস অমান্য"
#: searx/webapp.py:188
#: searx/webapp.py:187
msgid "server API error"
msgstr "সার্ভার এপিআই ত্রুটি"
#: searx/webapp.py:363
#: searx/webapp.py:362
msgid "No item found"
msgstr "কোন আইটেম পাওয়া যায়নি"
#: searx/engines/qwant.py:212
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365
#: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source"
msgstr "উৎস"
#: searx/webapp.py:367
#: searx/webapp.py:366
msgid "Error loading the next page"
msgstr "পরবর্তী পৃষ্ঠাটি লোড করার সময় ত্রুটি৷"
msgstr "পরবর্তী পৃষ্ঠাটি লোড করার সময় ত্রুটি৷."
#: searx/webapp.py:516 searx/webapp.py:960
#: searx/webapp.py:518 searx/webapp.py:950
msgid "Invalid settings, please edit your preferences"
msgstr "অবৈধ সেটিংস, অনুগ্রহ করে আপনার পছন্দগুলি সম্পাদনা করুন৷"
#: searx/webapp.py:532
#: searx/webapp.py:534
msgid "Invalid settings"
msgstr "অবৈধ সেটিংস"
#: searx/webapp.py:609 searx/webapp.py:685
#: searx/webapp.py:611 searx/webapp.py:687
msgid "search error"
msgstr "অনুসন্ধানের ত্রুটি"
#: searx/webapp.py:731
#: searx/webapp.py:849
msgid "Suspended"
msgstr "স্থগিত"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago"
msgstr "{minutes} মিনিট আগে"
#: searx/webapp.py:733
#: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} ঘণ্টা, {minutes} মিনিট আগে"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "স্থগিত"
#: searx/answerers/random/answerer.py:67
msgid "Random value generator"
msgstr "এলোমেলো মান জেনারেটর"
@ -254,35 +258,54 @@ msgstr "{title} (অচল)"
msgid "This entry has been superseded by"
msgstr "এই এন্ট্রিটি দ্বারা বাতিল করা হয়েছে৷"
#: searx/engines/pubmed.py:78
msgid "No abstract is available for this publication."
msgstr "এই প্রকাশনার জন্য কোন বিমূর্ত উপলব্ধ নেই."
#: searx/engines/qwant.py:214
#: searx/engines/qwant.py:219
msgid "Channel"
msgstr "চ্যানেল"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
"ছবির url টি পড়তে পারা যাচ্ছে না । এটি হতে পারে ফাইল ফরম্যাট এর পড়তে না পারা"
"র জন্যে। TinEye কেবল JPEG, PNG, GIF, BMP, TIFF আর WebP ফরম্যাট কে পড়তে পারে।"
"ছবির url টি পড়তে পারা যাচ্ছে না । এটি হতে পারে ফাইল ফরম্যাট এর পড়তে না "
"পারার জন্যে। TinEye কেবল JPEG, PNG, GIF, BMP, TIFF আর WebP ফরম্যাট কে "
"পড়তে পারে।"
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
"এই ছবিটি খুবই সাধারণ হওয়ায় কোন মিল পাওয়া যাচ্ছে না। TinEye এর একটু চাক্ষু"
"ষ বিস্তর প্রয়োজন সফল ভাবে মিল পাওয়ার জন্যে ।"
"এই ছবিটি খুবই সাধারণ হওয়ায় কোন মিল পাওয়া যাচ্ছে না। TinEye এর একটু "
"চাক্ষুষ বিস্তর প্রয়োজন সফল ভাবে মিল পাওয়ার জন্যে ।"
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr "ছবিটি ডাউনলোড করা যায়নি ।"
#: searx/engines/wttr.py:101
msgid "Morning"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Noon"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Evening"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Night"
msgstr ""
#: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests."
msgstr "স্ট্রিংগুলিকে বিভিন্ন হ্যাশ ডাইজেস্টে রূপান্তর করে।"
@ -308,8 +331,8 @@ msgid ""
"Avoid paywalls by redirecting to open-access versions of publications "
"when available"
msgstr ""
"Paywall এড়িয়ে চলতে প্রকাশন গুলির open-access সংস্করণে রিডাইরেক্ট করুন উপলব্"
"ধ থাকলে"
"Paywall এড়িয়ে চলতে প্রকাশন গুলির open-access সংস্করণে রিডাইরেক্ট করুন "
"উপলব্ধ থাকলে"
#: searx/plugins/search_on_category_select.py:19
msgid "Search on category select"
@ -320,12 +343,12 @@ msgid ""
"Perform search immediately if a category selected. Disable to select "
"multiple categories. (JavaScript required)"
msgstr ""
"যখন একটি বিভাগ নির্বাচন করা হয়, অনুসন্ধান অবিলম্বে সঞ্চালিত হয়. একাধিক বিভা"
"গ নির্বাচন করতে অক্ষম করুন। (জাভাস্ক্রিপ্ট প্রয়োজন)"
"যখন একটি বিভাগ নির্বাচন করা হয়, অনুসন্ধান অবিলম্বে সঞ্চালিত হয়. একাধিক "
"বিভাগ নির্বাচন করতে অক্ষম করুন। (জাভাস্ক্রিপ্ট প্রয়োজন)"
#: searx/plugins/self_info.py:20
msgid "Self Informations"
msgstr "নিজের তথ্য"
msgid "Self Information"
msgstr ""
#: searx/plugins/self_info.py:21
msgid ""
@ -406,7 +429,7 @@ msgid "Powered by"
msgstr ""
#: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine"
msgid "a privacy-respecting, open metasearch engine"
msgstr ""
#: searx/templates/simple/base.html:65
@ -444,6 +467,7 @@ msgstr "দৈর্ঘ্য"
#: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author"
msgstr "লেখক"
@ -487,17 +511,17 @@ msgid "View error logs and submit a bug report"
msgstr ""
#: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67
#: searx/templates/simple/stats.html:64
msgid "Median"
msgstr ""
#: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73
#: searx/templates/simple/stats.html:70
msgid "P80"
msgstr ""
#: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79
#: searx/templates/simple/stats.html:76
msgid "P95"
msgstr ""
@ -659,7 +683,7 @@ msgstr ""
#: searx/templates/simple/preferences.html:264
msgid ""
"Change how forms are submited, <a "
"Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
msgstr ""
@ -913,67 +937,63 @@ msgstr ""
msgid "Result count"
msgstr ""
#: searx/templates/simple/stats.html:38
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
#: searx/templates/simple/stats.html:59
msgid "Total"
msgstr "মোট"
#: searx/templates/simple/stats.html:63
#: searx/templates/simple/stats.html:60
msgid "HTTP"
msgstr "এইচটিটিপি"
#: searx/templates/simple/stats.html:64
#: searx/templates/simple/stats.html:61
msgid "Processing"
msgstr "প্রক্রিয়ারত"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Warnings"
msgstr "সতর্কতা"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Errors and exceptions"
msgstr ""
#: searx/templates/simple/stats.html:108
#: searx/templates/simple/stats.html:105
msgid "Exception"
msgstr "ব্যতিক্রম"
#: searx/templates/simple/stats.html:110
#: searx/templates/simple/stats.html:107
msgid "Message"
msgstr "বার্তা"
#: searx/templates/simple/stats.html:112
#: searx/templates/simple/stats.html:109
msgid "Percentage"
msgstr "শতাংশ"
#: searx/templates/simple/stats.html:114
#: searx/templates/simple/stats.html:111
msgid "Parameter"
msgstr ""
#: searx/templates/simple/stats.html:122
#: searx/templates/simple/stats.html:119
msgid "Filename"
msgstr ""
#: searx/templates/simple/stats.html:123
#: searx/templates/simple/stats.html:120
msgid "Function"
msgstr ""
#: searx/templates/simple/stats.html:124
#: searx/templates/simple/stats.html:121
msgid "Code"
msgstr "কোড"
#: searx/templates/simple/stats.html:131
#: searx/templates/simple/stats.html:128
msgid "Checker"
msgstr ""
#: searx/templates/simple/stats.html:134
#: searx/templates/simple/stats.html:131
msgid "Failed test"
msgstr ""
#: searx/templates/simple/stats.html:135
#: searx/templates/simple/stats.html:132
msgid "Comment(s)"
msgstr "মন্তব্য"
@ -1060,6 +1080,50 @@ msgstr ""
msgid "hide map"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:5
msgid "Published date"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:9
msgid "Journal"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:22
msgid "Editor"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:23
msgid "Publisher"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:24
msgid "Type"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:25
msgid "Tags"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:26
msgid "DOI"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:27
msgid "ISSN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:28
msgid "ISBN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:33
msgid "PDF"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:34
msgid "HTML"
msgstr ""
#: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link"
msgstr ""
@ -1120,3 +1184,23 @@ msgstr ""
#~ msgid "preferences"
#~ msgstr "পছন্দসমূহ"
#~ msgid "Scores per result"
#~ msgstr ""
#~ msgid "a privacy-respecting, hackable metasearch engine"
#~ msgstr ""
#~ msgid "No abstract is available for this publication."
#~ msgstr "এই প্রকাশনার জন্য কোন বিমূর্ত উপলব্ধ নেই."
#~ msgid "Self Informations"
#~ msgstr "নিজের তথ্য"
#~ msgid ""
#~ "Change how forms are submited, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">learn more about request "
#~ "methods</a>"
#~ msgstr ""

View file

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n"
"POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2021-12-17 07:17+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: bo\n"
@ -126,6 +126,11 @@ msgstr ""
msgid "web"
msgstr ""
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO']
#: searx/searxng.msg
msgid "auto"
@ -141,91 +146,91 @@ msgstr ""
msgid "dark"
msgstr ""
#: searx/webapp.py:165
#: searx/webapp.py:164
msgid "timeout"
msgstr ""
#: searx/webapp.py:166
#: searx/webapp.py:165
msgid "parsing error"
msgstr ""
#: searx/webapp.py:167
#: searx/webapp.py:166
msgid "HTTP protocol error"
msgstr ""
#: searx/webapp.py:168
#: searx/webapp.py:167
msgid "network error"
msgstr ""
#: searx/webapp.py:170
#: searx/webapp.py:169
msgid "unexpected crash"
msgstr ""
#: searx/webapp.py:177
#: searx/webapp.py:176
msgid "HTTP error"
msgstr ""
#: searx/webapp.py:178
#: searx/webapp.py:177
msgid "HTTP connection error"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:183
msgid "proxy error"
msgstr ""
#: searx/webapp.py:185
#: searx/webapp.py:184
msgid "CAPTCHA"
msgstr ""
#: searx/webapp.py:186
#: searx/webapp.py:185
msgid "too many requests"
msgstr ""
#: searx/webapp.py:187
#: searx/webapp.py:186
msgid "access denied"
msgstr ""
#: searx/webapp.py:188
#: searx/webapp.py:187
msgid "server API error"
msgstr ""
#: searx/webapp.py:363
#: searx/webapp.py:362
msgid "No item found"
msgstr "རྣམ་གྲངས་གང་ཡང་རྙེད་རྒྱུ་མ་བྱུང་།"
#: searx/engines/qwant.py:212
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365
#: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source"
msgstr ""
#: searx/webapp.py:367
#: searx/webapp.py:366
msgid "Error loading the next page"
msgstr ""
#: searx/webapp.py:516 searx/webapp.py:960
#: searx/webapp.py:518 searx/webapp.py:950
msgid "Invalid settings, please edit your preferences"
msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།ཁྱེད་ཀྱིས་གདམ་ཀ་ལ་བཅོས་སྒྲིག་གཏོང་རོགས།"
#: searx/webapp.py:532
#: searx/webapp.py:534
msgid "Invalid settings"
msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།"
#: searx/webapp.py:609 searx/webapp.py:685
#: searx/webapp.py:611 searx/webapp.py:687
msgid "search error"
msgstr "འཚོལ་བཤེར་ལ་ནོར་འཁྲུལ་བྱུང་།"
#: searx/webapp.py:731
#: searx/webapp.py:849
msgid "Suspended"
msgstr ""
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago"
msgstr "སྐར་མ་ {minutes} སྔོན་ལ།"
#: searx/webapp.py:733
#: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "ཆུ་ཚོད་ {hours} དང་སྐར་མ {minutes} སྔོན་ལ།"
#: searx/webapp.py:859
msgid "Suspended"
msgstr ""
#: searx/answerers/random/answerer.py:67
msgid "Random value generator"
msgstr "ངེས་མེད་གྲངས་ཀ་མཁོ་སྤྲོད།"
@ -254,12 +259,14 @@ msgstr ""
msgid "This entry has been superseded by"
msgstr "འཚོལ་བྱང་འདི་གཞན་གྱིས་ཚབ་བྱེད་འདུག"
#: searx/engines/pubmed.py:78
msgid "No abstract is available for this publication."
#: searx/engines/qwant.py:219
msgid "Channel"
msgstr ""
#: searx/engines/qwant.py:214
msgid "Channel"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40
@ -279,6 +286,22 @@ msgstr ""
msgid "The image could not be downloaded."
msgstr ""
#: searx/engines/wttr.py:101
msgid "Morning"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Noon"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Evening"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Night"
msgstr ""
#: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests."
msgstr ""
@ -320,7 +343,7 @@ msgstr ""
"multiple categories. (JavaScript required)"
#: searx/plugins/self_info.py:20
msgid "Self Informations"
msgid "Self Information"
msgstr ""
#: searx/plugins/self_info.py:21
@ -402,8 +425,8 @@ msgid "Powered by"
msgstr "བཟོ་སྐུན་པ་ནི"
#: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "མི་སྒེར་ཆ་འཕྲིན་ལ་བརྩི་གསོག་ལྡན་ཞིང་འཚོལ་བྱེད་ནང་དོན་ཕུན་སུམ་པའི་འཚོལ་བཤེར་སྒུལ་བྱེད་མ་ལག"
msgid "a privacy-respecting, open metasearch engine"
msgstr ""
#: searx/templates/simple/base.html:65
msgid "Source code"
@ -440,6 +463,7 @@ msgstr ""
#: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author"
msgstr ""
@ -483,17 +507,17 @@ msgid "View error logs and submit a bug report"
msgstr ""
#: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67
#: searx/templates/simple/stats.html:64
msgid "Median"
msgstr ""
#: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73
#: searx/templates/simple/stats.html:70
msgid "P80"
msgstr ""
#: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79
#: searx/templates/simple/stats.html:76
msgid "P95"
msgstr ""
@ -655,7 +679,7 @@ msgstr ""
#: searx/templates/simple/preferences.html:264
msgid ""
"Change how forms are submited, <a "
"Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
msgstr ""
@ -909,67 +933,63 @@ msgstr "ཐོབ་སྐར།"
msgid "Result count"
msgstr ""
#: searx/templates/simple/stats.html:38
msgid "Scores per result"
msgstr "འཚོལ་འབྲས་རེ་རེ་ཡི་ཐོབ་སྐར།"
#: searx/templates/simple/stats.html:62
#: searx/templates/simple/stats.html:59
msgid "Total"
msgstr ""
#: searx/templates/simple/stats.html:63
#: searx/templates/simple/stats.html:60
msgid "HTTP"
msgstr ""
#: searx/templates/simple/stats.html:64
#: searx/templates/simple/stats.html:61
msgid "Processing"
msgstr ""
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Warnings"
msgstr ""
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Errors and exceptions"
msgstr ""
#: searx/templates/simple/stats.html:108
#: searx/templates/simple/stats.html:105
msgid "Exception"
msgstr ""
#: searx/templates/simple/stats.html:110
#: searx/templates/simple/stats.html:107
msgid "Message"
msgstr ""
#: searx/templates/simple/stats.html:112
#: searx/templates/simple/stats.html:109
msgid "Percentage"
msgstr ""
#: searx/templates/simple/stats.html:114
#: searx/templates/simple/stats.html:111
msgid "Parameter"
msgstr ""
#: searx/templates/simple/stats.html:122
#: searx/templates/simple/stats.html:119
msgid "Filename"
msgstr ""
#: searx/templates/simple/stats.html:123
#: searx/templates/simple/stats.html:120
msgid "Function"
msgstr ""
#: searx/templates/simple/stats.html:124
#: searx/templates/simple/stats.html:121
msgid "Code"
msgstr ""
#: searx/templates/simple/stats.html:131
#: searx/templates/simple/stats.html:128
msgid "Checker"
msgstr ""
#: searx/templates/simple/stats.html:134
#: searx/templates/simple/stats.html:131
msgid "Failed test"
msgstr ""
#: searx/templates/simple/stats.html:135
#: searx/templates/simple/stats.html:132
msgid "Comment(s)"
msgstr ""
@ -1058,6 +1078,50 @@ msgstr "ས་བཀྲ་འཆར།"
msgid "hide map"
msgstr "ས་བཀྲ་སྦས།"
#: searx/templates/simple/result_templates/paper.html:5
msgid "Published date"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:9
msgid "Journal"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:22
msgid "Editor"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:23
msgid "Publisher"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:24
msgid "Type"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:25
msgid "Tags"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:26
msgid "DOI"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:27
msgid "ISSN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:28
msgid "ISBN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:33
msgid "PDF"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:34
msgid "HTML"
msgstr ""
#: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link"
msgstr "ཐོན་ཁུངས་ཀྱི་དྲ་གནས།"
@ -1356,3 +1420,22 @@ msgstr "རྙན་ཟློས་སྦས།"
#~ msgid "preferences"
#~ msgstr "སྒྲིག་བཀོད།"
#~ msgid "Scores per result"
#~ msgstr "འཚོལ་འབྲས་རེ་རེ་ཡི་ཐོབ་སྐར།"
#~ msgid "a privacy-respecting, hackable metasearch engine"
#~ msgstr "མི་སྒེར་ཆ་འཕྲིན་ལ་བརྩི་གསོག་ལྡན་ཞིང་འཚོལ་བྱེད་ནང་དོན་ཕུན་སུམ་པའི་འཚོལ་བཤེར་སྒུལ་བྱེད་མ་ལག"
#~ msgid "No abstract is available for this publication."
#~ msgstr ""
#~ msgid "Self Informations"
#~ msgstr ""
#~ msgid ""
#~ "Change how forms are submited, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">learn more about request "
#~ "methods</a>"
#~ msgstr ""

View file

@ -9,13 +9,15 @@
# Gerard Oliva Viñas <oliva3032001@gmail.com>, 2022.
# adriadam10 <adriadam10@gmail.com>, 2022.
# alexfs2015 <alex04fs@gmail.com>, 2022.
# Joan Montané <joan@montane.cat>, 2022.
# Markus Heiser <markus.heiser@darmarit.de>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-29 07:17+0000\n"
"Last-Translator: alexfs2015 <alex04fs@gmail.com>\n"
"POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-09-30 07:43+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Catalan <https://weblate.bubu1.eu/projects/searxng/searxng/ca/"
">\n"
"Language: ca\n"
@ -23,7 +25,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.13.1\n"
"X-Generator: Weblate 4.14.1\n"
"Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -131,6 +133,11 @@ msgstr "wikis de programari"
msgid "web"
msgstr "web"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr "articles científics"
#. STYLE_NAMES['AUTO']
#: searx/searxng.msg
msgid "auto"
@ -146,91 +153,91 @@ msgstr "clar"
msgid "dark"
msgstr "fosc"
#: searx/webapp.py:165
#: searx/webapp.py:164
msgid "timeout"
msgstr "expirat"
#: searx/webapp.py:166
#: searx/webapp.py:165
msgid "parsing error"
msgstr "error de processament"
#: searx/webapp.py:167
#: searx/webapp.py:166
msgid "HTTP protocol error"
msgstr "error de protocol HTTP"
#: searx/webapp.py:168
#: searx/webapp.py:167
msgid "network error"
msgstr "error de xarxa"
#: searx/webapp.py:170
#: searx/webapp.py:169
msgid "unexpected crash"
msgstr "tancament ineseperat"
#: searx/webapp.py:177
#: searx/webapp.py:176
msgid "HTTP error"
msgstr "error HTTP"
#: searx/webapp.py:178
#: searx/webapp.py:177
msgid "HTTP connection error"
msgstr "error de connexió HTTP"
#: searx/webapp.py:184
#: searx/webapp.py:183
msgid "proxy error"
msgstr "error de servidor intermediari"
#: searx/webapp.py:185
#: searx/webapp.py:184
msgid "CAPTCHA"
msgstr "CAPTCHA"
#: searx/webapp.py:186
#: searx/webapp.py:185
msgid "too many requests"
msgstr "massa peticions"
#: searx/webapp.py:187
#: searx/webapp.py:186
msgid "access denied"
msgstr "accés denegat"
#: searx/webapp.py:188
#: searx/webapp.py:187
msgid "server API error"
msgstr "error en la API del servidor"
msgstr "error en l'API del servidor"
#: searx/webapp.py:363
#: searx/webapp.py:362
msgid "No item found"
msgstr "No s'ha trobat cap element"
#: searx/engines/qwant.py:212
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365
#: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source"
msgstr "Origen"
#: searx/webapp.py:367
#: searx/webapp.py:366
msgid "Error loading the next page"
msgstr "S'ha produït un error en carregar la pàgina següent"
#: searx/webapp.py:516 searx/webapp.py:960
#: searx/webapp.py:518 searx/webapp.py:950
msgid "Invalid settings, please edit your preferences"
msgstr "La configuració no és vàlida, editeu-la"
#: searx/webapp.py:532
#: searx/webapp.py:534
msgid "Invalid settings"
msgstr "La configuració no és vàlida"
#: searx/webapp.py:609 searx/webapp.py:685
#: searx/webapp.py:611 searx/webapp.py:687
msgid "search error"
msgstr "error en la cerca"
#: searx/webapp.py:731
#: searx/webapp.py:849
msgid "Suspended"
msgstr "Suspès"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago"
msgstr "fa {minutes} minuts"
#: searx/webapp.py:733
#: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "fa {hours} hores i {minutes} minuts"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "Suspès"
#: searx/answerers/random/answerer.py:67
msgid "Random value generator"
msgstr "Generador de valor aleatori"
@ -259,36 +266,57 @@ msgstr "{title} (OBSOLET)"
msgid "This entry has been superseded by"
msgstr "Aquesta entrada ha estat substituïda per"
#: searx/engines/pubmed.py:78
msgid "No abstract is available for this publication."
msgstr "No hi ha resum disponible per a aquesta publicació."
#: searx/engines/qwant.py:214
#: searx/engines/qwant.py:219
msgid "Channel"
msgstr "Canal"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
"{numCitations} cites desde l'any {firstCitationVelocityYear} al "
"{lastCitationVelocityYear}"
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP."
msgstr ""
"No s'ha pogut llegir l'URL de la imatge. Això pot ser degut a un format de "
"fitxer no compatible. TinEye només admet imatges en format JPEG, PNG, GIF, "
"BMP, TIFF o WebP."
"No s'ha pogut llegir l'URL de la imatge. Això pot ser degut a un format "
"de fitxer no compatible. TinEye només admet imatges en format JPEG, PNG, "
"GIF, BMP, TIFF o WebP."
#: searx/engines/tineye.py:46
msgid ""
"The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches."
msgstr ""
"La imatge és massa senzilla per trobar coincidències. TinEye requereix un "
"nivell bàsic de detall visual per identificar amb èxit les coincidències."
"La imatge és massa senzilla per trobar coincidències. TinEye requereix un"
" nivell bàsic de detall visual per identificar amb èxit les "
"coincidències."
#: searx/engines/tineye.py:52
msgid "The image could not be downloaded."
msgstr "No s'ha pogut baixar la imatge."
#: searx/engines/wttr.py:101
msgid "Morning"
msgstr "Matí"
#: searx/engines/wttr.py:101
msgid "Noon"
msgstr "Migdia"
#: searx/engines/wttr.py:101
msgid "Evening"
msgstr "Vespre"
#: searx/engines/wttr.py:101
msgid "Night"
msgstr "Nit"
#: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests."
msgstr "Converteix cadenes a diferent formats de resum."
@ -332,7 +360,7 @@ msgstr ""
"Desactiveu-ho per a seleccionar més d'una categoria. (Cal JavaScript)"
#: searx/plugins/self_info.py:20
msgid "Self Informations"
msgid "Self Information"
msgstr "Informació pròpia"
#: searx/plugins/self_info.py:21
@ -352,17 +380,17 @@ msgid ""
"This plugin checks if the address of the request is a TOR exit node, and "
"informs the user if it is, like check.torproject.org but from searxng."
msgstr ""
"Aquest plugin comprova si l'adreça de la sol·licitud és un node de sortida "
"TOR i informa a l'usuari si ho és, com check.torproject.org però des de "
"searxng."
"Aquest plugin comprova si l'adreça de la sol·licitud és un node de "
"sortida TOR i informa a l'usuari si ho és, com check.torproject.org però "
"des de searxng."
#: searx/plugins/tor_check.py:62
msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable."
msgstr ""
"No es pot accedir a la llista de nodes de sortida TOR (https://check."
"torproject.org/exit-addresses)."
"No es pot accedir a la llista de nodes de sortida TOR "
"(https://check.torproject.org/exit-addresses)."
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
@ -378,7 +406,7 @@ msgstr "Suprimeix l'URL de rastreig"
#: searx/plugins/tracker_url_remover.py:30
msgid "Remove trackers arguments from the returned URL"
msgstr "Suprimeix els arguments de rastreig de les URL retornades"
msgstr "Suprimeix els arguments de rastreig dels URL retornats"
#: searx/plugins/vim_hotkeys.py:3
msgid "Vim-like hotkeys"
@ -400,7 +428,7 @@ msgstr "No s'ha trobat la pàgina"
#: searx/templates/simple/404.html:6
#, python-format
msgid "Go to %(search_page)s."
msgstr "Vés a %(search_page)s."
msgstr "Ves a %(search_page)s."
#: searx/templates/simple/404.html:6
msgid "search page"
@ -408,7 +436,7 @@ msgstr "pàgina de cerca"
#: searx/templates/simple/base.html:46
msgid "About"
msgstr "Sobre Nosaltres"
msgstr "Quant a"
#: searx/templates/simple/base.html:50
msgid "Donate"
@ -424,8 +452,8 @@ msgid "Powered by"
msgstr "Funciona amb"
#: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "un meta motor de cerca personalitzable i respectuós amb la privadesa"
msgid "a privacy-respecting, open metasearch engine"
msgstr "metacercador obert, que respecta la privacitat"
#: searx/templates/simple/base.html:65
msgid "Source code"
@ -462,6 +490,7 @@ msgstr "Longitud"
#: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author"
msgstr "Autor"
@ -479,17 +508,15 @@ msgstr "Enviar un nou problema a GitHub"
#: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub"
msgstr "Si us plau revisa si ja hi ha un problema amb aquest motor a GitHub"
msgstr "Comproveu si ja hi ha cap problema amb aquest motor a GitHub"
#: searx/templates/simple/new_issue.html:69
msgid "I confirm there is no existing bug about the issue I encounter"
msgstr "Confirmo que no hi ha un bug relacionat amb el problema que he trobat"
msgstr "Confirmo que no hi ha un problema relacionat amb el problema que he trobat"
#: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report"
msgstr ""
"Si aquesta és una instància pública, si us plau especifica la URL al report "
"del bug"
msgstr "Si aquesta és una instància pública, indiqueu l'URL a l'informe d'error"
#: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information"
@ -507,17 +534,17 @@ msgid "View error logs and submit a bug report"
msgstr "Mostra els informes d'error i envia un informe d'error"
#: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67
#: searx/templates/simple/stats.html:64
msgid "Median"
msgstr "Mitjà"
#: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73
#: searx/templates/simple/stats.html:70
msgid "P80"
msgstr "P80"
#: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79
#: searx/templates/simple/stats.html:76
msgid "P95"
msgstr "P95"
@ -683,13 +710,13 @@ msgstr "Mètode HTTP"
#: searx/templates/simple/preferences.html:264
msgid ""
"Change how forms are submited, <a "
"Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
msgstr ""
"Canvia com es trameten els formularis, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">més informació sobre els mètodes de petició</a>"
"Canvia com es trameten els formularis, <a href=\"http://en.wikipedia.org/"
"wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">més "
"informació sobre els mètodes de petició</a>"
#: searx/templates/simple/preferences.html:269
msgid "Image proxy"
@ -835,8 +862,8 @@ msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
msgstr ""
"Nota: si indiqueu configuracions personalitzades en la URL de cerca podeu"
" reduir la privadesa, amb filtració de dades, en fer clic als llocs dels "
"Nota: si indiqueu configuracions personalitzades en l'URL de cerca, podeu"
" reduir-ne la privadesa i filtrar dades, en fer clic en els llocs dels "
"resultats."
#: searx/templates/simple/preferences.html:419
@ -864,8 +891,8 @@ msgid ""
"These cookies serve your sole convenience, we don't use these cookies to "
"track you."
msgstr ""
"Aquestes galetes només són per a la vostra conveniència. No les usem per "
"a rastrejar-vos."
"Aquestes galetes només són per a la vostra comoditat. No les usem per a "
"rastrejar-vos."
#: searx/templates/simple/preferences.html:433
msgid "Save"
@ -955,67 +982,63 @@ msgstr "Valoració"
msgid "Result count"
msgstr "Resultats"
#: searx/templates/simple/stats.html:38
msgid "Scores per result"
msgstr "Valoració segons el resultat"
#: searx/templates/simple/stats.html:62
#: searx/templates/simple/stats.html:59
msgid "Total"
msgstr "Total"
#: searx/templates/simple/stats.html:63
#: searx/templates/simple/stats.html:60
msgid "HTTP"
msgstr "HTTP"
#: searx/templates/simple/stats.html:64
#: searx/templates/simple/stats.html:61
msgid "Processing"
msgstr "S'està processant"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Warnings"
msgstr "Avisos"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Errors and exceptions"
msgstr "Errors i excepcions"
#: searx/templates/simple/stats.html:108
#: searx/templates/simple/stats.html:105
msgid "Exception"
msgstr "Excepció"
#: searx/templates/simple/stats.html:110
#: searx/templates/simple/stats.html:107
msgid "Message"
msgstr "Missatge"
#: searx/templates/simple/stats.html:112
#: searx/templates/simple/stats.html:109
msgid "Percentage"
msgstr "Percentatge"
#: searx/templates/simple/stats.html:114
#: searx/templates/simple/stats.html:111
msgid "Parameter"
msgstr "Paràmetre"
#: searx/templates/simple/stats.html:122
#: searx/templates/simple/stats.html:119
msgid "Filename"
msgstr "Nom de fitxer"
#: searx/templates/simple/stats.html:123
#: searx/templates/simple/stats.html:120
msgid "Function"
msgstr "Funció"
#: searx/templates/simple/stats.html:124
#: searx/templates/simple/stats.html:121
msgid "Code"
msgstr "Codi"
#: searx/templates/simple/stats.html:131
#: searx/templates/simple/stats.html:128
msgid "Checker"
msgstr "Comprovador"
#: searx/templates/simple/stats.html:134
#: searx/templates/simple/stats.html:131
msgid "Failed test"
msgstr "Prova fallida"
#: searx/templates/simple/stats.html:135
#: searx/templates/simple/stats.html:132
msgid "Comment(s)"
msgstr "Comentaris"
@ -1104,6 +1127,50 @@ msgstr "mostra el mapa"
msgid "hide map"
msgstr "amaga el mapa"
#: searx/templates/simple/result_templates/paper.html:5
msgid "Published date"
msgstr "Data de publicació"
#: searx/templates/simple/result_templates/paper.html:9
msgid "Journal"
msgstr "Diari"
#: searx/templates/simple/result_templates/paper.html:22
msgid "Editor"
msgstr "Redactor"
#: searx/templates/simple/result_templates/paper.html:23
msgid "Publisher"
msgstr "Editor"
#: searx/templates/simple/result_templates/paper.html:24
msgid "Type"
msgstr "Tipus"
#: searx/templates/simple/result_templates/paper.html:25
msgid "Tags"
msgstr "Etiquetes"
#: searx/templates/simple/result_templates/paper.html:26
msgid "DOI"
msgstr "DOI"
#: searx/templates/simple/result_templates/paper.html:27
msgid "ISSN"
msgstr "ISSN"
#: searx/templates/simple/result_templates/paper.html:28
msgid "ISBN"
msgstr "ISBN"
#: searx/templates/simple/result_templates/paper.html:33
msgid "PDF"
msgstr "PDF"
#: searx/templates/simple/result_templates/paper.html:34
msgid "HTML"
msgstr "HTML"
#: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link"
msgstr "enllaç magnet"
@ -1407,3 +1474,27 @@ msgstr "amaga el vídeo"
#~ msgid "preferences"
#~ msgstr "preferències"
#~ msgid "Scores per result"
#~ msgstr "Valoració segons el resultat"
#~ msgid "a privacy-respecting, hackable metasearch engine"
#~ msgstr "un meta motor de cerca personalitzable i respectuós amb la privadesa"
#~ msgid "No abstract is available for this publication."
#~ msgstr "No hi ha resum disponible per a aquesta publicació."
#~ msgid "Self Informations"
#~ msgstr "Informació pròpia"
#~ msgid ""
#~ "Change how forms are submited, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">learn more about request "
#~ "methods</a>"
#~ msgstr ""
#~ "Canvia com es trameten els formularis,"
#~ " <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">més informació sobre els "
#~ "mètodes de petició</a>"

View file

@ -12,20 +12,19 @@
# LagManCZ <lagmen@post.cz>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-29 07:17+0000\n"
"POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-09-21 15:58+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Czech <https://weblate.bubu1.eu/projects/searxng/searxng/cs/>"
"\n"
"Language: cs\n"
"Language-Team: Czech "
"<https://weblate.bubu1.eu/projects/searxng/searxng/cs/>\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && "
"n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -133,6 +132,11 @@ msgstr "softwarové wikipédie"
msgid "web"
msgstr "web"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO']
#: searx/searxng.msg
msgid "auto"
@ -148,91 +152,91 @@ msgstr "světlý"
msgid "dark"
msgstr "tmavý"
#: searx/webapp.py:165
#: searx/webapp.py:164
msgid "timeout"
msgstr "čas vypršel"
#: searx/webapp.py:166
#: searx/webapp.py:165
msgid "parsing error"
msgstr "chyba parsování"
#: searx/webapp.py:167
#: searx/webapp.py:166
msgid "HTTP protocol error"
msgstr "chyba HTTP protokolu"
#: searx/webapp.py:168
#: searx/webapp.py:167
msgid "network error"
msgstr "síťová chyba"
#: searx/webapp.py:170
#: searx/webapp.py:169
msgid "unexpected crash"
msgstr "nečekaná chyba"
#: searx/webapp.py:177
#: searx/webapp.py:176
msgid "HTTP error"
msgstr "chyba HTTP"
#: searx/webapp.py:178
#: searx/webapp.py:177
msgid "HTTP connection error"
msgstr "Chyba spojení HTTP"
#: searx/webapp.py:184
#: searx/webapp.py:183
msgid "proxy error"
msgstr "chyba proxy"
#: searx/webapp.py:185
#: searx/webapp.py:184
msgid "CAPTCHA"
msgstr "CAPTCHA"
#: searx/webapp.py:186
#: searx/webapp.py:185
msgid "too many requests"
msgstr "příliš mnoho požadavků"
#: searx/webapp.py:187
#: searx/webapp.py:186
msgid "access denied"
msgstr "přístup odepřen"
#: searx/webapp.py:188
#: searx/webapp.py:187
msgid "server API error"
msgstr "chyba API serveru"
#: searx/webapp.py:363
#: searx/webapp.py:362
msgid "No item found"
msgstr "Nic nenalezeno"
#: searx/engines/qwant.py:212
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365
#: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source"
msgstr "zdroj"
#: searx/webapp.py:367
#: searx/webapp.py:366
msgid "Error loading the next page"
msgstr "Chyba při načítání další stránky"
#: searx/webapp.py:516 searx/webapp.py:960
#: searx/webapp.py:518 searx/webapp.py:950
msgid "Invalid settings, please edit your preferences"
msgstr "Neplatné nastavení, upravte své předvolby"
#: searx/webapp.py:532
#: searx/webapp.py:534
msgid "Invalid settings"
msgstr "Neplatné nastavení"
#: searx/webapp.py:609 searx/webapp.py:685
#: searx/webapp.py:611 searx/webapp.py:687
msgid "search error"
msgstr "chyba vyhledávání"
#: searx/webapp.py:731
#: searx/webapp.py:849
msgid "Suspended"
msgstr "Pozastaveno"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago"
msgstr "před {minutes} minutami"
#: searx/webapp.py:733
#: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "před {hours} hodinami, {minutes} minutami"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "Pozastaveno"
#: searx/answerers/random/answerer.py:67
msgid "Random value generator"
msgstr "Generátor náhodných hodnot"
@ -261,14 +265,16 @@ msgstr "{title} (ZASTARALÉ)"
msgid "This entry has been superseded by"
msgstr "Tato položka byla nahrazena položkou"
#: searx/engines/pubmed.py:78
msgid "No abstract is available for this publication."
msgstr "Pro tuto publikaci neexistuje žádný abstrakt."
#: searx/engines/qwant.py:214
#: searx/engines/qwant.py:219
msgid "Channel"
msgstr "Kanál"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40
msgid ""
"Could not read that image url. This may be due to an unsupported file "
@ -276,8 +282,8 @@ msgid ""
" WebP."
msgstr ""
"Nelze načíst url adresu obrázku. Příčinou může být nepodporovaný formát "
"souboru. TinEye podporuje pouze obrázky ve formátu JPEG, PNG, GIF, BMP, TIFF "
"nebo WebP."
"souboru. TinEye podporuje pouze obrázky ve formátu JPEG, PNG, GIF, BMP, "
"TIFF nebo WebP."
#: searx/engines/tineye.py:46
msgid ""
@ -291,6 +297,22 @@ msgstr ""
msgid "The image could not be downloaded."
msgstr "Obrázek se nepodařilo stáhnout."
#: searx/engines/wttr.py:101
msgid "Morning"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Noon"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Evening"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Night"
msgstr ""
#: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests."
msgstr "Převádí řetězce na různé hash hodnoty."
@ -332,8 +354,8 @@ msgstr ""
"vypnuta, je možné vybrat více kategorií (vyžaduje JavaScript)"
#: searx/plugins/self_info.py:20
msgid "Self Informations"
msgstr "Informace o sobě"
msgid "Self Information"
msgstr ""
#: searx/plugins/self_info.py:21
msgid ""
@ -365,9 +387,7 @@ msgstr ""
#: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr ""
"List výstupního uzlu TORu (https://check.torproject.org/exit-addresses) "
"je nedosažitelný."
msgstr "Používáte TOR. Zdá se, že vaše IP adresa je: {ip_address}."
#: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}."
@ -425,8 +445,8 @@ msgid "Powered by"
msgstr "Poháněno softwarem"
#: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine"
msgstr "soukromí respektujícím, nastavitelným multivyhledávačem"
msgid "a privacy-respecting, open metasearch engine"
msgstr ""
#: searx/templates/simple/base.html:65
msgid "Source code"
@ -463,6 +483,7 @@ msgstr "Délka"
#: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author"
msgstr "Autor"
@ -508,17 +529,17 @@ msgid "View error logs and submit a bug report"
msgstr "Zobrazit ladící záznamy a poslat hlášení o chybě"
#: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67
#: searx/templates/simple/stats.html:64
msgid "Median"
msgstr "Medián"
#: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73
#: searx/templates/simple/stats.html:70
msgid "P80"
msgstr "P80"
#: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79
#: searx/templates/simple/stats.html:76
msgid "P95"
msgstr "P95"
@ -682,13 +703,10 @@ msgstr "Metoda HTTP"
#: searx/templates/simple/preferences.html:264
msgid ""
"Change how forms are submited, <a "
"Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
msgstr ""
"Určuje způsob odesílání formulářů. Informace o dotazovacích metodách <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">viz Wikipedie</a>"
#: searx/templates/simple/preferences.html:269
msgid "Image proxy"
@ -953,67 +971,63 @@ msgstr "Skóre"
msgid "Result count"
msgstr "Počet výsledků"
#: searx/templates/simple/stats.html:38
msgid "Scores per result"
msgstr "Skóre na výsledek"
#: searx/templates/simple/stats.html:62
#: searx/templates/simple/stats.html:59
msgid "Total"
msgstr "Celkem"
#: searx/templates/simple/stats.html:63
#: searx/templates/simple/stats.html:60
msgid "HTTP"
msgstr "HTTP"
#: searx/templates/simple/stats.html:64
#: searx/templates/simple/stats.html:61
msgid "Processing"
msgstr "Zpracovávám"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Warnings"
msgstr "Varování"
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Errors and exceptions"
msgstr "Chyby a výjimky"
#: searx/templates/simple/stats.html:108
#: searx/templates/simple/stats.html:105
msgid "Exception"
msgstr "Výjimka"
#: searx/templates/simple/stats.html:110
#: searx/templates/simple/stats.html:107
msgid "Message"
msgstr "Zpráva"
#: searx/templates/simple/stats.html:112
#: searx/templates/simple/stats.html:109
msgid "Percentage"
msgstr "Procenta"
#: searx/templates/simple/stats.html:114
#: searx/templates/simple/stats.html:111
msgid "Parameter"
msgstr "Parametr"
#: searx/templates/simple/stats.html:122
#: searx/templates/simple/stats.html:119
msgid "Filename"
msgstr "Název souboru"
#: searx/templates/simple/stats.html:123
#: searx/templates/simple/stats.html:120
msgid "Function"
msgstr "Funkce"
#: searx/templates/simple/stats.html:124
#: searx/templates/simple/stats.html:121
msgid "Code"
msgstr "Kód"
#: searx/templates/simple/stats.html:131
#: searx/templates/simple/stats.html:128
msgid "Checker"
msgstr "Zkoušeč"
#: searx/templates/simple/stats.html:134
#: searx/templates/simple/stats.html:131
msgid "Failed test"
msgstr "Test selhal"
#: searx/templates/simple/stats.html:135
#: searx/templates/simple/stats.html:132
msgid "Comment(s)"
msgstr "Komentář(e)"
@ -1102,6 +1116,50 @@ msgstr "zobrazit mapu"
msgid "hide map"
msgstr "skrýt mapu"
#: searx/templates/simple/result_templates/paper.html:5
msgid "Published date"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:9
msgid "Journal"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:22
msgid "Editor"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:23
msgid "Publisher"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:24
msgid "Type"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:25
msgid "Tags"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:26
msgid "DOI"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:27
msgid "ISSN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:28
msgid "ISBN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:33
msgid "PDF"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:34
msgid "HTML"
msgstr ""
#: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link"
msgstr "odkaz magnet"
@ -1403,3 +1461,27 @@ msgstr "skrýt video"
#~ msgid "preferences"
#~ msgstr "nastavení"
#~ msgid "Scores per result"
#~ msgstr "Skóre na výsledek"
#~ msgid "a privacy-respecting, hackable metasearch engine"
#~ msgstr "soukromí respektujícím, nastavitelným multivyhledávačem"
#~ msgid "No abstract is available for this publication."
#~ msgstr "Pro tuto publikaci neexistuje žádný abstrakt."
#~ msgid "Self Informations"
#~ msgstr "Informace o sobě"
#~ msgid ""
#~ "Change how forms are submited, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">learn more about request "
#~ "methods</a>"
#~ msgstr ""
#~ "Určuje způsob odesílání formulářů. Informace"
#~ " o dotazovacích metodách <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">viz Wikipedie</a>"

View file

@ -5,22 +5,22 @@
# Translators:
# Cymrodor <aled@aledpowell.cymru>, 2019
# Markus Heiser <markus.heiser@darmarit.de>, 2022.
# CJ <charl.cj.monke@gmail.com>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n"
"PO-Revision-Date: 2022-07-29 07:17+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Welsh <https://weblate.bubu1.eu/projects/searxng/searxng/cy/>"
"\n"
"POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-09-28 07:29+0000\n"
"Last-Translator: CJ <charl.cj.monke@gmail.com>\n"
"Language: cy\n"
"Language-Team: Welsh "
"<https://weblate.bubu1.eu/projects/searxng/searxng/cy/>\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n "
"!= 11) ? 2 : 3;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != "
"11) ? 2 : 3;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -106,128 +106,133 @@ msgstr "geiriau"
#. CATEGORY_GROUPS['PACKAGES']
#: searx/searxng.msg
msgid "packages"
msgstr ""
msgstr "pecyn"
#. CATEGORY_GROUPS['Q_A']
#: searx/searxng.msg
msgid "q&a"
msgstr ""
msgstr "q&a"
#. CATEGORY_GROUPS['REPOS']
#: searx/searxng.msg
msgid "repos"
msgstr ""
msgstr "repos"
#. CATEGORY_GROUPS['SOFTWARE_WIKIS']
#: searx/searxng.msg
msgid "software wikis"
msgstr ""
msgstr "wikis meddalwedd"
#. CATEGORY_GROUPS['WEB']
#: searx/searxng.msg
msgid "web"
msgstr ""
msgstr "gwe"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr "cyhoeddiadau gwyddonol"
#. STYLE_NAMES['AUTO']
#: searx/searxng.msg
msgid "auto"
msgstr ""
msgstr "auto"
#. STYLE_NAMES['LIGHT']
#: searx/searxng.msg
msgid "light"
msgstr ""
msgstr "golau"
#. STYLE_NAMES['DARK']
#: searx/searxng.msg
msgid "dark"
msgstr "tywyll"
#: searx/webapp.py:165
#: searx/webapp.py:164
msgid "timeout"
msgstr ""
msgstr "amser allan"
#: searx/webapp.py:166
#: searx/webapp.py:165
msgid "parsing error"
msgstr "gwall dosrannu"
#: searx/webapp.py:167
#: searx/webapp.py:166
msgid "HTTP protocol error"
msgstr "Gwall protocol HTTP"
#: searx/webapp.py:168
#: searx/webapp.py:167
msgid "network error"
msgstr "gwall rhwydwaith"
#: searx/webapp.py:170
#: searx/webapp.py:169
msgid "unexpected crash"
msgstr "damwain annisgwyl"
#: searx/webapp.py:177
#: searx/webapp.py:176
msgid "HTTP error"
msgstr "gwall http"
#: searx/webapp.py:178
#: searx/webapp.py:177
msgid "HTTP connection error"
msgstr "gwall cysylltiad http"
#: searx/webapp.py:184
#: searx/webapp.py:183
msgid "proxy error"
msgstr "gwall dirprwy"
#: searx/webapp.py:185
#: searx/webapp.py:184
msgid "CAPTCHA"
msgstr "CAPTCHA"
#: searx/webapp.py:186
#: searx/webapp.py:185
msgid "too many requests"
msgstr "gormod o geisiadau"
#: searx/webapp.py:187
#: searx/webapp.py:186
msgid "access denied"
msgstr ""
msgstr "mynediad wedi ei wrthod"
#: searx/webapp.py:188
#: searx/webapp.py:187
msgid "server API error"
msgstr ""
msgstr "gwall API gweinydd"
#: searx/webapp.py:363
#: searx/webapp.py:362
msgid "No item found"
msgstr "Ni chanfuwyd eitem"
#: searx/engines/qwant.py:212
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365
#: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source"
msgstr ""
msgstr "Ffynhonnell"
#: searx/webapp.py:367
#: searx/webapp.py:366
msgid "Error loading the next page"
msgstr ""
msgstr "Gwall wrth lwytho'r dudalen nesaf"
#: searx/webapp.py:516 searx/webapp.py:960
#: searx/webapp.py:518 searx/webapp.py:950
msgid "Invalid settings, please edit your preferences"
msgstr "Gosodiadau annilys. Addasa dy ddewisiadau."
#: searx/webapp.py:532
#: searx/webapp.py:534
msgid "Invalid settings"
msgstr "Gosodiadau annilys"
#: searx/webapp.py:609 searx/webapp.py:685
#: searx/webapp.py:611 searx/webapp.py:687
msgid "search error"
msgstr "gwall chwilio"
#: searx/webapp.py:731
#: searx/webapp.py:849
msgid "Suspended"
msgstr ""
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago"
msgstr "{minutes} munud yn ôl"
#: searx/webapp.py:733
#: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} awr, {minutes} munud yn ôl"
#: searx/webapp.py:859
msgid "Suspended"
msgstr ""
#: searx/answerers/random/answerer.py:67
msgid "Random value generator"
msgstr ""
@ -256,12 +261,14 @@ msgstr ""
msgid "This entry has been superseded by"
msgstr ""
#: searx/engines/pubmed.py:78
msgid "No abstract is available for this publication."
#: searx/engines/qwant.py:219
msgid "Channel"
msgstr ""
#: searx/engines/qwant.py:214
msgid "Channel"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40
@ -281,6 +288,22 @@ msgstr ""
msgid "The image could not be downloaded."
msgstr ""
#: searx/engines/wttr.py:101
msgid "Morning"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Noon"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Evening"
msgstr ""
#: searx/engines/wttr.py:101
msgid "Night"
msgstr ""
#: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests."
msgstr ""
@ -318,7 +341,7 @@ msgid ""
msgstr ""
#: searx/plugins/self_info.py:20
msgid "Self Informations"
msgid "Self Information"
msgstr ""
#: searx/plugins/self_info.py:21
@ -400,7 +423,7 @@ msgid "Powered by"
msgstr "Pwerwyd gan"
#: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine"
msgid "a privacy-respecting, open metasearch engine"
msgstr ""
#: searx/templates/simple/base.html:65
@ -438,6 +461,7 @@ msgstr ""
#: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author"
msgstr ""
@ -481,17 +505,17 @@ msgid "View error logs and submit a bug report"
msgstr ""
#: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67
#: searx/templates/simple/stats.html:64
msgid "Median"
msgstr ""
#: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73
#: searx/templates/simple/stats.html:70
msgid "P80"
msgstr ""
#: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79
#: searx/templates/simple/stats.html:76
msgid "P95"
msgstr ""
@ -653,7 +677,7 @@ msgstr ""
#: searx/templates/simple/preferences.html:264
msgid ""
"Change how forms are submited, <a "
"Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
msgstr ""
@ -907,67 +931,63 @@ msgstr "Sgoriau"
msgid "Result count"
msgstr ""
#: searx/templates/simple/stats.html:38
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
#: searx/templates/simple/stats.html:59
msgid "Total"
msgstr ""
#: searx/templates/simple/stats.html:63
#: searx/templates/simple/stats.html:60
msgid "HTTP"
msgstr ""
#: searx/templates/simple/stats.html:64
#: searx/templates/simple/stats.html:61
msgid "Processing"
msgstr ""
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Warnings"
msgstr ""
#: searx/templates/simple/stats.html:102
#: searx/templates/simple/stats.html:99
msgid "Errors and exceptions"
msgstr ""
#: searx/templates/simple/stats.html:108
#: searx/templates/simple/stats.html:105
msgid "Exception"
msgstr ""
#: searx/templates/simple/stats.html:110
#: searx/templates/simple/stats.html:107
msgid "Message"
msgstr ""
#: searx/templates/simple/stats.html:112
#: searx/templates/simple/stats.html:109
msgid "Percentage"
msgstr ""
#: searx/templates/simple/stats.html:114
#: searx/templates/simple/stats.html:111
msgid "Parameter"
msgstr ""
#: searx/templates/simple/stats.html:122
#: searx/templates/simple/stats.html:119
msgid "Filename"
msgstr ""
#: searx/templates/simple/stats.html:123
#: searx/templates/simple/stats.html:120
msgid "Function"
msgstr ""
#: searx/templates/simple/stats.html:124
#: searx/templates/simple/stats.html:121
msgid "Code"
msgstr ""
#: searx/templates/simple/stats.html:131
#: searx/templates/simple/stats.html:128
msgid "Checker"
msgstr ""
#: searx/templates/simple/stats.html:134
#: searx/templates/simple/stats.html:131
msgid "Failed test"
msgstr ""
#: searx/templates/simple/stats.html:135
#: searx/templates/simple/stats.html:132
msgid "Comment(s)"
msgstr ""
@ -1056,6 +1076,50 @@ msgstr "dangos map"
msgid "hide map"
msgstr "cuddio map"
#: searx/templates/simple/result_templates/paper.html:5
msgid "Published date"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:9
msgid "Journal"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:22
msgid "Editor"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:23
msgid "Publisher"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:24
msgid "Type"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:25
msgid "Tags"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:26
msgid "DOI"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:27
msgid "ISSN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:28
msgid "ISBN"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:33
msgid "PDF"
msgstr ""
#: searx/templates/simple/result_templates/paper.html:34
msgid "HTML"
msgstr ""
#: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link"
msgstr "dolen magnet"
@ -1354,3 +1418,23 @@ msgstr "cuddio fideo"
#~ msgid "preferences"
#~ msgstr "dewisiadau"
#~ msgid "Scores per result"
#~ msgstr ""
#~ msgid "a privacy-respecting, hackable metasearch engine"
#~ msgstr ""
#~ msgid "No abstract is available for this publication."
#~ msgstr ""
#~ msgid "Self Informations"
#~ msgstr ""
#~ msgid ""
#~ "Change how forms are submited, <a "
#~ "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
#~ " rel=\"external\">learn more about request "
#~ "methods</a>"
#~ msgstr ""

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