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:
Martin Minka 2022-02-01 08:21:26 +01:00
commit 018abdcd80
177 changed files with 5714 additions and 3392 deletions

View file

@ -32,6 +32,10 @@
;; Jedi, flycheck & other python stuff should use the 'python-shell-interpreter'
;; 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::
;;
;; (global-set-key [f6] 'flycheck-mode)
@ -99,12 +103,19 @@
;; use nodejs from the (local) NVM environment (see nvm-dir)
(nvm-use-for-buffer)
(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)
))))
(python-mode
. ((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
(list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root)
;;"--system-site-packages"

5
.gitignore vendored
View file

@ -1,4 +1,4 @@
# to sync with .dockerignore
# to sync with .dockerignore & pyrightconfig.json
*.pyc
*/*.pyc
@ -16,3 +16,6 @@ dist/
local/
gh-pages/
*.egg-info/
/package-lock.json
/node_modules/

View file

@ -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

View file

@ -50,8 +50,8 @@ search.checker.%: install
$(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
PHONY += test ci.test test.shell
ci.test: test.yamllint test.black test.pylint test.unit test.robot
test: test.yamllint test.black test.pylint test.unit test.robot test.shell
ci.test: test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst
test: test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst test.shell
test.shell:
$(Q)shellcheck -x -s dash \
dockerfiles/docker-entrypoint.sh
@ -86,7 +86,7 @@ MANAGE += py.build py.clean
MANAGE += pyenv pyenv.install pyenv.uninstall
MANAGE += pypi.upload pypi.upload.test
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 += static.build.commit static.build.drop static.build.restore
MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs

View file

@ -1,11 +1,21 @@
.. SPDX-License-Identifier: AGPL-3.0-or-later
----
.. figure:: https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng.svg
:target: https://docs.searxng.org/
:alt: SearXNG
:width: 100%
: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 homepage|
|SearXNG wiki|
@ -15,16 +25,11 @@
|weblate|
|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
.. _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
.. _homepage: https://docs.searxng.org/
.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
@ -58,26 +63,76 @@ our homepage_.
: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>`_
* `exhaustive changelog <https://github.com/searxng/searxng/wiki/Changes-from-version-1.0.0>`_
Come join us if you have questions or just want to chat about SearXNG.
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
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
""""""""""""
============
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
:target: https://weblate.bubu1.eu/projects/searxng/

10
SECURITY.md Normal file
View 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.

View file

@ -136,12 +136,10 @@ find an example configuration below:
MySQL
-----
.. _mysql-connector-python: https://pypi.org/project/mysql-connector-python
.. sidebar:: info
- :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
engine, you must install the package ``mysql-connector-python``.

View file

@ -12,6 +12,7 @@ Administrator documentation
installation-nginx
installation-apache
installation-docker
installation-switch2ng
update-searxng
engines/index
api

View 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

View file

@ -4,6 +4,10 @@
Installation
============
.. sidebar:: info
:ref:`installation switch2ng`
*You're spoilt for choice*, choose your preferred method of installation.
- :ref:`installation docker`

View file

@ -3,7 +3,6 @@
import sys, os
from pallets_sphinx_themes import ProjectLink
from flask import Flask
from searx import get_setting
from searx.version import VERSION_STRING, GIT_URL, GIT_BRANCH
@ -42,12 +41,12 @@ import searx.engines
import searx.plugins
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'] = ''
from searx.webapp import application
import searx.webapp
searx.engines.load_engines(searx.settings['engines'])
searx.plugins.initialize(application)
jinja_contexts = {
'searx': {

View file

@ -238,10 +238,10 @@ and ``test.robot``. You can run tests selective, e.g.::
...
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
commit.

View file

@ -0,0 +1,9 @@
.. _tineye engine:
======
Tineye
======
.. automodule:: searx.engines.tineye
:members:

35
manage
View file

@ -20,6 +20,8 @@ source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_go.sh"
# shellcheck source=utils/lib_redis.sh
source "$(dirname "${BASH_SOURCE[0]}")/utils/lib_redis.sh"
PATH="${REPO_ROOT}/node_modules/.bin:${PATH}"
# config
PYOBJECTS="searx"
@ -46,6 +48,10 @@ while IFS= read -r line; do
YAMLLINT_FILES+=("$line")
done <<< "$(git ls-files './tests/*.yml' './searx/*.yml' './utils/templates/etc/searxng/*.yml')"
RST_FILES=(
'README.rst'
)
PYLINT_SEARXNG_DISABLE_OPTION="\
I,C,R,\
W0105,W0212,W0511,W0603,W0613,W0621,W0702,W0703,W1401,\
@ -99,10 +105,12 @@ format.:
test.:
yamllint : lint YAML files (YAMLLINT_FILES)
pylint : lint PYLINT_FILES, searx/engines, searx & tests
pyright : static type check of python sources
black : check black code format
unit : run unit tests
coverage : run unit tests with coverage
robot : run robot test
rst : test .rst files incl. README.rst
clean : clean intermediate test stuff
themes.:
all : build all themes
@ -553,6 +561,12 @@ node.env() {
dump_return $?
}
node.env.devtools() {
nodejs.ensure
build_msg INSTALL "package.json: developer and CI tools"
npm install
}
node.clean() {
if ! required_commands npm 2>/dev/null; then
build_msg CLEAN "npm is not installed / ignore npm dependencies"
@ -677,6 +691,20 @@ test.pylint() {
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() {
build_msg TEST "[black] \$BLACK_TARGETS"
pyenv.cmd black --check --diff "${BLACK_OPTIONS[@]}" "${BLACK_TARGETS[@]}"
@ -707,6 +735,13 @@ test.robot() {
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() {
build_msg CLEAN "test stuff"
rm -rf geckodriver.log .coverage coverage/

6
package.json Normal file
View file

@ -0,0 +1,6 @@
{
"dependencies": {
"eslint": "^8.7.0",
"pyright": "^1.1.215"
}
}

10
pyrightconfig-ci.json Normal file
View file

@ -0,0 +1,10 @@
{
"venvPath": "local",
"venv": "py3",
"include": [
"searx",
"searxng_extra",
"tests"
],
"typeCheckingMode": "off"
}

9
pyrightconfig.json Normal file
View file

@ -0,0 +1,9 @@
{
"venvPath": "local",
"venv": "py3",
"include": [
"searx",
"searxng_extra",
"tests"
]
}

View file

@ -8,7 +8,7 @@ splinter==0.17.0
selenium==4.1.0
twine==3.7.1
Pallets-Sphinx-Themes==2.0.2
Sphinx==4.3.2
Sphinx==4.4.0
sphinx-issues==3.0.1
sphinx-jinja==1.4.0
sphinx-tabs==3.2.0

View file

@ -13,3 +13,6 @@ uvloop==0.16.0
httpx-socks[asyncio]==0.7.2
langdetect==1.0.9
setproctitle==1.2.2
redis==4.1.2
mistletoe==0.8.1
typing_extensions==4.0.1

View file

@ -1,33 +1,23 @@
'''
searx is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
"""This module implements functions needed for the autocompleter.
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 urllib.parse import urlencode
from lxml import etree
from httpx import HTTPError
from searx import settings
from searx.data import ENGINES_LANGUAGES
from searx.network import get as http_get
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):
if 'timeout' not in kwargs:
@ -36,7 +26,26 @@ def 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
autocomplete_url = 'https://lookup.dbpedia.org/api/search.asmx/KeywordSearch?'
@ -51,7 +60,7 @@ def dbpedia(query, lang):
return results
def duckduckgo(query, lang):
def duckduckgo(query, _lang):
# duckduckgo autocompleter
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]
def swisscows(query, lang):
def swisscows(query, _lang):
# swisscows autocompleter
url = 'https://swisscows.ch/api/suggest?{query}&itemsCount=5'
@ -128,6 +137,7 @@ backends = {
'swisscows': swisscows,
'qwant': qwant,
'wikipedia': wikipedia,
'brave': brave,
}

View file

@ -38,7 +38,7 @@ def ahmia_blacklist_loader():
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()

File diff suppressed because it is too large Load diff

View file

@ -827,6 +827,7 @@
"CNY"
],
"רנמינבי": "CNY",
"zsenminpi": "CNY",
"renminbi cinese": "CNY",
"人民元": "CNY",
"juanis": "CNY",
@ -992,7 +993,7 @@
"džibučio frankas": "DJF",
"djiboutiaanse frank": "DJF",
"frank dżibuti": "DJF",
"franco do djibouti": "DJF",
"franco do jibuti": "DJF",
"франк джибути": "DJF",
"џибутски франак": "DJF",
"djiboutisk franc": "DJF",
@ -2324,11 +2325,10 @@
"mazedonischer denar": "MKD",
"macedonian denar": "MKD",
"makedona denaro": "MKD",
"denar normacedonio": "MKD",
"denar macedonio": "MKD",
"põhja makedoonia denaar": "MKD",
"pohjois makedonian denaari": "MKD",
"denar macédonien": "MKD",
"denar macedonio": "MKD",
"דינר מקדוני": "MKD",
"makedonski denar": "MKD",
"macedón dénár": "MKD",
@ -4849,6 +4849,7 @@
"belarus rubel": "BYN",
"br": "BYN",
"nuevo rublo bierlorruso": "BYN",
"зайчик": "BYN",
"білоруський рубль": "BYN",
"Bz$": "BZD",
"bz$": "BZD",
@ -5060,7 +5061,6 @@
"יואן": "CNY",
"יואן סיני": "CNY",
"kínai jüan": "CNY",
"zsenminpi": "CNY",
"yuan cinese": "CNY",
"人民幣": "CNY",
"中国元": "CNY",
@ -5223,10 +5223,10 @@
"המטבע של ג'יבוטי": "DJF",
"franco di gibuti": "DJF",
"djiboutische frank": "DJF",
"franco do jibuti": "DJF",
"franco djibutiano": "DJF",
"franco djibutiense": "DJF",
"franco do djibuti": "DJF",
"franco do djibouti": "DJF",
"franco jibutiano": "DJF",
"franco jibutiense": "DJF",
"валюта джибути": "DJF",
@ -6383,6 +6383,8 @@
"M": "LSL",
"lisente": "LSL",
"loti lesothan": "LSL",
"לוטי": "LSL",
"לוטי לסוטו": "LSL",
"loti del lesotho": "LSL",
"レソト・ロチ": "LSL",
"валюта лесото": "LSL",
@ -6494,15 +6496,12 @@
"dinar normacedoni": "MKD",
"makedonský dinár": "MKD",
"makedonsk denar": "MKD",
"nordmazedonischer denar": "MKD",
"denari": "MKD",
"mkd": "MKD",
"north macedonian denar": "MKD",
"makedonia denaro": "MKD",
"dinar macedonio": "MKD",
"makedoonia denaar": "MKD",
"makedonian denaari": "MKD",
"dinar macédonien": "MKD",
"denar macedone": "MKD",
"denaro macedone": "MKD",
"マケドニア・ディナール": "MKD",
@ -7031,8 +7030,6 @@
"питкэрнский доллар": "PND",
"غواراني": "PYG",
"₲": "PYG",
"paraguajský guarani": "PYG",
"paraguajský guaraní": "PYG",
"paraguayský guarani": "PYG",
"pyg": "PYG",
"paraguayan guarani": "PYG",
@ -8052,9 +8049,9 @@
"unitate monetară europeană": "XEU",
"европейская валютная единица": "XEU",
"europeiska valutaenhet": "XEU",
"xmr": "XMR",
"mo": "XMR",
"bitmonero": "XMR",
"mo": "XMR",
"xmr": "XMR",
"فرنك س ف ا غرب أفريقيا": "XOF",
"F": "XOF",
"xof": "XOF",
@ -8124,6 +8121,7 @@
"единая система региональных взаиморасчетов": "XSU",
"единая система региональных взаиморасчётов": "XSU",
"rial del iemen del nord": "YER",
"nord jemena rialo": "YER",
"rial nord yéménite": "YER",
"észak jemeni riál": "YER",
"北イエメン・リアル": "YER",
@ -8155,6 +8153,7 @@
"R": "ZAR",
"rand de sud àfrica": "ZAR",
"rand sud africà": "ZAR",
"rand de affrica": "ZAR",
"rando": "ZAR",
"sud afrika rando": "ZAR",
"zar": "ZAR",
@ -8753,7 +8752,7 @@
"sv": "Burundisk franc",
"ta": "புரூண்டி பிராங்க்",
"tr": "Burundi frangı",
"uk": "Бурундійський франк",
"uk": "бурундійський франк",
"he": "פרנק בורונדי",
"ro": "franc burundez"
},
@ -10965,7 +10964,7 @@
"nl": "Sri Lankaanse roepie",
"pl": "Rupia lankijska",
"pt": "rúpia do Sri Lanka",
"ru": "Ланкийская рупия",
"ru": "ланкийская рупия",
"sr": "шриланчанска рупија",
"sv": "Lankesisk rupie",
"ta": "இலங்கை ரூபாய்",
@ -11031,7 +11030,8 @@
"sr": "лесотски лоти",
"sv": "Lesothisk Loti",
"tr": "Loti",
"uk": "Лоті"
"uk": "Лоті",
"he": "לוטי"
},
"LYD": {
"ar": "دينار ليبي",
@ -11186,13 +11186,13 @@
"ca": "denar",
"cs": "Makedonský denár",
"da": "Makedonske denarer",
"de": "nordmazedonischer Denar",
"en": "denar",
"de": "mazedonischer Denar",
"en": "Macedonian denar",
"eo": "makedona denaro",
"es": "denar macedonio",
"et": "Makedoonia denaar",
"fi": "Makedonian denaari",
"fr": "dinar macédonien",
"fr": "denar macédonien",
"gl": "Dinar macedonio",
"he": "דינר מקדוני",
"hr": "Makedonski denar",
@ -11980,7 +11980,7 @@
"PYG": {
"ar": "غواراني باراغواي",
"ca": "guaraní",
"cs": "Paraguayský guaraní",
"cs": "paraguayský guaraní",
"de": "Paraguayischer Guaraní",
"en": "Paraguayan guaraní",
"eo": "paragvaja gvaranio",
@ -13662,7 +13662,8 @@
"sr": "јужноафрички ранд",
"sv": "Rand",
"tr": "Güney Afrika randı",
"uk": "Ранд"
"uk": "Ранд",
"cy": "Rand De Affrica"
},
"ZMW": {
"ar": "كواشا زامبية",

View file

@ -1,11 +1,12 @@
{
"versions": [
"96.0.3",
"96.0.2",
"96.0.1",
"96.0",
"95.0.2",
"95.0.1",
"95.0",
"94.0.2",
"94.0.1",
"94.0"
"95.0"
],
"os": [
"Windows NT 10.0; Win64; x64",

View file

@ -211,6 +211,7 @@
"Q1104069": "$",
"Q11061003": "μm²",
"Q11061005": "nm²",
"Q110742003": "dppx",
"Q1131660": "st",
"Q1137675": "cr",
"Q1140444": "Zb",

View file

@ -42,6 +42,7 @@ ENGINE_DEFAULT_ARGS = {
"safesearch": False,
"time_range_support": False,
"enable_http": False,
"using_tor_proxy": False,
"display_error_messages": True,
"tokens": [],
"about": {},
@ -230,8 +231,8 @@ def set_language_attributes(engine: Engine):
)
def update_attributes_for_tor(engine):
if settings['outgoing'].get('using_tor_proxy') and hasattr(engine, 'onion_url'):
def update_attributes_for_tor(engine: Engine) -> bool:
if using_tor_proxy(engine) and hasattr(engine, 'onion_url'):
engine.search_url = engine.onion_url + getattr(engine, 'search_path', '')
engine.timeout += settings['outgoing'].get('extra_proxy_timeout', 0)
@ -249,13 +250,18 @@ def is_missing_required_attributes(engine):
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):
# check if engine is inactive
if engine.inactive is True:
return False
# 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 True

View file

@ -1,6 +1,6 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""
currency convert (DuckDuckGo)
# lint: pylint
"""Currency convert (DuckDuckGo)
"""
import json
@ -13,18 +13,19 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": 'JSONP',
"description": "Service from DuckDuckGo.",
}
engine_type = 'online_currency'
categories = []
url = 'https://duckduckgo.com/js/spice/currency/1/{0}/{1}'
base_url = 'https://duckduckgo.com/js/spice/currency/1/{0}/{1}'
weight = 100
https_support = True
def request(query, params):
params['url'] = url.format(params['from'], params['to'])
def request(_query, params):
params['url'] = base_url.format(params['from'], params['to'])
return params
@ -34,7 +35,7 @@ def response(resp):
results = []
try:
conversion_rate = float(json.loads(json_resp)['conversion']['converted-amount'])
except:
except ValueError:
return results
answer = '{0} {1} = {2} {3}, 1 {1} ({5}) = {4} {3} ({6})'.format(
resp.search_params['amount'],

View file

@ -111,8 +111,9 @@ filter_mapping = {0: 'off', 1: 'medium', 2: 'high'}
# specific xpath variables
# ------------------------
# google results are grouped into <div class="g" ../>
results_xpath = '//div[@class="g"]'
# google results are grouped into <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
g_section_with_header = './g-section-with-header'
@ -124,8 +125,8 @@ title_xpath = './/h3[1]'
# href=...>
href_xpath = './/div[@class="yuRUbf"]//a/@href'
# in the result group there is <div class="IsZvec" ../> containing he *content*
content_xpath = './/div[@class="IsZvec"]'
# in the result group there is <div class="VwiC3b ..." ../> containing the *content*
content_xpath = './/div[contains(@class, "VwiC3b")]'
# Suggestions are links placed in a *card-section*, we extract only the text
# from the links not the links itself.
@ -336,7 +337,12 @@ def response(resp):
logger.error(e, exc_info=True)
# 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*
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)
if title_tag is None:
# 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
title = extract_text(title_tag)
url = eval_xpath_getindex(result, href_xpath, 0, None)
if url is None:
continue
content = extract_text(eval_xpath_getindex(result, content_xpath, 0, default=None), allow_none=True)
if content is None:
logger.debug('ingoring item from the result_xpath list: missing content of title "%s"', title)
continue
logger.debug('add link to results: %s', title)
results.append({'url': url, 'title': title, 'content': content})
except Exception as e: # pylint: disable=broad-except
logger.error(e, exc_info=True)
# from lxml import etree
# logger.debug(etree.tostring(result, pretty_print=True))
# import pdb
# pdb.set_trace()
continue
# parse suggestion

View file

@ -3,12 +3,10 @@
INA (Videos)
"""
from json import loads
from html import unescape
from urllib.parse import urlencode
from lxml import html
from dateutil import parser
from searx.utils import extract_text
from searx.utils import extract_text, eval_xpath, eval_xpath_list, eval_xpath_getindex
# about
about = {
@ -24,25 +22,24 @@ about = {
# engine dependent config
categories = ['videos']
paging = True
page_size = 48
page_size = 12
# search-url
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
results_xpath = '//div[contains(@class,"search-results--list")]//div[@class="media-body"]'
results_xpath = '//div[@id="searchHits"]/div'
url_xpath = './/a/@href'
title_xpath = './/h3[@class="h3--title media-heading"]'
thumbnail_xpath = './/img/@src'
publishedDate_xpath = './/span[@class="broadcast"]'
content_xpath = './/p[@class="media-body__summary"]'
title_xpath = './/div[contains(@class,"title-bloc-small")]'
content_xpath = './/div[contains(@class,"sous-titre-fonction")]'
thumbnail_xpath = './/img/@data-src'
publishedDate_xpath = './/div[contains(@class,"dateAgenda")]'
# do search-request
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
@ -51,26 +48,17 @@ def response(resp):
results = []
# we get html in a JSON container...
response = loads(resp.text)
dom = html.fromstring(response)
dom = html.fromstring(resp.text)
# parse results
for result in dom.xpath(results_xpath):
videoid = result.xpath(url_xpath)[0]
url = base_url + videoid
title = unescape(extract_text(result.xpath(title_xpath)))
try:
thumbnail = extract_text(result.xpath(thumbnail_xpath)[0])
except:
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))
for result in eval_xpath_list(dom, results_xpath):
url_relative = eval_xpath_getindex(result, url_xpath, 0)
url = base_url + url_relative
title = unescape(extract_text(eval_xpath(result, title_xpath)))
thumbnail = extract_text(eval_xpath(result, thumbnail_xpath))
content = extract_text(eval_xpath(result, publishedDate_xpath)) + extract_text(
eval_xpath(result, content_xpath)
)
# append result
results.append(
@ -79,7 +67,6 @@ def response(resp):
'title': title,
'content': content,
'template': 'videos.html',
'publishedDate': publishedDate,
'thumbnail': thumbnail,
}
)

View file

@ -11,6 +11,7 @@ import mysql.connector # pylint: disable=import-error
engine_type = 'offline'
auth_plugin = 'caching_sha2_password'
host = "127.0.0.1"
port = 3306
database = ""
username = ""
password = ""
@ -35,6 +36,7 @@ def init(engine_settings):
user=username,
password=password,
host=host,
port=port,
auth_plugin=auth_plugin,
)

View file

@ -1,16 +1,28 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Startpage (Web)
# lint: pylint
"""Startpage (Web)
"""
from lxml import html
from dateutil import parser
from datetime import datetime, timedelta
import re
from time import time
from urllib.parse import urlencode
from unicodedata import normalize, combining
from datetime import datetime, timedelta
from dateutil import parser
from lxml import html
from babel import Locale
from babel.localedata import locale_identifiers
from searx.network import get
from searx.utils import extract_text, eval_xpath, match_language
from searx.exceptions import (
SearxEngineResponseException,
SearxEngineCaptchaException,
)
# about
about = {
@ -33,7 +45,7 @@ supported_languages_url = 'https://www.startpage.com/do/settings'
# search-url
base_url = 'https://startpage.com/'
search_url = base_url + 'do/search'
search_url = base_url + 'sp/search?'
# specific xpath variables
# 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"]'
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
def request(query, params):
params['url'] = search_url
params['method'] = 'POST'
params['data'] = {
# pylint: disable=line-too-long
# The format string from Startpage's FFox add-on [1]::
#
# 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,
'page': params['pageno'],
'cat': 'web',
'cmd': 'process_search',
'engine0': 'v1all',
# 'pl': 'ext-ff',
# 'extVersion': '1.3.0',
# 'abp': "-1",
'sc': get_sc_code(params['headers']),
}
# set language if specified
@ -61,9 +129,10 @@ def request(query, params):
lang_code = match_language(params['language'], supported_languages, fallback=None)
if lang_code:
language_name = supported_languages[lang_code]['alias']
params['data']['language'] = language_name
params['data']['lui'] = language_name
args['language'] = language_name
args['lui'] = language_name
params['url'] = search_url + urlencode(args)
return params
@ -134,10 +203,11 @@ def response(resp):
# get supported languages from their site
def _fetch_supported_languages(resp):
# startpage's language selector is a mess
# each option has a displayed name and a value, either of which may represent the language name
# in the native script, the language name in English, an English transliteration of the native name,
# the English name of the writing script used by the language, or occasionally something else entirely.
# startpage's language selector is a mess each option has a displayed name
# and a value, either of which may represent the language name in the native
# script, the language name in English, an English transliteration of the
# 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
language_names = {
@ -151,7 +221,15 @@ def _fetch_supported_languages(resp):
}
# 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
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):
supported_languages[lang_code] = {'alias': sp_option_value}
elif isinstance(lang_code, list):
for lc in lang_code:
supported_languages[lc] = {'alias': sp_option_value}
for _lc in lang_code:
supported_languages[_lc] = {'alias': sp_option_value}
else:
print('Unknown language option in Startpage: {} ({})'.format(sp_option_value, sp_option_text))

103
searx/engines/tineye.py Normal file
View 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

View file

@ -1,10 +1,12 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""
1x (Images)
# lint: pylint
"""1x (Images)
"""
from lxml import html, etree
from urllib.parse import urlencode, urljoin
from lxml import html, etree
from searx.utils import extract_text, eval_xpath_list, eval_xpath_getindex
# about
@ -38,13 +40,14 @@ def request(query, params):
def response(resp):
results = []
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')
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'))
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
results.append(
{

View file

@ -16,6 +16,9 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
'''
from typing import Optional, Union
class SearxException(Exception):
pass
@ -35,7 +38,7 @@ class SearxParameterException(SearxException):
class SearxSettingsException(SearxException):
"""Error while loading the settings"""
def __init__(self, message, filename):
def __init__(self, message: Union[str, Exception], filename: Optional[str]):
super().__init__(message)
self.message = message
self.filename = filename

71
searx/help/about.md Normal file
View 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

View file

@ -5,40 +5,18 @@
import asyncio
import threading
import concurrent.futures
from queue import SimpleQueue
from types import MethodType
from timeit import default_timer
from typing import Iterable, Tuple
import httpx
import anyio
import h2.exceptions
from .network import get_network, initialize, check_network_configuration
from .client import get_loop
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()
"""Thread-local data is data for thread specific values."""
@ -210,7 +188,7 @@ def _close_response_method(self):
continue
def stream(method, url, **kwargs):
def stream(method, url, **kwargs) -> Tuple[httpx.Response, Iterable[bytes]]:
"""Replace httpx.stream.
Usage:

View file

@ -4,7 +4,9 @@
import asyncio
import logging
from ssl import SSLContext
import threading
from typing import Any, Dict
import httpx
from httpx_socks import AsyncProxyTransport
@ -23,7 +25,7 @@ else:
logger = logger.getChild('searx.network.client')
LOOP = None
SSLCONTEXTS = {}
SSLCONTEXTS: Dict[Any, SSLContext] = {}
TRANSPORT_KWARGS = {
'trust_env': False,
}

View file

@ -7,6 +7,7 @@ import atexit
import asyncio
import ipaddress
from itertools import cycle
from typing import Dict
import httpx
@ -16,7 +17,7 @@ from .client import new_client, get_loop, AsyncHTTPTransportNoHttp
logger = logger.getChild('network')
DEFAULT_NAME = '__DEFAULT__'
NETWORKS = {}
NETWORKS: Dict[str, 'Network'] = {}
# requests compatibility when reading proxy settings from settings.yml
PROXY_PATTERN_MAPPING = {
'http': 'http://',
@ -166,13 +167,14 @@ class Network:
for transport in client._mounts.values(): # pylint: disable=protected-access
if isinstance(transport, AsyncHTTPTransportNoHttp):
continue
if not getattr(transport, '_rdns', False):
result = False
break
else:
response = await client.get('https://check.torproject.org/api/ip')
if not response.json()['IsTor']:
result = False
if getattr(transport, "_pool") and getattr(
transport._pool, "_rdns", False # pylint: disable=protected-access
):
continue
return False
response = await client.get("https://check.torproject.org/api/ip", timeout=10)
if not response.json()["IsTor"]:
result = False
Network._TOR_CHECK_RESULT[proxies] = result
return result

View file

@ -10,7 +10,7 @@ from os.path import abspath, basename, dirname, exists, join
from shutil import copyfile
from pkgutil import iter_modules
from logging import getLogger
from typing import List
from typing import List, Tuple
from searx import logger, settings
@ -22,6 +22,9 @@ class Plugin: # pylint: disable=too-few-public-methods
name: str
description: str
default_on: bool
js_dependencies: Tuple[str]
css_dependencies: Tuple[str]
preference_section: str
logger = logger.getChild("plugins")

View file

@ -2,7 +2,9 @@ import re
from collections import defaultdict
from operator import itemgetter
from threading import RLock
from typing import List, NamedTuple, Set
from urllib.parse import urlparse, unquote
from searx import logger
from searx.engines import engines
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'])
class Timing(NamedTuple):
engine: str
total: float
load: float
class UnresponsiveEngine(NamedTuple):
engine: str
error_type: str
suspended: bool
class ResultContainer:
"""docstring for ResultContainer"""
@ -168,8 +182,8 @@ class ResultContainer:
self.engine_data = defaultdict(dict)
self._closed = False
self.paging = False
self.unresponsive_engines = set()
self.timings = []
self.unresponsive_engines: Set[UnresponsiveEngine] = set()
self.timings: List[Timing] = []
self.redirect_url = None
self.on_result = lambda _: True
self._lock = RLock()
@ -401,17 +415,12 @@ class ResultContainer:
return 0
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:
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):
timing = {
'engine': engines[engine_name].shortcut,
'total': engine_time,
'load': page_load_time,
}
self.timings.append(timing)
def add_timing(self, engine_name: str, engine_time: float, page_load_time: float):
self.timings.append(Timing(engine_name, total=engine_time, load=page_load_time))
def get_timings(self):
return self.timings

View file

@ -1,6 +1,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint
# pylint: disable=missing-module-docstring
# pyright: strict
import json
import random
@ -8,6 +9,8 @@ import time
import threading
import os
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.exceptions import SearxSettingsException
@ -20,17 +23,58 @@ CHECKER_RESULT = 'CHECKER_RESULT'
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):
every = (every, every)
return (every, every)
if (
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[1], int)
):
raise SearxSettingsException(error_msg, None)
return every
return (every[0], every[1])
def _get_every():
@ -38,25 +82,27 @@ def _get_every():
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)
if serialized_result is not None:
return json.loads(serialized_result)
return {'status': 'unknown'}
def _set_result(result, include_timestamp=True):
if include_timestamp:
result['timestamp'] = int(time.time() / 3600) * 3600
def _set_result(result: CheckerResult):
storage.set_str(CHECKER_RESULT, json.dumps(result))
def _timestamp():
return int(time.time() / 3600) * 3600
def run():
if not running.acquire(blocking=False): # pylint: disable=consider-using-with
return
try:
logger.info('Starting checker')
result = {'status': 'ok', 'engines': {}}
result: CheckerOk = {'status': 'ok', 'engines': {}, 'timestamp': _timestamp()}
for name, processor in PROCESSORS.items():
logger.debug('Checking %s engine', name)
checker = Checker(processor)
@ -69,7 +115,7 @@ def run():
_set_result(result)
logger.info('Check done')
except Exception: # pylint: disable=broad-except
_set_result({'status': 'error'})
_set_result({'status': 'error', 'timestamp': _timestamp()})
logger.exception('Error while running the checker')
finally:
running.release()
@ -89,7 +135,7 @@ def _start_scheduling():
run()
def _signal_handler(_signum, _frame):
def _signal_handler(_signum: int, _frame: Any):
t = threading.Thread(target=run)
t.daemon = True
t.start()
@ -102,7 +148,7 @@ def initialize():
signal.signal(signal.SIGUSR1, _signal_handler)
# disabled by default
_set_result({'status': 'disabled'}, include_timestamp=False)
_set_result({'status': 'disabled'})
# special case when debug is activate
if searx_debug and settings.get('checker', {}).get('off_when_debug', True):
@ -116,7 +162,7 @@ def initialize():
return
#
_set_result({'status': 'unknown'}, include_timestamp=False)
_set_result({'status': 'unknown'})
start_after = scheduling.get('start_after', (300, 1800))
start_after = _get_interval(start_after, 'checker.scheduling.start_after is not a int or list')

View file

@ -74,7 +74,7 @@ def _download_and_check_if_image(image_url: str) -> bool:
try:
# use "image_proxy" (avoid HTTP/2)
network.set_context_network_name('image_proxy')
stream = network.stream(
r, stream = network.stream(
'GET',
image_url,
timeout=10.0,
@ -91,7 +91,6 @@ def _download_and_check_if_image(image_url: str) -> bool:
'Cache-Control': 'max-age=0',
},
)
r = next(stream)
r.close()
if r.status_code == 200:
is_image = r.headers.get('content-type', '').startswith('image/')

View file

@ -11,10 +11,12 @@ __all__ = [
'OnlineProcessor',
'OnlineDictionaryProcessor',
'OnlineCurrencyProcessor',
'OnlineUrlSearchProcessor',
'PROCESSORS',
]
import threading
from typing import Dict
from searx import logger
from searx import engines
@ -23,16 +25,23 @@ from .online import OnlineProcessor
from .offline import OfflineProcessor
from .online_dictionary import OnlineDictionaryProcessor
from .online_currency import OnlineCurrencyProcessor
from .online_url_search import OnlineUrlSearchProcessor
from .abstract import EngineProcessor
logger = logger.getChild('search.processors')
PROCESSORS = {}
PROCESSORS: Dict[str, EngineProcessor] = {}
"""Cache request processores, stored by *engine-name* (:py:func:`initialize`)"""
def get_processor_class(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:
return c
return None

View file

@ -8,6 +8,7 @@
import threading
from abc import abstractmethod, ABC
from timeit import default_timer
from typing import Dict, Union
from searx import settings, logger
from searx.engines import engines
@ -17,7 +18,7 @@ from searx.exceptions import SearxEngineAccessDeniedException, SearxEngineRespon
from searx.utils import get_engine_from_settings
logger = logger.getChild('searx.search.processor')
SUSPENDED_STATUS = {}
SUSPENDED_STATUS: Dict[Union[int, str], 'SuspendedStatus'] = {}
class SuspendedStatus:
@ -61,7 +62,7 @@ class EngineProcessor(ABC):
__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_name = engine_name
self.logger = engines[engine_name].logger

View 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

View file

@ -483,6 +483,11 @@ engines:
timeout: 3.0
disabled: true
- name: tineye
engine: tineye
shortcut: tin
timeout: 9.0
- name: etymonline
engine: xpath
paging: true
@ -777,11 +782,16 @@ engines:
- name: 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:
- https://invidious.tube/
- https://invidious.snopyta.org/
- https://vid.puffyan.us/
- https://invidious.kavin.rocks/
- https://invidio.xamh.de/
- https://inv.riverside.rocks/
shortcut: iv
timeout: 5.0
timeout: 3.0
disabled: true
- name: kickass
@ -1455,7 +1465,7 @@ engines:
# Or you can use the html non-stable engine, activated by default
engine: wolframalpha_noapi
timeout: 6.0
categories: science
categories: []
- name: dictzone
engine: dictzone

View file

@ -20,6 +20,7 @@ A redis DB connect can be tested by::
"""
import logging
import redis
from searx import get_setting
logger = logging.getLogger('searx.shared.redis')
@ -28,8 +29,6 @@ _client = None
def client():
global _client # pylint: disable=global-statement
import redis # pylint: disable=import-error, import-outside-toplevel
if _client is None:
# not thread safe: in the worst case scenario, two or more clients are
# initialized only one is kept, the others are garbage collected.
@ -38,8 +37,6 @@ def client():
def init():
import redis # pylint: disable=import-error, import-outside-toplevel
try:
c = client()
logger.info("connected redis DB --> %s", c.acl_whoami())

View file

@ -1,20 +1,22 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# pyright: strict
from abc import ABC, abstractmethod
from typing import Optional
class SharedDict(ABC):
@abstractmethod
def get_int(self, key):
def get_int(self, key: str) -> Optional[int]:
pass
@abstractmethod
def set_int(self, key, value):
def set_int(self, key: str, value: int):
pass
@abstractmethod
def get_str(self, key):
def get_str(self, key: str) -> Optional[str]:
pass
@abstractmethod
def set_str(self, key, value):
def set_str(self, key: str, value: str):
pass

View file

@ -1,6 +1,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
import threading
from typing import Optional
from . import shared_abstract
@ -12,16 +13,16 @@ class SimpleSharedDict(shared_abstract.SharedDict):
def __init__(self):
self.d = {}
def get_int(self, key):
def get_int(self, key: str) -> Optional[int]:
return self.d.get(key, None)
def set_int(self, key, value):
def set_int(self, key: str, value: int):
self.d[key] = value
def get_str(self, key):
def get_str(self, key: str) -> Optional[str]:
return self.d.get(key, None)
def set_str(self, key, value):
def set_str(self, key: str, value: str):
self.d[key] = value

View file

@ -1,6 +1,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
import time
from typing import Optional
import uwsgi # pylint: disable=E0401
from . import shared_abstract
@ -9,25 +10,25 @@ _last_signal = 10
class UwsgiCacheSharedDict(shared_abstract.SharedDict):
def get_int(self, key):
def get_int(self, key: str) -> Optional[int]:
value = uwsgi.cache_get(key)
if value is None:
return value
else:
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')
uwsgi.cache_update(key, b)
def get_str(self, key):
def get_str(self, key: str) -> Optional[str]:
value = uwsgi.cache_get(key)
if value is None:
return value
else:
return value.decode('utf-8')
def set_str(self, key, value):
def set_str(self, key: str, value: str):
b = value.encode('utf-8')
uwsgi.cache_update(key, b)

View file

@ -4,7 +4,7 @@
* (C) Copyright Contributors to the searx project (2014 - 2021).
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
window.searxng=function(t){"use strict";t.getElementsByTagName("html")[0].className="js";var e=t.currentScript||(e=t.getElementsByTagName("script"))[e.length-1];return{autocompleter:"true"===e.getAttribute("data-autocompleter"),method:e.getAttribute("data-method"),translations:JSON.parse(e.getAttribute("data-translations"))}}(document),
window.searxng=function(t){"use strict";t.getElementsByTagName("html")[0].className="js";t=t.currentScript||(t=t.getElementsByTagName("script"))[t.length-1];return{autocompleter:"true"===t.getAttribute("data-autocompleter"),method:t.getAttribute("data-method"),translations:JSON.parse(t.getAttribute("data-translations"))}}(document),
/**
* @license
* (C) Copyright Contributors to the SearXNG project.
@ -20,7 +20,7 @@ $(document).ready(function(){var t,a="";searxng.autocompleter&&((t=new Bloodhoun
* (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
$(document).ready(function(){$("#q.autofocus").focus(),$("#clear_search").click(function(){document.getElementById("q").value=""}),$(".select-all-on-click").click(function(){$(this).select()}),$(".btn-collapse").click(function(){var t=$(this).data("btn-text-collapsed"),e=$(this).data("btn-text-not-collapsed");""!==t&&""!==e&&(new_html=$(this).hasClass("collapsed")?$(this).html().replace(t,e):$(this).html().replace(e,t),$(this).html(new_html))}),$(".btn-toggle .btn").click(function(){var t="btn-"+$(this).data("btn-class"),e=$(this).data("btn-label-default"),a=$(this).data("btn-label-toggled");""!==a&&(new_html=$(this).hasClass("btn-default")?$(this).html().replace(e,a):$(this).html().replace(a,e),$(this).html(new_html)),$(this).toggleClass(t),$(this).toggleClass("btn-default")}),$(".media-loader").click(function(){var t=$(this).data("target"),e=$(t+" > iframe"),t=e.attr("src");void 0!==t&&!1!==t||e.attr("src",e.data("src"))}),$(".btn-sm").dblclick(function(){var t="btn-"+$(this).data("btn-class");$(this).hasClass("btn-default")?($(".btn-sm > input").attr("checked","checked"),$(".btn-sm > input").prop("checked",!0),$(".btn-sm").addClass(t),$(".btn-sm").addClass("active"),$(".btn-sm").removeClass("btn-default")):($(".btn-sm > input").attr("checked",""),$(".btn-sm > input").removeAttr("checked"),$(".btn-sm > input").checked=!1,$(".btn-sm").removeClass(t),$(".btn-sm").removeClass("active"),$(".btn-sm").addClass("btn-default"))}),$(".nav-tabs").click(function(t){$(t.target).parents("ul").children().attr("aria-selected","false"),$(t.target).parent().attr("aria-selected","true")}),searxng.image_thumbnail_layout=new searxng.ImageLayout("#main_results","#main_results .result-images","img.img-thumbnail",15,3,200),searxng.image_thumbnail_layout.watch()}),
$(document).ready(function(){$("#q.autofocus").focus(),$("#clear_search").click(function(){document.getElementById("q").value=""}),$(".select-all-on-click").click(function(){$(this).select()}),$(".btn-collapse").click(function(){var t=$(this).data("btn-text-collapsed"),e=$(this).data("btn-text-not-collapsed");""!==t&&""!==e&&(new_html=$(this).hasClass("collapsed")?$(this).html().replace(t,e):$(this).html().replace(e,t),$(this).html(new_html))}),$(".btn-toggle .btn").click(function(){var t="btn-"+$(this).data("btn-class"),e=$(this).data("btn-label-default"),a=$(this).data("btn-label-toggled");""!==a&&(new_html=$(this).hasClass("btn-default")?$(this).html().replace(e,a):$(this).html().replace(a,e),$(this).html(new_html)),$(this).toggleClass(t),$(this).toggleClass("btn-default")}),$(".media-loader").click(function(){var t=$(this).data("target"),t=$(t+" > iframe"),e=t.attr("src");void 0!==e&&!1!==e||t.attr("src",t.data("src"))}),$(".btn-sm").dblclick(function(){var t="btn-"+$(this).data("btn-class");$(this).hasClass("btn-default")?($(".btn-sm > input").attr("checked","checked"),$(".btn-sm > input").prop("checked",!0),$(".btn-sm").addClass(t),$(".btn-sm").addClass("active"),$(".btn-sm").removeClass("btn-default")):($(".btn-sm > input").attr("checked",""),$(".btn-sm > input").removeAttr("checked"),$(".btn-sm > input").checked=!1,$(".btn-sm").removeClass(t),$(".btn-sm").removeClass("active"),$(".btn-sm").addClass("btn-default"))}),$(".nav-tabs").click(function(t){$(t.target).parents("ul").children().attr("aria-selected","false"),$(t.target).parent().attr("aria-selected","true")}),searxng.image_thumbnail_layout=new searxng.ImageLayout("#main_results","#main_results .result-images","img.img-thumbnail",15,3,200),searxng.image_thumbnail_layout.watch()}),
/**
* @license
* (C) Copyright Contributors to the SearXNG project.
@ -35,7 +35,7 @@ window.addEventListener("load",function(){$(".infobox").each(function(){var t=$(
* (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
$(document).ready(function(){$(".searxng_init_map").on("click",function(t){var e=$(this).data("leaflet-target"),a=$(this).data("map-lon"),n=$(this).data("map-lat"),i=$(this).data("map-zoom"),s=$(this).data("map-boundingbox"),o=$(this).data("map-geojson");s&&(southWest=L.latLng(s[0],s[2]),northEast=L.latLng(s[1],s[3]),map_bounds=L.latLngBounds(southWest,northEast)),L.Icon.Default.imagePath="./static/themes/oscar/css/images/";var r=L.map(e),e=new L.TileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{minZoom:1,maxZoom:19,attribution:'Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors'});new L.TileLayer("https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",{minZoom:1,maxZoom:19,attribution:'Wikimedia maps beta | Maps data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors'});setTimeout(function(){map_bounds?r.fitBounds(map_bounds,{maxZoom:17}):a&&n&&(i?r.setView(new L.LatLng(n,a),i):r.setView(new L.LatLng(n,a),8))},0),r.addLayer(e),L.control.layers({"OSM Mapnik":e}).addTo(r),o&&L.geoJson(o).addTo(r),$(this).off(t)})}),
$(document).ready(function(){$(".searxng_init_map").on("click",function(t){var e=$(this).data("leaflet-target"),a=$(this).data("map-lon"),n=$(this).data("map-lat"),i=$(this).data("map-zoom"),s=$(this).data("map-boundingbox"),o=$(this).data("map-geojson"),r=(s&&(southWest=L.latLng(s[0],s[2]),northEast=L.latLng(s[1],s[3]),map_bounds=L.latLngBounds(southWest,northEast)),L.Icon.Default.imagePath="./static/themes/oscar/css/images/",L.map(e)),s=new L.TileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{minZoom:1,maxZoom:19,attribution:'Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors'}),e=(new L.TileLayer("https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",{minZoom:1,maxZoom:19,attribution:'Wikimedia maps beta | Maps data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors'}),setTimeout(function(){map_bounds?r.fitBounds(map_bounds,{maxZoom:17}):a&&n&&(i?r.setView(new L.LatLng(n,a),i):r.setView(new L.LatLng(n,a),8))},0),r.addLayer(s),{"OSM Mapnik":s});L.control.layers(e).addTo(r),o&&L.geoJson(o).addTo(r),$(this).off(t)})}),
/**
* @license
* (C) Copyright Contributors to the SearXNG project.
@ -71,5 +71,5 @@ $(document).ready(function(){$("#allow-all-engines").click(function(){$(".onoffs
* );
* searxng.image_thumbnail_layout.watch();
*/
function(r,c){function t(t,e,a,n,i,s){this.container_selector=t,this.results_selector=e,this.img_selector=a,this.verticalMargin=n,this.horizontalMargin=i,this.maxHeight=s,this.isAlignDone=!0}t.prototype._getHeigth=function(t,e){for(var a,n=0,i=0;i<t.length;i++)0<(a=t[i]).naturalWidth&&0<a.naturalHeight?n+=a.naturalWidth/a.naturalHeight:n+=1;return(e-t.length*this.verticalMargin)/n},t.prototype._setSize=function(t,e){for(var a,n,i=t.length,s=0;s<i;s++)a=0<(n=t[s]).naturalWidth&&0<n.naturalHeight?e*n.naturalWidth/n.naturalHeight:e,n.style.width=a+"px",n.style.height=e+"px",n.style.marginLeft=this.horizontalMargin+"px",n.style.marginTop=this.horizontalMargin+"px",n.style.marginRight=this.verticalMargin-7+"px",n.style.marginBottom=this.verticalMargin-7+"px",(n=n.parentNode.parentNode).classList.contains("js")||n.classList.add("js")},t.prototype._alignImgs=function(t){for(var e,a,n,i,s=c.querySelector(this.container_selector),o=window.getComputedStyle(s),r=parseInt(o.getPropertyValue("padding-left"),10),o=parseInt(o.getPropertyValue("padding-right"),10),l=s.clientWidth-r-o;0<t.length;){for(e=!0,n=1;n<=t.length&&e;n++)a=t.slice(0,n),(i=this._getHeigth(a,l))<this.maxHeight&&(this._setSize(a,i),t=t.slice(n),e=!1);if(e){this._setSize(a,Math.min(this.maxHeight,i));break}}},t.prototype.align=function(){for(var t=c.querySelectorAll(this.results_selector),e=t.length,a=null,n=null,i=[],s=0;s<e;s++)(n=t[s]).previousElementSibling!==a&&0<i.length&&(this._alignImgs(i),i=[]),i.push(n.querySelector(this.img_selector)),a=n;0<i.length&&this._alignImgs(i)},t.prototype.watch=function(){var t,e,a=this,n=c.querySelectorAll(this.results_selector),i=n.length;function s(t){t.originalTarget.src=r.searxng.static_path+r.searxng.theme.img_load_error}function o(){a.isAlignDone&&(a.isAlignDone=!1,setTimeout(function(){a.align(),a.isAlignDone=!0},100))}for(r.addEventListener("pageshow",o),r.addEventListener("load",o),r.addEventListener("resize",o),t=0;t<i;t++)null!=(e=n[t].querySelector(this.img_selector))&&(e.addEventListener("load",o),e.addEventListener("error",o),r.searxng.theme.img_load_error&&e.addEventListener("error",s,{once:!0}))},r.searxng.ImageLayout=t}(window,document);
function(r,c){function t(t,e,a,n,i,s){this.container_selector=t,this.results_selector=e,this.img_selector=a,this.verticalMargin=n,this.horizontalMargin=i,this.maxHeight=s,this.isAlignDone=!0}t.prototype._getHeigth=function(t,e){for(var a,n=0,i=0;i<t.length;i++)0<(a=t[i]).naturalWidth&&0<a.naturalHeight?n+=a.naturalWidth/a.naturalHeight:n+=1;return(e-t.length*this.verticalMargin)/n},t.prototype._setSize=function(t,e){for(var a,n,i=t.length,s=0;s<i;s++)n=0<(a=t[s]).naturalWidth&&0<a.naturalHeight?e*a.naturalWidth/a.naturalHeight:e,a.style.width=n+"px",a.style.height=e+"px",a.style.marginLeft=this.horizontalMargin+"px",a.style.marginTop=this.horizontalMargin+"px",a.style.marginRight=this.verticalMargin-7+"px",a.style.marginBottom=this.verticalMargin-7+"px",(n=a.parentNode.parentNode).classList.contains("js")||n.classList.add("js")},t.prototype._alignImgs=function(t){for(var e,a,n,i,s=c.querySelector(this.container_selector),o=window.getComputedStyle(s),r=parseInt(o.getPropertyValue("padding-left"),10),o=parseInt(o.getPropertyValue("padding-right"),10),l=s.clientWidth-r-o;0<t.length;){for(e=!0,n=1;n<=t.length&&e;n++)a=t.slice(0,n),(i=this._getHeigth(a,l))<this.maxHeight&&(this._setSize(a,i),t=t.slice(n),e=!1);if(e){this._setSize(a,Math.min(this.maxHeight,i));break}}},t.prototype.align=function(){for(var t=c.querySelectorAll(this.results_selector),e=t.length,a=null,n=null,i=[],s=0;s<e;s++)(n=t[s]).previousElementSibling!==a&&0<i.length&&(this._alignImgs(i),i=[]),i.push(n.querySelector(this.img_selector)),a=n;0<i.length&&this._alignImgs(i)},t.prototype.watch=function(){var t,e,a=this,n=c.querySelectorAll(this.results_selector),i=n.length;function s(t){t.originalTarget.src=r.searxng.static_path+r.searxng.theme.img_load_error}function o(){a.isAlignDone&&(a.isAlignDone=!1,setTimeout(function(){a.align(),a.isAlignDone=!0},100))}for(r.addEventListener("pageshow",o),r.addEventListener("load",o),r.addEventListener("resize",o),t=0;t<i;t++)null!=(e=n[t].querySelector(this.img_selector))&&(e.addEventListener("load",o),e.addEventListener("error",o),r.searxng.theme.img_load_error&&e.addEventListener("error",s,{once:!0}))},r.searxng.ImageLayout=t}(window,document);
//# sourceMappingURL=searxng.min.js.map

File diff suppressed because one or more lines are too long

View file

@ -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
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -127,7 +127,7 @@ module.exports = function (grunt) {
},
files: [
{
src: ['src/less/style.less'],
src: ['src/less/style-ltr.less'],
dest: 'css/searxng.min.css',
nonull: true,
filter: file_exists,
@ -177,7 +177,7 @@ module.exports = function (grunt) {
'chevron-up-outline': 'node_modules/ionicons/dist/svg/chevron-up-outline.svg',
'chevron-right': 'node_modules/ionicons/dist/svg/chevron-forward-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',
'magnet-outline': 'node_modules/ionicons/dist/svg/magnet-outline.svg',
'globe-outline': 'node_modules/ionicons/dist/svg/globe-outline.svg',

File diff suppressed because one or more lines are too long

View file

@ -4,7 +4,8 @@
position: absolute;
max-height: 0;
overflow-y: hidden;
text-align: left;
.ltr-text-align-left();
.rounded-corners;
&:active,
@ -24,7 +25,7 @@
> li {
cursor: pointer;
padding: 8px 0 8px 8px;
padding: 0.5rem;
&.active,
&:active,

View file

@ -3,8 +3,8 @@
}
#main_results #results.only_template_images.image-detail-open #backToTop {
left: 56.75rem !important;
right: inherit;
.ltr-left(56.75rem) !important;
.ltr-right(inherit);
}
article.result-images .detail {
@ -15,8 +15,8 @@ article.result-images .detail {
display: flex;
flex-direction: column;
position: fixed;
left: 60rem;
right: 0;
.ltr-left(60rem);
.ltr-right(0);
top: @search-height;
transition: top 0.064s ease-in 0s;
bottom: 0;
@ -76,7 +76,7 @@ article.result-images .detail {
h4,
p,
a {
text-align: left;
.ltr-text-align-left();
}
p.result-content {
@ -113,20 +113,23 @@ article.result-images .detail {
a.result-detail-close {
top: 1rem;
left: 1rem;
.ltr-left(1rem);
padding: 0.4rem;
}
a.result-detail-previous {
top: 1rem;
right: 6rem;
.ltr-right(6rem);
// 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 {
top: 1rem;
right: 2rem;
.ltr-right(2rem);
padding: 0.4rem;
}
@ -186,7 +189,7 @@ article.result-images .detail {
.loader {
position: absolute;
top: 1rem;
right: 50%;
.ltr-right(50%);
border-top: 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);
@ -205,7 +208,7 @@ article.result-images .detail {
@media screen and (max-width: @tablet) {
#results.image-detail-open article.result-images[data-vim-selected] .detail {
top: 0;
left: 0;
.ltr-left(0);
a.result-images-source {
display: flex;
@ -219,7 +222,7 @@ article.result-images .detail {
}
a.result-detail-next {
right: 1rem;
.ltr-right(1rem);
}
}
}
@ -227,7 +230,7 @@ article.result-images .detail {
@media screen and (max-width: @phone) {
#results.image-detail-open article.result-images[data-vim-selected] .detail {
top: 0;
left: 0;
.ltr-left(0);
padding: 1rem;
a.result-images-source img {
@ -238,7 +241,7 @@ article.result-images .detail {
.result-images-labels p span {
width: inherit;
margin-right: 1rem;
.ltr-margin-right(1rem);
}
}
}

View file

@ -1,9 +1,5 @@
#main_index {
margin-top: 26vh;
#linkto_preferences {
right: 1.8rem;
}
}
.index {

View file

@ -1,6 +1,6 @@
#tab-contentquery table td,
#tab-contentquery table th {
text-align: left !important;
.ltr-text-align-right() !important;
height: 3rem;
}
@ -18,20 +18,23 @@
margin: 0;
padding: 5px 0 0 0;
display: block;
float: left;
.ltr-float-left();
width: 300px;
}
.value {
margin: 0;
padding: 0;
float: left;
.ltr-float-left();
width: 15em;
select,
input[type="text"] {
font-size: inherit !important;
margin: 0 1rem 0 0;
margin-top: 0;
.ltr-margin-right(1rem);
margin-bottom: 0;
.ltr-margin-left(0);
}
select {
@ -63,7 +66,7 @@
.description {
margin: 0;
padding: 5px 0 0 0;
float: left;
.ltr-float-right();
width: 50%;
color: var(--color-settings-engine-description-font);
font-size: 90%;
@ -79,6 +82,7 @@
table.cookies {
width: 100%;
direction: ltr;
th,
td {
@ -106,7 +110,7 @@
}
.category {
margin-right: 0.5rem;
.ltr-margin-right(0.5rem);
label {
border: 2px solid transparent;
@ -121,7 +125,7 @@
.name,
.shortcut {
text-align: left;
.ltr-text-align-left();
}
.preferences_back {
@ -153,7 +157,7 @@
th.name {
.engine-tooltip {
margin-top: 1.8rem;
left: calc((100% - 85em) / 2 + 10em);
.ltr-left(calc((100% - 85em) / 2 + 10em));
max-width: 40rem;
.engine-description {
@ -163,7 +167,7 @@
}
.engine-group {
text-align: left;
.ltr-text-align-left();
font-weight: normal;
background: var(--color-settings-engine-group-background);
}
@ -175,6 +179,6 @@
}
.engine-tooltip {
left: 10em !important;
.ltr-left(10em) !important;
}
}

View file

@ -8,7 +8,9 @@
}
#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;
background: var(--color-header-background);
border-bottom: 1px solid var(--color-header-border);
@ -24,7 +26,7 @@
.category {
display: inline-block;
position: relative;
margin-right: 1rem;
.ltr-margin-right(1rem);
padding: 0;
input {
@ -127,11 +129,11 @@
#q {
outline: medium none;
padding-left: 12px;
padding-right: 0 !important;
border-right: none;
.ltr-padding-left(12px);
.ltr-padding-right(0) !important;
.ltr-border-right(none);
width: @search-width;
border-radius: 10px 0 0 10px;
.ltr-rounded-left-corners(10px);
}
#q::-ms-clear,
@ -140,8 +142,8 @@
}
#send_search {
border-left: none;
border-radius: 0 10px 10px 0;
.ltr-border-left(none);
.ltr-rounded-right-corners(10px);
&:hover {
cursor: pointer;
@ -153,12 +155,15 @@
.no-js #clear_search,
.no-js #send_search {
width: auto !important;
border-left: 1px solid var(--color-search-border);
.ltr-border-left(1px solid var(--color-search-border));
padding: 10px;
}
.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 {
background-color: inherit;
@ -177,7 +182,10 @@
}
.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 {
@ -204,7 +212,7 @@
#categories {
width: 100%;
text-align: left;
.ltr-text-align-left();
overflow-x: scroll;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
@ -243,7 +251,7 @@
#main_results #q:placeholder-shown ~ #send_search {
margin-right: 2.6rem;
transition: margin-right 0.1s;
transition: margin-right 0.1s; // FIX RTL
}
.search_filters {

View 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";

View file

@ -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";
#search_submit {
left: 1px;
right: auto;
#q,
#sidebar .infobox dt bdi {
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;
}

View file

@ -33,6 +33,7 @@
vertical-align: bottom;
line-height: 1;
text-decoration: inherit;
.ltr-transform();
}
.ion-icon-small {
@ -78,9 +79,7 @@ main {
flex: 1;
}
#main_preferences,
#main_about,
#main_stats {
.page_with_header {
margin: 2em auto;
width: 85em;
}
@ -100,16 +99,8 @@ footer {
}
}
#main_preferences h1,
#main_stats h1 {
background: url('../img/searxng.png') no-repeat;
background-size: contain;
min-height: 40px;
margin: 0 auto;
span {
visibility: hidden;
}
.page_with_header .logo {
height: 40px;
}
input[type="submit"],
@ -139,8 +130,8 @@ a {
article[data-vim-selected] {
background: var(--color-result-vim-selected);
border-left: 0.2rem solid var(--color-result-vim-arrow);
.rounded-right-corners;
.ltr-border-left(0.2rem solid var(--color-result-vim-arrow));
.ltr-rounded-right-corners(10px);
}
article.result-images[data-vim-selected] {
@ -166,7 +157,7 @@ article[data-vim-selected].category-social {
.result {
margin: @results-margin 0;
padding: @result-padding;
border-left: 0.2rem solid transparent;
.ltr-border-left(0.2rem solid transparent);
h3 {
font-size: 1.2rem;
@ -264,15 +255,17 @@ article[data-vim-selected].category-social {
img {
&.thumbnail {
float: left;
padding: 0.6rem 1rem 0 0;
.ltr-float-left();
padding-top: 0.6rem;
.ltr-padding-right(1rem);
width: 20rem;
height: unset; // remove heigth value that was needed for lazy loading
}
&.image {
float: left;
padding: 0.6rem 1rem 0 0;
.ltr-float-left();
padding-top: 0.6rem;
.ltr-padding-right(1rem);
width: 7rem;
max-height: 7rem;
object-fit: scale-down;
@ -308,12 +301,15 @@ article[data-vim-selected].category-social {
}
.engines {
float: right;
.ltr-float-right();
color: var(--color-result-engines-font);
span {
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;
position: absolute;
bottom: 0;
right: 0;
.ltr-right(0);
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;
background-color: var(--color-result-image-span-background-hover);
font-size: 0.7em;
@ -367,7 +366,7 @@ article[data-vim-selected].category-social {
.result-map {
img.image {
float: right !important;
.ltr-float-right() !important;
height: 100px !important;
width: auto !important;
}
@ -382,12 +381,12 @@ article[data-vim-selected].category-social {
font-weight: inherit;
width: 17rem;
vertical-align: top;
text-align: left;
.ltr-text-align-left();
}
td {
vertical-align: top;
text-align: left;
.ltr-text-align-left();
}
}
}
@ -397,7 +396,10 @@ article[data-vim-selected].category-social {
}
#results {
margin: 1rem 2rem 0 @results-offset;
margin-top: 1rem;
.ltr-margin-right(2rem);
margin-bottom: 0;
.ltr-margin-left(@results-offset);
display: grid;
grid-template-columns: @results-width 25rem;
grid-template-rows: min-content min-content 1fr min-content;
@ -533,7 +535,10 @@ article[data-vim-selected].category-social {
dt {
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;
font-weight: bold;
}
@ -571,7 +576,7 @@ article[data-vim-selected].category-social {
#linkto_preferences {
position: absolute;
right: 10px;
.ltr-right(1.8rem);
top: 2.2rem;
padding: 0;
border: 0;
@ -608,7 +613,7 @@ article[data-vim-selected].category-social {
background: var(--color-backtotop-background);
position: fixed;
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;
opacity: 0;
.rounded-corners;
@ -632,9 +637,7 @@ article[data-vim-selected].category-social {
}
@media screen and (max-width: @tablet) {
#main_preferences,
#main_about,
#main_stats {
.page_with_header {
margin: 2rem 0.5rem;
width: auto;
}
@ -647,9 +650,12 @@ article[data-vim-selected].category-social {
clear: both;
img {
float: left;
.ltr-float-left();
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 {
float: right;
.ltr-float-right();
padding: 0 0 3px 0;
}
}
@ -750,12 +756,12 @@ article[data-vim-selected].category-social {
}
#backToTop {
left: auto;
right: 1rem;
.ltr-left(auto);
.ltr-right(1rem);
}
#pagination {
margin-right: 4rem;
.ltr-margin-right(4rem);
}
}
@ -767,12 +773,12 @@ article[data-vim-selected].category-social {
#linkto_preferences {
top: 0.8rem;
right: 0.7rem;
.ltr-right(0.7rem);
}
#main_index #linkto_preferences {
top: 0.5rem;
right: 0.5rem;
.ltr-right(0.5rem);
}
#results {

View file

@ -125,11 +125,11 @@ div.selectable_url {
padding: 1rem;
margin: 0 0 1em 0;
border: 1px solid var(--color-toolkit-dialog-border);
text-align: left;
.ltr-text-align-left();
.rounded-corners;
.close {
float: right;
.ltr-float-right();
position: relative;
top: -3px;
color: inherit;
@ -156,6 +156,10 @@ div.selectable_url {
td {
padding: 0 1em 0 0;
padding-top: 0;
.ltr-padding-right(1rem);
padding-bottom: 0;
.ltr-padding-left(0);
}
h4 {
@ -301,7 +305,10 @@ html body .tabs > input:checked {
/* -- select -- */
select {
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;
color: var(--color-search-font);
font-size: 0.9rem;

View file

@ -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 %}

View file

@ -1,5 +1,6 @@
{% extends "oscar/base.html" %}
{% block title %}{{ _('about') }} - {% endblock %}
{% block content %}
{% include '__common__/about.html' %}
{{ help.about | safe }}
{% include "__common__/aboutextend.html" ignore missing %}
{% endblock %}

View file

@ -1,4 +1,5 @@
{% extends 'simple/base.html' %}
{% extends 'simple/page_with_header.html' %}
{% block content %}
{% include '__common__/about.html' %}
{{ help.about | safe }}
{% include "__common__/aboutextend.html" ignore missing %}
{% endblock %}

View file

@ -35,7 +35,7 @@
<link rel="icon" href="{{ url_for('static', filename='img/favicon.svg') }}" type="image/svg+xml">
</head>
<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 %}
<div class="dialog-error" role="alert">
<a href="#" class="close" aria-label="close" title="close">×</a>
@ -47,6 +47,12 @@
</div>
{% 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 %}
{% endblock %}
</main>

View file

@ -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-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>',
'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>',
'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>',

View file

@ -4,7 +4,6 @@
<link rel="preload" href="{{ url_for('static', filename='img/searxng.png') }}" as="image" />
{% endblock %}
{% block content %}
<nav id="linkto_preferences"><a href="{{ url_for('preferences') }}">{{ icon_big('menu-outline') }}</a></nav>
<div class="index">
<div class="title"><h1>SearXNG</h1></div>
{% include 'simple/simple_search.html' %}

View file

@ -1,3 +1,5 @@
{% from 'simple/icons.html' import icon_small %}
<!-- Draw 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 }}">

View 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 %}

View file

@ -1,7 +1,7 @@
{% from 'simple/macros.html' import tabs_open, tabs_close, tab_header, tab_footer, checkbox_onoff, checkbox %}
{% from 'simple/icons.html' import icon_big %}
{% extends "simple/base.html" %}
{% extends "simple/page_with_header.html" %}
{%- macro plugin_preferences(section) -%}
{%- for plugin in plugins -%}
@ -94,11 +94,9 @@
{%- endmacro -%}
{% block head %} {% endblock %}
{% block linkto_preferences %}{% endblock %}
{% block content %}
<a href="{{ url_for('index') }}"><h1><span>SearXNG</span></h1></a>
<h2>{{ _('Preferences') }}</h2>
<h1>{{ _('Preferences') }}</h1>
<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.") }}
</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('index') }}">{{ _('back') }}</a></div>
<div class="{% if rtl %}left{% else %}right{% endif %} preferences_back"><a href="{{ url_for('index') }}">{{ _('Back') }}</a></div>
</form>
{% endblock %}

View file

@ -10,7 +10,6 @@
{% 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 }}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}&amp;pageno={{ pageno }}&amp;time_range={{ time_range }}&amp;language={{ current_language }}&amp;safesearch={{ safesearch }}&amp;format=rss">{% endblock %}
{% block content %}
<nav id="linkto_preferences"><a href="{{ url_for('preferences') }}">{{ icon_big('menu-outline') }}</a></nav>
{% include 'simple/search.html' %}
{% 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="theme" value="{{ theme }}" >
{% 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>
</form>
{% endif %}
@ -179,7 +178,7 @@
<input type="hidden" name="safesearch" value="{{ safesearch }}" >
<input type="hidden" name="theme" value="{{ theme }}" >
{% 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>
</form>
</nav>

View file

@ -1,7 +1,7 @@
{% from 'simple/icons.html' import icon_big %}
{% 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) -%}
{% if selected_engine_name %}
@ -15,10 +15,7 @@
{% block head %} {% endblock %}
{% block content %}
<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>
<h1>{% if selected_engine_name %}<a href="{{ url_for('stats') }}">{% endif %}{{ _('Engine stats') }}{% if selected_engine_name %}</a> - {{ selected_engine_name }}{% endif %}</h1>
{% if not engine_stats.get('time') %}
{{ _('There is currently no data available. ') }}

View file

@ -8,187 +8,188 @@
# d506c013dc1b502e7a53f91ebcbf8f29_985b4b3, 2017-2018
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-01-06 08:25+0000\n"
"PO-Revision-Date: 2021-12-31 07:17+0000\n"
"POT-Creation-Date: 2022-01-26 17:14+0000\n"
"PO-Revision-Date: 2022-01-28 07:16+0000\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-Team: Arabic "
"<https://weblate.bubu1.eu/projects/searxng/searxng/ar/>\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : "
"n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 4.10.1\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr "ملفات"
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr "الرئيسية"
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr "موسيقى"
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr "شبكات التواصل الإجتماعي"
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr "صور"
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr "فيديوهات"
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr "علوم و تكنولوجيا"
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr "أخبار"
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr "خرائط"
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr "onions"
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr "علوم"
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr ""
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr ""
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr ""
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr ""
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr ""
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr ""
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr "تلقائي"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr "فاتح"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr "مظلم"
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr "نفذ الوقت"
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr ""
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr "خطأ في بروتوكول HTTP"
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr "خطأ في الشبكة"
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr "تعطل غير متوقع"
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr "خطأ HTTP"
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr "خطأ في اتصال HTTP"
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr "خطأ في وكيل البروكسي"
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr ""
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr "الكثير من الطلبات"
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr ""
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr "خطأ في API الخادم"
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr "تعذر العثور على عناصر"
#: 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"
msgstr "المصدر"
#: searx/webapp.py:515 searx/webapp.py:925
#: searx/webapp.py:534 searx/webapp.py:941
msgid "Invalid settings, please edit your preferences"
msgstr "إنّ الإعدادات خاطئة، يرجى تعديل خياراتك"
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
msgstr "إعدادات غير صالحة"
#: searx/webapp.py:608 searx/webapp.py:683
#: searx/webapp.py:626 searx/webapp.py:701
msgid "search error"
msgstr "خطأ في البحث"
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr "قبل دقائق"
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "قبل {hours} ساعات، {minutes} دقائق"
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
msgstr "معلق"
@ -389,13 +390,13 @@ msgstr "ملف تورنت"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr "النسخة المخبأة"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr "النفاذ عبر البروكسي"
@ -523,7 +524,6 @@ msgstr "القوائم الإفتراضية"
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
msgstr "لغة البحث"
@ -611,12 +611,12 @@ msgstr "يقوم بتغيير لغة واجهة البحث"
#: searx/templates/oscar/preferences.html:210
#: searx/templates/simple/preferences.html:197
msgid "Theme"
msgstr ""
msgstr "السمة"
#: searx/templates/oscar/preferences.html:211
#: searx/templates/simple/preferences.html:205
msgid "Change SearXNG layout"
msgstr ""
msgstr "تغيير مظهر سيركس"
#: searx/templates/oscar/preferences.html:222
#: searx/templates/oscar/preferences.html:228
@ -660,10 +660,11 @@ msgstr "عرض روابط نتائج البحث في ألسنة جديدة لل
#: searx/templates/oscar/preferences.html:262
#: searx/templates/simple/preferences.html:237
msgid "Method"
msgstr "الطريقة"
msgid "HTTP Method"
msgstr ""
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
@ -678,7 +679,7 @@ msgstr "وكيل بروكسي الصور"
#: searx/templates/oscar/preferences.html:274
#: searx/templates/simple/preferences.html:256
msgid "Proxying image results through SearXNG"
msgstr ""
msgstr "تمرير نتائج البحث عن الصور عبر بروكسي SearXNG"
#: searx/templates/oscar/preferences.html:277
#: searx/templates/oscar/preferences.html:288
@ -717,7 +718,7 @@ msgstr "تعطيل الكل"
#: searx/templates/oscar/preferences.html:325
#: searx/templates/simple/preferences.html:280
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."
msgstr ""
@ -852,12 +853,10 @@ msgid ""
msgstr ""
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr "حفظ"
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr "العودة"
@ -901,13 +900,11 @@ msgstr "حاول البحث عن :"
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr "الصفحة التالية"
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr "الصفحة السابقة"
@ -986,7 +983,7 @@ msgstr ""
#: searx/templates/oscar/result_templates/files.html:35
#: searx/templates/oscar/stats.html:126 searx/templates/simple/stats.html:125
msgid "Filename"
msgstr ""
msgstr "اسم الملف"
#: searx/templates/oscar/stats.html:127 searx/templates/simple/stats.html:126
msgid "Function"
@ -1040,7 +1037,7 @@ msgstr ""
#: searx/templates/oscar/messages/first_time.html:7
msgid "It look like you are using SearXNG first time."
msgstr ""
msgstr "يظهر أنك تستخدم محرك سيركس لأول مرة."
#: searx/templates/oscar/messages/no_cookies.html:3
msgid "Information!"
@ -1064,6 +1061,8 @@ msgstr "لم تتمكن المحركات من العثور على أية نتي
#: searx/templates/simple/messages/no_results.html:15
msgid "Please, try again later or find another SearXNG instance."
msgstr ""
"يرجى إعادة المحاولة لاحقًا. إن كنت في عجلة من أمرك، ندعوك إلى البحث عن مثيل "
"خادم آخر لمحرك سيركس."
#: searx/templates/oscar/messages/no_results.html:17
#: searx/templates/simple/messages/no_results.html:20
@ -1239,10 +1238,26 @@ msgstr "محركات البحث المُستخدَمة حاليًا"
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1379,3 +1394,11 @@ msgstr "محرك"
#~ "can record this title."
#~ 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 ""

View file

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\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"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: bg\n"
@ -21,172 +21,172 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr "файлове"
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr "общо"
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr "музика"
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr "социална мрежа"
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr "изображения"
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr "видео"
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr "IT"
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr "новини"
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr "карта"
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr "onions"
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr "наука"
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr ""
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr ""
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr ""
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr ""
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr ""
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr ""
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr "автоматичен"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr "светъл"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr "тъмен"
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr "изчакване"
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr "грешка при анализа"
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr "Грешка в протокола HTTP"
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr "мрежова грешка"
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr "неочакван срив"
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr "HTTP грешка"
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr "HTTP грешка във връзката"
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr "прокси грешка"
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr "Кепча"
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr "твърде много искания"
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr "отказан достъп"
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr "грешка в API на сървъра"
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr "Не е намерен артикул"
#: 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"
msgstr "Източник"
#: searx/webapp.py:515 searx/webapp.py:925
#: searx/webapp.py:534 searx/webapp.py:941
msgid "Invalid settings, please edit your preferences"
msgstr "Неправилни настройки, моля проверете предпочитанията си."
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
msgstr "невалидни настройки"
#: searx/webapp.py:608 searx/webapp.py:683
#: searx/webapp.py:626 searx/webapp.py:701
msgid "search error"
msgstr "грешка при търсенето"
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr "преди {minutes} минута(минути)"
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "преди {hours} час(ове), {minutes} минута(минути)"
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
msgstr "преустановен"
@ -396,13 +396,13 @@ msgstr "торент файл"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr "кеширана"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr ""
@ -530,7 +530,6 @@ msgstr "Първоначални категории"
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
msgstr "Език на търсене"
@ -667,10 +666,11 @@ msgstr "Отвори връзките в нов раздел."
#: searx/templates/oscar/preferences.html:262
#: searx/templates/simple/preferences.html:237
msgid "Method"
msgstr "Метод"
msgid "HTTP Method"
msgstr ""
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
@ -724,7 +724,7 @@ msgstr ""
#: searx/templates/oscar/preferences.html:325
#: searx/templates/simple/preferences.html:280
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."
msgstr ""
@ -863,12 +863,10 @@ msgid ""
msgstr ""
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr "запази"
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr "назад"
@ -912,13 +910,11 @@ msgstr ""
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr "следваща страница"
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr "предишна страница"
@ -1250,10 +1246,26 @@ msgstr "Използвани търсачки в момента"
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1390,3 +1402,12 @@ msgstr "Търсачка"
#~ "can record this title."
#~ 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 ""

View file

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\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"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: bo\n"
@ -21,172 +21,172 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr "ཡིག་ཚགས།"
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr "དྲ་སྦྲེལ།"
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr "རོལ་མོ།"
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr "སྤྱི་འབྲེལ།"
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr "པར་རིས།"
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr "བརྙན་ཟློས།"
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr "ཆ་འཕྲིན་ལག་རྩལ།"
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr "གསར་འགྱུར།"
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr "ས་བཀྲ།"
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr ""
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr "ཚན་རིག"
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr ""
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr ""
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr ""
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr ""
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr ""
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr ""
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr ""
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr ""
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr ""
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr ""
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr ""
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr ""
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr ""
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr ""
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr ""
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr ""
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr ""
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr ""
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr ""
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr "རྣམ་གྲངས་གང་ཡང་རྙེད་རྒྱུ་མ་བྱུང་།"
#: 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"
msgstr ""
#: searx/webapp.py:515 searx/webapp.py:925
#: searx/webapp.py:534 searx/webapp.py:941
msgid "Invalid settings, please edit your preferences"
msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།ཁྱེད་ཀྱིས་གདམ་ཀ་ལ་བཅོས་སྒྲིག་གཏོང་རོགས།"
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།"
#: searx/webapp.py:608 searx/webapp.py:683
#: searx/webapp.py:626 searx/webapp.py:701
msgid "search error"
msgstr "འཚོལ་བཤེར་ལ་ནོར་འཁྲུལ་བྱུང་།"
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr "སྐར་མ་ {minutes} སྔོན་ལ།"
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "ཆུ་ཚོད་ {hours} དང་སྐར་མ {minutes} སྔོན་ལ།"
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
msgstr ""
@ -391,13 +391,13 @@ msgstr "ས་བོན་ཡིག་ཆ།"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr "འདྲ་བཤུས་རྒྱབ་ཚར།"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr "མངག་བཅོལ་བྱེད་ཟིན།"
@ -525,7 +525,6 @@ msgstr "གཞི་བཞག་གི་རིགས།"
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
msgstr "འཚོལ་བཤེར་ནང་དོན་མཚོན་བྱེད་ཀྱི་སྐད་རིགས།"
@ -662,10 +661,11 @@ msgstr "ཤོག་ངོས་གསར་བ་ཞིག་ནས་དྲ་
#: searx/templates/oscar/preferences.html:262
#: searx/templates/simple/preferences.html:237
msgid "Method"
msgstr "ཐབས་ཤེས།"
msgid "HTTP Method"
msgstr ""
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
@ -719,7 +719,7 @@ msgstr ""
#: searx/templates/oscar/preferences.html:325
#: searx/templates/simple/preferences.html:280
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."
msgstr ""
@ -854,12 +854,10 @@ msgid ""
msgstr ""
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr "གསོག་འཇོག"
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr "ཕྱིར་ལོག"
@ -903,13 +901,11 @@ msgstr "འཚོལ་བཤེར་ནང་དོན་ནི།"
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr "དྲ་ངོས་གཞུག་མ།"
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr "དྲ་ངོས་སྔོན་མ།"
@ -1241,10 +1237,26 @@ msgstr "ཉེ་ལམ་སྤྱད་ཟིན་པའི་འཚོལ་
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1385,3 +1397,12 @@ msgstr ""
#~ "can record this title."
#~ 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 ""

View file

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\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"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: ca\n"
@ -22,172 +22,172 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr "fitxers"
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr "general"
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr "música"
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr "xarxes socials"
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr "imatges"
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr "vídeos"
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr "informàtica"
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr "notícies"
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr "mapa"
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr ""
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr "ciència"
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr ""
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr ""
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr ""
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr ""
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr ""
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr ""
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr ""
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr ""
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr ""
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr ""
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr ""
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr ""
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr ""
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr ""
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr ""
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr ""
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr ""
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr ""
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr ""
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr "No s'ha trobat cap element"
#: 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"
msgstr ""
#: searx/webapp.py:515 searx/webapp.py:925
#: searx/webapp.py:534 searx/webapp.py:941
msgid "Invalid settings, please edit your preferences"
msgstr "La configuració no és vàlida, editeu-la"
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
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"
msgstr "error en la cerca"
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr "fa {minutes} minuts"
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "fa {hours} hores i {minutes} minuts"
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
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:73 searx/templates/oscar/macros.html:75
#: searx/templates/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr "en memòria cau"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr "en servidor intermediari"
@ -533,7 +533,6 @@ msgstr "Categories predeterminades"
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
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/simple/preferences.html:237
msgid "Method"
msgstr "Mètode"
msgid "HTTP Method"
msgstr ""
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
@ -732,7 +732,7 @@ msgstr ""
#: searx/templates/oscar/preferences.html:325
#: searx/templates/simple/preferences.html:280
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."
msgstr ""
@ -874,12 +874,10 @@ msgstr ""
"resultats."
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr "desa"
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr "enrere"
@ -923,13 +921,11 @@ msgstr "Proveu a cercar:"
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr "pàgina següent"
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr "pàgina anterior"
@ -1261,10 +1257,26 @@ msgstr "Motors de cerca usats actualment"
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1408,3 +1420,12 @@ msgstr ""
#~ "can record this title."
#~ 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 ""

View file

@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-01-06 08:25+0000\n"
"PO-Revision-Date: 2021-12-31 07:17+0000\n"
"POT-Creation-Date: 2022-01-26 17:14+0000\n"
"PO-Revision-Date: 2022-01-23 20:00+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: cs\n"
"Language-Team: Czech "
@ -24,172 +24,172 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr "soubory"
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr "obecné"
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr "hudba"
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr "sociální media"
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr "obrázky"
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr "videa"
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr "IT"
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr "zprávy"
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr "mapa"
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr "cibule"
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr "věda"
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr ""
msgstr "aplikace"
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr ""
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr ""
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr ""
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr ""
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr ""
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr "světlý"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr "tmavý"
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr ""
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr ""
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr "chyba HTTP protokolu"
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr "síťová chyba"
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr "nečekaná chyba"
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr "chyba HTTP"
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr ""
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr ""
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr ""
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr ""
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr "přístup odepřen"
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr ""
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr "Nic nenalezeno"
#: 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"
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"
msgstr "Neplatné nastavení, upravte své předvolby"
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
msgstr "Neplatné nastavení"
#: searx/webapp.py:608 searx/webapp.py:683
#: searx/webapp.py:626 searx/webapp.py:701
msgid "search error"
msgstr "chyba vyhledávání"
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr "před {minutes} minutami"
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "před {hours} hodinami, {minutes} minutami"
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
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:73 searx/templates/oscar/macros.html:75
#: searx/templates/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr "archivovaná verze"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr "přes proxy"
@ -533,7 +533,6 @@ msgstr "Základní kategorie"
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
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/simple/preferences.html:237
msgid "Method"
msgstr "Dotazovací metoda"
msgid "HTTP Method"
msgstr ""
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"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/simple/preferences.html:280
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."
msgstr ""
@ -873,12 +873,10 @@ msgstr ""
"prozrazením dat při kliknutí na výsledky hledání."
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr "uložit"
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr "zpět"
@ -922,13 +920,11 @@ msgstr "Zkuste vyhledat:"
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr "další stránka"
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr "předchozí stránka"
@ -1260,10 +1256,26 @@ msgstr "Aktuálně používané vyhledávače"
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1406,3 +1418,12 @@ msgstr ""
#~ "can record this title."
#~ 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 ""

View file

@ -8,12 +8,12 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-01-06 08:25+0000\n"
"PO-Revision-Date: 2020-07-09 13:10+0000\n"
"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"POT-Creation-Date: 2022-01-26 17:14+0000\n"
"PO-Revision-Date: 2022-01-19 22:16+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: cy\n"
"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 "
"!= 11) ? 2 : 3\n"
"MIME-Version: 1.0\n"
@ -21,172 +21,172 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr "ffeiliau"
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr "cyffredinol"
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr "cerddoriaeth"
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr "cyfryngau cymdeithasol"
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr "delweddau"
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr "fideos"
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr "Technoleg"
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr "newyddion"
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr "map"
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr ""
msgstr "winwns"
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr "gwyddoniaeth"
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr ""
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr ""
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr ""
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr ""
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr ""
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr ""
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr ""
msgstr "tywyll"
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr ""
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr ""
msgstr "gwall dosrannu"
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr ""
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr ""
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr ""
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr ""
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr ""
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr ""
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr ""
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr ""
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr ""
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr ""
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr "Ni chanfuwyd eitem"
#: 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"
msgstr ""
#: searx/webapp.py:515 searx/webapp.py:925
#: searx/webapp.py:534 searx/webapp.py:941
msgid "Invalid settings, please edit your preferences"
msgstr "Gosodiadau annilys. Addasa dy ddewisiadau."
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
msgstr "Gosodiadau annilys"
#: searx/webapp.py:608 searx/webapp.py:683
#: searx/webapp.py:626 searx/webapp.py:701
msgid "search error"
msgstr "gwall chwilio"
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr "{minutes} munud yn ôl"
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} awr, {minutes} munud yn ôl"
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
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:73 searx/templates/oscar/macros.html:75
#: searx/templates/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr ""
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr ""
@ -521,7 +521,6 @@ msgstr "Categorïau arferol"
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
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/simple/preferences.html:237
msgid "Method"
msgstr "Dull"
msgid "HTTP Method"
msgstr ""
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
@ -715,7 +715,7 @@ msgstr ""
#: searx/templates/oscar/preferences.html:325
#: searx/templates/simple/preferences.html:280
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."
msgstr ""
@ -850,12 +850,10 @@ msgid ""
msgstr ""
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr "cadw"
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr "nôl"
@ -899,13 +897,11 @@ msgstr "Rho gynnig ar chwilio am:"
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr "tudalen nesaf"
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr "tudalen ddiwethaf"
@ -1083,7 +1079,7 @@ msgstr "Da iawn!"
#: searx/templates/oscar/messages/save_settings_successfull.html:8
msgid "Settings saved successfully."
msgstr "Cadwyd y gosodiadau yn iawn!"
msgstr "Cadwyd y gosodiadau yn iawn."
#: searx/templates/oscar/messages/unknow_error.html:7
msgid "Oh snap!"
@ -1237,10 +1233,26 @@ msgstr ""
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1382,3 +1394,12 @@ msgstr ""
#~ "can record this title."
#~ 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 ""

View file

@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-01-06 08:25+0000\n"
"PO-Revision-Date: 2021-12-31 07:17+0000\n"
"Last-Translator: Frederik From <frederikfrom@pm.me>\n"
"POT-Creation-Date: 2022-01-26 17:14+0000\n"
"PO-Revision-Date: 2022-01-23 20:00+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language: da\n"
"Language-Team: Danish "
"<https://weblate.bubu1.eu/projects/searxng/searxng/da/>\n"
@ -21,174 +21,174 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr "filer"
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr "generelt"
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr "musik"
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr "sociale medier"
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr "billeder"
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr "videoer"
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr "it"
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr "nyheder"
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr "kort"
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr "onion-links"
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr "videnskab"
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr ""
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr ""
msgstr "ordbøger"
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr ""
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr ""
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr ""
msgstr "spørgsmål og svar"
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr ""
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr "automatisk"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr "lys"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr "mørk"
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr "udløbstid"
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr "fortolkningsfejl"
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr "HTTP-protokolfejl"
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr "netværksfejl"
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr "uventet nedbrud"
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr "HTTP-fejl"
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr "HTTP-tilkoblingsfejl"
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr ""
msgstr "proxyfejl"
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr "CAPTCHA"
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr "for mange forespørgsler"
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr "adgang nægtet"
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr "server-API-fejl"
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr "Intet fundet"
#: 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"
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"
msgstr "Ugyldige indstillinger, redigér venligst dine valg"
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
msgstr "Ugyldig indstilling"
#: searx/webapp.py:608 searx/webapp.py:683
#: searx/webapp.py:626 searx/webapp.py:701
msgid "search error"
msgstr "søgefejl"
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr "for {minutes} minut(ter) siden"
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "for {hours} time(r) og {minutes} minut(ter) siden"
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
msgstr ""
msgstr "Suspenderet"
#: searx/answerers/random/answerer.py:67
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:73 searx/templates/oscar/macros.html:75
#: searx/templates/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr "cached"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr "viderestillet"
@ -418,7 +418,7 @@ msgstr "Tillad"
#: searx/templates/oscar/macros.html:139
msgid "broken"
msgstr ""
msgstr "defekt"
#: searx/templates/oscar/macros.html:141
msgid "supported"
@ -482,7 +482,7 @@ msgstr "P95"
#: searx/templates/oscar/preferences.html:68
#: searx/templates/simple/preferences.html:83
msgid "Failed checker test(s): "
msgstr ""
msgstr "Fejlet checkertest(s): "
#: searx/templates/oscar/preferences.html:96
#: searx/templates/simple/preferences.html:101
@ -498,7 +498,7 @@ msgstr "Generelt"
#: searx/templates/oscar/preferences.html:102
#: searx/templates/oscar/preferences.html:193
msgid "User Interface"
msgstr ""
msgstr "Bruger Interface"
#: searx/templates/oscar/preferences.html:103
#: searx/templates/oscar/preferences.html:257
@ -515,7 +515,7 @@ msgstr "Søgemaskiner"
#: searx/templates/oscar/preferences.html:105
#: searx/templates/simple/preferences.html:329
msgid "Special Queries"
msgstr ""
msgstr "Specielle Forespørgsler"
#: searx/templates/oscar/preferences.html:106
#: searx/templates/oscar/preferences.html:454
@ -531,7 +531,6 @@ msgstr "Standardkategorier"
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
msgstr "Søgesprog"
@ -626,7 +625,7 @@ msgstr ""
#: searx/templates/oscar/preferences.html:211
#: searx/templates/simple/preferences.html:205
msgid "Change SearXNG layout"
msgstr ""
msgstr "Ændr SearXNG layout"
#: searx/templates/oscar/preferences.html:222
#: searx/templates/oscar/preferences.html:228
@ -640,11 +639,11 @@ msgstr "Stil"
#: searx/templates/oscar/preferences.html:231
msgid "Show advanced settings"
msgstr ""
msgstr "Vis avancerede indstillinger"
#: searx/templates/oscar/preferences.html:232
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:245
@ -670,10 +669,11 @@ msgstr "Åben resultat-link i en ny browser-tab"
#: searx/templates/oscar/preferences.html:262
#: searx/templates/simple/preferences.html:237
msgid "Method"
msgstr "Metode"
msgid "HTTP Method"
msgstr "HTTP-metode"
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"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/simple/preferences.html:256
msgid "Proxying image results through SearXNG"
msgstr ""
msgstr "Bearbejder billedresulter gennem SearXNG"
#: searx/templates/oscar/preferences.html:277
#: searx/templates/oscar/preferences.html:288
@ -721,7 +721,7 @@ msgstr ""
#: searx/templates/oscar/preferences.html:315
msgid "Allow all"
msgstr ""
msgstr "Tillad alle"
#: searx/templates/oscar/preferences.html:316
msgid "Disable all"
@ -730,7 +730,7 @@ msgstr ""
#: searx/templates/oscar/preferences.html:325
#: searx/templates/simple/preferences.html:280
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."
msgstr ""
@ -766,7 +766,7 @@ msgstr "Tidsinterval"
#: searx/templates/simple/preferences.html:291
#: searx/templates/simple/stats.html:31
msgid "Response time"
msgstr ""
msgstr "Svartid"
#: searx/templates/oscar/preferences.html:340
#: searx/templates/oscar/preferences.html:344
@ -872,12 +872,10 @@ msgstr ""
"resultatet."
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr "gem"
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr "tilbage"
@ -921,13 +919,11 @@ msgstr "Prøv at søge efter:"
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr "næste side"
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr "forrige side"
@ -1259,10 +1255,26 @@ msgstr "Pt. anvendte søgemaskiner"
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1400,3 +1412,12 @@ msgstr ""
#~ "can record this title."
#~ 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 ""

View file

@ -21,8 +21,8 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-01-06 08:25+0000\n"
"PO-Revision-Date: 2022-01-07 07:17+0000\n"
"POT-Creation-Date: 2022-01-26 17:14+0000\n"
"PO-Revision-Date: 2022-01-28 07:16+0000\n"
"Last-Translator: Markus Heiser <markus.heiser@darmarit.de>\n"
"Language-Team: German <https://weblate.bubu1.eu/projects/searxng/searxng/de/>"
"\n"
@ -34,172 +34,172 @@ msgstr ""
"X-Generator: Weblate 4.10.1\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr "Dateien"
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr "Allgemein"
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr "Musik"
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr "Soziale Medien"
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr "Bilder"
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr "Videos"
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr "IT"
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr "Neuigkeiten"
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr "Karte"
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr "Onions"
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr "Wissenschaft"
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr "Apps"
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr "Lexika"
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr "Songtexte"
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr "Pakete"
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr "Q&A"
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr "Repositories"
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr "Software Wikis"
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr "WEB"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr "auto"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr "hell"
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr "dunkel"
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr "Timeout"
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr "Fehler beim Parsen"
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr "HTTP-Protokollfehler"
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr "Netzwerkfehler"
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr "unerwarteter Absturz"
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr "HTTP-Fehler"
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr "HTTP-Verbindungsfehler"
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr "Proxy-Fehler"
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr "CAPTCHA"
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr "zu viele Anfragen"
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr "Zugriff verweigert"
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr "Server-API-Fehler"
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr "Keine Einträge gefunden"
#: 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"
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"
msgstr "Ungültige Einstellungen. Bitte diese überprüfen"
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
msgstr "Ungültige Einstellungen"
#: searx/webapp.py:608 searx/webapp.py:683
#: searx/webapp.py:626 searx/webapp.py:701
msgid "search error"
msgstr "Suchfehler"
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr "vor {minutes} Minute(n)"
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "vor {hours} Stunde(n), {minutes} Minute(n)"
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
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:73 searx/templates/oscar/macros.html:75
#: searx/templates/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr "Im Cache"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr "proxy"
@ -548,7 +548,6 @@ msgstr "Standardkategorien"
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
msgstr "Suchsprache"
@ -689,10 +688,11 @@ msgstr "Links in einem neuen Browser-Tab öffnen"
#: searx/templates/oscar/preferences.html:262
#: searx/templates/simple/preferences.html:237
msgid "Method"
msgstr "Methode"
msgid "HTTP Method"
msgstr "HTTP Methode"
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"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/simple/preferences.html:280
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."
msgstr ""
"Diese Registerkarte zeigt keine Suchergebnisse an, aber Sie können die hier "
"aufgelisteten Suchmaschinen über bangs (!) durchsuchen."
"Auf dieser Registerkarte werden keine Suchergebnisse angezeigt, aber Sie "
"können die hier aufgelisteten Suchmaschinen über bangs durchsuchen."
#: searx/templates/oscar/preferences.html:334
#: searx/templates/oscar/preferences.html:350
@ -897,12 +897,10 @@ msgstr ""
"ausgewählten Ergebnisseiten übermittelt werden."
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr "Speichern"
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr "Zurück"
@ -946,13 +944,11 @@ msgstr "Suche nach:"
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr "nächste Seite"
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr "vorherige Seite"
@ -1287,10 +1283,26 @@ msgstr "Aktuell benutzte Suchmaschinen"
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1431,3 +1443,16 @@ msgstr "Suchmaschine"
#~ " contains your query. Your browser "
#~ "can record this title."
#~ 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."

View file

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\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"
"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language: el_GR\n"
@ -21,172 +21,172 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr "αρχεία"
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr "γενικά"
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr "μουσική"
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr "κοινωνικά δίκτυα"
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr "εικόνες"
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr ""
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr ""
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr "νέα"
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr "χάρτης"
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr ""
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr "επιστήμη"
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr ""
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr ""
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr ""
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr ""
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr ""
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr ""
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr ""
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr ""
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr ""
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr ""
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr ""
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr ""
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr ""
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr ""
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr ""
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr ""
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr ""
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr ""
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr ""
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr ""
#: 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"
msgstr ""
#: searx/webapp.py:515 searx/webapp.py:925
#: searx/webapp.py:534 searx/webapp.py:941
msgid "Invalid settings, please edit your preferences"
msgstr ""
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
msgstr ""
#: searx/webapp.py:608 searx/webapp.py:683
#: searx/webapp.py:626 searx/webapp.py:701
msgid "search error"
msgstr "λάθος αναζήτησης"
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr "{minutes} λεπτά πριν"
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr ""
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
msgstr ""
@ -391,13 +391,13 @@ msgstr "αρχείο torrent"
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr ""
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr ""
@ -525,7 +525,6 @@ msgstr "Προεπιλεγμένες κατηγορίες"
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
msgstr "Γλώσσα αναζήτησης"
@ -662,10 +661,11 @@ msgstr "Άνοιξε τους συνδέσμους των αποτελεσμάτ
#: searx/templates/oscar/preferences.html:262
#: searx/templates/simple/preferences.html:237
msgid "Method"
msgstr "Μέθοδος"
msgid "HTTP Method"
msgstr ""
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
@ -719,7 +719,7 @@ msgstr ""
#: searx/templates/oscar/preferences.html:325
#: searx/templates/simple/preferences.html:280
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."
msgstr ""
@ -854,12 +854,10 @@ msgid ""
msgstr ""
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr "αποθήκευση"
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr "πίσω"
@ -903,13 +901,11 @@ msgstr "Δοκιμάστε αναζήτηση για:"
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr "επόμενη σελίδα"
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr "προηγούμενη σελίδα"
@ -1241,10 +1237,26 @@ msgstr "Μηχανές αναζήτησης που χρησιμοποιούντ
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1378,3 +1390,12 @@ msgstr ""
#~ "can record this title."
#~ 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 ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
@ -18,172 +18,172 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.1\n"
#: searx/webapp.py:165
#: searx/webapp.py:169
msgid "files"
msgstr ""
#: searx/webapp.py:166
#: searx/webapp.py:170
msgid "general"
msgstr ""
#: searx/webapp.py:167
#: searx/webapp.py:171
msgid "music"
msgstr ""
#: searx/webapp.py:168
#: searx/webapp.py:172
msgid "social media"
msgstr ""
#: searx/webapp.py:169
#: searx/webapp.py:173
msgid "images"
msgstr ""
#: searx/webapp.py:170
#: searx/webapp.py:174
msgid "videos"
msgstr ""
#: searx/webapp.py:171
#: searx/webapp.py:175
msgid "it"
msgstr ""
#: searx/webapp.py:172
#: searx/webapp.py:176
msgid "news"
msgstr ""
#: searx/webapp.py:173
#: searx/webapp.py:177
msgid "map"
msgstr ""
#: searx/webapp.py:174
#: searx/webapp.py:178
msgid "onions"
msgstr ""
#: searx/webapp.py:175
#: searx/webapp.py:179
msgid "science"
msgstr ""
#: searx/webapp.py:177
#: searx/webapp.py:181
msgid "apps"
msgstr ""
#: searx/webapp.py:178
#: searx/webapp.py:182
msgid "dictionaries"
msgstr ""
#: searx/webapp.py:179
#: searx/webapp.py:183
msgid "lyrics"
msgstr ""
#: searx/webapp.py:180
#: searx/webapp.py:184
msgid "packages"
msgstr ""
#: searx/webapp.py:181
#: searx/webapp.py:185
msgid "q&a"
msgstr ""
#: searx/webapp.py:182
#: searx/webapp.py:186
msgid "repos"
msgstr ""
#: searx/webapp.py:183
#: searx/webapp.py:187
msgid "software wikis"
msgstr ""
#: searx/webapp.py:184
#: searx/webapp.py:188
msgid "web"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "auto"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "light"
msgstr ""
#: searx/webapp.py:189
#: searx/webapp.py:193
msgid "dark"
msgstr ""
#: searx/webapp.py:192
#: searx/webapp.py:196
msgid "timeout"
msgstr ""
#: searx/webapp.py:193
#: searx/webapp.py:197
msgid "parsing error"
msgstr ""
#: searx/webapp.py:194
#: searx/webapp.py:198
msgid "HTTP protocol error"
msgstr ""
#: searx/webapp.py:195
#: searx/webapp.py:199
msgid "network error"
msgstr ""
#: searx/webapp.py:197
#: searx/webapp.py:201
msgid "unexpected crash"
msgstr ""
#: searx/webapp.py:204
#: searx/webapp.py:208
msgid "HTTP error"
msgstr ""
#: searx/webapp.py:205
#: searx/webapp.py:209
msgid "HTTP connection error"
msgstr ""
#: searx/webapp.py:211
#: searx/webapp.py:215
msgid "proxy error"
msgstr ""
#: searx/webapp.py:212
#: searx/webapp.py:216
msgid "CAPTCHA"
msgstr ""
#: searx/webapp.py:213
#: searx/webapp.py:217
msgid "too many requests"
msgstr ""
#: searx/webapp.py:214
#: searx/webapp.py:218
msgid "access denied"
msgstr ""
#: searx/webapp.py:215
#: searx/webapp.py:219
msgid "server API error"
msgstr ""
#: searx/webapp.py:402
#: searx/webapp.py:421
msgid "No item found"
msgstr ""
#: 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"
msgstr ""
#: searx/webapp.py:515 searx/webapp.py:925
#: searx/webapp.py:534 searx/webapp.py:941
msgid "Invalid settings, please edit your preferences"
msgstr ""
#: searx/webapp.py:531
#: searx/webapp.py:550
msgid "Invalid settings"
msgstr ""
#: searx/webapp.py:608 searx/webapp.py:683
#: searx/webapp.py:626 searx/webapp.py:701
msgid "search error"
msgstr ""
#: searx/webapp.py:726
#: searx/webapp.py:744
msgid "{minutes} minute(s) ago"
msgstr ""
#: searx/webapp.py:728
#: searx/webapp.py:746
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr ""
#: searx/webapp.py:846
#: searx/webapp.py:862
msgid "Suspended"
msgstr ""
@ -384,13 +384,13 @@ msgstr ""
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "cached"
msgstr ""
#: 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/simple/macros.html:41
#: searx/templates/simple/macros.html:43
msgid "proxied"
msgstr ""
@ -518,7 +518,6 @@ msgstr ""
#: searx/templates/oscar/preferences.html:133
#: searx/templates/simple/preferences.html:117
#: searx/templates/simple/preferences.html:244
msgid "Search language"
msgstr ""
@ -655,10 +654,11 @@ msgstr ""
#: searx/templates/oscar/preferences.html:262
#: searx/templates/simple/preferences.html:237
msgid "Method"
msgid "HTTP Method"
msgstr ""
#: searx/templates/oscar/preferences.html:263
#: searx/templates/simple/preferences.html:244
msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
@ -712,7 +712,7 @@ msgstr ""
#: searx/templates/oscar/preferences.html:325
#: searx/templates/simple/preferences.html:280
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."
msgstr ""
@ -847,12 +847,10 @@ msgid ""
msgstr ""
#: searx/templates/oscar/preferences.html:492
#: searx/templates/simple/preferences.html:404
msgid "save"
msgstr ""
#: searx/templates/oscar/preferences.html:493
#: searx/templates/simple/preferences.html:406
msgid "back"
msgstr ""
@ -896,13 +894,11 @@ msgstr ""
#: searx/templates/oscar/results.html:162
#: searx/templates/oscar/results.html:187
#: searx/templates/simple/results.html:182
msgid "next page"
msgstr ""
#: searx/templates/oscar/results.html:169
#: searx/templates/oscar/results.html:180
#: searx/templates/simple/results.html:165
msgid "previous page"
msgstr ""
@ -1232,10 +1228,26 @@ msgstr ""
msgid "Supports selected language"
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
msgid "Answers"
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/simple_search.html:5
msgid "clear"
@ -1379,3 +1391,12 @@ msgstr ""
#~ "can record this title."
#~ 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 ""

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