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 ;; If you get ``*** EPC Error ***`` (even after a jedi:install-server) in
;; your emacs session, mostly you have jedi-mode enabled but the python ;; 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:: ;; ``<repo>/.dir-locals.el`` in::
;; ;;
;; ./local/py3 ;; ./local/py3
@ -64,10 +64,10 @@
(setq-local python-environment-directory (setq-local python-environment-directory
(expand-file-name "./local" prj-root)) (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)) (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 (setq-local python-environment-default-root-name
"py3") "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 - Removed engines: faroo
Special thanks to `NLNet <https://nlnet.nl>`__ for sponsoring multiple features of this release. 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 News
~~~~ ~~~~

View file

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

View file

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

View file

@ -25,7 +25,7 @@ place the templates at::
searx/templates/{theme_name}/result_templates/{template_name} 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 can still add them and limit the access by setting ``tokens`` as described in
section :ref:`private engines`. section :ref:`private engines`.

View file

@ -39,7 +39,7 @@ Example
Scenario: Scenario:
#. Recoll indexes a local filesystem mounted in ``/export/documents/reference``, #. 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 #. the contents of this filesystem can be reached though https://download.example.org/reference
.. code:: yaml .. 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 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``. 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 can still add them and limit the access by setting ``tokens`` as described in
section :ref:`private engines`. section :ref:`private engines`.

View file

@ -240,6 +240,7 @@ Global Settings
query_in_title: false query_in_title: false
infinite_scroll: false infinite_scroll: false
center_alignment: false center_alignment: false
cache_url: https://web.archive.org/web/
default_theme: simple default_theme: simple
theme_args: theme_args:
simple_style: auto simple_style: auto
@ -267,6 +268,15 @@ Global Settings
side of the screen. This setting only affects the *desktop layout* side of the screen. This setting only affects the *desktop layout*
(:origin:`min-width: @tablet <searx/static/themes/simple/src/less/definitions.less>`) (: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`` : ``default_theme`` :
Name of the theme you want to use by default on your SearXNG instance. Name of the theme you want to use by default on your SearXNG instance.
@ -331,7 +341,7 @@ Communication with search engines.
outgoing: outgoing:
request_timeout: 2.0 # default timeout in seconds, can be override by engine request_timeout: 2.0 # default timeout in seconds, can be override by engine
max_request_timeout: 10.0 # the maximum timeout in seconds 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 pool_connections: 100 # Maximum number of allowable connections, or null
# for no limits. The default is 100. # for no limits. The default is 100.
pool_maxsize: 10 # Number of allowable keep-alive connections, or null 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 The authentication plugin is configurable by setting ``auth_plugin`` in the
attributes. By default it is set to ``caching_sha2_password``. This is an 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 .. code:: yaml

View file

@ -47,7 +47,7 @@ Engine File
argument type information argument type information
======================= =========== ======================================================== ======================= =========== ========================================================
categories list pages, in which the engine is working 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 time_range_support boolean support search time range
engine_type str - ``online`` :ref:`[ref] <demo online engine>` by engine_type str - ``online`` :ref:`[ref] <demo online engine>` by
default, other possibles values are: 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.postcode postcode of object
address.country country 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>` 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 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:: .. tabs::
@ -300,7 +300,7 @@ of the container:
Now we can develop as usual in the working tree of our desktop system. Every 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 time the software was changed, you have to restart the SearXNG service (in the
conatiner): container):
.. tabs:: .. 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 $ sudo -H ./utils/lxc.sh install suite searxng-archlinux
To access HTTP from the desktop we installed nginx for the services inside the To access HTTP from the desktop we installed nginx for the services inside the
conatiner: container:
.. tabs:: .. tabs::

View file

@ -15,7 +15,7 @@ generated and deployed at :docs:`github.io <.>`. For build prerequisites read
:ref:`docs build`. :ref:`docs build`.
The source files of Searx's documentation are located at :origin:`docs`. Sphinx 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. <make docs.live>` to build HTML while editing.
.. sidebar:: Further reading .. sidebar:: Further reading
@ -227,13 +227,13 @@ To refer anchors use the `ref role`_ markup:
.. code:: reST .. 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>`. bar <reST anchor>`.
.. admonition:: ``:ref:`` role .. admonition:: ``:ref:`` role
:class: rst-example :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>`. bar <reST anchor>`.
.. _reST ordinary ref: .. _reST ordinary ref:
@ -494,8 +494,8 @@ Figures & Images
is flexible. To get best results in the generated output format, install is flexible. To get best results in the generated output format, install
ImageMagick_ and Graphviz_. ImageMagick_ and Graphviz_.
Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scaleable here means; Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scalable here means;
scaleable in sense of the build process. Normally in absence of a converter 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 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 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 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 If you want to add an image, you should use the ``kernel-figure`` (inheritance
of :dudir:`figure`) and ``kernel-image`` (inheritance of :dudir:`image`) 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`): (:ref:`svg image example`):
.. code:: reST .. 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 - cell 4.4
* - row 5 * - row 5
- cell 5.1 with automatic span to rigth end - cell 5.1 with automatic span to right end
* - row 6 * - row 6
- cell 6.1 - 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 - cell 4.4
* - row 5 * - row 5
- cell 5.1 with automatic span to rigth end - cell 5.1 with automatic span to right end
* - row 6 * - row 6
- cell 6.1 - cell 6.1

View file

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

View file

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

View file

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

View file

@ -152,6 +152,16 @@ def wikipedia(query, lang):
return [] 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 = { backends = {
'dbpedia': dbpedia, 'dbpedia': dbpedia,
'duckduckgo': duckduckgo, 'duckduckgo': duckduckgo,
@ -162,6 +172,7 @@ backends = {
'qwant': qwant, 'qwant': qwant,
'wikipedia': wikipedia, 'wikipedia': wikipedia,
'brave': brave, '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" "name": "Bahasa Banjar"
}, },
"blk": { "blk": {
"english_name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f", "english_name": "Pa'O",
"name": "Pa'O" "name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f"
}, },
"bm": { "bm": {
"english_name": "Bambara", "english_name": "Bambara",
@ -2661,6 +2661,10 @@
"english_name": "Picard", "english_name": "Picard",
"name": "Picard" "name": "Picard"
}, },
"pcm": {
"english_name": "Nigerian Pidgin",
"name": "Naij\u00e1"
},
"pdc": { "pdc": {
"english_name": "Pennsylvania German", "english_name": "Pennsylvania German",
"name": "Deitsch" "name": "Deitsch"
@ -3208,8 +3212,8 @@
"name": "Bahasa Banjar" "name": "Bahasa Banjar"
}, },
"blk": { "blk": {
"english_name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f", "english_name": "Pa'O",
"name": "Pa'O" "name": "\u1015\u1021\u102d\u102f\u101d\u103a\u108f\u1018\u102c\u108f\u101e\u102c\u108f"
}, },
"bm": { "bm": {
"english_name": "Bambara", "english_name": "Bambara",
@ -3931,6 +3935,10 @@
"english_name": "Picard", "english_name": "Picard",
"name": "Picard" "name": "Picard"
}, },
"pcm": {
"english_name": "Nigerian Pidgin",
"name": "Naij\u00e1"
},
"pdc": { "pdc": {
"english_name": "Pennsylvania German", "english_name": "Pennsylvania German",
"name": "Deitsch" "name": "Deitsch"

File diff suppressed because it is too large Load diff

View file

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

View file

@ -214,6 +214,20 @@
"Q110742003": "dppx", "Q110742003": "dppx",
"Q1131660": "st", "Q1131660": "st",
"Q1137675": "cr", "Q1137675": "cr",
"Q114002440": "𒄀",
"Q114002534": "𒃻",
"Q114002568": "𒂠",
"Q114002639": "𒈨𒊑",
"Q114002688": "𒋗𒋛",
"Q114002734": "𒊺",
"Q114002796": "𒂆",
"Q114002897": "𒊬",
"Q114002930": "𒀺",
"Q114002955": "𒀹𒃷",
"Q114002974": "𒃷",
"Q114002998": "𒁓",
"Q114018694": "𒄥",
"Q114018781": "𒁀𒌷𒂵",
"Q1140444": "Zb", "Q1140444": "Zb",
"Q1140577": "Yb", "Q1140577": "Yb",
"Q1152074": "Pb", "Q1152074": "Pb",
@ -255,6 +269,7 @@
"Q1322380": "Ts", "Q1322380": "Ts",
"Q1323615": "oz t", "Q1323615": "oz t",
"Q132643": "kr", "Q132643": "kr",
"Q133011": "Ls",
"Q13400897": "g", "Q13400897": "g",
"Q13479685": "mm H2O", "Q13479685": "mm H2O",
"Q1351253": "Eib", "Q1351253": "Eib",
@ -350,6 +365,7 @@
"Q194339": "B$", "Q194339": "B$",
"Q1970718": "mam", "Q1970718": "mam",
"Q1972579": "pdl", "Q1972579": "pdl",
"Q19877834": "cd-ft",
"Q199462": "LE", "Q199462": "LE",
"Q199471": "Afs", "Q199471": "Afs",
"Q200323": "dm", "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 engine_shortcuts[engine.shortcut] = engine.name
:meta hide-value:
""" """
@ -274,12 +275,12 @@ def is_engine_active(engine: Engine):
def register_engine(engine: Engine): def register_engine(engine: Engine):
if engine.name in engines: 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) sys.exit(1)
engines[engine.name] = engine engines[engine.name] = engine
if engine.shortcut in engine_shortcuts: 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) sys.exit(1)
engine_shortcuts[engine.shortcut] = engine.name 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) ArXiV (Scientific preprints)
""" """
from lxml import html from lxml import etree
from lxml.etree import XPath
from datetime import datetime 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
about = { about = {
@ -17,7 +18,7 @@ about = {
"results": 'XML-RSS', "results": 'XML-RSS',
} }
categories = ['science'] categories = ['science', 'scientific publications']
paging = True paging = True
base_url = ( base_url = (
@ -27,6 +28,23 @@ base_url = (
# engine dependent config # engine dependent config
number_of_results = 10 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): def request(query, params):
# basic search # basic search
@ -41,30 +59,50 @@ def request(query, params):
def response(resp): def response(resp):
results = [] 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'): authors = [author.text for author in eval_xpath_list(entry, xpath_author_name)]
title = eval_xpath_getindex(entry, './/title', 0).text
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 # tags
doi_element = eval_xpath_getindex(entry, './/link[@title="doi"]', 0, default=None) tag_elements = eval_xpath(entry, xpath_category)
doi_content = doi_element.text if doi_element is not None else '' tags = [str(tag) for tag in tag_elements]
content = content_string.format(doi_content=doi_content, abstract_content=abstract)
if len(content) > 300: # comments
content = content[0:300] + "..." comments_elements = eval_xpath_getindex(entry, xpath_comment, 0, default=None)
# TODO: center snippet on query term 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) results.append(res_dict)

View file

@ -80,7 +80,7 @@ def response(resp):
dom = html.fromstring(resp.text) 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]) metadata = loads(result.xpath('.//div[@class="vrhdata"]/@vrhm')[0])
info = ' - '.join(result.xpath('.//div[@class="mc_vtvc_meta_block"]//span/text()')).strip() info = ' - '.join(result.xpath('.//div[@class="mc_vtvc_meta_block"]//span/text()')).strip()
content = '{0} - {1}'.format(metadata['du'], info) content = '{0} - {1}'.format(metadata['du'], info)

View file

@ -4,7 +4,6 @@
""" """
from json import loads
from datetime import datetime from datetime import datetime
from urllib.parse import urlencode from urllib.parse import urlencode
@ -19,7 +18,7 @@ about = {
"results": 'JSON', "results": 'JSON',
} }
categories = ['science'] categories = ['science', 'scientific publications']
paging = True paging = True
nb_per_page = 10 nb_per_page = 10
@ -42,39 +41,75 @@ def request(query, params):
) )
params['url'] = base_url + search_path params['url'] = base_url + search_path
logger.debug("query_url --> %s", params['url'])
return params return params
def response(resp): def response(resp):
results = [] results = []
json_data = loads(resp.text) json_data = resp.json()
for result in json_data['data']: for result in json_data['data']:
source = result['_source'] 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'] time = source['publishedDate'] or source['depositedDate']
if time: if time:
date = datetime.fromtimestamp(time / 1000) publishedDate = datetime.fromtimestamp(time / 1000)
else:
date = None
metadata = [] # sometimes the 'title' is None / filter None values
if source['publisher'] and len(source['publisher']) > 3: journals = [j['title'] for j in (source.get('journals') or []) if j['title']]
metadata.append(source['publisher'])
if source['topics']: publisher = source['publisher']
metadata.append(source['topics'][0]) if publisher:
if source['doi']: publisher = source['publisher'].strip("'")
metadata.append(source['doi'])
metadata = ' / '.join(metadata)
results.append( results.append(
{ {
'url': source['urls'][0].replace('http://', 'https://', 1), 'template': 'paper.html',
'title': source['title'], 'title': source['title'],
'content': source['description'], 'url': url,
'publishedDate': date, 'content': source['description'] or '',
'metadata': metadata, # '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 # * book / performing art / film / television / media franchise / concert tour / playwright
# * prepared food # * prepared food
# * website / software / os / programming language / file format / software engineer # * website / software / os / programming language / file format / software engineer
# * compagny # * company
content = '' content = ''
heading = search_res.get('Heading', '') 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 urllib.parse import quote, urljoin
from lxml import html from lxml import html
from searx.utils import extract_text, eval_xpath, eval_xpath_list, eval_xpath_getindex from searx.utils import extract_text, eval_xpath, eval_xpath_list, eval_xpath_getindex
from searx.network import raise_for_httperror
# about # about
about = { about = {
@ -47,6 +48,7 @@ def request(query, params):
# after the last page of results, spelling corrections are returned after a HTTP redirect # after the last page of results, spelling corrections are returned after a HTTP redirect
# whatever the page number is # whatever the page number is
params['soft_max_redirects'] = 1 params['soft_max_redirects'] = 1
params['raise_for_httperror'] = False
return params return params
@ -56,6 +58,11 @@ def response(resp):
''' '''
results = [] results = []
if resp.status_code == 404:
return results
raise_for_httperror(resp)
dom = html.fromstring(resp.text) dom = html.fromstring(resp.text)
number_of_results_element = eval_xpath_getindex( number_of_results_element = eval_xpath_getindex(

View file

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

View file

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

View file

@ -1,28 +1,20 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint # 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 - JSON (_fmt:json)
``data:`` scheme):: - 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
from urllib.parse import urlencode, unquote from json import loads
from lxml import html
from searx.utils import (
eval_xpath,
eval_xpath_list,
eval_xpath_getindex,
extract_text,
)
from searx.engines.google import ( from searx.engines.google import (
get_lang_info, get_lang_info,
@ -42,12 +34,12 @@ about = {
"official_api_documentation": 'https://developers.google.com/custom-search', "official_api_documentation": 'https://developers.google.com/custom-search',
"use_official_api": False, "use_official_api": False,
"require_api_key": False, "require_api_key": False,
"results": 'HTML', "results": 'JSON',
} }
# engine dependent config # engine dependent config
categories = ['images', 'web'] categories = ['images', 'web']
paging = False paging = True
use_locale_domain = True use_locale_domain = True
time_range_support = True time_range_support = True
safesearch = True safesearch = True
@ -56,74 +48,8 @@ send_accept_language_header = True
filter_mapping = {0: 'images', 1: 'active', 2: 'active'} 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): def request(query, params):
"""Google-Video search request""" """Google-Image search request"""
lang_info = get_lang_info(params, supported_languages, language_aliases, False) lang_info = get_lang_info(params, supported_languages, language_aliases, False)
@ -132,7 +58,17 @@ def request(query, params):
+ lang_info['subdomain'] + lang_info['subdomain']
+ '/search' + '/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: if params['time_range'] in time_range_dict:
@ -141,9 +77,9 @@ def request(query, params):
query_url += '&' + urlencode({'safe': filter_mapping[params['safesearch']]}) query_url += '&' + urlencode({'safe': filter_mapping[params['safesearch']]})
params['url'] = query_url params['url'] = query_url
params['cookies']['CONSENT'] = "YES+"
params['headers'].update(lang_info['headers']) 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 return params
@ -153,78 +89,34 @@ def response(resp):
detect_google_sorry(resp) detect_google_sorry(resp)
# convert the text to dom json_start = resp.text.find('{"ischj":')
dom = html.fromstring(resp.text) json_data = loads(resp.text[json_start:])
img_bas64_map = scrap_out_thumbs(dom)
data_id_to_img_url = parse_urls_img_from_js(dom)
# parse results for item in json_data["ischj"]["metadata"]:
#
# 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>
root = eval_xpath(dom, '//div[@id="islmp"]') result_item = {
if not root: 'url': item["result"]["referrer_url"],
logger.error("did not find root element id='islmp'") 'title': item["result"]["page_title"],
return results '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] author = item["result"].get('iptc', {}).get('creator')
for img_node in eval_xpath_list(root, './/img[contains(@class, "rg_i")]'): 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') file_size = item.get('gsa', {}).get('file_size')
if img_base64_id: if file_size:
img_base64_id = img_base64_id[0] result_item['source'] += ' (%s)' % file_size
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 = ''
link_node = eval_xpath_getindex(img_node, '../../../a[2]', 0) results.append(result_item)
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',
}
)
return results return results

View file

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

View file

@ -13,10 +13,12 @@ Definitions`_.
from urllib.parse import urlencode from urllib.parse import urlencode
from datetime import datetime from datetime import datetime
from typing import Optional
from lxml import html from lxml import html
from searx.utils import ( from searx.utils import (
eval_xpath, eval_xpath,
eval_xpath_getindex,
eval_xpath_list, eval_xpath_list,
extract_text, extract_text,
) )
@ -46,7 +48,7 @@ about = {
} }
# engine dependent config # engine dependent config
categories = ['science'] categories = ['science', 'scientific publications']
paging = True paging = True
language_support = True language_support = True
use_locale_domain = True use_locale_domain = True
@ -99,7 +101,43 @@ def request(query, params):
return 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""" """Get response from google's search request"""
results = [] results = []
@ -112,30 +150,53 @@ def response(resp):
dom = html.fromstring(resp.text) dom = html.fromstring(resp.text)
# parse results # 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: if not title:
# this is a [ZITATION] block # this is a [ZITATION] block
continue 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"]')) pub_type = extract_text(eval_xpath(result, './/span[@class="gs_ct1"]'))
if pub_type: 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( results.append(
{ {
'template': 'paper.html',
'type': pub_type,
'url': url, 'url': url,
'title': title, 'title': title,
'authors': authors,
'publisher': publisher,
'journal': journal,
'publishedDate': publishedDate,
'content': content, 'content': content,
'comments': comments,
'html_url': html_url,
'pdf_url': pdf_url,
} }
) )

View file

@ -150,7 +150,7 @@ def response(resp):
# ignore google *sections* # ignore google *sections*
if extract_text(eval_xpath(result, g_section_with_header)): 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 continue
# ingnore articles without an image id / e.g. news articles # 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': elif properties.get('osm_type') == 'R':
osm_type = 'relation' osm_type = 'relation'
else: else:
# continue if invalide osm-type # continue if invalid osm-type
continue continue
url = result_base_url.format(osm_type=osm_type, osm_id=properties.get('osm_id')) url = result_base_url.format(osm_type=osm_type, osm_id=properties.get('osm_id'))

View file

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

View file

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

View file

@ -19,7 +19,7 @@ about = {
"results": 'JSON', "results": 'JSON',
} }
categories = ['science'] categories = ['science', 'scientific publications']
paging = True paging = True
nb_per_page = 10 nb_per_page = 10
api_key = 'unset' api_key = 'unset'
@ -41,32 +41,32 @@ def response(resp):
json_data = loads(resp.text) json_data = loads(resp.text)
for record in json_data['records']: 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') published = datetime.strptime(record['publicationDate'], '%Y-%m-%d')
authors = [" ".join(author['creator'].split(', ')[::-1]) for author in record['creators']]
metadata = [ tags = record.get('genre')
record[x] if isinstance(tags, str):
for x in [ tags = [tags]
'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
results.append( results.append(
{ {
'title': record['title'], 'template': 'paper.html',
'url': record['url'][0]['value'].replace('http://', 'https://', 1), 'url': record['url'][0]['value'].replace('http://', 'https://', 1),
'content': content, 'title': record['title'],
'content': record['abstract'],
'comments': record['publicationName'],
'tags': tags,
'publishedDate': published, '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 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, # native name, the English name of the writing script used by the language,
# or occasionally something else entirely. # 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 = { language_names = {
'english_uk': 'en-GB', 'english_uk': 'en-GB',
'fantizhengwen': ['zh-TW', 'zh-HK'], '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 # 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://en.wikibooks.org/wiki/SPARQL/WIKIDATA_Precision,_Units_and_Coordinates
# https://www.mediawiki.org/wiki/Wikibase/Indexing/RDF_Dump_Format#Data_model # 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://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/query_optimization
# * https://github.com/blazegraph/database/wiki/QueryHints # * https://github.com/blazegraph/database/wiki/QueryHints
QUERY_TEMPLATE = """ QUERY_TEMPLATE = """
@ -386,7 +386,7 @@ def get_attributes(language):
add_amount('P2046') # area add_amount('P2046') # area
add_amount('P281') # postal code add_amount('P281') # postal code
add_label('P38') # currency add_label('P38') # currency
add_amount('P2048') # heigth (building) add_amount('P2048') # height (building)
# Media # Media
for p in [ for p in [

View file

@ -50,7 +50,7 @@ def request(query, params):
# replace private user area characters to make text legible # replace private user area characters to make text legible
def replace_pua_chars(text): def replace_pua_chars(text):
pua_chars = { pua_chars = {
'\uf522': '\u2192', # rigth arrow '\uf522': '\u2192', # right arrow
'\uf7b1': '\u2115', # set of natural numbers '\uf7b1': '\u2115', # set of natural numbers
'\uf7b4': '\u211a', # set of rational numbers '\uf7b4': '\u211a', # set of rational numbers
'\uf7b5': '\u211d', # set of real 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 lxml import html
from searx.utils import extract_text, extract_url, eval_xpath, eval_xpath_list from searx.utils import extract_text, extract_url, eval_xpath, eval_xpath_list
from searx.network import raise_for_httperror
search_url = None search_url = None
""" """
@ -52,7 +53,7 @@ Replacements are:
0: none, 1: moderate, 2:strict 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. 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 soft_max_redirects = 0
'''Maximum redirects, soft limit. Record an error but don't stop the engine''' '''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 = '&hours={time_range_val}'
'''Time range URL parameter in the in :py:obj:`search_url`. If no time range is '''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`. ``{time_range_val}`` replacement is taken from the :py:obj:`time_range_map`.
.. code:: yaml .. code:: yaml
@ -177,11 +186,18 @@ def request(query, params):
params['url'] = search_url.format(**fargs) params['url'] = search_url.format(**fargs)
params['soft_max_redirects'] = soft_max_redirects params['soft_max_redirects'] = soft_max_redirects
params['raise_for_httperror'] = False
return params return params
def response(resp): def response(resp): # pylint: disable=too-many-branches
'''Scrap *results* from the response (see :ref:`engine results`).''' '''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 = [] results = []
dom = html.fromstring(resp.text) dom = html.fromstring(resp.text)
is_onion = 'onions' in categories is_onion = 'onions' in categories

View file

@ -1,5 +1,6 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
from urllib.parse import quote_plus
from searx.data import EXTERNAL_BANGS from searx.data import EXTERNAL_BANGS
LEAF_KEY = chr(16) 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): def resolve_bang_definition(bang_definition, query):
url, rank = bang_definition.split(chr(1)) url, rank = bang_definition.split(chr(1))
url = url.replace(chr(2), query) url = url.replace(chr(2), quote_plus(query))
if url.startswith('//'): if url.startswith('//'):
url = 'https:' + url url = 'https:' + url
rank = int(rank) if len(rank) > 0 else 0 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. """Return an external URL or None if url_id is not found.
url_id can take value from data/external_urls.json 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. 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 = {} LOCALE_NAMES = {}
"""Mapping of locales and their description. Locales e.g. 'fr' or 'pt-BR' (see """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() RTL_LOCALES: Set[str] = set()
"""List of *Right-To-Left* locales e.g. 'he' or 'fa-IR' (see """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``. ``searxng_locale``.
Argument ``engine_locales`` is a python dict that maps *SearXNG locales* to Argument ``engine_locales`` is a python dict that maps *SearXNG locales* to
corresponding *engine locales*: corresponding *engine locales*::
<engine>: { <engine>: {
# SearXNG string : engine-string # 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='-') locale = babel.Locale.parse(searxng_locale, sep='-')
except babel.core.UnknownLocaleError: except babel.core.UnknownLocaleError:
try: try:
locale = babel.Locale.parse(searxng_locale.split('-')[1]) locale = babel.Locale.parse(searxng_locale.split('-')[0])
except babel.core.UnknownLocaleError: except babel.core.UnknownLocaleError:
return default return default
@ -252,8 +255,12 @@ def get_engine_locale(searxng_locale, engine_locales, default=None):
terr_lang_dict[territory] = langs.get(searxng_lang) terr_lang_dict[territory] = langs.get(searxng_lang)
# first: check fr-FR, de-DE .. is supported by the engine # first: check fr-FR, de-DE .. is supported by the engine
# exception: 'en' --> 'en-US'
territory = locale.language.upper() territory = locale.language.upper()
if territory == 'EN':
territory = 'US'
if terr_lang_dict.get(territory): if terr_lang_dict.get(territory):
searxng_locale = locale.language + '-' + territory searxng_locale = locale.language + '-' + territory
engine_locale = engine_locales.get(searxng_locale) engine_locale = engine_locales.get(searxng_locale)

View file

@ -67,7 +67,7 @@ def is_accepted_request() -> bool:
return False return False
accept_encoding_list = [l.strip() for l in request.headers.get('Accept-Encoding', '').split(',')] 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 logger.debug("suspicious Accept-Encoding") # pylint: disable=undefined-variable
return False return False

View file

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

View file

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

View file

@ -52,7 +52,7 @@ class Setting:
return self.value return self.value
def save(self, name: str, resp: flask.Response): 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.""" If needed, its overwritten in the inheritance."""
resp.set_cookie(name, self.value, max_age=COOKIE_MAX_AGE) resp.set_cookie(name, self.value, max_age=COOKIE_MAX_AGE)
@ -113,7 +113,7 @@ class MultipleChoiceSetting(Setting):
self.value.append(choice) self.value.append(choice)
def save(self, name: str, resp: flask.Response): 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) resp.set_cookie(name, ','.join(self.value), max_age=COOKIE_MAX_AGE)
@ -146,7 +146,7 @@ class SetSetting(Setting):
self.values = set(elements) self.values = set(elements)
def save(self, name: str, resp: flask.Response): 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) 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 self.key = data # pylint: disable=attribute-defined-outside-init
def save(self, name: str, resp: flask.Response): 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'): if hasattr(self, 'key'):
resp.set_cookie(name, self.key, max_age=COOKIE_MAX_AGE) 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) return (k for k, v in self.choices.items() if not v)
def save(self, resp: flask.Response): 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]) 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]) 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) 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 return ret_val
def save(self, resp: flask.Response): 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(): for user_setting_name, user_setting in self.key_value_settings.items():
# pylint: disable=unnecessary-dict-index-lookup # pylint: disable=unnecessary-dict-index-lookup
if self.key_value_settings[user_setting_name].locked: 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')) self.raw_text_query.enginerefs.append(EngineRef(value, 'none'))
return True return True
# check if prefix is equal with categorie name # check if prefix is equal with category name
if value in categories: if value in categories:
# using all engines for that search, which # 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( self.raw_text_query.enginerefs.extend(
EngineRef(engine.name, value) EngineRef(engine.name, value)
for engine in categories[value] for engine in categories[value]
@ -219,7 +219,7 @@ class BangParser(QueryPartParser):
self._add_autocomplete(first_char + suggestion) self._add_autocomplete(first_char + suggestion)
return return
# check if query starts with categorie name # check if query starts with category name
for category in categories: for category in categories:
if category.startswith(value): if category.startswith(value):
self._add_autocomplete(first_char + category.replace(' ', '_')) self._add_autocomplete(first_char + category.replace(' ', '_'))
@ -311,7 +311,7 @@ class RawTextQuery:
def getFullQuery(self): def getFullQuery(self):
""" """
get full querry including whitespaces get full query including whitespaces
""" """
return '{0} {1}'.format(' '.join(self.query_parts), self.getQuery()).strip() 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'): if hasattr(engines[result_engine], 'weight'):
weight *= float(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): class Timing(NamedTuple):
@ -286,7 +286,7 @@ class ResultContainer:
if 'template' not in result: if 'template' not in result:
result['template'] = 'default.html' result['template'] = 'default.html'
# strip multiple spaces and cariage returns from content # strip multiple spaces and carriage returns from content
if result.get('content'): if result.get('content'):
result['content'] = WHITESPACE_REGEX.sub(' ', result['content']) result['content'] = WHITESPACE_REGEX.sub(' ', result['content'])
@ -315,7 +315,7 @@ class ResultContainer:
return merged_result return merged_result
else: else:
# it's an image # 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', ''): if result.get('img_src', '') == merged_result.get('img_src', ''):
return merged_result return merged_result
return None 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') stderr.write(f'{BOLD_SEQ}Engine {name:30}{RESET_SEQ}Checking\n')
checker = searx.search.checker.Checker(processor) checker = searx.search.checker.Checker(processor)
checker.run() 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') stdout.write(f'{BOLD_SEQ}Engine {name:30}{RESET_SEQ}{GREEN}OK{RESET_SEQ}\n')
if verbose: if verbose:
stdout.write(f' {"found languages":15}: {" ".join(sorted(list(checker.test_results.languages)))}\n') 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) logger.debug('Checking %s engine', name)
checker = Checker(processor) checker = Checker(processor)
checker.run() checker.run()
if checker.test_results.succesfull: if checker.test_results.successful:
result['engines'][name] = {'success': True} result['engines'][name] = {'success': True}
else: else:
result['engines'][name] = {'success': False, 'errors': checker.test_results.errors} result['engines'][name] = {'success': False, 'errors': checker.test_results.errors}

View file

@ -174,7 +174,7 @@ class TestResults:
self.languages.add(language) self.languages.add(language)
@property @property
def succesfull(self): def successful(self):
return len(self.errors) == 0 return len(self.errors) == 0
def __iter__(self): def __iter__(self):
@ -317,7 +317,7 @@ class ResultContainerTests:
self._record_error('No result') self._record_error('No result')
def one_title_contains(self, title: str): 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() title = title.lower()
for result in self.result_container.get_ordered_results(): for result in self.result_container.get_ordered_results():
if title in result['title'].lower(): if title in result['title'].lower():

View file

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

View file

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

View file

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

View file

@ -9,6 +9,7 @@ import numbers
import errno import errno
import os import os
import logging import logging
from base64 import b64decode
from os.path import dirname, abspath from os.path import dirname, abspath
from searx.languages import language_codes as languages from searx.languages import language_codes as languages
@ -41,16 +42,6 @@ STR_TO_BOOL = {
} }
_UNDEFINED = object() _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: class SettingsValue:
"""Check and update a setting value""" """Check and update a setting value"""
@ -117,6 +108,15 @@ class SettingsDirectoryValue(SettingsValue):
return super().__call__(value) 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): def apply_schema(settings, schema, path_list):
error = False error = False
for key, value in schema.items(): for key, value in schema.items():
@ -190,6 +190,7 @@ SCHEMA = {
'advanced_search': SettingsValue(bool, False), 'advanced_search': SettingsValue(bool, False),
'query_in_title': SettingsValue(bool, False), 'query_in_title': SettingsValue(bool, False),
'infinite_scroll': SettingsValue(bool, False), 'infinite_scroll': SettingsValue(bool, False),
'cache_url': SettingsValue(str, 'https://web.archive.org/web/'),
}, },
'preferences': { 'preferences': {
'lock': SettingsValue(list, []), 'lock': SettingsValue(list, []),
@ -215,6 +216,11 @@ SCHEMA = {
'extra_proxy_timeout': SettingsValue(int, 0), 'extra_proxy_timeout': SettingsValue(int, 0),
'networks': {}, 'networks': {},
}, },
'result_proxy': {
'url': SettingsValue((None, str), None),
'key': SettingsBytesValue((None, bytes), None),
'proxify_results': SettingsValue(bool, False),
},
'plugins': SettingsValue(list, []), 'plugins': SettingsValue(list, []),
'enabled_plugins': SettingsValue((None, list), None), 'enabled_plugins': SettingsValue((None, list), None),
'checker': { 'checker': {
@ -227,11 +233,5 @@ SCHEMA = {
def settings_set_defaults(settings): 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, []) apply_schema(settings, SCHEMA, [])
return settings return settings

View file

@ -1,5 +1,6 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
from typing import Optional
from os import environ from os import environ
from os.path import dirname, join, abspath, isfile from os.path import dirname, join, abspath, isfile
from collections.abc import Mapping from collections.abc import Mapping
@ -13,7 +14,7 @@ from searx.exceptions import SearxSettingsException
searx_dir = abspath(dirname(__file__)) 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): if isfile(file_name):
return file_name return file_name
return None return None
@ -30,29 +31,29 @@ def load_yaml(file_name):
def get_default_settings_path(): 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(): def get_user_settings_path() -> Optional[str]:
# find location of settings.yml """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 'SEARXNG_SETTINGS_PATH' in environ:
# if possible set path to settings using the return existing_filename_or_none(environ['SEARXNG_SETTINGS_PATH'])
# enviroment variable SEARXNG_SETTINGS_PATH
return check_settings_yml(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'): if environ.get('SEARXNG_DISABLE_ETC_SETTINGS', '').lower() in ('1', 'true'):
return None return None
# if not, get it from searx code base or last solution from /etc/searxng # check /etc/searxng/settings.yml
try: # (continue with other locations if the file is not found)
return check_settings_yml('/etc/searxng/settings.yml') return existing_filename_or_none('/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
def update_dict(default_dict, user_dict): 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') 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() default_settings_path = get_default_settings_path()
user_settings_path = get_user_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 # no user settings
return (load_yaml(default_settings_path), 'load the default settings from {}'.format(default_settings_path)) 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) update_settings(default_settings, user_settings)
return ( return (
default_settings, 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 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", "ionicons": "^6.0.2",
"less": "^4.1.3", "less": "^4.1.3",
"less-plugin-clean-css": "^1.5.1", "less-plugin-clean-css": "^1.5.1",
"sharp": "^0.30.6", "sharp": "^0.31.0",
"stylelint": "^13.13.1", "stylelint": "^13.13.1",
"stylelint-config-standard": "^22.0.0", "stylelint-config-standard": "^22.0.0",
"ejs": "^3.1.8", "ejs": "^3.1.8",

View file

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

View file

@ -68,6 +68,43 @@
}, "#" + qinput_id); }, "#" + 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')) { if (!isMobile && document.querySelector('.index_endpoint')) {
qinput.focus(); 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 { .template_group_images {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
@ -955,6 +998,28 @@ article[data-vim-selected].category-social {
border: none !important; border: none !important;
background-color: var(--color-sidebar-background); 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 %}> <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> <head>
<meta charset="UTF-8" /> <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="keywords" content="SearXNG, search, search engine, metasearch, meta search">
<meta name="generator" content="searxng/{{ searx_version }}"> <meta name="generator" content="searxng/{{ searx_version }}">
<meta name="referrer" content="no-referrer"> <meta name="referrer" content="no-referrer">
@ -61,10 +61,10 @@
</main> </main>
<footer> <footer>
<p> <p>
{{ _('Powered by') }} <a href="{{ url_for('info', pagename='about') }}">searxng</a> - {{ searx_version }} — {{ _('a privacy-respecting, hackable metasearch engine') }}<br/> {{ _('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="{{ searx_git_url }}">{{ _('Source code') }}</a>
<a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a> | | <a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a>
<a href="{{ url_for('stats') }}">{{ _('Engine stats') }}</a> {% if enable_metrics %}| <a href="{{ url_for('stats') }}">{{ _('Engine stats') }}</a>{% endif %}
{% if get_setting('brand.public_instances') %} {% if get_setting('brand.public_instances') %}
| <a href="{{ get_setting('brand.public_instances') }}">{{ _('Public instances') }}</a> | <a href="{{ get_setting('brand.public_instances') }}">{{ _('Public instances') }}</a>
{% endif %} {% endif %}

View file

@ -42,7 +42,7 @@
{%- macro result_sub_footer(result, proxify) -%} {%- macro result_sub_footer(result, proxify) -%}
<div class="engines"> <div class="engines">
{% for engine in result.engines %}<span>{{ engine }}</span>{% endfor %} {% 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>{{- '' -}}
<div class="break"></div>{{- '' -}} <div class="break"></div>{{- '' -}}
{%- endmacro -%} {%- endmacro -%}

View file

@ -261,7 +261,7 @@
<option value="GET" {% if method == 'GET' %}selected="selected"{% endif %}>GET</option> <option value="GET" {% if method == 'GET' %}selected="selected"{% endif %}>GET</option>
</select> </select>
</p> </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> </fieldset>
{% endif %} {% endif %}
{% if 'image_proxy' not in locked_preferences %} {% if 'image_proxy' not in locked_preferences %}
@ -310,9 +310,9 @@
<th>{{ _("Supports selected language") }}</th>{{- "" -}} <th>{{ _("Supports selected language") }}</th>{{- "" -}}
<th>{{ _("SafeSearch") }}</th>{{- "" -}} <th>{{ _("SafeSearch") }}</th>{{- "" -}}
<th>{{ _("Time range") }}</th>{{- "" -}} <th>{{ _("Time range") }}</th>{{- "" -}}
<th>{{ _("Response time") }}</th>{{- "" -}} {%- if enable_metrics %}<th>{{ _("Response time") }}</th>{% endif -%}
<th>{{ _("Max time") }}</th>{{- "" -}} <th>{{ _("Max time") }}</th>{{- "" -}}
<th>{{ _("Reliability") }}</th>{{- "" -}} {%- if enable_metrics %}<th>{{ _("Reliability") }}</th>{% endif -%}
</tr> </tr>
{% for group, engines in engines_by_category[categ] | group_engines_in_tab %} {% for group, engines in engines_by_category[categ] | group_engines_in_tab %}
{% if loop.length > 1 %} {% 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]['supports_selected_language'], true) }}</td>{{- "" -}}
<td>{{ checkbox(None, supports[search_engine.name]['safesearch'], true) }}</td>{{- "" -}} <td>{{ checkbox(None, supports[search_engine.name]['safesearch'], true) }}</td>{{- "" -}}
<td>{{ checkbox(None, supports[search_engine.name]['time_range_support'], 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>{{- "" -}} <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> </tr>
{% endif %} {% endif %}
{% endfor %} {% 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-name"><a href="{{ url_for('stats', engine=engine_stat.name|e) }}">{{ engine_stat.name }}</a></td>
<td class="engine-score"> <td class="engine-score">
{% if engine_stat.score %} {% if engine_stat.score %}
<span aria-labelledby="{{engine_stat.name}}_score" >{{ engine_stat.score|round(1) }}</span> <span>{{ engine_stat.score_per_result|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>
{% endif %} {% endif %}
</td> </td>
<td class="engine-result-count"> <td class="engine-result-count">

View file

@ -1,4 +1,4 @@
# Translations template for PROJECT. # Afrikaans translations for PROJECT.
# Copyright (C) 2022 ORGANIZATION # Copyright (C) 2022 ORGANIZATION
# This file is distributed under the same license as the PROJECT project. # This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2022. # FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
@ -8,17 +8,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n" "POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-08-12 07:18+0000\n" "PO-Revision-Date: 2022-08-19 07:18+0000\n"
"Last-Translator: Edrean Ernst <edrean@allesbeste.com>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Afrikaans <https://weblate.bubu1.eu/projects/searxng/searxng/"
"af/>\n"
"Language: af\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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n" "Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME'] #. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -126,6 +125,11 @@ msgstr "programmatuur wiki's"
msgid "web" msgid "web"
msgstr "web" msgstr "web"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
msgid "auto" msgid "auto"
@ -141,91 +145,91 @@ msgstr "lig"
msgid "dark" msgid "dark"
msgstr "donker" msgstr "donker"
#: searx/webapp.py:165 #: searx/webapp.py:164
msgid "timeout" msgid "timeout"
msgstr "" msgstr "tydsverloop"
#: searx/webapp.py:166 #: searx/webapp.py:165
msgid "parsing error" msgid "parsing error"
msgstr "ontledingsfout" msgstr "ontledingsfout"
#: searx/webapp.py:167 #: searx/webapp.py:166
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "HTTP protokol fout" msgstr "HTTP protokol fout"
#: searx/webapp.py:168 #: searx/webapp.py:167
msgid "network error" msgid "network error"
msgstr "netwerk fout" msgstr "netwerk fout"
#: searx/webapp.py:170 #: searx/webapp.py:169
msgid "unexpected crash" msgid "unexpected crash"
msgstr "onverwagse breek" msgstr "onverwagse breek"
#: searx/webapp.py:177 #: searx/webapp.py:176
msgid "HTTP error" msgid "HTTP error"
msgstr "HTTP fout" msgstr "HTTP fout"
#: searx/webapp.py:178 #: searx/webapp.py:177
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "HTTP koppelingsfout" msgstr "HTTP koppelingsfout"
#: searx/webapp.py:184 #: searx/webapp.py:183
msgid "proxy error" msgid "proxy error"
msgstr "proksie fout" msgstr "proksie fout"
#: searx/webapp.py:185 #: searx/webapp.py:184
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "CAPTCHA" msgstr "CAPTCHA"
#: searx/webapp.py:186 #: searx/webapp.py:185
msgid "too many requests" msgid "too many requests"
msgstr "te veel versoeke" msgstr "te veel versoeke"
#: searx/webapp.py:187 #: searx/webapp.py:186
msgid "access denied" msgid "access denied"
msgstr "toegang geweier" msgstr "toegang geweier"
#: searx/webapp.py:188 #: searx/webapp.py:187
msgid "server API error" msgid "server API error"
msgstr "bediener API fout" msgstr "bediener API fout"
#: searx/webapp.py:363 #: searx/webapp.py:362
msgid "No item found" msgid "No item found"
msgstr "Geen item gevind" msgstr "Geen item gevind"
#: searx/engines/qwant.py:212 #: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source" msgid "Source"
msgstr "Bron" msgstr "Bron"
#: searx/webapp.py:367 #: searx/webapp.py:366
msgid "Error loading the next page" msgid "Error loading the next page"
msgstr "Fout met die laai van die volgende bladsy" 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" msgid "Invalid settings, please edit your preferences"
msgstr "Ongeldige opstellings, redigeer asb jou voorkeure" msgstr "Ongeldige opstellings, redigeer asb jou voorkeure"
#: searx/webapp.py:532 #: searx/webapp.py:534
msgid "Invalid settings" msgid "Invalid settings"
msgstr "Ongeldige opstellings" msgstr "Ongeldige opstellings"
#: searx/webapp.py:609 searx/webapp.py:685 #: searx/webapp.py:611 searx/webapp.py:687
msgid "search error" msgid "search error"
msgstr "soekfout" msgstr "soekfout"
#: searx/webapp.py:731 #: searx/webapp.py:849
msgid "Suspended"
msgstr "Opgehef"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago" msgid "{minutes} minute(s) ago"
msgstr "{minutes} minute terug" msgstr "{minutes} minute terug"
#: searx/webapp.py:733 #: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago" msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} ure, {minutes} minute terug" msgstr "{hours} ure, {minutes} minute terug"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "Opgehef"
#: searx/answerers/random/answerer.py:67 #: searx/answerers/random/answerer.py:67
msgid "Random value generator" msgid "Random value generator"
msgstr "Ewekansige getal genereerder" msgstr "Ewekansige getal genereerder"
@ -254,23 +258,25 @@ msgstr "{title} (VEROUDERD)"
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "Hierdie inskrywing was vervang deur" msgstr "Hierdie inskrywing was vervang deur"
#: searx/engines/pubmed.py:78 #: searx/engines/qwant.py:219
msgid "No abstract is available for this publication."
msgstr "Geen uittreksel is beskikbaar vir hierdie publikasie nie."
#: searx/engines/qwant.py:214
msgid "Channel" msgid "Channel"
msgstr "Kanaal" msgstr "Kanaal"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40 #: searx/engines/tineye.py:40
msgid "" msgid ""
"Could not read that image url. This may be due to an unsupported file " "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" "format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP." " WebP."
msgstr "" msgstr ""
"Kon nie daardie prent url lees nie. Dit mag weens 'n lêer formaat wees wat " "Kon nie daardie prent url lees nie. Dit mag weens 'n lêer formaat wees "
"nie ondersteun is nie. TinEye ondersteun slegs prente wat JPEG, PNG, GIF, " "wat nie ondersteun is nie. TinEye ondersteun slegs prente wat JPEG, PNG, "
"BMP, TIFF of WebP is." "GIF, BMP, TIFF of WebP is."
#: searx/engines/tineye.py:46 #: searx/engines/tineye.py:46
msgid "" msgid ""
@ -278,12 +284,29 @@ msgid ""
" visual detail to successfully identify matches." " visual detail to successfully identify matches."
msgstr "" msgstr ""
"Hierdie prent is te eenvoudig om ooreenkomste te vind. TinEye benodig 'n " "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 #: searx/engines/tineye.py:52
msgid "The image could not be downloaded." msgid "The image could not be downloaded."
msgstr "Die prent kon nie afgelaai word nie." 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 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "" msgstr ""
@ -321,20 +344,20 @@ msgid ""
"Perform search immediately if a category selected. Disable to select " "Perform search immediately if a category selected. Disable to select "
"multiple categories. (JavaScript required)" "multiple categories. (JavaScript required)"
msgstr "" msgstr ""
"Doen soektog onmiddelik indien 'n kategorie geselekteer is. Deaktiveer om " "Doen soektog onmiddelik indien 'n kategorie geselekteer is. Deaktiveer om"
"veelvoudige kategoriee te selekteer. (JavaScript benodig)" " veelvoudige kategoriee te selekteer. (JavaScript benodig)"
#: searx/plugins/self_info.py:20 #: searx/plugins/self_info.py:20
msgid "Self Informations" msgid "Self Information"
msgstr "Eie informasie" msgstr ""
#: searx/plugins/self_info.py:21 #: searx/plugins/self_info.py:21
msgid "" msgid ""
"Displays your IP if the query is \"ip\" and your user agent if the query " "Displays your IP if the query is \"ip\" and your user agent if the query "
"contains \"user agent\"." "contains \"user agent\"."
msgstr "" msgstr ""
"Vertoon jou IP indien die navraag \"ip\" is en jou gebruiker agent indien " "Vertoon jou IP indien die navraag \"ip\" is en jou gebruiker agent indien"
"die navraag \"user agent\" bevat." " die navraag \"user agent\" bevat."
#: searx/plugins/tor_check.py:25 #: searx/plugins/tor_check.py:25
msgid "Tor check plugin" msgid "Tor check plugin"
@ -354,8 +377,8 @@ msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is " "The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable." "unreachable."
msgstr "" msgstr ""
"Die TOR uitgang nodus lys (https://check.torproject.org/exit-addresses) is " "Die TOR uitgang nodus lys (https://check.torproject.org/exit-addresses) "
"nie bereikbaar nie." "is nie bereikbaar nie."
#: searx/plugins/tor_check.py:78 #: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}." msgid "You are using TOR. Your IP address seems to be: {ip_address}."
@ -414,7 +437,7 @@ msgid "Powered by"
msgstr "Aangedryf deur" msgstr "Aangedryf deur"
#: searx/templates/simple/base.html:64 #: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "" msgstr ""
#: searx/templates/simple/base.html:65 #: searx/templates/simple/base.html:65
@ -452,6 +475,7 @@ msgstr "Lengte"
#: searx/templates/simple/macros.html:37 #: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18 #: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author" msgid "Author"
msgstr "Outeur" msgstr "Outeur"
@ -495,17 +519,17 @@ msgid "View error logs and submit a bug report"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:53 #: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67 #: searx/templates/simple/stats.html:64
msgid "Median" msgid "Median"
msgstr "Mediaan" msgstr "Mediaan"
#: searx/templates/simple/preferences.html:54 #: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73 #: searx/templates/simple/stats.html:70
msgid "P80" msgid "P80"
msgstr "P80" msgstr "P80"
#: searx/templates/simple/preferences.html:55 #: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79 #: searx/templates/simple/stats.html:76
msgid "P95" msgid "P95"
msgstr "P95" msgstr "P95"
@ -656,8 +680,8 @@ msgstr "Oneindige blaai"
#: searx/templates/simple/preferences.html:248 #: searx/templates/simple/preferences.html:248
msgid "Automatically load next page when scrolling to bottom of current page" msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "" msgstr ""
"Laai die volgende bladsy outomaties wanneer blaai na die onderkant van die " "Laai die volgende bladsy outomaties wanneer blaai na die onderkant van "
"huidige bladsy" "die huidige bladsy"
#: searx/templates/simple/preferences.html:254 #: searx/templates/simple/preferences.html:254
msgid "Privacy" msgid "Privacy"
@ -669,13 +693,10 @@ msgstr "HTTP Metode"
#: searx/templates/simple/preferences.html:264 #: searx/templates/simple/preferences.html:264
msgid "" msgid ""
"Change how forms are submited, <a " "Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>" " rel=\"external\">learn more about request methods</a>"
msgstr "" 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 #: searx/templates/simple/preferences.html:269
msgid "Image proxy" msgid "Image proxy"
@ -704,8 +725,8 @@ msgid ""
"When enabled, the result page's title contains your query. Your browser " "When enabled, the result page's title contains your query. Your browser "
"can record this title" "can record this title"
msgstr "" msgstr ""
"Wanneer geaktiveer sal die resultaat se bladsy titel jou navraag bevat. Jou " "Wanneer geaktiveer sal die resultaat se bladsy titel jou navraag bevat. "
"blaaier kan hierdie titel opneem" "Jou blaaier kan hierdie titel opneem"
#: searx/templates/simple/preferences.html:294 #: searx/templates/simple/preferences.html:294
msgid "Engines" msgid "Engines"
@ -928,67 +949,63 @@ msgstr ""
msgid "Result count" msgid "Result count"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:38 #: searx/templates/simple/stats.html:59
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
msgid "Total" msgid "Total"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:63 #: searx/templates/simple/stats.html:60
msgid "HTTP" msgid "HTTP"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:64 #: searx/templates/simple/stats.html:61
msgid "Processing" msgid "Processing"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Warnings" msgid "Warnings"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Errors and exceptions" msgid "Errors and exceptions"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:108 #: searx/templates/simple/stats.html:105
msgid "Exception" msgid "Exception"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:110 #: searx/templates/simple/stats.html:107
msgid "Message" msgid "Message"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:112 #: searx/templates/simple/stats.html:109
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:114 #: searx/templates/simple/stats.html:111
msgid "Parameter" msgid "Parameter"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:122 #: searx/templates/simple/stats.html:119
msgid "Filename" msgid "Filename"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:123 #: searx/templates/simple/stats.html:120
msgid "Function" msgid "Function"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:124 #: searx/templates/simple/stats.html:121
msgid "Code" msgid "Code"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:128
msgid "Checker" msgid "Checker"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:134 #: searx/templates/simple/stats.html:131
msgid "Failed test" msgid "Failed test"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:135 #: searx/templates/simple/stats.html:132
msgid "Comment(s)" msgid "Comment(s)"
msgstr "" msgstr ""
@ -1075,6 +1092,50 @@ msgstr ""
msgid "hide map" msgid "hide map"
msgstr "" 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 #: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link" msgid "magnet link"
msgstr "" msgstr ""
@ -1126,3 +1187,27 @@ msgstr ""
#: searx/templates/simple/result_templates/videos.html:6 #: searx/templates/simple/result_templates/videos.html:6
msgid "hide video" msgid "hide video"
msgstr "" 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 # d506c013dc1b502e7a53f91ebcbf8f29_985b4b3, 2017-2018
# Markus Heiser <markus.heiser@darmarit.de>, 2022. # Markus Heiser <markus.heiser@darmarit.de>, 2022.
# ken kailer <kenkailer@yahoo.com>, 2022. # ken kailer <kenkailer@yahoo.com>, 2022.
# George Kashkosh <kash.george@gmail.com>, 2022.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n" "POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-07-19 05:45+0000\n" "PO-Revision-Date: 2022-10-07 07:30+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\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: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=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" "Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME'] #. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -130,6 +132,11 @@ msgstr "الموسوعات التشاركية للبرنامج"
msgid "web" msgid "web"
msgstr "الشبكة العالمية" msgstr "الشبكة العالمية"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr "المنشورات العلمية"
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
msgid "auto" msgid "auto"
@ -145,91 +152,91 @@ msgstr "فاتح"
msgid "dark" msgid "dark"
msgstr "مظلم" msgstr "مظلم"
#: searx/webapp.py:165 #: searx/webapp.py:164
msgid "timeout" msgid "timeout"
msgstr "نفذ الوقت" msgstr "نفذ الوقت"
#: searx/webapp.py:166 #: searx/webapp.py:165
msgid "parsing error" msgid "parsing error"
msgstr "خطأ تحليل" msgstr "خطأ تحليل"
#: searx/webapp.py:167 #: searx/webapp.py:166
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "خطأ في بروتوكول HTTP" msgstr "خطأ في بروتوكول HTTP"
#: searx/webapp.py:168 #: searx/webapp.py:167
msgid "network error" msgid "network error"
msgstr "خطأ في الشبكة" msgstr "خطأ في الشبكة"
#: searx/webapp.py:170 #: searx/webapp.py:169
msgid "unexpected crash" msgid "unexpected crash"
msgstr "تعطل غير متوقع" msgstr "تعطل غير متوقع"
#: searx/webapp.py:177 #: searx/webapp.py:176
msgid "HTTP error" msgid "HTTP error"
msgstr "خطأ HTTP" msgstr "خطأ HTTP"
#: searx/webapp.py:178 #: searx/webapp.py:177
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "خطأ في اتصال HTTP" msgstr "خطأ في اتصال HTTP"
#: searx/webapp.py:184 #: searx/webapp.py:183
msgid "proxy error" msgid "proxy error"
msgstr "خطأ في وكيل البروكسي" msgstr "خطأ في وكيل البروكسي"
#: searx/webapp.py:185 #: searx/webapp.py:184
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "أسئلة التحقق" msgstr "أسئلة التحقق"
#: searx/webapp.py:186 #: searx/webapp.py:185
msgid "too many requests" msgid "too many requests"
msgstr "الكثير من الطلبات" msgstr "الكثير من الطلبات"
#: searx/webapp.py:187 #: searx/webapp.py:186
msgid "access denied" msgid "access denied"
msgstr "الدخول مرفوض" msgstr "الدخول مرفوض"
#: searx/webapp.py:188 #: searx/webapp.py:187
msgid "server API error" msgid "server API error"
msgstr "خطأ في API الخادم" msgstr "خطأ في API الخادم"
#: searx/webapp.py:363 #: searx/webapp.py:362
msgid "No item found" msgid "No item found"
msgstr "تعذر العثور على عناصر" msgstr "تعذر العثور على عناصر"
#: searx/engines/qwant.py:212 #: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source" msgid "Source"
msgstr "المصدر" msgstr "المصدر"
#: searx/webapp.py:367 #: searx/webapp.py:366
msgid "Error loading the next page" 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" msgid "Invalid settings, please edit your preferences"
msgstr "إنّ الإعدادات خاطئة، يرجى تعديل خياراتك" msgstr "إنّ الإعدادات خاطئة، يرجى تعديل خياراتك"
#: searx/webapp.py:532 #: searx/webapp.py:534
msgid "Invalid settings" msgid "Invalid settings"
msgstr "إعدادات غير صالحة" msgstr "إعدادات غير صالحة"
#: searx/webapp.py:609 searx/webapp.py:685 #: searx/webapp.py:611 searx/webapp.py:687
msgid "search error" msgid "search error"
msgstr "خطأ في البحث" msgstr "خطأ في البحث"
#: searx/webapp.py:731 #: searx/webapp.py:849
msgid "Suspended"
msgstr "معلق"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago" msgid "{minutes} minute(s) ago"
msgstr "قبل دقائق" msgstr "قبل دقائق"
#: searx/webapp.py:733 #: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago" msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "قبل {hours} ساعات، {minutes} دقائق" msgstr "قبل {hours} ساعات، {minutes} دقائق"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "معلق"
#: searx/answerers/random/answerer.py:67 #: searx/answerers/random/answerer.py:67
msgid "Random value generator" msgid "Random value generator"
msgstr "مولّد قيمة عشوائية" msgstr "مولّد قيمة عشوائية"
@ -258,34 +265,58 @@ msgstr "{title} (قديما)"
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "هذا الإدخال تم استبداله بـ" msgstr "هذا الإدخال تم استبداله بـ"
#: searx/engines/pubmed.py:78 #: searx/engines/qwant.py:219
msgid "No abstract is available for this publication."
msgstr "لا يوجد ملخص لهذا المنشور"
#: searx/engines/qwant.py:214
msgid "Channel" msgid "Channel"
msgstr "القناة" 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 #: searx/engines/tineye.py:40
msgid "" msgid ""
"Could not read that image url. This may be due to an unsupported file " "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" "format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP." " WebP."
msgstr "" msgstr ""
"تعذر قراءة عنوان url للصورة. قد يكون هذا بسبب تنسيق ملف غير مدعوم. تدعم "
"TinEye فقط الصور بتنسيق JPEG أو PNG أو GIF أو BMP أو TIFF أو WebP."
#: searx/engines/tineye.py:46 #: searx/engines/tineye.py:46
msgid "" msgid ""
"The image is too simple to find matches. TinEye requires a basic level of" "The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches." " visual detail to successfully identify matches."
msgstr "" msgstr ""
"الصورة أبسط من أن تجد مطابقات. يتطلب TinEye مستوى أساسيًا من التفاصيل "
"المرئية لتحديد التطابقات بنجاح."
#: searx/engines/tineye.py:52 #: searx/engines/tineye.py:52
msgid "The image could not be downloaded." 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 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "يحول السلسلة إلى ملخص التجزئة" msgstr "يحول السلسلة إلى ملخص التجزئة."
#: searx/plugins/hash_plugin.py:52 #: searx/plugins/hash_plugin.py:52
msgid "hash digest" msgid "hash digest"
@ -324,8 +355,8 @@ msgstr ""
"ضروريه)" "ضروريه)"
#: searx/plugins/self_info.py:20 #: searx/plugins/self_info.py:20
msgid "Self Informations" msgid "Self Information"
msgstr "معلومات شخصية" msgstr "نشرة المعلومات"
#: searx/plugins/self_info.py:21 #: searx/plugins/self_info.py:21
msgid "" msgid ""
@ -333,31 +364,35 @@ msgid ""
"contains \"user agent\"." "contains \"user agent\"."
msgstr "" msgstr ""
"يعرض IP إذا كان الاستعلام \"ip\" و وكيل المستخدم الخاص بك إذا كان " "يعرض IP إذا كان الاستعلام \"ip\" و وكيل المستخدم الخاص بك إذا كان "
"الاستعلام يحتوي على\"user agent\"" "الاستعلام يحتوي على\"user agent\"."
#: searx/plugins/tor_check.py:25 #: searx/plugins/tor_check.py:25
msgid "Tor check plugin" msgid "Tor check plugin"
msgstr "" msgstr "فحص المكون الإضافي ل Tor"
#: searx/plugins/tor_check.py:28 #: searx/plugins/tor_check.py:28
msgid "" msgid ""
"This plugin checks if the address of the request is a TOR exit node, and " "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." "informs the user if it is, like check.torproject.org but from searxng."
msgstr "" msgstr ""
"يتحقق هذا المكون الإضافي مما إذا كان عنوان الطلب هو عقدة خروج TOR ، ويبلغ"
" المستخدم إذا كان كذلك ، مثل check.torproject.org ولكن من searxng."
#: searx/plugins/tor_check.py:62 #: searx/plugins/tor_check.py:62
msgid "" msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is " "The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable." "unreachable."
msgstr "" msgstr ""
"لا يمكن الوصول إلى قائمة عقدة الخروج TOR (https://check.torproject.org"
"/exit-addresses)."
#: searx/plugins/tor_check.py:78 #: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}." 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 #: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}." 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 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
@ -413,16 +448,16 @@ msgid "Powered by"
msgstr "مدعوم بواسطة" msgstr "مدعوم بواسطة"
#: searx/templates/simple/base.html:64 #: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "محرك بحث يحمي الخصوصية و قابل للتهكير" msgstr "الخصوصية ذو الاعتبار, محرك البحث عميق عُموميا"
#: searx/templates/simple/base.html:65 #: searx/templates/simple/base.html:65
msgid "Source code" msgid "Source code"
msgstr "الكود المصدري" msgstr "شيفرة مصدرية"
#: searx/templates/simple/base.html:66 #: searx/templates/simple/base.html:66
msgid "Issue tracker" msgid "Issue tracker"
msgstr "متتبع القضايا" msgstr "تعقب القضايا"
#: searx/templates/simple/base.html:67 searx/templates/simple/stats.html:18 #: searx/templates/simple/base.html:67 searx/templates/simple/stats.html:18
msgid "Engine stats" msgid "Engine stats"
@ -431,7 +466,7 @@ msgstr "إحصائيات المحرك"
#: searx/templates/simple/base.html:69 #: searx/templates/simple/base.html:69
#: searx/templates/simple/messages/no_results.html:15 #: searx/templates/simple/messages/no_results.html:15
msgid "Public instances" msgid "Public instances"
msgstr "مثيلات الخوادم العمومية" msgstr "نماذج الخوادم العمومية"
#: searx/templates/simple/base.html:72 #: searx/templates/simple/base.html:72
msgid "Privacy policy" msgid "Privacy policy"
@ -439,11 +474,11 @@ msgstr "سياسة الخصوصية"
#: searx/templates/simple/base.html:75 #: searx/templates/simple/base.html:75
msgid "Contact instance maintainer" msgid "Contact instance maintainer"
msgstr "الإتصال بالمشرف على مثيل الخادم" msgstr "اتصال بالمشرف المخدم النموذجي"
#: searx/templates/simple/categories.html:24 #: searx/templates/simple/categories.html:24
msgid "Click on the magnifier to perform search" msgid "Click on the magnifier to perform search"
msgstr "انقر على المكبرة للقيام بالبحث" msgstr "انقر على رمز المكبر للقيام بالبحث"
#: searx/templates/simple/macros.html:36 #: searx/templates/simple/macros.html:36
msgid "Length" msgid "Length"
@ -451,6 +486,7 @@ msgstr "الطول"
#: searx/templates/simple/macros.html:37 #: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18 #: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author" msgid "Author"
msgstr "الكاتب" msgstr "الكاتب"
@ -460,7 +496,7 @@ msgstr "النسخة المخبأة"
#: searx/templates/simple/macros.html:45 #: searx/templates/simple/macros.html:45
msgid "proxied" msgid "proxied"
msgstr "النفاذ عبر البروكسي" msgstr "المخدم البروكسي"
#: searx/templates/simple/new_issue.html:64 #: searx/templates/simple/new_issue.html:64
msgid "Start submiting a new issue on GitHub" msgid "Start submiting a new issue on GitHub"
@ -494,17 +530,17 @@ msgid "View error logs and submit a bug report"
msgstr "عرض سجلات الأخطاء وتقديم تقرير خطأ" msgstr "عرض سجلات الأخطاء وتقديم تقرير خطأ"
#: searx/templates/simple/preferences.html:53 #: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67 #: searx/templates/simple/stats.html:64
msgid "Median" msgid "Median"
msgstr "وسطي" msgstr "وسطي"
#: searx/templates/simple/preferences.html:54 #: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73 #: searx/templates/simple/stats.html:70
msgid "P80" msgid "P80"
msgstr "صفحة 80" msgstr "صفحة 80"
#: searx/templates/simple/preferences.html:55 #: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79 #: searx/templates/simple/stats.html:76
msgid "P95" msgid "P95"
msgstr "صفحة 95" msgstr "صفحة 95"
@ -668,13 +704,10 @@ msgstr "أسلوب HTTP"
#: searx/templates/simple/preferences.html:264 #: searx/templates/simple/preferences.html:264
msgid "" msgid ""
"Change how forms are submited, <a " "Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>" " rel=\"external\">learn more about request methods</a>"
msgstr "" msgstr ""
"تغيير طريقة إرسال النماذج ، <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\"> تعرف على المزيد حول طرق الطلب </a>"
#: searx/templates/simple/preferences.html:269 #: searx/templates/simple/preferences.html:269
msgid "Image proxy" msgid "Image proxy"
@ -719,6 +752,8 @@ msgid ""
"This tab does not show up for search results, but you can search the " "This tab does not show up for search results, but you can search the "
"engines listed here via bangs." "engines listed here via bangs."
msgstr "" msgstr ""
"لا تظهر علامة التبويب هذه في نتائج البحث ، ولكن يمكنك البحث في المحركات "
"المدرجة هنا عبر bangs."
#: searx/templates/simple/preferences.html:307 #: searx/templates/simple/preferences.html:307
#: searx/templates/simple/preferences.html:358 #: searx/templates/simple/preferences.html:358
@ -759,7 +794,7 @@ msgstr "إمكانية الإشتغال"
#: searx/templates/simple/preferences.html:353 #: searx/templates/simple/preferences.html:353
msgid "Special Queries" msgid "Special Queries"
msgstr "" msgstr "استفسارات خاصة"
#: searx/templates/simple/preferences.html:359 #: searx/templates/simple/preferences.html:359
msgid "Keywords" msgid "Keywords"
@ -779,11 +814,11 @@ msgstr "أمثلة"
#: searx/templates/simple/preferences.html:365 #: searx/templates/simple/preferences.html:365
msgid "This is the list of SearXNG's instant answering modules." msgid "This is the list of SearXNG's instant answering modules."
msgstr "" msgstr "هذه قائمة وحدات الرد الفوري في SearXNG."
#: searx/templates/simple/preferences.html:376 #: searx/templates/simple/preferences.html:376
msgid "This is the list of plugins." msgid "This is the list of plugins."
msgstr "" msgstr "هذه قائمة المكونات الإضافية."
#: searx/templates/simple/preferences.html:393 #: searx/templates/simple/preferences.html:393
msgid "Cookies" msgid "Cookies"
@ -794,10 +829,12 @@ msgid ""
"This is the list of cookies and their values SearXNG is storing on your " "This is the list of cookies and their values SearXNG is storing on your "
"computer." "computer."
msgstr "" msgstr ""
"هذه قائمة ملفات تعريف الارتباط وقيمها التي يخزنها SearXNG على جهاز "
"الكمبيوتر الخاص بك."
#: searx/templates/simple/preferences.html:396 #: searx/templates/simple/preferences.html:396
msgid "With that list, you can assess SearXNG transparency." msgid "With that list, you can assess SearXNG transparency."
msgstr "" msgstr "باستخدام هذه القائمة ، يمكنك تقييم شفافية SearXNG."
#: searx/templates/simple/preferences.html:401 #: searx/templates/simple/preferences.html:401
msgid "Cookie name" msgid "Cookie name"
@ -809,35 +846,43 @@ msgstr "القيمة"
#: searx/templates/simple/preferences.html:414 #: searx/templates/simple/preferences.html:414
msgid "Search URL of the currently saved preferences" msgid "Search URL of the currently saved preferences"
msgstr "" msgstr "ابحث عن عنوان URL للتفضيلات المحفوظة حاليًا"
#: searx/templates/simple/preferences.html:418 #: searx/templates/simple/preferences.html:418
msgid "" msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by " "Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites." "leaking data to the clicked result sites."
msgstr "" msgstr ""
"ملاحظة: يمكن أن يؤدي تحديد إعدادات مخصصة في عنوان URL للبحث إلى تقليل "
"الخصوصية عن طريق تسريب البيانات إلى مواقع النتائج التي تم النقر عليها."
#: searx/templates/simple/preferences.html:419 #: searx/templates/simple/preferences.html:419
msgid "URL to restore your preferences in another browser" msgid "URL to restore your preferences in another browser"
msgstr "" msgstr "URL لاستعادة تفضيلاتك في متصفح آخر"
#: searx/templates/simple/preferences.html:423 #: searx/templates/simple/preferences.html:423
msgid "" msgid ""
"Specifying custom settings in the preferences URL can be used to sync " "Specifying custom settings in the preferences URL can be used to sync "
"preferences across devices." "preferences across devices."
msgstr "" msgstr ""
"يمكن استخدام تحديد الإعدادات المخصصة في تفضيلات URL لمزامنة التفضيلات عبر"
" الأجهزة."
#: searx/templates/simple/preferences.html:428 #: searx/templates/simple/preferences.html:428
msgid "" msgid ""
"These settings are stored in your cookies, this allows us not to store " "These settings are stored in your cookies, this allows us not to store "
"this data about you." "this data about you."
msgstr "" msgstr ""
"يتم تخزين هذه الإعدادات في ملفات تعريف الارتباط الخاصة بك ، وهذا يسمح لنا"
" بعدم تخزين هذه البيانات عنك."
#: searx/templates/simple/preferences.html:430 #: searx/templates/simple/preferences.html:430
msgid "" msgid ""
"These cookies serve your sole convenience, we don't use these cookies to " "These cookies serve your sole convenience, we don't use these cookies to "
"track you." "track you."
msgstr "" msgstr ""
"تخدم ملفات تعريف الارتباط هذه راحتك وحدك ، فنحن لا نستخدم ملفات تعريف "
"الارتباط هذه لتتبعك."
#: searx/templates/simple/preferences.html:433 #: searx/templates/simple/preferences.html:433
msgid "Save" msgid "Save"
@ -913,81 +958,77 @@ msgstr "مسح"
#: searx/templates/simple/search.html:11 #: searx/templates/simple/search.html:11
#: searx/templates/simple/simple_search.html:7 #: searx/templates/simple/simple_search.html:7
msgid "search" msgid "search"
msgstr "بحت" msgstr "بحث"
#: searx/templates/simple/stats.html:21 #: searx/templates/simple/stats.html:21
msgid "There is currently no data available. " msgid "There is currently no data available. "
msgstr "لم يتم العثور على أية بيانات بعدُ." msgstr "لم يتم العثور على أية بيانات بعد."
#: searx/templates/simple/stats.html:26 #: searx/templates/simple/stats.html:26
msgid "Scores" msgid "Scores"
msgstr "" msgstr "نتائج"
#: searx/templates/simple/stats.html:27 #: searx/templates/simple/stats.html:27
msgid "Result count" msgid "Result count"
msgstr "نتيجة العد" msgstr "نتيجة العد"
#: searx/templates/simple/stats.html:38 #: searx/templates/simple/stats.html:59
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
msgid "Total" msgid "Total"
msgstr "إجمالي" msgstr "إجمالي"
#: searx/templates/simple/stats.html:63 #: searx/templates/simple/stats.html:60
msgid "HTTP" msgid "HTTP"
msgstr "" msgstr "HTTP"
#: searx/templates/simple/stats.html:64 #: searx/templates/simple/stats.html:61
msgid "Processing" msgid "Processing"
msgstr "" msgstr "يتم المعالجة"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Warnings" msgid "Warnings"
msgstr "تحذيرات" msgstr "تحذيرات"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Errors and exceptions" msgid "Errors and exceptions"
msgstr "" msgstr "الأخطاء والاستثناءات"
#: searx/templates/simple/stats.html:108 #: searx/templates/simple/stats.html:105
msgid "Exception" msgid "Exception"
msgstr "استثناء" msgstr "استثناء"
#: searx/templates/simple/stats.html:110 #: searx/templates/simple/stats.html:107
msgid "Message" msgid "Message"
msgstr "الرسالة" msgstr "الرسالة"
#: searx/templates/simple/stats.html:112 #: searx/templates/simple/stats.html:109
msgid "Percentage" msgid "Percentage"
msgstr "نسبة" msgstr "نسبة"
#: searx/templates/simple/stats.html:114 #: searx/templates/simple/stats.html:111
msgid "Parameter" msgid "Parameter"
msgstr "" msgstr "معامل"
#: searx/templates/simple/stats.html:122 #: searx/templates/simple/stats.html:119
msgid "Filename" msgid "Filename"
msgstr "اسم الملف" msgstr "اسم الملف"
#: searx/templates/simple/stats.html:123 #: searx/templates/simple/stats.html:120
msgid "Function" msgid "Function"
msgstr "" msgstr "وظيفة"
#: searx/templates/simple/stats.html:124 #: searx/templates/simple/stats.html:121
msgid "Code" msgid "Code"
msgstr "كود" msgstr "شفرة"
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:128
msgid "Checker" msgid "Checker"
msgstr "مدقّق" msgstr "مدقّق"
#: searx/templates/simple/stats.html:134 #: searx/templates/simple/stats.html:131
msgid "Failed test" msgid "Failed test"
msgstr "اختبار فاشل" msgstr "اختبار فاشل"
#: searx/templates/simple/stats.html:135 #: searx/templates/simple/stats.html:132
msgid "Comment(s)" msgid "Comment(s)"
msgstr "تعليق/تعليقات" msgstr "تعليق/تعليقات"
@ -997,7 +1038,7 @@ msgstr "في أي وقت"
#: searx/templates/simple/filters/time_range.html:6 #: searx/templates/simple/filters/time_range.html:6
msgid "Last day" msgid "Last day"
msgstr "يوم أمس" msgstr "آخر يوم"
#: searx/templates/simple/filters/time_range.html:9 #: searx/templates/simple/filters/time_range.html:9
msgid "Last week" msgid "Last week"
@ -1052,7 +1093,7 @@ msgstr "إخفاء الوسائط"
#: searx/templates/simple/result_templates/default.html:14 #: searx/templates/simple/result_templates/default.html:14
#: searx/templates/simple/result_templates/videos.html:14 #: searx/templates/simple/result_templates/videos.html:14
msgid "This site did not provide any description." msgid "This site did not provide any description."
msgstr "هذا الموقع لا يتوفر على أي وصف." msgstr "هذا الموقع لم يقدم أي وصف."
#: searx/templates/simple/result_templates/images.html:19 #: searx/templates/simple/result_templates/images.html:19
msgid "Format" msgid "Format"
@ -1078,6 +1119,50 @@ msgstr "عرض الخريطة"
msgid "hide map" msgid "hide map"
msgstr "إخفاء الخريطة" 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 #: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link" msgid "magnet link"
msgstr "رابط ماغنت" msgstr "رابط ماغنت"
@ -1372,3 +1457,25 @@ msgstr "إخفاء الفيديو"
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "التفضيلات" #~ 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>, 2015
# ubone <van_ds_ff@mail.bg>, 2016-2017 # ubone <van_ds_ff@mail.bg>, 2016-2017
# Markus Heiser <markus.heiser@darmarit.de>, 2022. # Markus Heiser <markus.heiser@darmarit.de>, 2022.
# NxOne14 <kiril2315@gmail.com>, 2022.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n" "POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-07-06 00:21+0000\n" "PO-Revision-Date: 2022-09-11 22:50+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: bg\n" "Language: bg\n"
"Language-Team: Bulgarian " "Language-Team: Bulgarian "
@ -127,6 +128,11 @@ msgstr "софтуерни уикита"
msgid "web" msgid "web"
msgstr "мрежа" msgstr "мрежа"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
msgid "auto" msgid "auto"
@ -142,91 +148,91 @@ msgstr "светъл"
msgid "dark" msgid "dark"
msgstr "тъмен" msgstr "тъмен"
#: searx/webapp.py:165 #: searx/webapp.py:164
msgid "timeout" msgid "timeout"
msgstr "изчакване" msgstr "изчакване"
#: searx/webapp.py:166 #: searx/webapp.py:165
msgid "parsing error" msgid "parsing error"
msgstr "грешка при анализа" msgstr "грешка при анализа"
#: searx/webapp.py:167 #: searx/webapp.py:166
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "Грешка в протокола HTTP" msgstr "Грешка в протокола HTTP"
#: searx/webapp.py:168 #: searx/webapp.py:167
msgid "network error" msgid "network error"
msgstr "мрежова грешка" msgstr "мрежова грешка"
#: searx/webapp.py:170 #: searx/webapp.py:169
msgid "unexpected crash" msgid "unexpected crash"
msgstr "неочакван срив" msgstr "неочакван срив"
#: searx/webapp.py:177 #: searx/webapp.py:176
msgid "HTTP error" msgid "HTTP error"
msgstr "HTTP грешка" msgstr "HTTP грешка"
#: searx/webapp.py:178 #: searx/webapp.py:177
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "HTTP грешка във връзката" msgstr "HTTP грешка във връзката"
#: searx/webapp.py:184 #: searx/webapp.py:183
msgid "proxy error" msgid "proxy error"
msgstr "прокси грешка" msgstr "прокси грешка"
#: searx/webapp.py:185 #: searx/webapp.py:184
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "Кепча" msgstr "Кепча"
#: searx/webapp.py:186 #: searx/webapp.py:185
msgid "too many requests" msgid "too many requests"
msgstr "твърде много искания" msgstr "твърде много искания"
#: searx/webapp.py:187 #: searx/webapp.py:186
msgid "access denied" msgid "access denied"
msgstr "отказан достъп" msgstr "отказан достъп"
#: searx/webapp.py:188 #: searx/webapp.py:187
msgid "server API error" msgid "server API error"
msgstr "грешка в API на сървъра" msgstr "грешка в API на сървъра"
#: searx/webapp.py:363 #: searx/webapp.py:362
msgid "No item found" msgid "No item found"
msgstr "Не е намерен артикул" msgstr "Не е намерен артикул"
#: searx/engines/qwant.py:212 #: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source" msgid "Source"
msgstr "Източник" msgstr "Източник"
#: searx/webapp.py:367 #: searx/webapp.py:366
msgid "Error loading the next page" 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" msgid "Invalid settings, please edit your preferences"
msgstr "Неправилни настройки, моля проверете предпочитанията си" msgstr "Неправилни настройки, моля проверете предпочитанията си"
#: searx/webapp.py:532 #: searx/webapp.py:534
msgid "Invalid settings" msgid "Invalid settings"
msgstr "невалидни настройки" msgstr "невалидни настройки"
#: searx/webapp.py:609 searx/webapp.py:685 #: searx/webapp.py:611 searx/webapp.py:687
msgid "search error" msgid "search error"
msgstr "грешка при търсенето" msgstr "грешка при търсенето"
#: searx/webapp.py:731 #: searx/webapp.py:849
msgid "Suspended"
msgstr "преустановен"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago" msgid "{minutes} minute(s) ago"
msgstr "преди {minutes} минута(минути)" msgstr "преди {minutes} минута(минути)"
#: searx/webapp.py:733 #: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago" msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "преди {hours} час(ове), {minutes} минута(минути)" msgstr "преди {hours} час(ове), {minutes} минута(минути)"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "преустановен"
#: searx/answerers/random/answerer.py:67 #: searx/answerers/random/answerer.py:67
msgid "Random value generator" msgid "Random value generator"
msgstr "Генератор на произволни стойности" msgstr "Генератор на произволни стойности"
@ -241,7 +247,7 @@ msgstr "Функции за статистика"
#: searx/answerers/statistics/answerer.py:48 #: searx/answerers/statistics/answerer.py:48
msgid "Compute {functions} of the arguments" msgid "Compute {functions} of the arguments"
msgstr "Изчислете {функции} на аргументите" msgstr "Изчислете {functions} на аргументите"
#: searx/engines/openstreetmap.py:160 #: searx/engines/openstreetmap.py:160
msgid "Get directions" msgid "Get directions"
@ -255,29 +261,53 @@ msgstr "{title} (ОСТАРЯЛО)"
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "Този запис е заменен от" msgstr "Този запис е заменен от"
#: searx/engines/pubmed.py:78 #: searx/engines/qwant.py:219
msgid "No abstract is available for this publication."
msgstr "Няма резюме за тази публикация."
#: searx/engines/qwant.py:214
msgid "Channel" msgid "Channel"
msgstr "Канал" msgstr "Канал"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40 #: searx/engines/tineye.py:40
msgid "" msgid ""
"Could not read that image url. This may be due to an unsupported file " "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" "format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP." " WebP."
msgstr "" msgstr ""
"URL адресът на изображението не можа да бъде прочетен. Това може да се "
"дължи на неподдържан файлов формат. TinEye поддържа само изображения, "
"които са JPEG, PNG, GIF, BMP, TIFF или WebP."
#: searx/engines/tineye.py:46 #: searx/engines/tineye.py:46
msgid "" msgid ""
"The image is too simple to find matches. TinEye requires a basic level of" "The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches." " visual detail to successfully identify matches."
msgstr "" msgstr ""
"Изображението е твърде просто за намиране на съвпадения. TinEye изисква "
"основно ниво на визуална детайлност за успешно идентифициране на "
"съвпадения."
#: searx/engines/tineye.py:52 #: searx/engines/tineye.py:52
msgid "The image could not be downloaded." 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 "" msgstr ""
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
@ -286,7 +316,7 @@ msgstr "Преобразува низове в различни хаш-извл
#: searx/plugins/hash_plugin.py:52 #: searx/plugins/hash_plugin.py:52
msgid "hash digest" msgid "hash digest"
msgstr "" msgstr "хеш извлечение"
#: searx/plugins/hostname_replace.py:9 #: searx/plugins/hostname_replace.py:9
msgid "Hostname replace" msgid "Hostname replace"
@ -323,7 +353,7 @@ msgstr ""
"категории. (Необходим е JavaScript)" "категории. (Необходим е JavaScript)"
#: searx/plugins/self_info.py:20 #: searx/plugins/self_info.py:20
msgid "Self Informations" msgid "Self Information"
msgstr "" msgstr ""
#: searx/plugins/self_info.py:21 #: searx/plugins/self_info.py:21
@ -334,27 +364,31 @@ msgstr "Показва IP-то ви и др. инфо, ако търсенето
#: searx/plugins/tor_check.py:25 #: searx/plugins/tor_check.py:25
msgid "Tor check plugin" msgid "Tor check plugin"
msgstr "" msgstr "Проверка на Tor приставката"
#: searx/plugins/tor_check.py:28 #: searx/plugins/tor_check.py:28
msgid "" msgid ""
"This plugin checks if the address of the request is a TOR exit node, and " "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." "informs the user if it is, like check.torproject.org but from searxng."
msgstr "" msgstr ""
"Тази добавка проверява дали адресът на заявката е изходен възел на TOR и "
"осведомява потребителя ако е - като check.torproject.org, но от searxng."
#: searx/plugins/tor_check.py:62 #: searx/plugins/tor_check.py:62
msgid "" msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is " "The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable." "unreachable."
msgstr "" msgstr ""
"Листа с изходните възли на TOR (https://check.torproject.org/exit-"
"addresses) е недостижим."
#: searx/plugins/tor_check.py:78 #: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}." 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 #: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}." 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 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
@ -366,7 +400,7 @@ msgstr "Премахни следящите аргументи от върнат
#: searx/plugins/vim_hotkeys.py:3 #: searx/plugins/vim_hotkeys.py:3
msgid "Vim-like hotkeys" msgid "Vim-like hotkeys"
msgstr "\"Vim\" наподобяващи клавишни комбинации" msgstr "Vim наподобяващи клавишни комбинации"
#: searx/plugins/vim_hotkeys.py:4 #: searx/plugins/vim_hotkeys.py:4
msgid "" msgid ""
@ -392,7 +426,7 @@ msgstr "търси страница"
#: searx/templates/simple/base.html:46 #: searx/templates/simple/base.html:46
msgid "About" msgid "About"
msgstr "Относно за" msgstr "Относно"
#: searx/templates/simple/base.html:50 #: searx/templates/simple/base.html:50
msgid "Donate" msgid "Donate"
@ -408,8 +442,8 @@ msgid "Powered by"
msgstr "С подкрепата на" msgstr "С подкрепата на"
#: searx/templates/simple/base.html:64 #: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "за спазване на поверителността, хакерска метатърсачка" msgstr ""
#: searx/templates/simple/base.html:65 #: searx/templates/simple/base.html:65
msgid "Source code" msgid "Source code"
@ -446,6 +480,7 @@ msgstr "Дължина"
#: searx/templates/simple/macros.html:37 #: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18 #: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author" msgid "Author"
msgstr "Автор" msgstr "Автор"
@ -459,19 +494,21 @@ msgstr "прекарана"
#: searx/templates/simple/new_issue.html:64 #: searx/templates/simple/new_issue.html:64
msgid "Start submiting a new issue on GitHub" msgid "Start submiting a new issue on GitHub"
msgstr "" msgstr "Предявете нов проблем в GitHub"
#: searx/templates/simple/new_issue.html:66 #: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub" msgid "Please check for existing bugs about this engine on GitHub"
msgstr "" msgstr "Моля проверете за съществуващи бъгове на търсачката в GitHub"
#: searx/templates/simple/new_issue.html:69 #: searx/templates/simple/new_issue.html:69
msgid "I confirm there is no existing bug about the issue I encounter" msgid "I confirm there is no existing bug about the issue I encounter"
msgstr "" msgstr "Потвърждавам, че няма съществуващи бъогве за проблема, който срещнах"
#: searx/templates/simple/new_issue.html:71 #: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report" msgid "If this is a public instance, please specify the URL in the bug report"
msgstr "" msgstr ""
"Ако това е публична инстанция, моля предоставете URL адресът в отзива за "
"бъга"
#: searx/templates/simple/new_issue.html:72 #: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information" 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 "Виж грешката и я докладвай" msgstr "Виж грешката и я докладвай"
#: searx/templates/simple/preferences.html:53 #: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67 #: searx/templates/simple/stats.html:64
msgid "Median" msgid "Median"
msgstr "Медиaна" msgstr "Медиaна"
#: searx/templates/simple/preferences.html:54 #: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73 #: searx/templates/simple/stats.html:70
msgid "P80" msgid "P80"
msgstr "" msgstr "P80"
#: searx/templates/simple/preferences.html:55 #: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79 #: searx/templates/simple/stats.html:76
msgid "P95" msgid "P95"
msgstr "" msgstr ""
@ -573,7 +610,7 @@ msgstr "Филтрирай съдържание"
#: searx/templates/simple/preferences.html:157 #: searx/templates/simple/preferences.html:157
msgid "Open Access DOI resolver" msgid "Open Access DOI resolver"
msgstr "" msgstr "Дигитален идентификатор на обекти с отворен достъп"
#: searx/templates/simple/preferences.html:167 #: searx/templates/simple/preferences.html:167
msgid "" msgid ""
@ -665,7 +702,7 @@ msgstr "HTTP Метод"
#: searx/templates/simple/preferences.html:264 #: searx/templates/simple/preferences.html:264
msgid "" msgid ""
"Change how forms are submited, <a " "Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>" " rel=\"external\">learn more about request methods</a>"
msgstr "" msgstr ""
@ -713,6 +750,8 @@ msgid ""
"This tab does not show up for search results, but you can search the " "This tab does not show up for search results, but you can search the "
"engines listed here via bangs." "engines listed here via bangs."
msgstr "" msgstr ""
"Този раздел не се показва за резултатите от търсенето, но можете да "
"прегледате търсачките, изброени тук."
#: searx/templates/simple/preferences.html:307 #: searx/templates/simple/preferences.html:307
#: searx/templates/simple/preferences.html:358 #: searx/templates/simple/preferences.html:358
@ -932,67 +971,63 @@ msgstr "Резултати"
msgid "Result count" msgid "Result count"
msgstr "Брой резултати" msgstr "Брой резултати"
#: searx/templates/simple/stats.html:38 #: searx/templates/simple/stats.html:59
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
msgid "Total" msgid "Total"
msgstr "Общо" msgstr "Общо"
#: searx/templates/simple/stats.html:63 #: searx/templates/simple/stats.html:60
msgid "HTTP" msgid "HTTP"
msgstr "HTTP" msgstr "HTTP"
#: searx/templates/simple/stats.html:64 #: searx/templates/simple/stats.html:61
msgid "Processing" msgid "Processing"
msgstr "Обработка" msgstr "Обработка"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Warnings" msgid "Warnings"
msgstr "Предупреждения" msgstr "Предупреждения"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Errors and exceptions" msgid "Errors and exceptions"
msgstr "" msgstr "Грешки и изключения"
#: searx/templates/simple/stats.html:108 #: searx/templates/simple/stats.html:105
msgid "Exception" msgid "Exception"
msgstr "" msgstr "Изключение"
#: searx/templates/simple/stats.html:110 #: searx/templates/simple/stats.html:107
msgid "Message" msgid "Message"
msgstr "Съобщение" msgstr "Съобщение"
#: searx/templates/simple/stats.html:112 #: searx/templates/simple/stats.html:109
msgid "Percentage" msgid "Percentage"
msgstr "Процент" msgstr "Процент"
#: searx/templates/simple/stats.html:114 #: searx/templates/simple/stats.html:111
msgid "Parameter" msgid "Parameter"
msgstr "Параметър" msgstr "Параметър"
#: searx/templates/simple/stats.html:122 #: searx/templates/simple/stats.html:119
msgid "Filename" msgid "Filename"
msgstr "Име на файла" msgstr "Име на файла"
#: searx/templates/simple/stats.html:123 #: searx/templates/simple/stats.html:120
msgid "Function" msgid "Function"
msgstr "Функция" msgstr "Функция"
#: searx/templates/simple/stats.html:124 #: searx/templates/simple/stats.html:121
msgid "Code" msgid "Code"
msgstr "Код" msgstr "Код"
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:128
msgid "Checker" msgid "Checker"
msgstr "Проверител" msgstr "Проверител"
#: searx/templates/simple/stats.html:134 #: searx/templates/simple/stats.html:131
msgid "Failed test" msgid "Failed test"
msgstr "Неуспешен тест" msgstr "Неуспешен тест"
#: searx/templates/simple/stats.html:135 #: searx/templates/simple/stats.html:132
msgid "Comment(s)" msgid "Comment(s)"
msgstr "Коментар (и)" msgstr "Коментар (и)"
@ -1081,6 +1116,50 @@ msgstr "покажи карта"
msgid "hide map" msgid "hide map"
msgstr "скрий картата" 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 #: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link" msgid "magnet link"
msgstr "магнитна връзка" msgstr "магнитна връзка"
@ -1375,3 +1454,27 @@ msgstr "скрий видеото"
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "предпочитания" #~ 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 "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n" "POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-08-05 07:18+0000\n" "PO-Revision-Date: 2022-09-21 15:58+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\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: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n" "Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME'] #. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -126,6 +125,11 @@ msgstr "সফটওয়্যার উইকি"
msgid "web" msgid "web"
msgstr "ওয়েব" msgstr "ওয়েব"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
msgid "auto" msgid "auto"
@ -141,91 +145,91 @@ msgstr "সাদা"
msgid "dark" msgid "dark"
msgstr "কালো" msgstr "কালো"
#: searx/webapp.py:165 #: searx/webapp.py:164
msgid "timeout" msgid "timeout"
msgstr "সময় শেষ" msgstr "সময় শেষ"
#: searx/webapp.py:166 #: searx/webapp.py:165
msgid "parsing error" msgid "parsing error"
msgstr "পার্স ত্রুটি" msgstr "পার্স ত্রুটি"
#: searx/webapp.py:167 #: searx/webapp.py:166
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "HTTP প্রোটোকল ত্রুটি" msgstr "HTTP প্রোটোকল ত্রুটি"
#: searx/webapp.py:168 #: searx/webapp.py:167
msgid "network error" msgid "network error"
msgstr "নেটওয়ার্ক ত্রুটি" msgstr "নেটওয়ার্ক ত্রুটি"
#: searx/webapp.py:170 #: searx/webapp.py:169
msgid "unexpected crash" msgid "unexpected crash"
msgstr "অপ্রত্যাশিত ক্র্যাশ" msgstr "অপ্রত্যাশিত ক্র্যাশ"
#: searx/webapp.py:177 #: searx/webapp.py:176
msgid "HTTP error" msgid "HTTP error"
msgstr "এইচটিটিপি ত্রুটি" msgstr "এইচটিটিপি ত্রুটি"
#: searx/webapp.py:178 #: searx/webapp.py:177
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "এইচটিটিপি সংযোগ ত্রুটি" msgstr "এইচটিটিপি সংযোগ ত্রুটি"
#: searx/webapp.py:184 #: searx/webapp.py:183
msgid "proxy error" msgid "proxy error"
msgstr "প্রক্সি ত্রুটি" msgstr "প্রক্সি ত্রুটি"
#: searx/webapp.py:185 #: searx/webapp.py:184
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "ক্যাপচা" msgstr "ক্যাপচা"
#: searx/webapp.py:186 #: searx/webapp.py:185
msgid "too many requests" msgid "too many requests"
msgstr "অনেক বেশি অনুরোধ" msgstr "অনেক বেশি অনুরোধ"
#: searx/webapp.py:187 #: searx/webapp.py:186
msgid "access denied" msgid "access denied"
msgstr "অ্যাক্সেস অমান্য" msgstr "অ্যাক্সেস অমান্য"
#: searx/webapp.py:188 #: searx/webapp.py:187
msgid "server API error" msgid "server API error"
msgstr "সার্ভার এপিআই ত্রুটি" msgstr "সার্ভার এপিআই ত্রুটি"
#: searx/webapp.py:363 #: searx/webapp.py:362
msgid "No item found" msgid "No item found"
msgstr "কোন আইটেম পাওয়া যায়নি" msgstr "কোন আইটেম পাওয়া যায়নি"
#: searx/engines/qwant.py:212 #: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source" msgid "Source"
msgstr "উৎস" msgstr "উৎস"
#: searx/webapp.py:367 #: searx/webapp.py:366
msgid "Error loading the next page" 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" msgid "Invalid settings, please edit your preferences"
msgstr "অবৈধ সেটিংস, অনুগ্রহ করে আপনার পছন্দগুলি সম্পাদনা করুন৷" msgstr "অবৈধ সেটিংস, অনুগ্রহ করে আপনার পছন্দগুলি সম্পাদনা করুন৷"
#: searx/webapp.py:532 #: searx/webapp.py:534
msgid "Invalid settings" msgid "Invalid settings"
msgstr "অবৈধ সেটিংস" msgstr "অবৈধ সেটিংস"
#: searx/webapp.py:609 searx/webapp.py:685 #: searx/webapp.py:611 searx/webapp.py:687
msgid "search error" msgid "search error"
msgstr "অনুসন্ধানের ত্রুটি" msgstr "অনুসন্ধানের ত্রুটি"
#: searx/webapp.py:731 #: searx/webapp.py:849
msgid "Suspended"
msgstr "স্থগিত"
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago" msgid "{minutes} minute(s) ago"
msgstr "{minutes} মিনিট আগে" msgstr "{minutes} মিনিট আগে"
#: searx/webapp.py:733 #: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago" msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} ঘণ্টা, {minutes} মিনিট আগে" msgstr "{hours} ঘণ্টা, {minutes} মিনিট আগে"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "স্থগিত"
#: searx/answerers/random/answerer.py:67 #: searx/answerers/random/answerer.py:67
msgid "Random value generator" msgid "Random value generator"
msgstr "এলোমেলো মান জেনারেটর" msgstr "এলোমেলো মান জেনারেটর"
@ -254,35 +258,54 @@ msgstr "{title} (অচল)"
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "এই এন্ট্রিটি দ্বারা বাতিল করা হয়েছে৷" msgstr "এই এন্ট্রিটি দ্বারা বাতিল করা হয়েছে৷"
#: searx/engines/pubmed.py:78 #: searx/engines/qwant.py:219
msgid "No abstract is available for this publication."
msgstr "এই প্রকাশনার জন্য কোন বিমূর্ত উপলব্ধ নেই."
#: searx/engines/qwant.py:214
msgid "Channel" msgid "Channel"
msgstr "চ্যানেল" msgstr "চ্যানেল"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40 #: searx/engines/tineye.py:40
msgid "" msgid ""
"Could not read that image url. This may be due to an unsupported file " "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" "format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP." " WebP."
msgstr "" msgstr ""
"ছবির url টি পড়তে পারা যাচ্ছে না । এটি হতে পারে ফাইল ফরম্যাট এর পড়তে না পারা" "ছবির url টি পড়তে পারা যাচ্ছে না । এটি হতে পারে ফাইল ফরম্যাট এর পড়তে না "
"র জন্যে। TinEye কেবল JPEG, PNG, GIF, BMP, TIFF আর WebP ফরম্যাট কে পড়তে পারে।" "পারার জন্যে। TinEye কেবল JPEG, PNG, GIF, BMP, TIFF আর WebP ফরম্যাট কে "
"পড়তে পারে।"
#: searx/engines/tineye.py:46 #: searx/engines/tineye.py:46
msgid "" msgid ""
"The image is too simple to find matches. TinEye requires a basic level of" "The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches." " visual detail to successfully identify matches."
msgstr "" msgstr ""
"এই ছবিটি খুবই সাধারণ হওয়ায় কোন মিল পাওয়া যাচ্ছে না। TinEye এর একটু চাক্ষু" "এই ছবিটি খুবই সাধারণ হওয়ায় কোন মিল পাওয়া যাচ্ছে না। TinEye এর একটু "
"ষ বিস্তর প্রয়োজন সফল ভাবে মিল পাওয়ার জন্যে ।" "চাক্ষুষ বিস্তর প্রয়োজন সফল ভাবে মিল পাওয়ার জন্যে ।"
#: searx/engines/tineye.py:52 #: searx/engines/tineye.py:52
msgid "The image could not be downloaded." 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 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "স্ট্রিংগুলিকে বিভিন্ন হ্যাশ ডাইজেস্টে রূপান্তর করে।" msgstr "স্ট্রিংগুলিকে বিভিন্ন হ্যাশ ডাইজেস্টে রূপান্তর করে।"
@ -308,8 +331,8 @@ msgid ""
"Avoid paywalls by redirecting to open-access versions of publications " "Avoid paywalls by redirecting to open-access versions of publications "
"when available" "when available"
msgstr "" msgstr ""
"Paywall এড়িয়ে চলতে প্রকাশন গুলির open-access সংস্করণে রিডাইরেক্ট করুন উপলব্" "Paywall এড়িয়ে চলতে প্রকাশন গুলির open-access সংস্করণে রিডাইরেক্ট করুন "
"ধ থাকলে" "উপলব্ধ থাকলে"
#: searx/plugins/search_on_category_select.py:19 #: searx/plugins/search_on_category_select.py:19
msgid "Search on category select" msgid "Search on category select"
@ -320,12 +343,12 @@ msgid ""
"Perform search immediately if a category selected. Disable to select " "Perform search immediately if a category selected. Disable to select "
"multiple categories. (JavaScript required)" "multiple categories. (JavaScript required)"
msgstr "" msgstr ""
"যখন একটি বিভাগ নির্বাচন করা হয়, অনুসন্ধান অবিলম্বে সঞ্চালিত হয়. একাধিক বিভা" "যখন একটি বিভাগ নির্বাচন করা হয়, অনুসন্ধান অবিলম্বে সঞ্চালিত হয়. একাধিক "
"গ নির্বাচন করতে অক্ষম করুন। (জাভাস্ক্রিপ্ট প্রয়োজন)" "বিভাগ নির্বাচন করতে অক্ষম করুন। (জাভাস্ক্রিপ্ট প্রয়োজন)"
#: searx/plugins/self_info.py:20 #: searx/plugins/self_info.py:20
msgid "Self Informations" msgid "Self Information"
msgstr "নিজের তথ্য" msgstr ""
#: searx/plugins/self_info.py:21 #: searx/plugins/self_info.py:21
msgid "" msgid ""
@ -406,7 +429,7 @@ msgid "Powered by"
msgstr "" msgstr ""
#: searx/templates/simple/base.html:64 #: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "" msgstr ""
#: searx/templates/simple/base.html:65 #: searx/templates/simple/base.html:65
@ -444,6 +467,7 @@ msgstr "দৈর্ঘ্য"
#: searx/templates/simple/macros.html:37 #: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18 #: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author" msgid "Author"
msgstr "লেখক" msgstr "লেখক"
@ -487,17 +511,17 @@ msgid "View error logs and submit a bug report"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:53 #: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67 #: searx/templates/simple/stats.html:64
msgid "Median" msgid "Median"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:54 #: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73 #: searx/templates/simple/stats.html:70
msgid "P80" msgid "P80"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:55 #: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79 #: searx/templates/simple/stats.html:76
msgid "P95" msgid "P95"
msgstr "" msgstr ""
@ -659,7 +683,7 @@ msgstr ""
#: searx/templates/simple/preferences.html:264 #: searx/templates/simple/preferences.html:264
msgid "" msgid ""
"Change how forms are submited, <a " "Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>" " rel=\"external\">learn more about request methods</a>"
msgstr "" msgstr ""
@ -913,67 +937,63 @@ msgstr ""
msgid "Result count" msgid "Result count"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:38 #: searx/templates/simple/stats.html:59
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
msgid "Total" msgid "Total"
msgstr "মোট" msgstr "মোট"
#: searx/templates/simple/stats.html:63 #: searx/templates/simple/stats.html:60
msgid "HTTP" msgid "HTTP"
msgstr "এইচটিটিপি" msgstr "এইচটিটিপি"
#: searx/templates/simple/stats.html:64 #: searx/templates/simple/stats.html:61
msgid "Processing" msgid "Processing"
msgstr "প্রক্রিয়ারত" msgstr "প্রক্রিয়ারত"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Warnings" msgid "Warnings"
msgstr "সতর্কতা" msgstr "সতর্কতা"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Errors and exceptions" msgid "Errors and exceptions"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:108 #: searx/templates/simple/stats.html:105
msgid "Exception" msgid "Exception"
msgstr "ব্যতিক্রম" msgstr "ব্যতিক্রম"
#: searx/templates/simple/stats.html:110 #: searx/templates/simple/stats.html:107
msgid "Message" msgid "Message"
msgstr "বার্তা" msgstr "বার্তা"
#: searx/templates/simple/stats.html:112 #: searx/templates/simple/stats.html:109
msgid "Percentage" msgid "Percentage"
msgstr "শতাংশ" msgstr "শতাংশ"
#: searx/templates/simple/stats.html:114 #: searx/templates/simple/stats.html:111
msgid "Parameter" msgid "Parameter"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:122 #: searx/templates/simple/stats.html:119
msgid "Filename" msgid "Filename"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:123 #: searx/templates/simple/stats.html:120
msgid "Function" msgid "Function"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:124 #: searx/templates/simple/stats.html:121
msgid "Code" msgid "Code"
msgstr "কোড" msgstr "কোড"
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:128
msgid "Checker" msgid "Checker"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:134 #: searx/templates/simple/stats.html:131
msgid "Failed test" msgid "Failed test"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:135 #: searx/templates/simple/stats.html:132
msgid "Comment(s)" msgid "Comment(s)"
msgstr "মন্তব্য" msgstr "মন্তব্য"
@ -1060,6 +1080,50 @@ msgstr ""
msgid "hide map" msgid "hide map"
msgstr "" 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 #: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link" msgid "magnet link"
msgstr "" msgstr ""
@ -1120,3 +1184,23 @@ msgstr ""
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "পছন্দসমূহ" #~ 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 "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 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" "PO-Revision-Date: 2021-12-17 07:17+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: bo\n" "Language: bo\n"
@ -126,6 +126,11 @@ msgstr ""
msgid "web" msgid "web"
msgstr "" msgstr ""
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
msgid "auto" msgid "auto"
@ -141,91 +146,91 @@ msgstr ""
msgid "dark" msgid "dark"
msgstr "" msgstr ""
#: searx/webapp.py:165 #: searx/webapp.py:164
msgid "timeout" msgid "timeout"
msgstr "" msgstr ""
#: searx/webapp.py:166 #: searx/webapp.py:165
msgid "parsing error" msgid "parsing error"
msgstr "" msgstr ""
#: searx/webapp.py:167 #: searx/webapp.py:166
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "" msgstr ""
#: searx/webapp.py:168 #: searx/webapp.py:167
msgid "network error" msgid "network error"
msgstr "" msgstr ""
#: searx/webapp.py:170 #: searx/webapp.py:169
msgid "unexpected crash" msgid "unexpected crash"
msgstr "" msgstr ""
#: searx/webapp.py:177 #: searx/webapp.py:176
msgid "HTTP error" msgid "HTTP error"
msgstr "" msgstr ""
#: searx/webapp.py:178 #: searx/webapp.py:177
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "" msgstr ""
#: searx/webapp.py:184 #: searx/webapp.py:183
msgid "proxy error" msgid "proxy error"
msgstr "" msgstr ""
#: searx/webapp.py:185 #: searx/webapp.py:184
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "" msgstr ""
#: searx/webapp.py:186 #: searx/webapp.py:185
msgid "too many requests" msgid "too many requests"
msgstr "" msgstr ""
#: searx/webapp.py:187 #: searx/webapp.py:186
msgid "access denied" msgid "access denied"
msgstr "" msgstr ""
#: searx/webapp.py:188 #: searx/webapp.py:187
msgid "server API error" msgid "server API error"
msgstr "" msgstr ""
#: searx/webapp.py:363 #: searx/webapp.py:362
msgid "No item found" msgid "No item found"
msgstr "རྣམ་གྲངས་གང་ཡང་རྙེད་རྒྱུ་མ་བྱུང་།" msgstr "རྣམ་གྲངས་གང་ཡང་རྙེད་རྒྱུ་མ་བྱུང་།"
#: searx/engines/qwant.py:212 #: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source" msgid "Source"
msgstr "" msgstr ""
#: searx/webapp.py:367 #: searx/webapp.py:366
msgid "Error loading the next page" 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" msgid "Invalid settings, please edit your preferences"
msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།ཁྱེད་ཀྱིས་གདམ་ཀ་ལ་བཅོས་སྒྲིག་གཏོང་རོགས།" msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།ཁྱེད་ཀྱིས་གདམ་ཀ་ལ་བཅོས་སྒྲིག་གཏོང་རོགས།"
#: searx/webapp.py:532 #: searx/webapp.py:534
msgid "Invalid settings" msgid "Invalid settings"
msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།" msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།"
#: searx/webapp.py:609 searx/webapp.py:685 #: searx/webapp.py:611 searx/webapp.py:687
msgid "search error" msgid "search error"
msgstr "འཚོལ་བཤེར་ལ་ནོར་འཁྲུལ་བྱུང་།" msgstr "འཚོལ་བཤེར་ལ་ནོར་འཁྲུལ་བྱུང་།"
#: searx/webapp.py:731 #: searx/webapp.py:849
msgid "Suspended"
msgstr ""
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago" msgid "{minutes} minute(s) ago"
msgstr "སྐར་མ་ {minutes} སྔོན་ལ།" msgstr "སྐར་མ་ {minutes} སྔོན་ལ།"
#: searx/webapp.py:733 #: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago" msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "ཆུ་ཚོད་ {hours} དང་སྐར་མ {minutes} སྔོན་ལ།" msgstr "ཆུ་ཚོད་ {hours} དང་སྐར་མ {minutes} སྔོན་ལ།"
#: searx/webapp.py:859
msgid "Suspended"
msgstr ""
#: searx/answerers/random/answerer.py:67 #: searx/answerers/random/answerer.py:67
msgid "Random value generator" msgid "Random value generator"
msgstr "ངེས་མེད་གྲངས་ཀ་མཁོ་སྤྲོད།" msgstr "ངེས་མེད་གྲངས་ཀ་མཁོ་སྤྲོད།"
@ -254,12 +259,14 @@ msgstr ""
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "འཚོལ་བྱང་འདི་གཞན་གྱིས་ཚབ་བྱེད་འདུག" msgstr "འཚོལ་བྱང་འདི་གཞན་གྱིས་ཚབ་བྱེད་འདུག"
#: searx/engines/pubmed.py:78 #: searx/engines/qwant.py:219
msgid "No abstract is available for this publication." msgid "Channel"
msgstr "" msgstr ""
#: searx/engines/qwant.py:214 #: searx/engines/semantic_scholar.py:81
msgid "Channel" msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr "" msgstr ""
#: searx/engines/tineye.py:40 #: searx/engines/tineye.py:40
@ -279,6 +286,22 @@ msgstr ""
msgid "The image could not be downloaded." 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 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "" msgstr ""
@ -320,7 +343,7 @@ msgstr ""
"multiple categories. (JavaScript required)" "multiple categories. (JavaScript required)"
#: searx/plugins/self_info.py:20 #: searx/plugins/self_info.py:20
msgid "Self Informations" msgid "Self Information"
msgstr "" msgstr ""
#: searx/plugins/self_info.py:21 #: searx/plugins/self_info.py:21
@ -402,8 +425,8 @@ msgid "Powered by"
msgstr "བཟོ་སྐུན་པ་ནི" msgstr "བཟོ་སྐུན་པ་ནི"
#: searx/templates/simple/base.html:64 #: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "མི་སྒེར་ཆ་འཕྲིན་ལ་བརྩི་གསོག་ལྡན་ཞིང་འཚོལ་བྱེད་ནང་དོན་ཕུན་སུམ་པའི་འཚོལ་བཤེར་སྒུལ་བྱེད་མ་ལག" msgstr ""
#: searx/templates/simple/base.html:65 #: searx/templates/simple/base.html:65
msgid "Source code" msgid "Source code"
@ -440,6 +463,7 @@ msgstr ""
#: searx/templates/simple/macros.html:37 #: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18 #: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author" msgid "Author"
msgstr "" msgstr ""
@ -483,17 +507,17 @@ msgid "View error logs and submit a bug report"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:53 #: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67 #: searx/templates/simple/stats.html:64
msgid "Median" msgid "Median"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:54 #: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73 #: searx/templates/simple/stats.html:70
msgid "P80" msgid "P80"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:55 #: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79 #: searx/templates/simple/stats.html:76
msgid "P95" msgid "P95"
msgstr "" msgstr ""
@ -655,7 +679,7 @@ msgstr ""
#: searx/templates/simple/preferences.html:264 #: searx/templates/simple/preferences.html:264
msgid "" msgid ""
"Change how forms are submited, <a " "Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>" " rel=\"external\">learn more about request methods</a>"
msgstr "" msgstr ""
@ -909,67 +933,63 @@ msgstr "ཐོབ་སྐར།"
msgid "Result count" msgid "Result count"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:38 #: searx/templates/simple/stats.html:59
msgid "Scores per result"
msgstr "འཚོལ་འབྲས་རེ་རེ་ཡི་ཐོབ་སྐར།"
#: searx/templates/simple/stats.html:62
msgid "Total" msgid "Total"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:63 #: searx/templates/simple/stats.html:60
msgid "HTTP" msgid "HTTP"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:64 #: searx/templates/simple/stats.html:61
msgid "Processing" msgid "Processing"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Warnings" msgid "Warnings"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Errors and exceptions" msgid "Errors and exceptions"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:108 #: searx/templates/simple/stats.html:105
msgid "Exception" msgid "Exception"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:110 #: searx/templates/simple/stats.html:107
msgid "Message" msgid "Message"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:112 #: searx/templates/simple/stats.html:109
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:114 #: searx/templates/simple/stats.html:111
msgid "Parameter" msgid "Parameter"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:122 #: searx/templates/simple/stats.html:119
msgid "Filename" msgid "Filename"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:123 #: searx/templates/simple/stats.html:120
msgid "Function" msgid "Function"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:124 #: searx/templates/simple/stats.html:121
msgid "Code" msgid "Code"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:128
msgid "Checker" msgid "Checker"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:134 #: searx/templates/simple/stats.html:131
msgid "Failed test" msgid "Failed test"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:135 #: searx/templates/simple/stats.html:132
msgid "Comment(s)" msgid "Comment(s)"
msgstr "" msgstr ""
@ -1058,6 +1078,50 @@ msgstr "ས་བཀྲ་འཆར།"
msgid "hide map" msgid "hide map"
msgstr "ས་བཀྲ་སྦས།" 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 #: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link" msgid "magnet link"
msgstr "ཐོན་ཁུངས་ཀྱི་དྲ་གནས།" msgstr "ཐོན་ཁུངས་ཀྱི་དྲ་གནས།"
@ -1356,3 +1420,22 @@ msgstr "རྙན་ཟློས་སྦས།"
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "སྒྲིག་བཀོད།" #~ 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. # Gerard Oliva Viñas <oliva3032001@gmail.com>, 2022.
# adriadam10 <adriadam10@gmail.com>, 2022. # adriadam10 <adriadam10@gmail.com>, 2022.
# alexfs2015 <alex04fs@gmail.com>, 2022. # alexfs2015 <alex04fs@gmail.com>, 2022.
# Joan Montané <joan@montane.cat>, 2022.
# Markus Heiser <markus.heiser@darmarit.de>, 2022.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n" "POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-07-29 07:17+0000\n" "PO-Revision-Date: 2022-09-30 07:43+0000\n"
"Last-Translator: alexfs2015 <alex04fs@gmail.com>\n" "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: Catalan <https://weblate.bubu1.eu/projects/searxng/searxng/ca/" "Language-Team: Catalan <https://weblate.bubu1.eu/projects/searxng/searxng/ca/"
">\n" ">\n"
"Language: ca\n" "Language: ca\n"
@ -23,7 +25,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "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" "Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME'] #. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -131,6 +133,11 @@ msgstr "wikis de programari"
msgid "web" msgid "web"
msgstr "web" msgstr "web"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr "articles científics"
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
msgid "auto" msgid "auto"
@ -146,91 +153,91 @@ msgstr "clar"
msgid "dark" msgid "dark"
msgstr "fosc" msgstr "fosc"
#: searx/webapp.py:165 #: searx/webapp.py:164
msgid "timeout" msgid "timeout"
msgstr "expirat" msgstr "expirat"
#: searx/webapp.py:166 #: searx/webapp.py:165
msgid "parsing error" msgid "parsing error"
msgstr "error de processament" msgstr "error de processament"
#: searx/webapp.py:167 #: searx/webapp.py:166
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "error de protocol HTTP" msgstr "error de protocol HTTP"
#: searx/webapp.py:168 #: searx/webapp.py:167
msgid "network error" msgid "network error"
msgstr "error de xarxa" msgstr "error de xarxa"
#: searx/webapp.py:170 #: searx/webapp.py:169
msgid "unexpected crash" msgid "unexpected crash"
msgstr "tancament ineseperat" msgstr "tancament ineseperat"
#: searx/webapp.py:177 #: searx/webapp.py:176
msgid "HTTP error" msgid "HTTP error"
msgstr "error HTTP" msgstr "error HTTP"
#: searx/webapp.py:178 #: searx/webapp.py:177
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "error de connexió HTTP" msgstr "error de connexió HTTP"
#: searx/webapp.py:184 #: searx/webapp.py:183
msgid "proxy error" msgid "proxy error"
msgstr "error de servidor intermediari" msgstr "error de servidor intermediari"
#: searx/webapp.py:185 #: searx/webapp.py:184
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "CAPTCHA" msgstr "CAPTCHA"
#: searx/webapp.py:186 #: searx/webapp.py:185
msgid "too many requests" msgid "too many requests"
msgstr "massa peticions" msgstr "massa peticions"
#: searx/webapp.py:187 #: searx/webapp.py:186
msgid "access denied" msgid "access denied"
msgstr "accés denegat" msgstr "accés denegat"
#: searx/webapp.py:188 #: searx/webapp.py:187
msgid "server API error" 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" msgid "No item found"
msgstr "No s'ha trobat cap element" msgstr "No s'ha trobat cap element"
#: searx/engines/qwant.py:212 #: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source" msgid "Source"
msgstr "Origen" msgstr "Origen"
#: searx/webapp.py:367 #: searx/webapp.py:366
msgid "Error loading the next page" msgid "Error loading the next page"
msgstr "S'ha produït un error en carregar la pàgina següent" 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" msgid "Invalid settings, please edit your preferences"
msgstr "La configuració no és vàlida, editeu-la" msgstr "La configuració no és vàlida, editeu-la"
#: searx/webapp.py:532 #: searx/webapp.py:534
msgid "Invalid settings" msgid "Invalid settings"
msgstr "La configuració no és vàlida" 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" msgid "search error"
msgstr "error en la cerca" 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" msgid "{minutes} minute(s) ago"
msgstr "fa {minutes} minuts" msgstr "fa {minutes} minuts"
#: searx/webapp.py:733 #: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago" msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "fa {hours} hores i {minutes} minuts" msgstr "fa {hours} hores i {minutes} minuts"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "Suspès"
#: searx/answerers/random/answerer.py:67 #: searx/answerers/random/answerer.py:67
msgid "Random value generator" msgid "Random value generator"
msgstr "Generador de valor aleatori" msgstr "Generador de valor aleatori"
@ -259,36 +266,57 @@ msgstr "{title} (OBSOLET)"
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "Aquesta entrada ha estat substituïda per" msgstr "Aquesta entrada ha estat substituïda per"
#: searx/engines/pubmed.py:78 #: searx/engines/qwant.py:219
msgid "No abstract is available for this publication."
msgstr "No hi ha resum disponible per a aquesta publicació."
#: searx/engines/qwant.py:214
msgid "Channel" msgid "Channel"
msgstr "Canal" 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 #: searx/engines/tineye.py:40
msgid "" msgid ""
"Could not read that image url. This may be due to an unsupported file " "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" "format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP." " WebP."
msgstr "" msgstr ""
"No s'ha pogut llegir l'URL de la imatge. Això pot ser degut a un format de " "No s'ha pogut llegir l'URL de la imatge. Això pot ser degut a un format "
"fitxer no compatible. TinEye només admet imatges en format JPEG, PNG, GIF, " "de fitxer no compatible. TinEye només admet imatges en format JPEG, PNG, "
"BMP, TIFF o WebP." "GIF, BMP, TIFF o WebP."
#: searx/engines/tineye.py:46 #: searx/engines/tineye.py:46
msgid "" msgid ""
"The image is too simple to find matches. TinEye requires a basic level of" "The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches." " visual detail to successfully identify matches."
msgstr "" msgstr ""
"La imatge és massa senzilla per trobar coincidències. TinEye requereix un " "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." " nivell bàsic de detall visual per identificar amb èxit les "
"coincidències."
#: searx/engines/tineye.py:52 #: searx/engines/tineye.py:52
msgid "The image could not be downloaded." msgid "The image could not be downloaded."
msgstr "No s'ha pogut baixar la imatge." 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 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "Converteix cadenes a diferent formats de resum." 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)" "Desactiveu-ho per a seleccionar més d'una categoria. (Cal JavaScript)"
#: searx/plugins/self_info.py:20 #: searx/plugins/self_info.py:20
msgid "Self Informations" msgid "Self Information"
msgstr "Informació pròpia" msgstr "Informació pròpia"
#: searx/plugins/self_info.py:21 #: 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 " "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." "informs the user if it is, like check.torproject.org but from searxng."
msgstr "" msgstr ""
"Aquest plugin comprova si l'adreça de la sol·licitud és un node de sortida " "Aquest plugin comprova si l'adreça de la sol·licitud és un node de "
"TOR i informa a l'usuari si ho és, com check.torproject.org però des de " "sortida TOR i informa a l'usuari si ho és, com check.torproject.org però "
"searxng." "des de searxng."
#: searx/plugins/tor_check.py:62 #: searx/plugins/tor_check.py:62
msgid "" msgid ""
"The TOR exit node list (https://check.torproject.org/exit-addresses) is " "The TOR exit node list (https://check.torproject.org/exit-addresses) is "
"unreachable." "unreachable."
msgstr "" msgstr ""
"No es pot accedir a la llista de nodes de sortida TOR (https://check." "No es pot accedir a la llista de nodes de sortida TOR "
"torproject.org/exit-addresses)." "(https://check.torproject.org/exit-addresses)."
#: searx/plugins/tor_check.py:78 #: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}." 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 #: searx/plugins/tracker_url_remover.py:30
msgid "Remove trackers arguments from the returned URL" 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 #: searx/plugins/vim_hotkeys.py:3
msgid "Vim-like hotkeys" msgid "Vim-like hotkeys"
@ -400,7 +428,7 @@ msgstr "No s'ha trobat la pàgina"
#: searx/templates/simple/404.html:6 #: searx/templates/simple/404.html:6
#, python-format #, python-format
msgid "Go to %(search_page)s." 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 #: searx/templates/simple/404.html:6
msgid "search page" msgid "search page"
@ -408,7 +436,7 @@ msgstr "pàgina de cerca"
#: searx/templates/simple/base.html:46 #: searx/templates/simple/base.html:46
msgid "About" msgid "About"
msgstr "Sobre Nosaltres" msgstr "Quant a"
#: searx/templates/simple/base.html:50 #: searx/templates/simple/base.html:50
msgid "Donate" msgid "Donate"
@ -424,8 +452,8 @@ msgid "Powered by"
msgstr "Funciona amb" msgstr "Funciona amb"
#: searx/templates/simple/base.html:64 #: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "un meta motor de cerca personalitzable i respectuós amb la privadesa" msgstr "metacercador obert, que respecta la privacitat"
#: searx/templates/simple/base.html:65 #: searx/templates/simple/base.html:65
msgid "Source code" msgid "Source code"
@ -462,6 +490,7 @@ msgstr "Longitud"
#: searx/templates/simple/macros.html:37 #: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18 #: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author" msgid "Author"
msgstr "Autor" msgstr "Autor"
@ -479,17 +508,15 @@ msgstr "Enviar un nou problema a GitHub"
#: searx/templates/simple/new_issue.html:66 #: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub" 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 #: searx/templates/simple/new_issue.html:69
msgid "I confirm there is no existing bug about the issue I encounter" 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 #: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report" msgid "If this is a public instance, please specify the URL in the bug report"
msgstr "" msgstr "Si aquesta és una instància pública, indiqueu l'URL a l'informe d'error"
"Si aquesta és una instància pública, si us plau especifica la URL al report "
"del bug"
#: searx/templates/simple/new_issue.html:72 #: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information" 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" msgstr "Mostra els informes d'error i envia un informe d'error"
#: searx/templates/simple/preferences.html:53 #: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67 #: searx/templates/simple/stats.html:64
msgid "Median" msgid "Median"
msgstr "Mitjà" msgstr "Mitjà"
#: searx/templates/simple/preferences.html:54 #: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73 #: searx/templates/simple/stats.html:70
msgid "P80" msgid "P80"
msgstr "P80" msgstr "P80"
#: searx/templates/simple/preferences.html:55 #: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79 #: searx/templates/simple/stats.html:76
msgid "P95" msgid "P95"
msgstr "P95" msgstr "P95"
@ -683,13 +710,13 @@ msgstr "Mètode HTTP"
#: searx/templates/simple/preferences.html:264 #: searx/templates/simple/preferences.html:264
msgid "" msgid ""
"Change how forms are submited, <a " "Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>" " rel=\"external\">learn more about request methods</a>"
msgstr "" msgstr ""
"Canvia com es trameten els formularis, <a " "Canvia com es trameten els formularis, <a href=\"http://en.wikipedia.org/"
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">més "
" rel=\"external\">més informació sobre els mètodes de petició</a>" "informació sobre els mètodes de petició</a>"
#: searx/templates/simple/preferences.html:269 #: searx/templates/simple/preferences.html:269
msgid "Image proxy" msgid "Image proxy"
@ -835,8 +862,8 @@ msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by " "Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites." "leaking data to the clicked result sites."
msgstr "" msgstr ""
"Nota: si indiqueu configuracions personalitzades en la URL de cerca podeu" "Nota: si indiqueu configuracions personalitzades en l'URL de cerca, podeu"
" reduir la privadesa, amb filtració de dades, en fer clic als llocs dels " " reduir-ne la privadesa i filtrar dades, en fer clic en els llocs dels "
"resultats." "resultats."
#: searx/templates/simple/preferences.html:419 #: searx/templates/simple/preferences.html:419
@ -864,8 +891,8 @@ msgid ""
"These cookies serve your sole convenience, we don't use these cookies to " "These cookies serve your sole convenience, we don't use these cookies to "
"track you." "track you."
msgstr "" msgstr ""
"Aquestes galetes només són per a la vostra conveniència. No les usem per " "Aquestes galetes només són per a la vostra comoditat. No les usem per a "
"a rastrejar-vos." "rastrejar-vos."
#: searx/templates/simple/preferences.html:433 #: searx/templates/simple/preferences.html:433
msgid "Save" msgid "Save"
@ -955,67 +982,63 @@ msgstr "Valoració"
msgid "Result count" msgid "Result count"
msgstr "Resultats" msgstr "Resultats"
#: searx/templates/simple/stats.html:38 #: searx/templates/simple/stats.html:59
msgid "Scores per result"
msgstr "Valoració segons el resultat"
#: searx/templates/simple/stats.html:62
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
#: searx/templates/simple/stats.html:63 #: searx/templates/simple/stats.html:60
msgid "HTTP" msgid "HTTP"
msgstr "HTTP" msgstr "HTTP"
#: searx/templates/simple/stats.html:64 #: searx/templates/simple/stats.html:61
msgid "Processing" msgid "Processing"
msgstr "S'està processant" msgstr "S'està processant"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Warnings" msgid "Warnings"
msgstr "Avisos" msgstr "Avisos"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Errors and exceptions" msgid "Errors and exceptions"
msgstr "Errors i excepcions" msgstr "Errors i excepcions"
#: searx/templates/simple/stats.html:108 #: searx/templates/simple/stats.html:105
msgid "Exception" msgid "Exception"
msgstr "Excepció" msgstr "Excepció"
#: searx/templates/simple/stats.html:110 #: searx/templates/simple/stats.html:107
msgid "Message" msgid "Message"
msgstr "Missatge" msgstr "Missatge"
#: searx/templates/simple/stats.html:112 #: searx/templates/simple/stats.html:109
msgid "Percentage" msgid "Percentage"
msgstr "Percentatge" msgstr "Percentatge"
#: searx/templates/simple/stats.html:114 #: searx/templates/simple/stats.html:111
msgid "Parameter" msgid "Parameter"
msgstr "Paràmetre" msgstr "Paràmetre"
#: searx/templates/simple/stats.html:122 #: searx/templates/simple/stats.html:119
msgid "Filename" msgid "Filename"
msgstr "Nom de fitxer" msgstr "Nom de fitxer"
#: searx/templates/simple/stats.html:123 #: searx/templates/simple/stats.html:120
msgid "Function" msgid "Function"
msgstr "Funció" msgstr "Funció"
#: searx/templates/simple/stats.html:124 #: searx/templates/simple/stats.html:121
msgid "Code" msgid "Code"
msgstr "Codi" msgstr "Codi"
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:128
msgid "Checker" msgid "Checker"
msgstr "Comprovador" msgstr "Comprovador"
#: searx/templates/simple/stats.html:134 #: searx/templates/simple/stats.html:131
msgid "Failed test" msgid "Failed test"
msgstr "Prova fallida" msgstr "Prova fallida"
#: searx/templates/simple/stats.html:135 #: searx/templates/simple/stats.html:132
msgid "Comment(s)" msgid "Comment(s)"
msgstr "Comentaris" msgstr "Comentaris"
@ -1104,6 +1127,50 @@ msgstr "mostra el mapa"
msgid "hide map" msgid "hide map"
msgstr "amaga el mapa" 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 #: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link" msgid "magnet link"
msgstr "enllaç magnet" msgstr "enllaç magnet"
@ -1407,3 +1474,27 @@ msgstr "amaga el vídeo"
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "preferències" #~ 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. # LagManCZ <lagmen@post.cz>, 2022.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n" "POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-07-29 07:17+0000\n" "PO-Revision-Date: 2022-09-21 15:58+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\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: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
"X-Generator: Weblate 4.13.1\n"
"Generated-By: Babel 2.10.3\n" "Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME'] #. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -133,6 +132,11 @@ msgstr "softwarové wikipédie"
msgid "web" msgid "web"
msgstr "web" msgstr "web"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr ""
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
msgid "auto" msgid "auto"
@ -148,91 +152,91 @@ msgstr "světlý"
msgid "dark" msgid "dark"
msgstr "tmavý" msgstr "tmavý"
#: searx/webapp.py:165 #: searx/webapp.py:164
msgid "timeout" msgid "timeout"
msgstr "čas vypršel" msgstr "čas vypršel"
#: searx/webapp.py:166 #: searx/webapp.py:165
msgid "parsing error" msgid "parsing error"
msgstr "chyba parsování" msgstr "chyba parsování"
#: searx/webapp.py:167 #: searx/webapp.py:166
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "chyba HTTP protokolu" msgstr "chyba HTTP protokolu"
#: searx/webapp.py:168 #: searx/webapp.py:167
msgid "network error" msgid "network error"
msgstr "síťová chyba" msgstr "síťová chyba"
#: searx/webapp.py:170 #: searx/webapp.py:169
msgid "unexpected crash" msgid "unexpected crash"
msgstr "nečekaná chyba" msgstr "nečekaná chyba"
#: searx/webapp.py:177 #: searx/webapp.py:176
msgid "HTTP error" msgid "HTTP error"
msgstr "chyba HTTP" msgstr "chyba HTTP"
#: searx/webapp.py:178 #: searx/webapp.py:177
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "Chyba spojení HTTP" msgstr "Chyba spojení HTTP"
#: searx/webapp.py:184 #: searx/webapp.py:183
msgid "proxy error" msgid "proxy error"
msgstr "chyba proxy" msgstr "chyba proxy"
#: searx/webapp.py:185 #: searx/webapp.py:184
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "CAPTCHA" msgstr "CAPTCHA"
#: searx/webapp.py:186 #: searx/webapp.py:185
msgid "too many requests" msgid "too many requests"
msgstr "příliš mnoho požadavků" msgstr "příliš mnoho požadavků"
#: searx/webapp.py:187 #: searx/webapp.py:186
msgid "access denied" msgid "access denied"
msgstr "přístup odepřen" msgstr "přístup odepřen"
#: searx/webapp.py:188 #: searx/webapp.py:187
msgid "server API error" msgid "server API error"
msgstr "chyba API serveru" msgstr "chyba API serveru"
#: searx/webapp.py:363 #: searx/webapp.py:362
msgid "No item found" msgid "No item found"
msgstr "Nic nenalezeno" msgstr "Nic nenalezeno"
#: searx/engines/qwant.py:212 #: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source" msgid "Source"
msgstr "zdroj" msgstr "zdroj"
#: searx/webapp.py:367 #: searx/webapp.py:366
msgid "Error loading the next page" msgid "Error loading the next page"
msgstr "Chyba při načítání další stránky" 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" msgid "Invalid settings, please edit your preferences"
msgstr "Neplatné nastavení, upravte své předvolby" msgstr "Neplatné nastavení, upravte své předvolby"
#: searx/webapp.py:532 #: searx/webapp.py:534
msgid "Invalid settings" msgid "Invalid settings"
msgstr "Neplatné nastavení" msgstr "Neplatné nastavení"
#: searx/webapp.py:609 searx/webapp.py:685 #: searx/webapp.py:611 searx/webapp.py:687
msgid "search error" msgid "search error"
msgstr "chyba vyhledávání" 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" msgid "{minutes} minute(s) ago"
msgstr "před {minutes} minutami" msgstr "před {minutes} minutami"
#: searx/webapp.py:733 #: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago" msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "před {hours} hodinami, {minutes} minutami" msgstr "před {hours} hodinami, {minutes} minutami"
#: searx/webapp.py:859
msgid "Suspended"
msgstr "Pozastaveno"
#: searx/answerers/random/answerer.py:67 #: searx/answerers/random/answerer.py:67
msgid "Random value generator" msgid "Random value generator"
msgstr "Generátor náhodných hodnot" msgstr "Generátor náhodných hodnot"
@ -261,14 +265,16 @@ msgstr "{title} (ZASTARALÉ)"
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "Tato položka byla nahrazena položkou" msgstr "Tato položka byla nahrazena položkou"
#: searx/engines/pubmed.py:78 #: searx/engines/qwant.py:219
msgid "No abstract is available for this publication."
msgstr "Pro tuto publikaci neexistuje žádný abstrakt."
#: searx/engines/qwant.py:214
msgid "Channel" msgid "Channel"
msgstr "Kanál" msgstr "Kanál"
#: searx/engines/semantic_scholar.py:81
msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr ""
#: searx/engines/tineye.py:40 #: searx/engines/tineye.py:40
msgid "" msgid ""
"Could not read that image url. This may be due to an unsupported file " "Could not read that image url. This may be due to an unsupported file "
@ -276,8 +282,8 @@ msgid ""
" WebP." " WebP."
msgstr "" msgstr ""
"Nelze načíst url adresu obrázku. Příčinou může být nepodporovaný formát " "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 " "souboru. TinEye podporuje pouze obrázky ve formátu JPEG, PNG, GIF, BMP, "
"nebo WebP." "TIFF nebo WebP."
#: searx/engines/tineye.py:46 #: searx/engines/tineye.py:46
msgid "" msgid ""
@ -291,6 +297,22 @@ msgstr ""
msgid "The image could not be downloaded." msgid "The image could not be downloaded."
msgstr "Obrázek se nepodařilo stáhnout." 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 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "Převádí řetězce na různé hash hodnoty." msgstr "Převádí řetězce na různé hash hodnoty."
@ -332,8 +354,8 @@ msgstr ""
"vypnuta, je možné vybrat více kategorií (vyžaduje JavaScript)" "vypnuta, je možné vybrat více kategorií (vyžaduje JavaScript)"
#: searx/plugins/self_info.py:20 #: searx/plugins/self_info.py:20
msgid "Self Informations" msgid "Self Information"
msgstr "Informace o sobě" msgstr ""
#: searx/plugins/self_info.py:21 #: searx/plugins/self_info.py:21
msgid "" msgid ""
@ -365,9 +387,7 @@ msgstr ""
#: searx/plugins/tor_check.py:78 #: searx/plugins/tor_check.py:78
msgid "You are using TOR. Your IP address seems to be: {ip_address}." msgid "You are using TOR. Your IP address seems to be: {ip_address}."
msgstr "" msgstr "Používáte TOR. Zdá se, že vaše IP adresa je: {ip_address}."
"List výstupního uzlu TORu (https://check.torproject.org/exit-addresses) "
"je nedosažitelný."
#: searx/plugins/tor_check.py:84 #: searx/plugins/tor_check.py:84
msgid "You are not using TOR. Your IP address seems to be: {ip_address}." 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" msgstr "Poháněno softwarem"
#: searx/templates/simple/base.html:64 #: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "soukromí respektujícím, nastavitelným multivyhledávačem" msgstr ""
#: searx/templates/simple/base.html:65 #: searx/templates/simple/base.html:65
msgid "Source code" msgid "Source code"
@ -463,6 +483,7 @@ msgstr "Délka"
#: searx/templates/simple/macros.html:37 #: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18 #: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author" msgid "Author"
msgstr "Autor" 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ě" msgstr "Zobrazit ladící záznamy a poslat hlášení o chybě"
#: searx/templates/simple/preferences.html:53 #: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67 #: searx/templates/simple/stats.html:64
msgid "Median" msgid "Median"
msgstr "Medián" msgstr "Medián"
#: searx/templates/simple/preferences.html:54 #: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73 #: searx/templates/simple/stats.html:70
msgid "P80" msgid "P80"
msgstr "P80" msgstr "P80"
#: searx/templates/simple/preferences.html:55 #: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79 #: searx/templates/simple/stats.html:76
msgid "P95" msgid "P95"
msgstr "P95" msgstr "P95"
@ -682,13 +703,10 @@ msgstr "Metoda HTTP"
#: searx/templates/simple/preferences.html:264 #: searx/templates/simple/preferences.html:264
msgid "" msgid ""
"Change how forms are submited, <a " "Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>" " rel=\"external\">learn more about request methods</a>"
msgstr "" 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 #: searx/templates/simple/preferences.html:269
msgid "Image proxy" msgid "Image proxy"
@ -953,67 +971,63 @@ msgstr "Skóre"
msgid "Result count" msgid "Result count"
msgstr "Počet výsledků" msgstr "Počet výsledků"
#: searx/templates/simple/stats.html:38 #: searx/templates/simple/stats.html:59
msgid "Scores per result"
msgstr "Skóre na výsledek"
#: searx/templates/simple/stats.html:62
msgid "Total" msgid "Total"
msgstr "Celkem" msgstr "Celkem"
#: searx/templates/simple/stats.html:63 #: searx/templates/simple/stats.html:60
msgid "HTTP" msgid "HTTP"
msgstr "HTTP" msgstr "HTTP"
#: searx/templates/simple/stats.html:64 #: searx/templates/simple/stats.html:61
msgid "Processing" msgid "Processing"
msgstr "Zpracovávám" msgstr "Zpracovávám"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Warnings" msgid "Warnings"
msgstr "Varování" msgstr "Varování"
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Errors and exceptions" msgid "Errors and exceptions"
msgstr "Chyby a výjimky" msgstr "Chyby a výjimky"
#: searx/templates/simple/stats.html:108 #: searx/templates/simple/stats.html:105
msgid "Exception" msgid "Exception"
msgstr "Výjimka" msgstr "Výjimka"
#: searx/templates/simple/stats.html:110 #: searx/templates/simple/stats.html:107
msgid "Message" msgid "Message"
msgstr "Zpráva" msgstr "Zpráva"
#: searx/templates/simple/stats.html:112 #: searx/templates/simple/stats.html:109
msgid "Percentage" msgid "Percentage"
msgstr "Procenta" msgstr "Procenta"
#: searx/templates/simple/stats.html:114 #: searx/templates/simple/stats.html:111
msgid "Parameter" msgid "Parameter"
msgstr "Parametr" msgstr "Parametr"
#: searx/templates/simple/stats.html:122 #: searx/templates/simple/stats.html:119
msgid "Filename" msgid "Filename"
msgstr "Název souboru" msgstr "Název souboru"
#: searx/templates/simple/stats.html:123 #: searx/templates/simple/stats.html:120
msgid "Function" msgid "Function"
msgstr "Funkce" msgstr "Funkce"
#: searx/templates/simple/stats.html:124 #: searx/templates/simple/stats.html:121
msgid "Code" msgid "Code"
msgstr "Kód" msgstr "Kód"
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:128
msgid "Checker" msgid "Checker"
msgstr "Zkoušeč" msgstr "Zkoušeč"
#: searx/templates/simple/stats.html:134 #: searx/templates/simple/stats.html:131
msgid "Failed test" msgid "Failed test"
msgstr "Test selhal" msgstr "Test selhal"
#: searx/templates/simple/stats.html:135 #: searx/templates/simple/stats.html:132
msgid "Comment(s)" msgid "Comment(s)"
msgstr "Komentář(e)" msgstr "Komentář(e)"
@ -1102,6 +1116,50 @@ msgstr "zobrazit mapu"
msgid "hide map" msgid "hide map"
msgstr "skrýt mapu" 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 #: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link" msgid "magnet link"
msgstr "odkaz magnet" msgstr "odkaz magnet"
@ -1403,3 +1461,27 @@ msgstr "skrýt video"
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "nastavení" #~ 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: # Translators:
# Cymrodor <aled@aledpowell.cymru>, 2019 # Cymrodor <aled@aledpowell.cymru>, 2019
# Markus Heiser <markus.heiser@darmarit.de>, 2022. # Markus Heiser <markus.heiser@darmarit.de>, 2022.
# CJ <charl.cj.monke@gmail.com>, 2022.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-07-23 14:08+0000\n" "POT-Creation-Date: 2022-09-28 07:29+0000\n"
"PO-Revision-Date: 2022-07-29 07:17+0000\n" "PO-Revision-Date: 2022-09-28 07:29+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" "Last-Translator: CJ <charl.cj.monke@gmail.com>\n"
"Language-Team: Welsh <https://weblate.bubu1.eu/projects/searxng/searxng/cy/>"
"\n"
"Language: cy\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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 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" "Generated-By: Babel 2.10.3\n"
#. CONSTANT_NAMES['DEFAULT_GROUP_NAME'] #. CONSTANT_NAMES['DEFAULT_GROUP_NAME']
@ -106,128 +106,133 @@ msgstr "geiriau"
#. CATEGORY_GROUPS['PACKAGES'] #. CATEGORY_GROUPS['PACKAGES']
#: searx/searxng.msg #: searx/searxng.msg
msgid "packages" msgid "packages"
msgstr "" msgstr "pecyn"
#. CATEGORY_GROUPS['Q_A'] #. CATEGORY_GROUPS['Q_A']
#: searx/searxng.msg #: searx/searxng.msg
msgid "q&a" msgid "q&a"
msgstr "" msgstr "q&a"
#. CATEGORY_GROUPS['REPOS'] #. CATEGORY_GROUPS['REPOS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "repos" msgid "repos"
msgstr "" msgstr "repos"
#. CATEGORY_GROUPS['SOFTWARE_WIKIS'] #. CATEGORY_GROUPS['SOFTWARE_WIKIS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "software wikis" msgid "software wikis"
msgstr "" msgstr "wikis meddalwedd"
#. CATEGORY_GROUPS['WEB'] #. CATEGORY_GROUPS['WEB']
#: searx/searxng.msg #: searx/searxng.msg
msgid "web" msgid "web"
msgstr "" msgstr "gwe"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg
msgid "scientific publications"
msgstr "cyhoeddiadau gwyddonol"
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
msgid "auto" msgid "auto"
msgstr "" msgstr "auto"
#. STYLE_NAMES['LIGHT'] #. STYLE_NAMES['LIGHT']
#: searx/searxng.msg #: searx/searxng.msg
msgid "light" msgid "light"
msgstr "" msgstr "golau"
#. STYLE_NAMES['DARK'] #. STYLE_NAMES['DARK']
#: searx/searxng.msg #: searx/searxng.msg
msgid "dark" msgid "dark"
msgstr "tywyll" msgstr "tywyll"
#: searx/webapp.py:165 #: searx/webapp.py:164
msgid "timeout" msgid "timeout"
msgstr "" msgstr "amser allan"
#: searx/webapp.py:166 #: searx/webapp.py:165
msgid "parsing error" msgid "parsing error"
msgstr "gwall dosrannu" msgstr "gwall dosrannu"
#: searx/webapp.py:167 #: searx/webapp.py:166
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "Gwall protocol HTTP" msgstr "Gwall protocol HTTP"
#: searx/webapp.py:168 #: searx/webapp.py:167
msgid "network error" msgid "network error"
msgstr "gwall rhwydwaith" msgstr "gwall rhwydwaith"
#: searx/webapp.py:170 #: searx/webapp.py:169
msgid "unexpected crash" msgid "unexpected crash"
msgstr "damwain annisgwyl" msgstr "damwain annisgwyl"
#: searx/webapp.py:177 #: searx/webapp.py:176
msgid "HTTP error" msgid "HTTP error"
msgstr "gwall http" msgstr "gwall http"
#: searx/webapp.py:178 #: searx/webapp.py:177
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "gwall cysylltiad http" msgstr "gwall cysylltiad http"
#: searx/webapp.py:184 #: searx/webapp.py:183
msgid "proxy error" msgid "proxy error"
msgstr "gwall dirprwy" msgstr "gwall dirprwy"
#: searx/webapp.py:185 #: searx/webapp.py:184
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "CAPTCHA" msgstr "CAPTCHA"
#: searx/webapp.py:186 #: searx/webapp.py:185
msgid "too many requests" msgid "too many requests"
msgstr "gormod o geisiadau" msgstr "gormod o geisiadau"
#: searx/webapp.py:187 #: searx/webapp.py:186
msgid "access denied" msgid "access denied"
msgstr "" msgstr "mynediad wedi ei wrthod"
#: searx/webapp.py:188 #: searx/webapp.py:187
msgid "server API error" msgid "server API error"
msgstr "" msgstr "gwall API gweinydd"
#: searx/webapp.py:363 #: searx/webapp.py:362
msgid "No item found" msgid "No item found"
msgstr "Ni chanfuwyd eitem" msgstr "Ni chanfuwyd eitem"
#: searx/engines/qwant.py:212 #: searx/engines/qwant.py:217
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:365 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:364
msgid "Source" msgid "Source"
msgstr "" msgstr "Ffynhonnell"
#: searx/webapp.py:367 #: searx/webapp.py:366
msgid "Error loading the next page" 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" msgid "Invalid settings, please edit your preferences"
msgstr "Gosodiadau annilys. Addasa dy ddewisiadau." msgstr "Gosodiadau annilys. Addasa dy ddewisiadau."
#: searx/webapp.py:532 #: searx/webapp.py:534
msgid "Invalid settings" msgid "Invalid settings"
msgstr "Gosodiadau annilys" msgstr "Gosodiadau annilys"
#: searx/webapp.py:609 searx/webapp.py:685 #: searx/webapp.py:611 searx/webapp.py:687
msgid "search error" msgid "search error"
msgstr "gwall chwilio" msgstr "gwall chwilio"
#: searx/webapp.py:731 #: searx/webapp.py:849
msgid "Suspended"
msgstr ""
#: searx/webutils.py:161
msgid "{minutes} minute(s) ago" msgid "{minutes} minute(s) ago"
msgstr "{minutes} munud yn ôl" msgstr "{minutes} munud yn ôl"
#: searx/webapp.py:733 #: searx/webutils.py:162
msgid "{hours} hour(s), {minutes} minute(s) ago" msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} awr, {minutes} munud yn ôl" msgstr "{hours} awr, {minutes} munud yn ôl"
#: searx/webapp.py:859
msgid "Suspended"
msgstr ""
#: searx/answerers/random/answerer.py:67 #: searx/answerers/random/answerer.py:67
msgid "Random value generator" msgid "Random value generator"
msgstr "" msgstr ""
@ -256,12 +261,14 @@ msgstr ""
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "" msgstr ""
#: searx/engines/pubmed.py:78 #: searx/engines/qwant.py:219
msgid "No abstract is available for this publication." msgid "Channel"
msgstr "" msgstr ""
#: searx/engines/qwant.py:214 #: searx/engines/semantic_scholar.py:81
msgid "Channel" msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
msgstr "" msgstr ""
#: searx/engines/tineye.py:40 #: searx/engines/tineye.py:40
@ -281,6 +288,22 @@ msgstr ""
msgid "The image could not be downloaded." 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 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "" msgstr ""
@ -318,7 +341,7 @@ msgid ""
msgstr "" msgstr ""
#: searx/plugins/self_info.py:20 #: searx/plugins/self_info.py:20
msgid "Self Informations" msgid "Self Information"
msgstr "" msgstr ""
#: searx/plugins/self_info.py:21 #: searx/plugins/self_info.py:21
@ -400,7 +423,7 @@ msgid "Powered by"
msgstr "Pwerwyd gan" msgstr "Pwerwyd gan"
#: searx/templates/simple/base.html:64 #: searx/templates/simple/base.html:64
msgid "a privacy-respecting, hackable metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "" msgstr ""
#: searx/templates/simple/base.html:65 #: searx/templates/simple/base.html:65
@ -438,6 +461,7 @@ msgstr ""
#: searx/templates/simple/macros.html:37 #: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18 #: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6
msgid "Author" msgid "Author"
msgstr "" msgstr ""
@ -481,17 +505,17 @@ msgid "View error logs and submit a bug report"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:53 #: searx/templates/simple/preferences.html:53
#: searx/templates/simple/stats.html:67 #: searx/templates/simple/stats.html:64
msgid "Median" msgid "Median"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:54 #: searx/templates/simple/preferences.html:54
#: searx/templates/simple/stats.html:73 #: searx/templates/simple/stats.html:70
msgid "P80" msgid "P80"
msgstr "" msgstr ""
#: searx/templates/simple/preferences.html:55 #: searx/templates/simple/preferences.html:55
#: searx/templates/simple/stats.html:79 #: searx/templates/simple/stats.html:76
msgid "P95" msgid "P95"
msgstr "" msgstr ""
@ -653,7 +677,7 @@ msgstr ""
#: searx/templates/simple/preferences.html:264 #: searx/templates/simple/preferences.html:264
msgid "" msgid ""
"Change how forms are submited, <a " "Change how forms are submitted, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>" " rel=\"external\">learn more about request methods</a>"
msgstr "" msgstr ""
@ -907,67 +931,63 @@ msgstr "Sgoriau"
msgid "Result count" msgid "Result count"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:38 #: searx/templates/simple/stats.html:59
msgid "Scores per result"
msgstr ""
#: searx/templates/simple/stats.html:62
msgid "Total" msgid "Total"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:63 #: searx/templates/simple/stats.html:60
msgid "HTTP" msgid "HTTP"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:64 #: searx/templates/simple/stats.html:61
msgid "Processing" msgid "Processing"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Warnings" msgid "Warnings"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:102 #: searx/templates/simple/stats.html:99
msgid "Errors and exceptions" msgid "Errors and exceptions"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:108 #: searx/templates/simple/stats.html:105
msgid "Exception" msgid "Exception"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:110 #: searx/templates/simple/stats.html:107
msgid "Message" msgid "Message"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:112 #: searx/templates/simple/stats.html:109
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:114 #: searx/templates/simple/stats.html:111
msgid "Parameter" msgid "Parameter"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:122 #: searx/templates/simple/stats.html:119
msgid "Filename" msgid "Filename"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:123 #: searx/templates/simple/stats.html:120
msgid "Function" msgid "Function"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:124 #: searx/templates/simple/stats.html:121
msgid "Code" msgid "Code"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:128
msgid "Checker" msgid "Checker"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:134 #: searx/templates/simple/stats.html:131
msgid "Failed test" msgid "Failed test"
msgstr "" msgstr ""
#: searx/templates/simple/stats.html:135 #: searx/templates/simple/stats.html:132
msgid "Comment(s)" msgid "Comment(s)"
msgstr "" msgstr ""
@ -1056,6 +1076,50 @@ msgstr "dangos map"
msgid "hide map" msgid "hide map"
msgstr "cuddio 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 #: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link" msgid "magnet link"
msgstr "dolen magnet" msgstr "dolen magnet"
@ -1354,3 +1418,23 @@ msgstr "cuddio fideo"
#~ msgid "preferences" #~ msgid "preferences"
#~ msgstr "dewisiadau" #~ 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