mirror of
https://github.com/searxng/searxng
synced 2024-01-01 19:24:07 +01:00
Merge branch 'searxng:master' into master
This commit is contained in:
commit
4257102af6
63 changed files with 2183 additions and 25544 deletions
2
.github/workflows/integration.yml
vendored
2
.github/workflows/integration.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-20.04]
|
||||
python-version: ["3.8", "3.9", "3.10", "3.11"]
|
||||
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
|
|
@ -15,7 +15,7 @@ Administrator documentation
|
|||
installation-apache
|
||||
update-searxng
|
||||
answer-captcha
|
||||
searx.botdetection
|
||||
searx.limiter
|
||||
api
|
||||
architecture
|
||||
plugins
|
||||
|
|
17
docs/admin/searx.limiter.rst
Normal file
17
docs/admin/searx.limiter.rst
Normal file
|
@ -0,0 +1,17 @@
|
|||
.. _limiter:
|
||||
|
||||
=======
|
||||
Limiter
|
||||
=======
|
||||
|
||||
.. sidebar:: info
|
||||
|
||||
The limiter requires a :ref:`Redis <settings redis>` database.
|
||||
|
||||
.. contents::
|
||||
:depth: 2
|
||||
:local:
|
||||
:backlinks: entry
|
||||
|
||||
.. automodule:: searx.limiter
|
||||
:members:
|
|
@ -12,6 +12,7 @@
|
|||
bind_address: "127.0.0.1"
|
||||
secret_key: "ultrasecretkey" # change this!
|
||||
limiter: false
|
||||
public_instance: false
|
||||
image_proxy: false
|
||||
default_http_headers:
|
||||
X-Content-Type-Options : nosniff
|
||||
|
@ -20,7 +21,6 @@
|
|||
X-Robots-Tag : noindex, nofollow
|
||||
Referrer-Policy : no-referrer
|
||||
|
||||
|
||||
``base_url`` : ``$SEARXNG_URL`` :ref:`buildenv <make buildenv>`
|
||||
The base URL where SearXNG is deployed. Used to create correct inbound links.
|
||||
If you change the value, don't forget to rebuild instance's environment
|
||||
|
@ -36,11 +36,19 @@
|
|||
``secret_key`` : ``$SEARXNG_SECRET``
|
||||
Used for cryptography purpose.
|
||||
|
||||
.. _limiter:
|
||||
|
||||
``limiter`` :
|
||||
Rate limit the number of request on the instance, block some bots. The
|
||||
:ref:`limiter src` requires a :ref:`settings redis` database.
|
||||
:ref:`limiter` requires a :ref:`settings redis` database.
|
||||
|
||||
.. _public_instance:
|
||||
|
||||
``public_instance`` :
|
||||
|
||||
Setting that allows to enable features specifically for public instances (not
|
||||
needed for local usage). By set to ``true`` the following features are
|
||||
activated:
|
||||
|
||||
- :py:obj:`searx.botdetection.link_token` in the :ref:`limiter`
|
||||
|
||||
.. _image_proxy:
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import sys, os
|
||||
from pathlib import Path
|
||||
from pallets_sphinx_themes import ProjectLink
|
||||
|
||||
from searx import get_setting
|
||||
|
@ -13,7 +14,6 @@ project = 'SearXNG'
|
|||
copyright = 'SearXNG team'
|
||||
author = 'SearXNG team'
|
||||
release, version = VERSION_STRING, VERSION_STRING
|
||||
|
||||
SEARXNG_URL = get_setting('server.base_url') or 'https://example.org/searxng'
|
||||
ISSUE_URL = get_setting('brand.issue_url')
|
||||
DOCS_URL = get_setting('brand.docs_url')
|
||||
|
@ -22,6 +22,9 @@ PRIVACYPOLICY_URL = get_setting('general.privacypolicy_url')
|
|||
CONTACT_URL = get_setting('general.contact_url')
|
||||
WIKI_URL = get_setting('brand.wiki_url')
|
||||
|
||||
SOURCEDIR = Path(__file__).parent.parent / "searx"
|
||||
os.environ['SOURCEDIR'] = str(SOURCEDIR)
|
||||
|
||||
# hint: sphinx.ext.viewcode won't highlight when 'highlight_language' [1] is set
|
||||
# to string 'none' [2]
|
||||
#
|
||||
|
|
|
@ -12,8 +12,10 @@ Bot Detection
|
|||
.. automodule:: searx.botdetection
|
||||
:members:
|
||||
|
||||
.. automodule:: searx.botdetection.limiter
|
||||
:members:
|
||||
.. _botdetection ip_lists:
|
||||
|
||||
IP lists
|
||||
========
|
||||
|
||||
.. automodule:: searx.botdetection.ip_lists
|
||||
:members:
|
||||
|
@ -50,3 +52,11 @@ Probe HTTP headers
|
|||
|
||||
.. automodule:: searx.botdetection.http_user_agent
|
||||
:members:
|
||||
|
||||
.. _botdetection config:
|
||||
|
||||
Config
|
||||
======
|
||||
|
||||
.. automodule:: searx.botdetection.config
|
||||
:members:
|
|
@ -2,7 +2,7 @@ mock==5.1.0
|
|||
nose2[coverage_plugin]==0.14.0
|
||||
cov-core==1.15.0
|
||||
black==22.12.0
|
||||
pylint==3.0.1
|
||||
pylint==3.0.2
|
||||
splinter==0.19.0
|
||||
selenium==4.14.0
|
||||
twine==4.0.2
|
||||
|
@ -11,7 +11,7 @@ Sphinx<=7.1.2; python_version == '3.8'
|
|||
Sphinx==7.2.6; python_version > '3.8'
|
||||
sphinx-issues==3.0.1
|
||||
sphinx-jinja==2.0.2
|
||||
sphinx-tabs==3.4.1
|
||||
sphinx-tabs==3.4.4
|
||||
sphinxcontrib-programoutput==0.17
|
||||
sphinx-autobuild==2021.3.14
|
||||
sphinx-notfound-page==1.0.0
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
certifi==2023.7.22
|
||||
babel==2.13.0
|
||||
babel==2.13.1
|
||||
flask-babel==4.0.0
|
||||
flask==3.0.0
|
||||
jinja2==3.1.2
|
||||
|
@ -9,7 +9,7 @@ python-dateutil==2.8.2
|
|||
pyyaml==6.0.1
|
||||
httpx[http2]==0.24.1
|
||||
Brotli==1.1.0
|
||||
uvloop==0.17.0
|
||||
uvloop==0.19.0
|
||||
httpx-socks[asyncio]==0.7.7
|
||||
setproctitle==1.3.3
|
||||
redis==4.6.0
|
||||
|
|
|
@ -108,5 +108,6 @@ else:
|
|||
if settings['server']['public_instance']:
|
||||
logger.warning(
|
||||
"Be aware you have activated features intended only for public instances. "
|
||||
+ "This force the usage of the bot limiter and link_token plugins."
|
||||
"This force the usage of the limiter and link_token / "
|
||||
"see https://docs.searxng.org/admin/searx.limiter.html"
|
||||
)
|
||||
|
|
|
@ -2,43 +2,22 @@
|
|||
# lint: pylint
|
||||
""".. _botdetection src:
|
||||
|
||||
The :ref:`limiter <limiter src>` implements several methods to block bots:
|
||||
|
||||
a. Analysis of the HTTP header in the request / can be easily bypassed.
|
||||
|
||||
b. Block and pass lists in which IPs are listed / difficult to maintain, since
|
||||
the IPs of bots are not all known and change over the time.
|
||||
|
||||
c. Detection of bots based on the behavior of the requests and blocking and, if
|
||||
necessary, unblocking of the IPs via a dynamically changeable IP block list.
|
||||
|
||||
For dynamically changeable IP lists a Redis database is needed and for any kind
|
||||
of IP list the determination of the IP of the client is essential. The IP of
|
||||
the client is determined via the X-Forwarded-For_ HTTP header
|
||||
|
||||
.. _X-Forwarded-For:
|
||||
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For
|
||||
|
||||
X-Forwarded-For
|
||||
===============
|
||||
|
||||
.. attention::
|
||||
|
||||
A correct setup of the HTTP request headers ``X-Forwarded-For`` and
|
||||
``X-Real-IP`` is essential to be able to assign a request to an IP correctly:
|
||||
|
||||
- `NGINX RequestHeader`_
|
||||
- `Apache RequestHeader`_
|
||||
|
||||
.. _NGINX RequestHeader:
|
||||
https://docs.searxng.org/admin/installation-nginx.html#nginx-s-searxng-site
|
||||
.. _Apache RequestHeader:
|
||||
https://docs.searxng.org/admin/installation-apache.html#apache-s-searxng-site
|
||||
|
||||
.. autofunction:: searx.botdetection.get_real_ip
|
||||
Implementations used for bot detection.
|
||||
|
||||
"""
|
||||
|
||||
from ._helpers import dump_request
|
||||
from ._helpers import get_real_ip
|
||||
from ._helpers import get_network
|
||||
from ._helpers import too_many_requests
|
||||
|
||||
__all__ = ['dump_request', 'get_network', 'get_real_ip', 'too_many_requests']
|
||||
|
||||
redis_client = None
|
||||
cfg = None
|
||||
|
||||
|
||||
def init(_cfg, _redis_client):
|
||||
global redis_client, cfg # pylint: disable=global-statement
|
||||
redis_client = _redis_client
|
||||
cfg = _cfg
|
||||
|
|
|
@ -13,8 +13,8 @@ from ipaddress import (
|
|||
import flask
|
||||
import werkzeug
|
||||
|
||||
from searx.tools import config
|
||||
from searx import logger
|
||||
from . import config
|
||||
|
||||
logger = logger.getChild('botdetection')
|
||||
|
||||
|
@ -104,10 +104,10 @@ def get_real_ip(request: flask.Request) -> str:
|
|||
if not forwarded_for:
|
||||
_log_error_only_once("X-Forwarded-For header is not set!")
|
||||
else:
|
||||
from .limiter import get_cfg # pylint: disable=import-outside-toplevel, cyclic-import
|
||||
from . import cfg # pylint: disable=import-outside-toplevel, cyclic-import
|
||||
|
||||
forwarded_for = [x.strip() for x in forwarded_for.split(',')]
|
||||
x_for: int = get_cfg()['real_ip.x_for'] # type: ignore
|
||||
x_for: int = cfg['real_ip.x_for'] # type: ignore
|
||||
forwarded_for = forwarded_for[-min(len(forwarded_for), x_for)]
|
||||
|
||||
if not real_ip:
|
||||
|
|
|
@ -24,7 +24,7 @@ from ipaddress import (
|
|||
import flask
|
||||
import werkzeug
|
||||
|
||||
from searx.tools import config
|
||||
from . import config
|
||||
from ._helpers import too_many_requests
|
||||
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ from ipaddress import (
|
|||
import flask
|
||||
import werkzeug
|
||||
|
||||
from searx.tools import config
|
||||
from . import config
|
||||
from ._helpers import too_many_requests
|
||||
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ from ipaddress import (
|
|||
import flask
|
||||
import werkzeug
|
||||
|
||||
from searx.tools import config
|
||||
from . import config
|
||||
from ._helpers import too_many_requests
|
||||
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ from ipaddress import (
|
|||
import flask
|
||||
import werkzeug
|
||||
|
||||
from searx.tools import config
|
||||
from . import config
|
||||
from ._helpers import too_many_requests
|
||||
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ from ipaddress import (
|
|||
import flask
|
||||
import werkzeug
|
||||
|
||||
from searx.tools import config
|
||||
from . import config
|
||||
from ._helpers import too_many_requests
|
||||
|
||||
|
||||
|
|
|
@ -13,8 +13,7 @@ and at least for a maximum of 10 minutes.
|
|||
|
||||
The :py:obj:`.link_token` method can be used to investigate whether a request is
|
||||
*suspicious*. To activate the :py:obj:`.link_token` method in the
|
||||
:py:obj:`.ip_limit` method add the following to your
|
||||
``/etc/searxng/limiter.toml``:
|
||||
:py:obj:`.ip_limit` method add the following configuration:
|
||||
|
||||
.. code:: toml
|
||||
|
||||
|
@ -46,13 +45,12 @@ from ipaddress import (
|
|||
|
||||
import flask
|
||||
import werkzeug
|
||||
from searx.tools import config
|
||||
from searx import settings
|
||||
|
||||
from searx import redisdb
|
||||
from searx.redislib import incr_sliding_window, drop_counter
|
||||
|
||||
from . import link_token
|
||||
from . import config
|
||||
from ._helpers import (
|
||||
too_many_requests,
|
||||
logger,
|
||||
|
@ -110,7 +108,7 @@ def filter_request(
|
|||
if c > API_MAX:
|
||||
return too_many_requests(network, "too many request in API_WINDOW")
|
||||
|
||||
if settings['server']['public_instance'] or cfg['botdetection.ip_limit.link_token']:
|
||||
if cfg['botdetection.ip_limit.link_token']:
|
||||
|
||||
suspicious = link_token.is_suspicious(network, request, True)
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ from ipaddress import (
|
|||
IPv6Address,
|
||||
)
|
||||
|
||||
from searx.tools import config
|
||||
from . import config
|
||||
from ._helpers import logger
|
||||
|
||||
logger = logger.getChild('ip_limit')
|
||||
|
|
|
@ -99,15 +99,13 @@ def ping(request: flask.Request, token: str):
|
|||
The expire time of this ping-key is :py:obj:`PING_LIVE_TIME`.
|
||||
|
||||
"""
|
||||
from . import limiter # pylint: disable=import-outside-toplevel, cyclic-import
|
||||
from . import redis_client, cfg # pylint: disable=import-outside-toplevel, cyclic-import
|
||||
|
||||
redis_client = redisdb.client()
|
||||
if not redis_client:
|
||||
return
|
||||
if not token_is_valid(token):
|
||||
return
|
||||
|
||||
cfg = limiter.get_cfg()
|
||||
real_ip = ip_address(get_real_ip(request))
|
||||
network = get_network(real_ip, cfg)
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -447,7 +447,10 @@
|
|||
"تاكا بنغلاديشي": "BDT",
|
||||
"бангладешка така": "BDT",
|
||||
"বাংলাদেশী টাকা": "BDT",
|
||||
"taka": "BDT",
|
||||
"taka": [
|
||||
"INR",
|
||||
"BDT"
|
||||
],
|
||||
"bangladéšská taka": "BDT",
|
||||
"bangladeshi taka": "BDT",
|
||||
"bangladeŝa tako": "BDT",
|
||||
|
@ -581,6 +584,7 @@
|
|||
"đô la bermuda": "BMD",
|
||||
"دولار بروني": "BND",
|
||||
"брунейски долар": "BND",
|
||||
"ব্রুনাই ডলার": "BND",
|
||||
"dòlar de brunei": "BND",
|
||||
"brunejský dolar": "BND",
|
||||
"brunei dollar": "BND",
|
||||
|
@ -1820,6 +1824,7 @@
|
|||
"indisk rupie": "INR",
|
||||
"இந்திய ரூபாய்": "INR",
|
||||
"எண்ணிம ரூபாய்": "INR",
|
||||
"డిజిటల్ రూపాయి": "INR",
|
||||
"రూపాయి": "INR",
|
||||
"รูปีอินเดีย": "INR",
|
||||
"hindistan rupisi": "INR",
|
||||
|
@ -2837,98 +2842,29 @@
|
|||
"ไนรา": "NGN",
|
||||
"nijerya nairası": "NGN",
|
||||
"нігерійська найра": "NGN",
|
||||
"córdoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"كوردبا نيكاراغوا": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"никарагуанска кордоба": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nikaragujská córdoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba oro": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nicaraguan córdoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nikaragva kordovo": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"cordoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"קורדובה": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nikaragvanska kordoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nicaraguai córdoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba nikaragua": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba nicaraguense": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"ニカラグア・コルドバ": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"니카라과 코르도바": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nikaragvos kordoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nicaraguaanse córdoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"ਨਿਕਾਰਾਗੁਆਈ ਕੋਰਦੋਬਾ": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"cordoba oro": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"никарагуанская кордоба": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"никарагванска кордоба": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"kordoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"нікарагуанська кордоба": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba": "NIO",
|
||||
"كوردبا نيكاراغوا": "NIO",
|
||||
"никарагуанска кордоба": "NIO",
|
||||
"nikaragujská córdoba": "NIO",
|
||||
"córdoba oro": "NIO",
|
||||
"nicaraguan córdoba": "NIO",
|
||||
"nikaragva kordovo": "NIO",
|
||||
"cordoba": "NIO",
|
||||
"קורדובה": "NIO",
|
||||
"nikaragvanska kordoba": "NIO",
|
||||
"nicaraguai córdoba": "NIO",
|
||||
"córdoba nikaragua": "NIO",
|
||||
"córdoba nicaraguense": "NIO",
|
||||
"ニカラグア・コルドバ": "NIO",
|
||||
"니카라과 코르도바": "NIO",
|
||||
"nikaragvos kordoba": "NIO",
|
||||
"nicaraguaanse córdoba": "NIO",
|
||||
"ਨਿਕਾਰਾਗੁਆਈ ਕੋਰਦੋਬਾ": "NIO",
|
||||
"cordoba oro": "NIO",
|
||||
"никарагуанская кордоба": "NIO",
|
||||
"никарагванска кордоба": "NIO",
|
||||
"kordoba": "NIO",
|
||||
"нікарагуанська кордоба": "NIO",
|
||||
"noorse kroon": "NOK",
|
||||
"كرونة نروجية": "NOK",
|
||||
"норвежка крона": "NOK",
|
||||
|
@ -3636,6 +3572,7 @@
|
|||
"singapoer dollar": "SGD",
|
||||
"دولار سنغافوري": "SGD",
|
||||
"сингапурски долар": "SGD",
|
||||
"সিঙ্গাপুর ডলার": "SGD",
|
||||
"dòlar de singapur": "SGD",
|
||||
"singapurský dolar": "SGD",
|
||||
"singaporeanske dollar": "SGD",
|
||||
|
@ -4394,6 +4331,7 @@
|
|||
"ด่ง": "VND",
|
||||
"в'єтнамський донг": "VND",
|
||||
"فاتو فانواتي": "VUV",
|
||||
"вату": "VUV",
|
||||
"vatu": "VUV",
|
||||
"vanuatský vatu": "VUV",
|
||||
"vanuatu vatu": "VUV",
|
||||
|
@ -4406,7 +4344,6 @@
|
|||
"バツ": "VUV",
|
||||
"바누아투 바투": "VUV",
|
||||
"vanuatuaanse vatu": "VUV",
|
||||
"вату": "VUV",
|
||||
"вануатски вату": "VUV",
|
||||
"вануатський вату": "VUV",
|
||||
"تالا ساموي": "WST",
|
||||
|
@ -5506,7 +5443,6 @@
|
|||
"الدولار الكندي": "CAD",
|
||||
"c$": [
|
||||
"NIO",
|
||||
"NIC",
|
||||
"CAD"
|
||||
],
|
||||
"dòlar de canadà": "CAD",
|
||||
|
@ -5550,7 +5486,6 @@
|
|||
"dollar canada": "CAD",
|
||||
"C$": [
|
||||
"NIO",
|
||||
"NIC",
|
||||
"CAD"
|
||||
],
|
||||
"CAD$": "CAD",
|
||||
|
@ -5586,6 +5521,7 @@
|
|||
"валюта демократической республики конго": "CDF",
|
||||
"франк бельгийского конго": "CDF",
|
||||
"франк дрк": "CDF",
|
||||
"kongovski frank": "CDF",
|
||||
"kongo frankı": "CDF",
|
||||
"wir euro": "CHE",
|
||||
"che": "CHE",
|
||||
|
@ -6046,6 +5982,8 @@
|
|||
"اليورو": "EUR",
|
||||
"eur": "EUR",
|
||||
"euros": "EUR",
|
||||
"💶": "EUR",
|
||||
"eŭroj": "EUR",
|
||||
"e": [
|
||||
"SZL",
|
||||
"EUR"
|
||||
|
@ -6388,8 +6326,8 @@
|
|||
"haitianischer gourde": "HTG",
|
||||
"htg": "HTG",
|
||||
"dollar haïtien": "HTG",
|
||||
"gourde haïtienne": "HTG",
|
||||
"gourde haitienne": "HTG",
|
||||
"gourde haïtienne": "HTG",
|
||||
"גורד": "HTG",
|
||||
"구르드": "HTG",
|
||||
"haitiaanse gourde": "HTG",
|
||||
|
@ -6596,6 +6534,9 @@
|
|||
"indisk rupee": "INR",
|
||||
"indisk rupier": "INR",
|
||||
"indiske rupees": "INR",
|
||||
"rubai": "INR",
|
||||
"rupaye": "INR",
|
||||
"tanka": "INR",
|
||||
"inr": "INR",
|
||||
"rupaya": "INR",
|
||||
"rupee": [
|
||||
|
@ -6650,6 +6591,7 @@
|
|||
"dinar do iraque": "IQD",
|
||||
"валюта ирака": "IQD",
|
||||
"динар ирака": "IQD",
|
||||
"iraški dinar": "IQD",
|
||||
"இராக்கிய தீனார்": "IQD",
|
||||
"ஈராக் டினார்": "IQD",
|
||||
"ஈராக் தினார்": "IQD",
|
||||
|
@ -7280,8 +7222,6 @@
|
|||
"أوقيه موريتانيه": "MRU",
|
||||
"الأوقية الموريتانية": "MRU",
|
||||
"العملة الموريتانية": "MRU",
|
||||
"khoums": "MRU",
|
||||
"khoum": "MRU",
|
||||
"uqiya": "MRU",
|
||||
"mru": "MRU",
|
||||
"um": "MRU",
|
||||
|
@ -7478,126 +7418,36 @@
|
|||
"nigérijská naira": "NGN",
|
||||
"наира": "NGN",
|
||||
"nigeriansk naira": "NGN",
|
||||
"كوردوبا نيكاراجوي": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba nicaragüenc": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba nicaragüenca": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nicaraguanischer córdoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"mariana montserrat": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nic": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nio": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nicaraguan cordoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"cordoba nicaraguense": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"cordoba nicaragüense": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba nicaragüense": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"cordoba nicaraguayen": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba nicaraguayen": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba nicaraguéen": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nikaragvanska córdoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"100ドル紙幣": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"コルドバ・オロ": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nicaraguaanse cordoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba ouro": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"córdoba nicaraguano": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"валюта никарагуа": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"золотая кордоба": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"кордоба": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"кордобас": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"новая никарагуанская кордоба": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"никарагванска златна кордоба": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"никарагванска кордоба оро": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nicaraguansk córdoba": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"nikaragua kordobası": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"нікарагуанська кордова": [
|
||||
"NIO",
|
||||
"NIC"
|
||||
],
|
||||
"كوردوبا نيكاراجوي": "NIO",
|
||||
"córdoba nicaragüenc": "NIO",
|
||||
"córdoba nicaragüenca": "NIO",
|
||||
"nicaraguanischer córdoba": "NIO",
|
||||
"mariana montserrat": "NIO",
|
||||
"nic": "NIO",
|
||||
"nio": "NIO",
|
||||
"nicaraguan cordoba": "NIO",
|
||||
"cordoba nicaraguense": "NIO",
|
||||
"cordoba nicaragüense": "NIO",
|
||||
"córdoba nicaragüense": "NIO",
|
||||
"cordoba nicaraguayen": "NIO",
|
||||
"córdoba nicaraguayen": "NIO",
|
||||
"córdoba nicaraguéen": "NIO",
|
||||
"nikaragvanska córdoba": "NIO",
|
||||
"100ドル紙幣": "NIO",
|
||||
"コルドバ・オロ": "NIO",
|
||||
"nicaraguaanse cordoba": "NIO",
|
||||
"córdoba ouro": "NIO",
|
||||
"córdoba nicaraguano": "NIO",
|
||||
"валюта никарагуа": "NIO",
|
||||
"золотая кордоба": "NIO",
|
||||
"кордоба": "NIO",
|
||||
"кордобас": "NIO",
|
||||
"новая никарагуанская кордоба": "NIO",
|
||||
"никарагванска златна кордоба": "NIO",
|
||||
"никарагванска кордоба оро": "NIO",
|
||||
"nicaraguansk córdoba": "NIO",
|
||||
"nikaragua kordobası": "NIO",
|
||||
"нікарагуанська кордова": "NIO",
|
||||
"nok": "NOK",
|
||||
"كرونه نروجية": "NOK",
|
||||
"corona de noruega": "NOK",
|
||||
|
@ -8961,11 +8811,11 @@
|
|||
"usbekistan som": "UZS",
|
||||
"usbekistan sum": "UZS",
|
||||
"uzbekistani som": "UZS",
|
||||
"uzs": "UZS",
|
||||
"uzbeka sumo": "UZS",
|
||||
"som uzbeco": "UZS",
|
||||
"sum uzbeco": "UZS",
|
||||
"sum uzbeko": "UZS",
|
||||
"uzs": "UZS",
|
||||
"som uzbekistan": "UZS",
|
||||
"som usbeco": "UZS",
|
||||
"ウズベキスタン・スム": "UZS",
|
||||
|
@ -9019,12 +8869,12 @@
|
|||
"₫": "VND",
|
||||
"vnd": "VND",
|
||||
"vnđ": "VND",
|
||||
"vietnam đồng": "VND",
|
||||
"đong": "VND",
|
||||
"vietnamin dong": "VND",
|
||||
"dong vietnamien": "VND",
|
||||
"דונג וייטנאמי ": "VND",
|
||||
"vietnámi dong": "VND",
|
||||
"vietnam đồng": "VND",
|
||||
"ベトナムドン": "VND",
|
||||
"ベトナム・ドン": "VND",
|
||||
"越南銅": "VND",
|
||||
|
@ -9820,7 +9670,7 @@
|
|||
"ro": "Marcă bosniacă convertibilă",
|
||||
"ru": "конвертируемая марка",
|
||||
"sk": "Konvertibilná marka",
|
||||
"sl": "Konvertibilna marka Bosne in Hercegovine",
|
||||
"sl": "konvertibilna marka Bosne in Hercegovine",
|
||||
"sr": "конвертибилна марка",
|
||||
"sv": "Konvertibilna marka",
|
||||
"ta": "கன்வர்ட்டிபிள் மார்க்கு",
|
||||
|
@ -10039,6 +9889,7 @@
|
|||
"BND": {
|
||||
"ar": "دولار بروني",
|
||||
"bg": "Брунейски долар",
|
||||
"bn": "ব্রুনাই ডলার",
|
||||
"ca": "dòlar de Brunei",
|
||||
"cs": "Brunejský dolar",
|
||||
"de": "Brunei-Dollar",
|
||||
|
@ -10420,7 +10271,8 @@
|
|||
"uk": "Конголезький франк",
|
||||
"vi": "Franc Congo",
|
||||
"cy": "ffranc y Congo",
|
||||
"oc": "Franc congolés"
|
||||
"oc": "Franc congolés",
|
||||
"sl": "kongovski frank"
|
||||
},
|
||||
"CHF": {
|
||||
"af": "Switserse frank",
|
||||
|
@ -11490,7 +11342,7 @@
|
|||
"es": "gourde",
|
||||
"eu": "Gourde",
|
||||
"fi": "Haitin gourde",
|
||||
"fr": "Gourde",
|
||||
"fr": "gourde",
|
||||
"he": "גורד",
|
||||
"hr": "Haićanski gourd",
|
||||
"hu": "haiti gourde",
|
||||
|
@ -11543,7 +11395,7 @@
|
|||
"ro": "Forint",
|
||||
"ru": "венгерский форинт",
|
||||
"sk": "Maďarský forint",
|
||||
"sl": "Madžarski forint",
|
||||
"sl": "madžarski forint",
|
||||
"sr": "мађарска форинта",
|
||||
"sv": "Forint",
|
||||
"ta": "அங்கேரிய போரிண்ட்",
|
||||
|
@ -11713,6 +11565,7 @@
|
|||
"th": "ดินาร์อิรัก",
|
||||
"tr": "Irak dinarı",
|
||||
"uk": "Іракський динар",
|
||||
"sl": "iraški dinar",
|
||||
"ta": "இராக்கிய தீனார்"
|
||||
},
|
||||
"IRR": {
|
||||
|
@ -12985,40 +12838,6 @@
|
|||
"oc": "Naira",
|
||||
"sl": "naira"
|
||||
},
|
||||
"NIC": {
|
||||
"af": "Córdoba",
|
||||
"ar": "كوردبا نيكاراغوا",
|
||||
"bg": "Никарагуанска кордоба",
|
||||
"ca": "córdoba",
|
||||
"cs": "Nikaragujská córdoba",
|
||||
"de": "Córdoba Oro",
|
||||
"en": "Nicaraguan córdoba",
|
||||
"eo": "nikaragva kordovo",
|
||||
"es": "córdoba",
|
||||
"eu": "Córdoba",
|
||||
"fi": "Nicaraguan córdoba",
|
||||
"fr": "Córdoba",
|
||||
"gl": "Córdoba",
|
||||
"he": "קורדובה",
|
||||
"hr": "Nikaragvanska kordoba",
|
||||
"hu": "nicaraguai córdoba",
|
||||
"id": "Córdoba Nikaragua",
|
||||
"it": "Córdoba nicaraguense",
|
||||
"ja": "ニカラグア・コルドバ",
|
||||
"ko": "니카라과 코르도바",
|
||||
"lt": "Nikaragvos kordoba",
|
||||
"nl": "Nicaraguaanse córdoba",
|
||||
"pa": "ਨਿਕਾਰਾਗੁਆਈ ਕੋਰਦੋਬਾ",
|
||||
"pl": "Cordoba oro",
|
||||
"pt": "Córdoba (moeda)",
|
||||
"ro": "Córdoba",
|
||||
"ru": "никарагуанская кордоба",
|
||||
"sr": "никарагванска кордоба",
|
||||
"sv": "Nicaraguansk córdoba",
|
||||
"tr": "Kordoba",
|
||||
"uk": "Нікарагуанська кордоба",
|
||||
"oc": "Córdoba (moneda)"
|
||||
},
|
||||
"NIO": {
|
||||
"af": "Córdoba",
|
||||
"ar": "كوردبا نيكاراغوا",
|
||||
|
@ -13880,6 +13699,7 @@
|
|||
"af": "Singapoer-dollar",
|
||||
"ar": "دولار سنغافوري",
|
||||
"bg": "Сингапурски долар",
|
||||
"bn": "সিঙ্গাপুর ডলার",
|
||||
"ca": "dòlar de Singapur",
|
||||
"cs": "Singapurský dolar",
|
||||
"da": "singaporeansk dollar",
|
||||
|
@ -14164,7 +13984,7 @@
|
|||
"pl": "Funt syryjski",
|
||||
"pt": "libra síria",
|
||||
"ru": "сирийский фунт",
|
||||
"sl": "Sirski funt",
|
||||
"sl": "sirski funt",
|
||||
"sr": "сиријска фунта",
|
||||
"sv": "Syriskt pund",
|
||||
"tr": "Suriye lirası",
|
||||
|
@ -14634,7 +14454,7 @@
|
|||
"ml": "യുണൈറ്റഡ് സ്റ്റേറ്റ്സ് ഡോളർ",
|
||||
"ms": "Dolar Amerika Syarikat",
|
||||
"nl": "US dollar",
|
||||
"oc": "Dolar american",
|
||||
"oc": "dolar american",
|
||||
"pa": "ਸੰਯੁਕਤ ਰਾਜ ਡਾਲਰ",
|
||||
"pap": "Dollar merikano",
|
||||
"pl": "dolar amerykański",
|
||||
|
@ -14651,7 +14471,7 @@
|
|||
"te": "యునైటెడ్ స్టేట్స్ డాలర్",
|
||||
"th": "ดอลลาร์สหรัฐ",
|
||||
"tr": "Amerikan doları",
|
||||
"uk": "долар США",
|
||||
"uk": "Долар США",
|
||||
"vi": "đô la Mỹ"
|
||||
},
|
||||
"UYU": {
|
||||
|
@ -14747,7 +14567,7 @@
|
|||
"cs": "Vietnamský dong",
|
||||
"da": "Dong",
|
||||
"de": "vietnamesischer Đồng",
|
||||
"en": "Vietnam Đồng",
|
||||
"en": "Vietnamese đồng",
|
||||
"eo": "vjetnama dongo",
|
||||
"es": "đồng vietnamita",
|
||||
"eu": "Vietnamdar dong",
|
||||
|
@ -14778,6 +14598,7 @@
|
|||
},
|
||||
"VUV": {
|
||||
"ar": "فاتو فانواتي",
|
||||
"bg": "Вату",
|
||||
"ca": "vatu",
|
||||
"cs": "Vanuatský vatu",
|
||||
"de": "Vatu",
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -47,6 +47,7 @@
|
|||
"es": "es",
|
||||
"fa": "fa",
|
||||
"fr": "fr",
|
||||
"ga": "ga",
|
||||
"he": "he",
|
||||
"hi": "hi",
|
||||
"hr": "hr",
|
||||
|
@ -59,18 +60,19 @@
|
|||
"ko": "ko",
|
||||
"lt": "lt",
|
||||
"lv": "lv",
|
||||
"mn": "mn",
|
||||
"nl": "nl",
|
||||
"no": "no",
|
||||
"pl": "pl",
|
||||
"pt": "pt",
|
||||
"ro": "ro",
|
||||
"ru": "ru",
|
||||
"rw": "rw",
|
||||
"sr": "sr",
|
||||
"sv": "sv",
|
||||
"ta": "ta",
|
||||
"tr": "tr",
|
||||
"uk": "uk",
|
||||
"ur": "ur",
|
||||
"vi": "vi",
|
||||
"zh": "zh",
|
||||
"zh_Hant": "zh-Hant"
|
||||
|
@ -2390,7 +2392,7 @@
|
|||
"zh-TW": "tw-tzh"
|
||||
}
|
||||
},
|
||||
"duckduckgo videos": {
|
||||
"duckduckgo news": {
|
||||
"all_locale": "wt-wt",
|
||||
"custom": {
|
||||
"lang_region": {
|
||||
|
@ -2554,7 +2556,7 @@
|
|||
"zh-TW": "tw-tzh"
|
||||
}
|
||||
},
|
||||
"duckduckgo news": {
|
||||
"duckduckgo videos": {
|
||||
"all_locale": "wt-wt",
|
||||
"custom": {
|
||||
"lang_region": {
|
||||
|
@ -5301,6 +5303,7 @@
|
|||
"CC",
|
||||
"CD",
|
||||
"CF",
|
||||
"CG",
|
||||
"CH",
|
||||
"CI",
|
||||
"CK",
|
||||
|
@ -5378,6 +5381,7 @@
|
|||
"LB",
|
||||
"LC",
|
||||
"LK",
|
||||
"LS",
|
||||
"LT",
|
||||
"LU",
|
||||
"LV",
|
||||
|
@ -5486,6 +5490,7 @@
|
|||
"ak": "akan",
|
||||
"am": "amharic",
|
||||
"ar": "arabic",
|
||||
"as": "assamese",
|
||||
"ast": "asturian",
|
||||
"az": "azerbaijani",
|
||||
"be": "belarusian",
|
||||
|
@ -5967,6 +5972,7 @@
|
|||
"fiu-vro",
|
||||
"fj",
|
||||
"fo",
|
||||
"fon",
|
||||
"fr",
|
||||
"frp",
|
||||
"frr",
|
||||
|
@ -6022,6 +6028,7 @@
|
|||
"kbd",
|
||||
"kbp",
|
||||
"kcg",
|
||||
"kg",
|
||||
"ki",
|
||||
"kk",
|
||||
"kl",
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"versions": [
|
||||
"118.0",
|
||||
"117.0"
|
||||
"119.0",
|
||||
"118.0"
|
||||
],
|
||||
"os": [
|
||||
"Windows NT 10.0; Win64; x64",
|
||||
|
|
|
@ -241,6 +241,7 @@
|
|||
"Q116432563": "ˢ",
|
||||
"Q116443090": "ʰ",
|
||||
"Q1165799": "mil",
|
||||
"Q116939356": "Qs",
|
||||
"Q11776930": "Mg",
|
||||
"Q11830636": "psf",
|
||||
"Q11929860": "kpc",
|
||||
|
@ -268,6 +269,7 @@
|
|||
"Q12269122": "YB/s",
|
||||
"Q12269308": "Zb/s",
|
||||
"Q12269309": "ZB/s",
|
||||
"Q122972375": "Rs",
|
||||
"Q1238720": "vols.",
|
||||
"Q1247300": "cm H₂O",
|
||||
"Q12714022": "cwt",
|
||||
|
@ -822,7 +824,6 @@
|
|||
"Q7398951": "PPI",
|
||||
"Q743895": "bpm",
|
||||
"Q748716": "fps",
|
||||
"Q752079": "RT",
|
||||
"Q752197": "kJ/mol",
|
||||
"Q7574000": "sp",
|
||||
"Q7672057": "TU",
|
||||
|
@ -890,6 +891,7 @@
|
|||
"Q911730": "nx",
|
||||
"Q914151": "P_P",
|
||||
"Q915169": "F_P",
|
||||
"Q918094": "g",
|
||||
"Q93318": "M",
|
||||
"Q933427": "B",
|
||||
"Q93678895": "gill (US)",
|
||||
|
|
|
@ -1,15 +1,6 @@
|
|||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
""".. _limiter src:
|
||||
|
||||
Limiter
|
||||
=======
|
||||
|
||||
.. sidebar:: info
|
||||
|
||||
The limiter requires a :ref:`Redis <settings redis>` database.
|
||||
|
||||
Bot protection / IP rate limitation. The intention of rate limitation is to
|
||||
"""Bot protection / IP rate limitation. The intention of rate limitation is to
|
||||
limit suspicious requests from an IP. The motivation behind this is the fact
|
||||
that SearXNG passes through requests from bots and is thus classified as a bot
|
||||
itself. As a result, the SearXNG engine then receives a CAPTCHA or is blocked
|
||||
|
@ -17,7 +8,40 @@ by the search engine (the origin) in some other way.
|
|||
|
||||
To avoid blocking, the requests from bots to SearXNG must also be blocked, this
|
||||
is the task of the limiter. To perform this task, the limiter uses the methods
|
||||
from the :py:obj:`searx.botdetection`.
|
||||
from the :ref:`botdetection`:
|
||||
|
||||
- Analysis of the HTTP header in the request / :ref:`botdetection probe headers`
|
||||
can be easily bypassed.
|
||||
|
||||
- Block and pass lists in which IPs are listed / :ref:`botdetection ip_lists`
|
||||
are hard to maintain, since the IPs of bots are not all known and change over
|
||||
the time.
|
||||
|
||||
- Detection & dynamically :ref:`botdetection rate limit` of bots based on the
|
||||
behavior of the requests. For dynamically changeable IP lists a Redis
|
||||
database is needed.
|
||||
|
||||
The prerequisite for IP based methods is the correct determination of the IP of
|
||||
the client. The IP of the client is determined via the X-Forwarded-For_ HTTP
|
||||
header.
|
||||
|
||||
.. attention::
|
||||
|
||||
A correct setup of the HTTP request headers ``X-Forwarded-For`` and
|
||||
``X-Real-IP`` is essential to be able to assign a request to an IP correctly:
|
||||
|
||||
- `NGINX RequestHeader`_
|
||||
- `Apache RequestHeader`_
|
||||
|
||||
.. _X-Forwarded-For:
|
||||
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For
|
||||
.. _NGINX RequestHeader:
|
||||
https://docs.searxng.org/admin/installation-nginx.html#nginx-s-searxng-site
|
||||
.. _Apache RequestHeader:
|
||||
https://docs.searxng.org/admin/installation-apache.html#apache-s-searxng-site
|
||||
|
||||
Enable Limiter
|
||||
==============
|
||||
|
||||
To enable the limiter activate:
|
||||
|
||||
|
@ -35,36 +59,72 @@ and set the redis-url connection. Check the value, it depends on your redis DB
|
|||
redis:
|
||||
url: unix:///usr/local/searxng-redis/run/redis.sock?db=0
|
||||
|
||||
|
||||
Configure Limiter
|
||||
=================
|
||||
|
||||
The methods of :ref:`botdetection` the limiter uses are configured in a local
|
||||
file ``/etc/searxng/limiter.toml``. The defaults are shown in limiter.toml_ /
|
||||
Don't copy all values to your local configuration, just enable what you need by
|
||||
overwriting the defaults. For instance to activate the ``link_token`` method in
|
||||
the :ref:`botdetection.ip_limit` you only need to set this option to ``true``:
|
||||
|
||||
.. code:: toml
|
||||
|
||||
[botdetection.ip_limit]
|
||||
link_token = true
|
||||
|
||||
.. _limiter.toml:
|
||||
|
||||
``limiter.toml``
|
||||
================
|
||||
|
||||
In this file the limiter finds the configuration of the :ref:`botdetection`:
|
||||
|
||||
- :ref:`botdetection ip_lists`
|
||||
- :ref:`botdetection rate limit`
|
||||
- :ref:`botdetection probe headers`
|
||||
|
||||
.. kernel-include:: $SOURCEDIR/limiter.toml
|
||||
:code: toml
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
import sys
|
||||
|
||||
from pathlib import Path
|
||||
from ipaddress import ip_address
|
||||
import flask
|
||||
import werkzeug
|
||||
|
||||
from searx.tools import config
|
||||
from searx import logger
|
||||
|
||||
from . import (
|
||||
from searx import (
|
||||
logger,
|
||||
redisdb,
|
||||
)
|
||||
from searx import botdetection
|
||||
from searx.botdetection import (
|
||||
config,
|
||||
http_accept,
|
||||
http_accept_encoding,
|
||||
http_accept_language,
|
||||
http_user_agent,
|
||||
ip_limit,
|
||||
ip_lists,
|
||||
)
|
||||
|
||||
from ._helpers import (
|
||||
get_network,
|
||||
get_real_ip,
|
||||
dump_request,
|
||||
)
|
||||
|
||||
logger = logger.getChild('botdetection.limiter')
|
||||
# the configuration are limiter.toml and "limiter" in settings.yml so, for
|
||||
# coherency, the logger is "limiter"
|
||||
logger = logger.getChild('limiter')
|
||||
|
||||
CFG: config.Config = None # type: ignore
|
||||
_INSTALLED = False
|
||||
|
||||
LIMITER_CFG_SCHEMA = Path(__file__).parent / "limiter.toml"
|
||||
"""Base configuration (schema) of the botdetection."""
|
||||
|
@ -143,3 +203,41 @@ def filter_request(request: flask.Request) -> werkzeug.Response | None:
|
|||
return val
|
||||
logger.debug(f"OK {network}: %s", dump_request(flask.request))
|
||||
return None
|
||||
|
||||
|
||||
def pre_request():
|
||||
"""See :py:obj:`flask.Flask.before_request`"""
|
||||
return filter_request(flask.request)
|
||||
|
||||
|
||||
def is_installed():
|
||||
"""Returns ``True`` if limiter is active and a redis DB is available."""
|
||||
return _INSTALLED
|
||||
|
||||
|
||||
def initialize(app: flask.Flask, settings):
|
||||
"""Install the limiter"""
|
||||
global _INSTALLED # pylint: disable=global-statement
|
||||
|
||||
if not (settings['server']['limiter'] or settings['server']['public_instance']):
|
||||
return
|
||||
|
||||
redis_client = redisdb.client()
|
||||
if not redis_client:
|
||||
logger.error(
|
||||
"The limiter requires Redis, please consult the documentation: "
|
||||
"https://docs.searxng.org/admin/searx.limiter.html"
|
||||
)
|
||||
if settings['server']['public_instance']:
|
||||
sys.exit(1)
|
||||
return
|
||||
|
||||
_INSTALLED = True
|
||||
|
||||
cfg = get_cfg()
|
||||
if settings['server']['public_instance']:
|
||||
# overwrite limiter.toml setting
|
||||
cfg.set('botdetection.ip_limit.link_token', True)
|
||||
|
||||
botdetection.init(cfg, redis_client)
|
||||
app.before_request(pre_request)
|
|
@ -1,38 +0,0 @@
|
|||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
# pyright: basic
|
||||
"""see :ref:`limiter src`"""
|
||||
|
||||
import sys
|
||||
import flask
|
||||
|
||||
from searx import redisdb
|
||||
from searx.plugins import logger
|
||||
from searx.botdetection import limiter
|
||||
|
||||
name = "Request limiter"
|
||||
description = "Limit the number of request"
|
||||
default_on = False
|
||||
preference_section = 'service'
|
||||
|
||||
logger = logger.getChild('limiter')
|
||||
|
||||
|
||||
def pre_request():
|
||||
"""See :ref:`flask.Flask.before_request`"""
|
||||
return limiter.filter_request(flask.request)
|
||||
|
||||
|
||||
def init(app: flask.Flask, settings) -> bool:
|
||||
if not settings['server']['limiter'] and not settings['server']['public_instance']:
|
||||
return False
|
||||
if not redisdb.client():
|
||||
logger.error(
|
||||
"The limiter requires Redis, please consult the documentation: "
|
||||
+ "https://docs.searxng.org/admin/searx.botdetection.html#limiter"
|
||||
)
|
||||
if settings['server']['public_instance']:
|
||||
sys.exit(1)
|
||||
return False
|
||||
app.before_request(pre_request)
|
||||
return True
|
|
@ -17,7 +17,7 @@
|
|||
{% else %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/searxng.min.css') }}" type="text/css" media="screen" />
|
||||
{% endif %}
|
||||
{% if get_setting('server.limiter') %}
|
||||
{% if get_setting('server.limiter') or get_setting('server.public_instance') %}
|
||||
<link rel="stylesheet" href="{{ url_for('client_token', token=link_token) }}" type="text/css" />
|
||||
{% endif %}
|
||||
{% block styles %}{% endblock %}
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
""".. _tools src:
|
||||
|
||||
A collection of *utilities* used by SearXNG, but without SearXNG specific
|
||||
peculiarities.
|
||||
|
||||
"""
|
Binary file not shown.
|
@ -12,15 +12,16 @@ msgstr ""
|
|||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-07-09 15:33+0000\n"
|
||||
"PO-Revision-Date: 2023-10-19 14:53+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"Language-Team: Afrikaans <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/af/>\n"
|
||||
"Language: af\n"
|
||||
"Language-Team: Afrikaans "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/af/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0.2\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -322,7 +323,7 @@ msgstr "Die prent kon nie afgelaai word nie."
|
|||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Morning"
|
||||
msgstr "More"
|
||||
msgstr "Oggend"
|
||||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Noon"
|
||||
|
@ -1399,4 +1400,3 @@ msgstr ""
|
|||
#~ "use another query or search in "
|
||||
#~ "more categories."
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
Binary file not shown.
|
@ -13,20 +13,22 @@
|
|||
# Markus Heiser <markus.heiser@darmarit.de>, 2022.
|
||||
# return42 <markus.heiser@darmarit.de>, 2023.
|
||||
# Ivan Gabaldon <admin@inetol.net>, 2023.
|
||||
# quenty_occitania <quentinantonin@free.fr>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-09-12 14:53+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"PO-Revision-Date: 2023-10-26 15:37+0000\n"
|
||||
"Last-Translator: quenty_occitania <quentinantonin@free.fr>\n"
|
||||
"Language-Team: Catalan <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/ca/>\n"
|
||||
"Language: ca\n"
|
||||
"Language-Team: Catalan "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/ca/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.1\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -117,7 +119,7 @@ msgstr "paquets"
|
|||
#. CATEGORY_GROUPS['Q_A']
|
||||
#: searx/searxng.msg
|
||||
msgid "q&a"
|
||||
msgstr "preguntes i respostes"
|
||||
msgstr "questions i respostes"
|
||||
|
||||
#. CATEGORY_GROUPS['REPOS']
|
||||
#: searx/searxng.msg
|
||||
|
@ -1685,4 +1687,3 @@ msgstr "amaga el vídeo"
|
|||
#~ "no hem trobat cap resultat. Feu "
|
||||
#~ "una consulta diferent o cerqueu en "
|
||||
#~ "més categories."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -13,18 +13,19 @@
|
|||
# RaptaG <george-raptis@tutamail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-09-22 07:07+0000\n"
|
||||
"PO-Revision-Date: 2023-10-20 07:07+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"Language-Team: Greek <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/el/>\n"
|
||||
"Language: el_GR\n"
|
||||
"Language-Team: Greek "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/el/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0.2\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -275,7 +276,7 @@ msgstr "Κανάλι"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "ράδιο"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
|
@ -283,7 +284,7 @@ msgstr ""
|
|||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "ψήφους"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
|
@ -1689,4 +1690,3 @@ msgstr "απόκρυψη βίντεο"
|
|||
#~ "δε βρέθηκαν αποτελέσματα. Παρακαλούμε "
|
||||
#~ "χρησιμοποιήστε άλλη αναζήτηση ή ψάξτε σε"
|
||||
#~ " περισσότερες κατηγορίες."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -13,18 +13,19 @@
|
|||
# alexgabi <alexgabi@disroot.org>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-09-29 07:07+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"PO-Revision-Date: 2023-10-15 20:53+0000\n"
|
||||
"Last-Translator: alexgabi <alexgabi@disroot.org>\n"
|
||||
"Language-Team: Basque <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/eu/>\n"
|
||||
"Language: eu\n"
|
||||
"Language-Team: Basque "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/eu/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0.2\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -275,19 +276,19 @@ msgstr "Kanala"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "irratia"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "bit emaria"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "botoak"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
msgstr ""
|
||||
msgstr "klikak"
|
||||
|
||||
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
|
||||
msgid "Language"
|
||||
|
@ -1665,4 +1666,3 @@ msgstr "ezkutatu bideoa"
|
|||
#~ "ez dugu emaitzarik aurkitu. Mesedez "
|
||||
#~ "beste kontsulta bat egin edo bilatu "
|
||||
#~ "kategoria gehiagotan."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -10,18 +10,19 @@
|
|||
# artnay <jiri.gronroos@iki.fi>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-09-23 16:53+0000\n"
|
||||
"Last-Translator: artnay <jiri.gronroos@iki.fi>\n"
|
||||
"PO-Revision-Date: 2023-10-26 15:37+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"Language-Team: Finnish <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/fi/>\n"
|
||||
"Language: fi\n"
|
||||
"Language-Team: Finnish "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/fi/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.1\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -272,15 +273,15 @@ msgstr "Kanava"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "radio"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "bittinopeus"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "ääntä"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
|
@ -1677,4 +1678,3 @@ msgstr "piilota video"
|
|||
#~ "löytynyt. Etsi käyttäen eri hakuehtoja "
|
||||
#~ "tai ulota hakusi nykyistä useampiin eri"
|
||||
#~ " luokkiin."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -9,19 +9,20 @@
|
|||
# return42 <markus.heiser@darmarit.de>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-09-12 14:53+0000\n"
|
||||
"PO-Revision-Date: 2023-10-24 11:13+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"Language-Team: Filipino <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/fil/>\n"
|
||||
"Language: fil\n"
|
||||
"Language-Team: Filipino "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/fil/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n == 1 || n==2 || n==3) || (n % 10 != 4"
|
||||
" || n % 10 != 6 || n % 10 != 9);\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n == 1 || n==2 || n==3) || (n % 10 != 4 || "
|
||||
"n % 10 != 6 || n % 10 != 9);\n"
|
||||
"X-Generator: Weblate 5.1\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -272,11 +273,11 @@ msgstr "Tyanel"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "radyo"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "bitrate"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
|
@ -1671,4 +1672,3 @@ msgstr "itago ang video"
|
|||
#~ "wala kaming nakita na resulta. Pakiusap"
|
||||
#~ " na ibahin ang tanong o maghanap "
|
||||
#~ "sa maraming uri."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -17,13 +17,14 @@
|
|||
# NoEnd-yt <isaac.landau2104@gmail.com>, 2023.
|
||||
# return42 <markus.heiser@darmarit.de>, 2023.
|
||||
# microsoftocsharp <kottiberyu@gmail.com>, 2023.
|
||||
# quenty_occitania <quentinantonin@free.fr>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-10-06 07:07+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"PO-Revision-Date: 2023-10-27 07:07+0000\n"
|
||||
"Last-Translator: quenty_occitania <quentinantonin@free.fr>\n"
|
||||
"Language-Team: French <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/fr/>\n"
|
||||
"Language: fr\n"
|
||||
|
@ -31,7 +32,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.0.2\n"
|
||||
"X-Generator: Weblate 5.1\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -270,7 +271,7 @@ msgstr "Obtenir l'itinéraire"
|
|||
|
||||
#: searx/engines/pdbe.py:96
|
||||
msgid "{title} (OBSOLETE)"
|
||||
msgstr "{titre} (OBSOLÈTE)"
|
||||
msgstr "{title} (OBSOLÈTE)"
|
||||
|
||||
#: searx/engines/pdbe.py:103
|
||||
msgid "This entry has been superseded by"
|
||||
|
@ -282,19 +283,19 @@ msgstr "Chaîne"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "radio"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "débit"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "voix"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
msgstr ""
|
||||
msgstr "clics"
|
||||
|
||||
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
|
||||
msgid "Language"
|
||||
|
@ -1021,7 +1022,7 @@ msgstr "Raccourcis clavier"
|
|||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:13
|
||||
msgid "Vim-like"
|
||||
msgstr ""
|
||||
msgstr "Comme-vim"
|
||||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:18
|
||||
msgid ""
|
||||
|
|
Binary file not shown.
|
@ -11,7 +11,7 @@ msgstr ""
|
|||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-10-06 07:07+0000\n"
|
||||
"PO-Revision-Date: 2023-10-24 11:13+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"Language-Team: Latvian <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/lv/>\n"
|
||||
|
@ -21,7 +21,7 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= "
|
||||
"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n"
|
||||
"X-Generator: Weblate 5.0.2\n"
|
||||
"X-Generator: Weblate 5.1\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -272,19 +272,19 @@ msgstr "Kanāls"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "radio"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "bitu pārraide"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "balsis"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
msgstr ""
|
||||
msgstr "klikšķi"
|
||||
|
||||
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
|
||||
msgid "Language"
|
||||
|
@ -304,16 +304,20 @@ msgid ""
|
|||
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
|
||||
" WebP."
|
||||
msgstr ""
|
||||
"Nevar nolasīt šo attēla url. Tas var būt saistīts ar neatbalstītu faila "
|
||||
"formātu. TinEye atbalsta tikai JPEG, PNG, GIF, BMP, TIFF vai WebP attēlus."
|
||||
|
||||
#: searx/engines/tineye.py:46
|
||||
msgid ""
|
||||
"The image is too simple to find matches. TinEye requires a basic level of"
|
||||
" visual detail to successfully identify matches."
|
||||
msgstr ""
|
||||
"Attēls ir pārāk vienkāršs, lai atrastu atbilstību. Lai veiksmīgi noteiktu "
|
||||
"sakritības, TinEye ir nepieciešams pamata vizuālo detaļu līmenis."
|
||||
|
||||
#: searx/engines/tineye.py:52
|
||||
msgid "The image could not be downloaded."
|
||||
msgstr "Attēlu nav iespējams lejupielādēt"
|
||||
msgstr "Attēlu neizdevās lejupielādēt."
|
||||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Morning"
|
||||
|
@ -354,26 +358,32 @@ msgstr "Resursdatora vārda nomaiņa"
|
|||
#: searx/plugins/hostname_replace.py:10
|
||||
msgid "Rewrite result hostnames or remove results based on the hostname"
|
||||
msgstr ""
|
||||
"Pārrakstīt rezultātu saimniekvārdus vai noņemt rezultātus, pamatojoties uz "
|
||||
"saimniekvārdu"
|
||||
|
||||
#: searx/plugins/oa_doi_rewrite.py:9
|
||||
msgid "Open Access DOI rewrite"
|
||||
msgstr ""
|
||||
msgstr "Atvērtās piekļuves DOI pārrakstīšana"
|
||||
|
||||
#: searx/plugins/oa_doi_rewrite.py:10
|
||||
msgid ""
|
||||
"Avoid paywalls by redirecting to open-access versions of publications "
|
||||
"when available"
|
||||
msgstr ""
|
||||
"Izvairieties no maksas sienām, novirzot uz publikāciju atvērtās piekļuves "
|
||||
"versijām, ja tās ir pieejamas"
|
||||
|
||||
#: searx/plugins/self_info.py:10
|
||||
msgid "Self Information"
|
||||
msgstr ""
|
||||
msgstr "Informācija par sevi"
|
||||
|
||||
#: searx/plugins/self_info.py:11
|
||||
msgid ""
|
||||
"Displays your IP if the query is \"ip\" and your user agent if the query "
|
||||
"contains \"user agent\"."
|
||||
msgstr ""
|
||||
"Tiek parādīts jūsu IP, ja pieprasījums ir \"ip\", un jūsu lietotāja aģents, "
|
||||
"ja pieprasījumā ir \"user agent\"."
|
||||
|
||||
#: searx/plugins/tor_check.py:25
|
||||
msgid "Tor check plugin"
|
||||
|
@ -403,7 +413,7 @@ msgstr ""
|
|||
|
||||
#: searx/plugins/tracker_url_remover.py:29
|
||||
msgid "Tracker URL remover"
|
||||
msgstr ""
|
||||
msgstr "Izsekošanas URL noņemšanas līdzeklis"
|
||||
|
||||
#: searx/plugins/tracker_url_remover.py:30
|
||||
msgid "Remove trackers arguments from the returned URL"
|
||||
|
|
Binary file not shown.
|
@ -19,18 +19,19 @@
|
|||
# microsoftocsharp <kottiberyu@gmail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-09-12 14:53+0000\n"
|
||||
"PO-Revision-Date: 2023-10-17 13:53+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"Language-Team: Dutch <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/nl/>\n"
|
||||
"Language: nl\n"
|
||||
"Language-Team: Dutch "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/nl/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.0.2\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -281,19 +282,19 @@ msgstr "Kanaal"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "radio"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "bitrate"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "stemmen"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
msgstr ""
|
||||
msgstr "clicks"
|
||||
|
||||
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
|
||||
msgid "Language"
|
||||
|
@ -854,7 +855,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:6
|
||||
msgid "Refresh the page."
|
||||
msgstr ""
|
||||
msgstr "Ververs de pagina"
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:7
|
||||
msgid "Search for another query or select another category (above)."
|
||||
|
@ -1696,4 +1697,3 @@ msgstr "verberg video"
|
|||
#~ "We konden geen resultaten vinden. "
|
||||
#~ "Probeer een andere zoekopdracht, of zoek"
|
||||
#~ " in meer categorieën."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -6,31 +6,33 @@
|
|||
# Quentin PAGÈS, 2016,2018
|
||||
# Marc Abonce Seguin, 2019
|
||||
# return42 <markus.heiser@darmarit.de>, 2023.
|
||||
# quenty_occitania <quentinantonin@free.fr>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-07-09 15:34+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"PO-Revision-Date: 2023-10-27 07:07+0000\n"
|
||||
"Last-Translator: quenty_occitania <quentinantonin@free.fr>\n"
|
||||
"Language-Team: Occitan <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/oc/>\n"
|
||||
"Language: oc\n"
|
||||
"Language-Team: Occitan "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/oc/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 5.1\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
#: searx/searxng.msg
|
||||
msgid "without further subgrouping"
|
||||
msgstr ""
|
||||
msgstr "sens jos grop"
|
||||
|
||||
#. CONSTANT_NAMES['DEFAULT_CATEGORY']
|
||||
#: searx/searxng.msg
|
||||
msgid "other"
|
||||
msgstr ""
|
||||
msgstr "autre"
|
||||
|
||||
#. CATEGORY_NAMES['FILES']
|
||||
#: searx/searxng.msg
|
||||
|
@ -80,7 +82,7 @@ msgstr "mapa"
|
|||
#. CATEGORY_NAMES['ONIONS']
|
||||
#: searx/searxng.msg
|
||||
msgid "onions"
|
||||
msgstr ""
|
||||
msgstr "onions"
|
||||
|
||||
#. CATEGORY_NAMES['SCIENCE']
|
||||
#: searx/searxng.msg
|
||||
|
@ -90,62 +92,62 @@ msgstr "sciéncia"
|
|||
#. CATEGORY_GROUPS['APPS']
|
||||
#: searx/searxng.msg
|
||||
msgid "apps"
|
||||
msgstr ""
|
||||
msgstr "aplicacions"
|
||||
|
||||
#. CATEGORY_GROUPS['DICTIONARIES']
|
||||
#: searx/searxng.msg
|
||||
msgid "dictionaries"
|
||||
msgstr ""
|
||||
msgstr "diccionaris"
|
||||
|
||||
#. CATEGORY_GROUPS['LYRICS']
|
||||
#: searx/searxng.msg
|
||||
msgid "lyrics"
|
||||
msgstr ""
|
||||
msgstr "paraulas"
|
||||
|
||||
#. CATEGORY_GROUPS['PACKAGES']
|
||||
#: searx/searxng.msg
|
||||
msgid "packages"
|
||||
msgstr ""
|
||||
msgstr "paquets"
|
||||
|
||||
#. CATEGORY_GROUPS['Q_A']
|
||||
#: searx/searxng.msg
|
||||
msgid "q&a"
|
||||
msgstr ""
|
||||
msgstr "questions/responsas"
|
||||
|
||||
#. CATEGORY_GROUPS['REPOS']
|
||||
#: searx/searxng.msg
|
||||
msgid "repos"
|
||||
msgstr ""
|
||||
msgstr "repertòris"
|
||||
|
||||
#. CATEGORY_GROUPS['SOFTWARE_WIKIS']
|
||||
#: searx/searxng.msg
|
||||
msgid "software wikis"
|
||||
msgstr ""
|
||||
msgstr "wikis logicial"
|
||||
|
||||
#. CATEGORY_GROUPS['WEB']
|
||||
#: searx/searxng.msg
|
||||
msgid "web"
|
||||
msgstr ""
|
||||
msgstr "web"
|
||||
|
||||
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
|
||||
#: searx/searxng.msg
|
||||
msgid "scientific publications"
|
||||
msgstr ""
|
||||
msgstr "articles scientifics"
|
||||
|
||||
#. STYLE_NAMES['AUTO']
|
||||
#: searx/searxng.msg
|
||||
msgid "auto"
|
||||
msgstr ""
|
||||
msgstr "automatic"
|
||||
|
||||
#. STYLE_NAMES['LIGHT']
|
||||
#: searx/searxng.msg
|
||||
msgid "light"
|
||||
msgstr ""
|
||||
msgstr "clar"
|
||||
|
||||
#. STYLE_NAMES['DARK']
|
||||
#: searx/searxng.msg
|
||||
msgid "dark"
|
||||
msgstr ""
|
||||
msgstr "fosc"
|
||||
|
||||
#: searx/webapp.py:331
|
||||
msgid "No item found"
|
||||
|
@ -154,11 +156,11 @@ msgstr "Cap d’element pas trobat"
|
|||
#: searx/engines/qwant.py:280
|
||||
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:333
|
||||
msgid "Source"
|
||||
msgstr ""
|
||||
msgstr "Font"
|
||||
|
||||
#: searx/webapp.py:335
|
||||
msgid "Error loading the next page"
|
||||
msgstr ""
|
||||
msgstr "Error en cargant la pagina seguenta"
|
||||
|
||||
#: searx/webapp.py:492 searx/webapp.py:888
|
||||
msgid "Invalid settings, please edit your preferences"
|
||||
|
@ -174,59 +176,59 @@ msgstr "error de recèrca"
|
|||
|
||||
#: searx/webutils.py:34
|
||||
msgid "timeout"
|
||||
msgstr ""
|
||||
msgstr "expirat"
|
||||
|
||||
#: searx/webutils.py:35
|
||||
msgid "parsing error"
|
||||
msgstr ""
|
||||
msgstr "error d’analisi"
|
||||
|
||||
#: searx/webutils.py:36
|
||||
msgid "HTTP protocol error"
|
||||
msgstr ""
|
||||
msgstr "error de protocòl HTTP"
|
||||
|
||||
#: searx/webutils.py:37
|
||||
msgid "network error"
|
||||
msgstr ""
|
||||
msgstr "Error de ret"
|
||||
|
||||
#: searx/webutils.py:38
|
||||
msgid "SSL error: certificate validation has failed"
|
||||
msgstr ""
|
||||
msgstr "Error SSL : la verificacion del certificat a fracassat"
|
||||
|
||||
#: searx/webutils.py:40
|
||||
msgid "unexpected crash"
|
||||
msgstr ""
|
||||
msgstr "error inesperada"
|
||||
|
||||
#: searx/webutils.py:47
|
||||
msgid "HTTP error"
|
||||
msgstr ""
|
||||
msgstr "error HTTP"
|
||||
|
||||
#: searx/webutils.py:48
|
||||
msgid "HTTP connection error"
|
||||
msgstr ""
|
||||
msgstr "error de connexion HTTP"
|
||||
|
||||
#: searx/webutils.py:54
|
||||
msgid "proxy error"
|
||||
msgstr ""
|
||||
msgstr "Error servidor mandatari"
|
||||
|
||||
#: searx/webutils.py:55
|
||||
msgid "CAPTCHA"
|
||||
msgstr ""
|
||||
msgstr "CAPTCHA"
|
||||
|
||||
#: searx/webutils.py:56
|
||||
msgid "too many requests"
|
||||
msgstr ""
|
||||
msgstr "tròpas de requèstas"
|
||||
|
||||
#: searx/webutils.py:57
|
||||
msgid "access denied"
|
||||
msgstr ""
|
||||
msgstr "accès refusat"
|
||||
|
||||
#: searx/webutils.py:58
|
||||
msgid "server API error"
|
||||
msgstr ""
|
||||
msgstr "error de l’API del servidor"
|
||||
|
||||
#: searx/webutils.py:77
|
||||
msgid "Suspended"
|
||||
msgstr ""
|
||||
msgstr "Suspendut"
|
||||
|
||||
#: searx/webutils.py:317
|
||||
msgid "{minutes} minute(s) ago"
|
||||
|
@ -254,11 +256,11 @@ msgstr "Calcula las {functions} dels arguments"
|
|||
|
||||
#: searx/engines/openstreetmap.py:160
|
||||
msgid "Get directions"
|
||||
msgstr ""
|
||||
msgstr "Obténer l’itinerari"
|
||||
|
||||
#: searx/engines/pdbe.py:96
|
||||
msgid "{title} (OBSOLETE)"
|
||||
msgstr ""
|
||||
msgstr "{title} (OBSOLÈT)"
|
||||
|
||||
#: searx/engines/pdbe.py:103
|
||||
msgid "This entry has been superseded by"
|
||||
|
@ -266,23 +268,23 @@ msgstr "Aqueste element es estat remplaçat per"
|
|||
|
||||
#: searx/engines/qwant.py:282
|
||||
msgid "Channel"
|
||||
msgstr ""
|
||||
msgstr "Canal"
|
||||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "ràdio"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "debit"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "vòtes"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
msgstr ""
|
||||
msgstr "clics"
|
||||
|
||||
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
|
||||
msgid "Language"
|
||||
|
@ -293,6 +295,8 @@ msgid ""
|
|||
"{numCitations} citations from the year {firstCitationVelocityYear} to "
|
||||
"{lastCitationVelocityYear}"
|
||||
msgstr ""
|
||||
"{numCitations} citacions dempuèi l’annada {firstCitationVelocityYear} fins a "
|
||||
"{lastCitationVelocityYear}"
|
||||
|
||||
#: searx/engines/tineye.py:40
|
||||
msgid ""
|
||||
|
@ -309,31 +313,31 @@ msgstr ""
|
|||
|
||||
#: searx/engines/tineye.py:52
|
||||
msgid "The image could not be downloaded."
|
||||
msgstr ""
|
||||
msgstr "Telecargament impossible de l’imatge."
|
||||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Morning"
|
||||
msgstr ""
|
||||
msgstr "Matin"
|
||||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Noon"
|
||||
msgstr ""
|
||||
msgstr "Miègjorn"
|
||||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Evening"
|
||||
msgstr ""
|
||||
msgstr "Ser"
|
||||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Night"
|
||||
msgstr ""
|
||||
msgstr "Nuèch"
|
||||
|
||||
#: searx/engines/zlibrary.py:130
|
||||
msgid "Book rating"
|
||||
msgstr ""
|
||||
msgstr "Nòta del libre"
|
||||
|
||||
#: searx/engines/zlibrary.py:131
|
||||
msgid "File quality"
|
||||
msgstr ""
|
||||
msgstr "Qualitat del fichièr"
|
||||
|
||||
#: searx/plugins/hash_plugin.py:24
|
||||
msgid "Converts strings to different hash digests."
|
||||
|
@ -345,7 +349,7 @@ msgstr ""
|
|||
|
||||
#: searx/plugins/hostname_replace.py:9
|
||||
msgid "Hostname replace"
|
||||
msgstr ""
|
||||
msgstr "Remplaçar los noms d’òste"
|
||||
|
||||
#: searx/plugins/hostname_replace.py:10
|
||||
msgid "Rewrite result hostnames or remove results based on the hostname"
|
||||
|
@ -365,7 +369,7 @@ msgstr ""
|
|||
|
||||
#: searx/plugins/self_info.py:10
|
||||
msgid "Self Information"
|
||||
msgstr ""
|
||||
msgstr "Informacions pròpias"
|
||||
|
||||
#: searx/plugins/self_info.py:11
|
||||
msgid ""
|
||||
|
@ -377,7 +381,7 @@ msgstr ""
|
|||
|
||||
#: searx/plugins/tor_check.py:25
|
||||
msgid "Tor check plugin"
|
||||
msgstr ""
|
||||
msgstr "Empeuton de verificacion de Tor"
|
||||
|
||||
#: searx/plugins/tor_check.py:28
|
||||
msgid ""
|
||||
|
@ -395,7 +399,7 @@ msgstr ""
|
|||
msgid ""
|
||||
"You are using Tor and it looks like you have this external IP address: "
|
||||
"{ip_address}"
|
||||
msgstr ""
|
||||
msgstr "Utilizatz Tor e sembla qu’avètz aquesta adreça IP : {ip_address}"
|
||||
|
||||
#: searx/plugins/tor_check.py:86
|
||||
msgid "You are not using Tor and you have this external IP address: {ip_address}"
|
||||
|
@ -424,11 +428,11 @@ msgstr "cercar dins la pagina"
|
|||
|
||||
#: searx/templates/simple/base.html:49
|
||||
msgid "About"
|
||||
msgstr ""
|
||||
msgstr "A prepaus"
|
||||
|
||||
#: searx/templates/simple/base.html:53
|
||||
msgid "Donate"
|
||||
msgstr ""
|
||||
msgstr "Far un don"
|
||||
|
||||
#: searx/templates/simple/base.html:57
|
||||
#: searx/templates/simple/preferences.html:156
|
||||
|
@ -445,11 +449,11 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/base.html:68
|
||||
msgid "Source code"
|
||||
msgstr ""
|
||||
msgstr "Còdi font"
|
||||
|
||||
#: searx/templates/simple/base.html:69
|
||||
msgid "Issue tracker"
|
||||
msgstr ""
|
||||
msgstr "Seguiment d’anomalias"
|
||||
|
||||
#: searx/templates/simple/base.html:70 searx/templates/simple/stats.html:18
|
||||
msgid "Engine stats"
|
||||
|
@ -457,15 +461,15 @@ msgstr "Estatistica del motor"
|
|||
|
||||
#: searx/templates/simple/base.html:72
|
||||
msgid "Public instances"
|
||||
msgstr ""
|
||||
msgstr "Instàncias publicas"
|
||||
|
||||
#: searx/templates/simple/base.html:75
|
||||
msgid "Privacy policy"
|
||||
msgstr ""
|
||||
msgstr "Politica de confidencialitat"
|
||||
|
||||
#: searx/templates/simple/base.html:78
|
||||
msgid "Contact instance maintainer"
|
||||
msgstr ""
|
||||
msgstr "Contactatz lo responsable de l’instància"
|
||||
|
||||
#: searx/templates/simple/categories.html:26
|
||||
msgid "Click on the magnifier to perform search"
|
||||
|
@ -473,13 +477,13 @@ msgstr "Clicatz sus la lópia per lançar una recèrca"
|
|||
|
||||
#: searx/templates/simple/macros.html:36
|
||||
msgid "Length"
|
||||
msgstr ""
|
||||
msgstr "Longor"
|
||||
|
||||
#: searx/templates/simple/macros.html:37
|
||||
#: searx/templates/simple/result_templates/images.html:18
|
||||
#: searx/templates/simple/result_templates/paper.html:6
|
||||
msgid "Author"
|
||||
msgstr ""
|
||||
msgstr "Autor"
|
||||
|
||||
#: searx/templates/simple/macros.html:45
|
||||
msgid "cached"
|
||||
|
@ -491,7 +495,7 @@ msgstr "proxifiat"
|
|||
|
||||
#: searx/templates/simple/new_issue.html:64
|
||||
msgid "Start submiting a new issue on GitHub"
|
||||
msgstr ""
|
||||
msgstr "Senhalar un problèma sus GitHub"
|
||||
|
||||
#: searx/templates/simple/new_issue.html:66
|
||||
msgid "Please check for existing bugs about this engine on GitHub"
|
||||
|
@ -511,7 +515,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/preferences.html:65
|
||||
msgid "No HTTPS"
|
||||
msgstr ""
|
||||
msgstr "Cap de HTTPS"
|
||||
|
||||
#: searx/templates/simple/elements/engines_msg.html:18
|
||||
#: searx/templates/simple/preferences.html:69
|
||||
|
@ -535,12 +539,12 @@ msgstr ""
|
|||
#: searx/templates/simple/preferences.html:103
|
||||
#: searx/templates/simple/stats.html:70
|
||||
msgid "P80"
|
||||
msgstr ""
|
||||
msgstr "P80"
|
||||
|
||||
#: searx/templates/simple/preferences.html:104
|
||||
#: searx/templates/simple/stats.html:76
|
||||
msgid "P95"
|
||||
msgstr ""
|
||||
msgstr "P95"
|
||||
|
||||
#: searx/templates/simple/preferences.html:136
|
||||
msgid "Failed checker test(s): "
|
||||
|
@ -548,7 +552,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/preferences.html:138
|
||||
msgid "Errors:"
|
||||
msgstr ""
|
||||
msgstr "Errors :"
|
||||
|
||||
#: searx/templates/simple/preferences.html:162
|
||||
msgid "General"
|
||||
|
@ -576,7 +580,7 @@ msgstr "Motors de recèrca utilizat actualament"
|
|||
|
||||
#: searx/templates/simple/preferences.html:231
|
||||
msgid "Special Queries"
|
||||
msgstr ""
|
||||
msgstr "Requèstas especialas"
|
||||
|
||||
#: searx/templates/simple/preferences.html:237
|
||||
msgid "Cookies"
|
||||
|
@ -592,7 +596,7 @@ msgstr "Nombre de resultats"
|
|||
|
||||
#: searx/templates/simple/results.html:44
|
||||
msgid "Info"
|
||||
msgstr ""
|
||||
msgstr "Info"
|
||||
|
||||
#: searx/templates/simple/results.html:73
|
||||
msgid "Try searching for:"
|
||||
|
@ -600,19 +604,19 @@ msgstr "Ensajatz de cercar :"
|
|||
|
||||
#: searx/templates/simple/results.html:105
|
||||
msgid "Back to top"
|
||||
msgstr ""
|
||||
msgstr "Tornar ennaut"
|
||||
|
||||
#: searx/templates/simple/results.html:123
|
||||
msgid "Previous page"
|
||||
msgstr ""
|
||||
msgstr "Pagina precedenta"
|
||||
|
||||
#: searx/templates/simple/results.html:140
|
||||
msgid "Next page"
|
||||
msgstr ""
|
||||
msgstr "Pagina seguenta"
|
||||
|
||||
#: searx/templates/simple/search.html:3
|
||||
msgid "Display the front page"
|
||||
msgstr ""
|
||||
msgstr "Afichar la pagina principala"
|
||||
|
||||
#: searx/templates/simple/search.html:9
|
||||
#: searx/templates/simple/simple_search.html:5
|
||||
|
@ -622,12 +626,12 @@ msgstr "Cerca per..."
|
|||
#: searx/templates/simple/search.html:10
|
||||
#: searx/templates/simple/simple_search.html:6
|
||||
msgid "clear"
|
||||
msgstr ""
|
||||
msgstr "escafar"
|
||||
|
||||
#: searx/templates/simple/search.html:11
|
||||
#: searx/templates/simple/simple_search.html:7
|
||||
msgid "search"
|
||||
msgstr ""
|
||||
msgstr "recercar"
|
||||
|
||||
#: searx/templates/simple/stats.html:21
|
||||
msgid "There is currently no data available. "
|
||||
|
@ -644,12 +648,12 @@ msgstr "Marcas"
|
|||
|
||||
#: searx/templates/simple/stats.html:27
|
||||
msgid "Result count"
|
||||
msgstr ""
|
||||
msgstr "Resultats"
|
||||
|
||||
#: searx/templates/simple/preferences/engines.html:25
|
||||
#: searx/templates/simple/stats.html:28
|
||||
msgid "Response time"
|
||||
msgstr ""
|
||||
msgstr "Temps de responsa"
|
||||
|
||||
#: searx/templates/simple/preferences/engines.html:29
|
||||
#: searx/templates/simple/stats.html:29
|
||||
|
@ -658,19 +662,19 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/stats.html:59
|
||||
msgid "Total"
|
||||
msgstr ""
|
||||
msgstr "Total"
|
||||
|
||||
#: searx/templates/simple/stats.html:60
|
||||
msgid "HTTP"
|
||||
msgstr ""
|
||||
msgstr "HTTP"
|
||||
|
||||
#: searx/templates/simple/stats.html:61
|
||||
msgid "Processing"
|
||||
msgstr ""
|
||||
msgstr "Tractament"
|
||||
|
||||
#: searx/templates/simple/stats.html:99
|
||||
msgid "Warnings"
|
||||
msgstr ""
|
||||
msgstr "Avertiments"
|
||||
|
||||
#: searx/templates/simple/stats.html:99
|
||||
msgid "Errors and exceptions"
|
||||
|
@ -678,35 +682,35 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/stats.html:105
|
||||
msgid "Exception"
|
||||
msgstr ""
|
||||
msgstr "Excepcion"
|
||||
|
||||
#: searx/templates/simple/stats.html:107
|
||||
msgid "Message"
|
||||
msgstr ""
|
||||
msgstr "Messatge"
|
||||
|
||||
#: searx/templates/simple/stats.html:109
|
||||
msgid "Percentage"
|
||||
msgstr ""
|
||||
msgstr "Percentatge"
|
||||
|
||||
#: searx/templates/simple/stats.html:111
|
||||
msgid "Parameter"
|
||||
msgstr ""
|
||||
msgstr "Paramètre"
|
||||
|
||||
#: searx/templates/simple/stats.html:119
|
||||
msgid "Filename"
|
||||
msgstr ""
|
||||
msgstr "Nom del fichièr"
|
||||
|
||||
#: searx/templates/simple/stats.html:120
|
||||
msgid "Function"
|
||||
msgstr ""
|
||||
msgstr "Foncion"
|
||||
|
||||
#: searx/templates/simple/stats.html:121
|
||||
msgid "Code"
|
||||
msgstr ""
|
||||
msgstr "Còdi"
|
||||
|
||||
#: searx/templates/simple/stats.html:128
|
||||
msgid "Checker"
|
||||
msgstr ""
|
||||
msgstr "Verificador"
|
||||
|
||||
#: searx/templates/simple/stats.html:131
|
||||
msgid "Failed test"
|
||||
|
@ -714,7 +718,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/stats.html:132
|
||||
msgid "Comment(s)"
|
||||
msgstr ""
|
||||
msgstr "Comentari(s)"
|
||||
|
||||
#: searx/templates/simple/elements/apis.html:3
|
||||
msgid "Download results"
|
||||
|
@ -822,7 +826,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:6
|
||||
msgid "Refresh the page."
|
||||
msgstr ""
|
||||
msgstr "Actualizar la pagina."
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:7
|
||||
msgid "Search for another query or select another category (above)."
|
||||
|
@ -945,7 +949,7 @@ msgstr "Compatible amb las lengas seleccionadas"
|
|||
|
||||
#: searx/templates/simple/preferences/engines.html:23
|
||||
msgid "Weight"
|
||||
msgstr ""
|
||||
msgstr "Pes"
|
||||
|
||||
#: searx/templates/simple/preferences/engines.html:27
|
||||
msgid "Max time"
|
||||
|
@ -969,7 +973,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/preferences/footer.html:6
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
msgstr "Enregistrar"
|
||||
|
||||
#: searx/templates/simple/preferences/footer.html:9
|
||||
msgid "Reset defaults"
|
||||
|
@ -977,11 +981,11 @@ msgstr "Reïnicializar per defaut"
|
|||
|
||||
#: searx/templates/simple/preferences/footer.html:13
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
msgstr "Tornar"
|
||||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:2
|
||||
msgid "Hotkeys"
|
||||
msgstr ""
|
||||
msgstr "Acorchi clavièr"
|
||||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:13
|
||||
msgid "Vim-like"
|
||||
|
@ -1019,7 +1023,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/preferences/method.html:2
|
||||
msgid "HTTP Method"
|
||||
msgstr ""
|
||||
msgstr "Metòde HTTP"
|
||||
|
||||
#: searx/templates/simple/preferences/method.html:14
|
||||
msgid "Change how forms are submitted"
|
||||
|
@ -1059,7 +1063,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/preferences/theme.html:2
|
||||
msgid "Theme"
|
||||
msgstr ""
|
||||
msgstr "Tèma"
|
||||
|
||||
#: searx/templates/simple/preferences/theme.html:14
|
||||
msgid "Change SearXNG layout"
|
||||
|
@ -1067,7 +1071,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/preferences/theme.html:19
|
||||
msgid "Theme style"
|
||||
msgstr ""
|
||||
msgstr "Estil del tèma"
|
||||
|
||||
#: searx/templates/simple/preferences/theme.html:31
|
||||
msgid "Choose auto to follow your browser settings"
|
||||
|
@ -1108,11 +1112,11 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/result_templates/images.html:19
|
||||
msgid "Format"
|
||||
msgstr ""
|
||||
msgstr "Format"
|
||||
|
||||
#: searx/templates/simple/result_templates/images.html:21
|
||||
msgid "Engine"
|
||||
msgstr ""
|
||||
msgstr "Motor"
|
||||
|
||||
#: searx/templates/simple/result_templates/images.html:22
|
||||
msgid "View source"
|
||||
|
@ -1120,7 +1124,7 @@ msgstr "Veire font"
|
|||
|
||||
#: searx/templates/simple/result_templates/map.html:12
|
||||
msgid "address"
|
||||
msgstr ""
|
||||
msgstr "adreça"
|
||||
|
||||
#: searx/templates/simple/result_templates/map.html:43
|
||||
msgid "show map"
|
||||
|
@ -1132,47 +1136,47 @@ msgstr "escondre la mapa"
|
|||
|
||||
#: searx/templates/simple/result_templates/paper.html:5
|
||||
msgid "Published date"
|
||||
msgstr ""
|
||||
msgstr "Data de publicacion"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:9
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
msgstr "Jornal"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:22
|
||||
msgid "Editor"
|
||||
msgstr ""
|
||||
msgstr "Editor"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:23
|
||||
msgid "Publisher"
|
||||
msgstr ""
|
||||
msgstr "Editor"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:24
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
msgstr "Tipe"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:25
|
||||
msgid "Tags"
|
||||
msgstr ""
|
||||
msgstr "Etiquetas"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:26
|
||||
msgid "DOI"
|
||||
msgstr ""
|
||||
msgstr "DOI"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:27
|
||||
msgid "ISSN"
|
||||
msgstr ""
|
||||
msgstr "ISSN"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:28
|
||||
msgid "ISBN"
|
||||
msgstr ""
|
||||
msgstr "ISBN"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:33
|
||||
msgid "PDF"
|
||||
msgstr ""
|
||||
msgstr "PDF"
|
||||
|
||||
#: searx/templates/simple/result_templates/paper.html:34
|
||||
msgid "HTML"
|
||||
msgstr ""
|
||||
msgstr "HTML"
|
||||
|
||||
#: searx/templates/simple/result_templates/torrent.html:6
|
||||
msgid "magnet link"
|
||||
|
@ -1630,4 +1634,3 @@ msgstr "escondre la vidèo"
|
|||
#~ "avèm pas trobat cap de resultat. "
|
||||
#~ "Mercés d'utilizar une autre mot clau "
|
||||
#~ "o de cercar dins autras categorias."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -17,18 +17,19 @@
|
|||
# return42 <markus.heiser@darmarit.de>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-09-23 16:53+0000\n"
|
||||
"PO-Revision-Date: 2023-10-26 15:37+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"Language-Team: Swedish <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/sv/>\n"
|
||||
"Language: sv\n"
|
||||
"Language-Team: Swedish "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/sv/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.1\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -279,19 +280,19 @@ msgstr "Kanal"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "radio"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "bithastighet"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "röster"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
msgstr ""
|
||||
msgstr "klick"
|
||||
|
||||
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
|
||||
msgid "Language"
|
||||
|
@ -844,7 +845,7 @@ msgstr "Ursäkta!"
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:4
|
||||
msgid "No results were found. You can try to:"
|
||||
msgstr ""
|
||||
msgstr "Inga resultat hittades. Du kan prova att:"
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:6
|
||||
msgid "Refresh the page."
|
||||
|
@ -852,7 +853,7 @@ msgstr "Uppdatera sidan."
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:7
|
||||
msgid "Search for another query or select another category (above)."
|
||||
msgstr ""
|
||||
msgstr "Sök efter en annan query eller välj en annan kategori (ovanför)."
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:8
|
||||
msgid "Change the search engine used in the preferences:"
|
||||
|
@ -860,7 +861,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:9
|
||||
msgid "Switch to another instance:"
|
||||
msgstr ""
|
||||
msgstr "Byt till en annan instans:"
|
||||
|
||||
#: searx/templates/simple/preferences/answerers.html:4
|
||||
#: searx/templates/simple/preferences/engines.html:17
|
||||
|
@ -1017,13 +1018,15 @@ msgstr "Snabbtangenter"
|
|||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:13
|
||||
msgid "Vim-like"
|
||||
msgstr ""
|
||||
msgstr "Vim-liknande"
|
||||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:18
|
||||
msgid ""
|
||||
"Navigate search results with hotkeys (JavaScript required). Press \"h\" "
|
||||
"key on main or result page to get help."
|
||||
msgstr ""
|
||||
"Navigera sök resultaten med snabbkommandon (behöver JavaScript). Tryck \"h\" "
|
||||
"tangenten på huvud eller resultat sidan för att få hjälp."
|
||||
|
||||
#: searx/templates/simple/preferences/image_proxy.html:2
|
||||
msgid "Image proxy"
|
||||
|
@ -1678,4 +1681,3 @@ msgstr "göm video"
|
|||
#~ "vi hittade inte några resultat. Använd"
|
||||
#~ " en annan förfråga eller sök i "
|
||||
#~ "flera kategorier."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -19,7 +19,7 @@ msgstr ""
|
|||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-10-10 14:53+0000\n"
|
||||
"PO-Revision-Date: 2023-10-17 13:53+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"Language-Team: Turkish <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/tr/>\n"
|
||||
|
@ -283,7 +283,7 @@ msgstr "radyo"
|
|||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "bit hızı"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
|
|
Binary file not shown.
|
@ -10,23 +10,25 @@
|
|||
# BalkanMadman <zurabid2016@gmail.com>, 2023.
|
||||
# return42 <markus.heiser@darmarit.de>, 2023.
|
||||
# maxch <maxletters@tutanota.com>, 2023.
|
||||
# SomeTr <SomeTr@users.noreply.translate.codeberg.org>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-10-03 06:53+0000\n"
|
||||
"Last-Translator: return42 <markus.heiser@darmarit.de>\n"
|
||||
"PO-Revision-Date: 2023-10-25 21:57+0000\n"
|
||||
"Last-Translator: SomeTr <SomeTr@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Ukrainian <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/uk/>\n"
|
||||
"Language: uk\n"
|
||||
"Language-Team: Ukrainian "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/uk/>\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 !="
|
||||
" 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n "
|
||||
"% 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9)"
|
||||
" || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 "
|
||||
"? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > "
|
||||
"14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % "
|
||||
"100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
|
||||
"X-Generator: Weblate 5.1\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -107,7 +109,7 @@ msgstr "словники"
|
|||
#. CATEGORY_GROUPS['LYRICS']
|
||||
#: searx/searxng.msg
|
||||
msgid "lyrics"
|
||||
msgstr "текст пісні"
|
||||
msgstr "тексти пісень"
|
||||
|
||||
#. CATEGORY_GROUPS['PACKAGES']
|
||||
#: searx/searxng.msg
|
||||
|
@ -117,7 +119,7 @@ msgstr "пакети"
|
|||
#. CATEGORY_GROUPS['Q_A']
|
||||
#: searx/searxng.msg
|
||||
msgid "q&a"
|
||||
msgstr "q&a"
|
||||
msgstr "запитання і відповіді"
|
||||
|
||||
#. CATEGORY_GROUPS['REPOS']
|
||||
#: searx/searxng.msg
|
||||
|
@ -137,7 +139,7 @@ msgstr "веб"
|
|||
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
|
||||
#: searx/searxng.msg
|
||||
msgid "scientific publications"
|
||||
msgstr "Наукова публікація"
|
||||
msgstr "наукова публікація"
|
||||
|
||||
#. STYLE_NAMES['AUTO']
|
||||
#: searx/searxng.msg
|
||||
|
@ -189,7 +191,7 @@ msgstr "помилка парсингу"
|
|||
|
||||
#: searx/webutils.py:36
|
||||
msgid "HTTP protocol error"
|
||||
msgstr "помилка HTTP протоколу"
|
||||
msgstr "помилка протоколу HTTP"
|
||||
|
||||
#: searx/webutils.py:37
|
||||
msgid "network error"
|
||||
|
@ -197,7 +199,7 @@ msgstr "помилка мережі"
|
|||
|
||||
#: searx/webutils.py:38
|
||||
msgid "SSL error: certificate validation has failed"
|
||||
msgstr "Помилка SSL: не вдалося перевірити сертифікат"
|
||||
msgstr "помилка SSL: не вдалося перевірити сертифікат"
|
||||
|
||||
#: searx/webutils.py:40
|
||||
msgid "unexpected crash"
|
||||
|
@ -209,7 +211,7 @@ msgstr "помилка HTTP"
|
|||
|
||||
#: searx/webutils.py:48
|
||||
msgid "HTTP connection error"
|
||||
msgstr "помилка HTTP з'єднання"
|
||||
msgstr "помилка з'єднання HTTP"
|
||||
|
||||
#: searx/webutils.py:54
|
||||
msgid "proxy error"
|
||||
|
@ -229,7 +231,7 @@ msgstr "доступ заборонено"
|
|||
|
||||
#: searx/webutils.py:58
|
||||
msgid "server API error"
|
||||
msgstr "Помилка API сервера"
|
||||
msgstr "помилка API сервера"
|
||||
|
||||
#: searx/webutils.py:77
|
||||
msgid "Suspended"
|
||||
|
@ -269,7 +271,7 @@ msgstr "{title} (ЗАСТАРІЛО)"
|
|||
|
||||
#: searx/engines/pdbe.py:103
|
||||
msgid "This entry has been superseded by"
|
||||
msgstr "Цей запис був змінений"
|
||||
msgstr "Цей запис було замінено на"
|
||||
|
||||
#: searx/engines/qwant.py:282
|
||||
msgid "Channel"
|
||||
|
@ -277,19 +279,19 @@ msgstr "Канал"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "радіо"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "бітрейт"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "голоси"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
msgstr ""
|
||||
msgstr "кліки"
|
||||
|
||||
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
|
||||
msgid "Language"
|
||||
|
@ -309,9 +311,9 @@ msgid ""
|
|||
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
|
||||
" WebP."
|
||||
msgstr ""
|
||||
"Не вдалось зчитати зображення за вказаним URL. Можливо, тому що формат "
|
||||
"даного зображення не підтримується. TinEye підтримує зображення у "
|
||||
"форматах JPEG, PNG, GIF, BMP, TIFF та WebP."
|
||||
"Не вдалося зчитати зображення за вказаним URL. Можливо, тому що формат цього "
|
||||
"зображення не підтримується. TinEye підтримує зображення у форматах JPEG, "
|
||||
"PNG, GIF, BMP, TIFF та WebP."
|
||||
|
||||
#: searx/engines/tineye.py:46
|
||||
msgid ""
|
||||
|
@ -323,7 +325,7 @@ msgstr ""
|
|||
|
||||
#: searx/engines/tineye.py:52
|
||||
msgid "The image could not be downloaded."
|
||||
msgstr "Зображення не можливо завантажити."
|
||||
msgstr "Зображення неможливо завантажити."
|
||||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Morning"
|
||||
|
@ -406,14 +408,14 @@ msgid ""
|
|||
"Could not download the list of Tor exit-nodes from: "
|
||||
"https://check.torproject.org/exit-addresses"
|
||||
msgstr ""
|
||||
"Не вдалось завантажити список вихідних вузлів Tor з: "
|
||||
"https://check.torproject.org/exit-addresses"
|
||||
"Не вдалося завантажити список вихідних вузлів Tor з: https://check.torproject"
|
||||
".org/exit-addresses"
|
||||
|
||||
#: searx/plugins/tor_check.py:78
|
||||
msgid ""
|
||||
"You are using Tor and it looks like you have this external IP address: "
|
||||
"{ip_address}"
|
||||
msgstr "Ви використовуєте Tor і, здається, у вас наступна IP адреса: {ip_address}"
|
||||
msgstr "Ви використовуєте Tor і, здається, Ваша IP-адреса така: {ip_address}"
|
||||
|
||||
#: searx/plugins/tor_check.py:86
|
||||
msgid "You are not using Tor and you have this external IP address: {ip_address}"
|
||||
|
@ -475,7 +477,7 @@ msgstr "Статистика пошукової системи"
|
|||
|
||||
#: searx/templates/simple/base.html:72
|
||||
msgid "Public instances"
|
||||
msgstr "Публічні інстанції"
|
||||
msgstr "Публічні інстанси"
|
||||
|
||||
#: searx/templates/simple/base.html:75
|
||||
msgid "Privacy policy"
|
||||
|
@ -483,7 +485,7 @@ msgstr "Політика приватності"
|
|||
|
||||
#: searx/templates/simple/base.html:78
|
||||
msgid "Contact instance maintainer"
|
||||
msgstr "Зв'язатися з власником інстанції"
|
||||
msgstr "Зв'язатися з власником інстансу"
|
||||
|
||||
#: searx/templates/simple/categories.html:26
|
||||
msgid "Click on the magnifier to perform search"
|
||||
|
@ -501,7 +503,7 @@ msgstr "Автор"
|
|||
|
||||
#: searx/templates/simple/macros.html:45
|
||||
msgid "cached"
|
||||
msgstr "архівовано"
|
||||
msgstr "кеш"
|
||||
|
||||
#: searx/templates/simple/macros.html:45
|
||||
msgid "proxied"
|
||||
|
@ -523,7 +525,7 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/new_issue.html:71
|
||||
msgid "If this is a public instance, please specify the URL in the bug report"
|
||||
msgstr "Якщо це публічна інстанція, укажіть URL-адресу у звіті про помилку"
|
||||
msgstr "Якщо це публічний інстанс, укажіть URL-адресу у звіті про помилку"
|
||||
|
||||
#: searx/templates/simple/new_issue.html:72
|
||||
msgid "Submit a new issue on Github including the above information"
|
||||
|
@ -586,7 +588,7 @@ msgstr "Інтерфейс користувача"
|
|||
|
||||
#: searx/templates/simple/preferences.html:208
|
||||
msgid "Privacy"
|
||||
msgstr "Конфеденційність"
|
||||
msgstr "Конфіденційність"
|
||||
|
||||
#: searx/templates/simple/preferences.html:221
|
||||
msgid "Engines"
|
||||
|
@ -752,7 +754,7 @@ msgstr "Помилка!"
|
|||
|
||||
#: searx/templates/simple/elements/engines_msg.html:13
|
||||
msgid "Engines cannot retrieve results"
|
||||
msgstr "Пошукові системи неможуть отримати результати"
|
||||
msgstr "Пошукові системи не можуть отримати результати"
|
||||
|
||||
#: searx/templates/simple/elements/search_url.html:3
|
||||
msgid "Search URL"
|
||||
|
@ -784,12 +786,12 @@ msgstr "Автовизначення"
|
|||
#: searx/templates/simple/preferences/engines.html:21
|
||||
#: searx/templates/simple/preferences/safesearch.html:2
|
||||
msgid "SafeSearch"
|
||||
msgstr "БезпечнийПошук"
|
||||
msgstr "Безпечний пошук"
|
||||
|
||||
#: searx/templates/simple/filters/safesearch.html:2
|
||||
#: searx/templates/simple/preferences/safesearch.html:7
|
||||
msgid "Strict"
|
||||
msgstr "Жорский"
|
||||
msgstr "Жорсткий"
|
||||
|
||||
#: searx/templates/simple/filters/safesearch.html:3
|
||||
#: searx/templates/simple/preferences/safesearch.html:11
|
||||
|
@ -844,19 +846,19 @@ msgstr "Результатів не знайдено. Ви можете спро
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:6
|
||||
msgid "Refresh the page."
|
||||
msgstr ""
|
||||
msgstr "Оновити сторінку."
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:7
|
||||
msgid "Search for another query or select another category (above)."
|
||||
msgstr ""
|
||||
msgstr "Шукати за іншим запитом або вибрати іншу категорію (вгорі)."
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:8
|
||||
msgid "Change the search engine used in the preferences:"
|
||||
msgstr ""
|
||||
msgstr "Змінити пошукову систему, вказану в налаштуваннях:"
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:9
|
||||
msgid "Switch to another instance:"
|
||||
msgstr ""
|
||||
msgstr "Перемкнути інстанс SearXNG:"
|
||||
|
||||
#: searx/templates/simple/preferences/answerers.html:4
|
||||
#: searx/templates/simple/preferences/engines.html:17
|
||||
|
@ -893,7 +895,7 @@ msgstr "Автозаповнення"
|
|||
|
||||
#: searx/templates/simple/preferences/autocomplete.html:15
|
||||
msgid "Find stuff as you type"
|
||||
msgstr "Шукати підчас набору"
|
||||
msgstr "Шукати під час набору"
|
||||
|
||||
#: searx/templates/simple/preferences/center_alignment.html:2
|
||||
msgid "Center Alignment"
|
||||
|
@ -1009,17 +1011,20 @@ msgstr "Назад"
|
|||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:2
|
||||
msgid "Hotkeys"
|
||||
msgstr ""
|
||||
msgstr "Гарячі клавіші"
|
||||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:13
|
||||
msgid "Vim-like"
|
||||
msgstr ""
|
||||
msgstr "Вигляд як Vim"
|
||||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:18
|
||||
msgid ""
|
||||
"Navigate search results with hotkeys (JavaScript required). Press \"h\" "
|
||||
"key on main or result page to get help."
|
||||
msgstr ""
|
||||
"Переміщуйтеся в результатах пошуку за допомогою гарячих клавіш (потрібен "
|
||||
"JavaScript). Натисніть клавішу «h» на головній сторінці або сторінці "
|
||||
"результатів, щоб прочитати довідку."
|
||||
|
||||
#: searx/templates/simple/preferences/image_proxy.html:2
|
||||
msgid "Image proxy"
|
||||
|
@ -1073,7 +1078,7 @@ msgstr "Результати в нових вкладках"
|
|||
|
||||
#: searx/templates/simple/preferences/results_on_new_tab.html:14
|
||||
msgid "Open result links on new browser tabs"
|
||||
msgstr "Відкривати посилання результатів в нових вкладках"
|
||||
msgstr "Відкривати посилання результатів у нових вкладках"
|
||||
|
||||
#: searx/templates/simple/preferences/safesearch.html:20
|
||||
msgid "Filter content"
|
||||
|
@ -1081,13 +1086,15 @@ msgstr "Фільтр контенту"
|
|||
|
||||
#: searx/templates/simple/preferences/search_on_category_select.html:2
|
||||
msgid "Search on category select"
|
||||
msgstr "Пошук по обраній категорії"
|
||||
msgstr "Пошук при виборі категорії"
|
||||
|
||||
#: searx/templates/simple/preferences/search_on_category_select.html:14
|
||||
msgid ""
|
||||
"Perform search immediately if a category selected. Disable to select "
|
||||
"multiple categories"
|
||||
msgstr ""
|
||||
"Шукати негайно при виборі категорії. Вимкніть, якщо хочете вибрати кілька "
|
||||
"категорій"
|
||||
|
||||
#: searx/templates/simple/preferences/theme.html:2
|
||||
msgid "Theme"
|
||||
|
@ -1103,7 +1110,7 @@ msgstr "Стиль теми"
|
|||
|
||||
#: searx/templates/simple/preferences/theme.html:31
|
||||
msgid "Choose auto to follow your browser settings"
|
||||
msgstr "Виберіть \"автоматично\" для використання налаштувань вашого браузера"
|
||||
msgstr "Виберіть «автоматично» для використання налаштувань вашого браузера"
|
||||
|
||||
#: searx/templates/simple/preferences/tokens.html:2
|
||||
msgid "Engine tokens"
|
||||
|
@ -1123,7 +1130,7 @@ msgstr "Змінити мову сайту"
|
|||
|
||||
#: searx/templates/simple/result_templates/code.html:13
|
||||
msgid "repo"
|
||||
msgstr "репозиторії"
|
||||
msgstr "репозиторій"
|
||||
|
||||
#: searx/templates/simple/result_templates/default.html:6
|
||||
msgid "show media"
|
||||
|
@ -1224,7 +1231,7 @@ msgstr "Лічер"
|
|||
|
||||
#: searx/templates/simple/result_templates/torrent.html:11
|
||||
msgid "Filesize"
|
||||
msgstr "Розмір файла"
|
||||
msgstr "Розмір файлу"
|
||||
|
||||
#: searx/templates/simple/result_templates/torrent.html:12
|
||||
msgid "Bytes"
|
||||
|
@ -1248,7 +1255,7 @@ msgstr "ТіБ"
|
|||
|
||||
#: searx/templates/simple/result_templates/torrent.html:20
|
||||
msgid "Number of Files"
|
||||
msgstr "Кількість Файлів"
|
||||
msgstr "Кількість файлів"
|
||||
|
||||
#: searx/templates/simple/result_templates/videos.html:6
|
||||
msgid "show video"
|
||||
|
@ -1654,4 +1661,3 @@ msgstr "приховати відео"
|
|||
#~ "ми не знайшли жодних результатів. Будь"
|
||||
#~ " ласка, використайте інший запит або "
|
||||
#~ "виконайте пошук в декількох категоріях."
|
||||
|
||||
|
|
Binary file not shown.
|
@ -22,20 +22,22 @@
|
|||
# BBTranslate <357835338@qq.com>, 2023.
|
||||
# JonesBBQ <colson.xu@gmail.com>, 2023.
|
||||
# BernieHuang2008 <berniehuang2008@163.com>, 2023.
|
||||
# clsty <celestial.y@outlook.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-05 09:01+0000\n"
|
||||
"PO-Revision-Date: 2023-09-29 07:07+0000\n"
|
||||
"Last-Translator: BernieHuang2008 <berniehuang2008@163.com>\n"
|
||||
"PO-Revision-Date: 2023-10-24 11:13+0000\n"
|
||||
"Last-Translator: clsty <celestial.y@outlook.com>\n"
|
||||
"Language-Team: Chinese (Simplified) <https://translate.codeberg.org/projects/"
|
||||
"searxng/searxng/zh_Hans/>\n"
|
||||
"Language: zh_Hans_CN\n"
|
||||
"Language-Team: Chinese (Simplified) "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/zh_Hans/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.1\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -56,7 +58,7 @@ msgstr "文件"
|
|||
#. CATEGORY_NAMES['GENERAL']
|
||||
#: searx/searxng.msg
|
||||
msgid "general"
|
||||
msgstr "常规"
|
||||
msgstr "综合"
|
||||
|
||||
#. CATEGORY_NAMES['MUSIC']
|
||||
#: searx/searxng.msg
|
||||
|
@ -126,7 +128,7 @@ msgstr "程序包"
|
|||
#. CATEGORY_GROUPS['Q_A']
|
||||
#: searx/searxng.msg
|
||||
msgid "q&a"
|
||||
msgstr "问&答"
|
||||
msgstr "问与答"
|
||||
|
||||
#. CATEGORY_GROUPS['REPOS']
|
||||
#: searx/searxng.msg
|
||||
|
@ -206,7 +208,7 @@ msgstr "网络错误"
|
|||
|
||||
#: searx/webutils.py:38
|
||||
msgid "SSL error: certificate validation has failed"
|
||||
msgstr "SSL错误:证书校验失败"
|
||||
msgstr "SSL 错误:证书校验失败"
|
||||
|
||||
#: searx/webutils.py:40
|
||||
msgid "unexpected crash"
|
||||
|
@ -274,7 +276,7 @@ msgstr "获取路线"
|
|||
|
||||
#: searx/engines/pdbe.py:96
|
||||
msgid "{title} (OBSOLETE)"
|
||||
msgstr "{title} (已过时)"
|
||||
msgstr "{title} (已过时)"
|
||||
|
||||
#: searx/engines/pdbe.py:103
|
||||
msgid "This entry has been superseded by"
|
||||
|
@ -286,19 +288,19 @@ msgstr "频道"
|
|||
|
||||
#: searx/engines/radio_browser.py:104
|
||||
msgid "radio"
|
||||
msgstr ""
|
||||
msgstr "电台"
|
||||
|
||||
#: searx/engines/radio_browser.py:106
|
||||
msgid "bitrate"
|
||||
msgstr ""
|
||||
msgstr "比特率"
|
||||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "votes"
|
||||
msgstr ""
|
||||
msgstr "投票数"
|
||||
|
||||
#: searx/engines/radio_browser.py:108
|
||||
msgid "clicks"
|
||||
msgstr ""
|
||||
msgstr "点击数"
|
||||
|
||||
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
|
||||
msgid "Language"
|
||||
|
@ -308,20 +310,24 @@ msgstr "语言"
|
|||
msgid ""
|
||||
"{numCitations} citations from the year {firstCitationVelocityYear} to "
|
||||
"{lastCitationVelocityYear}"
|
||||
msgstr "{numCitations}次引用,从{firstCitationVelocityYear}年到{lastCitationVelocityYear}年"
|
||||
msgstr ""
|
||||
"{numCitations} 次引用,从 {firstCitationVelocityYear} 年到 "
|
||||
"{lastCitationVelocityYear} 年"
|
||||
|
||||
#: searx/engines/tineye.py:40
|
||||
msgid ""
|
||||
"Could not read that image url. This may be due to an unsupported file "
|
||||
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
|
||||
" WebP."
|
||||
msgstr "无法读取该图片网址。这可能是由于文件格式不受支持。 TinEye 仅支持 JPEG、PNG、GIF、BMP、TIFF 或 WebP 格式的图像。"
|
||||
msgstr "无法读取该图片网址。这可能是由于文件格式不受支持。TinEye 仅支持 "
|
||||
"JPEG、PNG、GIF、BMP、TIFF 或 WebP 格式的图像。"
|
||||
|
||||
#: searx/engines/tineye.py:46
|
||||
msgid ""
|
||||
"The image is too simple to find matches. TinEye requires a basic level of"
|
||||
" visual detail to successfully identify matches."
|
||||
msgstr "图像过于简单,无法找到匹配项。 TinEye 需要基本级别的视觉细节才能成功识别匹配项。"
|
||||
msgstr "图像过于简单,无法找到匹配项。TinEye "
|
||||
"需要基本级别的视觉细节才能成功识别匹配项。"
|
||||
|
||||
#: searx/engines/tineye.py:52
|
||||
msgid "The image could not be downloaded."
|
||||
|
@ -329,7 +335,7 @@ msgstr "无法下载该图像。"
|
|||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Morning"
|
||||
msgstr "早上"
|
||||
msgstr "上午"
|
||||
|
||||
#: searx/engines/wttr.py:101
|
||||
msgid "Noon"
|
||||
|
@ -353,7 +359,7 @@ msgstr "文件质量"
|
|||
|
||||
#: searx/plugins/hash_plugin.py:24
|
||||
msgid "Converts strings to different hash digests."
|
||||
msgstr "将字符串转换为不同的散列摘要值。"
|
||||
msgstr "将字符串转换为不同的散列(hash)摘要值。"
|
||||
|
||||
#: searx/plugins/hash_plugin.py:52
|
||||
msgid "hash digest"
|
||||
|
@ -395,27 +401,30 @@ msgstr "Tor 网络检测插件"
|
|||
msgid ""
|
||||
"This plugin checks if the address of the request is a Tor exit-node, and "
|
||||
"informs the user if it is; like check.torproject.org, but from SearXNG."
|
||||
msgstr "此插件检查地址是否为 Tor 出口节点并给出结果,是由 SearXNG 提供的类似 check.torproject.org 的服务。"
|
||||
msgstr ""
|
||||
"此插件检查请求地址是否为 Tor 出口节点,若是则告知用户。这是由 SearXNG "
|
||||
"提供的类似 check.torproject.org 的服务。"
|
||||
|
||||
#: searx/plugins/tor_check.py:62
|
||||
msgid ""
|
||||
"Could not download the list of Tor exit-nodes from: "
|
||||
"https://check.torproject.org/exit-addresses"
|
||||
msgstr "未能从如下地址下载 Tor 出口节点的名单: https://check.torproject.org/exit-addresses"
|
||||
msgstr "未能从此地址下载 Tor 出口节点的列表: https://check.torproject.org/exit-"
|
||||
"addresses"
|
||||
|
||||
#: searx/plugins/tor_check.py:78
|
||||
msgid ""
|
||||
"You are using Tor and it looks like you have this external IP address: "
|
||||
"{ip_address}"
|
||||
msgstr "您似乎在使用 Tor,您的外部 IP 地址为: {ip_address}"
|
||||
msgstr "您似乎在使用 Tor,您的外部 IP 地址为: {ip_address}"
|
||||
|
||||
#: searx/plugins/tor_check.py:86
|
||||
msgid "You are not using Tor and you have this external IP address: {ip_address}"
|
||||
msgstr "您并未使用 Tor,您的外部 IP 地址为: {ip_address}"
|
||||
msgstr "您并未使用 Tor,您的外部 IP 地址为: {ip_address}"
|
||||
|
||||
#: searx/plugins/tracker_url_remover.py:29
|
||||
msgid "Tracker URL remover"
|
||||
msgstr "移除跟踪链接"
|
||||
msgstr "跟踪链接移除器"
|
||||
|
||||
#: searx/plugins/tracker_url_remover.py:30
|
||||
msgid "Remove trackers arguments from the returned URL"
|
||||
|
@ -515,7 +524,7 @@ msgstr "我确定提交的 Bug 没有与现存 Issue 重复"
|
|||
|
||||
#: searx/templates/simple/new_issue.html:71
|
||||
msgid "If this is a public instance, please specify the URL in the bug report"
|
||||
msgstr "如果这是一个公共问题,请在 Bug 报告页面提交 URL"
|
||||
msgstr "如果这是一个公共实例,请在 Bug 报告中指明其网址"
|
||||
|
||||
#: searx/templates/simple/new_issue.html:72
|
||||
msgid "Submit a new issue on Github including the above information"
|
||||
|
@ -834,11 +843,11 @@ msgstr "未找到结果,你可以尝试:"
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:6
|
||||
msgid "Refresh the page."
|
||||
msgstr "刷新页面"
|
||||
msgstr "刷新页面。"
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:7
|
||||
msgid "Search for another query or select another category (above)."
|
||||
msgstr ""
|
||||
msgstr "(在上方)对其他查询进行搜索,或选择其他类别。"
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:8
|
||||
msgid "Change the search engine used in the preferences:"
|
||||
|
@ -846,7 +855,7 @@ msgstr "更改“首选项”中使用的搜索引擎:"
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:9
|
||||
msgid "Switch to another instance:"
|
||||
msgstr "切换另一个SearXNG的服务器:"
|
||||
msgstr "切换至另一个 SearXNG 实例:"
|
||||
|
||||
#: searx/templates/simple/preferences/answerers.html:4
|
||||
#: searx/templates/simple/preferences/engines.html:17
|
||||
|
@ -993,13 +1002,13 @@ msgstr "热键"
|
|||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:13
|
||||
msgid "Vim-like"
|
||||
msgstr "Vim布局"
|
||||
msgstr "Vim 布局"
|
||||
|
||||
#: searx/templates/simple/preferences/hotkeys.html:18
|
||||
msgid ""
|
||||
"Navigate search results with hotkeys (JavaScript required). Press \"h\" "
|
||||
"key on main or result page to get help."
|
||||
msgstr "使用热键进行导航(需要JavaScript)。在主页或搜索结果页按“h”键获取帮助。"
|
||||
msgstr "使用热键进行导航(需要 JavaScript)。在主页或搜索结果页按“h”键获取帮助。"
|
||||
|
||||
#: searx/templates/simple/preferences/image_proxy.html:2
|
||||
msgid "Image proxy"
|
||||
|
@ -1063,7 +1072,7 @@ msgstr "搜索特定类别"
|
|||
msgid ""
|
||||
"Perform search immediately if a category selected. Disable to select "
|
||||
"multiple categories"
|
||||
msgstr ""
|
||||
msgstr "当一个类别被指定时,立即执行搜索。禁用以选择多个类别"
|
||||
|
||||
#: searx/templates/simple/preferences/theme.html:2
|
||||
msgid "Theme"
|
||||
|
@ -1208,19 +1217,19 @@ msgstr "字节"
|
|||
|
||||
#: searx/templates/simple/result_templates/torrent.html:13
|
||||
msgid "kiB"
|
||||
msgstr "kB"
|
||||
msgstr "kiB"
|
||||
|
||||
#: searx/templates/simple/result_templates/torrent.html:14
|
||||
msgid "MiB"
|
||||
msgstr "MB"
|
||||
msgstr "MiB"
|
||||
|
||||
#: searx/templates/simple/result_templates/torrent.html:15
|
||||
msgid "GiB"
|
||||
msgstr "GB"
|
||||
msgstr "GiB"
|
||||
|
||||
#: searx/templates/simple/result_templates/torrent.html:16
|
||||
msgid "TiB"
|
||||
msgstr "TB"
|
||||
msgstr "TiB"
|
||||
|
||||
#: searx/templates/simple/result_templates/torrent.html:20
|
||||
msgid "Number of Files"
|
||||
|
@ -1616,4 +1625,3 @@ msgstr "隐藏视频"
|
|||
#~ "use another query or search in "
|
||||
#~ "more categories."
|
||||
#~ msgstr "我们没有找到任何结果。请使用其他关键词,或在更多类别中搜索。"
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ from numbers import Number
|
|||
from os.path import splitext, join
|
||||
from random import choice
|
||||
from html.parser import HTMLParser
|
||||
from html import escape
|
||||
from urllib.parse import urljoin, urlparse
|
||||
from markdown_it import MarkdownIt
|
||||
|
||||
|
@ -88,7 +89,7 @@ class _HTMLTextExtractorException(Exception):
|
|||
"""Internal exception raised when the HTML is invalid"""
|
||||
|
||||
|
||||
class _HTMLTextExtractor(HTMLParser): # pylint: disable=W0223 # (see https://bugs.python.org/issue31844)
|
||||
class _HTMLTextExtractor(HTMLParser):
|
||||
"""Internal class to extract text from HTML"""
|
||||
|
||||
def __init__(self):
|
||||
|
@ -137,6 +138,11 @@ class _HTMLTextExtractor(HTMLParser): # pylint: disable=W0223 # (see https://b
|
|||
def get_text(self):
|
||||
return ''.join(self.result).strip()
|
||||
|
||||
def error(self, message):
|
||||
# error handle is needed in <py3.10
|
||||
# https://github.com/python/cpython/pull/8562/files
|
||||
raise AssertionError(message)
|
||||
|
||||
|
||||
def html_to_text(html_str: str) -> str:
|
||||
"""Extract text from a HTML string
|
||||
|
@ -153,12 +159,18 @@ def html_to_text(html_str: str) -> str:
|
|||
|
||||
>>> html_to_text('<style>.span { color: red; }</style><span>Example</span>')
|
||||
'Example'
|
||||
|
||||
>>> html_to_text(r'regexp: (?<![a-zA-Z]')
|
||||
'regexp: (?<![a-zA-Z]'
|
||||
"""
|
||||
html_str = html_str.replace('\n', ' ').replace('\r', ' ')
|
||||
html_str = ' '.join(html_str.split())
|
||||
s = _HTMLTextExtractor()
|
||||
try:
|
||||
s.feed(html_str)
|
||||
except AssertionError:
|
||||
s = _HTMLTextExtractor()
|
||||
s.feed(escape(html_str, quote=True))
|
||||
except _HTMLTextExtractorException:
|
||||
logger.debug("HTMLTextExtractor: invalid HTML\n%s", html_str)
|
||||
return s.get_text()
|
||||
|
|
|
@ -57,7 +57,9 @@ from searx import (
|
|||
)
|
||||
|
||||
from searx import infopage
|
||||
from searx.botdetection import limiter
|
||||
from searx import limiter
|
||||
from searx.botdetection import link_token
|
||||
|
||||
from searx.data import ENGINE_DESCRIPTIONS
|
||||
from searx.results import Timing
|
||||
from searx.settings_defaults import OUTPUT_FORMATS
|
||||
|
@ -94,7 +96,6 @@ from searx.utils import (
|
|||
from searx.version import VERSION_STRING, GIT_URL, GIT_BRANCH
|
||||
from searx.query import RawTextQuery
|
||||
from searx.plugins import Plugin, plugins, initialize as plugin_initialize
|
||||
from searx.botdetection import link_token
|
||||
from searx.plugins.oa_doi_rewrite import get_doi_resolver
|
||||
from searx.preferences import (
|
||||
Preferences,
|
||||
|
@ -1288,7 +1289,7 @@ def config():
|
|||
'DOCS_URL': get_setting('brand.docs_url'),
|
||||
},
|
||||
'limiter': {
|
||||
'enabled': settings['server']['limiter'],
|
||||
'enabled': limiter.is_installed(),
|
||||
'botdetection.ip_limit.link_token': _limiter_cfg.get('botdetection.ip_limit.link_token'),
|
||||
'botdetection.ip_lists.pass_searxng_org': _limiter_cfg.get('botdetection.ip_lists.pass_searxng_org'),
|
||||
},
|
||||
|
@ -1322,6 +1323,7 @@ if not werkzeug_reloader or (werkzeug_reloader and os.environ.get("WERKZEUG_RUN_
|
|||
redis_initialize()
|
||||
plugin_initialize(app)
|
||||
search_initialize(enable_checker=True, check_network=True, enable_metrics=settings['general']['enable_metrics'])
|
||||
limiter.initialize(app, settings)
|
||||
|
||||
|
||||
def run():
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from searx import plugins
|
||||
from searx import (
|
||||
plugins,
|
||||
limiter,
|
||||
botdetection,
|
||||
)
|
||||
|
||||
from mock import Mock
|
||||
from tests import SearxTestCase
|
||||
|
||||
|
@ -46,6 +51,8 @@ class SelfIPTest(SearxTestCase):
|
|||
plugin = plugins.load_and_initialize_plugin('searx.plugins.self_info', False, (None, {}))
|
||||
store = plugins.PluginStore()
|
||||
store.register(plugin)
|
||||
cfg = limiter.get_cfg()
|
||||
botdetection.init(cfg, None)
|
||||
|
||||
self.assertTrue(len(store.plugins) == 1)
|
||||
|
||||
|
|
|
@ -41,6 +41,7 @@ class TestUtils(SearxTestCase):
|
|||
self.assertIsInstance(utils.html_to_text(html_str), str)
|
||||
self.assertIsNotNone(utils.html_to_text(html_str))
|
||||
self.assertEqual(utils.html_to_text(html_str), "Test text")
|
||||
self.assertEqual(utils.html_to_text(r"regexp: (?<![a-zA-Z]"), "regexp: (?<![a-zA-Z]")
|
||||
|
||||
def test_extract_text(self):
|
||||
html_str = """
|
||||
|
|
Loading…
Add table
Reference in a new issue