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: strategy:
matrix: matrix:
os: [ubuntu-20.04] 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: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4

View file

@ -15,7 +15,7 @@ Administrator documentation
installation-apache installation-apache
update-searxng update-searxng
answer-captcha answer-captcha
searx.botdetection searx.limiter
api api
architecture architecture
plugins 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" bind_address: "127.0.0.1"
secret_key: "ultrasecretkey" # change this! secret_key: "ultrasecretkey" # change this!
limiter: false limiter: false
public_instance: false
image_proxy: false image_proxy: false
default_http_headers: default_http_headers:
X-Content-Type-Options : nosniff X-Content-Type-Options : nosniff
@ -20,7 +21,6 @@
X-Robots-Tag : noindex, nofollow X-Robots-Tag : noindex, nofollow
Referrer-Policy : no-referrer Referrer-Policy : no-referrer
``base_url`` : ``$SEARXNG_URL`` :ref:`buildenv <make buildenv>` ``base_url`` : ``$SEARXNG_URL`` :ref:`buildenv <make buildenv>`
The base URL where SearXNG is deployed. Used to create correct inbound links. 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 If you change the value, don't forget to rebuild instance's environment
@ -36,11 +36,19 @@
``secret_key`` : ``$SEARXNG_SECRET`` ``secret_key`` : ``$SEARXNG_SECRET``
Used for cryptography purpose. Used for cryptography purpose.
.. _limiter:
``limiter`` : ``limiter`` :
Rate limit the number of request on the instance, block some bots. The 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: .. _image_proxy:

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
import sys, os import sys, os
from pathlib import Path
from pallets_sphinx_themes import ProjectLink from pallets_sphinx_themes import ProjectLink
from searx import get_setting from searx import get_setting
@ -13,7 +14,6 @@ project = 'SearXNG'
copyright = 'SearXNG team' copyright = 'SearXNG team'
author = 'SearXNG team' author = 'SearXNG team'
release, version = VERSION_STRING, VERSION_STRING release, version = VERSION_STRING, VERSION_STRING
SEARXNG_URL = get_setting('server.base_url') or 'https://example.org/searxng' SEARXNG_URL = get_setting('server.base_url') or 'https://example.org/searxng'
ISSUE_URL = get_setting('brand.issue_url') ISSUE_URL = get_setting('brand.issue_url')
DOCS_URL = get_setting('brand.docs_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') CONTACT_URL = get_setting('general.contact_url')
WIKI_URL = get_setting('brand.wiki_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 # hint: sphinx.ext.viewcode won't highlight when 'highlight_language' [1] is set
# to string 'none' [2] # to string 'none' [2]
# #

View file

@ -12,8 +12,10 @@ Bot Detection
.. automodule:: searx.botdetection .. automodule:: searx.botdetection
:members: :members:
.. automodule:: searx.botdetection.limiter .. _botdetection ip_lists:
:members:
IP lists
========
.. automodule:: searx.botdetection.ip_lists .. automodule:: searx.botdetection.ip_lists
:members: :members:
@ -50,3 +52,11 @@ Probe HTTP headers
.. automodule:: searx.botdetection.http_user_agent .. automodule:: searx.botdetection.http_user_agent
:members: :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 nose2[coverage_plugin]==0.14.0
cov-core==1.15.0 cov-core==1.15.0
black==22.12.0 black==22.12.0
pylint==3.0.1 pylint==3.0.2
splinter==0.19.0 splinter==0.19.0
selenium==4.14.0 selenium==4.14.0
twine==4.0.2 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==7.2.6; python_version > '3.8'
sphinx-issues==3.0.1 sphinx-issues==3.0.1
sphinx-jinja==2.0.2 sphinx-jinja==2.0.2
sphinx-tabs==3.4.1 sphinx-tabs==3.4.4
sphinxcontrib-programoutput==0.17 sphinxcontrib-programoutput==0.17
sphinx-autobuild==2021.3.14 sphinx-autobuild==2021.3.14
sphinx-notfound-page==1.0.0 sphinx-notfound-page==1.0.0

View file

@ -1,5 +1,5 @@
certifi==2023.7.22 certifi==2023.7.22
babel==2.13.0 babel==2.13.1
flask-babel==4.0.0 flask-babel==4.0.0
flask==3.0.0 flask==3.0.0
jinja2==3.1.2 jinja2==3.1.2
@ -9,7 +9,7 @@ python-dateutil==2.8.2
pyyaml==6.0.1 pyyaml==6.0.1
httpx[http2]==0.24.1 httpx[http2]==0.24.1
Brotli==1.1.0 Brotli==1.1.0
uvloop==0.17.0 uvloop==0.19.0
httpx-socks[asyncio]==0.7.7 httpx-socks[asyncio]==0.7.7
setproctitle==1.3.3 setproctitle==1.3.3
redis==4.6.0 redis==4.6.0

View file

@ -108,5 +108,6 @@ else:
if settings['server']['public_instance']: if settings['server']['public_instance']:
logger.warning( logger.warning(
"Be aware you have activated features intended only for public instances. " "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 # lint: pylint
""".. _botdetection src: """.. _botdetection src:
The :ref:`limiter <limiter src>` implements several methods to block bots: Implementations used for bot detection.
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
""" """
from ._helpers import dump_request from ._helpers import dump_request
from ._helpers import get_real_ip from ._helpers import get_real_ip
from ._helpers import get_network
from ._helpers import too_many_requests 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 flask
import werkzeug import werkzeug
from searx.tools import config
from searx import logger from searx import logger
from . import config
logger = logger.getChild('botdetection') logger = logger.getChild('botdetection')
@ -104,10 +104,10 @@ def get_real_ip(request: flask.Request) -> str:
if not forwarded_for: if not forwarded_for:
_log_error_only_once("X-Forwarded-For header is not set!") _log_error_only_once("X-Forwarded-For header is not set!")
else: 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(',')] 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)] forwarded_for = forwarded_for[-min(len(forwarded_for), x_for)]
if not real_ip: if not real_ip:

View file

@ -24,7 +24,7 @@ from ipaddress import (
import flask import flask
import werkzeug import werkzeug
from searx.tools import config from . import config
from ._helpers import too_many_requests from ._helpers import too_many_requests

View file

@ -25,7 +25,7 @@ from ipaddress import (
import flask import flask
import werkzeug import werkzeug
from searx.tools import config from . import config
from ._helpers import too_many_requests from ._helpers import too_many_requests

View file

@ -21,7 +21,7 @@ from ipaddress import (
import flask import flask
import werkzeug import werkzeug
from searx.tools import config from . import config
from ._helpers import too_many_requests from ._helpers import too_many_requests

View file

@ -22,7 +22,7 @@ from ipaddress import (
import flask import flask
import werkzeug import werkzeug
from searx.tools import config from . import config
from ._helpers import too_many_requests from ._helpers import too_many_requests

View file

@ -24,7 +24,7 @@ from ipaddress import (
import flask import flask
import werkzeug import werkzeug
from searx.tools import config from . import config
from ._helpers import too_many_requests 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 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 *suspicious*. To activate the :py:obj:`.link_token` method in the
:py:obj:`.ip_limit` method add the following to your :py:obj:`.ip_limit` method add the following configuration:
``/etc/searxng/limiter.toml``:
.. code:: toml .. code:: toml
@ -46,13 +45,12 @@ from ipaddress import (
import flask import flask
import werkzeug import werkzeug
from searx.tools import config
from searx import settings
from searx import redisdb from searx import redisdb
from searx.redislib import incr_sliding_window, drop_counter from searx.redislib import incr_sliding_window, drop_counter
from . import link_token from . import link_token
from . import config
from ._helpers import ( from ._helpers import (
too_many_requests, too_many_requests,
logger, logger,
@ -110,7 +108,7 @@ def filter_request(
if c > API_MAX: if c > API_MAX:
return too_many_requests(network, "too many request in API_WINDOW") 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) suspicious = link_token.is_suspicious(network, request, True)

View file

@ -33,7 +33,7 @@ from ipaddress import (
IPv6Address, IPv6Address,
) )
from searx.tools import config from . import config
from ._helpers import logger from ._helpers import logger
logger = logger.getChild('ip_limit') 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`. 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: if not redis_client:
return return
if not token_is_valid(token): if not token_is_valid(token):
return return
cfg = limiter.get_cfg()
real_ip = ip_address(get_real_ip(request)) real_ip = ip_address(get_real_ip(request))
network = get_network(real_ip, cfg) 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", "бангладешка така": "BDT",
"বাংলাদেশী টাকা": "BDT", "বাংলাদেশী টাকা": "BDT",
"taka": "BDT", "taka": [
"INR",
"BDT"
],
"bangladéšská taka": "BDT", "bangladéšská taka": "BDT",
"bangladeshi taka": "BDT", "bangladeshi taka": "BDT",
"bangladeŝa tako": "BDT", "bangladeŝa tako": "BDT",
@ -581,6 +584,7 @@
"đô la bermuda": "BMD", "đô la bermuda": "BMD",
"دولار بروني": "BND", "دولار بروني": "BND",
"брунейски долар": "BND", "брунейски долар": "BND",
"ব্রুনাই ডলার": "BND",
"dòlar de brunei": "BND", "dòlar de brunei": "BND",
"brunejský dolar": "BND", "brunejský dolar": "BND",
"brunei dollar": "BND", "brunei dollar": "BND",
@ -1820,6 +1824,7 @@
"indisk rupie": "INR", "indisk rupie": "INR",
"இந்திய ரூபாய்": "INR", "இந்திய ரூபாய்": "INR",
"எண்ணிம ரூபாய்": "INR", "எண்ணிம ரூபாய்": "INR",
"డిజిటల్ రూపాయి": "INR",
"రూపాయి": "INR", "రూపాయి": "INR",
"รูปีอินเดีย": "INR", "รูปีอินเดีย": "INR",
"hindistan rupisi": "INR", "hindistan rupisi": "INR",
@ -2837,98 +2842,29 @@
"ไนรา": "NGN", "ไนรา": "NGN",
"nijerya nairası": "NGN", "nijerya nairası": "NGN",
"нігерійська найра": "NGN", "нігерійська найра": "NGN",
"córdoba": [ "córdoba": "NIO",
"NIO", "كوردبا نيكاراغوا": "NIO",
"NIC" "никарагуанска кордоба": "NIO",
], "nikaragujská córdoba": "NIO",
"كوردبا نيكاراغوا": [ "córdoba oro": "NIO",
"NIO", "nicaraguan córdoba": "NIO",
"NIC" "nikaragva kordovo": "NIO",
], "cordoba": "NIO",
"никарагуанска кордоба": [ "קורדובה": "NIO",
"NIO", "nikaragvanska kordoba": "NIO",
"NIC" "nicaraguai córdoba": "NIO",
], "córdoba nikaragua": "NIO",
"nikaragujská córdoba": [ "córdoba nicaraguense": "NIO",
"NIO", "ニカラグア・コルドバ": "NIO",
"NIC" "니카라과 코르도바": "NIO",
], "nikaragvos kordoba": "NIO",
"córdoba oro": [ "nicaraguaanse córdoba": "NIO",
"NIO", "ਨਿਕਾਰਾਗੁਆਈ ਕੋਰਦੋਬਾ": "NIO",
"NIC" "cordoba oro": "NIO",
], "никарагуанская кордоба": "NIO",
"nicaraguan córdoba": [ "никарагванска кордоба": "NIO",
"NIO", "kordoba": "NIO",
"NIC" "нікарагуанська кордоба": "NIO",
],
"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"
],
"noorse kroon": "NOK", "noorse kroon": "NOK",
"كرونة نروجية": "NOK", "كرونة نروجية": "NOK",
"норвежка крона": "NOK", "норвежка крона": "NOK",
@ -3636,6 +3572,7 @@
"singapoer dollar": "SGD", "singapoer dollar": "SGD",
"دولار سنغافوري": "SGD", "دولار سنغافوري": "SGD",
"сингапурски долар": "SGD", "сингапурски долар": "SGD",
"সিঙ্গাপুর ডলার": "SGD",
"dòlar de singapur": "SGD", "dòlar de singapur": "SGD",
"singapurský dolar": "SGD", "singapurský dolar": "SGD",
"singaporeanske dollar": "SGD", "singaporeanske dollar": "SGD",
@ -4394,6 +4331,7 @@
"ด่ง": "VND", "ด่ง": "VND",
"в'єтнамський донг": "VND", "в'єтнамський донг": "VND",
"فاتو فانواتي": "VUV", "فاتو فانواتي": "VUV",
"вату": "VUV",
"vatu": "VUV", "vatu": "VUV",
"vanuatský vatu": "VUV", "vanuatský vatu": "VUV",
"vanuatu vatu": "VUV", "vanuatu vatu": "VUV",
@ -4406,7 +4344,6 @@
"バツ": "VUV", "バツ": "VUV",
"바누아투 바투": "VUV", "바누아투 바투": "VUV",
"vanuatuaanse vatu": "VUV", "vanuatuaanse vatu": "VUV",
"вату": "VUV",
"вануатски вату": "VUV", "вануатски вату": "VUV",
"вануатський вату": "VUV", "вануатський вату": "VUV",
"تالا ساموي": "WST", "تالا ساموي": "WST",
@ -5506,7 +5443,6 @@
"الدولار الكندي": "CAD", "الدولار الكندي": "CAD",
"c$": [ "c$": [
"NIO", "NIO",
"NIC",
"CAD" "CAD"
], ],
"dòlar de canadà": "CAD", "dòlar de canadà": "CAD",
@ -5550,7 +5486,6 @@
"dollar canada": "CAD", "dollar canada": "CAD",
"C$": [ "C$": [
"NIO", "NIO",
"NIC",
"CAD" "CAD"
], ],
"CAD$": "CAD", "CAD$": "CAD",
@ -5586,6 +5521,7 @@
"валюта демократической республики конго": "CDF", "валюта демократической республики конго": "CDF",
"франк бельгийского конго": "CDF", "франк бельгийского конго": "CDF",
"франк дрк": "CDF", "франк дрк": "CDF",
"kongovski frank": "CDF",
"kongo frankı": "CDF", "kongo frankı": "CDF",
"wir euro": "CHE", "wir euro": "CHE",
"che": "CHE", "che": "CHE",
@ -6046,6 +5982,8 @@
"اليورو": "EUR", "اليورو": "EUR",
"eur": "EUR", "eur": "EUR",
"euros": "EUR", "euros": "EUR",
"💶": "EUR",
"eŭroj": "EUR",
"e": [ "e": [
"SZL", "SZL",
"EUR" "EUR"
@ -6388,8 +6326,8 @@
"haitianischer gourde": "HTG", "haitianischer gourde": "HTG",
"htg": "HTG", "htg": "HTG",
"dollar haïtien": "HTG", "dollar haïtien": "HTG",
"gourde haïtienne": "HTG",
"gourde haitienne": "HTG", "gourde haitienne": "HTG",
"gourde haïtienne": "HTG",
"גורד": "HTG", "גורד": "HTG",
"구르드": "HTG", "구르드": "HTG",
"haitiaanse gourde": "HTG", "haitiaanse gourde": "HTG",
@ -6596,6 +6534,9 @@
"indisk rupee": "INR", "indisk rupee": "INR",
"indisk rupier": "INR", "indisk rupier": "INR",
"indiske rupees": "INR", "indiske rupees": "INR",
"rubai": "INR",
"rupaye": "INR",
"tanka": "INR",
"inr": "INR", "inr": "INR",
"rupaya": "INR", "rupaya": "INR",
"rupee": [ "rupee": [
@ -6650,6 +6591,7 @@
"dinar do iraque": "IQD", "dinar do iraque": "IQD",
"валюта ирака": "IQD", "валюта ирака": "IQD",
"динар ирака": "IQD", "динар ирака": "IQD",
"iraški dinar": "IQD",
"இராக்கிய தீனார்": "IQD", "இராக்கிய தீனார்": "IQD",
"ஈராக் டினார்": "IQD", "ஈராக் டினார்": "IQD",
"ஈராக் தினார்": "IQD", "ஈராக் தினார்": "IQD",
@ -7280,8 +7222,6 @@
"أوقيه موريتانيه": "MRU", "أوقيه موريتانيه": "MRU",
"الأوقية الموريتانية": "MRU", "الأوقية الموريتانية": "MRU",
"العملة الموريتانية": "MRU", "العملة الموريتانية": "MRU",
"khoums": "MRU",
"khoum": "MRU",
"uqiya": "MRU", "uqiya": "MRU",
"mru": "MRU", "mru": "MRU",
"um": "MRU", "um": "MRU",
@ -7478,126 +7418,36 @@
"nigérijská naira": "NGN", "nigérijská naira": "NGN",
"наира": "NGN", "наира": "NGN",
"nigeriansk naira": "NGN", "nigeriansk naira": "NGN",
"كوردوبا نيكاراجوي": [ "كوردوبا نيكاراجوي": "NIO",
"NIO", "córdoba nicaragüenc": "NIO",
"NIC" "córdoba nicaragüenca": "NIO",
], "nicaraguanischer córdoba": "NIO",
"córdoba nicaragüenc": [ "mariana montserrat": "NIO",
"NIO", "nic": "NIO",
"NIC" "nio": "NIO",
], "nicaraguan cordoba": "NIO",
"córdoba nicaragüenca": [ "cordoba nicaraguense": "NIO",
"NIO", "cordoba nicaragüense": "NIO",
"NIC" "córdoba nicaragüense": "NIO",
], "cordoba nicaraguayen": "NIO",
"nicaraguanischer córdoba": [ "córdoba nicaraguayen": "NIO",
"NIO", "córdoba nicaraguéen": "NIO",
"NIC" "nikaragvanska córdoba": "NIO",
], "100ドル紙幣": "NIO",
"mariana montserrat": [ "コルドバ・オロ": "NIO",
"NIO", "nicaraguaanse cordoba": "NIO",
"NIC" "córdoba ouro": "NIO",
], "córdoba nicaraguano": "NIO",
"nic": [ "валюта никарагуа": "NIO",
"NIO", "золотая кордоба": "NIO",
"NIC" "кордоба": "NIO",
], "кордобас": "NIO",
"nio": [ "новая никарагуанская кордоба": "NIO",
"NIO", "никарагванска златна кордоба": "NIO",
"NIC" "никарагванска кордоба оро": "NIO",
], "nicaraguansk córdoba": "NIO",
"nicaraguan cordoba": [ "nikaragua kordobası": "NIO",
"NIO", "нікарагуанська кордова": "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"
],
"nok": "NOK", "nok": "NOK",
"كرونه نروجية": "NOK", "كرونه نروجية": "NOK",
"corona de noruega": "NOK", "corona de noruega": "NOK",
@ -8961,11 +8811,11 @@
"usbekistan som": "UZS", "usbekistan som": "UZS",
"usbekistan sum": "UZS", "usbekistan sum": "UZS",
"uzbekistani som": "UZS", "uzbekistani som": "UZS",
"uzs": "UZS",
"uzbeka sumo": "UZS", "uzbeka sumo": "UZS",
"som uzbeco": "UZS", "som uzbeco": "UZS",
"sum uzbeco": "UZS", "sum uzbeco": "UZS",
"sum uzbeko": "UZS", "sum uzbeko": "UZS",
"uzs": "UZS",
"som uzbekistan": "UZS", "som uzbekistan": "UZS",
"som usbeco": "UZS", "som usbeco": "UZS",
"ウズベキスタン・スム": "UZS", "ウズベキスタン・スム": "UZS",
@ -9019,12 +8869,12 @@
"₫": "VND", "₫": "VND",
"vnd": "VND", "vnd": "VND",
"vnđ": "VND", "vnđ": "VND",
"vietnam đồng": "VND",
"đong": "VND", "đong": "VND",
"vietnamin dong": "VND", "vietnamin dong": "VND",
"dong vietnamien": "VND", "dong vietnamien": "VND",
"דונג וייטנאמי ": "VND", "דונג וייטנאמי ": "VND",
"vietnámi dong": "VND", "vietnámi dong": "VND",
"vietnam đồng": "VND",
"ベトナムドン": "VND", "ベトナムドン": "VND",
"ベトナム・ドン": "VND", "ベトナム・ドン": "VND",
"越南銅": "VND", "越南銅": "VND",
@ -9820,7 +9670,7 @@
"ro": "Marcă bosniacă convertibilă", "ro": "Marcă bosniacă convertibilă",
"ru": "конвертируемая марка", "ru": "конвертируемая марка",
"sk": "Konvertibilná marka", "sk": "Konvertibilná marka",
"sl": "Konvertibilna marka Bosne in Hercegovine", "sl": "konvertibilna marka Bosne in Hercegovine",
"sr": "конвертибилна марка", "sr": "конвертибилна марка",
"sv": "Konvertibilna marka", "sv": "Konvertibilna marka",
"ta": "கன்வர்ட்டிபிள் மார்க்கு", "ta": "கன்வர்ட்டிபிள் மார்க்கு",
@ -10039,6 +9889,7 @@
"BND": { "BND": {
"ar": "دولار بروني", "ar": "دولار بروني",
"bg": "Брунейски долар", "bg": "Брунейски долар",
"bn": "ব্রুনাই ডলার",
"ca": "dòlar de Brunei", "ca": "dòlar de Brunei",
"cs": "Brunejský dolar", "cs": "Brunejský dolar",
"de": "Brunei-Dollar", "de": "Brunei-Dollar",
@ -10420,7 +10271,8 @@
"uk": "Конголезький франк", "uk": "Конголезький франк",
"vi": "Franc Congo", "vi": "Franc Congo",
"cy": "ffranc y Congo", "cy": "ffranc y Congo",
"oc": "Franc congolés" "oc": "Franc congolés",
"sl": "kongovski frank"
}, },
"CHF": { "CHF": {
"af": "Switserse frank", "af": "Switserse frank",
@ -11490,7 +11342,7 @@
"es": "gourde", "es": "gourde",
"eu": "Gourde", "eu": "Gourde",
"fi": "Haitin gourde", "fi": "Haitin gourde",
"fr": "Gourde", "fr": "gourde",
"he": "גורד", "he": "גורד",
"hr": "Haićanski gourd", "hr": "Haićanski gourd",
"hu": "haiti gourde", "hu": "haiti gourde",
@ -11543,7 +11395,7 @@
"ro": "Forint", "ro": "Forint",
"ru": "венгерский форинт", "ru": "венгерский форинт",
"sk": "Maďarský forint", "sk": "Maďarský forint",
"sl": "Madžarski forint", "sl": "madžarski forint",
"sr": "мађарска форинта", "sr": "мађарска форинта",
"sv": "Forint", "sv": "Forint",
"ta": "அங்கேரிய போரிண்ட்", "ta": "அங்கேரிய போரிண்ட்",
@ -11713,6 +11565,7 @@
"th": "ดินาร์อิรัก", "th": "ดินาร์อิรัก",
"tr": "Irak dinarı", "tr": "Irak dinarı",
"uk": "Іракський динар", "uk": "Іракський динар",
"sl": "iraški dinar",
"ta": "இராக்கிய தீனார்" "ta": "இராக்கிய தீனார்"
}, },
"IRR": { "IRR": {
@ -12985,40 +12838,6 @@
"oc": "Naira", "oc": "Naira",
"sl": "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": { "NIO": {
"af": "Córdoba", "af": "Córdoba",
"ar": "كوردبا نيكاراغوا", "ar": "كوردبا نيكاراغوا",
@ -13880,6 +13699,7 @@
"af": "Singapoer-dollar", "af": "Singapoer-dollar",
"ar": "دولار سنغافوري", "ar": "دولار سنغافوري",
"bg": "Сингапурски долар", "bg": "Сингапурски долар",
"bn": "সিঙ্গাপুর ডলার",
"ca": "dòlar de Singapur", "ca": "dòlar de Singapur",
"cs": "Singapurský dolar", "cs": "Singapurský dolar",
"da": "singaporeansk dollar", "da": "singaporeansk dollar",
@ -14164,7 +13984,7 @@
"pl": "Funt syryjski", "pl": "Funt syryjski",
"pt": "libra síria", "pt": "libra síria",
"ru": "сирийский фунт", "ru": "сирийский фунт",
"sl": "Sirski funt", "sl": "sirski funt",
"sr": "сиријска фунта", "sr": "сиријска фунта",
"sv": "Syriskt pund", "sv": "Syriskt pund",
"tr": "Suriye lirası", "tr": "Suriye lirası",
@ -14634,7 +14454,7 @@
"ml": "യുണൈറ്റഡ് സ്റ്റേറ്റ്സ് ഡോളർ", "ml": "യുണൈറ്റഡ് സ്റ്റേറ്റ്സ് ഡോളർ",
"ms": "Dolar Amerika Syarikat", "ms": "Dolar Amerika Syarikat",
"nl": "US dollar", "nl": "US dollar",
"oc": "Dolar american", "oc": "dolar american",
"pa": "ਸੰਯੁਕਤ ਰਾਜ ਡਾਲਰ", "pa": "ਸੰਯੁਕਤ ਰਾਜ ਡਾਲਰ",
"pap": "Dollar merikano", "pap": "Dollar merikano",
"pl": "dolar amerykański", "pl": "dolar amerykański",
@ -14651,7 +14471,7 @@
"te": "యునైటెడ్ స్టేట్స్ డాలర్", "te": "యునైటెడ్ స్టేట్స్ డాలర్",
"th": "ดอลลาร์สหรัฐ", "th": "ดอลลาร์สหรัฐ",
"tr": "Amerikan doları", "tr": "Amerikan doları",
"uk": "долар США", "uk": "Долар США",
"vi": "đô la Mỹ" "vi": "đô la Mỹ"
}, },
"UYU": { "UYU": {
@ -14747,7 +14567,7 @@
"cs": "Vietnamský dong", "cs": "Vietnamský dong",
"da": "Dong", "da": "Dong",
"de": "vietnamesischer Đồng", "de": "vietnamesischer Đồng",
"en": "Vietnam Đồng", "en": "Vietnamese đồng",
"eo": "vjetnama dongo", "eo": "vjetnama dongo",
"es": "đồng vietnamita", "es": "đồng vietnamita",
"eu": "Vietnamdar dong", "eu": "Vietnamdar dong",
@ -14778,6 +14598,7 @@
}, },
"VUV": { "VUV": {
"ar": "فاتو فانواتي", "ar": "فاتو فانواتي",
"bg": "Вату",
"ca": "vatu", "ca": "vatu",
"cs": "Vanuatský vatu", "cs": "Vanuatský vatu",
"de": "Vatu", "de": "Vatu",

File diff suppressed because one or more lines are too long

View file

@ -47,6 +47,7 @@
"es": "es", "es": "es",
"fa": "fa", "fa": "fa",
"fr": "fr", "fr": "fr",
"ga": "ga",
"he": "he", "he": "he",
"hi": "hi", "hi": "hi",
"hr": "hr", "hr": "hr",
@ -59,18 +60,19 @@
"ko": "ko", "ko": "ko",
"lt": "lt", "lt": "lt",
"lv": "lv", "lv": "lv",
"mn": "mn",
"nl": "nl", "nl": "nl",
"no": "no", "no": "no",
"pl": "pl", "pl": "pl",
"pt": "pt", "pt": "pt",
"ro": "ro", "ro": "ro",
"ru": "ru", "ru": "ru",
"rw": "rw",
"sr": "sr", "sr": "sr",
"sv": "sv", "sv": "sv",
"ta": "ta", "ta": "ta",
"tr": "tr", "tr": "tr",
"uk": "uk", "uk": "uk",
"ur": "ur",
"vi": "vi", "vi": "vi",
"zh": "zh", "zh": "zh",
"zh_Hant": "zh-Hant" "zh_Hant": "zh-Hant"
@ -2390,7 +2392,7 @@
"zh-TW": "tw-tzh" "zh-TW": "tw-tzh"
} }
}, },
"duckduckgo videos": { "duckduckgo news": {
"all_locale": "wt-wt", "all_locale": "wt-wt",
"custom": { "custom": {
"lang_region": { "lang_region": {
@ -2554,7 +2556,7 @@
"zh-TW": "tw-tzh" "zh-TW": "tw-tzh"
} }
}, },
"duckduckgo news": { "duckduckgo videos": {
"all_locale": "wt-wt", "all_locale": "wt-wt",
"custom": { "custom": {
"lang_region": { "lang_region": {
@ -5301,6 +5303,7 @@
"CC", "CC",
"CD", "CD",
"CF", "CF",
"CG",
"CH", "CH",
"CI", "CI",
"CK", "CK",
@ -5378,6 +5381,7 @@
"LB", "LB",
"LC", "LC",
"LK", "LK",
"LS",
"LT", "LT",
"LU", "LU",
"LV", "LV",
@ -5486,6 +5490,7 @@
"ak": "akan", "ak": "akan",
"am": "amharic", "am": "amharic",
"ar": "arabic", "ar": "arabic",
"as": "assamese",
"ast": "asturian", "ast": "asturian",
"az": "azerbaijani", "az": "azerbaijani",
"be": "belarusian", "be": "belarusian",
@ -5967,6 +5972,7 @@
"fiu-vro", "fiu-vro",
"fj", "fj",
"fo", "fo",
"fon",
"fr", "fr",
"frp", "frp",
"frr", "frr",
@ -6022,6 +6028,7 @@
"kbd", "kbd",
"kbp", "kbp",
"kcg", "kcg",
"kg",
"ki", "ki",
"kk", "kk",
"kl", "kl",

View file

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

View file

@ -241,6 +241,7 @@
"Q116432563": "ˢ", "Q116432563": "ˢ",
"Q116443090": "ʰ", "Q116443090": "ʰ",
"Q1165799": "mil", "Q1165799": "mil",
"Q116939356": "Qs",
"Q11776930": "Mg", "Q11776930": "Mg",
"Q11830636": "psf", "Q11830636": "psf",
"Q11929860": "kpc", "Q11929860": "kpc",
@ -268,6 +269,7 @@
"Q12269122": "YB/s", "Q12269122": "YB/s",
"Q12269308": "Zb/s", "Q12269308": "Zb/s",
"Q12269309": "ZB/s", "Q12269309": "ZB/s",
"Q122972375": "Rs",
"Q1238720": "vols.", "Q1238720": "vols.",
"Q1247300": "cm H₂O", "Q1247300": "cm H₂O",
"Q12714022": "cwt", "Q12714022": "cwt",
@ -822,7 +824,6 @@
"Q7398951": "PPI", "Q7398951": "PPI",
"Q743895": "bpm", "Q743895": "bpm",
"Q748716": "fps", "Q748716": "fps",
"Q752079": "RT",
"Q752197": "kJ/mol", "Q752197": "kJ/mol",
"Q7574000": "sp", "Q7574000": "sp",
"Q7672057": "TU", "Q7672057": "TU",
@ -890,6 +891,7 @@
"Q911730": "nx", "Q911730": "nx",
"Q914151": "P_P", "Q914151": "P_P",
"Q915169": "F_P", "Q915169": "F_P",
"Q918094": "g",
"Q93318": "M", "Q93318": "M",
"Q933427": "B", "Q933427": "B",
"Q93678895": "gill (US)", "Q93678895": "gill (US)",

View file

@ -1,15 +1,6 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
# lint: pylint # lint: pylint
""".. _limiter src: """Bot protection / IP rate limitation. The intention of rate limitation is to
Limiter
=======
.. sidebar:: info
The limiter requires a :ref:`Redis <settings redis>` database.
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 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 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 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 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 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: 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: redis:
url: unix:///usr/local/searxng-redis/run/redis.sock?db=0 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 from __future__ import annotations
import sys
from pathlib import Path from pathlib import Path
from ipaddress import ip_address from ipaddress import ip_address
import flask import flask
import werkzeug import werkzeug
from searx.tools import config from searx import (
from searx import logger logger,
redisdb,
from . import ( )
from searx import botdetection
from searx.botdetection import (
config,
http_accept, http_accept,
http_accept_encoding, http_accept_encoding,
http_accept_language, http_accept_language,
http_user_agent, http_user_agent,
ip_limit, ip_limit,
ip_lists, ip_lists,
)
from ._helpers import (
get_network, get_network,
get_real_ip, get_real_ip,
dump_request, 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 CFG: config.Config = None # type: ignore
_INSTALLED = False
LIMITER_CFG_SCHEMA = Path(__file__).parent / "limiter.toml" LIMITER_CFG_SCHEMA = Path(__file__).parent / "limiter.toml"
"""Base configuration (schema) of the botdetection.""" """Base configuration (schema) of the botdetection."""
@ -143,3 +203,41 @@ def filter_request(request: flask.Request) -> werkzeug.Response | None:
return val return val
logger.debug(f"OK {network}: %s", dump_request(flask.request)) logger.debug(f"OK {network}: %s", dump_request(flask.request))
return None 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 %} {% else %}
<link rel="stylesheet" href="{{ url_for('static', filename='css/searxng.min.css') }}" type="text/css" media="screen" /> <link rel="stylesheet" href="{{ url_for('static', filename='css/searxng.min.css') }}" type="text/css" media="screen" />
{% endif %} {% 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" /> <link rel="stylesheet" href="{{ url_for('client_token', token=link_token) }}" type="text/css" />
{% endif %} {% endif %}
{% block styles %}{% endblock %} {% 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" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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" "Last-Translator: return42 <markus.heiser@darmarit.de>\n"
"Language-Team: Afrikaans <https://translate.codeberg.org/projects/searxng/"
"searxng/af/>\n"
"Language: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0.2\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -322,7 +323,7 @@ msgstr "Die prent kon nie afgelaai word nie."
#: searx/engines/wttr.py:101 #: searx/engines/wttr.py:101
msgid "Morning" msgid "Morning"
msgstr "More" msgstr "Oggend"
#: searx/engines/wttr.py:101 #: searx/engines/wttr.py:101
msgid "Noon" msgid "Noon"
@ -1399,4 +1400,3 @@ msgstr ""
#~ "use another query or search in " #~ "use another query or search in "
#~ "more categories." #~ "more categories."
#~ msgstr "" #~ msgstr ""

View file

@ -13,20 +13,22 @@
# Markus Heiser <markus.heiser@darmarit.de>, 2022. # Markus Heiser <markus.heiser@darmarit.de>, 2022.
# return42 <markus.heiser@darmarit.de>, 2023. # return42 <markus.heiser@darmarit.de>, 2023.
# Ivan Gabaldon <admin@inetol.net>, 2023. # Ivan Gabaldon <admin@inetol.net>, 2023.
# quenty_occitania <quentinantonin@free.fr>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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-26 15:37+0000\n"
"Last-Translator: return42 <markus.heiser@darmarit.de>\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: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.1\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -117,7 +119,7 @@ msgstr "paquets"
#. CATEGORY_GROUPS['Q_A'] #. CATEGORY_GROUPS['Q_A']
#: searx/searxng.msg #: searx/searxng.msg
msgid "q&a" msgid "q&a"
msgstr "preguntes i respostes" msgstr "questions i respostes"
#. CATEGORY_GROUPS['REPOS'] #. CATEGORY_GROUPS['REPOS']
#: searx/searxng.msg #: searx/searxng.msg
@ -1685,4 +1687,3 @@ msgstr "amaga el vídeo"
#~ "no hem trobat cap resultat. Feu " #~ "no hem trobat cap resultat. Feu "
#~ "una consulta diferent o cerqueu en " #~ "una consulta diferent o cerqueu en "
#~ "més categories." #~ "més categories."

View file

@ -13,18 +13,19 @@
# RaptaG <george-raptis@tutamail.com>, 2023. # RaptaG <george-raptis@tutamail.com>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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" "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: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0.2\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -275,7 +276,7 @@ msgstr "Κανάλι"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "ράδιο"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
@ -283,7 +284,7 @@ msgstr ""
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "ψήφους"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
@ -1689,4 +1690,3 @@ msgstr "απόκρυψη βίντεο"
#~ "δε βρέθηκαν αποτελέσματα. Παρακαλούμε " #~ "δε βρέθηκαν αποτελέσματα. Παρακαλούμε "
#~ "χρησιμοποιήστε άλλη αναζήτηση ή ψάξτε σε" #~ "χρησιμοποιήστε άλλη αναζήτηση ή ψάξτε σε"
#~ " περισσότερες κατηγορίες." #~ " περισσότερες κατηγορίες."

View file

@ -13,18 +13,19 @@
# alexgabi <alexgabi@disroot.org>, 2023. # alexgabi <alexgabi@disroot.org>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\n" "POT-Creation-Date: 2023-10-05 09:01+0000\n"
"PO-Revision-Date: 2023-09-29 07:07+0000\n" "PO-Revision-Date: 2023-10-15 20:53+0000\n"
"Last-Translator: return42 <markus.heiser@darmarit.de>\n" "Last-Translator: alexgabi <alexgabi@disroot.org>\n"
"Language-Team: Basque <https://translate.codeberg.org/projects/searxng/"
"searxng/eu/>\n"
"Language: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0.2\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -275,19 +276,19 @@ msgstr "Kanala"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "irratia"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "bit emaria"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "botoak"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
msgstr "" msgstr "klikak"
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129 #: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
msgid "Language" msgid "Language"
@ -1665,4 +1666,3 @@ msgstr "ezkutatu bideoa"
#~ "ez dugu emaitzarik aurkitu. Mesedez " #~ "ez dugu emaitzarik aurkitu. Mesedez "
#~ "beste kontsulta bat egin edo bilatu " #~ "beste kontsulta bat egin edo bilatu "
#~ "kategoria gehiagotan." #~ "kategoria gehiagotan."

View file

@ -10,18 +10,19 @@
# artnay <jiri.gronroos@iki.fi>, 2023. # artnay <jiri.gronroos@iki.fi>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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: artnay <jiri.gronroos@iki.fi>\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: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.1\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -272,15 +273,15 @@ msgstr "Kanava"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "radio"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "bittinopeus"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "ääntä"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
@ -1677,4 +1678,3 @@ msgstr "piilota video"
#~ "löytynyt. Etsi käyttäen eri hakuehtoja " #~ "löytynyt. Etsi käyttäen eri hakuehtoja "
#~ "tai ulota hakusi nykyistä useampiin eri" #~ "tai ulota hakusi nykyistä useampiin eri"
#~ " luokkiin." #~ " luokkiin."

View file

@ -9,19 +9,20 @@
# return42 <markus.heiser@darmarit.de>, 2023. # return42 <markus.heiser@darmarit.de>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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" "Last-Translator: return42 <markus.heiser@darmarit.de>\n"
"Language-Team: Filipino <https://translate.codeberg.org/projects/searxng/"
"searxng/fil/>\n"
"Language: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n == 1 || n==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" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -272,11 +273,11 @@ msgstr "Tyanel"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "radyo"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "bitrate"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
@ -1671,4 +1672,3 @@ msgstr "itago ang video"
#~ "wala kaming nakita na resulta. Pakiusap" #~ "wala kaming nakita na resulta. Pakiusap"
#~ " na ibahin ang tanong o maghanap " #~ " na ibahin ang tanong o maghanap "
#~ "sa maraming uri." #~ "sa maraming uri."

View file

@ -17,13 +17,14 @@
# NoEnd-yt <isaac.landau2104@gmail.com>, 2023. # NoEnd-yt <isaac.landau2104@gmail.com>, 2023.
# return42 <markus.heiser@darmarit.de>, 2023. # return42 <markus.heiser@darmarit.de>, 2023.
# microsoftocsharp <kottiberyu@gmail.com>, 2023. # microsoftocsharp <kottiberyu@gmail.com>, 2023.
# quenty_occitania <quentinantonin@free.fr>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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-27 07:07+0000\n"
"Last-Translator: return42 <markus.heiser@darmarit.de>\n" "Last-Translator: quenty_occitania <quentinantonin@free.fr>\n"
"Language-Team: French <https://translate.codeberg.org/projects/searxng/" "Language-Team: French <https://translate.codeberg.org/projects/searxng/"
"searxng/fr/>\n" "searxng/fr/>\n"
"Language: fr\n" "Language: fr\n"
@ -31,7 +32,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.0.2\n" "X-Generator: Weblate 5.1\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -270,7 +271,7 @@ msgstr "Obtenir l'itinéraire"
#: searx/engines/pdbe.py:96 #: searx/engines/pdbe.py:96
msgid "{title} (OBSOLETE)" msgid "{title} (OBSOLETE)"
msgstr "{titre} (OBSOLÈTE)" msgstr "{title} (OBSOLÈTE)"
#: searx/engines/pdbe.py:103 #: searx/engines/pdbe.py:103
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
@ -282,19 +283,19 @@ msgstr "Chaîne"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "radio"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "débit"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "voix"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
msgstr "" msgstr "clics"
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129 #: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
msgid "Language" msgid "Language"
@ -1021,7 +1022,7 @@ msgstr "Raccourcis clavier"
#: searx/templates/simple/preferences/hotkeys.html:13 #: searx/templates/simple/preferences/hotkeys.html:13
msgid "Vim-like" msgid "Vim-like"
msgstr "" msgstr "Comme-vim"
#: searx/templates/simple/preferences/hotkeys.html:18 #: searx/templates/simple/preferences/hotkeys.html:18
msgid "" msgid ""

View file

@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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" "Last-Translator: return42 <markus.heiser@darmarit.de>\n"
"Language-Team: Latvian <https://translate.codeberg.org/projects/searxng/" "Language-Team: Latvian <https://translate.codeberg.org/projects/searxng/"
"searxng/lv/>\n" "searxng/lv/>\n"
@ -21,7 +21,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= "
"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" "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" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -272,19 +272,19 @@ msgstr "Kanāls"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "radio"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "bitu pārraide"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "balsis"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
msgstr "" msgstr "klikšķi"
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129 #: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
msgid "Language" msgid "Language"
@ -304,16 +304,20 @@ msgid ""
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or" "format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP." " WebP."
msgstr "" msgstr ""
"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 #: searx/engines/tineye.py:46
msgid "" msgid ""
"The image is too simple to find matches. TinEye requires a basic level of" "The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches." " visual detail to successfully identify matches."
msgstr "" msgstr ""
"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 #: searx/engines/tineye.py:52
msgid "The image could not be downloaded." 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 #: searx/engines/wttr.py:101
msgid "Morning" msgid "Morning"
@ -354,26 +358,32 @@ msgstr "Resursdatora vārda nomaiņa"
#: searx/plugins/hostname_replace.py:10 #: searx/plugins/hostname_replace.py:10
msgid "Rewrite result hostnames or remove results based on the hostname" msgid "Rewrite result hostnames or remove results based on the hostname"
msgstr "" msgstr ""
"Pārrakstīt rezultātu saimniekvārdus vai noņemt rezultātus, pamatojoties uz "
"saimniekvārdu"
#: searx/plugins/oa_doi_rewrite.py:9 #: searx/plugins/oa_doi_rewrite.py:9
msgid "Open Access DOI rewrite" msgid "Open Access DOI rewrite"
msgstr "" msgstr "Atvērtās piekļuves DOI pārrakstīšana"
#: searx/plugins/oa_doi_rewrite.py:10 #: searx/plugins/oa_doi_rewrite.py:10
msgid "" msgid ""
"Avoid paywalls by redirecting to open-access versions of publications " "Avoid paywalls by redirecting to open-access versions of publications "
"when available" "when available"
msgstr "" msgstr ""
"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 #: searx/plugins/self_info.py:10
msgid "Self Information" msgid "Self Information"
msgstr "" msgstr "Informācija par sevi"
#: searx/plugins/self_info.py:11 #: searx/plugins/self_info.py:11
msgid "" msgid ""
"Displays your IP if the query is \"ip\" and your user agent if the query " "Displays your IP if the query is \"ip\" and your user agent if the query "
"contains \"user agent\"." "contains \"user agent\"."
msgstr "" msgstr ""
"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 #: searx/plugins/tor_check.py:25
msgid "Tor check plugin" msgid "Tor check plugin"
@ -403,7 +413,7 @@ msgstr ""
#: searx/plugins/tracker_url_remover.py:29 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "" msgstr "Izsekošanas URL noņemšanas līdzeklis"
#: searx/plugins/tracker_url_remover.py:30 #: searx/plugins/tracker_url_remover.py:30
msgid "Remove trackers arguments from the returned URL" msgid "Remove trackers arguments from the returned URL"

View file

@ -19,18 +19,19 @@
# microsoftocsharp <kottiberyu@gmail.com>, 2023. # microsoftocsharp <kottiberyu@gmail.com>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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" "Last-Translator: return42 <markus.heiser@darmarit.de>\n"
"Language-Team: Dutch <https://translate.codeberg.org/projects/searxng/"
"searxng/nl/>\n"
"Language: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0.2\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -281,19 +282,19 @@ msgstr "Kanaal"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "radio"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "bitrate"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "stemmen"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
msgstr "" msgstr "clicks"
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129 #: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
msgid "Language" msgid "Language"
@ -854,7 +855,7 @@ msgstr ""
#: searx/templates/simple/messages/no_results.html:6 #: searx/templates/simple/messages/no_results.html:6
msgid "Refresh the page." msgid "Refresh the page."
msgstr "" msgstr "Ververs de pagina"
#: searx/templates/simple/messages/no_results.html:7 #: searx/templates/simple/messages/no_results.html:7
msgid "Search for another query or select another category (above)." msgid "Search for another query or select another category (above)."
@ -1696,4 +1697,3 @@ msgstr "verberg video"
#~ "We konden geen resultaten vinden. " #~ "We konden geen resultaten vinden. "
#~ "Probeer een andere zoekopdracht, of zoek" #~ "Probeer een andere zoekopdracht, of zoek"
#~ " in meer categorieën." #~ " in meer categorieën."

View file

@ -6,31 +6,33 @@
# Quentin PAGÈS, 2016,2018 # Quentin PAGÈS, 2016,2018
# Marc Abonce Seguin, 2019 # Marc Abonce Seguin, 2019
# return42 <markus.heiser@darmarit.de>, 2023. # return42 <markus.heiser@darmarit.de>, 2023.
# quenty_occitania <quentinantonin@free.fr>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\n" "POT-Creation-Date: 2023-10-05 09:01+0000\n"
"PO-Revision-Date: 2023-07-09 15:34+0000\n" "PO-Revision-Date: 2023-10-27 07:07+0000\n"
"Last-Translator: return42 <markus.heiser@darmarit.de>\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: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Weblate 5.1\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
#: searx/searxng.msg #: searx/searxng.msg
msgid "without further subgrouping" msgid "without further subgrouping"
msgstr "" msgstr "sens jos grop"
#. CONSTANT_NAMES['DEFAULT_CATEGORY'] #. CONSTANT_NAMES['DEFAULT_CATEGORY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "other" msgid "other"
msgstr "" msgstr "autre"
#. CATEGORY_NAMES['FILES'] #. CATEGORY_NAMES['FILES']
#: searx/searxng.msg #: searx/searxng.msg
@ -80,7 +82,7 @@ msgstr "mapa"
#. CATEGORY_NAMES['ONIONS'] #. CATEGORY_NAMES['ONIONS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "onions" msgid "onions"
msgstr "" msgstr "onions"
#. CATEGORY_NAMES['SCIENCE'] #. CATEGORY_NAMES['SCIENCE']
#: searx/searxng.msg #: searx/searxng.msg
@ -90,62 +92,62 @@ msgstr "sciéncia"
#. CATEGORY_GROUPS['APPS'] #. CATEGORY_GROUPS['APPS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "apps" msgid "apps"
msgstr "" msgstr "aplicacions"
#. CATEGORY_GROUPS['DICTIONARIES'] #. CATEGORY_GROUPS['DICTIONARIES']
#: searx/searxng.msg #: searx/searxng.msg
msgid "dictionaries" msgid "dictionaries"
msgstr "" msgstr "diccionaris"
#. CATEGORY_GROUPS['LYRICS'] #. CATEGORY_GROUPS['LYRICS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "lyrics" msgid "lyrics"
msgstr "" msgstr "paraulas"
#. CATEGORY_GROUPS['PACKAGES'] #. CATEGORY_GROUPS['PACKAGES']
#: searx/searxng.msg #: searx/searxng.msg
msgid "packages" msgid "packages"
msgstr "" msgstr "paquets"
#. CATEGORY_GROUPS['Q_A'] #. CATEGORY_GROUPS['Q_A']
#: searx/searxng.msg #: searx/searxng.msg
msgid "q&a" msgid "q&a"
msgstr "" msgstr "questions/responsas"
#. CATEGORY_GROUPS['REPOS'] #. CATEGORY_GROUPS['REPOS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "repos" msgid "repos"
msgstr "" msgstr "repertòris"
#. CATEGORY_GROUPS['SOFTWARE_WIKIS'] #. CATEGORY_GROUPS['SOFTWARE_WIKIS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "software wikis" msgid "software wikis"
msgstr "" msgstr "wikis logicial"
#. CATEGORY_GROUPS['WEB'] #. CATEGORY_GROUPS['WEB']
#: searx/searxng.msg #: searx/searxng.msg
msgid "web" msgid "web"
msgstr "" msgstr "web"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS'] #. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "scientific publications" msgid "scientific publications"
msgstr "" msgstr "articles scientifics"
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
msgid "auto" msgid "auto"
msgstr "" msgstr "automatic"
#. STYLE_NAMES['LIGHT'] #. STYLE_NAMES['LIGHT']
#: searx/searxng.msg #: searx/searxng.msg
msgid "light" msgid "light"
msgstr "" msgstr "clar"
#. STYLE_NAMES['DARK'] #. STYLE_NAMES['DARK']
#: searx/searxng.msg #: searx/searxng.msg
msgid "dark" msgid "dark"
msgstr "" msgstr "fosc"
#: searx/webapp.py:331 #: searx/webapp.py:331
msgid "No item found" msgid "No item found"
@ -154,11 +156,11 @@ msgstr "Cap delement pas trobat"
#: searx/engines/qwant.py:280 #: searx/engines/qwant.py:280
#: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:333 #: searx/templates/simple/result_templates/images.html:20 searx/webapp.py:333
msgid "Source" msgid "Source"
msgstr "" msgstr "Font"
#: searx/webapp.py:335 #: searx/webapp.py:335
msgid "Error loading the next page" msgid "Error loading the next page"
msgstr "" msgstr "Error en cargant la pagina seguenta"
#: searx/webapp.py:492 searx/webapp.py:888 #: searx/webapp.py:492 searx/webapp.py:888
msgid "Invalid settings, please edit your preferences" msgid "Invalid settings, please edit your preferences"
@ -174,59 +176,59 @@ msgstr "error de recèrca"
#: searx/webutils.py:34 #: searx/webutils.py:34
msgid "timeout" msgid "timeout"
msgstr "" msgstr "expirat"
#: searx/webutils.py:35 #: searx/webutils.py:35
msgid "parsing error" msgid "parsing error"
msgstr "" msgstr "error danalisi"
#: searx/webutils.py:36 #: searx/webutils.py:36
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "" msgstr "error de protocòl HTTP"
#: searx/webutils.py:37 #: searx/webutils.py:37
msgid "network error" msgid "network error"
msgstr "" msgstr "Error de ret"
#: searx/webutils.py:38 #: searx/webutils.py:38
msgid "SSL error: certificate validation has failed" msgid "SSL error: certificate validation has failed"
msgstr "" msgstr "Error SSL : la verificacion del certificat a fracassat"
#: searx/webutils.py:40 #: searx/webutils.py:40
msgid "unexpected crash" msgid "unexpected crash"
msgstr "" msgstr "error inesperada"
#: searx/webutils.py:47 #: searx/webutils.py:47
msgid "HTTP error" msgid "HTTP error"
msgstr "" msgstr "error HTTP"
#: searx/webutils.py:48 #: searx/webutils.py:48
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "" msgstr "error de connexion HTTP"
#: searx/webutils.py:54 #: searx/webutils.py:54
msgid "proxy error" msgid "proxy error"
msgstr "" msgstr "Error servidor mandatari"
#: searx/webutils.py:55 #: searx/webutils.py:55
msgid "CAPTCHA" msgid "CAPTCHA"
msgstr "" msgstr "CAPTCHA"
#: searx/webutils.py:56 #: searx/webutils.py:56
msgid "too many requests" msgid "too many requests"
msgstr "" msgstr "tròpas de requèstas"
#: searx/webutils.py:57 #: searx/webutils.py:57
msgid "access denied" msgid "access denied"
msgstr "" msgstr "accès refusat"
#: searx/webutils.py:58 #: searx/webutils.py:58
msgid "server API error" msgid "server API error"
msgstr "" msgstr "error de lAPI del servidor"
#: searx/webutils.py:77 #: searx/webutils.py:77
msgid "Suspended" msgid "Suspended"
msgstr "" msgstr "Suspendut"
#: searx/webutils.py:317 #: searx/webutils.py:317
msgid "{minutes} minute(s) ago" msgid "{minutes} minute(s) ago"
@ -254,11 +256,11 @@ msgstr "Calcula las {functions} dels arguments"
#: searx/engines/openstreetmap.py:160 #: searx/engines/openstreetmap.py:160
msgid "Get directions" msgid "Get directions"
msgstr "" msgstr "Obténer litinerari"
#: searx/engines/pdbe.py:96 #: searx/engines/pdbe.py:96
msgid "{title} (OBSOLETE)" msgid "{title} (OBSOLETE)"
msgstr "" msgstr "{title} (OBSOLÈT)"
#: searx/engines/pdbe.py:103 #: searx/engines/pdbe.py:103
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
@ -266,23 +268,23 @@ msgstr "Aqueste element es estat remplaçat per"
#: searx/engines/qwant.py:282 #: searx/engines/qwant.py:282
msgid "Channel" msgid "Channel"
msgstr "" msgstr "Canal"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "ràdio"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "debit"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "vòtes"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
msgstr "" msgstr "clics"
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129 #: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
msgid "Language" msgid "Language"
@ -293,6 +295,8 @@ msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to " "{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}" "{lastCitationVelocityYear}"
msgstr "" msgstr ""
"{numCitations} citacions dempuèi lannada {firstCitationVelocityYear} fins a "
"{lastCitationVelocityYear}"
#: searx/engines/tineye.py:40 #: searx/engines/tineye.py:40
msgid "" msgid ""
@ -309,31 +313,31 @@ msgstr ""
#: searx/engines/tineye.py:52 #: searx/engines/tineye.py:52
msgid "The image could not be downloaded." msgid "The image could not be downloaded."
msgstr "" msgstr "Telecargament impossible de limatge."
#: searx/engines/wttr.py:101 #: searx/engines/wttr.py:101
msgid "Morning" msgid "Morning"
msgstr "" msgstr "Matin"
#: searx/engines/wttr.py:101 #: searx/engines/wttr.py:101
msgid "Noon" msgid "Noon"
msgstr "" msgstr "Miègjorn"
#: searx/engines/wttr.py:101 #: searx/engines/wttr.py:101
msgid "Evening" msgid "Evening"
msgstr "" msgstr "Ser"
#: searx/engines/wttr.py:101 #: searx/engines/wttr.py:101
msgid "Night" msgid "Night"
msgstr "" msgstr "Nuèch"
#: searx/engines/zlibrary.py:130 #: searx/engines/zlibrary.py:130
msgid "Book rating" msgid "Book rating"
msgstr "" msgstr "Nòta del libre"
#: searx/engines/zlibrary.py:131 #: searx/engines/zlibrary.py:131
msgid "File quality" msgid "File quality"
msgstr "" msgstr "Qualitat del fichièr"
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
@ -345,7 +349,7 @@ msgstr ""
#: searx/plugins/hostname_replace.py:9 #: searx/plugins/hostname_replace.py:9
msgid "Hostname replace" msgid "Hostname replace"
msgstr "" msgstr "Remplaçar los noms dòste"
#: searx/plugins/hostname_replace.py:10 #: searx/plugins/hostname_replace.py:10
msgid "Rewrite result hostnames or remove results based on the hostname" msgid "Rewrite result hostnames or remove results based on the hostname"
@ -365,7 +369,7 @@ msgstr ""
#: searx/plugins/self_info.py:10 #: searx/plugins/self_info.py:10
msgid "Self Information" msgid "Self Information"
msgstr "" msgstr "Informacions pròpias"
#: searx/plugins/self_info.py:11 #: searx/plugins/self_info.py:11
msgid "" msgid ""
@ -377,7 +381,7 @@ msgstr ""
#: searx/plugins/tor_check.py:25 #: searx/plugins/tor_check.py:25
msgid "Tor check plugin" msgid "Tor check plugin"
msgstr "" msgstr "Empeuton de verificacion de Tor"
#: searx/plugins/tor_check.py:28 #: searx/plugins/tor_check.py:28
msgid "" msgid ""
@ -395,7 +399,7 @@ msgstr ""
msgid "" msgid ""
"You are using Tor and it looks like you have this external IP address: " "You are using Tor and it looks like you have this external IP address: "
"{ip_address}" "{ip_address}"
msgstr "" msgstr "Utilizatz Tor e sembla quavètz aquesta adreça IP : {ip_address}"
#: searx/plugins/tor_check.py:86 #: searx/plugins/tor_check.py:86
msgid "You are not using Tor and you have this external IP address: {ip_address}" 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 #: searx/templates/simple/base.html:49
msgid "About" msgid "About"
msgstr "" msgstr "A prepaus"
#: searx/templates/simple/base.html:53 #: searx/templates/simple/base.html:53
msgid "Donate" msgid "Donate"
msgstr "" msgstr "Far un don"
#: searx/templates/simple/base.html:57 #: searx/templates/simple/base.html:57
#: searx/templates/simple/preferences.html:156 #: searx/templates/simple/preferences.html:156
@ -445,11 +449,11 @@ msgstr ""
#: searx/templates/simple/base.html:68 #: searx/templates/simple/base.html:68
msgid "Source code" msgid "Source code"
msgstr "" msgstr "Còdi font"
#: searx/templates/simple/base.html:69 #: searx/templates/simple/base.html:69
msgid "Issue tracker" msgid "Issue tracker"
msgstr "" msgstr "Seguiment danomalias"
#: searx/templates/simple/base.html:70 searx/templates/simple/stats.html:18 #: searx/templates/simple/base.html:70 searx/templates/simple/stats.html:18
msgid "Engine stats" msgid "Engine stats"
@ -457,15 +461,15 @@ msgstr "Estatistica del motor"
#: searx/templates/simple/base.html:72 #: searx/templates/simple/base.html:72
msgid "Public instances" msgid "Public instances"
msgstr "" msgstr "Instàncias publicas"
#: searx/templates/simple/base.html:75 #: searx/templates/simple/base.html:75
msgid "Privacy policy" msgid "Privacy policy"
msgstr "" msgstr "Politica de confidencialitat"
#: searx/templates/simple/base.html:78 #: searx/templates/simple/base.html:78
msgid "Contact instance maintainer" msgid "Contact instance maintainer"
msgstr "" msgstr "Contactatz lo responsable de linstància"
#: searx/templates/simple/categories.html:26 #: searx/templates/simple/categories.html:26
msgid "Click on the magnifier to perform search" 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 #: searx/templates/simple/macros.html:36
msgid "Length" msgid "Length"
msgstr "" msgstr "Longor"
#: searx/templates/simple/macros.html:37 #: searx/templates/simple/macros.html:37
#: searx/templates/simple/result_templates/images.html:18 #: searx/templates/simple/result_templates/images.html:18
#: searx/templates/simple/result_templates/paper.html:6 #: searx/templates/simple/result_templates/paper.html:6
msgid "Author" msgid "Author"
msgstr "" msgstr "Autor"
#: searx/templates/simple/macros.html:45 #: searx/templates/simple/macros.html:45
msgid "cached" msgid "cached"
@ -491,7 +495,7 @@ msgstr "proxifiat"
#: searx/templates/simple/new_issue.html:64 #: searx/templates/simple/new_issue.html:64
msgid "Start submiting a new issue on GitHub" msgid "Start submiting a new issue on GitHub"
msgstr "" msgstr "Senhalar un problèma sus GitHub"
#: searx/templates/simple/new_issue.html:66 #: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub" msgid "Please check for existing bugs about this engine on GitHub"
@ -511,7 +515,7 @@ msgstr ""
#: searx/templates/simple/preferences.html:65 #: searx/templates/simple/preferences.html:65
msgid "No HTTPS" msgid "No HTTPS"
msgstr "" msgstr "Cap de HTTPS"
#: searx/templates/simple/elements/engines_msg.html:18 #: searx/templates/simple/elements/engines_msg.html:18
#: searx/templates/simple/preferences.html:69 #: searx/templates/simple/preferences.html:69
@ -535,12 +539,12 @@ msgstr ""
#: searx/templates/simple/preferences.html:103 #: searx/templates/simple/preferences.html:103
#: searx/templates/simple/stats.html:70 #: searx/templates/simple/stats.html:70
msgid "P80" msgid "P80"
msgstr "" msgstr "P80"
#: searx/templates/simple/preferences.html:104 #: searx/templates/simple/preferences.html:104
#: searx/templates/simple/stats.html:76 #: searx/templates/simple/stats.html:76
msgid "P95" msgid "P95"
msgstr "" msgstr "P95"
#: searx/templates/simple/preferences.html:136 #: searx/templates/simple/preferences.html:136
msgid "Failed checker test(s): " msgid "Failed checker test(s): "
@ -548,7 +552,7 @@ msgstr ""
#: searx/templates/simple/preferences.html:138 #: searx/templates/simple/preferences.html:138
msgid "Errors:" msgid "Errors:"
msgstr "" msgstr "Errors :"
#: searx/templates/simple/preferences.html:162 #: searx/templates/simple/preferences.html:162
msgid "General" msgid "General"
@ -576,7 +580,7 @@ msgstr "Motors de recèrca utilizat actualament"
#: searx/templates/simple/preferences.html:231 #: searx/templates/simple/preferences.html:231
msgid "Special Queries" msgid "Special Queries"
msgstr "" msgstr "Requèstas especialas"
#: searx/templates/simple/preferences.html:237 #: searx/templates/simple/preferences.html:237
msgid "Cookies" msgid "Cookies"
@ -592,7 +596,7 @@ msgstr "Nombre de resultats"
#: searx/templates/simple/results.html:44 #: searx/templates/simple/results.html:44
msgid "Info" msgid "Info"
msgstr "" msgstr "Info"
#: searx/templates/simple/results.html:73 #: searx/templates/simple/results.html:73
msgid "Try searching for:" msgid "Try searching for:"
@ -600,19 +604,19 @@ msgstr "Ensajatz de cercar :"
#: searx/templates/simple/results.html:105 #: searx/templates/simple/results.html:105
msgid "Back to top" msgid "Back to top"
msgstr "" msgstr "Tornar ennaut"
#: searx/templates/simple/results.html:123 #: searx/templates/simple/results.html:123
msgid "Previous page" msgid "Previous page"
msgstr "" msgstr "Pagina precedenta"
#: searx/templates/simple/results.html:140 #: searx/templates/simple/results.html:140
msgid "Next page" msgid "Next page"
msgstr "" msgstr "Pagina seguenta"
#: searx/templates/simple/search.html:3 #: searx/templates/simple/search.html:3
msgid "Display the front page" msgid "Display the front page"
msgstr "" msgstr "Afichar la pagina principala"
#: searx/templates/simple/search.html:9 #: searx/templates/simple/search.html:9
#: searx/templates/simple/simple_search.html:5 #: searx/templates/simple/simple_search.html:5
@ -622,12 +626,12 @@ msgstr "Cerca per..."
#: searx/templates/simple/search.html:10 #: searx/templates/simple/search.html:10
#: searx/templates/simple/simple_search.html:6 #: searx/templates/simple/simple_search.html:6
msgid "clear" msgid "clear"
msgstr "" msgstr "escafar"
#: searx/templates/simple/search.html:11 #: searx/templates/simple/search.html:11
#: searx/templates/simple/simple_search.html:7 #: searx/templates/simple/simple_search.html:7
msgid "search" msgid "search"
msgstr "" msgstr "recercar"
#: searx/templates/simple/stats.html:21 #: searx/templates/simple/stats.html:21
msgid "There is currently no data available. " msgid "There is currently no data available. "
@ -644,12 +648,12 @@ msgstr "Marcas"
#: searx/templates/simple/stats.html:27 #: searx/templates/simple/stats.html:27
msgid "Result count" msgid "Result count"
msgstr "" msgstr "Resultats"
#: searx/templates/simple/preferences/engines.html:25 #: searx/templates/simple/preferences/engines.html:25
#: searx/templates/simple/stats.html:28 #: searx/templates/simple/stats.html:28
msgid "Response time" msgid "Response time"
msgstr "" msgstr "Temps de responsa"
#: searx/templates/simple/preferences/engines.html:29 #: searx/templates/simple/preferences/engines.html:29
#: searx/templates/simple/stats.html:29 #: searx/templates/simple/stats.html:29
@ -658,19 +662,19 @@ msgstr ""
#: searx/templates/simple/stats.html:59 #: searx/templates/simple/stats.html:59
msgid "Total" msgid "Total"
msgstr "" msgstr "Total"
#: searx/templates/simple/stats.html:60 #: searx/templates/simple/stats.html:60
msgid "HTTP" msgid "HTTP"
msgstr "" msgstr "HTTP"
#: searx/templates/simple/stats.html:61 #: searx/templates/simple/stats.html:61
msgid "Processing" msgid "Processing"
msgstr "" msgstr "Tractament"
#: searx/templates/simple/stats.html:99 #: searx/templates/simple/stats.html:99
msgid "Warnings" msgid "Warnings"
msgstr "" msgstr "Avertiments"
#: searx/templates/simple/stats.html:99 #: searx/templates/simple/stats.html:99
msgid "Errors and exceptions" msgid "Errors and exceptions"
@ -678,35 +682,35 @@ msgstr ""
#: searx/templates/simple/stats.html:105 #: searx/templates/simple/stats.html:105
msgid "Exception" msgid "Exception"
msgstr "" msgstr "Excepcion"
#: searx/templates/simple/stats.html:107 #: searx/templates/simple/stats.html:107
msgid "Message" msgid "Message"
msgstr "" msgstr "Messatge"
#: searx/templates/simple/stats.html:109 #: searx/templates/simple/stats.html:109
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr "Percentatge"
#: searx/templates/simple/stats.html:111 #: searx/templates/simple/stats.html:111
msgid "Parameter" msgid "Parameter"
msgstr "" msgstr "Paramètre"
#: searx/templates/simple/stats.html:119 #: searx/templates/simple/stats.html:119
msgid "Filename" msgid "Filename"
msgstr "" msgstr "Nom del fichièr"
#: searx/templates/simple/stats.html:120 #: searx/templates/simple/stats.html:120
msgid "Function" msgid "Function"
msgstr "" msgstr "Foncion"
#: searx/templates/simple/stats.html:121 #: searx/templates/simple/stats.html:121
msgid "Code" msgid "Code"
msgstr "" msgstr "Còdi"
#: searx/templates/simple/stats.html:128 #: searx/templates/simple/stats.html:128
msgid "Checker" msgid "Checker"
msgstr "" msgstr "Verificador"
#: searx/templates/simple/stats.html:131 #: searx/templates/simple/stats.html:131
msgid "Failed test" msgid "Failed test"
@ -714,7 +718,7 @@ msgstr ""
#: searx/templates/simple/stats.html:132 #: searx/templates/simple/stats.html:132
msgid "Comment(s)" msgid "Comment(s)"
msgstr "" msgstr "Comentari(s)"
#: searx/templates/simple/elements/apis.html:3 #: searx/templates/simple/elements/apis.html:3
msgid "Download results" msgid "Download results"
@ -822,7 +826,7 @@ msgstr ""
#: searx/templates/simple/messages/no_results.html:6 #: searx/templates/simple/messages/no_results.html:6
msgid "Refresh the page." msgid "Refresh the page."
msgstr "" msgstr "Actualizar la pagina."
#: searx/templates/simple/messages/no_results.html:7 #: searx/templates/simple/messages/no_results.html:7
msgid "Search for another query or select another category (above)." 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 #: searx/templates/simple/preferences/engines.html:23
msgid "Weight" msgid "Weight"
msgstr "" msgstr "Pes"
#: searx/templates/simple/preferences/engines.html:27 #: searx/templates/simple/preferences/engines.html:27
msgid "Max time" msgid "Max time"
@ -969,7 +973,7 @@ msgstr ""
#: searx/templates/simple/preferences/footer.html:6 #: searx/templates/simple/preferences/footer.html:6
msgid "Save" msgid "Save"
msgstr "" msgstr "Enregistrar"
#: searx/templates/simple/preferences/footer.html:9 #: searx/templates/simple/preferences/footer.html:9
msgid "Reset defaults" msgid "Reset defaults"
@ -977,11 +981,11 @@ msgstr "Reïnicializar per defaut"
#: searx/templates/simple/preferences/footer.html:13 #: searx/templates/simple/preferences/footer.html:13
msgid "Back" msgid "Back"
msgstr "" msgstr "Tornar"
#: searx/templates/simple/preferences/hotkeys.html:2 #: searx/templates/simple/preferences/hotkeys.html:2
msgid "Hotkeys" msgid "Hotkeys"
msgstr "" msgstr "Acorchi clavièr"
#: searx/templates/simple/preferences/hotkeys.html:13 #: searx/templates/simple/preferences/hotkeys.html:13
msgid "Vim-like" msgid "Vim-like"
@ -1019,7 +1023,7 @@ msgstr ""
#: searx/templates/simple/preferences/method.html:2 #: searx/templates/simple/preferences/method.html:2
msgid "HTTP Method" msgid "HTTP Method"
msgstr "" msgstr "Metòde HTTP"
#: searx/templates/simple/preferences/method.html:14 #: searx/templates/simple/preferences/method.html:14
msgid "Change how forms are submitted" msgid "Change how forms are submitted"
@ -1059,7 +1063,7 @@ msgstr ""
#: searx/templates/simple/preferences/theme.html:2 #: searx/templates/simple/preferences/theme.html:2
msgid "Theme" msgid "Theme"
msgstr "" msgstr "Tèma"
#: searx/templates/simple/preferences/theme.html:14 #: searx/templates/simple/preferences/theme.html:14
msgid "Change SearXNG layout" msgid "Change SearXNG layout"
@ -1067,7 +1071,7 @@ msgstr ""
#: searx/templates/simple/preferences/theme.html:19 #: searx/templates/simple/preferences/theme.html:19
msgid "Theme style" msgid "Theme style"
msgstr "" msgstr "Estil del tèma"
#: searx/templates/simple/preferences/theme.html:31 #: searx/templates/simple/preferences/theme.html:31
msgid "Choose auto to follow your browser settings" msgid "Choose auto to follow your browser settings"
@ -1108,11 +1112,11 @@ msgstr ""
#: searx/templates/simple/result_templates/images.html:19 #: searx/templates/simple/result_templates/images.html:19
msgid "Format" msgid "Format"
msgstr "" msgstr "Format"
#: searx/templates/simple/result_templates/images.html:21 #: searx/templates/simple/result_templates/images.html:21
msgid "Engine" msgid "Engine"
msgstr "" msgstr "Motor"
#: searx/templates/simple/result_templates/images.html:22 #: searx/templates/simple/result_templates/images.html:22
msgid "View source" msgid "View source"
@ -1120,7 +1124,7 @@ msgstr "Veire font"
#: searx/templates/simple/result_templates/map.html:12 #: searx/templates/simple/result_templates/map.html:12
msgid "address" msgid "address"
msgstr "" msgstr "adreça"
#: searx/templates/simple/result_templates/map.html:43 #: searx/templates/simple/result_templates/map.html:43
msgid "show map" msgid "show map"
@ -1132,47 +1136,47 @@ msgstr "escondre la mapa"
#: searx/templates/simple/result_templates/paper.html:5 #: searx/templates/simple/result_templates/paper.html:5
msgid "Published date" msgid "Published date"
msgstr "" msgstr "Data de publicacion"
#: searx/templates/simple/result_templates/paper.html:9 #: searx/templates/simple/result_templates/paper.html:9
msgid "Journal" msgid "Journal"
msgstr "" msgstr "Jornal"
#: searx/templates/simple/result_templates/paper.html:22 #: searx/templates/simple/result_templates/paper.html:22
msgid "Editor" msgid "Editor"
msgstr "" msgstr "Editor"
#: searx/templates/simple/result_templates/paper.html:23 #: searx/templates/simple/result_templates/paper.html:23
msgid "Publisher" msgid "Publisher"
msgstr "" msgstr "Editor"
#: searx/templates/simple/result_templates/paper.html:24 #: searx/templates/simple/result_templates/paper.html:24
msgid "Type" msgid "Type"
msgstr "" msgstr "Tipe"
#: searx/templates/simple/result_templates/paper.html:25 #: searx/templates/simple/result_templates/paper.html:25
msgid "Tags" msgid "Tags"
msgstr "" msgstr "Etiquetas"
#: searx/templates/simple/result_templates/paper.html:26 #: searx/templates/simple/result_templates/paper.html:26
msgid "DOI" msgid "DOI"
msgstr "" msgstr "DOI"
#: searx/templates/simple/result_templates/paper.html:27 #: searx/templates/simple/result_templates/paper.html:27
msgid "ISSN" msgid "ISSN"
msgstr "" msgstr "ISSN"
#: searx/templates/simple/result_templates/paper.html:28 #: searx/templates/simple/result_templates/paper.html:28
msgid "ISBN" msgid "ISBN"
msgstr "" msgstr "ISBN"
#: searx/templates/simple/result_templates/paper.html:33 #: searx/templates/simple/result_templates/paper.html:33
msgid "PDF" msgid "PDF"
msgstr "" msgstr "PDF"
#: searx/templates/simple/result_templates/paper.html:34 #: searx/templates/simple/result_templates/paper.html:34
msgid "HTML" msgid "HTML"
msgstr "" msgstr "HTML"
#: searx/templates/simple/result_templates/torrent.html:6 #: searx/templates/simple/result_templates/torrent.html:6
msgid "magnet link" msgid "magnet link"
@ -1630,4 +1634,3 @@ msgstr "escondre la vidèo"
#~ "avèm pas trobat cap de resultat. " #~ "avèm pas trobat cap de resultat. "
#~ "Mercés d'utilizar une autre mot clau " #~ "Mercés d'utilizar une autre mot clau "
#~ "o de cercar dins autras categorias." #~ "o de cercar dins autras categorias."

View file

@ -17,18 +17,19 @@
# return42 <markus.heiser@darmarit.de>, 2023. # return42 <markus.heiser@darmarit.de>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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" "Last-Translator: return42 <markus.heiser@darmarit.de>\n"
"Language-Team: Swedish <https://translate.codeberg.org/projects/searxng/"
"searxng/sv/>\n"
"Language: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.1\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -279,19 +280,19 @@ msgstr "Kanal"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "radio"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "bithastighet"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "röster"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
msgstr "" msgstr "klick"
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129 #: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
msgid "Language" msgid "Language"
@ -844,7 +845,7 @@ msgstr "Ursäkta!"
#: searx/templates/simple/messages/no_results.html:4 #: searx/templates/simple/messages/no_results.html:4
msgid "No results were found. You can try to:" 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 #: searx/templates/simple/messages/no_results.html:6
msgid "Refresh the page." msgid "Refresh the page."
@ -852,7 +853,7 @@ msgstr "Uppdatera sidan."
#: searx/templates/simple/messages/no_results.html:7 #: searx/templates/simple/messages/no_results.html:7
msgid "Search for another query or select another category (above)." 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 #: searx/templates/simple/messages/no_results.html:8
msgid "Change the search engine used in the preferences:" msgid "Change the search engine used in the preferences:"
@ -860,7 +861,7 @@ msgstr ""
#: searx/templates/simple/messages/no_results.html:9 #: searx/templates/simple/messages/no_results.html:9
msgid "Switch to another instance:" msgid "Switch to another instance:"
msgstr "" msgstr "Byt till en annan instans:"
#: searx/templates/simple/preferences/answerers.html:4 #: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17 #: searx/templates/simple/preferences/engines.html:17
@ -1017,13 +1018,15 @@ msgstr "Snabbtangenter"
#: searx/templates/simple/preferences/hotkeys.html:13 #: searx/templates/simple/preferences/hotkeys.html:13
msgid "Vim-like" msgid "Vim-like"
msgstr "" msgstr "Vim-liknande"
#: searx/templates/simple/preferences/hotkeys.html:18 #: searx/templates/simple/preferences/hotkeys.html:18
msgid "" msgid ""
"Navigate search results with hotkeys (JavaScript required). Press \"h\" " "Navigate search results with hotkeys (JavaScript required). Press \"h\" "
"key on main or result page to get help." "key on main or result page to get help."
msgstr "" 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 #: searx/templates/simple/preferences/image_proxy.html:2
msgid "Image proxy" msgid "Image proxy"
@ -1678,4 +1681,3 @@ msgstr "göm video"
#~ "vi hittade inte några resultat. Använd" #~ "vi hittade inte några resultat. Använd"
#~ " en annan förfråga eller sök i " #~ " en annan förfråga eller sök i "
#~ "flera kategorier." #~ "flera kategorier."

View file

@ -19,7 +19,7 @@ msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\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" "Last-Translator: return42 <markus.heiser@darmarit.de>\n"
"Language-Team: Turkish <https://translate.codeberg.org/projects/searxng/" "Language-Team: Turkish <https://translate.codeberg.org/projects/searxng/"
"searxng/tr/>\n" "searxng/tr/>\n"
@ -283,7 +283,7 @@ msgstr "radyo"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "bit hızı"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"

View file

@ -10,23 +10,25 @@
# BalkanMadman <zurabid2016@gmail.com>, 2023. # BalkanMadman <zurabid2016@gmail.com>, 2023.
# return42 <markus.heiser@darmarit.de>, 2023. # return42 <markus.heiser@darmarit.de>, 2023.
# maxch <maxletters@tutanota.com>, 2023. # maxch <maxletters@tutanota.com>, 2023.
# SomeTr <SomeTr@users.noreply.translate.codeberg.org>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\n" "POT-Creation-Date: 2023-10-05 09:01+0000\n"
"PO-Revision-Date: 2023-10-03 06:53+0000\n" "PO-Revision-Date: 2023-10-25 21:57+0000\n"
"Last-Translator: return42 <markus.heiser@darmarit.de>\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: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 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" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -107,7 +109,7 @@ msgstr "словники"
#. CATEGORY_GROUPS['LYRICS'] #. CATEGORY_GROUPS['LYRICS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "lyrics" msgid "lyrics"
msgstr "текст пісні" msgstr "тексти пісень"
#. CATEGORY_GROUPS['PACKAGES'] #. CATEGORY_GROUPS['PACKAGES']
#: searx/searxng.msg #: searx/searxng.msg
@ -117,7 +119,7 @@ msgstr "пакети"
#. CATEGORY_GROUPS['Q_A'] #. CATEGORY_GROUPS['Q_A']
#: searx/searxng.msg #: searx/searxng.msg
msgid "q&a" msgid "q&a"
msgstr "q&a" msgstr "запитання і відповіді"
#. CATEGORY_GROUPS['REPOS'] #. CATEGORY_GROUPS['REPOS']
#: searx/searxng.msg #: searx/searxng.msg
@ -137,7 +139,7 @@ msgstr "веб"
#. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS'] #. CATEGORY_GROUPS['SCIENTIFIC PUBLICATIONS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "scientific publications" msgid "scientific publications"
msgstr "Наукова публікація" msgstr "наукова публікація"
#. STYLE_NAMES['AUTO'] #. STYLE_NAMES['AUTO']
#: searx/searxng.msg #: searx/searxng.msg
@ -189,7 +191,7 @@ msgstr "помилка парсингу"
#: searx/webutils.py:36 #: searx/webutils.py:36
msgid "HTTP protocol error" msgid "HTTP protocol error"
msgstr "помилка HTTP протоколу" msgstr "помилка протоколу HTTP"
#: searx/webutils.py:37 #: searx/webutils.py:37
msgid "network error" msgid "network error"
@ -197,7 +199,7 @@ msgstr "помилка мережі"
#: searx/webutils.py:38 #: searx/webutils.py:38
msgid "SSL error: certificate validation has failed" msgid "SSL error: certificate validation has failed"
msgstr "Помилка SSL: не вдалося перевірити сертифікат" msgstr "помилка SSL: не вдалося перевірити сертифікат"
#: searx/webutils.py:40 #: searx/webutils.py:40
msgid "unexpected crash" msgid "unexpected crash"
@ -209,7 +211,7 @@ msgstr "помилка HTTP"
#: searx/webutils.py:48 #: searx/webutils.py:48
msgid "HTTP connection error" msgid "HTTP connection error"
msgstr "помилка HTTP з'єднання" msgstr "помилка з'єднання HTTP"
#: searx/webutils.py:54 #: searx/webutils.py:54
msgid "proxy error" msgid "proxy error"
@ -229,7 +231,7 @@ msgstr "доступ заборонено"
#: searx/webutils.py:58 #: searx/webutils.py:58
msgid "server API error" msgid "server API error"
msgstr "Помилка API сервера" msgstr "помилка API сервера"
#: searx/webutils.py:77 #: searx/webutils.py:77
msgid "Suspended" msgid "Suspended"
@ -269,7 +271,7 @@ msgstr "{title} (ЗАСТАРІЛО)"
#: searx/engines/pdbe.py:103 #: searx/engines/pdbe.py:103
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
msgstr "Цей запис був змінений" msgstr "Цей запис було замінено на"
#: searx/engines/qwant.py:282 #: searx/engines/qwant.py:282
msgid "Channel" msgid "Channel"
@ -277,19 +279,19 @@ msgstr "Канал"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "радіо"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "бітрейт"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "голоси"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
msgstr "" msgstr "кліки"
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129 #: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
msgid "Language" msgid "Language"
@ -309,9 +311,9 @@ msgid ""
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or" "format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP." " WebP."
msgstr "" msgstr ""
"Не вдалось зчитати зображення за вказаним URL. Можливо, тому що формат " "Не вдалося зчитати зображення за вказаним URL. Можливо, тому що формат цього "
"даного зображення не підтримується. TinEye підтримує зображення у " "зображення не підтримується. TinEye підтримує зображення у форматах JPEG, "
"форматах JPEG, PNG, GIF, BMP, TIFF та WebP." "PNG, GIF, BMP, TIFF та WebP."
#: searx/engines/tineye.py:46 #: searx/engines/tineye.py:46
msgid "" msgid ""
@ -323,7 +325,7 @@ msgstr ""
#: searx/engines/tineye.py:52 #: searx/engines/tineye.py:52
msgid "The image could not be downloaded." msgid "The image could not be downloaded."
msgstr "Зображення не можливо завантажити." msgstr "Зображення неможливо завантажити."
#: searx/engines/wttr.py:101 #: searx/engines/wttr.py:101
msgid "Morning" msgid "Morning"
@ -406,14 +408,14 @@ msgid ""
"Could not download the list of Tor exit-nodes from: " "Could not download the list of Tor exit-nodes from: "
"https://check.torproject.org/exit-addresses" "https://check.torproject.org/exit-addresses"
msgstr "" msgstr ""
"Не вдалось завантажити список вихідних вузлів Tor з: " "Не вдалося завантажити список вихідних вузлів Tor з: https://check.torproject"
"https://check.torproject.org/exit-addresses" ".org/exit-addresses"
#: searx/plugins/tor_check.py:78 #: searx/plugins/tor_check.py:78
msgid "" msgid ""
"You are using Tor and it looks like you have this external IP address: " "You are using Tor and it looks like you have this external IP address: "
"{ip_address}" "{ip_address}"
msgstr "Ви використовуєте Tor і, здається, у вас наступна IP адреса: {ip_address}" msgstr "Ви використовуєте Tor і, здається, Ваша IP-адреса така: {ip_address}"
#: searx/plugins/tor_check.py:86 #: searx/plugins/tor_check.py:86
msgid "You are not using Tor and you have this external IP address: {ip_address}" 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 #: searx/templates/simple/base.html:72
msgid "Public instances" msgid "Public instances"
msgstr "Публічні інстанції" msgstr "Публічні інстанси"
#: searx/templates/simple/base.html:75 #: searx/templates/simple/base.html:75
msgid "Privacy policy" msgid "Privacy policy"
@ -483,7 +485,7 @@ msgstr "Політика приватності"
#: searx/templates/simple/base.html:78 #: searx/templates/simple/base.html:78
msgid "Contact instance maintainer" msgid "Contact instance maintainer"
msgstr "Зв'язатися з власником інстанції" msgstr "Зв'язатися з власником інстансу"
#: searx/templates/simple/categories.html:26 #: searx/templates/simple/categories.html:26
msgid "Click on the magnifier to perform search" msgid "Click on the magnifier to perform search"
@ -501,7 +503,7 @@ msgstr "Автор"
#: searx/templates/simple/macros.html:45 #: searx/templates/simple/macros.html:45
msgid "cached" msgid "cached"
msgstr "архівовано" msgstr "кеш"
#: searx/templates/simple/macros.html:45 #: searx/templates/simple/macros.html:45
msgid "proxied" msgid "proxied"
@ -523,7 +525,7 @@ msgstr ""
#: searx/templates/simple/new_issue.html:71 #: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report" msgid "If this is a public instance, please specify the URL in the bug report"
msgstr "Якщо це публічна інстанція, укажіть URL-адресу у звіті про помилку" msgstr "Якщо це публічний інстанс, укажіть URL-адресу у звіті про помилку"
#: searx/templates/simple/new_issue.html:72 #: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information" msgid "Submit a new issue on Github including the above information"
@ -586,7 +588,7 @@ msgstr "Інтерфейс користувача"
#: searx/templates/simple/preferences.html:208 #: searx/templates/simple/preferences.html:208
msgid "Privacy" msgid "Privacy"
msgstr "Конфеденційність" msgstr "Конфіденційність"
#: searx/templates/simple/preferences.html:221 #: searx/templates/simple/preferences.html:221
msgid "Engines" msgid "Engines"
@ -752,7 +754,7 @@ msgstr "Помилка!"
#: searx/templates/simple/elements/engines_msg.html:13 #: searx/templates/simple/elements/engines_msg.html:13
msgid "Engines cannot retrieve results" msgid "Engines cannot retrieve results"
msgstr "Пошукові системи неможуть отримати результати" msgstr "Пошукові системи не можуть отримати результати"
#: searx/templates/simple/elements/search_url.html:3 #: searx/templates/simple/elements/search_url.html:3
msgid "Search URL" msgid "Search URL"
@ -784,12 +786,12 @@ msgstr "Автовизначення"
#: searx/templates/simple/preferences/engines.html:21 #: searx/templates/simple/preferences/engines.html:21
#: searx/templates/simple/preferences/safesearch.html:2 #: searx/templates/simple/preferences/safesearch.html:2
msgid "SafeSearch" msgid "SafeSearch"
msgstr "БезпечнийПошук" msgstr "Безпечний пошук"
#: searx/templates/simple/filters/safesearch.html:2 #: searx/templates/simple/filters/safesearch.html:2
#: searx/templates/simple/preferences/safesearch.html:7 #: searx/templates/simple/preferences/safesearch.html:7
msgid "Strict" msgid "Strict"
msgstr "Жорский" msgstr "Жорсткий"
#: searx/templates/simple/filters/safesearch.html:3 #: searx/templates/simple/filters/safesearch.html:3
#: searx/templates/simple/preferences/safesearch.html:11 #: searx/templates/simple/preferences/safesearch.html:11
@ -844,19 +846,19 @@ msgstr "Результатів не знайдено. Ви можете спро
#: searx/templates/simple/messages/no_results.html:6 #: searx/templates/simple/messages/no_results.html:6
msgid "Refresh the page." msgid "Refresh the page."
msgstr "" msgstr "Оновити сторінку."
#: searx/templates/simple/messages/no_results.html:7 #: searx/templates/simple/messages/no_results.html:7
msgid "Search for another query or select another category (above)." msgid "Search for another query or select another category (above)."
msgstr "" msgstr "Шукати за іншим запитом або вибрати іншу категорію (вгорі)."
#: searx/templates/simple/messages/no_results.html:8 #: searx/templates/simple/messages/no_results.html:8
msgid "Change the search engine used in the preferences:" msgid "Change the search engine used in the preferences:"
msgstr "" msgstr "Змінити пошукову систему, вказану в налаштуваннях:"
#: searx/templates/simple/messages/no_results.html:9 #: searx/templates/simple/messages/no_results.html:9
msgid "Switch to another instance:" msgid "Switch to another instance:"
msgstr "" msgstr "Перемкнути інстанс SearXNG:"
#: searx/templates/simple/preferences/answerers.html:4 #: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17 #: searx/templates/simple/preferences/engines.html:17
@ -893,7 +895,7 @@ msgstr "Автозаповнення"
#: searx/templates/simple/preferences/autocomplete.html:15 #: searx/templates/simple/preferences/autocomplete.html:15
msgid "Find stuff as you type" msgid "Find stuff as you type"
msgstr "Шукати підчас набору" msgstr "Шукати під час набору"
#: searx/templates/simple/preferences/center_alignment.html:2 #: searx/templates/simple/preferences/center_alignment.html:2
msgid "Center Alignment" msgid "Center Alignment"
@ -1009,17 +1011,20 @@ msgstr "Назад"
#: searx/templates/simple/preferences/hotkeys.html:2 #: searx/templates/simple/preferences/hotkeys.html:2
msgid "Hotkeys" msgid "Hotkeys"
msgstr "" msgstr "Гарячі клавіші"
#: searx/templates/simple/preferences/hotkeys.html:13 #: searx/templates/simple/preferences/hotkeys.html:13
msgid "Vim-like" msgid "Vim-like"
msgstr "" msgstr "Вигляд як Vim"
#: searx/templates/simple/preferences/hotkeys.html:18 #: searx/templates/simple/preferences/hotkeys.html:18
msgid "" msgid ""
"Navigate search results with hotkeys (JavaScript required). Press \"h\" " "Navigate search results with hotkeys (JavaScript required). Press \"h\" "
"key on main or result page to get help." "key on main or result page to get help."
msgstr "" msgstr ""
"Переміщуйтеся в результатах пошуку за допомогою гарячих клавіш (потрібен "
"JavaScript). Натисніть клавішу «h» на головній сторінці або сторінці "
"результатів, щоб прочитати довідку."
#: searx/templates/simple/preferences/image_proxy.html:2 #: searx/templates/simple/preferences/image_proxy.html:2
msgid "Image proxy" msgid "Image proxy"
@ -1073,7 +1078,7 @@ msgstr "Результати в нових вкладках"
#: searx/templates/simple/preferences/results_on_new_tab.html:14 #: searx/templates/simple/preferences/results_on_new_tab.html:14
msgid "Open result links on new browser tabs" msgid "Open result links on new browser tabs"
msgstr "Відкривати посилання результатів в нових вкладках" msgstr "Відкривати посилання результатів у нових вкладках"
#: searx/templates/simple/preferences/safesearch.html:20 #: searx/templates/simple/preferences/safesearch.html:20
msgid "Filter content" msgid "Filter content"
@ -1081,13 +1086,15 @@ msgstr "Фільтр контенту"
#: searx/templates/simple/preferences/search_on_category_select.html:2 #: searx/templates/simple/preferences/search_on_category_select.html:2
msgid "Search on category select" msgid "Search on category select"
msgstr "Пошук по обраній категорії" msgstr "Пошук при виборі категорії"
#: searx/templates/simple/preferences/search_on_category_select.html:14 #: searx/templates/simple/preferences/search_on_category_select.html:14
msgid "" msgid ""
"Perform search immediately if a category selected. Disable to select " "Perform search immediately if a category selected. Disable to select "
"multiple categories" "multiple categories"
msgstr "" msgstr ""
"Шукати негайно при виборі категорії. Вимкніть, якщо хочете вибрати кілька "
"категорій"
#: searx/templates/simple/preferences/theme.html:2 #: searx/templates/simple/preferences/theme.html:2
msgid "Theme" msgid "Theme"
@ -1103,7 +1110,7 @@ msgstr "Стиль теми"
#: searx/templates/simple/preferences/theme.html:31 #: searx/templates/simple/preferences/theme.html:31
msgid "Choose auto to follow your browser settings" msgid "Choose auto to follow your browser settings"
msgstr "Виберіть \"автоматично\" для використання налаштувань вашого браузера" msgstr "Виберіть «автоматично» для використання налаштувань вашого браузера"
#: searx/templates/simple/preferences/tokens.html:2 #: searx/templates/simple/preferences/tokens.html:2
msgid "Engine tokens" msgid "Engine tokens"
@ -1123,7 +1130,7 @@ msgstr "Змінити мову сайту"
#: searx/templates/simple/result_templates/code.html:13 #: searx/templates/simple/result_templates/code.html:13
msgid "repo" msgid "repo"
msgstr "репозиторії" msgstr "репозиторій"
#: searx/templates/simple/result_templates/default.html:6 #: searx/templates/simple/result_templates/default.html:6
msgid "show media" msgid "show media"
@ -1224,7 +1231,7 @@ msgstr "Лічер"
#: searx/templates/simple/result_templates/torrent.html:11 #: searx/templates/simple/result_templates/torrent.html:11
msgid "Filesize" msgid "Filesize"
msgstr "Розмір файла" msgstr "Розмір файлу"
#: searx/templates/simple/result_templates/torrent.html:12 #: searx/templates/simple/result_templates/torrent.html:12
msgid "Bytes" msgid "Bytes"
@ -1248,7 +1255,7 @@ msgstr "ТіБ"
#: searx/templates/simple/result_templates/torrent.html:20 #: searx/templates/simple/result_templates/torrent.html:20
msgid "Number of Files" msgid "Number of Files"
msgstr "Кількість Файлів" msgstr "Кількість файлів"
#: searx/templates/simple/result_templates/videos.html:6 #: searx/templates/simple/result_templates/videos.html:6
msgid "show video" msgid "show video"
@ -1654,4 +1661,3 @@ msgstr "приховати відео"
#~ "ми не знайшли жодних результатів. Будь" #~ "ми не знайшли жодних результатів. Будь"
#~ " ласка, використайте інший запит або " #~ " ласка, використайте інший запит або "
#~ "виконайте пошук в декількох категоріях." #~ "виконайте пошук в декількох категоріях."

View file

@ -22,20 +22,22 @@
# BBTranslate <357835338@qq.com>, 2023. # BBTranslate <357835338@qq.com>, 2023.
# JonesBBQ <colson.xu@gmail.com>, 2023. # JonesBBQ <colson.xu@gmail.com>, 2023.
# BernieHuang2008 <berniehuang2008@163.com>, 2023. # BernieHuang2008 <berniehuang2008@163.com>, 2023.
# clsty <celestial.y@outlook.com>, 2023.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-10-05 09:01+0000\n" "POT-Creation-Date: 2023-10-05 09:01+0000\n"
"PO-Revision-Date: 2023-09-29 07:07+0000\n" "PO-Revision-Date: 2023-10-24 11:13+0000\n"
"Last-Translator: BernieHuang2008 <berniehuang2008@163.com>\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: 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" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.1\n"
"Generated-By: Babel 2.12.1\n" "Generated-By: Babel 2.12.1\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -56,7 +58,7 @@ msgstr "文件"
#. CATEGORY_NAMES['GENERAL'] #. CATEGORY_NAMES['GENERAL']
#: searx/searxng.msg #: searx/searxng.msg
msgid "general" msgid "general"
msgstr "常规" msgstr "综合"
#. CATEGORY_NAMES['MUSIC'] #. CATEGORY_NAMES['MUSIC']
#: searx/searxng.msg #: searx/searxng.msg
@ -126,7 +128,7 @@ msgstr "程序包"
#. CATEGORY_GROUPS['Q_A'] #. CATEGORY_GROUPS['Q_A']
#: searx/searxng.msg #: searx/searxng.msg
msgid "q&a" msgid "q&a"
msgstr "问&答" msgstr "问答"
#. CATEGORY_GROUPS['REPOS'] #. CATEGORY_GROUPS['REPOS']
#: searx/searxng.msg #: searx/searxng.msg
@ -206,7 +208,7 @@ msgstr "网络错误"
#: searx/webutils.py:38 #: searx/webutils.py:38
msgid "SSL error: certificate validation has failed" msgid "SSL error: certificate validation has failed"
msgstr "SSL错误证书校验失败" msgstr "SSL 错误:证书校验失败"
#: searx/webutils.py:40 #: searx/webutils.py:40
msgid "unexpected crash" msgid "unexpected crash"
@ -274,7 +276,7 @@ msgstr "获取路线"
#: searx/engines/pdbe.py:96 #: searx/engines/pdbe.py:96
msgid "{title} (OBSOLETE)" msgid "{title} (OBSOLETE)"
msgstr "{title} (已过时)" msgstr "{title} (已过时)"
#: searx/engines/pdbe.py:103 #: searx/engines/pdbe.py:103
msgid "This entry has been superseded by" msgid "This entry has been superseded by"
@ -286,19 +288,19 @@ msgstr "频道"
#: searx/engines/radio_browser.py:104 #: searx/engines/radio_browser.py:104
msgid "radio" msgid "radio"
msgstr "" msgstr "电台"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "比特率"
#: searx/engines/radio_browser.py:107 #: searx/engines/radio_browser.py:107
msgid "votes" msgid "votes"
msgstr "" msgstr "投票数"
#: searx/engines/radio_browser.py:108 #: searx/engines/radio_browser.py:108
msgid "clicks" msgid "clicks"
msgstr "" msgstr "点击数"
#: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129 #: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129
msgid "Language" msgid "Language"
@ -308,20 +310,24 @@ msgstr "语言"
msgid "" msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to " "{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}" "{lastCitationVelocityYear}"
msgstr "{numCitations}次引用,从{firstCitationVelocityYear}年到{lastCitationVelocityYear}年" msgstr ""
"{numCitations} 次引用,从 {firstCitationVelocityYear} 年到 "
"{lastCitationVelocityYear} 年"
#: searx/engines/tineye.py:40 #: searx/engines/tineye.py:40
msgid "" msgid ""
"Could not read that image url. This may be due to an unsupported file " "Could not read that image url. This may be due to an unsupported file "
"format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or" "format. TinEye only supports images that are JPEG, PNG, GIF, BMP, TIFF or"
" WebP." " WebP."
msgstr "无法读取该图片网址。这可能是由于文件格式不受支持。 TinEye 仅支持 JPEG、PNG、GIF、BMP、TIFF 或 WebP 格式的图像。" msgstr "无法读取该图片网址。这可能是由于文件格式不受支持。TinEye 仅支持 "
"JPEG、PNG、GIF、BMP、TIFF 或 WebP 格式的图像。"
#: searx/engines/tineye.py:46 #: searx/engines/tineye.py:46
msgid "" msgid ""
"The image is too simple to find matches. TinEye requires a basic level of" "The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches." " visual detail to successfully identify matches."
msgstr "图像过于简单,无法找到匹配项。 TinEye 需要基本级别的视觉细节才能成功识别匹配项。" msgstr "图像过于简单无法找到匹配项。TinEye "
"需要基本级别的视觉细节才能成功识别匹配项。"
#: searx/engines/tineye.py:52 #: searx/engines/tineye.py:52
msgid "The image could not be downloaded." msgid "The image could not be downloaded."
@ -329,7 +335,7 @@ msgstr "无法下载该图像。"
#: searx/engines/wttr.py:101 #: searx/engines/wttr.py:101
msgid "Morning" msgid "Morning"
msgstr "上" msgstr "上"
#: searx/engines/wttr.py:101 #: searx/engines/wttr.py:101
msgid "Noon" msgid "Noon"
@ -353,7 +359,7 @@ msgstr "文件质量"
#: searx/plugins/hash_plugin.py:24 #: searx/plugins/hash_plugin.py:24
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
msgstr "将字符串转换为不同的散列摘要值。" msgstr "将字符串转换为不同的散列hash摘要值。"
#: searx/plugins/hash_plugin.py:52 #: searx/plugins/hash_plugin.py:52
msgid "hash digest" msgid "hash digest"
@ -395,27 +401,30 @@ msgstr "Tor 网络检测插件"
msgid "" msgid ""
"This plugin checks if the address of the request is a Tor exit-node, and " "This plugin checks if the address of the request is a Tor exit-node, and "
"informs the user if it is; like check.torproject.org, but from SearXNG." "informs the user if it is; like check.torproject.org, but from SearXNG."
msgstr "此插件检查地址是否为 Tor 出口节点并给出结果,是由 SearXNG 提供的类似 check.torproject.org 的服务。" msgstr ""
"此插件检查请求地址是否为 Tor 出口节点,若是则告知用户。这是由 SearXNG "
"提供的类似 check.torproject.org 的服务。"
#: searx/plugins/tor_check.py:62 #: searx/plugins/tor_check.py:62
msgid "" msgid ""
"Could not download the list of Tor exit-nodes from: " "Could not download the list of Tor exit-nodes from: "
"https://check.torproject.org/exit-addresses" "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 #: searx/plugins/tor_check.py:78
msgid "" msgid ""
"You are using Tor and it looks like you have this external IP address: " "You are using Tor and it looks like you have this external IP address: "
"{ip_address}" "{ip_address}"
msgstr "您似乎在使用 Tor您的外部 IP 地址为: {ip_address}" msgstr "您似乎在使用 Tor您的外部 IP 地址为 {ip_address}"
#: searx/plugins/tor_check.py:86 #: searx/plugins/tor_check.py:86
msgid "You are not using Tor and you have this external IP address: {ip_address}" 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 #: searx/plugins/tracker_url_remover.py:29
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "移除跟踪链接" msgstr "跟踪链接移除器"
#: searx/plugins/tracker_url_remover.py:30 #: searx/plugins/tracker_url_remover.py:30
msgid "Remove trackers arguments from the returned URL" msgid "Remove trackers arguments from the returned URL"
@ -515,7 +524,7 @@ msgstr "我确定提交的 Bug 没有与现存 Issue 重复"
#: searx/templates/simple/new_issue.html:71 #: searx/templates/simple/new_issue.html:71
msgid "If this is a public instance, please specify the URL in the bug report" msgid "If this is a public instance, please specify the URL in the bug report"
msgstr "如果这是一个公共问题,请在 Bug 报告页面提交 URL" msgstr "如果这是一个公共实例,请在 Bug 报告中指明其网址"
#: searx/templates/simple/new_issue.html:72 #: searx/templates/simple/new_issue.html:72
msgid "Submit a new issue on Github including the above information" msgid "Submit a new issue on Github including the above information"
@ -834,11 +843,11 @@ msgstr "未找到结果,你可以尝试:"
#: searx/templates/simple/messages/no_results.html:6 #: searx/templates/simple/messages/no_results.html:6
msgid "Refresh the page." msgid "Refresh the page."
msgstr "刷新页面" msgstr "刷新页面"
#: searx/templates/simple/messages/no_results.html:7 #: searx/templates/simple/messages/no_results.html:7
msgid "Search for another query or select another category (above)." msgid "Search for another query or select another category (above)."
msgstr "" msgstr "(在上方)对其他查询进行搜索,或选择其他类别。"
#: searx/templates/simple/messages/no_results.html:8 #: searx/templates/simple/messages/no_results.html:8
msgid "Change the search engine used in the preferences:" msgid "Change the search engine used in the preferences:"
@ -846,7 +855,7 @@ msgstr "更改“首选项”中使用的搜索引擎:"
#: searx/templates/simple/messages/no_results.html:9 #: searx/templates/simple/messages/no_results.html:9
msgid "Switch to another instance:" msgid "Switch to another instance:"
msgstr "切换另一个SearXNG的服务器" msgstr "切换至另一个 SearXNG 实例"
#: searx/templates/simple/preferences/answerers.html:4 #: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:17 #: searx/templates/simple/preferences/engines.html:17
@ -993,13 +1002,13 @@ msgstr "热键"
#: searx/templates/simple/preferences/hotkeys.html:13 #: searx/templates/simple/preferences/hotkeys.html:13
msgid "Vim-like" msgid "Vim-like"
msgstr "Vim布局" msgstr "Vim 布局"
#: searx/templates/simple/preferences/hotkeys.html:18 #: searx/templates/simple/preferences/hotkeys.html:18
msgid "" msgid ""
"Navigate search results with hotkeys (JavaScript required). Press \"h\" " "Navigate search results with hotkeys (JavaScript required). Press \"h\" "
"key on main or result page to get help." "key on main or result page to get help."
msgstr "使用热键进行导航需要JavaScript。在主页或搜索结果页按“h”键获取帮助。" msgstr "使用热键进行导航(需要 JavaScript。在主页或搜索结果页按“h”键获取帮助。"
#: searx/templates/simple/preferences/image_proxy.html:2 #: searx/templates/simple/preferences/image_proxy.html:2
msgid "Image proxy" msgid "Image proxy"
@ -1063,7 +1072,7 @@ msgstr "搜索特定类别"
msgid "" msgid ""
"Perform search immediately if a category selected. Disable to select " "Perform search immediately if a category selected. Disable to select "
"multiple categories" "multiple categories"
msgstr "" msgstr "当一个类别被指定时,立即执行搜索。禁用以选择多个类别"
#: searx/templates/simple/preferences/theme.html:2 #: searx/templates/simple/preferences/theme.html:2
msgid "Theme" msgid "Theme"
@ -1208,19 +1217,19 @@ msgstr "字节"
#: searx/templates/simple/result_templates/torrent.html:13 #: searx/templates/simple/result_templates/torrent.html:13
msgid "kiB" msgid "kiB"
msgstr "kB" msgstr "kiB"
#: searx/templates/simple/result_templates/torrent.html:14 #: searx/templates/simple/result_templates/torrent.html:14
msgid "MiB" msgid "MiB"
msgstr "MB" msgstr "MiB"
#: searx/templates/simple/result_templates/torrent.html:15 #: searx/templates/simple/result_templates/torrent.html:15
msgid "GiB" msgid "GiB"
msgstr "GB" msgstr "GiB"
#: searx/templates/simple/result_templates/torrent.html:16 #: searx/templates/simple/result_templates/torrent.html:16
msgid "TiB" msgid "TiB"
msgstr "TB" msgstr "TiB"
#: searx/templates/simple/result_templates/torrent.html:20 #: searx/templates/simple/result_templates/torrent.html:20
msgid "Number of Files" msgid "Number of Files"
@ -1616,4 +1625,3 @@ msgstr "隐藏视频"
#~ "use another query or search in " #~ "use another query or search in "
#~ "more categories." #~ "more categories."
#~ msgstr "我们没有找到任何结果。请使用其他关键词,或在更多类别中搜索。" #~ msgstr "我们没有找到任何结果。请使用其他关键词,或在更多类别中搜索。"

View file

@ -15,6 +15,7 @@ from numbers import Number
from os.path import splitext, join from os.path import splitext, join
from random import choice from random import choice
from html.parser import HTMLParser from html.parser import HTMLParser
from html import escape
from urllib.parse import urljoin, urlparse from urllib.parse import urljoin, urlparse
from markdown_it import MarkdownIt from markdown_it import MarkdownIt
@ -88,7 +89,7 @@ class _HTMLTextExtractorException(Exception):
"""Internal exception raised when the HTML is invalid""" """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""" """Internal class to extract text from HTML"""
def __init__(self): def __init__(self):
@ -137,6 +138,11 @@ class _HTMLTextExtractor(HTMLParser): # pylint: disable=W0223 # (see https://b
def get_text(self): def get_text(self):
return ''.join(self.result).strip() 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: def html_to_text(html_str: str) -> str:
"""Extract text from a HTML string """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>') >>> html_to_text('<style>.span { color: red; }</style><span>Example</span>')
'Example' 'Example'
>>> html_to_text(r'regexp: (?<![a-zA-Z]')
'regexp: (?<![a-zA-Z]'
""" """
html_str = html_str.replace('\n', ' ').replace('\r', ' ') html_str = html_str.replace('\n', ' ').replace('\r', ' ')
html_str = ' '.join(html_str.split()) html_str = ' '.join(html_str.split())
s = _HTMLTextExtractor() s = _HTMLTextExtractor()
try: try:
s.feed(html_str) s.feed(html_str)
except AssertionError:
s = _HTMLTextExtractor()
s.feed(escape(html_str, quote=True))
except _HTMLTextExtractorException: except _HTMLTextExtractorException:
logger.debug("HTMLTextExtractor: invalid HTML\n%s", html_str) logger.debug("HTMLTextExtractor: invalid HTML\n%s", html_str)
return s.get_text() return s.get_text()

View file

@ -57,7 +57,9 @@ from searx import (
) )
from searx import infopage 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.data import ENGINE_DESCRIPTIONS
from searx.results import Timing from searx.results import Timing
from searx.settings_defaults import OUTPUT_FORMATS 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.version import VERSION_STRING, GIT_URL, GIT_BRANCH
from searx.query import RawTextQuery from searx.query import RawTextQuery
from searx.plugins import Plugin, plugins, initialize as plugin_initialize 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.plugins.oa_doi_rewrite import get_doi_resolver
from searx.preferences import ( from searx.preferences import (
Preferences, Preferences,
@ -1288,7 +1289,7 @@ def config():
'DOCS_URL': get_setting('brand.docs_url'), 'DOCS_URL': get_setting('brand.docs_url'),
}, },
'limiter': { 'limiter': {
'enabled': settings['server']['limiter'], 'enabled': limiter.is_installed(),
'botdetection.ip_limit.link_token': _limiter_cfg.get('botdetection.ip_limit.link_token'), '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'), '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() redis_initialize()
plugin_initialize(app) plugin_initialize(app)
search_initialize(enable_checker=True, check_network=True, enable_metrics=settings['general']['enable_metrics']) search_initialize(enable_checker=True, check_network=True, enable_metrics=settings['general']['enable_metrics'])
limiter.initialize(app, settings)
def run(): def run():

View file

@ -1,6 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from searx import plugins from searx import (
plugins,
limiter,
botdetection,
)
from mock import Mock from mock import Mock
from tests import SearxTestCase from tests import SearxTestCase
@ -46,6 +51,8 @@ class SelfIPTest(SearxTestCase):
plugin = plugins.load_and_initialize_plugin('searx.plugins.self_info', False, (None, {})) plugin = plugins.load_and_initialize_plugin('searx.plugins.self_info', False, (None, {}))
store = plugins.PluginStore() store = plugins.PluginStore()
store.register(plugin) store.register(plugin)
cfg = limiter.get_cfg()
botdetection.init(cfg, None)
self.assertTrue(len(store.plugins) == 1) 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.assertIsInstance(utils.html_to_text(html_str), str)
self.assertIsNotNone(utils.html_to_text(html_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(html_str), "Test text")
self.assertEqual(utils.html_to_text(r"regexp: (?<![a-zA-Z]"), "regexp: (?<![a-zA-Z]")
def test_extract_text(self): def test_extract_text(self):
html_str = """ html_str = """