mirror of https://github.com/searxng/searxng.git
Compare commits
9 Commits
0e69e9dcb3
...
f5f64518f4
Author | SHA1 | Date |
---|---|---|
Markus Heiser | f5f64518f4 | |
Markus Heiser | 0f9694c90b | |
Markus Heiser | ccc4f30b20 | |
Markus Heiser | c4b874e9b0 | |
Markus Heiser | 7c4e4ebd40 | |
searxng-bot | b8f1a329d3 | |
dependabot[bot] | 67f7548573 | |
dependabot[bot] | f40fc2dd4f | |
Markus Heiser | 3581e1b85f |
|
@ -4,22 +4,27 @@ Welcome to SearXNG
|
|||
|
||||
*Search without being tracked.*
|
||||
|
||||
SearXNG is a free internet metasearch engine which aggregates results from more
|
||||
than 70 search services. Users are neither tracked nor profiled. Additionally,
|
||||
SearXNG can be used over Tor for online anonymity.
|
||||
.. jinja:: searx
|
||||
|
||||
SearXNG is a free internet metasearch engine which aggregates results from up
|
||||
to {{engines | length}} :ref:`search services <configured engines>`. Users
|
||||
are neither tracked nor profiled. Additionally, SearXNG can be used over Tor
|
||||
for online anonymity.
|
||||
|
||||
Get started with SearXNG by using one of the instances listed at searx.space_.
|
||||
If you don't trust anyone, you can set up your own, see :ref:`installation`.
|
||||
|
||||
.. sidebar:: features
|
||||
.. jinja:: searx
|
||||
|
||||
.. sidebar:: features
|
||||
|
||||
- :ref:`self hosted <installation>`
|
||||
- :ref:`no user tracking / no profiling <SearXNG protect privacy>`
|
||||
- script & cookies are optional
|
||||
- secure, encrypted connections
|
||||
- :ref:`about 200 search engines <configured engines>`
|
||||
- `about 60 translations <https://translate.codeberg.org/projects/searxng/searxng/>`_
|
||||
- about 100 `well maintained <https://uptime.searxng.org/>`__ instances on searx.space_
|
||||
- :ref:`{{engines | length}} search engines <configured engines>`
|
||||
- `58 translations <https://translate.codeberg.org/projects/searxng/searxng/>`_
|
||||
- about 70 `well maintained <https://uptime.searxng.org/>`__ instances on searx.space_
|
||||
- :ref:`easy integration of search engines <demo online engine>`
|
||||
- professional development: `CI <https://github.com/searxng/searxng/actions>`_,
|
||||
`quality assurance <https://dev.searxng.org/>`_ &
|
||||
|
|
|
@ -11,11 +11,11 @@ httpx[http2]==0.24.1
|
|||
Brotli==1.1.0
|
||||
uvloop==0.21.0
|
||||
httpx-socks[asyncio]==0.7.7
|
||||
setproctitle==1.3.3
|
||||
setproctitle==1.3.4
|
||||
redis==5.0.8
|
||||
markdown-it-py==3.0.0
|
||||
fasttext-predict==0.9.2.2
|
||||
tomli==2.0.2; python_version < '3.11'
|
||||
msgspec==0.18.6
|
||||
eval_type_backport; python_version < '3.9'
|
||||
typer-slim==0.13.0
|
||||
typer-slim==0.13.1
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
"""Internet Archive scholar(science)
|
||||
"""
|
||||
|
||||
from datetime import datetime
|
||||
from urllib.parse import urlencode
|
||||
from searx.utils import html_to_text
|
||||
|
||||
about = {
|
||||
"website": "https://scholar.archive.org/",
|
||||
"wikidata_id": "Q115667709",
|
||||
"official_api_documentation": "https://scholar.archive.org/api/redoc",
|
||||
"use_official_api": True,
|
||||
"require_api_key": False,
|
||||
"results": "JSON",
|
||||
}
|
||||
categories = ['science', 'scientific publications']
|
||||
paging = True
|
||||
|
||||
base_url = "https://scholar.archive.org"
|
||||
results_per_page = 15
|
||||
|
||||
|
||||
def request(query, params):
|
||||
args = {
|
||||
"q": query,
|
||||
"limit": results_per_page,
|
||||
"offset": (params["pageno"] - 1) * results_per_page,
|
||||
}
|
||||
params["url"] = f"{base_url}/search?{urlencode(args)}"
|
||||
params["headers"]["Accept"] = "application/json"
|
||||
return params
|
||||
|
||||
|
||||
def response(resp):
|
||||
results = []
|
||||
|
||||
json = resp.json()
|
||||
|
||||
for result in json["results"]:
|
||||
publishedDate, content, doi = None, '', None
|
||||
|
||||
if result['biblio'].get('release_date'):
|
||||
publishedDate = datetime.strptime(result['biblio']['release_date'], "%Y-%m-%d")
|
||||
|
||||
if len(result['abstracts']) > 0:
|
||||
content = result['abstracts'][0].get('body')
|
||||
elif len(result['_highlights']) > 0:
|
||||
content = result['_highlights'][0]
|
||||
|
||||
if len(result['releases']) > 0:
|
||||
doi = result['releases'][0].get('doi')
|
||||
|
||||
results.append(
|
||||
{
|
||||
'template': 'paper.html',
|
||||
'url': result['fulltext']['access_url'],
|
||||
'title': result['biblio'].get('title') or result['biblio'].get('container_name'),
|
||||
'content': html_to_text(content),
|
||||
'publisher': result['biblio'].get('publisher'),
|
||||
'doi': doi,
|
||||
'journal': result['biblio'].get('container_name'),
|
||||
'authors': result['biblio'].get('contrib_names'),
|
||||
'tags': result['tags'],
|
||||
'publishedDate': publishedDate,
|
||||
'issns': result['biblio'].get('issns'),
|
||||
'pdf_url': result['fulltext'].get('access_url'),
|
||||
}
|
||||
)
|
||||
|
||||
return results
|
|
@ -27,7 +27,7 @@ categories = ['images']
|
|||
paging = True
|
||||
|
||||
endpoint = 'photos'
|
||||
base_url = 'https://loc.gov'
|
||||
base_url = 'https://www.loc.gov'
|
||||
search_string = "/{endpoint}/?sp={page}&{query}&fo=json"
|
||||
|
||||
|
||||
|
|
|
@ -233,8 +233,7 @@ class Network:
|
|||
del kwargs['raise_for_httperror']
|
||||
return do_raise_for_httperror
|
||||
|
||||
@staticmethod
|
||||
def patch_response(response, do_raise_for_httperror):
|
||||
def patch_response(self, response, do_raise_for_httperror):
|
||||
if isinstance(response, httpx.Response):
|
||||
# requests compatibility (response is not streamed)
|
||||
# see also https://www.python-httpx.org/compatibility/#checking-for-4xx5xx-responses
|
||||
|
@ -242,8 +241,11 @@ class Network:
|
|||
|
||||
# raise an exception
|
||||
if do_raise_for_httperror:
|
||||
try:
|
||||
raise_for_httperror(response)
|
||||
|
||||
except:
|
||||
self._logger.warning(f"HTTP Request failed: {response.request.method} {response.request.url}")
|
||||
raise
|
||||
return response
|
||||
|
||||
def is_valid_response(self, response):
|
||||
|
@ -269,7 +271,7 @@ class Network:
|
|||
else:
|
||||
response = await client.request(method, url, **kwargs)
|
||||
if self.is_valid_response(response) or retries <= 0:
|
||||
return Network.patch_response(response, do_raise_for_httperror)
|
||||
return self.patch_response(response, do_raise_for_httperror)
|
||||
except httpx.RemoteProtocolError as e:
|
||||
if not was_disconnected:
|
||||
# the server has closed the connection:
|
||||
|
|
|
@ -0,0 +1,259 @@
|
|||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
"""Implementations for efficient processing of regular expressions"""
|
||||
|
||||
from __future__ import annotations
|
||||
from typing import Iterator
|
||||
import abc
|
||||
import re
|
||||
import warnings
|
||||
import json
|
||||
|
||||
class RegExprList(abc.ABC):
|
||||
"""Abstract base class for efficient processing of lists of regular
|
||||
expressions. The inheriting classes have to implement the
|
||||
:py:obj:`RegExprList.load_regexp` method which is used to load the list of
|
||||
regular expressions from a configuration, for example.
|
||||
|
||||
Intention: By concatenating the regular expressions from the list into one
|
||||
regular expression, all patterns can be performed with just one search and
|
||||
it is not necessary to iterate over the individual expressions and perform
|
||||
n-searches.
|
||||
|
||||
"""
|
||||
|
||||
RE_GRP_PREFIX = "RegExprList"
|
||||
|
||||
@abc.abstractmethod
|
||||
def load_regexps(self) -> list[tuple[str, tuple]]:
|
||||
"""Abstract method to load the list of regular expressions from a
|
||||
configuration. Returns a list of regular expressions (str) or a list of
|
||||
two-digit tuples with a regular expression on its first position and
|
||||
tuple of *n-objects* related to this regular expression on its second
|
||||
position:
|
||||
|
||||
.. code:: python
|
||||
|
||||
[
|
||||
( <regexpr_a>, (obj_a1, obj_a2, ..) ),
|
||||
( <regexpr_b>, (obj_b1, obj_b2, ..) ),
|
||||
..
|
||||
]
|
||||
|
||||
If there is nothing related to the regular expression, the tuple is
|
||||
empty (n=0). The **objects** must be of a simple data type (str, int,
|
||||
..) so that they can be serialized (JSON).
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, chunk_size = 1000):
|
||||
self.chunk_size = chunk_size
|
||||
self._chunks = None
|
||||
self._data_json = None
|
||||
|
||||
def _get_data(self):
|
||||
if self._data_json is not None:
|
||||
return json.loads(self._data_json)
|
||||
return self.load_regexps()
|
||||
|
||||
@property
|
||||
def JSON(self):
|
||||
"""JSON representation of the regular expression list (see
|
||||
:py:obj:`RegExprList.load_regexp`).
|
||||
|
||||
Serialize the :py:obj:`RegExprList` object into a JSON string.
|
||||
|
||||
"""
|
||||
if self._data_json is not None:
|
||||
return self._data_json
|
||||
return json.dumps(self._get_data(), sort_keys=True)
|
||||
|
||||
@classmethod
|
||||
def from_json(cls, json_str: str) -> "RegExprList":
|
||||
"""Build a :py:obj:`RegExprList` object and load regular expressions from
|
||||
a JSON string (compare :py:obj:`RegExprList.JSON`)."""
|
||||
obj = cls()
|
||||
obj._data_json = json_str
|
||||
return obj
|
||||
|
||||
@property
|
||||
def chunks(self) -> list[tuple[re.Pattern, list[tuple]]]:
|
||||
"""A list of (concatenated) regular expressions"""
|
||||
if self._chunks is None:
|
||||
self._chunks = self.get_chunks()
|
||||
return self._chunks
|
||||
|
||||
def get_chunks(self) -> list[tuple[re.Pattern, list[tuple]]]:
|
||||
"""Returns a list chunks items. A chunk item is a two-digit tuple with
|
||||
the concatened :py:obj:`re.Pattern` on its first position and a list of
|
||||
tuples (aka grp_tuples) on its second position.
|
||||
|
||||
The regular expressions are placed in *named groups* and the group for
|
||||
the match can be determined using :py:obj:`re.Match.groupdict:`.
|
||||
|
||||
.. code: re
|
||||
|
||||
(?P<{_0}>foo)|(?P<_1>bar)
|
||||
|
||||
.. code: python
|
||||
|
||||
>>> grp_tuples[0]
|
||||
('foo', obj_foo_1, obj_foo_2, ...)
|
||||
>>> grp_tuples[1]
|
||||
('bar', obj_bar_1, obj_bar_1, ...)
|
||||
|
||||
"""
|
||||
chunks = []
|
||||
re_list = self._get_data()
|
||||
|
||||
chunk_re = ""
|
||||
grp_tuples = []
|
||||
c = -1
|
||||
|
||||
|
||||
for pos in range(0, len(re_list)):
|
||||
c += 1
|
||||
objs_tpl = ()
|
||||
if len(re_list[pos]) == 2:
|
||||
re_str, objs_tpl = re_list[pos]
|
||||
else:
|
||||
re_str = re_list[pos]
|
||||
|
||||
grp_re = f"|(?P<{self.RE_GRP_PREFIX}_{c}>{re_str})"
|
||||
|
||||
if len(grp_re) + len(chunk_re) > self.chunk_size:
|
||||
# remove the leading | from chunk_re
|
||||
chunks.append((re.compile(chunk_re[1:]), grp_tuples))
|
||||
chunk_re = ""
|
||||
grp_tuples = []
|
||||
|
||||
chunk_re += grp_re
|
||||
grp_tuples.append((re_str, ) + objs_tpl)
|
||||
|
||||
# Are there any leftovers from the for loop?
|
||||
if chunk_re:
|
||||
chunks.append((re.compile(chunk_re[1:]), grp_tuples))
|
||||
return chunks
|
||||
|
||||
|
||||
def search(self, string: str) -> tuple[re.Match, tuple] | None:
|
||||
"""Search for regular expressions in ``string``. If none of the regular
|
||||
expression matches, ``None`` is returned. If there is a match, the
|
||||
first match (:py:obj:`re.Match`) is returned along with a tuple of
|
||||
objects related to the matched pattern (compare :py:obj:`RegExprList`):
|
||||
|
||||
.. code:: python
|
||||
|
||||
( re.Match, ( <regexpr_str>, obj_1, obj_2, ..) )
|
||||
|
||||
"""
|
||||
pos = -1
|
||||
for regexp, objs_tpl in self.chunks:
|
||||
m = regexp.search(string)
|
||||
if m:
|
||||
prefix = f"{self.RE_GRP_PREFIX}_"
|
||||
for grp_name, val in m.groupdict().items():
|
||||
if not grp_name.startswith(prefix):
|
||||
continue
|
||||
if val is None:
|
||||
continue
|
||||
try:
|
||||
pos = int(grp_name[len(prefix):])
|
||||
return (m, objs_tpl[pos])
|
||||
|
||||
except ValueError:
|
||||
# This case should never occur unless there is something
|
||||
# wrong with the regular expressions.
|
||||
warnings.warn(f"ignoring group '{grp_name}' in regexpr match {m}: check your regular expressions!")
|
||||
m = None
|
||||
break
|
||||
return None
|
||||
|
||||
|
||||
def finditer(self, string: str) -> Iterator[tuple[re.Match, tuple]]:
|
||||
"""Return an iterator yielding over all *"non-overlapping"* matches for
|
||||
the RE pattern in string. Similar to :py:obj:`RegExpr.search` each
|
||||
match (:py:obj:`re.Match`) comes along with a tuple of objects related
|
||||
to the matched pattern:
|
||||
|
||||
.. code:: python
|
||||
|
||||
( re.Match, ( <regexpr_str>, obj_1, obj_2, ..) )
|
||||
|
||||
Since the list of regular expressions is concatenated and also broken up
|
||||
at the boundaries of the chunks, it is not possible to ensure
|
||||
*"non-overlapping"* over the entirety of all regular expressions in the
|
||||
list! Nevertheless, there will be scenarios where this iterator makes
|
||||
sense, e.g. if the regular expressions do not overlap.
|
||||
|
||||
.. caution:
|
||||
|
||||
Use this method with care if the :py:obj:`regular expressions in the
|
||||
list <RegExprListload_regexps>` *overlap*, otherwise you get unexpected
|
||||
results!
|
||||
|
||||
"""
|
||||
|
||||
pos = -1
|
||||
for regexp, objs_tpl in self.chunks:
|
||||
for m in regexp.finditer(string):
|
||||
if m is None:
|
||||
continue
|
||||
prefix = f"{self.RE_GRP_PREFIX}_"
|
||||
for grp_name, val in m.groupdict().items():
|
||||
if not grp_name.startswith(prefix):
|
||||
continue
|
||||
if val is None:
|
||||
continue
|
||||
try:
|
||||
pos = int(grp_name[len(prefix):])
|
||||
yield (m, objs_tpl[pos])
|
||||
|
||||
except ValueError:
|
||||
# This case should never occur unless there is something
|
||||
# wrong with the regular expressions.
|
||||
warnings.warn(f"ignoring group '{grp_name}' in regexpr match {m}: check your regular expressions!")
|
||||
continue
|
||||
|
||||
|
||||
##########################################################################
|
||||
## some tests of the POC above
|
||||
|
||||
|
||||
import pdb
|
||||
|
||||
def test_POC():
|
||||
test_list = [
|
||||
# hint: the order of the list counts!
|
||||
(r'aa', ("double 'a' don't overlaps with any other regular expressions",)),
|
||||
(r'a', ("single 'a' overlaps with all other regular expressions",)),
|
||||
r'(.*\.)?academiapublishing\.org$',
|
||||
r'(.*\.)?academiaresearch\.org$',
|
||||
r'(.*\.)?academiascholarlyjournal\.org$',
|
||||
r'(.*\.)?academicjournalsinc\.com$',
|
||||
r'(.*\.)?academicjournalsonline\.co\.in$',
|
||||
r'(.*\.)?academicjournals\.org$',
|
||||
r'(.*\.)?academicoasis\.org$',
|
||||
r'(.*\.)?academic-publishing-house\.com$',
|
||||
r'(.*\.)?academicpub\.org$',
|
||||
r'(.*\.)?academicresearchjournals\.org$',
|
||||
r'(.*\.)?academicstar\.us$',
|
||||
r'(.*\.)?academicsworld\.org$',
|
||||
r'(.*\.)?academicwebpublishers\.org$',
|
||||
r'(.*\.)?academievoorcontinuverbeteren\.nl$',
|
||||
(r'(.*\.)?academyirmbr\.com$', ("XX", "YYYY", 7, 8.2)),
|
||||
r'(.*\.)?academyjournals\.net$',
|
||||
r'(.*\.)?academyofideas\.com$',
|
||||
r'(.*\.)?academypublish\.org$'
|
||||
]
|
||||
|
||||
class TestCls(RegExprList):
|
||||
def load_regexps(self) -> list[tuple[str, tuple]] | list[str]:
|
||||
return test_list
|
||||
mylist = TestCls()
|
||||
string = "aa.www.academyirmbr.com"
|
||||
print(f"matches in '{string}' ...")
|
||||
for m, tpl in mylist.finditer(string):
|
||||
print(f" regexp: {tpl[0]} // match: {m.string[m.start():m.end()]} // objects related to regexp: {tpl}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_POC()
|
|
@ -137,9 +137,6 @@ class OnlineProcessor(EngineProcessor):
|
|||
self.engine.request(query, params)
|
||||
|
||||
# ignoring empty urls
|
||||
if params['url'] is None:
|
||||
return None
|
||||
|
||||
if not params['url']:
|
||||
return None
|
||||
|
||||
|
|
|
@ -1622,11 +1622,6 @@ engines:
|
|||
api_site: 'askubuntu'
|
||||
categories: [it, q&a]
|
||||
|
||||
- name: internetarchivescholar
|
||||
engine: internet_archive_scholar
|
||||
shortcut: ias
|
||||
timeout: 15.0
|
||||
|
||||
- name: superuser
|
||||
engine: stackexchange
|
||||
shortcut: su
|
||||
|
|
Binary file not shown.
|
@ -18,22 +18,23 @@
|
|||
# Yahya-Lando <Yahya-Lando@users.noreply.translate.codeberg.org>, 2024.
|
||||
# nebras <nebras@users.noreply.translate.codeberg.org>, 2024.
|
||||
# geekom13 <geekom13@users.noreply.translate.codeberg.org>, 2024.
|
||||
# cherrad <cherrad@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-04 07:09+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>"
|
||||
"\n"
|
||||
"PO-Revision-Date: 2024-11-17 23:56+0000\n"
|
||||
"Last-Translator: cherrad <cherrad@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Arabic <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/ar/>\n"
|
||||
"Language: ar\n"
|
||||
"Language-Team: Arabic "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/ar/>\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : "
|
||||
"n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -461,7 +462,7 @@ msgstr "حوسبة معطيات ال{functions}"
|
|||
|
||||
#: searx/engines/mozhi.py:57
|
||||
msgid "Synonyms"
|
||||
msgstr ""
|
||||
msgstr "مرادفات"
|
||||
|
||||
#: searx/engines/openstreetmap.py:159
|
||||
msgid "Get directions"
|
||||
|
@ -1224,11 +1225,11 @@ msgstr "أقصى مدّة"
|
|||
|
||||
#: searx/templates/simple/preferences/favicon.html:2
|
||||
msgid "Favicon Resolver"
|
||||
msgstr ""
|
||||
msgstr "محلل أيقونة المفضلة"
|
||||
|
||||
#: searx/templates/simple/preferences/favicon.html:15
|
||||
msgid "Display favicons near search results"
|
||||
msgstr ""
|
||||
msgstr "عرض المفضلات قرب نتائج البحث"
|
||||
|
||||
#: searx/templates/simple/preferences/footer.html:2
|
||||
msgid ""
|
||||
|
@ -1973,4 +1974,3 @@ msgstr "إخفاء الفيديو"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "لم تتمكن محركات البحث من العثور على أية نتيجة"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -18,9 +18,8 @@ msgstr ""
|
|||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-13 03:30+0000\n"
|
||||
"Last-Translator: stoychevww <stoychevww@users.noreply.translate.codeberg.org>"
|
||||
"\n"
|
||||
"PO-Revision-Date: 2024-11-21 08:13+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Bulgarian <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/bg/>\n"
|
||||
"Language: bg\n"
|
||||
|
@ -28,7 +27,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.7.2\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -59,7 +58,7 @@ msgstr "музика"
|
|||
#. CATEGORY_NAMES['SOCIAL_MEDIA']
|
||||
#: searx/searxng.msg
|
||||
msgid "social media"
|
||||
msgstr "социална мрежа"
|
||||
msgstr "социална медия"
|
||||
|
||||
#. CATEGORY_NAMES['IMAGES']
|
||||
#: searx/searxng.msg
|
||||
|
@ -159,12 +158,12 @@ msgstr "автоматичен"
|
|||
#. STYLE_NAMES['LIGHT']
|
||||
#: searx/searxng.msg
|
||||
msgid "light"
|
||||
msgstr "светъл"
|
||||
msgstr "светло"
|
||||
|
||||
#. STYLE_NAMES['DARK']
|
||||
#: searx/searxng.msg
|
||||
msgid "dark"
|
||||
msgstr "тъмен"
|
||||
msgstr "тъмно"
|
||||
|
||||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
|
@ -364,7 +363,7 @@ msgstr "Грешка при зареждането на следващата с
|
|||
|
||||
#: searx/webapp.py:495 searx/webapp.py:898
|
||||
msgid "Invalid settings, please edit your preferences"
|
||||
msgstr "Неправилни настройки, моля проверете предпочитанията си"
|
||||
msgstr "Неправилни настройки, моля редактирайте предпочитанията си"
|
||||
|
||||
#: searx/webapp.py:511
|
||||
msgid "Invalid settings"
|
||||
|
@ -412,11 +411,11 @@ msgstr "прокси грешка"
|
|||
|
||||
#: searx/webutils.py:57
|
||||
msgid "CAPTCHA"
|
||||
msgstr "Кепча"
|
||||
msgstr "CAPTCHA"
|
||||
|
||||
#: searx/webutils.py:58
|
||||
msgid "too many requests"
|
||||
msgstr "твърде много искания"
|
||||
msgstr "твърде много повиквания"
|
||||
|
||||
#: searx/webutils.py:59
|
||||
msgid "access denied"
|
||||
|
@ -520,7 +519,7 @@ msgstr ""
|
|||
|
||||
#: searx/engines/tineye.py:57
|
||||
msgid "The image could not be downloaded."
|
||||
msgstr "Снимката не може да бъде смъкната."
|
||||
msgstr "Снимката не може да бъде свалена."
|
||||
|
||||
#: searx/engines/zlibrary.py:138
|
||||
msgid "Book rating"
|
||||
|
|
Binary file not shown.
|
@ -13,21 +13,23 @@
|
|||
# RTRedreovic <RTRedreovic@users.noreply.translate.codeberg.org>, 2023.
|
||||
# Azharjan <alexander.um.edu@gmail.com>, 2023.
|
||||
# return42 <return42@users.noreply.translate.codeberg.org>, 2024.
|
||||
# KinoCineaste <KinoCineaste@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-09-05 06:18+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>"
|
||||
"\n"
|
||||
"PO-Revision-Date: 2024-11-16 08:04+0000\n"
|
||||
"Last-Translator: KinoCineaste <KinoCineaste@users.noreply.translate.codeberg."
|
||||
"org>\n"
|
||||
"Language-Team: Esperanto <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/eo/>\n"
|
||||
"Language: eo\n"
|
||||
"Language-Team: Esperanto "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/eo/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -78,7 +80,7 @@ msgstr "radio"
|
|||
#. CATEGORY_NAMES['TV']
|
||||
#: searx/searxng.msg
|
||||
msgid "tv"
|
||||
msgstr ""
|
||||
msgstr "televido"
|
||||
|
||||
#. CATEGORY_NAMES['IT']
|
||||
#: searx/searxng.msg
|
||||
|
@ -168,7 +170,7 @@ msgstr "malhela"
|
|||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
msgid "black"
|
||||
msgstr ""
|
||||
msgstr "nigra"
|
||||
|
||||
#. BRAND_CUSTOM_LINKS['UPTIME']
|
||||
#: searx/searxng.msg
|
||||
|
@ -1961,4 +1963,3 @@ msgstr "kaŝi videojn"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "Serĉiloj ne povas retrovi rezultojn"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -26,16 +26,16 @@ msgstr ""
|
|||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-09-23 01:18+0000\n"
|
||||
"Last-Translator: tentsbet <tentsbet@users.noreply.translate.codeberg.org>"
|
||||
"\n"
|
||||
"PO-Revision-Date: 2024-11-21 05:07+0000\n"
|
||||
"Last-Translator: tentsbet <tentsbet@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Japanese <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/ja/>\n"
|
||||
"Language: ja\n"
|
||||
"Language-Team: Japanese "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/ja/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -176,7 +176,7 @@ msgstr "ダーク"
|
|||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
msgid "black"
|
||||
msgstr ""
|
||||
msgstr "ブラック"
|
||||
|
||||
#. BRAND_CUSTOM_LINKS['UPTIME']
|
||||
#: searx/searxng.msg
|
||||
|
@ -463,7 +463,7 @@ msgstr "変数の {functions} を計算する"
|
|||
|
||||
#: searx/engines/mozhi.py:57
|
||||
msgid "Synonyms"
|
||||
msgstr ""
|
||||
msgstr "類義語"
|
||||
|
||||
#: searx/engines/openstreetmap.py:159
|
||||
msgid "Get directions"
|
||||
|
@ -1202,11 +1202,11 @@ msgstr "最大時間"
|
|||
|
||||
#: searx/templates/simple/preferences/favicon.html:2
|
||||
msgid "Favicon Resolver"
|
||||
msgstr ""
|
||||
msgstr "Favicon Resolver"
|
||||
|
||||
#: searx/templates/simple/preferences/favicon.html:15
|
||||
msgid "Display favicons near search results"
|
||||
msgstr ""
|
||||
msgstr "検索結果でfaviconに合いそうなものを表示する"
|
||||
|
||||
#: searx/templates/simple/preferences/footer.html:2
|
||||
msgid ""
|
||||
|
@ -1917,4 +1917,3 @@ msgstr "動画を隠す"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "エンジンは結果を取得できません"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -16,16 +16,16 @@ msgstr ""
|
|||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-07-19 07:09+0000\n"
|
||||
"Last-Translator: wazhanudin "
|
||||
"<wazhanudin@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2024-11-21 08:13+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Malay <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/ms/>\n"
|
||||
"Language: ms\n"
|
||||
"Language-Team: Malay "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/ms/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -166,7 +166,7 @@ msgstr "gelap"
|
|||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
msgid "black"
|
||||
msgstr ""
|
||||
msgstr "Hitam"
|
||||
|
||||
#. BRAND_CUSTOM_LINKS['UPTIME']
|
||||
#: searx/searxng.msg
|
||||
|
@ -1690,4 +1690,3 @@ msgstr "sembunyikkan video"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "Enjin tidak dapat mendapatkan keputusan"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -21,17 +21,17 @@ msgstr ""
|
|||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-09-28 15:23+0000\n"
|
||||
"Last-Translator: UnD37970UnD "
|
||||
"<UnD37970UnD@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2024-11-21 08:13+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Romanian <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/ro/>\n"
|
||||
"Language: ro\n"
|
||||
"Language-Team: Romanian "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/ro/>\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 "
|
||||
"< 20)) ? 1 : 2;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
|
||||
"20)) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -172,7 +172,7 @@ msgstr "întunecat"
|
|||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
msgid "black"
|
||||
msgstr ""
|
||||
msgstr "negru"
|
||||
|
||||
#. BRAND_CUSTOM_LINKS['UPTIME']
|
||||
#: searx/searxng.msg
|
||||
|
@ -1998,4 +1998,3 @@ msgstr "ascunde video"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "Motoarele nu pot obține rezultate"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -16,17 +16,17 @@ msgstr ""
|
|||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-09-05 06:18+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>"
|
||||
"\n"
|
||||
"PO-Revision-Date: 2024-11-21 08:13+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Serbian <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/sr/>\n"
|
||||
"Language: sr\n"
|
||||
"Language-Team: Serbian "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/sr/>\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -252,7 +252,7 @@ msgstr "Подне"
|
|||
#. WEATHER_TERMS['PRESSURE']
|
||||
#: searx/engines/open_meteo.py:95 searx/searxng.msg
|
||||
msgid "Pressure"
|
||||
msgstr ""
|
||||
msgstr "Притисак"
|
||||
|
||||
#. WEATHER_TERMS['SUNRISE']
|
||||
#: searx/engines/duckduckgo_weather.py:81 searx/engines/wttr.py:36
|
||||
|
@ -1972,4 +1972,3 @@ msgstr "сакриј видео"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "Не може повратити резултате"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -11,13 +11,15 @@
|
|||
# vducong <vducong@users.noreply.translate.codeberg.org>, 2024.
|
||||
# tvminh19 <tvminh19@users.noreply.translate.codeberg.org>, 2024.
|
||||
# KhietVo <KhietVo@users.noreply.translate.codeberg.org>, 2024.
|
||||
# DiamondBrain113 <DiamondBrain113@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-11-14 14:07+0000\n"
|
||||
"Last-Translator: KhietVo <KhietVo@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2024-11-16 20:44+0000\n"
|
||||
"Last-Translator: DiamondBrain113 <DiamondBrain113@users.noreply.translate."
|
||||
"codeberg.org>\n"
|
||||
"Language-Team: Vietnamese <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/vi/>\n"
|
||||
"Language: vi\n"
|
||||
|
@ -299,13 +301,13 @@ msgstr "những bài đăng"
|
|||
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
|
||||
#: searx/engines/lemmy.py:87 searx/searxng.msg
|
||||
msgid "active users"
|
||||
msgstr ""
|
||||
msgstr "Người dùng hoạt động"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['COMMENTS']
|
||||
#: searx/engines/discourse.py:157 searx/engines/hackernews.py:78
|
||||
#: searx/engines/lemmy.py:130 searx/searxng.msg
|
||||
msgid "comments"
|
||||
msgstr ""
|
||||
msgstr "Bình luận"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['USER']
|
||||
#: searx/engines/lemmy.py:129 searx/engines/lemmy.py:164 searx/searxng.msg
|
||||
|
@ -454,7 +456,7 @@ msgstr "Tính toán {functions} của các đối số"
|
|||
|
||||
#: searx/engines/mozhi.py:57
|
||||
msgid "Synonyms"
|
||||
msgstr ""
|
||||
msgstr "Đồng nghĩa"
|
||||
|
||||
#: searx/engines/openstreetmap.py:159
|
||||
msgid "Get directions"
|
||||
|
@ -541,9 +543,8 @@ msgid "hash digest"
|
|||
msgstr "hash băm"
|
||||
|
||||
#: searx/plugins/hostnames.py:103
|
||||
#, fuzzy
|
||||
msgid "Hostnames plugin"
|
||||
msgstr "Mấy chủ bổ trợ"
|
||||
msgstr "Bổ trợ tên máy chủ"
|
||||
|
||||
#: searx/plugins/hostnames.py:104
|
||||
msgid "Rewrite hostnames, remove results or prioritize them based on the hostname"
|
||||
|
@ -578,7 +579,7 @@ msgstr "Địa chỉ IP của bạn: "
|
|||
|
||||
#: searx/plugins/self_info.py:31
|
||||
msgid "Your user-agent is: "
|
||||
msgstr ""
|
||||
msgstr "Tác nhân người dùng của bạn là: "
|
||||
|
||||
#: searx/plugins/tor_check.py:24
|
||||
msgid "Tor check plugin"
|
||||
|
@ -623,7 +624,7 @@ msgstr "Loại bỏ các đối số theo dõi từ URL trả về"
|
|||
|
||||
#: searx/plugins/unit_converter.py:29
|
||||
msgid "Convert between units"
|
||||
msgstr ""
|
||||
msgstr "Chuyển đổi giữa các đại lượng"
|
||||
|
||||
#: searx/templates/simple/404.html:4
|
||||
msgid "Page not found"
|
||||
|
@ -690,7 +691,7 @@ msgstr "Độ dài"
|
|||
|
||||
#: searx/templates/simple/macros.html:41
|
||||
msgid "Views"
|
||||
msgstr ""
|
||||
msgstr "Lượt xem"
|
||||
|
||||
#: searx/templates/simple/macros.html:42
|
||||
#: searx/templates/simple/result_templates/files.html:34
|
||||
|
@ -933,9 +934,8 @@ msgid "Checker"
|
|||
msgstr "Người kiểm duyệt"
|
||||
|
||||
#: searx/templates/simple/stats.html:131
|
||||
#, fuzzy
|
||||
msgid "Failed test"
|
||||
msgstr "Bản kiểm thử không đạt"
|
||||
msgstr "Bài kiểm tra không đạt"
|
||||
|
||||
#: searx/templates/simple/stats.html:132
|
||||
msgid "Comment(s)"
|
||||
|
@ -951,7 +951,7 @@ msgstr "Tin nhắn từ công cụ tìm kiếm"
|
|||
|
||||
#: searx/templates/simple/elements/engines_msg.html:7
|
||||
msgid "seconds"
|
||||
msgstr ""
|
||||
msgstr "giây"
|
||||
|
||||
#: searx/templates/simple/elements/search_url.html:3
|
||||
msgid "Search URL"
|
||||
|
@ -1208,11 +1208,11 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/preferences/engines.html:15
|
||||
msgid "Enable all"
|
||||
msgstr ""
|
||||
msgstr "Bật tất cả"
|
||||
|
||||
#: searx/templates/simple/preferences/engines.html:16
|
||||
msgid "Disable all"
|
||||
msgstr ""
|
||||
msgstr "Tắt tất cả"
|
||||
|
||||
#: searx/templates/simple/preferences/engines.html:25
|
||||
msgid "!bang"
|
||||
|
@ -1232,11 +1232,11 @@ msgstr "Thời gian tối đa"
|
|||
|
||||
#: searx/templates/simple/preferences/favicon.html:2
|
||||
msgid "Favicon Resolver"
|
||||
msgstr ""
|
||||
msgstr "Bộ phân giải biểu tượng web"
|
||||
|
||||
#: searx/templates/simple/preferences/favicon.html:15
|
||||
msgid "Display favicons near search results"
|
||||
msgstr ""
|
||||
msgstr "Hiển thị biểu tượng web gần kết quả tìm kiếm"
|
||||
|
||||
#: searx/templates/simple/preferences/footer.html:2
|
||||
msgid ""
|
||||
|
|
Loading…
Reference in New Issue