Merge branch 'master' into engines-with-token
* master: (92 commits) [pylint] engines/currency_convert.py Update searx.data - update_firefox_version.py Update searx.data - update_ahmia_blacklist.py Update searx.data - update_currencies.py Update searx.data - update_wikidata_units.py [build] /static [simple] improve margin of #linkto_preferences [fix] engines description - currency_convert.py [simple] add aria-label to preferences link [simple] link preferences on /about and /stats [mod] tineye engine: minor changes [fix] 1x engine [build] /static [simple] introduce page_with_header.html template [mod] tineye engine: set engine_type to 'online_url_search' [enh] implement a OnlineUrlSearchProcessor Fix setup.py help folder [build] /static [fix] simple theme: /preferences: cookies table is LTR [mod] remove deprecate code ...
This commit is contained in:
		
						commit
						018abdcd80
					
				| @ -32,6 +32,10 @@ | |||||||
| ;; Jedi, flycheck & other python stuff should use the 'python-shell-interpreter' | ;; Jedi, flycheck & other python stuff should use the 'python-shell-interpreter' | ||||||
| ;; from the local py3 environment. | ;; from the local py3 environment. | ||||||
| ;; | ;; | ||||||
|  | ;; For pyright support you need to install:: | ||||||
|  | ;; | ||||||
|  | ;;    M-x package-install lsp-pyright | ||||||
|  | ;; | ||||||
| ;; Other useful jedi stuff you might add to your ~/.emacs:: | ;; Other useful jedi stuff you might add to your ~/.emacs:: | ||||||
| ;; | ;; | ||||||
| ;;     (global-set-key [f6] 'flycheck-mode) | ;;     (global-set-key [f6] 'flycheck-mode) | ||||||
| @ -99,12 +103,19 @@ | |||||||
|                ;; use nodejs from the (local) NVM environment (see nvm-dir) |                ;; use nodejs from the (local) NVM environment (see nvm-dir) | ||||||
|                (nvm-use-for-buffer) |                (nvm-use-for-buffer) | ||||||
|                (setq-local js-indent-level 2) |                (setq-local js-indent-level 2) | ||||||
|  |                ;; flycheck should use the eslint checker from developer tools | ||||||
|  |                (setq-local flycheck-javascript-eslint-executable | ||||||
|  |                            (expand-file-name "node_modules/.bin/eslint" prj-root)) | ||||||
|  | 
 | ||||||
|                (flycheck-mode) |                (flycheck-mode) | ||||||
|                )))) |                )))) | ||||||
| 
 | 
 | ||||||
|  (python-mode |  (python-mode | ||||||
|   . ((eval . (progn |   . ((eval . (progn | ||||||
| 
 |                ;; use nodejs from the (local) NVM environment (see nvm-dir) | ||||||
|  |                (nvm-use-for-buffer) | ||||||
|  |                (if (featurep 'lsp-pyright) | ||||||
|  |                    (lsp)) | ||||||
|                (setq-local python-environment-virtualenv |                (setq-local python-environment-virtualenv | ||||||
|                            (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root) |                            (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root) | ||||||
|                                  ;;"--system-site-packages" |                                  ;;"--system-site-packages" | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| # to sync with .dockerignore | # to sync with .dockerignore & pyrightconfig.json | ||||||
| 
 | 
 | ||||||
| *.pyc | *.pyc | ||||||
| */*.pyc | */*.pyc | ||||||
| @ -16,3 +16,6 @@ dist/ | |||||||
| local/ | local/ | ||||||
| gh-pages/ | gh-pages/ | ||||||
| *.egg-info/ | *.egg-info/ | ||||||
|  | 
 | ||||||
|  | /package-lock.json | ||||||
|  | /node_modules/ | ||||||
|  | |||||||
| @ -1,8 +0,0 @@ | |||||||
| # -*- coding: utf-8; mode: conf-unix -*- |  | ||||||
| # |  | ||||||
| # Developement tools pre-installed in NVM's node installation [1] |  | ||||||
| # |  | ||||||
| # [1] https://github.com/nvm-sh/nvm#default-global-packages-from-file-while-installing |  | ||||||
| 
 |  | ||||||
| eslint |  | ||||||
| 
 |  | ||||||
							
								
								
									
										6
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								Makefile
									
									
									
									
									
								
							| @ -50,8 +50,8 @@ search.checker.%: install | |||||||
| 	$(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))" | 	$(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))" | ||||||
| 
 | 
 | ||||||
| PHONY += test ci.test test.shell | PHONY += test ci.test test.shell | ||||||
| ci.test: test.yamllint test.black test.pylint test.unit test.robot | ci.test: test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst | ||||||
| test:    test.yamllint test.black test.pylint test.unit test.robot test.shell | test:    test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst test.shell | ||||||
| test.shell: | test.shell: | ||||||
| 	$(Q)shellcheck -x -s dash \
 | 	$(Q)shellcheck -x -s dash \
 | ||||||
| 		dockerfiles/docker-entrypoint.sh | 		dockerfiles/docker-entrypoint.sh | ||||||
| @ -86,7 +86,7 @@ MANAGE += py.build py.clean | |||||||
| MANAGE += pyenv pyenv.install pyenv.uninstall | MANAGE += pyenv pyenv.install pyenv.uninstall | ||||||
| MANAGE += pypi.upload pypi.upload.test | MANAGE += pypi.upload pypi.upload.test | ||||||
| MANAGE += format.python | MANAGE += format.python | ||||||
| MANAGE += test.yamllint test.pylint test.black test.unit test.coverage test.robot test.clean | MANAGE += test.yamllint test.pylint test.pyright test.black test.unit test.coverage test.robot test.rst test.clean | ||||||
| MANAGE += themes.all themes.oscar themes.simple themes.simple.test pygments.less | MANAGE += themes.all themes.oscar themes.simple themes.simple.test pygments.less | ||||||
| MANAGE += static.build.commit static.build.drop static.build.restore | MANAGE += static.build.commit static.build.drop static.build.restore | ||||||
| MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs | MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs | ||||||
|  | |||||||
							
								
								
									
										87
									
								
								README.rst
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								README.rst
									
									
									
									
									
								
							| @ -1,11 +1,21 @@ | |||||||
| .. SPDX-License-Identifier: AGPL-3.0-or-later | .. SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
| 
 | 
 | ||||||
|  | ---- | ||||||
|  | 
 | ||||||
| .. figure:: https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng.svg | .. figure:: https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng.svg | ||||||
|    :target: https://docs.searxng.org/ |    :target: https://docs.searxng.org/ | ||||||
|    :alt: SearXNG |    :alt: SearXNG | ||||||
|    :width: 100% |    :width: 100% | ||||||
|    :align: center |    :align: center | ||||||
| 
 | 
 | ||||||
|  | ---- | ||||||
|  | 
 | ||||||
|  | Privacy-respecting, hackable `metasearch engine`_ | ||||||
|  | 
 | ||||||
|  | If you are looking for running instances, ready to use, then visit searx.space_. | ||||||
|  | Otherwise jump to the user_, admin_ and developer_ handbooks you will find on | ||||||
|  | our homepage_. | ||||||
|  | 
 | ||||||
| |SearXNG install| | |SearXNG install| | ||||||
| |SearXNG homepage| | |SearXNG homepage| | ||||||
| |SearXNG wiki| | |SearXNG wiki| | ||||||
| @ -15,16 +25,11 @@ | |||||||
| |weblate| | |weblate| | ||||||
| |SearXNG logo| | |SearXNG logo| | ||||||
| 
 | 
 | ||||||
| Privacy-respecting, hackable `metasearch engine`_ | ---- | ||||||
| 
 |  | ||||||
| If you are looking for running instances, ready to use, then visit searx.space_. |  | ||||||
| 
 |  | ||||||
| Otherwise jump to the user_, admin_ and developer_ handbooks you will find on |  | ||||||
| our homepage_. |  | ||||||
| 
 | 
 | ||||||
| .. _searx.space: https://searx.space | .. _searx.space: https://searx.space | ||||||
| .. _user: https://docs.searxng.org/user | .. _user: https://docs.searxng.org/user | ||||||
| .. _admin: https://docs.searxng.org/user/admin | .. _admin: https://docs.searxng.org/admin | ||||||
| .. _developer: https://docs.searxng.org/dev | .. _developer: https://docs.searxng.org/dev | ||||||
| .. _homepage: https://docs.searxng.org/ | .. _homepage: https://docs.searxng.org/ | ||||||
| .. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine | .. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine | ||||||
| @ -58,26 +63,76 @@ our homepage_. | |||||||
|    :target: https://weblate.bubu1.eu/projects/searxng/ |    :target: https://weblate.bubu1.eu/projects/searxng/ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| SearXNG is a fork of `searx`_: | Contact | ||||||
|  | ======= | ||||||
| 
 | 
 | ||||||
| * `the differences with searx <https://github.com/searxng/searxng/issues/46>`_ | Come join us if you have questions or just want to chat about SearXNG. | ||||||
| * `exhaustive changelog <https://github.com/searxng/searxng/wiki/Changes-from-version-1.0.0>`_ | 
 | ||||||
|  | Matrix | ||||||
|  |   `#searxng:matrix.org <https://matrix.to/#/#searxng:matrix.org>`_ | ||||||
|  | 
 | ||||||
|  | IRC | ||||||
|  |   `#searxng on libera.chat <https://web.libera.chat/?channel=#searxng>`_ | ||||||
|  |   which is bridged to Matrix. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Differences to searx | ||||||
|  | ==================== | ||||||
|  | 
 | ||||||
|  | SearXNG is a fork of `searx`_.  Here are some of the changes: | ||||||
| 
 | 
 | ||||||
| .. _searx: https://github.com/searx/searx | .. _searx: https://github.com/searx/searx | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Contact | User experience | ||||||
| """"""" | --------------- | ||||||
| 
 | 
 | ||||||
| Matrix: `#searxng:matrix.org <https://matrix.to/#/#searxng:matrix.org>`_ | - Huge update of the simple theme: | ||||||
| 
 | 
 | ||||||
| IRC:  `#searxng on libera.chat <https://web.libera.chat/?channel=#searxng>`_ which is bridged to Matrix. |   * usable on desktop, tablet and mobile | ||||||
|  |   * light and dark versions (you can choose in the preferences) | ||||||
|  |   * support right-to-left languages | ||||||
|  | 
 | ||||||
|  | - the translations are up to date, you can contribute on `Weblate`_ | ||||||
|  | - the preferences page has been updated: | ||||||
|  | 
 | ||||||
|  |   * you can see which engines are reliable or not | ||||||
|  |   * engines are grouped inside each tab | ||||||
|  |   * each engine has a description | ||||||
|  | 
 | ||||||
|  | - it is easier to report a bug of an engine | ||||||
|  | - but you can also disable the recording of the metrics on the server | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Setup | ||||||
|  | ----- | ||||||
|  | 
 | ||||||
|  | - the Docker image is now also built for ARM64 and ARM/v7 architectures | ||||||
|  | - you don't need `Morty`_ to proxy the images even on a public instance | ||||||
|  | - on the way to embed `Filtron`_ into SearXNG | ||||||
|  | - up to date installation scripts | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Contributing is easier | ||||||
|  | ---------------------- | ||||||
|  | 
 | ||||||
|  | - readable debug log | ||||||
|  | - contributions to the themes are made easier, check out our `Development | ||||||
|  |   Quickstart`_ guide | ||||||
|  | - a lot of code cleanup and bug fixes | ||||||
|  | - the dependencies are up to date | ||||||
|  | 
 | ||||||
|  | .. _Morty: https://github.com/asciimoo/morty | ||||||
|  | .. _Filtron: https://github.com/searxng/filtron | ||||||
|  | .. _Weblate: https://weblate.bubu1.eu/projects/searxng/searxng/ | ||||||
|  | .. _Development Quickstart: https://docs.searxng.org/dev/quickstart.html | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Translations | Translations | ||||||
| """""""""""" | ============ | ||||||
| 
 | 
 | ||||||
| We need translators, suggestions are welcome at https://weblate.bubu1.eu/projects/searxng/searxng/ | We need translators, suggestions are welcome at | ||||||
|  | https://weblate.bubu1.eu/projects/searxng/searxng/ | ||||||
| 
 | 
 | ||||||
| .. figure:: https://weblate.bubu1.eu/widgets/searxng/-/multi-auto.svg | .. figure:: https://weblate.bubu1.eu/widgets/searxng/-/multi-auto.svg | ||||||
|    :target: https://weblate.bubu1.eu/projects/searxng/ |    :target: https://weblate.bubu1.eu/projects/searxng/ | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								SECURITY.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								SECURITY.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | # Security Policy | ||||||
|  | 
 | ||||||
|  | We love responsible reports of (potential) security issues in SearXNG. | ||||||
|  | 
 | ||||||
|  | You can contact us at security@searxng.org. | ||||||
|  | 
 | ||||||
|  | Be sure to provide as much information as possible and if found | ||||||
|  | also reproduction steps of the identified vulnerability. Also | ||||||
|  | add the specific URL of the project as well as code you found | ||||||
|  | the issue in to your report. | ||||||
| @ -136,12 +136,10 @@ find an example configuration below: | |||||||
| MySQL | MySQL | ||||||
| ----- | ----- | ||||||
| 
 | 
 | ||||||
| .. _mysql-connector-python: https://pypi.org/project/mysql-connector-python |  | ||||||
| 
 |  | ||||||
| .. sidebar:: info | .. sidebar:: info | ||||||
| 
 | 
 | ||||||
|    - :origin:`mysql_server.py <searx/engines/mysql_server.py>` |    - :origin:`mysql_server.py <searx/engines/mysql_server.py>` | ||||||
|    - ``pip install`` mysql-connector-python_ |    - ``pip install`` :pypi:`mysql-connector-python <mysql-connector-python>` | ||||||
| 
 | 
 | ||||||
| MySQL is said to be the most popular open source database. Before enabling MySQL | MySQL is said to be the most popular open source database. Before enabling MySQL | ||||||
| engine, you must install the package ``mysql-connector-python``. | engine, you must install the package ``mysql-connector-python``. | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ Administrator documentation | |||||||
|    installation-nginx |    installation-nginx | ||||||
|    installation-apache |    installation-apache | ||||||
|    installation-docker |    installation-docker | ||||||
|  |    installation-switch2ng | ||||||
|    update-searxng |    update-searxng | ||||||
|    engines/index |    engines/index | ||||||
|    api |    api | ||||||
|  | |||||||
							
								
								
									
										75
									
								
								docs/admin/installation-switch2ng.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								docs/admin/installation-switch2ng.rst
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | |||||||
|  | .. _installation switch2ng: | ||||||
|  | 
 | ||||||
|  | ============================ | ||||||
|  | Switch from searx to SearXNG | ||||||
|  | ============================ | ||||||
|  | 
 | ||||||
|  | .. sidebar:: info | ||||||
|  | 
 | ||||||
|  |    - :pull:`456` | ||||||
|  |    - :pull:`A comment about rolling release <446#issuecomment-954730358>` | ||||||
|  | 
 | ||||||
|  | .. contents:: Contents | ||||||
|  |    :depth: 2 | ||||||
|  |    :local: | ||||||
|  |    :backlinks: entry | ||||||
|  | 
 | ||||||
|  | If you have a searx installation on your sever and want to switch to SearXNG, | ||||||
|  | you need to uninstall searx first.  If you have an old searx docker installation | ||||||
|  | replace your docker image / see :ref:`installation docker`. | ||||||
|  | 
 | ||||||
|  | If your searx instance was installed *"Step by step"* or by the *"Installation | ||||||
|  | scripts"*, you need to undo the installation procedure completely.  If you have | ||||||
|  | morty & filtron installed, it is recommended to uninstall these services also. | ||||||
|  | In case of scripts, to uninstall use the scripts from the origin you installed | ||||||
|  | searx from. | ||||||
|  | 
 | ||||||
|  | If you have removed the old searx installation, clone from SearXNG and and start | ||||||
|  | with your installation procedure (e.g. :ref:`installation scripts`): | ||||||
|  | 
 | ||||||
|  | .. code:: bash | ||||||
|  | 
 | ||||||
|  |    $ cd ~/Downloads | ||||||
|  |    $ git clone https://github.com/searxng/searxng.git searxng | ||||||
|  |    $ cd searxng | ||||||
|  |    $ ... | ||||||
|  | 
 | ||||||
|  | ``.config.sh`` | ||||||
|  | ============== | ||||||
|  | 
 | ||||||
|  | Please take into account; SearXNG has normalized ``.config.sh`` with | ||||||
|  | ``settings.yml`` and some of the environment settings has been removed from or | ||||||
|  | renamed in the ``.config.sh``: | ||||||
|  | 
 | ||||||
|  | - :patch:`[mod] normalize .config.sh with settings.yml <f61c918d>` | ||||||
|  | - :patch:`[fix] ./utils/filtron.sh - FILTRON_TARGET from YAML settings <7196a9b5>` | ||||||
|  | - :patch:`SearXNG: SEARXNG_SETTINGS_PATH <253b8503>` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Check after Installation | ||||||
|  | ======================== | ||||||
|  | 
 | ||||||
|  | Once you have done your installation, you can run a SearXNG *check* procedure, | ||||||
|  | to see if there are some left overs.  In this example there exists a *old* | ||||||
|  | ``/etc/searx/settings.yml``:: | ||||||
|  | 
 | ||||||
|  |    $ sudo -H ./utils/searx.sh install check | ||||||
|  | 
 | ||||||
|  |    ============================ | ||||||
|  |    SearXNG (check installation) | ||||||
|  |    ============================ | ||||||
|  |    ERROR: settings.yml in /etc/searx/ is deprecated, move file to folder /etc/searxng/ | ||||||
|  |    INFO:  SearXNG instance already installed at: /usr/local/searx/searx-src | ||||||
|  |    ... | ||||||
|  |    INFO:  Service account searx exists. | ||||||
|  |    INFO:  ~searx: python environment is available. | ||||||
|  |    INFO:  ~searx: SearXNG software is installed. | ||||||
|  |    INFO:  uWSGI app searxng.ini is enabled. | ||||||
|  |    INFO    searx                         : merge the default settings ( /usr/local/searx/searx-src/searx/settings.yml ) and the user setttings ( /etc/searxng/settings.yml ) | ||||||
|  |    INFO    searx                         : max_request_timeout=None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | To *check* the filtron & morty installations, use similar commands:: | ||||||
|  | 
 | ||||||
|  |   $ sudo -H /utils/filtron.sh install check | ||||||
|  |   $ sudo -H /utils/morty.sh   install check | ||||||
| @ -4,6 +4,10 @@ | |||||||
| Installation | Installation | ||||||
| ============ | ============ | ||||||
| 
 | 
 | ||||||
|  | .. sidebar:: info | ||||||
|  | 
 | ||||||
|  |    :ref:`installation switch2ng` | ||||||
|  | 
 | ||||||
| *You're spoilt for choice*, choose your preferred method of installation. | *You're spoilt for choice*, choose your preferred method of installation. | ||||||
| 
 | 
 | ||||||
| - :ref:`installation docker` | - :ref:`installation docker` | ||||||
|  | |||||||
| @ -3,7 +3,6 @@ | |||||||
| 
 | 
 | ||||||
| import  sys, os | import  sys, os | ||||||
| from pallets_sphinx_themes import ProjectLink | from pallets_sphinx_themes import ProjectLink | ||||||
| from flask import Flask |  | ||||||
| 
 | 
 | ||||||
| from searx import get_setting | from searx import get_setting | ||||||
| from searx.version import VERSION_STRING, GIT_URL, GIT_BRANCH | from searx.version import VERSION_STRING, GIT_URL, GIT_BRANCH | ||||||
| @ -42,12 +41,12 @@ import searx.engines | |||||||
| import searx.plugins | import searx.plugins | ||||||
| import searx.webutils | import searx.webutils | ||||||
| 
 | 
 | ||||||
| # bypass a creepy check of the secret_key in searx.webapp | # import searx.webapp is needed to init the engines & plugins, to init a | ||||||
|  | # (empty) secret_key is needed. | ||||||
| searx.settings['server']['secret_key'] = '' | searx.settings['server']['secret_key'] = '' | ||||||
| from searx.webapp import application | import searx.webapp | ||||||
| 
 | 
 | ||||||
| searx.engines.load_engines(searx.settings['engines']) | searx.engines.load_engines(searx.settings['engines']) | ||||||
| searx.plugins.initialize(application) |  | ||||||
| 
 | 
 | ||||||
| jinja_contexts = { | jinja_contexts = { | ||||||
|     'searx': { |     'searx': { | ||||||
|  | |||||||
| @ -238,10 +238,10 @@ and ``test.robot``.  You can run tests selective, e.g.:: | |||||||
|   ... |   ... | ||||||
|   TEST      test.sh OK |   TEST      test.sh OK | ||||||
| 
 | 
 | ||||||
| .. _make test.sh: | .. _make test.shell: | ||||||
| 
 | 
 | ||||||
| ``make test.sh`` | ``make test.shell`` | ||||||
| ================ | =================== | ||||||
| 
 | 
 | ||||||
| :ref:`sh lint` / if you have changed some bash scripting run this test before | :ref:`sh lint` / if you have changed some bash scripting run this test before | ||||||
| commit. | commit. | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								docs/src/searx.engines.tineye.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								docs/src/searx.engines.tineye.rst
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | .. _tineye engine: | ||||||
|  | 
 | ||||||
|  | ====== | ||||||
|  | Tineye | ||||||
|  | ====== | ||||||
|  | 
 | ||||||
|  | .. automodule:: searx.engines.tineye | ||||||
|  |   :members: | ||||||
|  | 
 | ||||||
							
								
								
									
										35
									
								
								manage
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								manage
									
									
									
									
									
								
							| @ -20,6 +20,8 @@ source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_go.sh" | |||||||
| # shellcheck source=utils/lib_redis.sh | # shellcheck source=utils/lib_redis.sh | ||||||
| source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_redis.sh" | source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_redis.sh" | ||||||
| 
 | 
 | ||||||
|  | PATH="${REPO_ROOT}/node_modules/.bin:${PATH}" | ||||||
|  | 
 | ||||||
| # config | # config | ||||||
| 
 | 
 | ||||||
| PYOBJECTS="searx" | PYOBJECTS="searx" | ||||||
| @ -46,6 +48,10 @@ while IFS= read -r line; do | |||||||
|    YAMLLINT_FILES+=("$line") |    YAMLLINT_FILES+=("$line") | ||||||
| done <<< "$(git ls-files './tests/*.yml' './searx/*.yml' './utils/templates/etc/searxng/*.yml')" | done <<< "$(git ls-files './tests/*.yml' './searx/*.yml' './utils/templates/etc/searxng/*.yml')" | ||||||
| 
 | 
 | ||||||
|  | RST_FILES=( | ||||||
|  |     'README.rst' | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| PYLINT_SEARXNG_DISABLE_OPTION="\ | PYLINT_SEARXNG_DISABLE_OPTION="\ | ||||||
| I,C,R,\ | I,C,R,\ | ||||||
| W0105,W0212,W0511,W0603,W0613,W0621,W0702,W0703,W1401,\ | W0105,W0212,W0511,W0603,W0613,W0621,W0702,W0703,W1401,\ | ||||||
| @ -99,10 +105,12 @@ format.: | |||||||
| test.: | test.: | ||||||
|   yamllint  : lint YAML files (YAMLLINT_FILES) |   yamllint  : lint YAML files (YAMLLINT_FILES) | ||||||
|   pylint    : lint PYLINT_FILES, searx/engines, searx & tests |   pylint    : lint PYLINT_FILES, searx/engines, searx & tests | ||||||
|  |   pyright   : static type check of python sources | ||||||
|   black     : check black code format |   black     : check black code format | ||||||
|   unit      : run unit tests |   unit      : run unit tests | ||||||
|   coverage  : run unit tests with coverage |   coverage  : run unit tests with coverage | ||||||
|   robot     : run robot test |   robot     : run robot test | ||||||
|  |   rst       : test .rst files incl. README.rst | ||||||
|   clean     : clean intermediate test stuff |   clean     : clean intermediate test stuff | ||||||
| themes.: | themes.: | ||||||
|   all       : build all themes |   all       : build all themes | ||||||
| @ -553,6 +561,12 @@ node.env() { | |||||||
|     dump_return $? |     dump_return $? | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | node.env.devtools() { | ||||||
|  |     nodejs.ensure | ||||||
|  |     build_msg INSTALL "package.json: developer and CI tools" | ||||||
|  |     npm install | ||||||
|  | } | ||||||
|  | 
 | ||||||
| node.clean() { | node.clean() { | ||||||
|     if ! required_commands npm 2>/dev/null; then |     if ! required_commands npm 2>/dev/null; then | ||||||
|         build_msg CLEAN "npm is not installed / ignore npm dependencies" |         build_msg CLEAN "npm is not installed / ignore npm dependencies" | ||||||
| @ -677,6 +691,20 @@ test.pylint() { | |||||||
|     dump_return $? |     dump_return $? | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | test.pyright() { | ||||||
|  |     build_msg TEST "[pyright] static type check of python sources" | ||||||
|  |     node.env.devtools | ||||||
|  |     # We run Pyright in the virtual environment because Pyright | ||||||
|  |     # executes "python" to determine the Python version. | ||||||
|  |     build_msg TEST "[pyright] suppress warnings related to intentional monkey patching" | ||||||
|  |     pyenv.cmd npx --no-install pyright -p pyrightconfig-ci.json \ | ||||||
|  |         | grep -v ".py$" \ | ||||||
|  |         | grep -v '/engines/.*.py.* - warning: "logger" is not defined'\ | ||||||
|  |         | grep -v '/engines/.*.py.* - warning: "supported_languages" is not defined' \ | ||||||
|  |         | grep -v '/engines/.*.py.* - warning: "language_aliases" is not defined' | ||||||
|  |     dump_return $? | ||||||
|  | } | ||||||
|  | 
 | ||||||
| test.black() { | test.black() { | ||||||
|     build_msg TEST "[black] \$BLACK_TARGETS" |     build_msg TEST "[black] \$BLACK_TARGETS" | ||||||
|     pyenv.cmd black --check --diff "${BLACK_OPTIONS[@]}" "${BLACK_TARGETS[@]}" |     pyenv.cmd black --check --diff "${BLACK_OPTIONS[@]}" "${BLACK_TARGETS[@]}" | ||||||
| @ -707,6 +735,13 @@ test.robot() { | |||||||
|     dump_return $? |     dump_return $? | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | test.rst() { | ||||||
|  |     build_msg TEST "[reST markup] ${RST_FILES[*]}" | ||||||
|  |     for rst in "${RST_FILES[@]}"; do | ||||||
|  |         pyenv.cmd rst2html.py --halt error "$rst" > /dev/null || die 42 "fix issue in $rst" | ||||||
|  |     done | ||||||
|  | } | ||||||
|  | 
 | ||||||
| test.clean() { | test.clean() { | ||||||
|     build_msg CLEAN  "test stuff" |     build_msg CLEAN  "test stuff" | ||||||
|     rm -rf geckodriver.log .coverage coverage/ |     rm -rf geckodriver.log .coverage coverage/ | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | { | ||||||
|  |   "dependencies": { | ||||||
|  |     "eslint": "^8.7.0", | ||||||
|  |     "pyright": "^1.1.215" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								pyrightconfig-ci.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								pyrightconfig-ci.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | { | ||||||
|  |     "venvPath": "local", | ||||||
|  |     "venv": "py3", | ||||||
|  |     "include": [ | ||||||
|  |         "searx", | ||||||
|  |         "searxng_extra", | ||||||
|  |         "tests" | ||||||
|  |     ], | ||||||
|  |     "typeCheckingMode": "off" | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								pyrightconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								pyrightconfig.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | { | ||||||
|  |     "venvPath": "local", | ||||||
|  |     "venv": "py3", | ||||||
|  |     "include": [ | ||||||
|  |         "searx", | ||||||
|  |         "searxng_extra", | ||||||
|  |         "tests" | ||||||
|  |     ] | ||||||
|  | } | ||||||
| @ -8,7 +8,7 @@ splinter==0.17.0 | |||||||
| selenium==4.1.0 | selenium==4.1.0 | ||||||
| twine==3.7.1 | twine==3.7.1 | ||||||
| Pallets-Sphinx-Themes==2.0.2 | Pallets-Sphinx-Themes==2.0.2 | ||||||
| Sphinx==4.3.2 | Sphinx==4.4.0 | ||||||
| sphinx-issues==3.0.1 | sphinx-issues==3.0.1 | ||||||
| sphinx-jinja==1.4.0 | sphinx-jinja==1.4.0 | ||||||
| sphinx-tabs==3.2.0 | sphinx-tabs==3.2.0 | ||||||
|  | |||||||
| @ -13,3 +13,6 @@ uvloop==0.16.0 | |||||||
| httpx-socks[asyncio]==0.7.2 | httpx-socks[asyncio]==0.7.2 | ||||||
| langdetect==1.0.9 | langdetect==1.0.9 | ||||||
| setproctitle==1.2.2 | setproctitle==1.2.2 | ||||||
|  | redis==4.1.2 | ||||||
|  | mistletoe==0.8.1 | ||||||
|  | typing_extensions==4.0.1 | ||||||
|  | |||||||
| @ -1,33 +1,23 @@ | |||||||
| ''' | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
| searx is free software: you can redistribute it and/or modify | # lint: pylint | ||||||
| it under the terms of the GNU Affero General Public License as published by | """This module implements functions needed for the autocompleter. | ||||||
| the Free Software Foundation, either version 3 of the License, or |  | ||||||
| (at your option) any later version. |  | ||||||
| 
 | 
 | ||||||
| searx is distributed in the hope that it will be useful, | """ | ||||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
| GNU Affero General Public License for more details. |  | ||||||
| 
 | 
 | ||||||
| You should have received a copy of the GNU Affero General Public License |  | ||||||
| along with searx. If not, see < http://www.gnu.org/licenses/ >. |  | ||||||
| 
 |  | ||||||
| (C) 2013- by Adam Tauber, <asciimoo@gmail.com> |  | ||||||
| ''' |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| from lxml import etree |  | ||||||
| from json import loads | from json import loads | ||||||
| from urllib.parse import urlencode | from urllib.parse import urlencode | ||||||
| 
 | 
 | ||||||
|  | from lxml import etree | ||||||
| from httpx import HTTPError | from httpx import HTTPError | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| from searx import settings | from searx import settings | ||||||
| from searx.data import ENGINES_LANGUAGES | from searx.data import ENGINES_LANGUAGES | ||||||
| from searx.network import get as http_get | from searx.network import get as http_get | ||||||
| from searx.exceptions import SearxEngineResponseException | from searx.exceptions import SearxEngineResponseException | ||||||
| 
 | 
 | ||||||
|  | # a fetch_supported_languages() for XPath engines isn't available right now | ||||||
|  | # _brave = ENGINES_LANGUAGES['brave'].keys() | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def get(*args, **kwargs): | def get(*args, **kwargs): | ||||||
|     if 'timeout' not in kwargs: |     if 'timeout' not in kwargs: | ||||||
| @ -36,7 +26,26 @@ def get(*args, **kwargs): | |||||||
|     return http_get(*args, **kwargs) |     return http_get(*args, **kwargs) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def dbpedia(query, lang): | def brave(query, _lang): | ||||||
|  |     # brave search autocompleter | ||||||
|  |     url = 'https://search.brave.com/api/suggest?' | ||||||
|  |     url += urlencode({'q': query}) | ||||||
|  |     country = 'all' | ||||||
|  |     # if lang in _brave: | ||||||
|  |     #    country = lang | ||||||
|  |     kwargs = {'cookies': {'country': country}} | ||||||
|  |     resp = get(url, **kwargs) | ||||||
|  | 
 | ||||||
|  |     results = [] | ||||||
|  | 
 | ||||||
|  |     if resp.ok: | ||||||
|  |         data = resp.json() | ||||||
|  |         for item in data[1]: | ||||||
|  |             results.append(item) | ||||||
|  |     return results | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def dbpedia(query, _lang): | ||||||
|     # dbpedia autocompleter, no HTTPS |     # dbpedia autocompleter, no HTTPS | ||||||
|     autocomplete_url = 'https://lookup.dbpedia.org/api/search.asmx/KeywordSearch?' |     autocomplete_url = 'https://lookup.dbpedia.org/api/search.asmx/KeywordSearch?' | ||||||
| 
 | 
 | ||||||
| @ -51,7 +60,7 @@ def dbpedia(query, lang): | |||||||
|     return results |     return results | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def duckduckgo(query, lang): | def duckduckgo(query, _lang): | ||||||
|     # duckduckgo autocompleter |     # duckduckgo autocompleter | ||||||
|     url = 'https://ac.duckduckgo.com/ac/?{0}&type=list' |     url = 'https://ac.duckduckgo.com/ac/?{0}&type=list' | ||||||
| 
 | 
 | ||||||
| @ -85,7 +94,7 @@ def startpage(query, lang): | |||||||
|     return [e['text'] for e in data.get('suggestions', []) if 'text' in e] |     return [e['text'] for e in data.get('suggestions', []) if 'text' in e] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def swisscows(query, lang): | def swisscows(query, _lang): | ||||||
|     # swisscows autocompleter |     # swisscows autocompleter | ||||||
|     url = 'https://swisscows.ch/api/suggest?{query}&itemsCount=5' |     url = 'https://swisscows.ch/api/suggest?{query}&itemsCount=5' | ||||||
| 
 | 
 | ||||||
| @ -128,6 +137,7 @@ backends = { | |||||||
|     'swisscows': swisscows, |     'swisscows': swisscows, | ||||||
|     'qwant': qwant, |     'qwant': qwant, | ||||||
|     'wikipedia': wikipedia, |     'wikipedia': wikipedia, | ||||||
|  |     'brave': brave, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -38,7 +38,7 @@ def ahmia_blacklist_loader(): | |||||||
|     This function is used by :py:mod:`searx.plugins.ahmia_filter`. |     This function is used by :py:mod:`searx.plugins.ahmia_filter`. | ||||||
| 
 | 
 | ||||||
|     """ |     """ | ||||||
|     with open(str(data_dir / 'ahmia_blacklist.txt'), encoding='utf-8') as f: |     with open(data_dir / 'ahmia_blacklist.txt', encoding='utf-8') as f: | ||||||
|         return f.read().split() |         return f.read().split() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -827,6 +827,7 @@ | |||||||
|             "CNY" |             "CNY" | ||||||
|         ], |         ], | ||||||
|         "רנמינבי": "CNY", |         "רנמינבי": "CNY", | ||||||
|  |         "zsenminpi": "CNY", | ||||||
|         "renminbi cinese": "CNY", |         "renminbi cinese": "CNY", | ||||||
|         "人民元": "CNY", |         "人民元": "CNY", | ||||||
|         "juanis": "CNY", |         "juanis": "CNY", | ||||||
| @ -992,7 +993,7 @@ | |||||||
|         "džibučio frankas": "DJF", |         "džibučio frankas": "DJF", | ||||||
|         "djiboutiaanse frank": "DJF", |         "djiboutiaanse frank": "DJF", | ||||||
|         "frank dżibuti": "DJF", |         "frank dżibuti": "DJF", | ||||||
|         "franco do djibouti": "DJF", |         "franco do jibuti": "DJF", | ||||||
|         "франк джибути": "DJF", |         "франк джибути": "DJF", | ||||||
|         "џибутски франак": "DJF", |         "џибутски франак": "DJF", | ||||||
|         "djiboutisk franc": "DJF", |         "djiboutisk franc": "DJF", | ||||||
| @ -2324,11 +2325,10 @@ | |||||||
|         "mazedonischer denar": "MKD", |         "mazedonischer denar": "MKD", | ||||||
|         "macedonian denar": "MKD", |         "macedonian denar": "MKD", | ||||||
|         "makedona denaro": "MKD", |         "makedona denaro": "MKD", | ||||||
|         "denar normacedonio": "MKD", |         "denar macedonio": "MKD", | ||||||
|         "põhja makedoonia denaar": "MKD", |         "põhja makedoonia denaar": "MKD", | ||||||
|         "pohjois makedonian denaari": "MKD", |         "pohjois makedonian denaari": "MKD", | ||||||
|         "denar macédonien": "MKD", |         "denar macédonien": "MKD", | ||||||
|         "denar macedonio": "MKD", |  | ||||||
|         "דינר מקדוני": "MKD", |         "דינר מקדוני": "MKD", | ||||||
|         "makedonski denar": "MKD", |         "makedonski denar": "MKD", | ||||||
|         "macedón dénár": "MKD", |         "macedón dénár": "MKD", | ||||||
| @ -4849,6 +4849,7 @@ | |||||||
|         "belarus rubel": "BYN", |         "belarus rubel": "BYN", | ||||||
|         "br": "BYN", |         "br": "BYN", | ||||||
|         "nuevo rublo bierlorruso": "BYN", |         "nuevo rublo bierlorruso": "BYN", | ||||||
|  |         "зайчик": "BYN", | ||||||
|         "білоруський рубль": "BYN", |         "білоруський рубль": "BYN", | ||||||
|         "Bz$": "BZD", |         "Bz$": "BZD", | ||||||
|         "bz$": "BZD", |         "bz$": "BZD", | ||||||
| @ -5060,7 +5061,6 @@ | |||||||
|         "יואן": "CNY", |         "יואן": "CNY", | ||||||
|         "יואן סיני": "CNY", |         "יואן סיני": "CNY", | ||||||
|         "kínai jüan": "CNY", |         "kínai jüan": "CNY", | ||||||
|         "zsenminpi": "CNY", |  | ||||||
|         "yuan cinese": "CNY", |         "yuan cinese": "CNY", | ||||||
|         "人民幣": "CNY", |         "人民幣": "CNY", | ||||||
|         "中国元": "CNY", |         "中国元": "CNY", | ||||||
| @ -5223,10 +5223,10 @@ | |||||||
|         "המטבע של ג'יבוטי": "DJF", |         "המטבע של ג'יבוטי": "DJF", | ||||||
|         "franco di gibuti": "DJF", |         "franco di gibuti": "DJF", | ||||||
|         "djiboutische frank": "DJF", |         "djiboutische frank": "DJF", | ||||||
|         "franco do jibuti": "DJF", |  | ||||||
|         "franco djibutiano": "DJF", |         "franco djibutiano": "DJF", | ||||||
|         "franco djibutiense": "DJF", |         "franco djibutiense": "DJF", | ||||||
|         "franco do djibuti": "DJF", |         "franco do djibuti": "DJF", | ||||||
|  |         "franco do djibouti": "DJF", | ||||||
|         "franco jibutiano": "DJF", |         "franco jibutiano": "DJF", | ||||||
|         "franco jibutiense": "DJF", |         "franco jibutiense": "DJF", | ||||||
|         "валюта джибути": "DJF", |         "валюта джибути": "DJF", | ||||||
| @ -6383,6 +6383,8 @@ | |||||||
|         "M": "LSL", |         "M": "LSL", | ||||||
|         "lisente": "LSL", |         "lisente": "LSL", | ||||||
|         "loti lesothan": "LSL", |         "loti lesothan": "LSL", | ||||||
|  |         "לוטי": "LSL", | ||||||
|  |         "לוטי לסוטו": "LSL", | ||||||
|         "loti del lesotho": "LSL", |         "loti del lesotho": "LSL", | ||||||
|         "レソト・ロチ": "LSL", |         "レソト・ロチ": "LSL", | ||||||
|         "валюта лесото": "LSL", |         "валюта лесото": "LSL", | ||||||
| @ -6494,15 +6496,12 @@ | |||||||
|         "dinar normacedoni": "MKD", |         "dinar normacedoni": "MKD", | ||||||
|         "makedonský dinár": "MKD", |         "makedonský dinár": "MKD", | ||||||
|         "makedonsk denar": "MKD", |         "makedonsk denar": "MKD", | ||||||
|         "nordmazedonischer denar": "MKD", |  | ||||||
|         "denari": "MKD", |         "denari": "MKD", | ||||||
|         "mkd": "MKD", |         "mkd": "MKD", | ||||||
|         "north macedonian denar": "MKD", |  | ||||||
|         "makedonia denaro": "MKD", |         "makedonia denaro": "MKD", | ||||||
|         "dinar macedonio": "MKD", |         "dinar macedonio": "MKD", | ||||||
|         "makedoonia denaar": "MKD", |         "makedoonia denaar": "MKD", | ||||||
|         "makedonian denaari": "MKD", |         "makedonian denaari": "MKD", | ||||||
|         "dinar macédonien": "MKD", |  | ||||||
|         "denar macedone": "MKD", |         "denar macedone": "MKD", | ||||||
|         "denaro macedone": "MKD", |         "denaro macedone": "MKD", | ||||||
|         "マケドニア・ディナール": "MKD", |         "マケドニア・ディナール": "MKD", | ||||||
| @ -7031,8 +7030,6 @@ | |||||||
|         "питкэрнский доллар": "PND", |         "питкэрнский доллар": "PND", | ||||||
|         "غواراني": "PYG", |         "غواراني": "PYG", | ||||||
|         "₲": "PYG", |         "₲": "PYG", | ||||||
|         "paraguajský guarani": "PYG", |  | ||||||
|         "paraguajský guaraní": "PYG", |  | ||||||
|         "paraguayský guarani": "PYG", |         "paraguayský guarani": "PYG", | ||||||
|         "pyg": "PYG", |         "pyg": "PYG", | ||||||
|         "paraguayan guarani": "PYG", |         "paraguayan guarani": "PYG", | ||||||
| @ -8052,9 +8049,9 @@ | |||||||
|         "unitate monetară europeană": "XEU", |         "unitate monetară europeană": "XEU", | ||||||
|         "европейская валютная единица": "XEU", |         "европейская валютная единица": "XEU", | ||||||
|         "europeiska valutaenhet": "XEU", |         "europeiska valutaenhet": "XEU", | ||||||
|         "xmr": "XMR", |  | ||||||
|         "mo": "XMR", |  | ||||||
|         "bitmonero": "XMR", |         "bitmonero": "XMR", | ||||||
|  |         "mo": "XMR", | ||||||
|  |         "xmr": "XMR", | ||||||
|         "فرنك س ف ا غرب أفريقيا": "XOF", |         "فرنك س ف ا غرب أفريقيا": "XOF", | ||||||
|         "F": "XOF", |         "F": "XOF", | ||||||
|         "xof": "XOF", |         "xof": "XOF", | ||||||
| @ -8124,6 +8121,7 @@ | |||||||
|         "единая система региональных взаиморасчетов": "XSU", |         "единая система региональных взаиморасчетов": "XSU", | ||||||
|         "единая система региональных взаиморасчётов": "XSU", |         "единая система региональных взаиморасчётов": "XSU", | ||||||
|         "rial del iemen del nord": "YER", |         "rial del iemen del nord": "YER", | ||||||
|  |         "nord jemena rialo": "YER", | ||||||
|         "rial nord yéménite": "YER", |         "rial nord yéménite": "YER", | ||||||
|         "észak jemeni riál": "YER", |         "észak jemeni riál": "YER", | ||||||
|         "北イエメン・リアル": "YER", |         "北イエメン・リアル": "YER", | ||||||
| @ -8155,6 +8153,7 @@ | |||||||
|         "R": "ZAR", |         "R": "ZAR", | ||||||
|         "rand de sud àfrica": "ZAR", |         "rand de sud àfrica": "ZAR", | ||||||
|         "rand sud africà": "ZAR", |         "rand sud africà": "ZAR", | ||||||
|  |         "rand de affrica": "ZAR", | ||||||
|         "rando": "ZAR", |         "rando": "ZAR", | ||||||
|         "sud afrika rando": "ZAR", |         "sud afrika rando": "ZAR", | ||||||
|         "zar": "ZAR", |         "zar": "ZAR", | ||||||
| @ -8753,7 +8752,7 @@ | |||||||
|             "sv": "Burundisk franc", |             "sv": "Burundisk franc", | ||||||
|             "ta": "புரூண்டி பிராங்க்", |             "ta": "புரூண்டி பிராங்க்", | ||||||
|             "tr": "Burundi frangı", |             "tr": "Burundi frangı", | ||||||
|             "uk": "Бурундійський франк", |             "uk": "бурундійський франк", | ||||||
|             "he": "פרנק בורונדי", |             "he": "פרנק בורונדי", | ||||||
|             "ro": "franc burundez" |             "ro": "franc burundez" | ||||||
|         }, |         }, | ||||||
| @ -10965,7 +10964,7 @@ | |||||||
|             "nl": "Sri Lankaanse roepie", |             "nl": "Sri Lankaanse roepie", | ||||||
|             "pl": "Rupia lankijska", |             "pl": "Rupia lankijska", | ||||||
|             "pt": "rúpia do Sri Lanka", |             "pt": "rúpia do Sri Lanka", | ||||||
|             "ru": "Ланкийская рупия", |             "ru": "ланкийская рупия", | ||||||
|             "sr": "шриланчанска рупија", |             "sr": "шриланчанска рупија", | ||||||
|             "sv": "Lankesisk rupie", |             "sv": "Lankesisk rupie", | ||||||
|             "ta": "இலங்கை ரூபாய்", |             "ta": "இலங்கை ரூபாய்", | ||||||
| @ -11031,7 +11030,8 @@ | |||||||
|             "sr": "лесотски лоти", |             "sr": "лесотски лоти", | ||||||
|             "sv": "Lesothisk Loti", |             "sv": "Lesothisk Loti", | ||||||
|             "tr": "Loti", |             "tr": "Loti", | ||||||
|             "uk": "Лоті" |             "uk": "Лоті", | ||||||
|  |             "he": "לוטי" | ||||||
|         }, |         }, | ||||||
|         "LYD": { |         "LYD": { | ||||||
|             "ar": "دينار ليبي", |             "ar": "دينار ليبي", | ||||||
| @ -11186,13 +11186,13 @@ | |||||||
|             "ca": "denar", |             "ca": "denar", | ||||||
|             "cs": "Makedonský denár", |             "cs": "Makedonský denár", | ||||||
|             "da": "Makedonske denarer", |             "da": "Makedonske denarer", | ||||||
|             "de": "nordmazedonischer Denar", |             "de": "mazedonischer Denar", | ||||||
|             "en": "denar", |             "en": "Macedonian denar", | ||||||
|             "eo": "makedona denaro", |             "eo": "makedona denaro", | ||||||
|             "es": "denar macedonio", |             "es": "denar macedonio", | ||||||
|             "et": "Makedoonia denaar", |             "et": "Makedoonia denaar", | ||||||
|             "fi": "Makedonian denaari", |             "fi": "Makedonian denaari", | ||||||
|             "fr": "dinar macédonien", |             "fr": "denar macédonien", | ||||||
|             "gl": "Dinar macedonio", |             "gl": "Dinar macedonio", | ||||||
|             "he": "דינר מקדוני", |             "he": "דינר מקדוני", | ||||||
|             "hr": "Makedonski denar", |             "hr": "Makedonski denar", | ||||||
| @ -11980,7 +11980,7 @@ | |||||||
|         "PYG": { |         "PYG": { | ||||||
|             "ar": "غواراني باراغواي", |             "ar": "غواراني باراغواي", | ||||||
|             "ca": "guaraní", |             "ca": "guaraní", | ||||||
|             "cs": "Paraguayský guaraní", |             "cs": "paraguayský guaraní", | ||||||
|             "de": "Paraguayischer Guaraní", |             "de": "Paraguayischer Guaraní", | ||||||
|             "en": "Paraguayan guaraní", |             "en": "Paraguayan guaraní", | ||||||
|             "eo": "paragvaja gvaranio", |             "eo": "paragvaja gvaranio", | ||||||
| @ -13662,7 +13662,8 @@ | |||||||
|             "sr": "јужноафрички ранд", |             "sr": "јужноафрички ранд", | ||||||
|             "sv": "Rand", |             "sv": "Rand", | ||||||
|             "tr": "Güney Afrika randı", |             "tr": "Güney Afrika randı", | ||||||
|             "uk": "Ранд" |             "uk": "Ранд", | ||||||
|  |             "cy": "Rand De Affrica" | ||||||
|         }, |         }, | ||||||
|         "ZMW": { |         "ZMW": { | ||||||
|             "ar": "كواشا زامبية", |             "ar": "كواشا زامبية", | ||||||
|  | |||||||
| @ -1,11 +1,12 @@ | |||||||
| { | { | ||||||
|     "versions": [ |     "versions": [ | ||||||
|  |         "96.0.3", | ||||||
|  |         "96.0.2", | ||||||
|  |         "96.0.1", | ||||||
|  |         "96.0", | ||||||
|         "95.0.2", |         "95.0.2", | ||||||
|         "95.0.1", |         "95.0.1", | ||||||
|         "95.0", |         "95.0" | ||||||
|         "94.0.2", |  | ||||||
|         "94.0.1", |  | ||||||
|         "94.0" |  | ||||||
|     ], |     ], | ||||||
|     "os": [ |     "os": [ | ||||||
|         "Windows NT 10.0; Win64; x64", |         "Windows NT 10.0; Win64; x64", | ||||||
|  | |||||||
| @ -211,6 +211,7 @@ | |||||||
|     "Q1104069": "$", |     "Q1104069": "$", | ||||||
|     "Q11061003": "μm²", |     "Q11061003": "μm²", | ||||||
|     "Q11061005": "nm²", |     "Q11061005": "nm²", | ||||||
|  |     "Q110742003": "dppx", | ||||||
|     "Q1131660": "st", |     "Q1131660": "st", | ||||||
|     "Q1137675": "cr", |     "Q1137675": "cr", | ||||||
|     "Q1140444": "Zb", |     "Q1140444": "Zb", | ||||||
|  | |||||||
| @ -42,6 +42,7 @@ ENGINE_DEFAULT_ARGS = { | |||||||
|     "safesearch": False, |     "safesearch": False, | ||||||
|     "time_range_support": False, |     "time_range_support": False, | ||||||
|     "enable_http": False, |     "enable_http": False, | ||||||
|  |     "using_tor_proxy": False, | ||||||
|     "display_error_messages": True, |     "display_error_messages": True, | ||||||
|     "tokens": [], |     "tokens": [], | ||||||
|     "about": {}, |     "about": {}, | ||||||
| @ -230,8 +231,8 @@ def set_language_attributes(engine: Engine): | |||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def update_attributes_for_tor(engine): | def update_attributes_for_tor(engine: Engine) -> bool: | ||||||
|     if settings['outgoing'].get('using_tor_proxy') and hasattr(engine, 'onion_url'): |     if using_tor_proxy(engine) and hasattr(engine, 'onion_url'): | ||||||
|         engine.search_url = engine.onion_url + getattr(engine, 'search_path', '') |         engine.search_url = engine.onion_url + getattr(engine, 'search_path', '') | ||||||
|         engine.timeout += settings['outgoing'].get('extra_proxy_timeout', 0) |         engine.timeout += settings['outgoing'].get('extra_proxy_timeout', 0) | ||||||
| 
 | 
 | ||||||
| @ -249,13 +250,18 @@ def is_missing_required_attributes(engine): | |||||||
|     return missing |     return missing | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def using_tor_proxy(engine: Engine): | ||||||
|  |     """Return True if the engine configuration declares to use Tor.""" | ||||||
|  |     return settings['outgoing'].get('using_tor_proxy') or getattr(engine, 'using_tor_proxy', False) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def is_engine_active(engine: Engine): | def is_engine_active(engine: Engine): | ||||||
|     # check if engine is inactive |     # check if engine is inactive | ||||||
|     if engine.inactive is True: |     if engine.inactive is True: | ||||||
|         return False |         return False | ||||||
| 
 | 
 | ||||||
|     # exclude onion engines if not using tor |     # exclude onion engines if not using tor | ||||||
|     if 'onions' in engine.categories and not settings['outgoing'].get('using_tor_proxy'): |     if 'onions' in engine.categories and not using_tor_proxy(engine): | ||||||
|         return False |         return False | ||||||
| 
 | 
 | ||||||
|     return True |     return True | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| # SPDX-License-Identifier: AGPL-3.0-or-later | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
| """ | # lint: pylint | ||||||
|  currency convert (DuckDuckGo) | """Currency convert (DuckDuckGo) | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| import json | import json | ||||||
| @ -13,18 +13,19 @@ about = { | |||||||
|     "use_official_api": False, |     "use_official_api": False, | ||||||
|     "require_api_key": False, |     "require_api_key": False, | ||||||
|     "results": 'JSONP', |     "results": 'JSONP', | ||||||
|  |     "description": "Service from DuckDuckGo.", | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| engine_type = 'online_currency' | engine_type = 'online_currency' | ||||||
| categories = [] | categories = [] | ||||||
| url = 'https://duckduckgo.com/js/spice/currency/1/{0}/{1}' | base_url = 'https://duckduckgo.com/js/spice/currency/1/{0}/{1}' | ||||||
| weight = 100 | weight = 100 | ||||||
| 
 | 
 | ||||||
| https_support = True | https_support = True | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def request(query, params): | def request(_query, params): | ||||||
|     params['url'] = url.format(params['from'], params['to']) |     params['url'] = base_url.format(params['from'], params['to']) | ||||||
|     return params |     return params | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -34,7 +35,7 @@ def response(resp): | |||||||
|     results = [] |     results = [] | ||||||
|     try: |     try: | ||||||
|         conversion_rate = float(json.loads(json_resp)['conversion']['converted-amount']) |         conversion_rate = float(json.loads(json_resp)['conversion']['converted-amount']) | ||||||
|     except: |     except ValueError: | ||||||
|         return results |         return results | ||||||
|     answer = '{0} {1} = {2} {3}, 1 {1} ({5}) = {4} {3} ({6})'.format( |     answer = '{0} {1} = {2} {3}, 1 {1} ({5}) = {4} {3} ({6})'.format( | ||||||
|         resp.search_params['amount'], |         resp.search_params['amount'], | ||||||
|  | |||||||
| @ -111,8 +111,9 @@ filter_mapping = {0: 'off', 1: 'medium', 2: 'high'} | |||||||
| # specific xpath variables | # specific xpath variables | ||||||
| # ------------------------ | # ------------------------ | ||||||
| 
 | 
 | ||||||
| # google results are grouped into <div class="g" ../> | # google results are grouped into <div class="g ..." ../> | ||||||
| results_xpath = '//div[@class="g"]' | results_xpath = '//div[@id="search"]//div[contains(@class, "g ")]' | ||||||
|  | results_xpath_mobile_ui = '//div[contains(@class, "g ")]' | ||||||
| 
 | 
 | ||||||
| # google *sections* are no usual *results*, we ignore them | # google *sections* are no usual *results*, we ignore them | ||||||
| g_section_with_header = './g-section-with-header' | g_section_with_header = './g-section-with-header' | ||||||
| @ -124,8 +125,8 @@ title_xpath = './/h3[1]' | |||||||
| # href=...> | # href=...> | ||||||
| href_xpath = './/div[@class="yuRUbf"]//a/@href' | href_xpath = './/div[@class="yuRUbf"]//a/@href' | ||||||
| 
 | 
 | ||||||
| # in the result group there is <div class="IsZvec" ../> containing he *content* | # in the result group there is <div class="VwiC3b ..." ../> containing the *content* | ||||||
| content_xpath = './/div[@class="IsZvec"]' | content_xpath = './/div[contains(@class, "VwiC3b")]' | ||||||
| 
 | 
 | ||||||
| # Suggestions are links placed in a *card-section*, we extract only the text | # Suggestions are links placed in a *card-section*, we extract only the text | ||||||
| # from the links not the links itself. | # from the links not the links itself. | ||||||
| @ -336,7 +337,12 @@ def response(resp): | |||||||
|                 logger.error(e, exc_info=True) |                 logger.error(e, exc_info=True) | ||||||
| 
 | 
 | ||||||
|     # parse results |     # parse results | ||||||
|     for result in eval_xpath_list(dom, results_xpath): | 
 | ||||||
|  |     _results_xpath = results_xpath | ||||||
|  |     if use_mobile_ui: | ||||||
|  |         _results_xpath = results_xpath_mobile_ui | ||||||
|  | 
 | ||||||
|  |     for result in eval_xpath_list(dom, _results_xpath): | ||||||
| 
 | 
 | ||||||
|         # google *sections* |         # google *sections* | ||||||
|         if extract_text(eval_xpath(result, g_section_with_header)): |         if extract_text(eval_xpath(result, g_section_with_header)): | ||||||
| @ -347,20 +353,22 @@ def response(resp): | |||||||
|             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 <div class="g" ../> section: missing title') |                 logger.debug('ingoring 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) | ||||||
|             if url is None: |             if url is None: | ||||||
|                 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: | ||||||
|  |                 logger.debug('ingoring item from the result_xpath list: missing content of title "%s"', title) | ||||||
|  |                 continue | ||||||
|  | 
 | ||||||
|  |             logger.debug('add link to results: %s', title) | ||||||
|             results.append({'url': url, 'title': title, 'content': content}) |             results.append({'url': url, 'title': title, 'content': content}) | ||||||
|  | 
 | ||||||
|         except Exception as e:  # pylint: disable=broad-except |         except Exception as e:  # pylint: disable=broad-except | ||||||
|             logger.error(e, exc_info=True) |             logger.error(e, exc_info=True) | ||||||
|             # from lxml import etree |  | ||||||
|             # logger.debug(etree.tostring(result, pretty_print=True)) |  | ||||||
|             # import pdb |  | ||||||
|             # pdb.set_trace() |  | ||||||
|             continue |             continue | ||||||
| 
 | 
 | ||||||
|     # parse suggestion |     # parse suggestion | ||||||
|  | |||||||
| @ -3,12 +3,10 @@ | |||||||
|  INA (Videos) |  INA (Videos) | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from json import loads |  | ||||||
| from html import unescape | from html import unescape | ||||||
| from urllib.parse import urlencode | from urllib.parse import urlencode | ||||||
| from lxml import html | from lxml import html | ||||||
| from dateutil import parser | from searx.utils import extract_text, eval_xpath, eval_xpath_list, eval_xpath_getindex | ||||||
| from searx.utils import extract_text |  | ||||||
| 
 | 
 | ||||||
| # about | # about | ||||||
| about = { | about = { | ||||||
| @ -24,25 +22,24 @@ about = { | |||||||
| # engine dependent config | # engine dependent config | ||||||
| categories = ['videos'] | categories = ['videos'] | ||||||
| paging = True | paging = True | ||||||
| page_size = 48 | page_size = 12 | ||||||
| 
 | 
 | ||||||
| # search-url | # search-url | ||||||
| base_url = 'https://www.ina.fr' | base_url = 'https://www.ina.fr' | ||||||
| search_url = base_url + '/layout/set/ajax/recherche/result?autopromote=&hf={ps}&b={start}&type=Video&r=&{query}' | search_url = base_url + '/ajax/recherche?{query}&espace=1&sort=pertinence&order=desc&offset={start}&modified=size' | ||||||
| 
 | 
 | ||||||
| # specific xpath variables | # specific xpath variables | ||||||
| results_xpath = '//div[contains(@class,"search-results--list")]//div[@class="media-body"]' | results_xpath = '//div[@id="searchHits"]/div' | ||||||
| url_xpath = './/a/@href' | url_xpath = './/a/@href' | ||||||
| title_xpath = './/h3[@class="h3--title media-heading"]' | title_xpath = './/div[contains(@class,"title-bloc-small")]' | ||||||
| thumbnail_xpath = './/img/@src' | content_xpath = './/div[contains(@class,"sous-titre-fonction")]' | ||||||
| publishedDate_xpath = './/span[@class="broadcast"]' | thumbnail_xpath = './/img/@data-src' | ||||||
| content_xpath = './/p[@class="media-body__summary"]' | publishedDate_xpath = './/div[contains(@class,"dateAgenda")]' | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # do search-request | # do search-request | ||||||
| def request(query, params): | def request(query, params): | ||||||
|     params['url'] = search_url.format(ps=page_size, start=params['pageno'] * page_size, query=urlencode({'q': query})) |     params['url'] = search_url.format(start=params['pageno'] * page_size, query=urlencode({'q': query})) | ||||||
| 
 |  | ||||||
|     return params |     return params | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -51,26 +48,17 @@ def response(resp): | |||||||
|     results = [] |     results = [] | ||||||
| 
 | 
 | ||||||
|     # we get html in a JSON container... |     # we get html in a JSON container... | ||||||
|     response = loads(resp.text) |     dom = html.fromstring(resp.text) | ||||||
|     dom = html.fromstring(response) |  | ||||||
| 
 | 
 | ||||||
|     # parse results |     # parse results | ||||||
|     for result in dom.xpath(results_xpath): |     for result in eval_xpath_list(dom, results_xpath): | ||||||
|         videoid = result.xpath(url_xpath)[0] |         url_relative = eval_xpath_getindex(result, url_xpath, 0) | ||||||
|         url = base_url + videoid |         url = base_url + url_relative | ||||||
|         title = unescape(extract_text(result.xpath(title_xpath))) |         title = unescape(extract_text(eval_xpath(result, title_xpath))) | ||||||
|         try: |         thumbnail = extract_text(eval_xpath(result, thumbnail_xpath)) | ||||||
|             thumbnail = extract_text(result.xpath(thumbnail_xpath)[0]) |         content = extract_text(eval_xpath(result, publishedDate_xpath)) + extract_text( | ||||||
|         except: |             eval_xpath(result, content_xpath) | ||||||
|             thumbnail = '' |         ) | ||||||
|         if thumbnail and thumbnail[0] == '/': |  | ||||||
|             thumbnail = base_url + thumbnail |  | ||||||
|         d = extract_text(result.xpath(publishedDate_xpath)[0]) |  | ||||||
|         d = d.split('/') |  | ||||||
|         # force ISO date to avoid wrong parsing |  | ||||||
|         d = "%s-%s-%s" % (d[2], d[1], d[0]) |  | ||||||
|         publishedDate = parser.parse(d) |  | ||||||
|         content = extract_text(result.xpath(content_xpath)) |  | ||||||
| 
 | 
 | ||||||
|         # append result |         # append result | ||||||
|         results.append( |         results.append( | ||||||
| @ -79,7 +67,6 @@ def response(resp): | |||||||
|                 'title': title, |                 'title': title, | ||||||
|                 'content': content, |                 'content': content, | ||||||
|                 'template': 'videos.html', |                 'template': 'videos.html', | ||||||
|                 'publishedDate': publishedDate, |  | ||||||
|                 'thumbnail': thumbnail, |                 'thumbnail': thumbnail, | ||||||
|             } |             } | ||||||
|         ) |         ) | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ import mysql.connector  # pylint: disable=import-error | |||||||
| engine_type = 'offline' | engine_type = 'offline' | ||||||
| auth_plugin = 'caching_sha2_password' | auth_plugin = 'caching_sha2_password' | ||||||
| host = "127.0.0.1" | host = "127.0.0.1" | ||||||
|  | port = 3306 | ||||||
| database = "" | database = "" | ||||||
| username = "" | username = "" | ||||||
| password = "" | password = "" | ||||||
| @ -35,6 +36,7 @@ def init(engine_settings): | |||||||
|         user=username, |         user=username, | ||||||
|         password=password, |         password=password, | ||||||
|         host=host, |         host=host, | ||||||
|  |         port=port, | ||||||
|         auth_plugin=auth_plugin, |         auth_plugin=auth_plugin, | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,16 +1,28 @@ | |||||||
| # SPDX-License-Identifier: AGPL-3.0-or-later | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
| """ | # lint: pylint | ||||||
|  Startpage (Web) | """Startpage (Web) | ||||||
|  | 
 | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from lxml import html |  | ||||||
| from dateutil import parser |  | ||||||
| from datetime import datetime, timedelta |  | ||||||
| import re | import re | ||||||
|  | from time import time | ||||||
|  | 
 | ||||||
|  | from urllib.parse import urlencode | ||||||
| from unicodedata import normalize, combining | from unicodedata import normalize, combining | ||||||
|  | from datetime import datetime, timedelta | ||||||
|  | 
 | ||||||
|  | from dateutil import parser | ||||||
|  | from lxml import html | ||||||
| from babel import Locale | from babel import Locale | ||||||
| from babel.localedata import locale_identifiers | from babel.localedata import locale_identifiers | ||||||
|  | 
 | ||||||
|  | from searx.network import get | ||||||
| from searx.utils import extract_text, eval_xpath, match_language | from searx.utils import extract_text, eval_xpath, match_language | ||||||
|  | from searx.exceptions import ( | ||||||
|  |     SearxEngineResponseException, | ||||||
|  |     SearxEngineCaptchaException, | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| # about | # about | ||||||
| about = { | about = { | ||||||
| @ -33,7 +45,7 @@ supported_languages_url = 'https://www.startpage.com/do/settings' | |||||||
| 
 | 
 | ||||||
| # search-url | # search-url | ||||||
| base_url = 'https://startpage.com/' | base_url = 'https://startpage.com/' | ||||||
| search_url = base_url + 'do/search' | search_url = base_url + 'sp/search?' | ||||||
| 
 | 
 | ||||||
| # specific xpath variables | # specific xpath variables | ||||||
| # ads xpath //div[@id="results"]/div[@id="sponsored"]//div[@class="result"] | # ads xpath //div[@id="results"]/div[@id="sponsored"]//div[@class="result"] | ||||||
| @ -42,18 +54,74 @@ results_xpath = '//div[@class="w-gl__result__main"]' | |||||||
| link_xpath = './/a[@class="w-gl__result-title result-link"]' | link_xpath = './/a[@class="w-gl__result-title result-link"]' | ||||||
| content_xpath = './/p[@class="w-gl__description"]' | content_xpath = './/p[@class="w-gl__description"]' | ||||||
| 
 | 
 | ||||||
|  | # timestamp of the last fetch of 'sc' code | ||||||
|  | sc_code_ts = 0 | ||||||
|  | sc_code = '' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def raise_captcha(resp): | ||||||
|  | 
 | ||||||
|  |     if str(resp.url).startswith('https://www.startpage.com/sp/captcha'): | ||||||
|  |         # suspend CAPTCHA for 7 days | ||||||
|  |         raise SearxEngineCaptchaException(suspended_time=7 * 24 * 3600) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_sc_code(headers): | ||||||
|  |     """Get an actual `sc` argument from startpage's home page. | ||||||
|  | 
 | ||||||
|  |     Startpage puts a `sc` argument on every link.  Without this argument | ||||||
|  |     startpage considers the request is from a bot.  We do not know what is | ||||||
|  |     encoded in the value of the `sc` argument, but it seems to be a kind of a | ||||||
|  |     *time-stamp*.  This *time-stamp* is valid for a few hours. | ||||||
|  | 
 | ||||||
|  |     This function scrap a new *time-stamp* from startpage's home page every hour | ||||||
|  |     (3000 sec). | ||||||
|  | 
 | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     global sc_code_ts, sc_code  # pylint: disable=global-statement | ||||||
|  | 
 | ||||||
|  |     if time() > (sc_code_ts + 3000): | ||||||
|  |         logger.debug("query new sc time-stamp ...") | ||||||
|  | 
 | ||||||
|  |         resp = get(base_url, headers=headers) | ||||||
|  |         raise_captcha(resp) | ||||||
|  |         dom = html.fromstring(resp.text) | ||||||
|  | 
 | ||||||
|  |         try: | ||||||
|  |             # href --> '/?sc=adrKJMgF8xwp20' | ||||||
|  |             href = eval_xpath(dom, '//a[@class="footer-home__logo"]')[0].get('href') | ||||||
|  |         except IndexError as exc: | ||||||
|  |             # suspend startpage API --> https://github.com/searxng/searxng/pull/695 | ||||||
|  |             raise SearxEngineResponseException( | ||||||
|  |                 suspended_time=7 * 24 * 3600, message="PR-695: query new sc time-stamp failed!" | ||||||
|  |             ) from exc | ||||||
|  | 
 | ||||||
|  |         sc_code = href[5:] | ||||||
|  |         sc_code_ts = time() | ||||||
|  |         logger.debug("new value is: %s", sc_code) | ||||||
|  | 
 | ||||||
|  |     return sc_code | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| # do search-request | # do search-request | ||||||
| def request(query, params): | def request(query, params): | ||||||
| 
 | 
 | ||||||
|     params['url'] = search_url |     # pylint: disable=line-too-long | ||||||
|     params['method'] = 'POST' |     # The format string from Startpage's FFox add-on [1]:: | ||||||
|     params['data'] = { |     # | ||||||
|  |     #     https://www.startpage.com/do/dsearch?query={searchTerms}&cat=web&pl=ext-ff&language=__MSG_extensionUrlLanguage__&extVersion=1.3.0 | ||||||
|  |     # | ||||||
|  |     # [1] https://addons.mozilla.org/en-US/firefox/addon/startpage-private-search/ | ||||||
|  | 
 | ||||||
|  |     args = { | ||||||
|         'query': query, |         'query': query, | ||||||
|         'page': params['pageno'], |         'page': params['pageno'], | ||||||
|         'cat': 'web', |         'cat': 'web', | ||||||
|         'cmd': 'process_search', |         # 'pl': 'ext-ff', | ||||||
|         'engine0': 'v1all', |         # 'extVersion': '1.3.0', | ||||||
|  |         # 'abp': "-1", | ||||||
|  |         'sc': get_sc_code(params['headers']), | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     # set language if specified |     # set language if specified | ||||||
| @ -61,9 +129,10 @@ def request(query, params): | |||||||
|         lang_code = match_language(params['language'], supported_languages, fallback=None) |         lang_code = match_language(params['language'], supported_languages, fallback=None) | ||||||
|         if lang_code: |         if lang_code: | ||||||
|             language_name = supported_languages[lang_code]['alias'] |             language_name = supported_languages[lang_code]['alias'] | ||||||
|             params['data']['language'] = language_name |             args['language'] = language_name | ||||||
|             params['data']['lui'] = language_name |             args['lui'] = language_name | ||||||
| 
 | 
 | ||||||
|  |     params['url'] = search_url + urlencode(args) | ||||||
|     return params |     return params | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -134,10 +203,11 @@ def response(resp): | |||||||
| 
 | 
 | ||||||
| # get supported languages from their site | # get supported languages from their site | ||||||
| def _fetch_supported_languages(resp): | def _fetch_supported_languages(resp): | ||||||
|     # startpage's language selector is a mess |     # startpage's language selector is a mess each option has a displayed name | ||||||
|     # each option has a displayed name and a value, either of which may represent the language name |     # and a value, either of which may represent the language name in the native | ||||||
|     # in the native script, the language name in English, an English transliteration of the native name, |     # script, the language name in English, an English transliteration of the | ||||||
|     # the English name of the writing script used by the language, or occasionally something else entirely. |     # native name, the English name of the writing script used by the language, | ||||||
|  |     # or occasionally something else entirely. | ||||||
| 
 | 
 | ||||||
|     # this cases are so special they need to be hardcoded, a couple of them are mispellings |     # this cases are so special they need to be hardcoded, a couple of them are mispellings | ||||||
|     language_names = { |     language_names = { | ||||||
| @ -151,7 +221,15 @@ def _fetch_supported_languages(resp): | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     # get the English name of every language known by babel |     # get the English name of every language known by babel | ||||||
|     language_names.update({name.lower(): lang_code for lang_code, name in Locale('en')._data['languages'].items()}) |     language_names.update( | ||||||
|  |         { | ||||||
|  |             # fmt: off | ||||||
|  |             name.lower(): lang_code | ||||||
|  |             # pylint: disable=protected-access | ||||||
|  |             for lang_code, name in Locale('en')._data['languages'].items() | ||||||
|  |             # fmt: on | ||||||
|  |         } | ||||||
|  |     ) | ||||||
| 
 | 
 | ||||||
|     # get the native name of every language known by babel |     # get the native name of every language known by babel | ||||||
|     for lang_code in filter(lambda lang_code: lang_code.find('_') == -1, locale_identifiers()): |     for lang_code in filter(lambda lang_code: lang_code.find('_') == -1, locale_identifiers()): | ||||||
| @ -176,8 +254,8 @@ def _fetch_supported_languages(resp): | |||||||
|         if isinstance(lang_code, str): |         if isinstance(lang_code, str): | ||||||
|             supported_languages[lang_code] = {'alias': sp_option_value} |             supported_languages[lang_code] = {'alias': sp_option_value} | ||||||
|         elif isinstance(lang_code, list): |         elif isinstance(lang_code, list): | ||||||
|             for lc in lang_code: |             for _lc in lang_code: | ||||||
|                 supported_languages[lc] = {'alias': sp_option_value} |                 supported_languages[_lc] = {'alias': sp_option_value} | ||||||
|         else: |         else: | ||||||
|             print('Unknown language option in Startpage: {} ({})'.format(sp_option_value, sp_option_text)) |             print('Unknown language option in Startpage: {} ({})'.format(sp_option_value, sp_option_text)) | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										103
									
								
								searx/engines/tineye.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								searx/engines/tineye.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | |||||||
|  | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
|  | # lint: pylint | ||||||
|  | """This engine implements *Tineye - reverse image search* | ||||||
|  | 
 | ||||||
|  | Using TinEye, you can search by image or perform what we call a reverse image | ||||||
|  | search.  You can do that by uploading an image or searching by URL. You can also | ||||||
|  | simply drag and drop your images to start your search.  TinEye constantly crawls | ||||||
|  | the web and adds images to its index.  Today, the TinEye index is over 50.2 | ||||||
|  | billion images `[tineye.com] <https://tineye.com/how>`_. | ||||||
|  | 
 | ||||||
|  | .. hint:: | ||||||
|  | 
 | ||||||
|  |    This SearXNG engine only supports *'searching by URL'* and it does not use | ||||||
|  |    the official API `[api.tineye.com] <https://api.tineye.com/python/docs/>`_. | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from urllib.parse import urlencode | ||||||
|  | from datetime import datetime | ||||||
|  | 
 | ||||||
|  | about = { | ||||||
|  |     "website": 'https://tineye.com', | ||||||
|  |     "wikidata_id": 'Q2382535', | ||||||
|  |     "official_api_documentation": 'https://api.tineye.com/python/docs/', | ||||||
|  |     "use_official_api": False, | ||||||
|  |     "require_api_key": False, | ||||||
|  |     "results": 'JSON', | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | engine_type = 'online_url_search' | ||||||
|  | categories = ['general'] | ||||||
|  | paging = True | ||||||
|  | safesearch = False | ||||||
|  | base_url = 'https://tineye.com' | ||||||
|  | search_string = '/result_json/?page={page}&{query}' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def request(query, params): | ||||||
|  | 
 | ||||||
|  |     if params['search_urls']['data:image']: | ||||||
|  |         query = params['search_urls']['data:image'] | ||||||
|  |     elif params['search_urls']['http']: | ||||||
|  |         query = params['search_urls']['http'] | ||||||
|  | 
 | ||||||
|  |     query = urlencode({'url': query}) | ||||||
|  | 
 | ||||||
|  |     # see https://github.com/TinEye/pytineye/blob/main/pytineye/api.py | ||||||
|  |     params['url'] = base_url + search_string.format(query=query, page=params['pageno']) | ||||||
|  | 
 | ||||||
|  |     params['headers'].update( | ||||||
|  |         { | ||||||
|  |             'Connection': 'keep-alive', | ||||||
|  |             'Accept-Encoding': 'gzip, defalte, br', | ||||||
|  |             'Host': 'tineye.com', | ||||||
|  |             'DNT': '1', | ||||||
|  |             'TE': 'trailers', | ||||||
|  |         } | ||||||
|  |     ) | ||||||
|  |     return params | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def response(resp): | ||||||
|  |     results = [] | ||||||
|  | 
 | ||||||
|  |     # Define wanted results | ||||||
|  |     json_data = resp.json() | ||||||
|  |     number_of_results = json_data['num_matches'] | ||||||
|  | 
 | ||||||
|  |     for i in json_data['matches']: | ||||||
|  |         image_format = i['format'] | ||||||
|  |         width = i['width'] | ||||||
|  |         height = i['height'] | ||||||
|  |         thumbnail_src = i['image_url'] | ||||||
|  |         backlink = i['domains'][0]['backlinks'][0] | ||||||
|  |         url = backlink['backlink'] | ||||||
|  |         source = backlink['url'] | ||||||
|  |         title = backlink['image_name'] | ||||||
|  |         img_src = backlink['url'] | ||||||
|  | 
 | ||||||
|  |         # Get and convert published date | ||||||
|  |         api_date = backlink['crawl_date'][:-3] | ||||||
|  |         publishedDate = datetime.fromisoformat(api_date) | ||||||
|  | 
 | ||||||
|  |         # Append results | ||||||
|  |         results.append( | ||||||
|  |             { | ||||||
|  |                 'template': 'images.html', | ||||||
|  |                 'url': url, | ||||||
|  |                 'thumbnail_src': thumbnail_src, | ||||||
|  |                 'source': source, | ||||||
|  |                 'title': title, | ||||||
|  |                 'img_src': img_src, | ||||||
|  |                 'format': image_format, | ||||||
|  |                 'widht': width, | ||||||
|  |                 'height': height, | ||||||
|  |                 'publishedDate': publishedDate, | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     # Append number of results | ||||||
|  |     results.append({'number_of_results': number_of_results}) | ||||||
|  | 
 | ||||||
|  |     return results | ||||||
| @ -1,10 +1,12 @@ | |||||||
| # SPDX-License-Identifier: AGPL-3.0-or-later | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
| """ | # lint: pylint | ||||||
|  1x (Images) | """1x (Images) | ||||||
|  | 
 | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from lxml import html, etree |  | ||||||
| from urllib.parse import urlencode, urljoin | from urllib.parse import urlencode, urljoin | ||||||
|  | from lxml import html, etree | ||||||
|  | 
 | ||||||
| from searx.utils import extract_text, eval_xpath_list, eval_xpath_getindex | from searx.utils import extract_text, eval_xpath_list, eval_xpath_getindex | ||||||
| 
 | 
 | ||||||
| # about | # about | ||||||
| @ -38,13 +40,14 @@ def request(query, params): | |||||||
| def response(resp): | def response(resp): | ||||||
|     results = [] |     results = [] | ||||||
|     xmldom = etree.fromstring(resp.content) |     xmldom = etree.fromstring(resp.content) | ||||||
|     xmlsearchresult = eval_xpath_getindex(xmldom, '//searchresult', 0) |     xmlsearchresult = eval_xpath_getindex(xmldom, '//data', 0) | ||||||
|     dom = html.fragment_fromstring(xmlsearchresult.text, create_parent='div') |     dom = html.fragment_fromstring(xmlsearchresult.text, create_parent='div') | ||||||
|     for link in eval_xpath_list(dom, '/div/table/tr/td/div[2]//a'): |     for link in eval_xpath_list(dom, '//a'): | ||||||
|         url = urljoin(base_url, link.attrib.get('href')) |         url = urljoin(base_url, link.attrib.get('href')) | ||||||
|         title = extract_text(link) |         title = extract_text(link) | ||||||
|         thumbnail_src = urljoin(gallery_url, eval_xpath_getindex(link, './/img', 0).attrib['src']) |         thumbnail_src = urljoin( | ||||||
| 
 |             gallery_url, (eval_xpath_getindex(link, './/img', 0).attrib['src']).replace(base_url, '') | ||||||
|  |         ) | ||||||
|         # append result |         # append result | ||||||
|         results.append( |         results.append( | ||||||
|             { |             { | ||||||
|  | |||||||
| @ -16,6 +16,9 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >. | |||||||
| ''' | ''' | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | from typing import Optional, Union | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class SearxException(Exception): | class SearxException(Exception): | ||||||
|     pass |     pass | ||||||
| 
 | 
 | ||||||
| @ -35,7 +38,7 @@ class SearxParameterException(SearxException): | |||||||
| class SearxSettingsException(SearxException): | class SearxSettingsException(SearxException): | ||||||
|     """Error while loading the settings""" |     """Error while loading the settings""" | ||||||
| 
 | 
 | ||||||
|     def __init__(self, message, filename): |     def __init__(self, message: Union[str, Exception], filename: Optional[str]): | ||||||
|         super().__init__(message) |         super().__init__(message) | ||||||
|         self.message = message |         self.message = message | ||||||
|         self.filename = filename |         self.filename = filename | ||||||
|  | |||||||
							
								
								
									
										71
									
								
								searx/help/about.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								searx/help/about.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | |||||||
|  | # About [searxng][url_for:index] | ||||||
|  | 
 | ||||||
|  | SearXNG is a fork from the well-known [searx] [metasearch engine], aggregating | ||||||
|  | the results of other [search engines][url_for:preferences] while not storing | ||||||
|  | information about its users. | ||||||
|  | 
 | ||||||
|  | More about SearXNG ... | ||||||
|  | 
 | ||||||
|  | * [SearXNG sources][brand.git_url] | ||||||
|  | * [weblate] | ||||||
|  | 
 | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | ## Why use it? | ||||||
|  | 
 | ||||||
|  | * SearXNG may not offer you as personalised results as Google, | ||||||
|  |   but it doesn't generate a profile about you. | ||||||
|  | 
 | ||||||
|  | * SearXNG doesn't care about what you search for, never shares anything | ||||||
|  |   with a third party, and it can't be used to compromise you. | ||||||
|  | 
 | ||||||
|  | * SearXNG is free software, the code is 100% open and you can help | ||||||
|  |   to make it better.  See more on [SearXNG sources][brand.git_url]. | ||||||
|  | 
 | ||||||
|  | If you do care about privacy, want to be a conscious user, or otherwise | ||||||
|  | believe in digital freedom, make SearXNG your default search engine or run | ||||||
|  | it on your own server | ||||||
|  | 
 | ||||||
|  | ## Technical details - How does it work? | ||||||
|  | 
 | ||||||
|  | SearXNG is a [metasearch engine], inspired by the [seeks project].  It provides | ||||||
|  | basic privacy by mixing your queries with searches on other platforms without | ||||||
|  | storing search data. Queries are made using a POST request on every browser | ||||||
|  | (except Chromium-based browsers*).  Therefore they show up in neither our logs, | ||||||
|  | nor your url history. In the case of Chromium-based browser users there is an | ||||||
|  | exception: searx uses the search bar to perform GET requests.  SearXNG can be | ||||||
|  | added to your browser's search bar; moreover, it can be set as the default | ||||||
|  | search engine. | ||||||
|  | 
 | ||||||
|  | <span id='add to browser'></span> | ||||||
|  | ## How to set as the default search engine? | ||||||
|  | 
 | ||||||
|  | SearXNG supports [OpenSearch].  For more information on changing your default | ||||||
|  | search engine, see your browser's documentation: | ||||||
|  | 
 | ||||||
|  | * [Firefox](https://support.mozilla.org/en-US/kb/add-or-remove-search-engine-firefox) | ||||||
|  | * [Microsoft Edge](https://support.microsoft.com/en-us/help/4028574/microsoft-edge-change-the-default-search-engine) | ||||||
|  | * Chromium-based browsers [only add websites that the user navigates to without a path.](https://www.chromium.org/tab-to-search) | ||||||
|  | 
 | ||||||
|  | ## Where to find anonymous usage statistics of this instance ? | ||||||
|  | 
 | ||||||
|  | [Stats page][url_for:stats] contains some useful data about the engines used. | ||||||
|  | 
 | ||||||
|  | ## How can I make it my own? | ||||||
|  | 
 | ||||||
|  | SearXNG appreciates your concern regarding logs, so take the code from | ||||||
|  | the [SearXNG project][brand.git_url] and run it yourself! | ||||||
|  | 
 | ||||||
|  | Add your instance to this [list of public instances][brand.public_instances] to | ||||||
|  | help other people reclaim their privacy and make the Internet freer!  The more | ||||||
|  | decentralized the Internet is, the more freedom we have! | ||||||
|  | 
 | ||||||
|  | ## Where are the docs & code of this instance? | ||||||
|  | 
 | ||||||
|  | See the [SearXNG docs][brand.docs_url] and [SearXNG sources][brand.git_url] | ||||||
|  | 
 | ||||||
|  | [searx]: https://github.com/searx/searx | ||||||
|  | [metasearch engine]: https://en.wikipedia.org/wiki/Metasearch_engine | ||||||
|  | [weblate]: https://weblate.bubu1.eu/projects/searxng/ | ||||||
|  | [seeks project]: https://beniz.github.io/seeks/ | ||||||
|  | [OpenSearch]: https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md | ||||||
| @ -5,40 +5,18 @@ | |||||||
| import asyncio | import asyncio | ||||||
| import threading | import threading | ||||||
| import concurrent.futures | import concurrent.futures | ||||||
|  | from queue import SimpleQueue | ||||||
| from types import MethodType | from types import MethodType | ||||||
| from timeit import default_timer | from timeit import default_timer | ||||||
|  | from typing import Iterable, Tuple | ||||||
| 
 | 
 | ||||||
| import httpx | import httpx | ||||||
| import anyio | import anyio | ||||||
| import h2.exceptions |  | ||||||
| 
 | 
 | ||||||
| from .network import get_network, initialize, check_network_configuration | from .network import get_network, initialize, check_network_configuration | ||||||
| from .client import get_loop | from .client import get_loop | ||||||
| from .raise_for_httperror import raise_for_httperror | from .raise_for_httperror import raise_for_httperror | ||||||
| 
 | 
 | ||||||
| # queue.SimpleQueue: Support Python 3.6 |  | ||||||
| try: |  | ||||||
|     from queue import SimpleQueue |  | ||||||
| except ImportError: |  | ||||||
|     from queue import Empty |  | ||||||
|     from collections import deque |  | ||||||
| 
 |  | ||||||
|     class SimpleQueue: |  | ||||||
|         """Minimal backport of queue.SimpleQueue""" |  | ||||||
| 
 |  | ||||||
|         def __init__(self): |  | ||||||
|             self._queue = deque() |  | ||||||
|             self._count = threading.Semaphore(0) |  | ||||||
| 
 |  | ||||||
|         def put(self, item): |  | ||||||
|             self._queue.append(item) |  | ||||||
|             self._count.release() |  | ||||||
| 
 |  | ||||||
|         def get(self): |  | ||||||
|             if not self._count.acquire(True):  # pylint: disable=consider-using-with |  | ||||||
|                 raise Empty |  | ||||||
|             return self._queue.popleft() |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| THREADLOCAL = threading.local() | THREADLOCAL = threading.local() | ||||||
| """Thread-local data is data for thread specific values.""" | """Thread-local data is data for thread specific values.""" | ||||||
| @ -210,7 +188,7 @@ def _close_response_method(self): | |||||||
|         continue |         continue | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def stream(method, url, **kwargs): | def stream(method, url, **kwargs) -> Tuple[httpx.Response, Iterable[bytes]]: | ||||||
|     """Replace httpx.stream. |     """Replace httpx.stream. | ||||||
| 
 | 
 | ||||||
|     Usage: |     Usage: | ||||||
|  | |||||||
| @ -4,7 +4,9 @@ | |||||||
| 
 | 
 | ||||||
| import asyncio | import asyncio | ||||||
| import logging | import logging | ||||||
|  | from ssl import SSLContext | ||||||
| import threading | import threading | ||||||
|  | from typing import Any, Dict | ||||||
| 
 | 
 | ||||||
| import httpx | import httpx | ||||||
| from httpx_socks import AsyncProxyTransport | from httpx_socks import AsyncProxyTransport | ||||||
| @ -23,7 +25,7 @@ else: | |||||||
| 
 | 
 | ||||||
| logger = logger.getChild('searx.network.client') | logger = logger.getChild('searx.network.client') | ||||||
| LOOP = None | LOOP = None | ||||||
| SSLCONTEXTS = {} | SSLCONTEXTS: Dict[Any, SSLContext] = {} | ||||||
| TRANSPORT_KWARGS = { | TRANSPORT_KWARGS = { | ||||||
|     'trust_env': False, |     'trust_env': False, | ||||||
| } | } | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ import atexit | |||||||
| import asyncio | import asyncio | ||||||
| import ipaddress | import ipaddress | ||||||
| from itertools import cycle | from itertools import cycle | ||||||
|  | from typing import Dict | ||||||
| 
 | 
 | ||||||
| import httpx | import httpx | ||||||
| 
 | 
 | ||||||
| @ -16,7 +17,7 @@ from .client import new_client, get_loop, AsyncHTTPTransportNoHttp | |||||||
| 
 | 
 | ||||||
| logger = logger.getChild('network') | logger = logger.getChild('network') | ||||||
| DEFAULT_NAME = '__DEFAULT__' | DEFAULT_NAME = '__DEFAULT__' | ||||||
| NETWORKS = {} | NETWORKS: Dict[str, 'Network'] = {} | ||||||
| # requests compatibility when reading proxy settings from settings.yml | # requests compatibility when reading proxy settings from settings.yml | ||||||
| PROXY_PATTERN_MAPPING = { | PROXY_PATTERN_MAPPING = { | ||||||
|     'http': 'http://', |     'http': 'http://', | ||||||
| @ -166,12 +167,13 @@ class Network: | |||||||
|         for transport in client._mounts.values():  # pylint: disable=protected-access |         for transport in client._mounts.values():  # pylint: disable=protected-access | ||||||
|             if isinstance(transport, AsyncHTTPTransportNoHttp): |             if isinstance(transport, AsyncHTTPTransportNoHttp): | ||||||
|                 continue |                 continue | ||||||
|             if not getattr(transport, '_rdns', False): |             if getattr(transport, "_pool") and getattr( | ||||||
|                 result = False |                 transport._pool, "_rdns", False  # pylint: disable=protected-access | ||||||
|                 break |             ): | ||||||
|         else: |                 continue | ||||||
|             response = await client.get('https://check.torproject.org/api/ip') |             return False | ||||||
|             if not response.json()['IsTor']: |         response = await client.get("https://check.torproject.org/api/ip", timeout=10) | ||||||
|  |         if not response.json()["IsTor"]: | ||||||
|             result = False |             result = False | ||||||
|         Network._TOR_CHECK_RESULT[proxies] = result |         Network._TOR_CHECK_RESULT[proxies] = result | ||||||
|         return result |         return result | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ from os.path import abspath, basename, dirname, exists, join | |||||||
| from shutil import copyfile | from shutil import copyfile | ||||||
| from pkgutil import iter_modules | from pkgutil import iter_modules | ||||||
| from logging import getLogger | from logging import getLogger | ||||||
| from typing import List | from typing import List, Tuple | ||||||
| 
 | 
 | ||||||
| from searx import logger, settings | from searx import logger, settings | ||||||
| 
 | 
 | ||||||
| @ -22,6 +22,9 @@ class Plugin:  # pylint: disable=too-few-public-methods | |||||||
|     name: str |     name: str | ||||||
|     description: str |     description: str | ||||||
|     default_on: bool |     default_on: bool | ||||||
|  |     js_dependencies: Tuple[str] | ||||||
|  |     css_dependencies: Tuple[str] | ||||||
|  |     preference_section: str | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| logger = logger.getChild("plugins") | logger = logger.getChild("plugins") | ||||||
|  | |||||||
| @ -2,7 +2,9 @@ import re | |||||||
| from collections import defaultdict | from collections import defaultdict | ||||||
| from operator import itemgetter | from operator import itemgetter | ||||||
| from threading import RLock | from threading import RLock | ||||||
|  | from typing import List, NamedTuple, Set | ||||||
| from urllib.parse import urlparse, unquote | from urllib.parse import urlparse, unquote | ||||||
|  | 
 | ||||||
| from searx import logger | from searx import logger | ||||||
| from searx.engines import engines | from searx.engines import engines | ||||||
| from searx.metrics import histogram_observe, counter_add, count_error | from searx.metrics import histogram_observe, counter_add, count_error | ||||||
| @ -137,6 +139,18 @@ def result_score(result): | |||||||
|     return sum((occurences * weight) / position for position in result['positions']) |     return sum((occurences * weight) / position for position in result['positions']) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class Timing(NamedTuple): | ||||||
|  |     engine: str | ||||||
|  |     total: float | ||||||
|  |     load: float | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class UnresponsiveEngine(NamedTuple): | ||||||
|  |     engine: str | ||||||
|  |     error_type: str | ||||||
|  |     suspended: bool | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class ResultContainer: | class ResultContainer: | ||||||
|     """docstring for ResultContainer""" |     """docstring for ResultContainer""" | ||||||
| 
 | 
 | ||||||
| @ -168,8 +182,8 @@ class ResultContainer: | |||||||
|         self.engine_data = defaultdict(dict) |         self.engine_data = defaultdict(dict) | ||||||
|         self._closed = False |         self._closed = False | ||||||
|         self.paging = False |         self.paging = False | ||||||
|         self.unresponsive_engines = set() |         self.unresponsive_engines: Set[UnresponsiveEngine] = set() | ||||||
|         self.timings = [] |         self.timings: List[Timing] = [] | ||||||
|         self.redirect_url = None |         self.redirect_url = None | ||||||
|         self.on_result = lambda _: True |         self.on_result = lambda _: True | ||||||
|         self._lock = RLock() |         self._lock = RLock() | ||||||
| @ -401,17 +415,12 @@ class ResultContainer: | |||||||
|             return 0 |             return 0 | ||||||
|         return resultnum_sum / len(self._number_of_results) |         return resultnum_sum / len(self._number_of_results) | ||||||
| 
 | 
 | ||||||
|     def add_unresponsive_engine(self, engine_name, error_type, error_message=None, suspended=False): |     def add_unresponsive_engine(self, engine_name: str, error_type: str, suspended: bool = False): | ||||||
|         if engines[engine_name].display_error_messages: |         if engines[engine_name].display_error_messages: | ||||||
|             self.unresponsive_engines.add((engine_name, error_type, error_message, suspended)) |             self.unresponsive_engines.add(UnresponsiveEngine(engine_name, error_type, suspended)) | ||||||
| 
 | 
 | ||||||
|     def add_timing(self, engine_name, engine_time, page_load_time): |     def add_timing(self, engine_name: str, engine_time: float, page_load_time: float): | ||||||
|         timing = { |         self.timings.append(Timing(engine_name, total=engine_time, load=page_load_time)) | ||||||
|             'engine': engines[engine_name].shortcut, |  | ||||||
|             'total': engine_time, |  | ||||||
|             'load': page_load_time, |  | ||||||
|         } |  | ||||||
|         self.timings.append(timing) |  | ||||||
| 
 | 
 | ||||||
|     def get_timings(self): |     def get_timings(self): | ||||||
|         return self.timings |         return self.timings | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| # SPDX-License-Identifier: AGPL-3.0-or-later | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
| # lint: pylint | # lint: pylint | ||||||
| # pylint: disable=missing-module-docstring | # pylint: disable=missing-module-docstring | ||||||
|  | # pyright: strict | ||||||
| 
 | 
 | ||||||
| import json | import json | ||||||
| import random | import random | ||||||
| @ -8,6 +9,8 @@ import time | |||||||
| import threading | import threading | ||||||
| import os | import os | ||||||
| import signal | import signal | ||||||
|  | from typing import Dict, Union, List, Any, Tuple | ||||||
|  | from typing_extensions import TypedDict, Literal | ||||||
| 
 | 
 | ||||||
| from searx import logger, settings, searx_debug | from searx import logger, settings, searx_debug | ||||||
| from searx.exceptions import SearxSettingsException | from searx.exceptions import SearxSettingsException | ||||||
| @ -20,17 +23,58 @@ CHECKER_RESULT = 'CHECKER_RESULT' | |||||||
| running = threading.Lock() | running = threading.Lock() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def _get_interval(every, error_msg): | CheckerResult = Union['CheckerOk', 'CheckerErr', 'CheckerOther'] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CheckerOk(TypedDict): | ||||||
|  |     """Checking the engines succeeded""" | ||||||
|  | 
 | ||||||
|  |     status: Literal['ok'] | ||||||
|  |     engines: Dict[str, 'EngineResult'] | ||||||
|  |     timestamp: int | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CheckerErr(TypedDict): | ||||||
|  |     """Checking the engines failed""" | ||||||
|  | 
 | ||||||
|  |     status: Literal['error'] | ||||||
|  |     timestamp: int | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CheckerOther(TypedDict): | ||||||
|  |     """The status is unknown or disabled""" | ||||||
|  | 
 | ||||||
|  |     status: Literal['unknown', 'disabled'] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | EngineResult = Union['EngineOk', 'EngineErr'] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class EngineOk(TypedDict): | ||||||
|  |     """Checking the engine succeeded""" | ||||||
|  | 
 | ||||||
|  |     success: Literal[True] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class EngineErr(TypedDict): | ||||||
|  |     """Checking the engine failed""" | ||||||
|  | 
 | ||||||
|  |     success: Literal[False] | ||||||
|  |     errors: Dict[str, List[str]] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _get_interval(every: Any, error_msg: str) -> Tuple[int, int]: | ||||||
|     if isinstance(every, int): |     if isinstance(every, int): | ||||||
|         every = (every, every) |         return (every, every) | ||||||
|  | 
 | ||||||
|     if ( |     if ( | ||||||
|         not isinstance(every, (tuple, list)) |         not isinstance(every, (tuple, list)) | ||||||
|         or len(every) != 2 |         or len(every) != 2  # type: ignore | ||||||
|         or not isinstance(every[0], int) |         or not isinstance(every[0], int) | ||||||
|         or not isinstance(every[1], int) |         or not isinstance(every[1], int) | ||||||
|     ): |     ): | ||||||
|         raise SearxSettingsException(error_msg, None) |         raise SearxSettingsException(error_msg, None) | ||||||
|     return every |     return (every[0], every[1]) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def _get_every(): | def _get_every(): | ||||||
| @ -38,25 +82,27 @@ def _get_every(): | |||||||
|     return _get_interval(every, 'checker.scheduling.every is not a int or list') |     return _get_interval(every, 'checker.scheduling.every is not a int or list') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_result(): | def get_result() -> CheckerResult: | ||||||
|     serialized_result = storage.get_str(CHECKER_RESULT) |     serialized_result = storage.get_str(CHECKER_RESULT) | ||||||
|     if serialized_result is not None: |     if serialized_result is not None: | ||||||
|         return json.loads(serialized_result) |         return json.loads(serialized_result) | ||||||
|     return {'status': 'unknown'} |     return {'status': 'unknown'} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def _set_result(result, include_timestamp=True): | def _set_result(result: CheckerResult): | ||||||
|     if include_timestamp: |  | ||||||
|         result['timestamp'] = int(time.time() / 3600) * 3600 |  | ||||||
|     storage.set_str(CHECKER_RESULT, json.dumps(result)) |     storage.set_str(CHECKER_RESULT, json.dumps(result)) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def _timestamp(): | ||||||
|  |     return int(time.time() / 3600) * 3600 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def run(): | def run(): | ||||||
|     if not running.acquire(blocking=False):  # pylint: disable=consider-using-with |     if not running.acquire(blocking=False):  # pylint: disable=consider-using-with | ||||||
|         return |         return | ||||||
|     try: |     try: | ||||||
|         logger.info('Starting checker') |         logger.info('Starting checker') | ||||||
|         result = {'status': 'ok', 'engines': {}} |         result: CheckerOk = {'status': 'ok', 'engines': {}, 'timestamp': _timestamp()} | ||||||
|         for name, processor in PROCESSORS.items(): |         for name, processor in PROCESSORS.items(): | ||||||
|             logger.debug('Checking %s engine', name) |             logger.debug('Checking %s engine', name) | ||||||
|             checker = Checker(processor) |             checker = Checker(processor) | ||||||
| @ -69,7 +115,7 @@ def run(): | |||||||
|         _set_result(result) |         _set_result(result) | ||||||
|         logger.info('Check done') |         logger.info('Check done') | ||||||
|     except Exception:  # pylint: disable=broad-except |     except Exception:  # pylint: disable=broad-except | ||||||
|         _set_result({'status': 'error'}) |         _set_result({'status': 'error', 'timestamp': _timestamp()}) | ||||||
|         logger.exception('Error while running the checker') |         logger.exception('Error while running the checker') | ||||||
|     finally: |     finally: | ||||||
|         running.release() |         running.release() | ||||||
| @ -89,7 +135,7 @@ def _start_scheduling(): | |||||||
|         run() |         run() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def _signal_handler(_signum, _frame): | def _signal_handler(_signum: int, _frame: Any): | ||||||
|     t = threading.Thread(target=run) |     t = threading.Thread(target=run) | ||||||
|     t.daemon = True |     t.daemon = True | ||||||
|     t.start() |     t.start() | ||||||
| @ -102,7 +148,7 @@ def initialize(): | |||||||
|         signal.signal(signal.SIGUSR1, _signal_handler) |         signal.signal(signal.SIGUSR1, _signal_handler) | ||||||
| 
 | 
 | ||||||
|     # disabled by default |     # disabled by default | ||||||
|     _set_result({'status': 'disabled'}, include_timestamp=False) |     _set_result({'status': 'disabled'}) | ||||||
| 
 | 
 | ||||||
|     # special case when debug is activate |     # special case when debug is activate | ||||||
|     if searx_debug and settings.get('checker', {}).get('off_when_debug', True): |     if searx_debug and settings.get('checker', {}).get('off_when_debug', True): | ||||||
| @ -116,7 +162,7 @@ def initialize(): | |||||||
|         return |         return | ||||||
| 
 | 
 | ||||||
|     # |     # | ||||||
|     _set_result({'status': 'unknown'}, include_timestamp=False) |     _set_result({'status': 'unknown'}) | ||||||
| 
 | 
 | ||||||
|     start_after = scheduling.get('start_after', (300, 1800)) |     start_after = scheduling.get('start_after', (300, 1800)) | ||||||
|     start_after = _get_interval(start_after, 'checker.scheduling.start_after is not a int or list') |     start_after = _get_interval(start_after, 'checker.scheduling.start_after is not a int or list') | ||||||
|  | |||||||
| @ -74,7 +74,7 @@ def _download_and_check_if_image(image_url: str) -> bool: | |||||||
|         try: |         try: | ||||||
|             # use "image_proxy" (avoid HTTP/2) |             # use "image_proxy" (avoid HTTP/2) | ||||||
|             network.set_context_network_name('image_proxy') |             network.set_context_network_name('image_proxy') | ||||||
|             stream = network.stream( |             r, stream = network.stream( | ||||||
|                 'GET', |                 'GET', | ||||||
|                 image_url, |                 image_url, | ||||||
|                 timeout=10.0, |                 timeout=10.0, | ||||||
| @ -91,7 +91,6 @@ def _download_and_check_if_image(image_url: str) -> bool: | |||||||
|                     'Cache-Control': 'max-age=0', |                     'Cache-Control': 'max-age=0', | ||||||
|                 }, |                 }, | ||||||
|             ) |             ) | ||||||
|             r = next(stream) |  | ||||||
|             r.close() |             r.close() | ||||||
|             if r.status_code == 200: |             if r.status_code == 200: | ||||||
|                 is_image = r.headers.get('content-type', '').startswith('image/') |                 is_image = r.headers.get('content-type', '').startswith('image/') | ||||||
|  | |||||||
| @ -11,10 +11,12 @@ __all__ = [ | |||||||
|     'OnlineProcessor', |     'OnlineProcessor', | ||||||
|     'OnlineDictionaryProcessor', |     'OnlineDictionaryProcessor', | ||||||
|     'OnlineCurrencyProcessor', |     'OnlineCurrencyProcessor', | ||||||
|  |     'OnlineUrlSearchProcessor', | ||||||
|     'PROCESSORS', |     'PROCESSORS', | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
| import threading | import threading | ||||||
|  | from typing import Dict | ||||||
| 
 | 
 | ||||||
| from searx import logger | from searx import logger | ||||||
| from searx import engines | from searx import engines | ||||||
| @ -23,16 +25,23 @@ from .online import OnlineProcessor | |||||||
| from .offline import OfflineProcessor | from .offline import OfflineProcessor | ||||||
| from .online_dictionary import OnlineDictionaryProcessor | from .online_dictionary import OnlineDictionaryProcessor | ||||||
| from .online_currency import OnlineCurrencyProcessor | from .online_currency import OnlineCurrencyProcessor | ||||||
|  | from .online_url_search import OnlineUrlSearchProcessor | ||||||
| from .abstract import EngineProcessor | from .abstract import EngineProcessor | ||||||
| 
 | 
 | ||||||
| logger = logger.getChild('search.processors') | logger = logger.getChild('search.processors') | ||||||
| PROCESSORS = {} | PROCESSORS: Dict[str, EngineProcessor] = {} | ||||||
| """Cache request processores, stored by *engine-name* (:py:func:`initialize`)""" | """Cache request processores, stored by *engine-name* (:py:func:`initialize`)""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_processor_class(engine_type): | def get_processor_class(engine_type): | ||||||
|     """Return processor class according to the ``engine_type``""" |     """Return processor class according to the ``engine_type``""" | ||||||
|     for c in [OnlineProcessor, OfflineProcessor, OnlineDictionaryProcessor, OnlineCurrencyProcessor]: |     for c in [ | ||||||
|  |         OnlineProcessor, | ||||||
|  |         OfflineProcessor, | ||||||
|  |         OnlineDictionaryProcessor, | ||||||
|  |         OnlineCurrencyProcessor, | ||||||
|  |         OnlineUrlSearchProcessor, | ||||||
|  |     ]: | ||||||
|         if c.engine_type == engine_type: |         if c.engine_type == engine_type: | ||||||
|             return c |             return c | ||||||
|     return None |     return None | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ | |||||||
| import threading | import threading | ||||||
| from abc import abstractmethod, ABC | from abc import abstractmethod, ABC | ||||||
| from timeit import default_timer | from timeit import default_timer | ||||||
|  | from typing import Dict, Union | ||||||
| 
 | 
 | ||||||
| from searx import settings, logger | from searx import settings, logger | ||||||
| from searx.engines import engines | from searx.engines import engines | ||||||
| @ -17,7 +18,7 @@ from searx.exceptions import SearxEngineAccessDeniedException, SearxEngineRespon | |||||||
| from searx.utils import get_engine_from_settings | from searx.utils import get_engine_from_settings | ||||||
| 
 | 
 | ||||||
| logger = logger.getChild('searx.search.processor') | logger = logger.getChild('searx.search.processor') | ||||||
| SUSPENDED_STATUS = {} | SUSPENDED_STATUS: Dict[Union[int, str], 'SuspendedStatus'] = {} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class SuspendedStatus: | class SuspendedStatus: | ||||||
| @ -61,7 +62,7 @@ class EngineProcessor(ABC): | |||||||
| 
 | 
 | ||||||
|     __slots__ = 'engine', 'engine_name', 'lock', 'suspended_status', 'logger' |     __slots__ = 'engine', 'engine_name', 'lock', 'suspended_status', 'logger' | ||||||
| 
 | 
 | ||||||
|     def __init__(self, engine, engine_name): |     def __init__(self, engine, engine_name: str): | ||||||
|         self.engine = engine |         self.engine = engine | ||||||
|         self.engine_name = engine_name |         self.engine_name = engine_name | ||||||
|         self.logger = engines[engine_name].logger |         self.logger = engines[engine_name].logger | ||||||
|  | |||||||
							
								
								
									
										42
									
								
								searx/search/processors/online_url_search.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								searx/search/processors/online_url_search.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | |||||||
|  | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
|  | # lint: pylint | ||||||
|  | """Processores for engine-type: ``online_url_search`` | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import re | ||||||
|  | from .online import OnlineProcessor | ||||||
|  | 
 | ||||||
|  | re_search_urls = { | ||||||
|  |     'http': re.compile(r'https?:\/\/[^ ]*'), | ||||||
|  |     'ftp': re.compile(r'ftps?:\/\/[^ ]*'), | ||||||
|  |     'data:image': re.compile('data:image/[^; ]*;base64,[^ ]*'), | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class OnlineUrlSearchProcessor(OnlineProcessor): | ||||||
|  |     """Processor class used by ``online_url_search`` engines.""" | ||||||
|  | 
 | ||||||
|  |     engine_type = 'online_url_search' | ||||||
|  | 
 | ||||||
|  |     def get_params(self, search_query, engine_category): | ||||||
|  |         params = super().get_params(search_query, engine_category) | ||||||
|  |         if params is None: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |         url_match = False | ||||||
|  |         search_urls = {} | ||||||
|  | 
 | ||||||
|  |         for k, v in re_search_urls.items(): | ||||||
|  |             m = v.search(search_query.query) | ||||||
|  |             v = None | ||||||
|  |             if m: | ||||||
|  |                 url_match = True | ||||||
|  |                 v = m[0] | ||||||
|  |             search_urls[k] = v | ||||||
|  | 
 | ||||||
|  |         if not url_match: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |         params['search_urls'] = search_urls | ||||||
|  |         return params | ||||||
| @ -483,6 +483,11 @@ engines: | |||||||
|     timeout: 3.0 |     timeout: 3.0 | ||||||
|     disabled: true |     disabled: true | ||||||
| 
 | 
 | ||||||
|  |   - name: tineye | ||||||
|  |     engine: tineye | ||||||
|  |     shortcut: tin | ||||||
|  |     timeout: 9.0 | ||||||
|  | 
 | ||||||
|   - name: etymonline |   - name: etymonline | ||||||
|     engine: xpath |     engine: xpath | ||||||
|     paging: true |     paging: true | ||||||
| @ -777,11 +782,16 @@ engines: | |||||||
| 
 | 
 | ||||||
|   - name: invidious |   - name: invidious | ||||||
|     engine: invidious |     engine: invidious | ||||||
|  |     # Instanes will be selected randomly, see https://api.invidious.io/ for | ||||||
|  |     # instances that are stable (good uptime) and close to you. | ||||||
|     base_url: |     base_url: | ||||||
|       - https://invidious.tube/ |  | ||||||
|       - https://invidious.snopyta.org/ |       - https://invidious.snopyta.org/ | ||||||
|  |       - https://vid.puffyan.us/ | ||||||
|  |       - https://invidious.kavin.rocks/ | ||||||
|  |       - https://invidio.xamh.de/ | ||||||
|  |       - https://inv.riverside.rocks/ | ||||||
|     shortcut: iv |     shortcut: iv | ||||||
|     timeout: 5.0 |     timeout: 3.0 | ||||||
|     disabled: true |     disabled: true | ||||||
| 
 | 
 | ||||||
|   - name: kickass |   - name: kickass | ||||||
| @ -1455,7 +1465,7 @@ engines: | |||||||
|     # Or you can use the html non-stable engine, activated by default |     # Or you can use the html non-stable engine, activated by default | ||||||
|     engine: wolframalpha_noapi |     engine: wolframalpha_noapi | ||||||
|     timeout: 6.0 |     timeout: 6.0 | ||||||
|     categories: science |     categories: [] | ||||||
| 
 | 
 | ||||||
|   - name: dictzone |   - name: dictzone | ||||||
|     engine: dictzone |     engine: dictzone | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ A redis DB connect can be tested by:: | |||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| import logging | import logging | ||||||
|  | import redis | ||||||
| from searx import get_setting | from searx import get_setting | ||||||
| 
 | 
 | ||||||
| logger = logging.getLogger('searx.shared.redis') | logger = logging.getLogger('searx.shared.redis') | ||||||
| @ -28,8 +29,6 @@ _client = None | |||||||
| 
 | 
 | ||||||
| def client(): | def client(): | ||||||
|     global _client  # pylint: disable=global-statement |     global _client  # pylint: disable=global-statement | ||||||
|     import redis  # pylint: disable=import-error, import-outside-toplevel |  | ||||||
| 
 |  | ||||||
|     if _client is None: |     if _client is None: | ||||||
|         # not thread safe: in the worst case scenario, two or more clients are |         # not thread safe: in the worst case scenario, two or more clients are | ||||||
|         # initialized only one is kept, the others are garbage collected. |         # initialized only one is kept, the others are garbage collected. | ||||||
| @ -38,8 +37,6 @@ def client(): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def init(): | def init(): | ||||||
|     import redis  # pylint: disable=import-error, import-outside-toplevel |  | ||||||
| 
 |  | ||||||
|     try: |     try: | ||||||
|         c = client() |         c = client() | ||||||
|         logger.info("connected redis DB --> %s", c.acl_whoami()) |         logger.info("connected redis DB --> %s", c.acl_whoami()) | ||||||
|  | |||||||
| @ -1,20 +1,22 @@ | |||||||
| # SPDX-License-Identifier: AGPL-3.0-or-later | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
|  | # pyright: strict | ||||||
| from abc import ABC, abstractmethod | from abc import ABC, abstractmethod | ||||||
|  | from typing import Optional | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class SharedDict(ABC): | class SharedDict(ABC): | ||||||
|     @abstractmethod |     @abstractmethod | ||||||
|     def get_int(self, key): |     def get_int(self, key: str) -> Optional[int]: | ||||||
|         pass |         pass | ||||||
| 
 | 
 | ||||||
|     @abstractmethod |     @abstractmethod | ||||||
|     def set_int(self, key, value): |     def set_int(self, key: str, value: int): | ||||||
|         pass |         pass | ||||||
| 
 | 
 | ||||||
|     @abstractmethod |     @abstractmethod | ||||||
|     def get_str(self, key): |     def get_str(self, key: str) -> Optional[str]: | ||||||
|         pass |         pass | ||||||
| 
 | 
 | ||||||
|     @abstractmethod |     @abstractmethod | ||||||
|     def set_str(self, key, value): |     def set_str(self, key: str, value: str): | ||||||
|         pass |         pass | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| # SPDX-License-Identifier: AGPL-3.0-or-later | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
| 
 | 
 | ||||||
| import threading | import threading | ||||||
|  | from typing import Optional | ||||||
| 
 | 
 | ||||||
| from . import shared_abstract | from . import shared_abstract | ||||||
| 
 | 
 | ||||||
| @ -12,16 +13,16 @@ class SimpleSharedDict(shared_abstract.SharedDict): | |||||||
|     def __init__(self): |     def __init__(self): | ||||||
|         self.d = {} |         self.d = {} | ||||||
| 
 | 
 | ||||||
|     def get_int(self, key): |     def get_int(self, key: str) -> Optional[int]: | ||||||
|         return self.d.get(key, None) |         return self.d.get(key, None) | ||||||
| 
 | 
 | ||||||
|     def set_int(self, key, value): |     def set_int(self, key: str, value: int): | ||||||
|         self.d[key] = value |         self.d[key] = value | ||||||
| 
 | 
 | ||||||
|     def get_str(self, key): |     def get_str(self, key: str) -> Optional[str]: | ||||||
|         return self.d.get(key, None) |         return self.d.get(key, None) | ||||||
| 
 | 
 | ||||||
|     def set_str(self, key, value): |     def set_str(self, key: str, value: str): | ||||||
|         self.d[key] = value |         self.d[key] = value | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| # SPDX-License-Identifier: AGPL-3.0-or-later | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
| 
 | 
 | ||||||
| import time | import time | ||||||
|  | from typing import Optional | ||||||
| import uwsgi  # pylint: disable=E0401 | import uwsgi  # pylint: disable=E0401 | ||||||
| from . import shared_abstract | from . import shared_abstract | ||||||
| 
 | 
 | ||||||
| @ -9,25 +10,25 @@ _last_signal = 10 | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class UwsgiCacheSharedDict(shared_abstract.SharedDict): | class UwsgiCacheSharedDict(shared_abstract.SharedDict): | ||||||
|     def get_int(self, key): |     def get_int(self, key: str) -> Optional[int]: | ||||||
|         value = uwsgi.cache_get(key) |         value = uwsgi.cache_get(key) | ||||||
|         if value is None: |         if value is None: | ||||||
|             return value |             return value | ||||||
|         else: |         else: | ||||||
|             return int.from_bytes(value, 'big') |             return int.from_bytes(value, 'big') | ||||||
| 
 | 
 | ||||||
|     def set_int(self, key, value): |     def set_int(self, key: str, value: int): | ||||||
|         b = value.to_bytes(4, 'big') |         b = value.to_bytes(4, 'big') | ||||||
|         uwsgi.cache_update(key, b) |         uwsgi.cache_update(key, b) | ||||||
| 
 | 
 | ||||||
|     def get_str(self, key): |     def get_str(self, key: str) -> Optional[str]: | ||||||
|         value = uwsgi.cache_get(key) |         value = uwsgi.cache_get(key) | ||||||
|         if value is None: |         if value is None: | ||||||
|             return value |             return value | ||||||
|         else: |         else: | ||||||
|             return value.decode('utf-8') |             return value.decode('utf-8') | ||||||
| 
 | 
 | ||||||
|     def set_str(self, key, value): |     def set_str(self, key: str, value: str): | ||||||
|         b = value.encode('utf-8') |         b = value.encode('utf-8') | ||||||
|         uwsgi.cache_update(key, b) |         uwsgi.cache_update(key, b) | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								searx/static/themes/oscar/js/searxng.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								searx/static/themes/oscar/js/searxng.min.js
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -1,3 +1,7 @@ | |||||||
| { | { | ||||||
|   "extends": "stylelint-config-standard" |   "extends": "stylelint-config-standard", | ||||||
|  |   "rules": { | ||||||
|  |     "declaration-empty-line-before": null, | ||||||
|  |     "no-invalid-position-at-import-rule": null | ||||||
|  |   } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								searx/static/themes/simple/css/searxng-rtl.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								searx/static/themes/simple/css/searxng-rtl.min.css
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								searx/static/themes/simple/css/searxng.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								searx/static/themes/simple/css/searxng.min.css
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -127,7 +127,7 @@ module.exports = function (grunt) { | |||||||
|         }, |         }, | ||||||
|         files: [ |         files: [ | ||||||
|           { |           { | ||||||
|             src: ['src/less/style.less'], |             src: ['src/less/style-ltr.less'], | ||||||
|             dest: 'css/searxng.min.css', |             dest: 'css/searxng.min.css', | ||||||
|             nonull: true, |             nonull: true, | ||||||
|             filter: file_exists, |             filter: file_exists, | ||||||
| @ -177,7 +177,7 @@ module.exports = function (grunt) { | |||||||
|           'chevron-up-outline': 'node_modules/ionicons/dist/svg/chevron-up-outline.svg', |           'chevron-up-outline': 'node_modules/ionicons/dist/svg/chevron-up-outline.svg', | ||||||
|           'chevron-right': 'node_modules/ionicons/dist/svg/chevron-forward-outline.svg', |           'chevron-right': 'node_modules/ionicons/dist/svg/chevron-forward-outline.svg', | ||||||
|           'chevron-left': 'node_modules/ionicons/dist/svg/chevron-back-outline.svg', |           'chevron-left': 'node_modules/ionicons/dist/svg/chevron-back-outline.svg', | ||||||
|           'menu-outline': 'node_modules/ionicons/dist/svg/menu-outline.svg', |           'menu-outline': 'node_modules/ionicons/dist/svg/settings-outline.svg', | ||||||
|           'ellipsis-vertical-outline': 'node_modules/ionicons/dist/svg/ellipsis-vertical-outline.svg', |           'ellipsis-vertical-outline': 'node_modules/ionicons/dist/svg/ellipsis-vertical-outline.svg', | ||||||
|           'magnet-outline': 'node_modules/ionicons/dist/svg/magnet-outline.svg', |           'magnet-outline': 'node_modules/ionicons/dist/svg/magnet-outline.svg', | ||||||
|           'globe-outline': 'node_modules/ionicons/dist/svg/globe-outline.svg', |           'globe-outline': 'node_modules/ionicons/dist/svg/globe-outline.svg', | ||||||
|  | |||||||
							
								
								
									
										
											BIN
										
									
								
								searx/static/themes/simple/js/searxng.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								searx/static/themes/simple/js/searxng.min.js
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -4,7 +4,8 @@ | |||||||
|   position: absolute; |   position: absolute; | ||||||
|   max-height: 0; |   max-height: 0; | ||||||
|   overflow-y: hidden; |   overflow-y: hidden; | ||||||
|   text-align: left; |   .ltr-text-align-left(); | ||||||
|  | 
 | ||||||
|   .rounded-corners; |   .rounded-corners; | ||||||
| 
 | 
 | ||||||
|   &:active, |   &:active, | ||||||
| @ -24,7 +25,7 @@ | |||||||
| 
 | 
 | ||||||
|     > li { |     > li { | ||||||
|       cursor: pointer; |       cursor: pointer; | ||||||
|       padding: 8px 0 8px 8px; |       padding: 0.5rem; | ||||||
| 
 | 
 | ||||||
|       &.active, |       &.active, | ||||||
|       &:active, |       &:active, | ||||||
|  | |||||||
| @ -3,8 +3,8 @@ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #main_results #results.only_template_images.image-detail-open #backToTop { | #main_results #results.only_template_images.image-detail-open #backToTop { | ||||||
|   left: 56.75rem !important; |   .ltr-left(56.75rem) !important; | ||||||
|   right: inherit; |   .ltr-right(inherit); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| article.result-images .detail { | article.result-images .detail { | ||||||
| @ -15,8 +15,8 @@ article.result-images .detail { | |||||||
|   display: flex; |   display: flex; | ||||||
|   flex-direction: column; |   flex-direction: column; | ||||||
|   position: fixed; |   position: fixed; | ||||||
|   left: 60rem; |   .ltr-left(60rem); | ||||||
|   right: 0; |   .ltr-right(0); | ||||||
|   top: @search-height; |   top: @search-height; | ||||||
|   transition: top 0.064s ease-in 0s; |   transition: top 0.064s ease-in 0s; | ||||||
|   bottom: 0; |   bottom: 0; | ||||||
| @ -76,7 +76,7 @@ article.result-images .detail { | |||||||
|     h4, |     h4, | ||||||
|     p, |     p, | ||||||
|     a { |     a { | ||||||
|       text-align: left; |       .ltr-text-align-left(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     p.result-content { |     p.result-content { | ||||||
| @ -113,20 +113,23 @@ article.result-images .detail { | |||||||
| 
 | 
 | ||||||
|   a.result-detail-close { |   a.result-detail-close { | ||||||
|     top: 1rem; |     top: 1rem; | ||||||
|     left: 1rem; |     .ltr-left(1rem); | ||||||
|     padding: 0.4rem; |     padding: 0.4rem; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   a.result-detail-previous { |   a.result-detail-previous { | ||||||
|     top: 1rem; |     top: 1rem; | ||||||
|     right: 6rem; |     .ltr-right(6rem); | ||||||
|     // center the icon by moving it slightly on the left |     // center the icon by moving it slightly on the left | ||||||
|     padding: 0.4rem 0.5rem 0.4rem 0.3rem; |     padding-top: 0.4rem; | ||||||
|  |     .ltr-padding-right(0.5rem); | ||||||
|  |     padding-bottom: 0.4rem; | ||||||
|  |     .ltr-padding-left(0.3rem); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   a.result-detail-next { |   a.result-detail-next { | ||||||
|     top: 1rem; |     top: 1rem; | ||||||
|     right: 2rem; |     .ltr-right(2rem); | ||||||
|     padding: 0.4rem; |     padding: 0.4rem; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -186,7 +189,7 @@ article.result-images .detail { | |||||||
|   .loader { |   .loader { | ||||||
|     position: absolute; |     position: absolute; | ||||||
|     top: 1rem; |     top: 1rem; | ||||||
|     right: 50%; |     .ltr-right(50%); | ||||||
|     border-top: 0.5em solid var(--color-result-detail-loader-border); |     border-top: 0.5em solid var(--color-result-detail-loader-border); | ||||||
|     border-right: 0.5em solid var(--color-result-detail-loader-border); |     border-right: 0.5em solid var(--color-result-detail-loader-border); | ||||||
|     border-bottom: 0.5em solid var(--color-result-detail-loader-border); |     border-bottom: 0.5em solid var(--color-result-detail-loader-border); | ||||||
| @ -205,7 +208,7 @@ article.result-images .detail { | |||||||
| @media screen and (max-width: @tablet) { | @media screen and (max-width: @tablet) { | ||||||
|   #results.image-detail-open article.result-images[data-vim-selected] .detail { |   #results.image-detail-open article.result-images[data-vim-selected] .detail { | ||||||
|     top: 0; |     top: 0; | ||||||
|     left: 0; |     .ltr-left(0); | ||||||
| 
 | 
 | ||||||
|     a.result-images-source { |     a.result-images-source { | ||||||
|       display: flex; |       display: flex; | ||||||
| @ -219,7 +222,7 @@ article.result-images .detail { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     a.result-detail-next { |     a.result-detail-next { | ||||||
|       right: 1rem; |       .ltr-right(1rem); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @ -227,7 +230,7 @@ article.result-images .detail { | |||||||
| @media screen and (max-width: @phone) { | @media screen and (max-width: @phone) { | ||||||
|   #results.image-detail-open article.result-images[data-vim-selected] .detail { |   #results.image-detail-open article.result-images[data-vim-selected] .detail { | ||||||
|     top: 0; |     top: 0; | ||||||
|     left: 0; |     .ltr-left(0); | ||||||
|     padding: 1rem; |     padding: 1rem; | ||||||
| 
 | 
 | ||||||
|     a.result-images-source img { |     a.result-images-source img { | ||||||
| @ -238,7 +241,7 @@ article.result-images .detail { | |||||||
| 
 | 
 | ||||||
|     .result-images-labels p span { |     .result-images-labels p span { | ||||||
|       width: inherit; |       width: inherit; | ||||||
|       margin-right: 1rem; |       .ltr-margin-right(1rem); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,9 +1,5 @@ | |||||||
| #main_index { | #main_index { | ||||||
|   margin-top: 26vh; |   margin-top: 26vh; | ||||||
| 
 |  | ||||||
|   #linkto_preferences { |  | ||||||
|     right: 1.8rem; |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .index { | .index { | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| #tab-contentquery table td, | #tab-contentquery table td, | ||||||
| #tab-contentquery table th { | #tab-contentquery table th { | ||||||
|   text-align: left !important; |   .ltr-text-align-right() !important; | ||||||
|   height: 3rem; |   height: 3rem; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -18,20 +18,23 @@ | |||||||
|     margin: 0; |     margin: 0; | ||||||
|     padding: 5px 0 0 0; |     padding: 5px 0 0 0; | ||||||
|     display: block; |     display: block; | ||||||
|     float: left; |     .ltr-float-left(); | ||||||
|     width: 300px; |     width: 300px; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .value { |   .value { | ||||||
|     margin: 0; |     margin: 0; | ||||||
|     padding: 0; |     padding: 0; | ||||||
|     float: left; |     .ltr-float-left(); | ||||||
|     width: 15em; |     width: 15em; | ||||||
| 
 | 
 | ||||||
|     select, |     select, | ||||||
|     input[type="text"] { |     input[type="text"] { | ||||||
|       font-size: inherit !important; |       font-size: inherit !important; | ||||||
|       margin: 0 1rem 0 0; |       margin-top: 0; | ||||||
|  |       .ltr-margin-right(1rem); | ||||||
|  |       margin-bottom: 0; | ||||||
|  |       .ltr-margin-left(0); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     select { |     select { | ||||||
| @ -63,7 +66,7 @@ | |||||||
|   .description { |   .description { | ||||||
|     margin: 0; |     margin: 0; | ||||||
|     padding: 5px 0 0 0; |     padding: 5px 0 0 0; | ||||||
|     float: left; |     .ltr-float-right(); | ||||||
|     width: 50%; |     width: 50%; | ||||||
|     color: var(--color-settings-engine-description-font); |     color: var(--color-settings-engine-description-font); | ||||||
|     font-size: 90%; |     font-size: 90%; | ||||||
| @ -79,6 +82,7 @@ | |||||||
| 
 | 
 | ||||||
|   table.cookies { |   table.cookies { | ||||||
|     width: 100%; |     width: 100%; | ||||||
|  |     direction: ltr; | ||||||
| 
 | 
 | ||||||
|     th, |     th, | ||||||
|     td { |     td { | ||||||
| @ -106,7 +110,7 @@ | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .category { |   .category { | ||||||
|     margin-right: 0.5rem; |     .ltr-margin-right(0.5rem); | ||||||
| 
 | 
 | ||||||
|     label { |     label { | ||||||
|       border: 2px solid transparent; |       border: 2px solid transparent; | ||||||
| @ -121,7 +125,7 @@ | |||||||
| 
 | 
 | ||||||
|   .name, |   .name, | ||||||
|   .shortcut { |   .shortcut { | ||||||
|     text-align: left; |     .ltr-text-align-left(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .preferences_back { |   .preferences_back { | ||||||
| @ -153,7 +157,7 @@ | |||||||
|   th.name { |   th.name { | ||||||
|     .engine-tooltip { |     .engine-tooltip { | ||||||
|       margin-top: 1.8rem; |       margin-top: 1.8rem; | ||||||
|       left: calc((100% - 85em) / 2 + 10em); |       .ltr-left(calc((100% - 85em) / 2 + 10em)); | ||||||
|       max-width: 40rem; |       max-width: 40rem; | ||||||
| 
 | 
 | ||||||
|       .engine-description { |       .engine-description { | ||||||
| @ -163,7 +167,7 @@ | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .engine-group { |   .engine-group { | ||||||
|     text-align: left; |     .ltr-text-align-left(); | ||||||
|     font-weight: normal; |     font-weight: normal; | ||||||
|     background: var(--color-settings-engine-group-background); |     background: var(--color-settings-engine-group-background); | ||||||
|   } |   } | ||||||
| @ -175,6 +179,6 @@ | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .engine-tooltip { |   .engine-tooltip { | ||||||
|     left: 10em !important; |     .ltr-left(10em) !important; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -8,7 +8,9 @@ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #search_header { | #search_header { | ||||||
|   padding: 1.5em 2em 0 @results-offset - 3rem; |   padding-top: 1.5em; | ||||||
|  |   .ltr-padding-right(2em); | ||||||
|  |   .ltr-padding-left(@results-offset - 3rem); | ||||||
|   margin: 0; |   margin: 0; | ||||||
|   background: var(--color-header-background); |   background: var(--color-header-background); | ||||||
|   border-bottom: 1px solid var(--color-header-border); |   border-bottom: 1px solid var(--color-header-border); | ||||||
| @ -24,7 +26,7 @@ | |||||||
| .category { | .category { | ||||||
|   display: inline-block; |   display: inline-block; | ||||||
|   position: relative; |   position: relative; | ||||||
|   margin-right: 1rem; |   .ltr-margin-right(1rem); | ||||||
|   padding: 0; |   padding: 0; | ||||||
| 
 | 
 | ||||||
|   input { |   input { | ||||||
| @ -127,11 +129,11 @@ | |||||||
| 
 | 
 | ||||||
| #q { | #q { | ||||||
|   outline: medium none; |   outline: medium none; | ||||||
|   padding-left: 12px; |   .ltr-padding-left(12px); | ||||||
|   padding-right: 0 !important; |   .ltr-padding-right(0) !important; | ||||||
|   border-right: none; |   .ltr-border-right(none); | ||||||
|   width: @search-width; |   width: @search-width; | ||||||
|   border-radius: 10px 0 0 10px; |   .ltr-rounded-left-corners(10px); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #q::-ms-clear, | #q::-ms-clear, | ||||||
| @ -140,8 +142,8 @@ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #send_search { | #send_search { | ||||||
|   border-left: none; |   .ltr-border-left(none); | ||||||
|   border-radius: 0 10px 10px 0; |   .ltr-rounded-right-corners(10px); | ||||||
| 
 | 
 | ||||||
|   &:hover { |   &:hover { | ||||||
|     cursor: pointer; |     cursor: pointer; | ||||||
| @ -153,12 +155,15 @@ | |||||||
| .no-js #clear_search, | .no-js #clear_search, | ||||||
| .no-js #send_search { | .no-js #send_search { | ||||||
|   width: auto !important; |   width: auto !important; | ||||||
|   border-left: 1px solid var(--color-search-border); |   .ltr-border-left(1px solid var(--color-search-border)); | ||||||
|   padding: 10px; |   padding: 10px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .search_filters { | .search_filters { | ||||||
|   margin: 0.6rem 0 0 @results-offset + 0.6rem; |   margin-top: 0.6rem; | ||||||
|  |   .ltr-margin-right(0); | ||||||
|  |   margin-bottom: 0; | ||||||
|  |   .ltr-margin-left(@results-offset + 0.6rem); | ||||||
| 
 | 
 | ||||||
|   select { |   select { | ||||||
|     background-color: inherit; |     background-color: inherit; | ||||||
| @ -177,7 +182,10 @@ | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .search_filters { |   .search_filters { | ||||||
|     margin: 0.6rem 0 0 @results-tablet-offset + 3rem; |     margin-top: 0.6rem; | ||||||
|  |     .ltr-margin-right(0); | ||||||
|  |     margin-bottom: 0; | ||||||
|  |     .ltr-margin-left(@results-tablet-offset + 3rem); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   #categories { |   #categories { | ||||||
| @ -204,7 +212,7 @@ | |||||||
| 
 | 
 | ||||||
|       #categories { |       #categories { | ||||||
|         width: 100%; |         width: 100%; | ||||||
|         text-align: left; |         .ltr-text-align-left(); | ||||||
|         overflow-x: scroll; |         overflow-x: scroll; | ||||||
|         overflow-y: hidden; |         overflow-y: hidden; | ||||||
|         -webkit-overflow-scrolling: touch; |         -webkit-overflow-scrolling: touch; | ||||||
| @ -243,7 +251,7 @@ | |||||||
| 
 | 
 | ||||||
|   #main_results #q:placeholder-shown ~ #send_search { |   #main_results #q:placeholder-shown ~ #send_search { | ||||||
|     margin-right: 2.6rem; |     margin-right: 2.6rem; | ||||||
|     transition: margin-right 0.1s; |     transition: margin-right 0.1s; // FIX RTL | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .search_filters { |   .search_filters { | ||||||
|  | |||||||
							
								
								
									
										69
									
								
								searx/static/themes/simple/src/less/style-ltr.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								searx/static/themes/simple/src/less/style-ltr.less
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | |||||||
|  | .ltr-left(@offset) { | ||||||
|  |   left: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-right(@offset) { | ||||||
|  |   right: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-margin-right(@offset) { | ||||||
|  |   margin-right: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-margin-left(@offset) { | ||||||
|  |   margin-left: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-border-right(@offset) { | ||||||
|  |   border-right: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-border-left(@offset) { | ||||||
|  |   border-left: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-padding-right(@offset) { | ||||||
|  |   padding-right: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-padding-left(@offset) { | ||||||
|  |   padding-left: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-float-left() { | ||||||
|  |   float: left; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-float-right() { | ||||||
|  |   float: right; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-text-align-right() { | ||||||
|  |   text-align: right; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-rounded-left-corners(@radius) { | ||||||
|  |   border-radius: @radius 0 0 @radius; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-rounded-right-corners(@radius) { | ||||||
|  |   border-radius: 0 @radius @radius 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-text-align-left() { | ||||||
|  |   text-align: left; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-border-left-width(@offset) { | ||||||
|  |   border-left-width: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-border-right-width(@offset) { | ||||||
|  |   border-right-width: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-transform() { | ||||||
|  |   transform: scale(1, 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @import "style.less"; | ||||||
| @ -1,6 +1,134 @@ | |||||||
|  | .ltr-left(@offset) { | ||||||
|  |   right: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-right(@offset) { | ||||||
|  |   left: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-margin-right(@offset) { | ||||||
|  |   margin-left: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-margin-left(@offset) { | ||||||
|  |   margin-right: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-border-right(@offset) { | ||||||
|  |   border-left: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-border-left(@offset) { | ||||||
|  |   border-right: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-padding-right(@offset) { | ||||||
|  |   padding-left: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-padding-left(@offset) { | ||||||
|  |   padding-right: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-float-left() { | ||||||
|  |   float: right; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-float-right() { | ||||||
|  |   float: left; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-text-align-right() { | ||||||
|  |   text-align: left; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-rounded-left-corners(@radius) { | ||||||
|  |   border-radius: 0 @radius @radius 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-rounded-right-corners(@radius) { | ||||||
|  |   border-radius: @radius 0 0 @radius; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-text-align-left() { | ||||||
|  |   text-align: right; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-border-left-width(@offset) { | ||||||
|  |   border-right-width: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-border-right-width(@offset) { | ||||||
|  |   border-left-width: @offset; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .ltr-transform() { | ||||||
|  |   transform: scale(-1, 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @import "style.less"; | @import "style.less"; | ||||||
| 
 | 
 | ||||||
| #search_submit { | #q, | ||||||
|   left: 1px; | #sidebar .infobox dt bdi { | ||||||
|   right: auto; |   direction: rtl; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // URL are displayed LTR but align on the right | ||||||
|  | #urls { | ||||||
|  |   direction: initial; | ||||||
|  |   text-align: right; | ||||||
|  | 
 | ||||||
|  |   .result .url_wrapper { | ||||||
|  |     justify-content: end; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Image detail | ||||||
|  | #results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p { | ||||||
|  |   direction: rtl; | ||||||
|  | 
 | ||||||
|  |   &.result-url { | ||||||
|  |     // Display URL using the LTR direction | ||||||
|  |     direction: ltr; | ||||||
|  | 
 | ||||||
|  |     span { | ||||||
|  |       // And put the label on the right | ||||||
|  |       direction: rtl; | ||||||
|  |       float: right; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // select HTML element | ||||||
|  | @supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))) { | ||||||
|  |   select { | ||||||
|  |     border-width: 0 0 0 2rem; | ||||||
|  |     background-position-x: -2rem; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // vim hotkey helps is not translated | ||||||
|  | #vim-hotkeys-help table { | ||||||
|  |   direction: ltr; | ||||||
|  |   text-align: left; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Logo on the right | ||||||
|  | #main_preferences h1, | ||||||
|  | #main_stats h1 { | ||||||
|  |   background-position-x: 100%; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // patch of searx/static/themes/__common__/less/stats.less | ||||||
|  | .bar-chart-serie1, | ||||||
|  | .bar-chart-serie2 { | ||||||
|  |   float: right; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .engine-stats .engine-name, | ||||||
|  | .engine-stats .engine-score, | ||||||
|  | .engine-stats .result-count, | ||||||
|  | .engine-stats .response-time, | ||||||
|  | .engine-stats .engine-reliability { | ||||||
|  |   text-align: right; | ||||||
| } | } | ||||||
|  | |||||||
| @ -33,6 +33,7 @@ | |||||||
|   vertical-align: bottom; |   vertical-align: bottom; | ||||||
|   line-height: 1; |   line-height: 1; | ||||||
|   text-decoration: inherit; |   text-decoration: inherit; | ||||||
|  |   .ltr-transform(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .ion-icon-small { | .ion-icon-small { | ||||||
| @ -78,9 +79,7 @@ main { | |||||||
|   flex: 1; |   flex: 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #main_preferences, | .page_with_header { | ||||||
| #main_about, |  | ||||||
| #main_stats { |  | ||||||
|   margin: 2em auto; |   margin: 2em auto; | ||||||
|   width: 85em; |   width: 85em; | ||||||
| } | } | ||||||
| @ -100,16 +99,8 @@ footer { | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #main_preferences h1, | .page_with_header .logo { | ||||||
| #main_stats h1 { |   height: 40px; | ||||||
|   background: url('../img/searxng.png') no-repeat; |  | ||||||
|   background-size: contain; |  | ||||||
|   min-height: 40px; |  | ||||||
|   margin: 0 auto; |  | ||||||
| 
 |  | ||||||
|   span { |  | ||||||
|     visibility: hidden; |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| input[type="submit"], | input[type="submit"], | ||||||
| @ -139,8 +130,8 @@ a { | |||||||
| 
 | 
 | ||||||
| article[data-vim-selected] { | article[data-vim-selected] { | ||||||
|   background: var(--color-result-vim-selected); |   background: var(--color-result-vim-selected); | ||||||
|   border-left: 0.2rem solid var(--color-result-vim-arrow); |   .ltr-border-left(0.2rem solid var(--color-result-vim-arrow)); | ||||||
|   .rounded-right-corners; |   .ltr-rounded-right-corners(10px); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| article.result-images[data-vim-selected] { | article.result-images[data-vim-selected] { | ||||||
| @ -166,7 +157,7 @@ article[data-vim-selected].category-social { | |||||||
| .result { | .result { | ||||||
|   margin: @results-margin 0; |   margin: @results-margin 0; | ||||||
|   padding: @result-padding; |   padding: @result-padding; | ||||||
|   border-left: 0.2rem solid transparent; |   .ltr-border-left(0.2rem solid transparent); | ||||||
| 
 | 
 | ||||||
|   h3 { |   h3 { | ||||||
|     font-size: 1.2rem; |     font-size: 1.2rem; | ||||||
| @ -264,15 +255,17 @@ article[data-vim-selected].category-social { | |||||||
| 
 | 
 | ||||||
|   img { |   img { | ||||||
|     &.thumbnail { |     &.thumbnail { | ||||||
|       float: left; |       .ltr-float-left(); | ||||||
|       padding: 0.6rem 1rem 0 0; |       padding-top: 0.6rem; | ||||||
|  |       .ltr-padding-right(1rem); | ||||||
|       width: 20rem; |       width: 20rem; | ||||||
|       height: unset; // remove heigth value that was needed for lazy loading |       height: unset; // remove heigth value that was needed for lazy loading | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     &.image { |     &.image { | ||||||
|       float: left; |       .ltr-float-left(); | ||||||
|       padding: 0.6rem 1rem 0 0; |       padding-top: 0.6rem; | ||||||
|  |       .ltr-padding-right(1rem); | ||||||
|       width: 7rem; |       width: 7rem; | ||||||
|       max-height: 7rem; |       max-height: 7rem; | ||||||
|       object-fit: scale-down; |       object-fit: scale-down; | ||||||
| @ -308,12 +301,15 @@ article[data-vim-selected].category-social { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .engines { | .engines { | ||||||
|   float: right; |   .ltr-float-right(); | ||||||
|   color: var(--color-result-engines-font); |   color: var(--color-result-engines-font); | ||||||
| 
 | 
 | ||||||
|   span { |   span { | ||||||
|     font-size: smaller; |     font-size: smaller; | ||||||
|     margin: 0 0.5em 0 0; |     margin-top: 0; | ||||||
|  |     margin-bottom: 0; | ||||||
|  |     .ltr-margin-right(0.5rem); | ||||||
|  |     .ltr-margin-left(0); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -356,9 +352,12 @@ article[data-vim-selected].category-social { | |||||||
|     display: block; |     display: block; | ||||||
|     position: absolute; |     position: absolute; | ||||||
|     bottom: 0; |     bottom: 0; | ||||||
|     right: 0; |     .ltr-right(0); | ||||||
|     padding: 4px; |     padding: 4px; | ||||||
|     margin: 0 0 4px 4px; |     margin-top: 0; | ||||||
|  |     .ltr-margin-right(0); | ||||||
|  |     margin-bottom: 4px; | ||||||
|  |     .ltr-margin-left(4px); | ||||||
|     // color: @color-result-image-span-font; |     // color: @color-result-image-span-font; | ||||||
|     background-color: var(--color-result-image-span-background-hover); |     background-color: var(--color-result-image-span-background-hover); | ||||||
|     font-size: 0.7em; |     font-size: 0.7em; | ||||||
| @ -367,7 +366,7 @@ article[data-vim-selected].category-social { | |||||||
| 
 | 
 | ||||||
| .result-map { | .result-map { | ||||||
|   img.image { |   img.image { | ||||||
|     float: right !important; |     .ltr-float-right() !important; | ||||||
|     height: 100px !important; |     height: 100px !important; | ||||||
|     width: auto !important; |     width: auto !important; | ||||||
|   } |   } | ||||||
| @ -382,12 +381,12 @@ article[data-vim-selected].category-social { | |||||||
|       font-weight: inherit; |       font-weight: inherit; | ||||||
|       width: 17rem; |       width: 17rem; | ||||||
|       vertical-align: top; |       vertical-align: top; | ||||||
|       text-align: left; |       .ltr-text-align-left(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     td { |     td { | ||||||
|       vertical-align: top; |       vertical-align: top; | ||||||
|       text-align: left; |       .ltr-text-align-left(); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @ -397,7 +396,10 @@ article[data-vim-selected].category-social { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #results { | #results { | ||||||
|   margin: 1rem 2rem 0 @results-offset; |   margin-top: 1rem; | ||||||
|  |   .ltr-margin-right(2rem); | ||||||
|  |   margin-bottom: 0; | ||||||
|  |   .ltr-margin-left(@results-offset); | ||||||
|   display: grid; |   display: grid; | ||||||
|   grid-template-columns: @results-width 25rem; |   grid-template-columns: @results-width 25rem; | ||||||
|   grid-template-rows: min-content min-content 1fr min-content; |   grid-template-rows: min-content min-content 1fr min-content; | ||||||
| @ -533,7 +535,10 @@ article[data-vim-selected].category-social { | |||||||
| 
 | 
 | ||||||
|     dt { |     dt { | ||||||
|       display: inline; |       display: inline; | ||||||
|       margin: 0.5em 0.25em 0.5em 0; |       margin-top: 0.5em; | ||||||
|  |       .ltr-margin-right(0.25em); | ||||||
|  |       margin-bottom: 0.5em; | ||||||
|  |       .ltr-margin-left(0); | ||||||
|       padding: 0; |       padding: 0; | ||||||
|       font-weight: bold; |       font-weight: bold; | ||||||
|     } |     } | ||||||
| @ -571,7 +576,7 @@ article[data-vim-selected].category-social { | |||||||
| 
 | 
 | ||||||
| #linkto_preferences { | #linkto_preferences { | ||||||
|   position: absolute; |   position: absolute; | ||||||
|   right: 10px; |   .ltr-right(1.8rem); | ||||||
|   top: 2.2rem; |   top: 2.2rem; | ||||||
|   padding: 0; |   padding: 0; | ||||||
|   border: 0; |   border: 0; | ||||||
| @ -608,7 +613,7 @@ article[data-vim-selected].category-social { | |||||||
|   background: var(--color-backtotop-background); |   background: var(--color-backtotop-background); | ||||||
|   position: fixed; |   position: fixed; | ||||||
|   bottom: 8rem; |   bottom: 8rem; | ||||||
|   left: @results-width + @results-offset + (0.5 * @results-gap - 1.2em); |   .ltr-left(@results-width + @results-offset + (0.5 * @results-gap - 1.2em)); | ||||||
|   transition: opacity 0.5s; |   transition: opacity 0.5s; | ||||||
|   opacity: 0; |   opacity: 0; | ||||||
|   .rounded-corners; |   .rounded-corners; | ||||||
| @ -632,9 +637,7 @@ article[data-vim-selected].category-social { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @media screen and (max-width: @tablet) { | @media screen and (max-width: @tablet) { | ||||||
|   #main_preferences, |   .page_with_header { | ||||||
|   #main_about, |  | ||||||
|   #main_stats { |  | ||||||
|     margin: 2rem 0.5rem; |     margin: 2rem 0.5rem; | ||||||
|     width: auto; |     width: auto; | ||||||
|   } |   } | ||||||
| @ -647,9 +650,12 @@ article[data-vim-selected].category-social { | |||||||
|       clear: both; |       clear: both; | ||||||
| 
 | 
 | ||||||
|       img { |       img { | ||||||
|         float: left; |         .ltr-float-left(); | ||||||
|         max-width: 10em; |         max-width: 10em; | ||||||
|         margin: 0.5em 0.5em 0.5em 0; |         margin-top: 0.5em; | ||||||
|  |         .ltr-margin-right(0.5em); | ||||||
|  |         margin-bottom: 0.5em; | ||||||
|  |         .ltr-margin-left(0); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @ -690,7 +696,7 @@ article[data-vim-selected].category-social { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     .engines { |     .engines { | ||||||
|       float: right; |       .ltr-float-right(); | ||||||
|       padding: 0 0 3px 0; |       padding: 0 0 3px 0; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @ -750,12 +756,12 @@ article[data-vim-selected].category-social { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   #backToTop { |   #backToTop { | ||||||
|     left: auto; |     .ltr-left(auto); | ||||||
|     right: 1rem; |     .ltr-right(1rem); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   #pagination { |   #pagination { | ||||||
|     margin-right: 4rem; |     .ltr-margin-right(4rem); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -767,12 +773,12 @@ article[data-vim-selected].category-social { | |||||||
| 
 | 
 | ||||||
|   #linkto_preferences { |   #linkto_preferences { | ||||||
|     top: 0.8rem; |     top: 0.8rem; | ||||||
|     right: 0.7rem; |     .ltr-right(0.7rem); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   #main_index #linkto_preferences { |   #main_index #linkto_preferences { | ||||||
|     top: 0.5rem; |     top: 0.5rem; | ||||||
|     right: 0.5rem; |     .ltr-right(0.5rem); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   #results { |   #results { | ||||||
|  | |||||||
| @ -125,11 +125,11 @@ div.selectable_url { | |||||||
|   padding: 1rem; |   padding: 1rem; | ||||||
|   margin: 0 0 1em 0; |   margin: 0 0 1em 0; | ||||||
|   border: 1px solid var(--color-toolkit-dialog-border); |   border: 1px solid var(--color-toolkit-dialog-border); | ||||||
|   text-align: left; |   .ltr-text-align-left(); | ||||||
|   .rounded-corners; |   .rounded-corners; | ||||||
| 
 | 
 | ||||||
|   .close { |   .close { | ||||||
|     float: right; |     .ltr-float-right(); | ||||||
|     position: relative; |     position: relative; | ||||||
|     top: -3px; |     top: -3px; | ||||||
|     color: inherit; |     color: inherit; | ||||||
| @ -156,6 +156,10 @@ div.selectable_url { | |||||||
| 
 | 
 | ||||||
|   td { |   td { | ||||||
|     padding: 0 1em 0 0; |     padding: 0 1em 0 0; | ||||||
|  |     padding-top: 0; | ||||||
|  |     .ltr-padding-right(1rem); | ||||||
|  |     padding-bottom: 0; | ||||||
|  |     .ltr-padding-left(0); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   h4 { |   h4 { | ||||||
| @ -301,7 +305,10 @@ html body .tabs > input:checked { | |||||||
| /* -- select -- */ | /* -- select -- */ | ||||||
| select { | select { | ||||||
|   height: 2.4rem; |   height: 2.4rem; | ||||||
|   margin: 0 1rem 0 0; |   margin-top: 0; | ||||||
|  |   .ltr-margin-right(1rem); | ||||||
|  |   margin-bottom: 0; | ||||||
|  |   .ltr-margin-left(0); | ||||||
|   padding: 0.2rem !important; |   padding: 0.2rem !important; | ||||||
|   color: var(--color-search-font); |   color: var(--color-search-font); | ||||||
|   font-size: 0.9rem; |   font-size: 0.9rem; | ||||||
|  | |||||||
| @ -1,102 +0,0 @@ | |||||||
| <div{% if rtl %} dir="ltr"{% endif %}> |  | ||||||
|   <h1>About <a href="{{ url_for('index') }}">searxng</a></h1> |  | ||||||
| 
 |  | ||||||
|   <p> |  | ||||||
|     SearXNG is a fork from the well-known <a href="https://github.com/searx/searx">searx</a> |  | ||||||
|     <a href="https://en.wikipedia.org/wiki/Metasearch_engine"> metasearch engine</a>, |  | ||||||
|     aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> |  | ||||||
|     while not storing information about its users. |  | ||||||
|   </p> |  | ||||||
| 
 |  | ||||||
|   <p>More about SearXNG ...</p> |  | ||||||
| 
 |  | ||||||
|   <ul> |  | ||||||
|     <li><a href="{{ searx_git_url }}">SearXNG sources</a></li> |  | ||||||
|     <li><a href="https://weblate.bubu1.eu/projects/searxng/">weblate</a></li> |  | ||||||
|   </ul> |  | ||||||
| 
 |  | ||||||
|   <hr /> |  | ||||||
| 
 |  | ||||||
|   <h2>Why use it?</h2> |  | ||||||
| 
 |  | ||||||
|   <ul> |  | ||||||
|     <li> |  | ||||||
|       SearXNG may not offer you as personalised results as Google, but it doesn't |  | ||||||
|       generate a profile about you. |  | ||||||
|     </li> |  | ||||||
|     <li> |  | ||||||
|       SearXNG doesn't care about what you search for, never shares anything with a |  | ||||||
|       third party, and it can't be used to compromise you. |  | ||||||
|     </li> |  | ||||||
|     <li> |  | ||||||
|       SearXNG is free software, the code is 100% open and you can help to make |  | ||||||
|       it better.  See more on <a href="{{ searx_git_url |  | ||||||
|       }}">SearXNG sources</a>. |  | ||||||
|     </li> |  | ||||||
|   </ul> |  | ||||||
| 
 |  | ||||||
|   <p> |  | ||||||
|     If you do care about privacy, want to be a conscious user, or otherwise |  | ||||||
|     believe in digital freedom, make SearXNG your default search engine or run |  | ||||||
|     it on your own server |  | ||||||
|   </p> |  | ||||||
| 
 |  | ||||||
|   <h2>Technical details - How does it work?</h2> |  | ||||||
| 
 |  | ||||||
|   <p> |  | ||||||
|     SearXNG is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, |  | ||||||
|     inspired by the <a href="https://beniz.github.io/seeks/">seeks project</a>. |  | ||||||
| 
 |  | ||||||
|     It provides basic privacy by mixing your queries with searches on other |  | ||||||
|     platforms without storing search data. Queries are made using a POST request |  | ||||||
|     on every browser (except Chromium-based browsers*).  Therefore they show up |  | ||||||
|     in neither our logs, nor your url history. In the case of Chromium-based |  | ||||||
|     browser users there is an exception: searx uses the search bar to perform GET |  | ||||||
|     requests. |  | ||||||
| 
 |  | ||||||
|     SearXNG can be added to your browser's search bar; moreover, it can be set as |  | ||||||
|     the default search engine. |  | ||||||
|   </p> |  | ||||||
| 
 |  | ||||||
|   <h2 id='add to browser'>How to set as the default search engine?</h2> |  | ||||||
| 
 |  | ||||||
|   <p> |  | ||||||
|     SearXNG supports <a href="https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md">OpenSearch</a>. |  | ||||||
|     For more information on changing your default search engine, see your browser's documentation: |  | ||||||
|   </p> |  | ||||||
| 
 |  | ||||||
|   <ul> |  | ||||||
|     <li><a href="https://support.mozilla.org/en-US/kb/add-or-remove-search-engine-firefox">Firefox</a></li> |  | ||||||
|     <li><a href="https://support.microsoft.com/en-us/help/4028574/microsoft-edge-change-the-default-search-engine">Microsoft Edge</a></li> |  | ||||||
|     <li>Chromium-based browsers <a href="https://www.chromium.org/tab-to-search">only add websites that the user navigates to without a path.</a> |  | ||||||
|   </ul> |  | ||||||
| 
 |  | ||||||
|   <h2>Where to find anonymous usage statistics of this instance ?</h2> |  | ||||||
| 
 |  | ||||||
|   <p> |  | ||||||
|     <a href="{{ url_for('stats') }}">Stats page</a> contains some useful data about the engines used. |  | ||||||
|   </p> |  | ||||||
| 
 |  | ||||||
|   <h2>How can I make it my own?</h2> |  | ||||||
| 
 |  | ||||||
|   <p> |  | ||||||
|     SearXNG appreciates your concern regarding logs, so take the code from |  | ||||||
|     the <a href="{{ searx_git_url }}">SearXNG project</a> and |  | ||||||
|     run it yourself! |  | ||||||
|   </p> |  | ||||||
|   <p> |  | ||||||
|     Add your instance to this <a href="{{ get_setting('brand.public_instances') }}"> list of |  | ||||||
|     public instances</a> to help other people reclaim their privacy and make the |  | ||||||
|     Internet freer!  The more decentralized the Internet is, the more freedom we |  | ||||||
|     have! |  | ||||||
|   </p> |  | ||||||
| 
 |  | ||||||
|   <h2>Where are the docs & code of this instance?</h2> |  | ||||||
| 
 |  | ||||||
|   <p> |  | ||||||
|     See the <a href="{{ get_setting('brand.docs_url') }}">SearXNG docs</a> |  | ||||||
|     and <a href="{{ searx_git_url }}">SearXNG sources</a> |  | ||||||
|   </p> |  | ||||||
| 
 |  | ||||||
| </div> |  | ||||||
| {% include "__common__/aboutextend.html" ignore missing %} |  | ||||||
| @ -1,5 +1,6 @@ | |||||||
| {% extends "oscar/base.html" %} | {% extends "oscar/base.html" %} | ||||||
| {% block title %}{{ _('about') }} - {% endblock %} | {% block title %}{{ _('about') }} - {% endblock %} | ||||||
| {% block content %} | {% block content %} | ||||||
| {% include '__common__/about.html' %} | {{ help.about | safe }} | ||||||
|  | {% include "__common__/aboutextend.html" ignore missing %} | ||||||
| {% endblock %} | {% endblock %} | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| {% extends 'simple/base.html' %} | {% extends 'simple/page_with_header.html' %} | ||||||
| {% block content %} | {% block content %} | ||||||
| {% include '__common__/about.html' %} | {{ help.about | safe }} | ||||||
|  | {% include "__common__/aboutextend.html" ignore missing %} | ||||||
| {% endblock %} | {% endblock %} | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ | |||||||
|   <link rel="icon" href="{{ url_for('static', filename='img/favicon.svg') }}" type="image/svg+xml"> |   <link rel="icon" href="{{ url_for('static', filename='img/favicon.svg') }}" type="image/svg+xml"> | ||||||
| </head> | </head> | ||||||
| <body class="{{ endpoint }}_endpoint" > | <body class="{{ endpoint }}_endpoint" > | ||||||
|   <main id="main_{{  self._TemplateReference__context.name|replace("simple/", "")|replace(".html", "") }}"> |   <main id="main_{{  self._TemplateReference__context.name|replace("simple/", "")|replace(".html", "") }}" class="{{body_class}}"> | ||||||
|     {% if errors %} |     {% if errors %} | ||||||
|         <div class="dialog-error" role="alert"> |         <div class="dialog-error" role="alert"> | ||||||
|             <a href="#" class="close" aria-label="close" title="close">×</a> |             <a href="#" class="close" aria-label="close" title="close">×</a> | ||||||
| @ -47,6 +47,12 @@ | |||||||
|         </div> |         </div> | ||||||
|     {% endif %} |     {% endif %} | ||||||
| 
 | 
 | ||||||
|  |     {% block linkto_preferences %} | ||||||
|  |     {% from 'simple/icons.html' import icon_big %} | ||||||
|  |       <nav id="linkto_preferences"><a href="{{ url_for('preferences') }}" aria-label="{{ _('preferences') }}">{{ icon_big('menu-outline') }}</a></nav> | ||||||
|  |     {% endblock %} | ||||||
|  |     {% block header %} | ||||||
|  |     {% endblock %} | ||||||
|     {% block content %} |     {% block content %} | ||||||
|     {% endblock %} |     {% endblock %} | ||||||
|   </main> |   </main> | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
|   'chevron-up-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M112 328l144-144 144 144"/></svg>', |   'chevron-up-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M112 328l144-144 144 144"/></svg>', | ||||||
|   'chevron-right':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M184 112l144 144-144 144"/></svg>', |   'chevron-right':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M184 112l144 144-144 144"/></svg>', | ||||||
|   'chevron-left':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M328 112L184 256l144 144"/></svg>', |   'chevron-left':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M328 112L184 256l144 144"/></svg>', | ||||||
|   'menu-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32" d="M80 160h352M80 256h352M80 352h352"/></svg>', |   'menu-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path d="M262.29 192.31a64 64 0 1057.4 57.4 64.13 64.13 0 00-57.4-57.4zM416.39 256a154.34 154.34 0 01-1.53 20.79l45.21 35.46a10.81 10.81 0 012.45 13.75l-42.77 74a10.81 10.81 0 01-13.14 4.59l-44.9-18.08a16.11 16.11 0 00-15.17 1.75A164.48 164.48 0 01325 400.8a15.94 15.94 0 00-8.82 12.14l-6.73 47.89a11.08 11.08 0 01-10.68 9.17h-85.54a11.11 11.11 0 01-10.69-8.87l-6.72-47.82a16.07 16.07 0 00-9-12.22 155.3 155.3 0 01-21.46-12.57 16 16 0 00-15.11-1.71l-44.89 18.07a10.81 10.81 0 01-13.14-4.58l-42.77-74a10.8 10.8 0 012.45-13.75l38.21-30a16.05 16.05 0 006-14.08c-.36-4.17-.58-8.33-.58-12.5s.21-8.27.58-12.35a16 16 0 00-6.07-13.94l-38.19-30A10.81 10.81 0 0149.48 186l42.77-74a10.81 10.81 0 0113.14-4.59l44.9 18.08a16.11 16.11 0 0015.17-1.75A164.48 164.48 0 01187 111.2a15.94 15.94 0 008.82-12.14l6.73-47.89A11.08 11.08 0 01213.23 42h85.54a11.11 11.11 0 0110.69 8.87l6.72 47.82a16.07 16.07 0 009 12.22 155.3 155.3 0 0121.46 12.57 16 16 0 0015.11 1.71l44.89-18.07a10.81 10.81 0 0113.14 4.58l42.77 74a10.8 10.8 0 01-2.45 13.75l-38.21 30a16.05 16.05 0 00-6.05 14.08c.33 4.14.55 8.3.55 12.47z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg>', | ||||||
|   'ellipsis-vertical-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><circle cx="256" cy="256" r="32" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><circle cx="256" cy="416" r="32" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><circle cx="256" cy="96" r="32" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/></svg>', |   'ellipsis-vertical-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><circle cx="256" cy="256" r="32" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><circle cx="256" cy="416" r="32" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><circle cx="256" cy="96" r="32" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/></svg>', | ||||||
|   'magnet-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path d="M421.83 293.82A144 144 0 00218.18 90.17M353.94 225.94a48 48 0 00-67.88-67.88" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32" d="M192 464v-48M90.18 421.82l33.94-33.94M48 320h48"/><path d="M286.06 158.06L172.92 271.19a32 32 0 01-45.25 0L105 248.57a32 32 0 010-45.26L218.18 90.17M421.83 293.82L308.69 407a32 32 0 01-45.26 0l-22.62-22.63a32 32 0 010-45.26l113.13-113.17M139.6 169.98l67.88 67.89M275.36 305.75l67.89 67.88" fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="32"/></svg>', |   'magnet-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path d="M421.83 293.82A144 144 0 00218.18 90.17M353.94 225.94a48 48 0 00-67.88-67.88" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32" d="M192 464v-48M90.18 421.82l33.94-33.94M48 320h48"/><path d="M286.06 158.06L172.92 271.19a32 32 0 01-45.25 0L105 248.57a32 32 0 010-45.26L218.18 90.17M421.83 293.82L308.69 407a32 32 0 01-45.26 0l-22.62-22.63a32 32 0 010-45.26l113.13-113.17M139.6 169.98l67.88 67.89M275.36 305.75l67.89 67.88" fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="32"/></svg>', | ||||||
|   'globe-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path d="M256 48C141.13 48 48 141.13 48 256s93.13 208 208 208 208-93.13 208-208S370.87 48 256 48z" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><path d="M256 48c-58.07 0-112.67 93.13-112.67 208S197.93 464 256 464s112.67-93.13 112.67-208S314.07 48 256 48z" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><path d="M117.33 117.33c38.24 27.15 86.38 43.34 138.67 43.34s100.43-16.19 138.67-43.34M394.67 394.67c-38.24-27.15-86.38-43.34-138.67-43.34s-100.43 16.19-138.67 43.34" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><path fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32" d="M256 48v416M464 256H48"/></svg>', |   'globe-outline':'<svg class="ionicon" viewBox="0 0 512 512" aria-hidden="true"><path d="M256 48C141.13 48 48 141.13 48 256s93.13 208 208 208 208-93.13 208-208S370.87 48 256 48z" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><path d="M256 48c-58.07 0-112.67 93.13-112.67 208S197.93 464 256 464s112.67-93.13 112.67-208S314.07 48 256 48z" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><path d="M117.33 117.33c38.24 27.15 86.38 43.34 138.67 43.34s100.43-16.19 138.67-43.34M394.67 394.67c-38.24-27.15-86.38-43.34-138.67-43.34s-100.43 16.19-138.67 43.34" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><path fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32" d="M256 48v416M464 256H48"/></svg>', | ||||||
|  | |||||||
| @ -4,7 +4,6 @@ | |||||||
| 	<link rel="preload" href="{{ url_for('static', filename='img/searxng.png') }}" as="image" /> | 	<link rel="preload" href="{{ url_for('static', filename='img/searxng.png') }}" as="image" /> | ||||||
| {% endblock %} | {% endblock %} | ||||||
| {% block content %} | {% block content %} | ||||||
| <nav id="linkto_preferences"><a href="{{ url_for('preferences') }}">{{ icon_big('menu-outline') }}</a></nav> |  | ||||||
| <div class="index"> | <div class="index"> | ||||||
|     <div class="title"><h1>SearXNG</h1></div> |     <div class="title"><h1>SearXNG</h1></div> | ||||||
|     {% include 'simple/simple_search.html' %} |     {% include 'simple/simple_search.html' %} | ||||||
|  | |||||||
| @ -1,3 +1,5 @@ | |||||||
|  | {% from 'simple/icons.html' import icon_small %} | ||||||
|  | 
 | ||||||
| <!-- Draw favicon --> | <!-- Draw favicon --> | ||||||
| {% macro draw_favicon(favicon) -%} | {% macro draw_favicon(favicon) -%} | ||||||
|     <img width="14" height="14" class="favicon" src="{{ url_for('static', filename='themes/simple/img/icons/' + favicon + '.png') }}" alt="{{ favicon }}"> |     <img width="14" height="14" class="favicon" src="{{ url_for('static', filename='themes/simple/img/icons/' + favicon + '.png') }}" alt="{{ favicon }}"> | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								searx/templates/simple/page_with_header.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								searx/templates/simple/page_with_header.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | {% set body_class = "page_with_header" %} | ||||||
|  | {% extends "simple/base.html" %} | ||||||
|  | {% block header %} | ||||||
|  | <a href="{{ url_for('index') }}"><img class="logo" src="{{ url_for('static', filename='img/searxng.png') }}" alt="SearXNG"></a> | ||||||
|  | {% endblock %} | ||||||
| @ -1,7 +1,7 @@ | |||||||
| {% from 'simple/macros.html' import tabs_open, tabs_close, tab_header, tab_footer, checkbox_onoff, checkbox %} | {% from 'simple/macros.html' import tabs_open, tabs_close, tab_header, tab_footer, checkbox_onoff, checkbox %} | ||||||
| {% from 'simple/icons.html' import icon_big %} | {% from 'simple/icons.html' import icon_big %} | ||||||
| 
 | 
 | ||||||
| {% extends "simple/base.html" %} | {% extends "simple/page_with_header.html" %} | ||||||
| 
 | 
 | ||||||
| {%- macro plugin_preferences(section) -%} | {%- macro plugin_preferences(section) -%} | ||||||
| {%- for plugin in plugins -%} | {%- for plugin in plugins -%} | ||||||
| @ -94,11 +94,9 @@ | |||||||
| {%- endmacro -%} | {%- endmacro -%} | ||||||
| 
 | 
 | ||||||
| {% block head %} {% endblock %} | {% block head %} {% endblock %} | ||||||
|  | {% block linkto_preferences %}{% endblock %} | ||||||
| {% block content %} | {% block content %} | ||||||
| 
 | <h1>{{ _('Preferences') }}</h1> | ||||||
| <a href="{{ url_for('index') }}"><h1><span>SearXNG</span></h1></a> |  | ||||||
| 
 |  | ||||||
| <h2>{{ _('Preferences') }}</h2> |  | ||||||
| 
 | 
 | ||||||
| <form id="search_form" method="post" action="{{ url_for('preferences') }}"> | <form id="search_form" method="post" action="{{ url_for('preferences') }}"> | ||||||
| 
 | 
 | ||||||
| @ -401,9 +399,9 @@ | |||||||
|     {{ _("These cookies serve your sole convenience, we don't use these cookies to track you.") }} |     {{ _("These cookies serve your sole convenience, we don't use these cookies to track you.") }} | ||||||
|   </p> |   </p> | ||||||
| 
 | 
 | ||||||
|   <input type="submit" value="{{ _('save') }}" /> |   <input type="submit" value="{{ _('Save') }}" /> | ||||||
|   <div class="{% if rtl %}left{% else %}right{% endif %} preferences_back"><a href="{{ url_for('clear_cookies') }}">{{ _('Reset defaults') }}</a></div> |   <div class="{% if rtl %}left{% else %}right{% endif %} preferences_back"><a href="{{ url_for('clear_cookies') }}">{{ _('Reset defaults') }}</a></div> | ||||||
|   <div class="{% if rtl %}left{% else %}right{% endif %} preferences_back"><a href="{{ url_for('index') }}">{{ _('back') }}</a></div> |   <div class="{% if rtl %}left{% else %}right{% endif %} preferences_back"><a href="{{ url_for('index') }}">{{ _('Back') }}</a></div> | ||||||
| 
 | 
 | ||||||
| </form> | </form> | ||||||
| {% endblock %} | {% endblock %} | ||||||
|  | |||||||
| @ -10,7 +10,6 @@ | |||||||
| {% block title %}{% if query_in_title %}{{- q|e }} - {% endif %}{% endblock %} | {% block title %}{% if query_in_title %}{{- q|e }} - {% endif %}{% endblock %} | ||||||
| {% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('search', _external=True) }}?q={{ q|urlencode }}&categories={{ selected_categories|join(",") | replace(' ','+') }}&pageno={{ pageno }}&time_range={{ time_range }}&language={{ current_language }}&safesearch={{ safesearch }}&format=rss">{% endblock %} | {% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('search', _external=True) }}?q={{ q|urlencode }}&categories={{ selected_categories|join(",") | replace(' ','+') }}&pageno={{ pageno }}&time_range={{ time_range }}&language={{ current_language }}&safesearch={{ safesearch }}&format=rss">{% endblock %} | ||||||
| {% block content %} | {% block content %} | ||||||
| <nav id="linkto_preferences"><a href="{{ url_for('preferences') }}">{{ icon_big('menu-outline') }}</a></nav> |  | ||||||
| {% include 'simple/search.html' %} | {% include 'simple/search.html' %} | ||||||
| 
 | 
 | ||||||
| {% if results and results|map(attribute='template')|unique|list|count == 1 %} | {% if results and results|map(attribute='template')|unique|list|count == 1 %} | ||||||
| @ -162,7 +161,7 @@ | |||||||
|                   <input type="hidden" name="safesearch" value="{{ safesearch }}" > |                   <input type="hidden" name="safesearch" value="{{ safesearch }}" > | ||||||
|                   <input type="hidden" name="theme" value="{{ theme }}" > |                   <input type="hidden" name="theme" value="{{ theme }}" > | ||||||
|                   {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %} |                   {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %} | ||||||
|                   <button type="submit">{{ icon_small('chevron-left') }} {{ _('previous page') }}</button> |                   <button type="submit">{{ icon_small('chevron-left') }} {{ _('Previous page') }}</button> | ||||||
|                 </div> |                 </div> | ||||||
|             </form> |             </form> | ||||||
|         {% endif %} |         {% endif %} | ||||||
| @ -179,7 +178,7 @@ | |||||||
|               <input type="hidden" name="safesearch" value="{{ safesearch }}" > |               <input type="hidden" name="safesearch" value="{{ safesearch }}" > | ||||||
|               <input type="hidden" name="theme" value="{{ theme }}" > |               <input type="hidden" name="theme" value="{{ theme }}" > | ||||||
|               {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %} |               {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %} | ||||||
|               <button type="submit">{{ _('next page') }} {{ icon_small('chevron-right') }}</button> |               <button type="submit">{{ _('Next page') }} {{ icon_small('chevron-right') }}</button> | ||||||
|             </div> |             </div> | ||||||
|         </form> |         </form> | ||||||
|     </nav> |     </nav> | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| {% from 'simple/icons.html' import icon_big %} | {% from 'simple/icons.html' import icon_big %} | ||||||
| {% from '__common__/new_issue.html' import new_issue with context %} | {% from '__common__/new_issue.html' import new_issue with context %} | ||||||
| 
 | 
 | ||||||
| {% extends "simple/base.html" %} | {% extends "simple/page_with_header.html" %} | ||||||
| 
 | 
 | ||||||
| {%- macro th_sort(column_order, column_name) -%} | {%- macro th_sort(column_order, column_name) -%} | ||||||
|     {% if selected_engine_name %} |     {% if selected_engine_name %} | ||||||
| @ -15,10 +15,7 @@ | |||||||
| 
 | 
 | ||||||
| {% block head %} {% endblock %} | {% block head %} {% endblock %} | ||||||
| {% block content %} | {% block content %} | ||||||
| 
 | <h1>{% if selected_engine_name %}<a href="{{ url_for('stats') }}">{% endif %}{{ _('Engine stats') }}{% if selected_engine_name %}</a> - {{ selected_engine_name }}{% endif %}</h1> | ||||||
| <a href="{{ url_for('index') }}"><h1><span>SearXNG</span></h1></a> |  | ||||||
| 
 |  | ||||||
| <h2>{% if selected_engine_name %}<a href="{{ url_for('stats') }}">{% endif %}{{ _('Engine stats') }}{% if selected_engine_name %}</a> - {{ selected_engine_name }}{% endif %}</h2> |  | ||||||
| 
 | 
 | ||||||
| {% if not engine_stats.get('time') %} | {% if not engine_stats.get('time') %} | ||||||
| {{ _('There is currently no data available. ') }} | {{ _('There is currently no data available. ') }} | ||||||
|  | |||||||
										
											Binary file not shown.
										
									
								
							| @ -10,185 +10,186 @@ 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-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+0000\n" | ||||||
| "PO-Revision-Date: 2021-12-31 07:17+0000\n" | "PO-Revision-Date: 2022-01-28 07:16+0000\n" | ||||||
| "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" | "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\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.10.1\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "ملفات" | msgstr "ملفات" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "الرئيسية" | msgstr "الرئيسية" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "موسيقى" | msgstr "موسيقى" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "شبكات التواصل الإجتماعي" | msgstr "شبكات التواصل الإجتماعي" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "صور" | msgstr "صور" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "فيديوهات" | msgstr "فيديوهات" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "علوم و تكنولوجيا" | msgstr "علوم و تكنولوجيا" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "أخبار" | msgstr "أخبار" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "خرائط" | msgstr "خرائط" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "onions" | msgstr "onions" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "علوم" | msgstr "علوم" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "تلقائي" | msgstr "تلقائي" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "فاتح" | msgstr "فاتح" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "مظلم" | msgstr "مظلم" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "نفذ الوقت" | msgstr "نفذ الوقت" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "خطأ في بروتوكول HTTP" | msgstr "خطأ في بروتوكول HTTP" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "خطأ في الشبكة" | msgstr "خطأ في الشبكة" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "تعطل غير متوقع" | msgstr "تعطل غير متوقع" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "خطأ HTTP" | msgstr "خطأ HTTP" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "خطأ في اتصال HTTP" | msgstr "خطأ في اتصال HTTP" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "خطأ في وكيل البروكسي" | msgstr "خطأ في وكيل البروكسي" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "الكثير من الطلبات" | msgstr "الكثير من الطلبات" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "خطأ في API الخادم" | msgstr "خطأ في API الخادم" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| msgid "No item found" | msgid "No item found" | ||||||
| msgstr "تعذر العثور على عناصر" | msgstr "تعذر العثور على عناصر" | ||||||
| 
 | 
 | ||||||
| #: searx/engines/qwant.py:212 | #: searx/engines/qwant.py:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "المصدر" | msgstr "المصدر" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| msgid "Invalid settings, please edit your preferences" | msgid "Invalid settings, please edit your preferences" | ||||||
| msgstr "إنّ الإعدادات خاطئة، يرجى تعديل خياراتك" | msgstr "إنّ الإعدادات خاطئة، يرجى تعديل خياراتك" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "إعدادات غير صالحة" | msgstr "إعدادات غير صالحة" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "خطأ في البحث" | msgstr "خطأ في البحث" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "قبل دقائق" | msgstr "قبل دقائق" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| 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:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "معلق" | msgstr "معلق" | ||||||
| 
 | 
 | ||||||
| @ -389,13 +390,13 @@ msgstr "ملف تورنت" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "النسخة المخبأة" | msgstr "النسخة المخبأة" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "النفاذ عبر البروكسي" | msgstr "النفاذ عبر البروكسي" | ||||||
| 
 | 
 | ||||||
| @ -523,7 +524,6 @@ msgstr "القوائم الإفتراضية" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "لغة البحث" | msgstr "لغة البحث" | ||||||
| 
 | 
 | ||||||
| @ -611,12 +611,12 @@ msgstr "يقوم بتغيير لغة واجهة البحث" | |||||||
| #: searx/templates/oscar/preferences.html:210 | #: searx/templates/oscar/preferences.html:210 | ||||||
| #: searx/templates/simple/preferences.html:197 | #: searx/templates/simple/preferences.html:197 | ||||||
| msgid "Theme" | msgid "Theme" | ||||||
| msgstr "" | msgstr "السمة" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:211 | #: searx/templates/oscar/preferences.html:211 | ||||||
| #: searx/templates/simple/preferences.html:205 | #: searx/templates/simple/preferences.html:205 | ||||||
| msgid "Change SearXNG layout" | msgid "Change SearXNG layout" | ||||||
| msgstr "" | msgstr "تغيير مظهر سيركس" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:222 | #: searx/templates/oscar/preferences.html:222 | ||||||
| #: searx/templates/oscar/preferences.html:228 | #: searx/templates/oscar/preferences.html:228 | ||||||
| @ -660,10 +660,11 @@ msgstr "عرض روابط نتائج البحث في ألسنة جديدة لل | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "الطريقة" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -678,7 +679,7 @@ msgstr "وكيل بروكسي الصور" | |||||||
| #: searx/templates/oscar/preferences.html:274 | #: searx/templates/oscar/preferences.html:274 | ||||||
| #: searx/templates/simple/preferences.html:256 | #: searx/templates/simple/preferences.html:256 | ||||||
| msgid "Proxying image results through SearXNG" | msgid "Proxying image results through SearXNG" | ||||||
| msgstr "" | msgstr "تمرير نتائج البحث عن الصور عبر بروكسي SearXNG" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:277 | #: searx/templates/oscar/preferences.html:277 | ||||||
| #: searx/templates/oscar/preferences.html:288 | #: searx/templates/oscar/preferences.html:288 | ||||||
| @ -717,7 +718,7 @@ msgstr "تعطيل الكل" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| 
 | 
 | ||||||
| @ -852,12 +853,10 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "حفظ" | msgstr "حفظ" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "العودة" | msgstr "العودة" | ||||||
| 
 | 
 | ||||||
| @ -901,13 +900,11 @@ msgstr "حاول البحث عن :" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "الصفحة التالية" | msgstr "الصفحة التالية" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "الصفحة السابقة" | msgstr "الصفحة السابقة" | ||||||
| 
 | 
 | ||||||
| @ -986,7 +983,7 @@ msgstr "" | |||||||
| #: searx/templates/oscar/result_templates/files.html:35 | #: searx/templates/oscar/result_templates/files.html:35 | ||||||
| #: searx/templates/oscar/stats.html:126 searx/templates/simple/stats.html:125 | #: searx/templates/oscar/stats.html:126 searx/templates/simple/stats.html:125 | ||||||
| msgid "Filename" | msgid "Filename" | ||||||
| msgstr "" | msgstr "اسم الملف" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/stats.html:127 searx/templates/simple/stats.html:126 | #: searx/templates/oscar/stats.html:127 searx/templates/simple/stats.html:126 | ||||||
| msgid "Function" | msgid "Function" | ||||||
| @ -1040,7 +1037,7 @@ msgstr "" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/messages/first_time.html:7 | #: searx/templates/oscar/messages/first_time.html:7 | ||||||
| msgid "It look like you are using SearXNG first time." | msgid "It look like you are using SearXNG first time." | ||||||
| msgstr "" | msgstr "يظهر أنك تستخدم محرك سيركس لأول مرة." | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/messages/no_cookies.html:3 | #: searx/templates/oscar/messages/no_cookies.html:3 | ||||||
| msgid "Information!" | msgid "Information!" | ||||||
| @ -1064,6 +1061,8 @@ msgstr "لم تتمكن المحركات من العثور على أية نتي | |||||||
| #: searx/templates/simple/messages/no_results.html:15 | #: searx/templates/simple/messages/no_results.html:15 | ||||||
| msgid "Please, try again later or find another SearXNG instance." | msgid "Please, try again later or find another SearXNG instance." | ||||||
| msgstr "" | msgstr "" | ||||||
|  | "يرجى إعادة المحاولة لاحقًا. إن كنت في عجلة من أمرك، ندعوك إلى البحث عن مثيل " | ||||||
|  | "خادم آخر لمحرك سيركس." | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/messages/no_results.html:17 | #: searx/templates/oscar/messages/no_results.html:17 | ||||||
| #: searx/templates/simple/messages/no_results.html:20 | #: searx/templates/simple/messages/no_results.html:20 | ||||||
| @ -1239,10 +1238,26 @@ msgstr "محركات البحث المُستخدَمة حاليًا" | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "يدعم اللغة المختارة" | msgstr "يدعم اللغة المختارة" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "حفظ" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "الخلف" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "الإجابات" | msgstr "الإجابات" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "الصفحة السابقة" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "الصفحة التالية" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1379,3 +1394,11 @@ msgstr "محرك" | |||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "الطريقة" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ 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-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+0000\n" | ||||||
| "PO-Revision-Date: 2021-12-10 07:17+0000\n" | "PO-Revision-Date: 2021-12-10 07:17+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" | ||||||
| @ -21,172 +21,172 @@ msgstr "" | |||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "файлове" | msgstr "файлове" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "общо" | msgstr "общо" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "музика" | msgstr "музика" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "социална мрежа" | msgstr "социална мрежа" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "изображения" | msgstr "изображения" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "видео" | msgstr "видео" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "IT" | msgstr "IT" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "новини" | msgstr "новини" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "карта" | msgstr "карта" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "onions" | msgstr "onions" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "наука" | msgstr "наука" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "автоматичен" | msgstr "автоматичен" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "светъл" | msgstr "светъл" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "тъмен" | msgstr "тъмен" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "изчакване" | msgstr "изчакване" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "грешка при анализа" | msgstr "грешка при анализа" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "Грешка в протокола HTTP" | msgstr "Грешка в протокола HTTP" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "мрежова грешка" | msgstr "мрежова грешка" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "неочакван срив" | msgstr "неочакван срив" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "HTTP грешка" | msgstr "HTTP грешка" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "HTTP грешка във връзката" | msgstr "HTTP грешка във връзката" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "прокси грешка" | msgstr "прокси грешка" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "Кепча" | msgstr "Кепча" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "твърде много искания" | msgstr "твърде много искания" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "отказан достъп" | msgstr "отказан достъп" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "грешка в API на сървъра" | msgstr "грешка в API на сървъра" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| msgid "No item found" | msgid "No item found" | ||||||
| msgstr "Не е намерен артикул" | msgstr "Не е намерен артикул" | ||||||
| 
 | 
 | ||||||
| #: searx/engines/qwant.py:212 | #: searx/engines/qwant.py:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "Източник" | msgstr "Източник" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| msgid "Invalid settings, please edit your preferences" | msgid "Invalid settings, please edit your preferences" | ||||||
| msgstr "Неправилни настройки, моля проверете предпочитанията си." | msgstr "Неправилни настройки, моля проверете предпочитанията си." | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "невалидни настройки" | msgstr "невалидни настройки" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "грешка при търсенето" | msgstr "грешка при търсенето" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "преди {minutes} минута(минути)" | msgstr "преди {minutes} минута(минути)" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| 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:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "преустановен" | msgstr "преустановен" | ||||||
| 
 | 
 | ||||||
| @ -396,13 +396,13 @@ msgstr "торент файл" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "кеширана" | msgstr "кеширана" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -530,7 +530,6 @@ msgstr "Първоначални категории" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "Език на търсене" | msgstr "Език на търсене" | ||||||
| 
 | 
 | ||||||
| @ -667,10 +666,11 @@ msgstr "Отвори връзките в нов раздел." | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "Метод" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -724,7 +724,7 @@ msgstr "" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| 
 | 
 | ||||||
| @ -863,12 +863,10 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "запази" | msgstr "запази" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "назад" | msgstr "назад" | ||||||
| 
 | 
 | ||||||
| @ -912,13 +910,11 @@ msgstr "" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "следваща страница" | msgstr "следваща страница" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "предишна страница" | msgstr "предишна страница" | ||||||
| 
 | 
 | ||||||
| @ -1250,10 +1246,26 @@ msgstr "Използвани търсачки в момента" | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "Поддържка на избраният език" | msgstr "Поддържка на избраният език" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "Отговори" | msgstr "Отговори" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1390,3 +1402,12 @@ msgstr "Търсачка" | |||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "Метод" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ 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-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+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" | ||||||
| @ -21,172 +21,172 @@ msgstr "" | |||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "ཡིག་ཚགས།" | msgstr "ཡིག་ཚགས།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "དྲ་སྦྲེལ།" | msgstr "དྲ་སྦྲེལ།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "རོལ་མོ།" | msgstr "རོལ་མོ།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "སྤྱི་འབྲེལ།" | msgstr "སྤྱི་འབྲེལ།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "པར་རིས།" | msgstr "པར་རིས།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "བརྙན་ཟློས།" | msgstr "བརྙན་ཟློས།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "ཆ་འཕྲིན་ལག་རྩལ།" | msgstr "ཆ་འཕྲིན་ལག་རྩལ།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "གསར་འགྱུར།" | msgstr "གསར་འགྱུར།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "ས་བཀྲ།" | msgstr "ས་བཀྲ།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "ཚན་རིག" | msgstr "ཚན་རིག" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| msgid "No item found" | msgid "No item found" | ||||||
| msgstr "རྣམ་གྲངས་གང་ཡང་རྙེད་རྒྱུ་མ་བྱུང་།" | msgstr "རྣམ་གྲངས་གང་ཡང་རྙེད་རྒྱུ་མ་བྱུང་།" | ||||||
| 
 | 
 | ||||||
| #: searx/engines/qwant.py:212 | #: searx/engines/qwant.py:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| msgid "Invalid settings, please edit your preferences" | msgid "Invalid settings, please edit your preferences" | ||||||
| msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།ཁྱེད་ཀྱིས་གདམ་ཀ་ལ་བཅོས་སྒྲིག་གཏོང་རོགས།" | msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།ཁྱེད་ཀྱིས་གདམ་ཀ་ལ་བཅོས་སྒྲིག་གཏོང་རོགས།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།" | msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "འཚོལ་བཤེར་ལ་ནོར་འཁྲུལ་བྱུང་།" | msgstr "འཚོལ་བཤེར་ལ་ནོར་འཁྲུལ་བྱུང་།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "སྐར་མ་ {minutes} སྔོན་ལ།" | msgstr "སྐར་མ་ {minutes} སྔོན་ལ།" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| 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:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -391,13 +391,13 @@ msgstr "ས་བོན་ཡིག་ཆ།" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "འདྲ་བཤུས་རྒྱབ་ཚར།" | msgstr "འདྲ་བཤུས་རྒྱབ་ཚར།" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "མངག་བཅོལ་བྱེད་ཟིན།" | msgstr "མངག་བཅོལ་བྱེད་ཟིན།" | ||||||
| 
 | 
 | ||||||
| @ -525,7 +525,6 @@ msgstr "གཞི་བཞག་གི་རིགས།" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "འཚོལ་བཤེར་ནང་དོན་མཚོན་བྱེད་ཀྱི་སྐད་རིགས།" | msgstr "འཚོལ་བཤེར་ནང་དོན་མཚོན་བྱེད་ཀྱི་སྐད་རིགས།" | ||||||
| 
 | 
 | ||||||
| @ -662,10 +661,11 @@ msgstr "ཤོག་ངོས་གསར་བ་ཞིག་ནས་དྲ་ | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "ཐབས་ཤེས།" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -719,7 +719,7 @@ msgstr "" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| 
 | 
 | ||||||
| @ -854,12 +854,10 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "གསོག་འཇོག" | msgstr "གསོག་འཇོག" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "ཕྱིར་ལོག" | msgstr "ཕྱིར་ལོག" | ||||||
| 
 | 
 | ||||||
| @ -903,13 +901,11 @@ msgstr "འཚོལ་བཤེར་ནང་དོན་ནི།" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "དྲ་ངོས་གཞུག་མ།" | msgstr "དྲ་ངོས་གཞུག་མ།" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "དྲ་ངོས་སྔོན་མ།" | msgstr "དྲ་ངོས་སྔོན་མ།" | ||||||
| 
 | 
 | ||||||
| @ -1241,10 +1237,26 @@ msgstr "ཉེ་ལམ་སྤྱད་ཟིན་པའི་འཚོལ་ | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "རྒྱབ་སྐྱོར་ཐོབ་པའི་སྐད་རིགས་གདམ་གསེས།" | msgstr "རྒྱབ་སྐྱོར་ཐོབ་པའི་སྐད་རིགས་གདམ་གསེས།" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "ལན།" | msgstr "ལན།" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1385,3 +1397,12 @@ msgstr "" | |||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "ཐབས་ཤེས།" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ msgstr "" | ||||||
|  | 
 | ||||||
|  | |||||||
										
											Binary file not shown.
										
									
								
							| @ -10,7 +10,7 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version:  searx\n" | "Project-Id-Version:  searx\n" | ||||||
| "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" | ||||||
| "POT-Creation-Date: 2022-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+0000\n" | ||||||
| "PO-Revision-Date: 2021-11-03 08:06+0000\n" | "PO-Revision-Date: 2021-11-03 08:06+0000\n" | ||||||
| "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" | "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" | ||||||
| "Language: ca\n" | "Language: ca\n" | ||||||
| @ -22,172 +22,172 @@ msgstr "" | |||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "fitxers" | msgstr "fitxers" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "general" | msgstr "general" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "música" | msgstr "música" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "xarxes socials" | msgstr "xarxes socials" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "imatges" | msgstr "imatges" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "vídeos" | msgstr "vídeos" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "informàtica" | msgstr "informàtica" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "notícies" | msgstr "notícies" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "mapa" | msgstr "mapa" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "ciència" | msgstr "ciència" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| 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:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| 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:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "La configuració no és vàlida" | msgstr "La configuració no és vàlida" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "error en la cerca" | msgstr "error en la cerca" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "fa {minutes} minuts" | msgstr "fa {minutes} minuts" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| 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:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -399,13 +399,13 @@ msgstr "fitxer torrent" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "en memòria cau" | msgstr "en memòria cau" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "en servidor intermediari" | msgstr "en servidor intermediari" | ||||||
| 
 | 
 | ||||||
| @ -533,7 +533,6 @@ msgstr "Categories predeterminades" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "Llengua de cerca" | msgstr "Llengua de cerca" | ||||||
| 
 | 
 | ||||||
| @ -672,10 +671,11 @@ msgstr "Obre els enllaços de resultats en una pestanya nova" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "Mètode" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -732,7 +732,7 @@ msgstr "" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| 
 | 
 | ||||||
| @ -874,12 +874,10 @@ msgstr "" | |||||||
| "resultats." | "resultats." | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "desa" | msgstr "desa" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "enrere" | msgstr "enrere" | ||||||
| 
 | 
 | ||||||
| @ -923,13 +921,11 @@ msgstr "Proveu a cercar:" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "pàgina següent" | msgstr "pàgina següent" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "pàgina anterior" | msgstr "pàgina anterior" | ||||||
| 
 | 
 | ||||||
| @ -1261,10 +1257,26 @@ msgstr "Motors de cerca usats actualment" | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "Suporta la llengua seleccionada" | msgstr "Suporta la llengua seleccionada" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "Respostes" | msgstr "Respostes" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1408,3 +1420,12 @@ msgstr "" | |||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "Mètode" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ msgstr "" | ||||||
|  | 
 | ||||||
|  | |||||||
										
											Binary file not shown.
										
									
								
							| @ -11,8 +11,8 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version:  searx\n" | "Project-Id-Version:  searx\n" | ||||||
| "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" | ||||||
| "POT-Creation-Date: 2022-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+0000\n" | ||||||
| "PO-Revision-Date: 2021-12-31 07:17+0000\n" | "PO-Revision-Date: 2022-01-23 20:00+0000\n" | ||||||
| "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" | "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" | ||||||
| "Language: cs\n" | "Language: cs\n" | ||||||
| "Language-Team: Czech " | "Language-Team: Czech " | ||||||
| @ -24,172 +24,172 @@ msgstr "" | |||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "soubory" | msgstr "soubory" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "obecné" | msgstr "obecné" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "hudba" | msgstr "hudba" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "sociální media" | msgstr "sociální media" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "obrázky" | msgstr "obrázky" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "videa" | msgstr "videa" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "IT" | msgstr "IT" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "zprávy" | msgstr "zprávy" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "mapa" | msgstr "mapa" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "cibule" | msgstr "cibule" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "věda" | msgstr "věda" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "" | msgstr "aplikace" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "světlý" | msgstr "světlý" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "tmavý" | msgstr "tmavý" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "chyba HTTP protokolu" | msgstr "chyba HTTP protokolu" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "síťová chyba" | msgstr "síťová chyba" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "nečekaná chyba" | msgstr "nečekaná chyba" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "chyba HTTP" | msgstr "chyba HTTP" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "přístup odepřen" | msgstr "přístup odepřen" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| msgid "No item found" | msgid "No item found" | ||||||
| msgstr "Nic nenalezeno" | msgstr "Nic nenalezeno" | ||||||
| 
 | 
 | ||||||
| #: searx/engines/qwant.py:212 | #: searx/engines/qwant.py:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "zdroj" | msgstr "zdroj" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| 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:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "Neplatné nastavení" | msgstr "Neplatné nastavení" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "chyba vyhledávání" | msgstr "chyba vyhledávání" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "před {minutes} minutami" | msgstr "před {minutes} minutami" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| 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:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -399,13 +399,13 @@ msgstr "soubor torrentu" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "archivovaná verze" | msgstr "archivovaná verze" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "přes proxy" | msgstr "přes proxy" | ||||||
| 
 | 
 | ||||||
| @ -533,7 +533,6 @@ msgstr "Základní kategorie" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "Jazyk hledání" | msgstr "Jazyk hledání" | ||||||
| 
 | 
 | ||||||
| @ -672,10 +671,11 @@ msgstr "Otevírat výsledky na novém panelu prohlížeče" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "Dotazovací metoda" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -732,7 +732,7 @@ msgstr "Zakázat vše" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| 
 | 
 | ||||||
| @ -873,12 +873,10 @@ msgstr "" | |||||||
| "prozrazením dat při kliknutí na výsledky hledání." | "prozrazením dat při kliknutí na výsledky hledání." | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "uložit" | msgstr "uložit" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "zpět" | msgstr "zpět" | ||||||
| 
 | 
 | ||||||
| @ -922,13 +920,11 @@ msgstr "Zkuste vyhledat:" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "další stránka" | msgstr "další stránka" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "předchozí stránka" | msgstr "předchozí stránka" | ||||||
| 
 | 
 | ||||||
| @ -1260,10 +1256,26 @@ msgstr "Aktuálně používané vyhledávače" | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "Podporuje vybraný jazyk" | msgstr "Podporuje vybraný jazyk" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "Odpovědi" | msgstr "Odpovědi" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1406,3 +1418,12 @@ msgstr "" | |||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "Dotazovací metoda" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ msgstr "" | ||||||
|  | 
 | ||||||
|  | |||||||
										
											Binary file not shown.
										
									
								
							| @ -8,12 +8,12 @@ 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-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+0000\n" | ||||||
| "PO-Revision-Date: 2020-07-09 13:10+0000\n" | "PO-Revision-Date: 2022-01-19 22:16+0000\n" | ||||||
| "Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" | "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" | ||||||
| "Language: cy\n" | "Language: cy\n" | ||||||
| "Language-Team: Welsh " | "Language-Team: Welsh " | ||||||
| "(http://www.transifex.com/asciimoo/searx/language/cy/)\n" | "<https://weblate.bubu1.eu/projects/searxng/searxng/cy/>\n" | ||||||
| "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n " | "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n " | ||||||
| "!= 11) ? 2 : 3\n" | "!= 11) ? 2 : 3\n" | ||||||
| "MIME-Version: 1.0\n" | "MIME-Version: 1.0\n" | ||||||
| @ -21,172 +21,172 @@ msgstr "" | |||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "ffeiliau" | msgstr "ffeiliau" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "cyffredinol" | msgstr "cyffredinol" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "cerddoriaeth" | msgstr "cerddoriaeth" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "cyfryngau cymdeithasol" | msgstr "cyfryngau cymdeithasol" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "delweddau" | msgstr "delweddau" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "fideos" | msgstr "fideos" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "Technoleg" | msgstr "Technoleg" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "newyddion" | msgstr "newyddion" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "map" | msgstr "map" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "" | msgstr "winwns" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "gwyddoniaeth" | msgstr "gwyddoniaeth" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "" | msgstr "tywyll" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "" | msgstr "gwall dosrannu" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| 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:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| 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:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "Gosodiadau annilys" | msgstr "Gosodiadau annilys" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "gwall chwilio" | msgstr "gwall chwilio" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "{minutes} munud yn ôl" | msgstr "{minutes} munud yn ôl" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| 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:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -387,13 +387,13 @@ msgstr "ffeil torrent" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -521,7 +521,6 @@ msgstr "Categorïau arferol" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "Iaith chwilio" | msgstr "Iaith chwilio" | ||||||
| 
 | 
 | ||||||
| @ -658,10 +657,11 @@ msgstr "Agor dolenni canlyniadau mewn tabiau newydd yn y porwr" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "Dull" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -715,7 +715,7 @@ msgstr "" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| 
 | 
 | ||||||
| @ -850,12 +850,10 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "cadw" | msgstr "cadw" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "nôl" | msgstr "nôl" | ||||||
| 
 | 
 | ||||||
| @ -899,13 +897,11 @@ msgstr "Rho gynnig ar chwilio am:" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "tudalen nesaf" | msgstr "tudalen nesaf" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "tudalen ddiwethaf" | msgstr "tudalen ddiwethaf" | ||||||
| 
 | 
 | ||||||
| @ -1083,7 +1079,7 @@ msgstr "Da iawn!" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/messages/save_settings_successfull.html:8 | #: searx/templates/oscar/messages/save_settings_successfull.html:8 | ||||||
| msgid "Settings saved successfully." | msgid "Settings saved successfully." | ||||||
| msgstr "Cadwyd y gosodiadau yn iawn!" | msgstr "Cadwyd y gosodiadau yn iawn." | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/messages/unknow_error.html:7 | #: searx/templates/oscar/messages/unknow_error.html:7 | ||||||
| msgid "Oh snap!" | msgid "Oh snap!" | ||||||
| @ -1237,10 +1233,26 @@ msgstr "" | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "Cefnogir yr iaith a ddewiswyd" | msgstr "Cefnogir yr iaith a ddewiswyd" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "Atebion" | msgstr "Atebion" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1382,3 +1394,12 @@ msgstr "" | |||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "Dull" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ msgstr "" | ||||||
|  | 
 | ||||||
|  | |||||||
										
											Binary file not shown.
										
									
								
							| @ -9,9 +9,9 @@ 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-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+0000\n" | ||||||
| "PO-Revision-Date: 2021-12-31 07:17+0000\n" | "PO-Revision-Date: 2022-01-23 20:00+0000\n" | ||||||
| "Last-Translator: Frederik From <frederikfrom@pm.me>\n" | "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" | ||||||
| "Language: da\n" | "Language: da\n" | ||||||
| "Language-Team: Danish " | "Language-Team: Danish " | ||||||
| "<https://weblate.bubu1.eu/projects/searxng/searxng/da/>\n" | "<https://weblate.bubu1.eu/projects/searxng/searxng/da/>\n" | ||||||
| @ -21,174 +21,174 @@ msgstr "" | |||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "filer" | msgstr "filer" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "generelt" | msgstr "generelt" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "musik" | msgstr "musik" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "sociale medier" | msgstr "sociale medier" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "billeder" | msgstr "billeder" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "videoer" | msgstr "videoer" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "it" | msgstr "it" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "nyheder" | msgstr "nyheder" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "kort" | msgstr "kort" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "onion-links" | msgstr "onion-links" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "videnskab" | msgstr "videnskab" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "" | msgstr "ordbøger" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "" | msgstr "spørgsmål og svar" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "automatisk" | msgstr "automatisk" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "lys" | msgstr "lys" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "mørk" | msgstr "mørk" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "udløbstid" | msgstr "udløbstid" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "fortolkningsfejl" | msgstr "fortolkningsfejl" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "HTTP-protokolfejl" | msgstr "HTTP-protokolfejl" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "netværksfejl" | msgstr "netværksfejl" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "uventet nedbrud" | msgstr "uventet nedbrud" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "HTTP-fejl" | msgstr "HTTP-fejl" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "HTTP-tilkoblingsfejl" | msgstr "HTTP-tilkoblingsfejl" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "" | msgstr "proxyfejl" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "CAPTCHA" | msgstr "CAPTCHA" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "for mange forespørgsler" | msgstr "for mange forespørgsler" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "adgang nægtet" | msgstr "adgang nægtet" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "server-API-fejl" | msgstr "server-API-fejl" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| msgid "No item found" | msgid "No item found" | ||||||
| msgstr "Intet fundet" | msgstr "Intet fundet" | ||||||
| 
 | 
 | ||||||
| #: searx/engines/qwant.py:212 | #: searx/engines/qwant.py:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "Kilde" | msgstr "Kilde" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| msgid "Invalid settings, please edit your preferences" | msgid "Invalid settings, please edit your preferences" | ||||||
| msgstr "Ugyldige indstillinger, redigér venligst dine valg" | msgstr "Ugyldige indstillinger, redigér venligst dine valg" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "Ugyldig indstilling" | msgstr "Ugyldig indstilling" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "søgefejl" | msgstr "søgefejl" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "for {minutes} minut(ter) siden" | msgstr "for {minutes} minut(ter) siden" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| msgid "{hours} hour(s), {minutes} minute(s) ago" | msgid "{hours} hour(s), {minutes} minute(s) ago" | ||||||
| msgstr "for {hours} time(r) og {minutes} minut(ter) siden" | msgstr "for {hours} time(r) og {minutes} minut(ter) siden" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "" | msgstr "Suspenderet" | ||||||
| 
 | 
 | ||||||
| #: searx/answerers/random/answerer.py:67 | #: searx/answerers/random/answerer.py:67 | ||||||
| msgid "Random value generator" | msgid "Random value generator" | ||||||
| @ -397,13 +397,13 @@ msgstr "torrent-fil" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "cached" | msgstr "cached" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "viderestillet" | msgstr "viderestillet" | ||||||
| 
 | 
 | ||||||
| @ -418,7 +418,7 @@ msgstr "Tillad" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:139 | #: searx/templates/oscar/macros.html:139 | ||||||
| msgid "broken" | msgid "broken" | ||||||
| msgstr "" | msgstr "defekt" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:141 | #: searx/templates/oscar/macros.html:141 | ||||||
| msgid "supported" | msgid "supported" | ||||||
| @ -482,7 +482,7 @@ msgstr "P95" | |||||||
| #: searx/templates/oscar/preferences.html:68 | #: searx/templates/oscar/preferences.html:68 | ||||||
| #: searx/templates/simple/preferences.html:83 | #: searx/templates/simple/preferences.html:83 | ||||||
| msgid "Failed checker test(s): " | msgid "Failed checker test(s): " | ||||||
| msgstr "" | msgstr "Fejlet checkertest(s): " | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:96 | #: searx/templates/oscar/preferences.html:96 | ||||||
| #: searx/templates/simple/preferences.html:101 | #: searx/templates/simple/preferences.html:101 | ||||||
| @ -498,7 +498,7 @@ msgstr "Generelt" | |||||||
| #: searx/templates/oscar/preferences.html:102 | #: searx/templates/oscar/preferences.html:102 | ||||||
| #: searx/templates/oscar/preferences.html:193 | #: searx/templates/oscar/preferences.html:193 | ||||||
| msgid "User Interface" | msgid "User Interface" | ||||||
| msgstr "" | msgstr "Bruger Interface" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:103 | #: searx/templates/oscar/preferences.html:103 | ||||||
| #: searx/templates/oscar/preferences.html:257 | #: searx/templates/oscar/preferences.html:257 | ||||||
| @ -515,7 +515,7 @@ msgstr "Søgemaskiner" | |||||||
| #: searx/templates/oscar/preferences.html:105 | #: searx/templates/oscar/preferences.html:105 | ||||||
| #: searx/templates/simple/preferences.html:329 | #: searx/templates/simple/preferences.html:329 | ||||||
| msgid "Special Queries" | msgid "Special Queries" | ||||||
| msgstr "" | msgstr "Specielle Forespørgsler" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:106 | #: searx/templates/oscar/preferences.html:106 | ||||||
| #: searx/templates/oscar/preferences.html:454 | #: searx/templates/oscar/preferences.html:454 | ||||||
| @ -531,7 +531,6 @@ msgstr "Standardkategorier" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "Søgesprog" | msgstr "Søgesprog" | ||||||
| 
 | 
 | ||||||
| @ -626,7 +625,7 @@ msgstr "" | |||||||
| #: searx/templates/oscar/preferences.html:211 | #: searx/templates/oscar/preferences.html:211 | ||||||
| #: searx/templates/simple/preferences.html:205 | #: searx/templates/simple/preferences.html:205 | ||||||
| msgid "Change SearXNG layout" | msgid "Change SearXNG layout" | ||||||
| msgstr "" | msgstr "Ændr SearXNG layout" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:222 | #: searx/templates/oscar/preferences.html:222 | ||||||
| #: searx/templates/oscar/preferences.html:228 | #: searx/templates/oscar/preferences.html:228 | ||||||
| @ -640,11 +639,11 @@ msgstr "Stil" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:231 | #: searx/templates/oscar/preferences.html:231 | ||||||
| msgid "Show advanced settings" | msgid "Show advanced settings" | ||||||
| msgstr "" | msgstr "Vis avancerede indstillinger" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:232 | #: searx/templates/oscar/preferences.html:232 | ||||||
| msgid "Show advanced settings panel in the home page by default" | msgid "Show advanced settings panel in the home page by default" | ||||||
| msgstr "" | msgstr "Vis avancerede indstillinger panelet på forsiden som standardindstilling" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:235 | #: searx/templates/oscar/preferences.html:235 | ||||||
| #: searx/templates/oscar/preferences.html:245 | #: searx/templates/oscar/preferences.html:245 | ||||||
| @ -670,10 +669,11 @@ msgstr "Åben resultat-link i en ny browser-tab" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "Metode" | msgstr "HTTP-metode" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -691,7 +691,7 @@ msgstr "Billede-proxy" | |||||||
| #: searx/templates/oscar/preferences.html:274 | #: searx/templates/oscar/preferences.html:274 | ||||||
| #: searx/templates/simple/preferences.html:256 | #: searx/templates/simple/preferences.html:256 | ||||||
| msgid "Proxying image results through SearXNG" | msgid "Proxying image results through SearXNG" | ||||||
| msgstr "" | msgstr "Bearbejder billedresulter gennem SearXNG" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:277 | #: searx/templates/oscar/preferences.html:277 | ||||||
| #: searx/templates/oscar/preferences.html:288 | #: searx/templates/oscar/preferences.html:288 | ||||||
| @ -721,7 +721,7 @@ msgstr "" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:315 | #: searx/templates/oscar/preferences.html:315 | ||||||
| msgid "Allow all" | msgid "Allow all" | ||||||
| msgstr "" | msgstr "Tillad alle" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:316 | #: searx/templates/oscar/preferences.html:316 | ||||||
| msgid "Disable all" | msgid "Disable all" | ||||||
| @ -730,7 +730,7 @@ msgstr "" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| 
 | 
 | ||||||
| @ -766,7 +766,7 @@ msgstr "Tidsinterval" | |||||||
| #: searx/templates/simple/preferences.html:291 | #: searx/templates/simple/preferences.html:291 | ||||||
| #: searx/templates/simple/stats.html:31 | #: searx/templates/simple/stats.html:31 | ||||||
| msgid "Response time" | msgid "Response time" | ||||||
| msgstr "" | msgstr "Svartid" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:340 | #: searx/templates/oscar/preferences.html:340 | ||||||
| #: searx/templates/oscar/preferences.html:344 | #: searx/templates/oscar/preferences.html:344 | ||||||
| @ -872,12 +872,10 @@ msgstr "" | |||||||
| "resultatet." | "resultatet." | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "gem" | msgstr "gem" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "tilbage" | msgstr "tilbage" | ||||||
| 
 | 
 | ||||||
| @ -921,13 +919,11 @@ msgstr "Prøv at søge efter:" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "næste side" | msgstr "næste side" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "forrige side" | msgstr "forrige side" | ||||||
| 
 | 
 | ||||||
| @ -1259,10 +1255,26 @@ msgstr "Pt. anvendte søgemaskiner" | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "Undstøtter valgte sprog" | msgstr "Undstøtter valgte sprog" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "Svar" | msgstr "Svar" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1400,3 +1412,12 @@ msgstr "" | |||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "Metode" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ msgstr "" | ||||||
|  | 
 | ||||||
|  | |||||||
										
											Binary file not shown.
										
									
								
							| @ -21,8 +21,8 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: searx\n" | "Project-Id-Version: searx\n" | ||||||
| "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" | ||||||
| "POT-Creation-Date: 2022-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+0000\n" | ||||||
| "PO-Revision-Date: 2022-01-07 07:17+0000\n" | "PO-Revision-Date: 2022-01-28 07:16+0000\n" | ||||||
| "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" | "Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n" | ||||||
| "Language-Team: German <https://weblate.bubu1.eu/projects/searxng/searxng/de/>" | "Language-Team: German <https://weblate.bubu1.eu/projects/searxng/searxng/de/>" | ||||||
| "\n" | "\n" | ||||||
| @ -34,172 +34,172 @@ msgstr "" | |||||||
| "X-Generator: Weblate 4.10.1\n" | "X-Generator: Weblate 4.10.1\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "Dateien" | msgstr "Dateien" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "Allgemein" | msgstr "Allgemein" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "Musik" | msgstr "Musik" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "Soziale Medien" | msgstr "Soziale Medien" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "Bilder" | msgstr "Bilder" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "Videos" | msgstr "Videos" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "IT" | msgstr "IT" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "Neuigkeiten" | msgstr "Neuigkeiten" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "Karte" | msgstr "Karte" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "Onions" | msgstr "Onions" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "Wissenschaft" | msgstr "Wissenschaft" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "Apps" | msgstr "Apps" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "Lexika" | msgstr "Lexika" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "Songtexte" | msgstr "Songtexte" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "Pakete" | msgstr "Pakete" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "Q&A" | msgstr "Q&A" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "Repositories" | msgstr "Repositories" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "Software Wikis" | msgstr "Software Wikis" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "WEB" | msgstr "WEB" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "auto" | msgstr "auto" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "hell" | msgstr "hell" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "dunkel" | msgstr "dunkel" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "Timeout" | msgstr "Timeout" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "Fehler beim Parsen" | msgstr "Fehler beim Parsen" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "HTTP-Protokollfehler" | msgstr "HTTP-Protokollfehler" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "Netzwerkfehler" | msgstr "Netzwerkfehler" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "unerwarteter Absturz" | msgstr "unerwarteter Absturz" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "HTTP-Fehler" | msgstr "HTTP-Fehler" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "HTTP-Verbindungsfehler" | msgstr "HTTP-Verbindungsfehler" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "Proxy-Fehler" | msgstr "Proxy-Fehler" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "CAPTCHA" | msgstr "CAPTCHA" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "zu viele Anfragen" | msgstr "zu viele Anfragen" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "Zugriff verweigert" | msgstr "Zugriff verweigert" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "Server-API-Fehler" | msgstr "Server-API-Fehler" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| msgid "No item found" | msgid "No item found" | ||||||
| msgstr "Keine Einträge gefunden" | msgstr "Keine Einträge gefunden" | ||||||
| 
 | 
 | ||||||
| #: searx/engines/qwant.py:212 | #: searx/engines/qwant.py:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "Quelle" | msgstr "Quelle" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| msgid "Invalid settings, please edit your preferences" | msgid "Invalid settings, please edit your preferences" | ||||||
| msgstr "Ungültige Einstellungen. Bitte diese überprüfen" | msgstr "Ungültige Einstellungen. Bitte diese überprüfen" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "Ungültige Einstellungen" | msgstr "Ungültige Einstellungen" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "Suchfehler" | msgstr "Suchfehler" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "vor {minutes} Minute(n)" | msgstr "vor {minutes} Minute(n)" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| msgid "{hours} hour(s), {minutes} minute(s) ago" | msgid "{hours} hour(s), {minutes} minute(s) ago" | ||||||
| msgstr "vor {hours} Stunde(n), {minutes} Minute(n)" | msgstr "vor {hours} Stunde(n), {minutes} Minute(n)" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "Ausgesetzt" | msgstr "Ausgesetzt" | ||||||
| 
 | 
 | ||||||
| @ -414,13 +414,13 @@ msgstr "Torrent" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "Im Cache" | msgstr "Im Cache" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "proxy" | msgstr "proxy" | ||||||
| 
 | 
 | ||||||
| @ -548,7 +548,6 @@ msgstr "Standardkategorien" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "Suchsprache" | msgstr "Suchsprache" | ||||||
| 
 | 
 | ||||||
| @ -689,10 +688,11 @@ msgstr "Links in einem neuen Browser-Tab öffnen" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "Methode" | msgstr "HTTP Methode" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -751,11 +751,11 @@ msgstr "Alle deaktivieren" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| "Diese Registerkarte zeigt keine Suchergebnisse an, aber Sie können die hier " | "Auf dieser Registerkarte werden keine Suchergebnisse angezeigt, aber Sie " | ||||||
| "aufgelisteten Suchmaschinen über bangs (!) durchsuchen." | "können die hier aufgelisteten Suchmaschinen über bangs durchsuchen." | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:334 | #: searx/templates/oscar/preferences.html:334 | ||||||
| #: searx/templates/oscar/preferences.html:350 | #: searx/templates/oscar/preferences.html:350 | ||||||
| @ -897,12 +897,10 @@ msgstr "" | |||||||
| "ausgewählten Ergebnisseiten übermittelt werden." | "ausgewählten Ergebnisseiten übermittelt werden." | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "Speichern" | msgstr "Speichern" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "Zurück" | msgstr "Zurück" | ||||||
| 
 | 
 | ||||||
| @ -946,13 +944,11 @@ msgstr "Suche nach:" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "nächste Seite" | msgstr "nächste Seite" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "vorherige Seite" | msgstr "vorherige Seite" | ||||||
| 
 | 
 | ||||||
| @ -1287,10 +1283,26 @@ msgstr "Aktuell benutzte Suchmaschinen" | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "Unterstützt die ausgewählten Sprachen" | msgstr "Unterstützt die ausgewählten Sprachen" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "Speichern" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "Zurück" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "Antworten" | msgstr "Antworten" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "Vorherige Seite" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "Nächste Seite" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1431,3 +1443,16 @@ msgstr "Suchmaschine" | |||||||
| #~ " contains your query. Your browser " | #~ " contains your query. Your browser " | ||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
|  | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "Methode" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ msgstr "" | ||||||
|  | #~ "Diese Registerkarte zeigt keine Suchergebnisse" | ||||||
|  | #~ " an, aber Sie können die hier " | ||||||
|  | #~ "aufgelisteten Suchmaschinen über bangs (!) " | ||||||
|  | #~ "durchsuchen." | ||||||
|  | |||||||
										
											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-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+0000\n" | ||||||
| "PO-Revision-Date: 2020-07-09 13:10+0000\n" | "PO-Revision-Date: 2020-07-09 13:10+0000\n" | ||||||
| "Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" | "Last-Translator: Adam Tauber <asciimoo@gmail.com>\n" | ||||||
| "Language: el_GR\n" | "Language: el_GR\n" | ||||||
| @ -21,172 +21,172 @@ msgstr "" | |||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "αρχεία" | msgstr "αρχεία" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "γενικά" | msgstr "γενικά" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "μουσική" | msgstr "μουσική" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "κοινωνικά δίκτυα" | msgstr "κοινωνικά δίκτυα" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "εικόνες" | msgstr "εικόνες" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "νέα" | msgstr "νέα" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "χάρτης" | msgstr "χάρτης" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "επιστήμη" | msgstr "επιστήμη" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| msgid "No item found" | msgid "No item found" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/engines/qwant.py:212 | #: searx/engines/qwant.py:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| msgid "Invalid settings, please edit your preferences" | msgid "Invalid settings, please edit your preferences" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "λάθος αναζήτησης" | msgstr "λάθος αναζήτησης" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "{minutes} λεπτά πριν" | msgstr "{minutes} λεπτά πριν" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| msgid "{hours} hour(s), {minutes} minute(s) ago" | msgid "{hours} hour(s), {minutes} minute(s) ago" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -391,13 +391,13 @@ msgstr "αρχείο torrent" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -525,7 +525,6 @@ msgstr "Προεπιλεγμένες κατηγορίες" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "Γλώσσα αναζήτησης" | msgstr "Γλώσσα αναζήτησης" | ||||||
| 
 | 
 | ||||||
| @ -662,10 +661,11 @@ msgstr "Άνοιξε τους συνδέσμους των αποτελεσμάτ | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "Μέθοδος" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -719,7 +719,7 @@ msgstr "" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| 
 | 
 | ||||||
| @ -854,12 +854,10 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "αποθήκευση" | msgstr "αποθήκευση" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "πίσω" | msgstr "πίσω" | ||||||
| 
 | 
 | ||||||
| @ -903,13 +901,11 @@ msgstr "Δοκιμάστε αναζήτηση για:" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "επόμενη σελίδα" | msgstr "επόμενη σελίδα" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "προηγούμενη σελίδα" | msgstr "προηγούμενη σελίδα" | ||||||
| 
 | 
 | ||||||
| @ -1241,10 +1237,26 @@ msgstr "Μηχανές αναζήτησης που χρησιμοποιούντ | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "Υποστηρίζει την επιλεγμένη γλώσσα" | msgstr "Υποστηρίζει την επιλεγμένη γλώσσα" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "Απαντήσεις" | msgstr "Απαντήσεις" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1378,3 +1390,12 @@ msgstr "" | |||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "Μέθοδος" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ msgstr "" | ||||||
|  | 
 | ||||||
|  | |||||||
										
											Binary file not shown.
										
									
								
							| @ -7,7 +7,7 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: PROJECT VERSION\n" | "Project-Id-Version: PROJECT VERSION\n" | ||||||
| "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" | ||||||
| "POT-Creation-Date: 2022-01-06 08:25+0000\n" | "POT-Creation-Date: 2022-01-26 17:14+0000\n" | ||||||
| "PO-Revision-Date: 2014-01-30 15:22+0100\n" | "PO-Revision-Date: 2014-01-30 15:22+0100\n" | ||||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||||
| "Language: en\n" | "Language: en\n" | ||||||
| @ -18,172 +18,172 @@ msgstr "" | |||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Generated-By: Babel 2.9.1\n" | "Generated-By: Babel 2.9.1\n" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:165 | #: searx/webapp.py:169 | ||||||
| msgid "files" | msgid "files" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:166 | #: searx/webapp.py:170 | ||||||
| msgid "general" | msgid "general" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:167 | #: searx/webapp.py:171 | ||||||
| msgid "music" | msgid "music" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:168 | #: searx/webapp.py:172 | ||||||
| msgid "social media" | msgid "social media" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:169 | #: searx/webapp.py:173 | ||||||
| msgid "images" | msgid "images" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:170 | #: searx/webapp.py:174 | ||||||
| msgid "videos" | msgid "videos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:171 | #: searx/webapp.py:175 | ||||||
| msgid "it" | msgid "it" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:172 | #: searx/webapp.py:176 | ||||||
| msgid "news" | msgid "news" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:173 | #: searx/webapp.py:177 | ||||||
| msgid "map" | msgid "map" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:174 | #: searx/webapp.py:178 | ||||||
| msgid "onions" | msgid "onions" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:175 | #: searx/webapp.py:179 | ||||||
| msgid "science" | msgid "science" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:177 | #: searx/webapp.py:181 | ||||||
| msgid "apps" | msgid "apps" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:178 | #: searx/webapp.py:182 | ||||||
| msgid "dictionaries" | msgid "dictionaries" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:179 | #: searx/webapp.py:183 | ||||||
| msgid "lyrics" | msgid "lyrics" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:180 | #: searx/webapp.py:184 | ||||||
| msgid "packages" | msgid "packages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:181 | #: searx/webapp.py:185 | ||||||
| msgid "q&a" | msgid "q&a" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:182 | #: searx/webapp.py:186 | ||||||
| msgid "repos" | msgid "repos" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:183 | #: searx/webapp.py:187 | ||||||
| msgid "software wikis" | msgid "software wikis" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:184 | #: searx/webapp.py:188 | ||||||
| msgid "web" | msgid "web" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "auto" | msgid "auto" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "light" | msgid "light" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:189 | #: searx/webapp.py:193 | ||||||
| msgid "dark" | msgid "dark" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:192 | #: searx/webapp.py:196 | ||||||
| msgid "timeout" | msgid "timeout" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:193 | #: searx/webapp.py:197 | ||||||
| msgid "parsing error" | msgid "parsing error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:194 | #: searx/webapp.py:198 | ||||||
| msgid "HTTP protocol error" | msgid "HTTP protocol error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:195 | #: searx/webapp.py:199 | ||||||
| msgid "network error" | msgid "network error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:197 | #: searx/webapp.py:201 | ||||||
| msgid "unexpected crash" | msgid "unexpected crash" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:204 | #: searx/webapp.py:208 | ||||||
| msgid "HTTP error" | msgid "HTTP error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:205 | #: searx/webapp.py:209 | ||||||
| msgid "HTTP connection error" | msgid "HTTP connection error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:211 | #: searx/webapp.py:215 | ||||||
| msgid "proxy error" | msgid "proxy error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:212 | #: searx/webapp.py:216 | ||||||
| msgid "CAPTCHA" | msgid "CAPTCHA" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:213 | #: searx/webapp.py:217 | ||||||
| msgid "too many requests" | msgid "too many requests" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:214 | #: searx/webapp.py:218 | ||||||
| msgid "access denied" | msgid "access denied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:215 | #: searx/webapp.py:219 | ||||||
| msgid "server API error" | msgid "server API error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:402 | #: searx/webapp.py:421 | ||||||
| msgid "No item found" | msgid "No item found" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/engines/qwant.py:212 | #: searx/engines/qwant.py:212 | ||||||
| #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:404 | #: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:423 | ||||||
| msgid "Source" | msgid "Source" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:515 searx/webapp.py:925 | #: searx/webapp.py:534 searx/webapp.py:941 | ||||||
| msgid "Invalid settings, please edit your preferences" | msgid "Invalid settings, please edit your preferences" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:531 | #: searx/webapp.py:550 | ||||||
| msgid "Invalid settings" | msgid "Invalid settings" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:608 searx/webapp.py:683 | #: searx/webapp.py:626 searx/webapp.py:701 | ||||||
| msgid "search error" | msgid "search error" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:726 | #: searx/webapp.py:744 | ||||||
| msgid "{minutes} minute(s) ago" | msgid "{minutes} minute(s) ago" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:728 | #: searx/webapp.py:746 | ||||||
| msgid "{hours} hour(s), {minutes} minute(s) ago" | msgid "{hours} hour(s), {minutes} minute(s) ago" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/webapp.py:846 | #: searx/webapp.py:862 | ||||||
| msgid "Suspended" | msgid "Suspended" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -384,13 +384,13 @@ msgstr "" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | #: searx/templates/oscar/macros.html:37 searx/templates/oscar/macros.html:39 | ||||||
| #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | #: searx/templates/oscar/macros.html:73 searx/templates/oscar/macros.html:75 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "cached" | msgid "cached" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | #: searx/templates/oscar/macros.html:43 searx/templates/oscar/macros.html:59 | ||||||
| #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | #: searx/templates/oscar/macros.html:79 searx/templates/oscar/macros.html:93 | ||||||
| #: searx/templates/simple/macros.html:41 | #: searx/templates/simple/macros.html:43 | ||||||
| msgid "proxied" | msgid "proxied" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -518,7 +518,6 @@ msgstr "" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:133 | #: searx/templates/oscar/preferences.html:133 | ||||||
| #: searx/templates/simple/preferences.html:117 | #: searx/templates/simple/preferences.html:117 | ||||||
| #: searx/templates/simple/preferences.html:244 |  | ||||||
| msgid "Search language" | msgid "Search language" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -655,10 +654,11 @@ msgstr "" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:262 | #: searx/templates/oscar/preferences.html:262 | ||||||
| #: searx/templates/simple/preferences.html:237 | #: searx/templates/simple/preferences.html:237 | ||||||
| msgid "Method" | msgid "HTTP Method" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:263 | #: searx/templates/oscar/preferences.html:263 | ||||||
|  | #: searx/templates/simple/preferences.html:244 | ||||||
| msgid "" | msgid "" | ||||||
| "Change how forms are submited, <a " | "Change how forms are submited, <a " | ||||||
| "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | "href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\"" | ||||||
| @ -712,7 +712,7 @@ msgstr "" | |||||||
| #: searx/templates/oscar/preferences.html:325 | #: searx/templates/oscar/preferences.html:325 | ||||||
| #: searx/templates/simple/preferences.html:280 | #: searx/templates/simple/preferences.html:280 | ||||||
| msgid "" | 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 "" | ||||||
| 
 | 
 | ||||||
| @ -847,12 +847,10 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:492 | #: searx/templates/oscar/preferences.html:492 | ||||||
| #: searx/templates/simple/preferences.html:404 |  | ||||||
| msgid "save" | msgid "save" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/preferences.html:493 | #: searx/templates/oscar/preferences.html:493 | ||||||
| #: searx/templates/simple/preferences.html:406 |  | ||||||
| msgid "back" | msgid "back" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -896,13 +894,11 @@ msgstr "" | |||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:162 | #: searx/templates/oscar/results.html:162 | ||||||
| #: searx/templates/oscar/results.html:187 | #: searx/templates/oscar/results.html:187 | ||||||
| #: searx/templates/simple/results.html:182 |  | ||||||
| msgid "next page" | msgid "next page" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: searx/templates/oscar/results.html:169 | #: searx/templates/oscar/results.html:169 | ||||||
| #: searx/templates/oscar/results.html:180 | #: searx/templates/oscar/results.html:180 | ||||||
| #: searx/templates/simple/results.html:165 |  | ||||||
| msgid "previous page" | msgid "previous page" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| @ -1232,10 +1228,26 @@ msgstr "" | |||||||
| msgid "Supports selected language" | msgid "Supports selected language" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:404 | ||||||
|  | msgid "Save" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/preferences.html:406 | ||||||
|  | msgid "Back" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/results.html:24 | #: searx/templates/simple/results.html:24 | ||||||
| msgid "Answers" | msgid "Answers" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #: searx/templates/simple/results.html:165 | ||||||
|  | msgid "Previous page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | #: searx/templates/simple/results.html:182 | ||||||
|  | msgid "Next page" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| #: searx/templates/simple/search.html:9 | #: searx/templates/simple/search.html:9 | ||||||
| #: searx/templates/simple/simple_search.html:5 | #: searx/templates/simple/simple_search.html:5 | ||||||
| msgid "clear" | msgid "clear" | ||||||
| @ -1379,3 +1391,12 @@ msgstr "" | |||||||
| #~ "can record this title." | #~ "can record this title." | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "Method" | ||||||
|  | #~ msgstr "" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "This tab does not show up for " | ||||||
|  | #~ "search results but you can search " | ||||||
|  | #~ "the engines listed here via bangs." | ||||||
|  | #~ msgstr "" | ||||||
|  | 
 | ||||||
|  | |||||||
										
											Binary file not shown.
										
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user