forked from Ponysearch/Ponysearch
Merge branch 'searxng:master' into master
This commit is contained in:
commit
9740ed836a
213 changed files with 18116 additions and 6228 deletions
|
@ -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
28
.github/workflows/security.yml
vendored
Normal 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'
|
|
@ -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
|
||||||
~~~~
|
~~~~
|
||||||
|
|
|
@ -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}"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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`.
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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`.
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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::
|
||||||
|
|
||||||
|
|
|
@ -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 it’s annoying to care
|
tool, the build process will break. From the authors POV it’s 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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
@ -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
|
@ -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",
|
||||||
|
|
|
@ -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
77
searx/engines/9gag.py
Normal 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
|
|
@ -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
|
||||||
|
|
||||||
|
|
57
searx/engines/apple_app_store.py
Normal file
57
searx/engines/apple_app_store.py
Normal 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
113
searx/engines/apple_maps.py
Normal 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
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
59
searx/engines/crossref.py
Normal 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
62
searx/engines/deepl.py
Normal 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
|
|
@ -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', '')
|
||||||
|
|
136
searx/engines/duckduckgo_weather.py
Normal file
136
searx/engines/duckduckgo_weather.py
Normal 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
|
|
@ -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(
|
||||||
|
|
|
@ -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 []
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
75
searx/engines/twitter.py
Normal 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
|
|
@ -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 [
|
||||||
|
|
|
@ -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
136
searx/engines/wttr.py
Normal 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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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']
|
||||||
)
|
)
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
4
searx/static/themes/simple/js/searxng.min.js
vendored
4
searx/static/themes/simple/js/searxng.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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",
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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") }}‎ {% 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") }}‎ {% 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 -%}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
38
searx/templates/simple/result_templates/paper.html
Normal file
38
searx/templates/simple/result_templates/paper.html
Normal 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 -%}
|
||||||
|
{{- result.volume -}}
|
||||||
|
{%- if result.number -%}
|
||||||
|
.{{- result.number -}}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- if result.pages -%}
|
||||||
|
{{- 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) }}
|
|
@ -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">
|
||||||
|
|
Binary file not shown.
|
@ -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>"
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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>"
|
||||||
|
|
Binary file not shown.
|
@ -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>"
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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 ""
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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 ""
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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>"
|
||||||
|
|
Binary file not shown.
|
@ -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>"
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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
Loading…
Reference in a new issue