Merge branch 'searxng:master' into master

This commit is contained in:
coppcam 2023-11-02 01:15:00 +00:00 committed by GitHub
commit 4257102af6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
63 changed files with 2183 additions and 25544 deletions

View file

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

View file

@ -15,7 +15,7 @@ Administrator documentation
installation-apache
update-searxng
answer-captcha
searx.botdetection
searx.limiter
api
architecture
plugins

View 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:

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,7 @@
{
"versions": [
"118.0",
"117.0"
"119.0",
"118.0"
],
"os": [
"Windows NT 10.0; Win64; x64",

View file

@ -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)",

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 "απόκρυψη βίντεο"
#~ "δε βρέθηκαν αποτελέσματα. Παρακαλούμε "
#~ "χρησιμοποιήστε άλλη αναζήτηση ή ψάξτε σε"
#~ " περισσότερες κατηγορίες."

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 delement 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 danalisi"
#: 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 lAPI 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 litinerari"
#: 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 lannada {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 limatge."
#: 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 quavè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 danomalias"
#: 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 linstà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."

View file

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

View file

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

View file

@ -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 "приховати відео"
#~ "ми не знайшли жодних результатів. Будь"
#~ " ласка, використайте інший запит або "
#~ "виконайте пошук в декількох категоріях."

View file

@ -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 "我们没有找到任何结果。请使用其他关键词,或在更多类别中搜索。"

View file

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

View file

@ -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():

View file

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

View file

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