Compare commits

...

4 Commits

Author SHA1 Message Date
Markus Heiser 631bc39649
Merge 1c9b28968d into 4b57bc3db1 2024-11-16 04:27:18 +09:00
dependabot[bot] 4b57bc3db1 [upd] pypi: Bump flask from 3.0.3 to 3.1.0
Bumps [flask](https://github.com/pallets/flask) from 3.0.3 to 3.1.0.
- [Release notes](https://github.com/pallets/flask/releases)
- [Changelog](https://github.com/pallets/flask/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/flask/compare/3.0.3...3.1.0)

---
updated-dependencies:
- dependency-name: flask
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-15 13:23:24 +01:00
searxng-bot a345cbbe51 [l10n] update translations from Weblate
0216898a3 - 2024-11-14 - KhietVo <KhietVo@users.noreply.translate.codeberg.org>
3293db4c8 - 2024-11-14 - return42 <return42@users.noreply.translate.codeberg.org>
574e0d683 - 2024-11-13 - lrnz2 <lrnz2@users.noreply.translate.codeberg.org>
a32d9d158 - 2024-11-08 - Aadniz <Aadniz@users.noreply.translate.codeberg.org>
2024-11-15 13:20:52 +01:00
Markus Heiser 1c9b28968d [mod] botdetection: HTTP Fetch Metadata Request Headers
HTTP Fetch Metadata Request Headers [1][2] are used to detect bot requests. Bots
with invalid *Fetch Metadata* will be redirected to the intro (`index`)  page.

[1] https://www.w3.org/TR/fetch-metadata/
[2] https://developer.mozilla.org/en-US/docs/Glossary/Fetch_metadata_request_header

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-10-27 13:42:57 +01:00
13 changed files with 141 additions and 66 deletions

View File

@ -53,6 +53,9 @@ Probe HTTP headers
.. automodule:: searx.botdetection.http_user_agent .. automodule:: searx.botdetection.http_user_agent
:members: :members:
.. automodule:: searx.botdetection.sec_fetch
:members:
.. _botdetection config: .. _botdetection config:
Config Config

View File

@ -1,7 +1,7 @@
certifi==2024.8.30 certifi==2024.8.30
babel==2.16.0 babel==2.16.0
flask-babel==4.0.0 flask-babel==4.0.0
flask==3.0.3 flask==3.1.0
jinja2==3.1.4 jinja2==3.1.4
lxml==5.3.0 lxml==5.3.0
pygments==2.18.0 pygments==2.18.0

View File

@ -31,6 +31,9 @@ def dump_request(request: flask.Request):
+ " || Content-Length: %s" % request.headers.get('Content-Length') + " || Content-Length: %s" % request.headers.get('Content-Length')
+ " || Connection: %s" % request.headers.get('Connection') + " || Connection: %s" % request.headers.get('Connection')
+ " || User-Agent: %s" % request.headers.get('User-Agent') + " || User-Agent: %s" % request.headers.get('User-Agent')
+ " || Sec-Fetch-Site: %s" % request.headers.get('Sec-Fetch-Site')
+ " || Sec-Fetch-Mode: %s" % request.headers.get('Sec-Fetch-Mode')
+ " || Sec-Fetch-Dest: %s" % request.headers.get('Sec-Fetch-Dest')
) )

View File

@ -0,0 +1,59 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Method ``http_sec_fetch``
-------------------------
The ``http_sec_fetch`` method protect resources from web attacks with `Fetch
Metadata`_. A request is filtered out in case of:
- http header Sec-Fetch-Mode_ is invalid
- http header Sec-Fetch-Dest_ is invalid
.. _Fetch Metadata:
https://developer.mozilla.org/en-US/docs/Glossary/Fetch_metadata_request_header
.. Sec-Fetch-Dest:
https://developer.mozilla.org/en-US/docs/Web/API/Request/destination
.. Sec-Fetch-Mode:
https://developer.mozilla.org/en-US/docs/Web/API/Request/mode
"""
# pylint: disable=unused-argument
from __future__ import annotations
from ipaddress import (
IPv4Network,
IPv6Network,
)
import flask
import werkzeug
from . import config
from ._helpers import logger
def filter_request(
network: IPv4Network | IPv6Network,
request: flask.Request,
cfg: config.Config,
) -> werkzeug.Response | None:
val = request.headers.get("Sec-Fetch-Mode", "")
if val != "navigate":
logger.debug("invalid Sec-Fetch-Mode '%s'", val)
return flask.redirect(flask.url_for('index'), code=302)
val = request.headers.get("Sec-Fetch-Site", "")
if val not in ('same-origin', 'same-site', 'none'):
logger.debug("invalid Sec-Fetch-Site '%s'", val)
flask.redirect(flask.url_for('index'), code=302)
val = request.headers.get("Sec-Fetch-Dest", "")
if val != "document":
logger.debug("invalid Sec-Fetch-Dest '%s'", val)
flask.redirect(flask.url_for('index'), code=302)
return None

View File

@ -111,6 +111,7 @@ from searx.botdetection import (
http_accept_encoding, http_accept_encoding,
http_accept_language, http_accept_language,
http_user_agent, http_user_agent,
http_sec_fetch,
ip_limit, ip_limit,
ip_lists, ip_lists,
get_network, get_network,
@ -178,16 +179,17 @@ def filter_request(request: flask.Request) -> werkzeug.Response | None:
logger.error("BLOCK %s: matched BLOCKLIST - %s", network.compressed, msg) logger.error("BLOCK %s: matched BLOCKLIST - %s", network.compressed, msg)
return flask.make_response(('IP is on BLOCKLIST - %s' % msg, 429)) return flask.make_response(('IP is on BLOCKLIST - %s' % msg, 429))
# methods applied on / # methods applied on all requests
for func in [ for func in [
http_user_agent, http_user_agent,
]: ]:
val = func.filter_request(network, request, cfg) val = func.filter_request(network, request, cfg)
if val is not None: if val is not None:
logger.debug(f"NOT OK ({func.__name__}): {network}: %s", dump_request(flask.request))
return val return val
# methods applied on /search # methods applied on /search requests
if request.path == '/search': if request.path == '/search':
@ -196,12 +198,15 @@ def filter_request(request: flask.Request) -> werkzeug.Response | None:
http_accept_encoding, http_accept_encoding,
http_accept_language, http_accept_language,
http_user_agent, http_user_agent,
http_sec_fetch,
ip_limit, ip_limit,
]: ]:
val = func.filter_request(network, request, cfg) val = func.filter_request(network, request, cfg)
if val is not None: if val is not None:
logger.debug(f"NOT OK ({func.__name__}): {network}: %s", dump_request(flask.request))
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

View File

@ -39,7 +39,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: 2024-10-05 06:24+0000\n" "POT-Creation-Date: 2024-10-05 06:24+0000\n"
"PO-Revision-Date: 2024-11-03 09:08+0000\n" "PO-Revision-Date: 2024-11-14 14:07+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n" "Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
"Language-Team: Spanish <https://translate.codeberg.org/projects/searxng/" "Language-Team: Spanish <https://translate.codeberg.org/projects/searxng/"
"searxng/es/>\n" "searxng/es/>\n"
@ -1249,7 +1249,7 @@ msgstr "Buscador de favicon"
#: searx/templates/simple/preferences/favicon.html:15 #: searx/templates/simple/preferences/favicon.html:15
msgid "Display favicons near search results" msgid "Display favicons near search results"
msgstr "" msgstr "Mostrar los favicons al lado de los resultados de búsqueda"
#: searx/templates/simple/preferences/footer.html:2 #: searx/templates/simple/preferences/footer.html:2
msgid "" msgid ""

View File

@ -28,13 +28,14 @@
# unoyoa <unoyoa@users.noreply.translate.codeberg.org>, 2024. # unoyoa <unoyoa@users.noreply.translate.codeberg.org>, 2024.
# tiziodcaio <tiziodcaio@users.noreply.translate.codeberg.org>, 2024. # tiziodcaio <tiziodcaio@users.noreply.translate.codeberg.org>, 2024.
# Fabio_Perri <Fabio_Perri@users.noreply.translate.codeberg.org>, 2024. # Fabio_Perri <Fabio_Perri@users.noreply.translate.codeberg.org>, 2024.
# lrnz2 <lrnz2@users.noreply.translate.codeberg.org>, 2024.
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: 2024-10-05 06:24+0000\n" "POT-Creation-Date: 2024-10-05 06:24+0000\n"
"PO-Revision-Date: 2024-10-08 13:41+0000\n" "PO-Revision-Date: 2024-11-14 02:16+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n" "Last-Translator: lrnz2 <lrnz2@users.noreply.translate.codeberg.org>\n"
"Language-Team: Italian <https://translate.codeberg.org/projects/searxng/" "Language-Team: Italian <https://translate.codeberg.org/projects/searxng/"
"searxng/it/>\n" "searxng/it/>\n"
"Language: it\n" "Language: it\n"
@ -42,13 +43,13 @@ 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.7.2\n" "X-Generator: Weblate 5.8.1\n"
"Generated-By: Babel 2.16.0\n" "Generated-By: Babel 2.16.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
#: searx/searxng.msg #: searx/searxng.msg
msgid "without further subgrouping" msgid "without further subgrouping"
msgstr "senza altri sottogruppi" msgstr "senza altri sottogruppamenti"
#. CONSTANT_NAMES['DEFAULT_CATEGORY'] #. CONSTANT_NAMES['DEFAULT_CATEGORY']
#: searx/searxng.msg #: searx/searxng.msg
@ -73,7 +74,7 @@ msgstr "musica"
#. CATEGORY_NAMES['SOCIAL_MEDIA'] #. CATEGORY_NAMES['SOCIAL_MEDIA']
#: searx/searxng.msg #: searx/searxng.msg
msgid "social media" msgid "social media"
msgstr "social" msgstr "social media"
#. CATEGORY_NAMES['IMAGES'] #. CATEGORY_NAMES['IMAGES']
#: searx/searxng.msg #: searx/searxng.msg
@ -113,7 +114,7 @@ msgstr "mappa"
#. CATEGORY_NAMES['ONIONS'] #. CATEGORY_NAMES['ONIONS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "onions" msgid "onions"
msgstr "onion" msgstr "cipolle"
#. CATEGORY_NAMES['SCIENCE'] #. CATEGORY_NAMES['SCIENCE']
#: searx/searxng.msg #: searx/searxng.msg
@ -133,7 +134,7 @@ msgstr "dizionari"
#. CATEGORY_GROUPS['LYRICS'] #. CATEGORY_GROUPS['LYRICS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "lyrics" msgid "lyrics"
msgstr "testi musicali" msgstr "testo musicale"
#. CATEGORY_GROUPS['PACKAGES'] #. CATEGORY_GROUPS['PACKAGES']
#: searx/searxng.msg #: searx/searxng.msg
@ -148,12 +149,12 @@ msgstr "d&r"
#. CATEGORY_GROUPS['REPOS'] #. CATEGORY_GROUPS['REPOS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "repos" msgid "repos"
msgstr "ripostigli" msgstr "repos"
#. CATEGORY_GROUPS['SOFTWARE_WIKIS'] #. CATEGORY_GROUPS['SOFTWARE_WIKIS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "software wikis" msgid "software wikis"
msgstr "wiki software" msgstr "wiki del software"
#. CATEGORY_GROUPS['WEB'] #. CATEGORY_GROUPS['WEB']
#: searx/searxng.msg #: searx/searxng.msg
@ -193,7 +194,7 @@ msgstr "Tempo di attività"
#. BRAND_CUSTOM_LINKS['ABOUT'] #. BRAND_CUSTOM_LINKS['ABOUT']
#: searx/searxng.msg searx/templates/simple/base.html:50 #: searx/searxng.msg searx/templates/simple/base.html:50
msgid "About" msgid "About"
msgstr "A proposito" msgstr "Al riguardo"
#. WEATHER_TERMS['AVERAGE TEMP.'] #. WEATHER_TERMS['AVERAGE TEMP.']
#: searx/engines/wttr.py:32 searx/searxng.msg #: searx/engines/wttr.py:32 searx/searxng.msg

View File

@ -11,13 +11,14 @@
# omfj <omfj@users.noreply.translate.codeberg.org>, 2024. # omfj <omfj@users.noreply.translate.codeberg.org>, 2024.
# combwizard <combwizard@users.noreply.translate.codeberg.org>, 2024. # combwizard <combwizard@users.noreply.translate.codeberg.org>, 2024.
# laaknor <laaknor@users.noreply.translate.codeberg.org>, 2024. # laaknor <laaknor@users.noreply.translate.codeberg.org>, 2024.
# Aadniz <Aadniz@users.noreply.translate.codeberg.org>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-10-05 06:24+0000\n" "POT-Creation-Date: 2024-10-05 06:24+0000\n"
"PO-Revision-Date: 2024-11-03 09:08+0000\n" "PO-Revision-Date: 2024-11-09 12:07+0000\n"
"Last-Translator: laaknor <laaknor@users.noreply.translate.codeberg.org>\n" "Last-Translator: Aadniz <Aadniz@users.noreply.translate.codeberg.org>\n"
"Language-Team: Norwegian Bokmål <https://translate.codeberg.org/projects/" "Language-Team: Norwegian Bokmål <https://translate.codeberg.org/projects/"
"searxng/searxng/nb_NO/>\n" "searxng/searxng/nb_NO/>\n"
"Language: nb_NO\n" "Language: nb_NO\n"
@ -192,13 +193,13 @@ msgstr "Skydekke"
#: searx/engines/duckduckgo_weather.py:45 searx/engines/wttr.py:51 #: searx/engines/duckduckgo_weather.py:45 searx/engines/wttr.py:51
#: searx/searxng.msg #: searx/searxng.msg
msgid "Condition" msgid "Condition"
msgstr "" msgstr "Betingelse"
#. WEATHER_TERMS['CURRENT CONDITION'] #. WEATHER_TERMS['CURRENT CONDITION']
#: searx/engines/duckduckgo_weather.py:118 searx/engines/wttr.py:104 #: searx/engines/duckduckgo_weather.py:118 searx/engines/wttr.py:104
#: searx/searxng.msg #: searx/searxng.msg
msgid "Current condition" msgid "Current condition"
msgstr "" msgstr "Nåværende betingelse"
#. WEATHER_TERMS['EVENING'] #. WEATHER_TERMS['EVENING']
#: searx/engines/wttr.py:100 searx/searxng.msg #: searx/engines/wttr.py:100 searx/searxng.msg
@ -221,13 +222,13 @@ msgstr "Luftfuktighet"
#: searx/engines/duckduckgo_weather.py:77 searx/engines/wttr.py:34 #: searx/engines/duckduckgo_weather.py:77 searx/engines/wttr.py:34
#: searx/searxng.msg #: searx/searxng.msg
msgid "Max temp." msgid "Max temp."
msgstr "" msgstr "Maks temp."
#. WEATHER_TERMS['MIN TEMP.'] #. WEATHER_TERMS['MIN TEMP.']
#: searx/engines/duckduckgo_weather.py:73 searx/engines/wttr.py:33 #: searx/engines/duckduckgo_weather.py:73 searx/engines/wttr.py:33
#: searx/searxng.msg #: searx/searxng.msg
msgid "Min temp." msgid "Min temp."
msgstr "" msgstr "Min temp."
#. WEATHER_TERMS['MORNING'] #. WEATHER_TERMS['MORNING']
#: searx/engines/wttr.py:100 searx/searxng.msg #: searx/engines/wttr.py:100 searx/searxng.msg
@ -334,17 +335,17 @@ msgstr "opphavsmann"
#. SOCIAL_MEDIA_TERMS['THREAD OPEN'] #. SOCIAL_MEDIA_TERMS['THREAD OPEN']
#: searx/engines/discourse.py:149 searx/searxng.msg #: searx/engines/discourse.py:149 searx/searxng.msg
msgid "open" msgid "open"
msgstr "" msgstr "åpen"
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED'] #. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
#: searx/engines/discourse.py:149 searx/searxng.msg #: searx/engines/discourse.py:149 searx/searxng.msg
msgid "closed" msgid "closed"
msgstr "" msgstr "lukket"
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED'] #. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
#: searx/engines/discourse.py:160 searx/searxng.msg #: searx/engines/discourse.py:160 searx/searxng.msg
msgid "answered" msgid "answered"
msgstr "" msgstr "svart på"
#: searx/webapp.py:332 #: searx/webapp.py:332
msgid "No item found" msgid "No item found"
@ -421,7 +422,7 @@ msgstr "tilgang nektet"
#: searx/webutils.py:60 #: searx/webutils.py:60
msgid "server API error" msgid "server API error"
msgstr "Tjener-API-feil" msgstr "server API feil"
#: searx/webutils.py:79 #: searx/webutils.py:79
msgid "Suspended" msgid "Suspended"
@ -453,7 +454,7 @@ msgstr "Regn ut {functions} av parameterne"
#: searx/engines/mozhi.py:57 #: searx/engines/mozhi.py:57
msgid "Synonyms" msgid "Synonyms"
msgstr "" msgstr "Synonymer"
#: searx/engines/openstreetmap.py:159 #: searx/engines/openstreetmap.py:159
msgid "Get directions" msgid "Get directions"
@ -528,7 +529,7 @@ msgstr "Filkvalitet"
#: searx/plugins/calculator.py:14 #: searx/plugins/calculator.py:14
msgid "Calculate mathematical expressions via the search bar" msgid "Calculate mathematical expressions via the search bar"
msgstr "" msgstr "Kalkuler matematiske uttrykk via søkebaren"
#: searx/plugins/hash_plugin.py:10 #: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
@ -572,7 +573,7 @@ msgstr ""
#: searx/plugins/self_info.py:28 #: searx/plugins/self_info.py:28
msgid "Your IP is: " msgid "Your IP is: "
msgstr "" msgstr "Din IP er "
#: searx/plugins/self_info.py:31 #: searx/plugins/self_info.py:31
msgid "Your user-agent is: " msgid "Your user-agent is: "
@ -580,16 +581,16 @@ msgstr ""
#: searx/plugins/tor_check.py:24 #: searx/plugins/tor_check.py:24
msgid "Tor check plugin" msgid "Tor check plugin"
msgstr "Tor sjekk pluggin" msgstr "Tor sjekking plugin"
#: searx/plugins/tor_check.py:27 #: searx/plugins/tor_check.py:27
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 "" msgstr ""
"Denne plugin sjekker om adressen til forespørselen er en Tor utgangsnode," "Denne plugin-en sjekker om adressen til forespørselen er en Tor utgangsnode, "
" og informerer brukeren om den er det; som check.torproject.org, men fra " "og informerer brukeren om den er det; slik som check.torproject.org gjør, "
"SearXNG." "men fra SearXNG."
#: searx/plugins/tor_check.py:61 #: searx/plugins/tor_check.py:61
msgid "" msgid ""
@ -621,7 +622,7 @@ msgstr "Fjern sporer-argumenter fra returnert nettadresse"
#: searx/plugins/unit_converter.py:29 #: searx/plugins/unit_converter.py:29
msgid "Convert between units" msgid "Convert between units"
msgstr "" msgstr "Konverter mellom forskjellige enheter"
#: searx/templates/simple/404.html:4 #: searx/templates/simple/404.html:4
msgid "Page not found" msgid "Page not found"
@ -688,7 +689,7 @@ msgstr "Lengde"
#: searx/templates/simple/macros.html:41 #: searx/templates/simple/macros.html:41
msgid "Views" msgid "Views"
msgstr "" msgstr "Visninger"
#: searx/templates/simple/macros.html:42 #: searx/templates/simple/macros.html:42
#: searx/templates/simple/result_templates/files.html:34 #: searx/templates/simple/result_templates/files.html:34
@ -946,7 +947,7 @@ msgstr "Meldinger fra søkemotorene"
#: searx/templates/simple/elements/engines_msg.html:7 #: searx/templates/simple/elements/engines_msg.html:7
msgid "seconds" msgid "seconds"
msgstr "" msgstr "sekunder"
#: searx/templates/simple/elements/search_url.html:3 #: searx/templates/simple/elements/search_url.html:3
msgid "Search URL" msgid "Search URL"
@ -1068,7 +1069,7 @@ msgstr "Bytt til en annen instans:"
#: searx/templates/simple/messages/no_results.html:24 #: searx/templates/simple/messages/no_results.html:24
msgid "Search for another query or select another category." msgid "Search for another query or select another category."
msgstr "" msgstr "Oppgi et annet søkeord eller velg en annen kategori."
#: searx/templates/simple/messages/no_results.html:25 #: searx/templates/simple/messages/no_results.html:25
msgid "Go back to the previous page using the previous page button." msgid "Go back to the previous page using the previous page button."
@ -1194,11 +1195,11 @@ msgstr ""
#: searx/templates/simple/preferences/engines.html:15 #: searx/templates/simple/preferences/engines.html:15
msgid "Enable all" msgid "Enable all"
msgstr "" msgstr "Aktiver alle"
#: searx/templates/simple/preferences/engines.html:16 #: searx/templates/simple/preferences/engines.html:16
msgid "Disable all" msgid "Disable all"
msgstr "" msgstr "Deaktiver alle"
#: searx/templates/simple/preferences/engines.html:25 #: searx/templates/simple/preferences/engines.html:25
msgid "!bang" msgid "!bang"

View File

@ -10,13 +10,14 @@
# return42 <return42@users.noreply.translate.codeberg.org>, 2024. # return42 <return42@users.noreply.translate.codeberg.org>, 2024.
# vducong <vducong@users.noreply.translate.codeberg.org>, 2024. # vducong <vducong@users.noreply.translate.codeberg.org>, 2024.
# tvminh19 <tvminh19@users.noreply.translate.codeberg.org>, 2024. # tvminh19 <tvminh19@users.noreply.translate.codeberg.org>, 2024.
# KhietVo <KhietVo@users.noreply.translate.codeberg.org>, 2024.
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: 2024-10-05 06:24+0000\n" "POT-Creation-Date: 2024-10-05 06:24+0000\n"
"PO-Revision-Date: 2024-10-26 21:13+0000\n" "PO-Revision-Date: 2024-11-14 14:07+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n" "Last-Translator: KhietVo <KhietVo@users.noreply.translate.codeberg.org>\n"
"Language-Team: Vietnamese <https://translate.codeberg.org/projects/searxng/" "Language-Team: Vietnamese <https://translate.codeberg.org/projects/searxng/"
"searxng/vi/>\n" "searxng/vi/>\n"
"Language: vi\n" "Language: vi\n"
@ -166,7 +167,7 @@ msgstr "Tối"
#. STYLE_NAMES['BLACK'] #. STYLE_NAMES['BLACK']
#: searx/searxng.msg #: searx/searxng.msg
msgid "black" msgid "black"
msgstr "" msgstr "màu đen"
#. BRAND_CUSTOM_LINKS['UPTIME'] #. BRAND_CUSTOM_LINKS['UPTIME']
#: searx/searxng.msg #: searx/searxng.msg
@ -198,7 +199,7 @@ msgstr "Điều kiện"
#: searx/engines/duckduckgo_weather.py:118 searx/engines/wttr.py:104 #: searx/engines/duckduckgo_weather.py:118 searx/engines/wttr.py:104
#: searx/searxng.msg #: searx/searxng.msg
msgid "Current condition" msgid "Current condition"
msgstr "" msgstr "tình hình hiện tại"
#. WEATHER_TERMS['EVENING'] #. WEATHER_TERMS['EVENING']
#: searx/engines/wttr.py:100 searx/searxng.msg #: searx/engines/wttr.py:100 searx/searxng.msg
@ -209,25 +210,25 @@ msgstr "Buổi chiều"
#: searx/engines/duckduckgo_weather.py:53 searx/engines/open_meteo.py:81 #: searx/engines/duckduckgo_weather.py:53 searx/engines/open_meteo.py:81
#: searx/engines/wttr.py:59 searx/searxng.msg #: searx/engines/wttr.py:59 searx/searxng.msg
msgid "Feels like" msgid "Feels like"
msgstr "" msgstr "Cảm thấy"
#. WEATHER_TERMS['HUMIDITY'] #. WEATHER_TERMS['HUMIDITY']
#: searx/engines/duckduckgo_weather.py:64 searx/engines/open_meteo.py:93 #: searx/engines/duckduckgo_weather.py:64 searx/engines/open_meteo.py:93
#: searx/engines/wttr.py:68 searx/searxng.msg #: searx/engines/wttr.py:68 searx/searxng.msg
msgid "Humidity" msgid "Humidity"
msgstr "" msgstr "Độ ẩm"
#. WEATHER_TERMS['MAX TEMP.'] #. WEATHER_TERMS['MAX TEMP.']
#: searx/engines/duckduckgo_weather.py:77 searx/engines/wttr.py:34 #: searx/engines/duckduckgo_weather.py:77 searx/engines/wttr.py:34
#: searx/searxng.msg #: searx/searxng.msg
msgid "Max temp." msgid "Max temp."
msgstr "" msgstr "Nhiệt độ tối đa"
#. WEATHER_TERMS['MIN TEMP.'] #. WEATHER_TERMS['MIN TEMP.']
#: searx/engines/duckduckgo_weather.py:73 searx/engines/wttr.py:33 #: searx/engines/duckduckgo_weather.py:73 searx/engines/wttr.py:33
#: searx/searxng.msg #: searx/searxng.msg
msgid "Min temp." msgid "Min temp."
msgstr "" msgstr "Nhiệt độ thấp nhất"
#. WEATHER_TERMS['MORNING'] #. WEATHER_TERMS['MORNING']
#: searx/engines/wttr.py:100 searx/searxng.msg #: searx/engines/wttr.py:100 searx/searxng.msg
@ -247,37 +248,37 @@ msgstr "Buổi trưa"
#. WEATHER_TERMS['PRESSURE'] #. WEATHER_TERMS['PRESSURE']
#: searx/engines/open_meteo.py:95 searx/searxng.msg #: searx/engines/open_meteo.py:95 searx/searxng.msg
msgid "Pressure" msgid "Pressure"
msgstr "" msgstr "Áp suất"
#. WEATHER_TERMS['SUNRISE'] #. WEATHER_TERMS['SUNRISE']
#: searx/engines/duckduckgo_weather.py:81 searx/engines/wttr.py:36 #: searx/engines/duckduckgo_weather.py:81 searx/engines/wttr.py:36
#: searx/searxng.msg #: searx/searxng.msg
msgid "Sunrise" msgid "Sunrise"
msgstr "" msgstr "Mặt trời mọc"
#. WEATHER_TERMS['SUNSET'] #. WEATHER_TERMS['SUNSET']
#: searx/engines/duckduckgo_weather.py:82 searx/engines/wttr.py:37 #: searx/engines/duckduckgo_weather.py:82 searx/engines/wttr.py:37
#: searx/searxng.msg #: searx/searxng.msg
msgid "Sunset" msgid "Sunset"
msgstr "" msgstr "mặt trời lặn"
#. WEATHER_TERMS['TEMPERATURE'] #. WEATHER_TERMS['TEMPERATURE']
#: searx/engines/duckduckgo_weather.py:48 searx/engines/open_meteo.py:76 #: searx/engines/duckduckgo_weather.py:48 searx/engines/open_meteo.py:76
#: searx/engines/wttr.py:55 searx/searxng.msg #: searx/engines/wttr.py:55 searx/searxng.msg
msgid "Temperature" msgid "Temperature"
msgstr "" msgstr "Nhiệt độ"
#. WEATHER_TERMS['UV INDEX'] #. WEATHER_TERMS['UV INDEX']
#: searx/engines/duckduckgo_weather.py:80 searx/engines/wttr.py:35 #: searx/engines/duckduckgo_weather.py:80 searx/engines/wttr.py:35
#: searx/searxng.msg #: searx/searxng.msg
msgid "UV index" msgid "UV index"
msgstr "" msgstr "Chỉ số UV"
#. WEATHER_TERMS['VISIBILITY'] #. WEATHER_TERMS['VISIBILITY']
#: searx/engines/duckduckgo_weather.py:62 searx/engines/wttr.py:66 #: searx/engines/duckduckgo_weather.py:62 searx/engines/wttr.py:66
#: searx/searxng.msg #: searx/searxng.msg
msgid "Visibility" msgid "Visibility"
msgstr "" msgstr "Tầm nhìn"
#. WEATHER_TERMS['WIND'] #. WEATHER_TERMS['WIND']
#: searx/engines/duckduckgo_weather.py:58 searx/engines/open_meteo.py:86 #: searx/engines/duckduckgo_weather.py:58 searx/engines/open_meteo.py:86
@ -288,12 +289,12 @@ msgstr "Gió"
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS'] #. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
#: searx/engines/lemmy.py:85 searx/searxng.msg #: searx/engines/lemmy.py:85 searx/searxng.msg
msgid "subscribers" msgid "subscribers"
msgstr "" msgstr "người đăng ký"
#. SOCIAL_MEDIA_TERMS['POSTS'] #. SOCIAL_MEDIA_TERMS['POSTS']
#: searx/engines/lemmy.py:86 searx/searxng.msg #: searx/engines/lemmy.py:86 searx/searxng.msg
msgid "posts" msgid "posts"
msgstr "" msgstr "những bài đăng"
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS'] #. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
#: searx/engines/lemmy.py:87 searx/searxng.msg #: searx/engines/lemmy.py:87 searx/searxng.msg
@ -309,42 +310,42 @@ msgstr ""
#. SOCIAL_MEDIA_TERMS['USER'] #. SOCIAL_MEDIA_TERMS['USER']
#: searx/engines/lemmy.py:129 searx/engines/lemmy.py:164 searx/searxng.msg #: searx/engines/lemmy.py:129 searx/engines/lemmy.py:164 searx/searxng.msg
msgid "user" msgid "user"
msgstr "" msgstr "người dùng"
#. SOCIAL_MEDIA_TERMS['COMMUNITY'] #. SOCIAL_MEDIA_TERMS['COMMUNITY']
#: searx/engines/lemmy.py:131 searx/engines/lemmy.py:165 searx/searxng.msg #: searx/engines/lemmy.py:131 searx/engines/lemmy.py:165 searx/searxng.msg
msgid "community" msgid "community"
msgstr "" msgstr "cộng đồng"
#. SOCIAL_MEDIA_TERMS['POINTS'] #. SOCIAL_MEDIA_TERMS['POINTS']
#: searx/engines/hackernews.py:78 searx/searxng.msg #: searx/engines/hackernews.py:78 searx/searxng.msg
msgid "points" msgid "points"
msgstr "" msgstr "điểm"
#. SOCIAL_MEDIA_TERMS['TITLE'] #. SOCIAL_MEDIA_TERMS['TITLE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "title" msgid "title"
msgstr "" msgstr "tiêu đề"
#. SOCIAL_MEDIA_TERMS['AUTHOR'] #. SOCIAL_MEDIA_TERMS['AUTHOR']
#: searx/engines/hackernews.py:81 searx/searxng.msg #: searx/engines/hackernews.py:81 searx/searxng.msg
msgid "author" msgid "author"
msgstr "" msgstr "tác giả"
#. SOCIAL_MEDIA_TERMS['THREAD OPEN'] #. SOCIAL_MEDIA_TERMS['THREAD OPEN']
#: searx/engines/discourse.py:149 searx/searxng.msg #: searx/engines/discourse.py:149 searx/searxng.msg
msgid "open" msgid "open"
msgstr "" msgstr "mở"
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED'] #. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
#: searx/engines/discourse.py:149 searx/searxng.msg #: searx/engines/discourse.py:149 searx/searxng.msg
msgid "closed" msgid "closed"
msgstr "" msgstr "đóng"
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED'] #. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
#: searx/engines/discourse.py:160 searx/searxng.msg #: searx/engines/discourse.py:160 searx/searxng.msg
msgid "answered" msgid "answered"
msgstr "" msgstr "đã trả lời"
#: searx/webapp.py:332 #: searx/webapp.py:332
msgid "No item found" msgid "No item found"
@ -529,7 +530,7 @@ msgstr "Chất lượng tệp"
#: searx/plugins/calculator.py:14 #: searx/plugins/calculator.py:14
msgid "Calculate mathematical expressions via the search bar" msgid "Calculate mathematical expressions via the search bar"
msgstr "" msgstr "Tính toán bằng thanh tìm kiếm"
#: searx/plugins/hash_plugin.py:10 #: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
@ -540,12 +541,14 @@ msgid "hash digest"
msgstr "hash băm" msgstr "hash băm"
#: searx/plugins/hostnames.py:103 #: searx/plugins/hostnames.py:103
#, fuzzy
msgid "Hostnames plugin" msgid "Hostnames plugin"
msgstr "" msgstr "Mấy chủ bổ trợ"
#: searx/plugins/hostnames.py:104 #: searx/plugins/hostnames.py:104
msgid "Rewrite hostnames, remove results or prioritize them based on the hostname" msgid "Rewrite hostnames, remove results or prioritize them based on the hostname"
msgstr "" msgstr ""
"Viết lại máy chủ, xoá các kểt quả tìm kiếm hoặc sắp xếp dựa trên máy chủ"
#: searx/plugins/oa_doi_rewrite.py:12 #: searx/plugins/oa_doi_rewrite.py:12
msgid "Open Access DOI rewrite" msgid "Open Access DOI rewrite"
@ -571,7 +574,7 @@ msgstr "Hiện IP của bạn khi gõ \"ip\" và hiện user agent khi gõ \"use
#: searx/plugins/self_info.py:28 #: searx/plugins/self_info.py:28
msgid "Your IP is: " msgid "Your IP is: "
msgstr "" msgstr "Địa chỉ IP của bạn: "
#: searx/plugins/self_info.py:31 #: searx/plugins/self_info.py:31
msgid "Your user-agent is: " msgid "Your user-agent is: "