15 Commits

Author SHA1 Message Date
Bnyro fd42d4fda1 [fix] chatnoir: don't re-use/cache session keys
They're invalidated very quickly, so even caching them for
60 seconds results in a lot of unauthorized access errors.
2026-06-20 21:52:14 +02:00
dependabot[bot] 5c38d2feab [upd] web-client (simple): Bump @types/node in /client/simple (#6290)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.9.3 to 26.0.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 16:58:47 +02:00
dependabot[bot] 38b678c493 [upd] github-actions: Bump actions/checkout from 6.0.3 to 7.0.0 (#6288)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 16:58:27 +02:00
github-actions[bot] fe1848673f [l10n] update translations from Weblate (#6293)
0f1c1d570 - 2026-06-18 - lugged9922 <lugged9922@noreply.codeberg.org>
81d208307 - 2026-06-18 - Raithlin <raithlin@noreply.codeberg.org>
bf09069e8 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
c010ba929 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
f92ba4e98 - 2026-06-17 - M Alif fadlan <maliffadlan@gmail.com>
442e504e2 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
e2ffb2275 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
cc26d0794 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
9639f4e84 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
63059d4e7 - 2026-06-15 - AndersNordh <andersnordh@noreply.codeberg.org>
460c5260f - 2026-06-15 - kratos <makesocialfoss32@keemail.me>
b212184d9 - 2026-06-16 - ghose <ghose@noreply.codeberg.org>
c9ac8e6d7 - 2026-06-15 - AndersNordh <andersnordh@noreply.codeberg.org>
cc1f5ab59 - 2026-06-15 - Fjuro <fjuro@noreply.codeberg.org>
84f985a9f - 2026-06-14 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
bdb7e25bc - 2026-06-13 - SomeTr <sometr@noreply.codeberg.org>
c3eac4c37 - 2026-06-14 - Stephan-P <stephan-p@noreply.codeberg.org>
d94ab494b - 2026-06-13 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
3387bab27 - 2026-06-13 - gallegonovato <gallegonovato@noreply.codeberg.org>
2026-06-19 15:11:48 +02:00
Bnyro 8b10095e8a [fix] settings.yml: explicitely set category for xpath engines (ayo, gabanza, zapmeta, abcnyheter) (#6282) 2026-06-19 09:10:27 +02:00
Jayant Sharma b5ef7ec8f3 [fix] calculator: move math.parse inside try-catch (#6278) (#6280)
* [fix] calculator: move math.parse inside try-catch (#6278)

* build static

---------

Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2026-06-18 17:36:47 +02:00
Bnyro bd73cc09ea [feat] engines: add support for search.ch/web (Swiss) 2026-06-18 14:02:52 +02:00
Butui Hu 4dfdc822cf [fix] engines: chinaso: handle empty upstream results gracefully (#6266)
Signed-off-by: Hu Butui <hot123tea123@gmail.com>
2026-06-17 19:36:22 +02:00
Ivan Gabaldon 502c820a25 [fix] container: setup minimal (#6268)
Start minimal, use defaults, and extend later on. The templates are no longer
checked for changes, which was confusing and annoying after a while.

See: https://github.com/searxng/searxng/issues/6261#issuecomment-4716008282
2026-06-16 15:32:47 +02:00
Markus Heiser 4fb49b4498 [chore] add DeprecationWarning for obsolete engine.about.language property (#6265)
The old property should still be supported for a transitional period; the
reasons for this can be seen from the discussion in [1] / the further procedure
is also discussed there.

[1] https://github.com/searxng/searxng/issues/6261

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-16 10:31:21 +02:00
Markus Heiser cf1410af8d [fix] set language_support for engines with languages in traits (#6258)
In the past, the engine option ``language_support`` was not consistently
maintained; with this patch, a ValueError is now thrown if an engine has
languages in its traits but language_support is not set to True.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-15 10:52:00 +02:00
Markus Heiser 6c9dcd4242 [chore] complete and normalize the attributes of engine objects (#6258)
Drop outdated engine attributes: supported_languages, language_aliases

Complete, normalize and document the type definitions for the engine-module and
engine-class.

For the ``engine.about`` section of the configuration, a type check is performed
based on structure ``searx.enginelib.EngineAbout``.

The property ``engine.about.language`` no longer exists; existing values have
been migrated to ``engine.language``.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-15 10:52:00 +02:00
Bnyro b3e08f2a44 [feat] engines: add searchzee engine (general, news)
The results seem to be from Brave (i.e. they are exactly
the same). But it doesn't have any strict rate-limits,
so that's nice.

News support time ranges, but apart from that, unfortunately it doesn't
support any advanced features like safesearch or languages.
2026-06-14 09:59:39 +02:00
Bnyro a857041afc [feat] engines: add support for search.ayo.de 2026-06-14 09:32:58 +02:00
Bnyro 31a8a22aa6 [feat] engines: add German tonline engine (general, news, images, videos) (#6250)
T-Online_ is a German news portal.

It gets its web results from Google, image results from Flickr and videos results
from YouTube.

For images and videos, it additionally returns result from its
news catalog. However, for pagination we have to specify the result
type (e.g. either videos from YouTube or from T-Online), so we use
flickr/youtube there instead of tonline because the tonline results
are usually irrelevant.
2026-06-14 08:46:07 +02:00
199 changed files with 2190 additions and 1461 deletions
+1
View File
@@ -1,5 +1,6 @@
*
!container/*.template.*
!container/entrypoint.sh
!searx/**
!requirements*.txt
+3 -3
View File
@@ -78,7 +78,7 @@ jobs:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
fetch-depth: "0"
@@ -141,7 +141,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
@@ -175,7 +175,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
+1 -1
View File
@@ -46,7 +46,7 @@ jobs:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
+1 -1
View File
@@ -37,7 +37,7 @@ jobs:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
fetch-depth: "0"
+2 -2
View File
@@ -39,7 +39,7 @@ jobs:
python-version: "${{ matrix.python-version }}"
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
@@ -67,7 +67,7 @@ jobs:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
+2 -2
View File
@@ -40,7 +40,7 @@ jobs:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
token: "${{ secrets.WEBLATE_GITHUB_TOKEN }}"
fetch-depth: "0"
@@ -88,7 +88,7 @@ jobs:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
token: "${{ secrets.WEBLATE_GITHUB_TOKEN }}"
fetch-depth: "0"
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
+8 -8
View File
@@ -16,7 +16,7 @@
},
"devDependencies": {
"@biomejs/biome": "2.5.0",
"@types/node": "^25.9.3",
"@types/node": "^26.0.0",
"browserslist": "^4.28.2",
"browserslist-to-esbuild": "^2.1.1",
"edge.js": "^6.5.1",
@@ -1570,13 +1570,13 @@
}
},
"node_modules/@types/node": {
"version": "25.9.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.3.tgz",
"integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==",
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.0.tgz",
"integrity": "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": ">=7.24.0 <7.24.7"
"undici-types": "~8.3.0"
}
},
"node_modules/@types/pluralize": {
@@ -4515,9 +4515,9 @@
}
},
"node_modules/undici-types": {
"version": "7.24.6",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
"integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
"integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
"dev": true,
"license": "MIT"
},
+1 -1
View File
@@ -30,7 +30,7 @@
},
"devDependencies": {
"@biomejs/biome": "2.5.0",
"@types/node": "^25.9.3",
"@types/node": "^26.0.0",
"browserslist": "^4.28.2",
"browserslist-to-esbuild": "^2.1.1",
"edge.js": "^6.5.1",
+1 -1
View File
@@ -77,9 +77,9 @@ export default class Calculator extends Plugin {
protected async run(): Promise<string | undefined> {
const searchInput = getElement<HTMLInputElement>("q");
const node = Calculator.math.parse(searchInput.value);
try {
const node = Calculator.math.parse(searchInput.value);
return `${node.toString()} = ${node.evaluate()}`;
} catch {
// not a compatible math expression
+1 -4
View File
@@ -21,8 +21,6 @@ RUN --mount=type=cache,id=uv,target=/root/.cache/uv set -eux -o pipefail; \
COPY --exclude=./searx/version_frozen.py ./searx/ ./searx/
ARG TIMESTAMP_SETTINGS="0"
RUN set -eux -o pipefail; \
python -m compileall -q -f -j 0 --invalidation-mode=unchecked-hash ./searx/; \
find ./searx/static/ -type f \
@@ -30,5 +28,4 @@ RUN set -eux -o pipefail; \
-exec gzip -9 -k {} + \
-exec brotli -9 -k {} + \
-exec gzip --test {}.gz + \
-exec brotli --test {}.br +; \
touch -c --date="@$TIMESTAMP_SETTINGS" ./searx/settings.yml
-exec brotli --test {}.br +
+9 -30
View File
@@ -77,43 +77,23 @@ volume_handler() {
setup_ownership "$target" "directory"
}
# Handle configuration file updates
config_handler() {
local target="$1"
local template="$2"
local new_template_target="$target.new"
setup() {
local template_settings="/usr/local/searxng/settings.template.yml"
local target_settings="$__SEARXNG_CONFIG_PATH/settings.yml"
# Create/Update the configuration file
if [ -f "$target" ]; then
setup_ownership "$target" "file"
if [ "$template" -nt "$target" ]; then
cp -pfT "$template" "$new_template_target"
cat <<EOF
...
... INFORMATION
... Update available for "$target"
... It is recommended to update the configuration file to ensure proper functionality
...
... New version placed at "$new_template_target"
... Please review and merge changes
...
EOF
fi
else
if [ ! -f "$target_settings" ]; then
cat <<EOF
...
... INFORMATION
... "$target" does not exist, creating from template...
... "$target_settings" does not exist, creating from template...
...
EOF
cp -pfT "$template" "$target"
cp -pfT "$template_settings" "$target_settings"
sed -i "s/ultrasecretkey/$(head -c 24 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9')/g" "$target"
sed -i "s/ultrasecretkey/$(head -c 24 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9')/g" "$target_settings"
fi
check_file "$target"
check_file "$target_settings"
}
cat <<EOF
@@ -124,8 +104,7 @@ EOF
volume_handler "$__SEARXNG_CONFIG_PATH"
volume_handler "$__SEARXNG_DATA_PATH"
# Check for files
config_handler "$__SEARXNG_SETTINGS_PATH" "/usr/local/searxng/searx/settings.yml"
setup
# root only features
if [ "$(id -u)" -eq 0 ]; then
+8
View File
@@ -0,0 +1,8 @@
# Read the documentation before extending the defaults:
# https://docs.searxng.org/admin/settings/
use_default_settings: true
server:
secret_key: "ultrasecretkey"
image_proxy: true
+2 -2
View File
@@ -58,8 +58,8 @@ Configured Engines
{% for mod in engines %}
* - `{{mod.name}} <{{mod.about and mod.about.website}}>`_
{%- if mod.about and mod.about.language %}
({{mod.about.language | upper}})
{%- if mod.language %}
({{mod.language | upper}})
{%- endif %}
- ``!{{mod.shortcut}}``
- {%- if 'searx.engines.' + mod.__name__ in documented_modules %}
+80 -63
View File
@@ -41,7 +41,7 @@ if t.TYPE_CHECKING:
from searx.enginelib.traits import EngineTraits
from searx.extended_types import SXNG_Response
from searx.result_types import EngineResults
from searx.search.processors import OfflineParamTypes, OnlineParamTypes
from searx.search.processors import OfflineParamTypes, OnlineParamTypes, ProcessorType
ENGINES_CACHE: ExpireCacheSQLite = ExpireCacheSQLite.build_cache(
ExpireCacheCfg(
@@ -180,7 +180,7 @@ class EngineCache:
return ENGINES_CACHE.secret_hash(name=name)
class EngineAbout(msgspec.Struct):
class EngineAbout(msgspec.Struct, kw_only=True):
"""Additional fields describing the engine.
.. code:: yaml
@@ -213,20 +213,25 @@ class EngineAbout(msgspec.Struct):
results: str = ""
"""Data format of the source (online-engines: of the response)."""
language: str = ""
"""If the engine supports only one language, this language is specified
here (``en``, ``de``, ``"no"`` or ..); otherwise, the value remains empty.
description: str = ""
"""Brief description of the engine and where it gets its data from.
For the YAML configuration: think of the `YAML-Norway problem
<https://ruuda.nl/2023/the-yaml-document-from-hell#the-norway-problem>`_
This value should only be set as long as no description of the data source
is available via a :py:obj:`EngineAbout.wikidata_id`.
"""
language: str = ""
"""Deprecated! Migrate your setting from `engine.about.language` to
`engine.language`"""
class Engine(abc.ABC): # pylint: disable=too-few-public-methods
"""Class of engine instances build from YAML settings.
Further documentation see :ref:`general engine configuration`.
The defaults are taken from :py:obj:`searx.engines.ENGINE_DEFAULT_ARGS`.
.. hint::
This class is currently never initialized and only used for type hinting.
@@ -234,49 +239,27 @@ class Engine(abc.ABC): # pylint: disable=too-few-public-methods
logger: logging.Logger
# Common options in the engine module
# Common options of the engine module
engine_type: str
engine_type: "ProcessorType" = "online"
"""Type of the engine (:ref:`searx.search.processors`)"""
paging: bool
paging: bool = False
"""Engine supports multiple pages."""
max_page: int = 0
"""If the engine supports paging, then this is the value for the last page
that is still supported. ``0`` means unlimited numbers of pages."""
time_range_support: bool
time_range_support: bool = False
"""Engine supports search time range."""
safesearch: bool
safesearch: bool = False
"""Engine supports SafeSearch"""
language_support: bool
language_support: bool = False
"""Engine supports languages (locales) search."""
language: str
"""For an engine, when there is ``language: ...`` in the YAML settings the engine
does support only this one language:
.. code:: yaml
- name: google french
engine: google
language: fr
"""
region: str
"""For an engine, when there is ``region: ...`` in the YAML settings the engine
does support only this one region::
.. code:: yaml
- name: google belgium
engine: google
region: fr-BE
"""
fetch_traits: "Callable[[EngineTraits, bool], None]"
"""Function to to fetch engine's traits from origin."""
@@ -285,9 +268,6 @@ class Engine(abc.ABC): # pylint: disable=too-few-public-methods
# settings.yml
categories: list[str]
"""Specifies to which :ref:`engine categories` the engine should be added."""
name: str
"""Name that will be used across SearXNG to define this engine. In settings, on
the result page .."""
@@ -297,6 +277,43 @@ class Engine(abc.ABC): # pylint: disable=too-few-public-methods
this search engine (file name from :origin:`searx/engines` without
``.py``)."""
categories: list[str] = ["general"]
"""Specifies to which :ref:`engine categories` the engine should be added."""
language: str = ""
"""If the engine supports only one language, this language is specified here
(``en``, ``de``, ``"no"`` or ..); otherwise, the value remains empty. For
the YAML configuration: think of the `YAML-Norway problem
<https://ruuda.nl/2023/the-yaml-document-from-hell#the-norway-problem>`_
.. code:: yaml
- name: google norway
engine: google
language: "no"
Depending on ``language_support``, this value has similar but also slightly
different meanings.
- When ``language_support`` is **true**, the map of
:py:obj:`traits.EngineTraits.languages` is reduced to the selected
language
- When ``language_support`` is **false**, then the implementation of the
engine only supports this one ``language``
"""
region: str = ""
"""For an engine, when there is ``region: ...`` in the YAML settings the engine
does support only this one region::
.. code:: yaml
- name: google belgium
engine: google
region: fr-BE
"""
enable_http: bool
"""Enable HTTP (by default only HTTPS is enabled)."""
@@ -309,6 +326,31 @@ class Engine(abc.ABC): # pylint: disable=too-few-public-methods
display_error_messages: bool
"""Display error messages on the web UI."""
disabled: bool = False
"""To disable by default the engine, but not deleting it. It will allow the
user to manually activate it in the settings."""
inactive: bool = False
"""Remove the engine from the settings (*disabled & removed*)."""
about: EngineAbout = EngineAbout()
"""Additional fields describing the engine."""
using_tor_proxy: bool = False
"""Using tor proxy (``true``) or not (``false``) for this engine."""
send_accept_language_header: bool = True
"""When this option is activated (default), the language (locale) that is
selected by the user is used to build and send a ``Accept-Language`` header
in the request to the origin search engine."""
tokens: list[str] = []
"""A list of secret tokens to make this engine *private*, more details see
:ref:`private engines`."""
weight: float = 1.0
"""Weighting of the results of this engine (:ref:`weight <settings engines>`)."""
proxies: dict[str, dict[str, str]]
"""Set proxies for a specific engine (YAML):
@@ -319,31 +361,6 @@ class Engine(abc.ABC): # pylint: disable=too-few-public-methods
https: socks5://proxy:port
"""
disabled: bool
"""To disable by default the engine, but not deleting it. It will allow the
user to manually activate it in the settings."""
inactive: bool
"""Remove the engine from the settings (*disabled & removed*)."""
about: EngineAbout
"""Additional fields describing the engine."""
using_tor_proxy: bool
"""Using tor proxy (``true``) or not (``false``) for this engine."""
send_accept_language_header: bool
"""When this option is activated (default), the language (locale) that is
selected by the user is used to build and send a ``Accept-Language`` header
in the request to the origin search engine."""
tokens: list[str]
"""A list of secret tokens to make this engine *private*, more details see
:ref:`private engines`."""
weight: int
"""Weighting of the results of this engine (:ref:`weight <settings engines>`)."""
def setup(self, engine_settings: dict[str, t.Any]) -> bool: # pylint: disable=unused-argument
"""Dynamic setup of the engine settings.
+15 -12
View File
@@ -142,11 +142,11 @@ class EngineTraits:
"""
if self.data_type == "traits_v1":
self._set_traits_v1(engine)
self._set_traits_v1(engine) # pyright: ignore[reportArgumentType]
else:
raise TypeError("engine traits of type %s is unknown" % self.data_type)
def _set_traits_v1(self, engine: "Engine | types.ModuleType") -> None:
def _set_traits_v1(self, engine: "Engine") -> None:
# For an engine, when there is `language: ...` in the YAML settings the engine
# does support only this one language (region)::
#
@@ -159,22 +159,25 @@ class EngineTraits:
_msg = "settings.yml - engine: '%s' / %s: '%s' not supported"
languages = traits.languages
if hasattr(engine, "language"):
if engine.language not in languages:
raise ValueError(_msg % (engine.name, "language", engine.language))
traits.languages = {engine.language: languages[engine.language]}
if engine.language:
if engine.language_support:
if not len(traits.languages) > 1:
raise ValueError(
f"engine {engine.name}: activated language_support with just one or less languages"
)
if engine.language not in traits.languages:
raise ValueError(_msg % (engine.name, "language", engine.language))
traits.languages = {engine.language: traits.languages[engine.language]}
regions = traits.regions
if hasattr(engine, "region"):
if engine.region not in regions:
if engine.region:
if engine.region not in traits.regions:
raise ValueError(_msg % (engine.name, "region", engine.region))
traits.regions = {engine.region: regions[engine.region]}
traits.regions = {engine.region: traits.regions[engine.region]}
engine.language_support = bool(traits.languages or traits.regions)
# set the copied & modified traits in engine's namespace
engine.traits = traits # pyright: ignore[reportAttributeAccessIssue]
engine.traits = traits
class EngineTraitsMap(dict[str, EngineTraits]):
+1 -1
View File
@@ -22,8 +22,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "HTML",
"language": "zh",
}
language = "zh"
# Engine Configuration
categories = ["general"]
+6 -6
View File
@@ -5,19 +5,19 @@ intended monkey patching of the engine modules.
.. attention::
Monkey-patching modules is a practice from the past that shouldn't be
expanded upon. In the long run, there should be an engine class that can be
inherited. However, as long as this class doesn't exist, and as long as all
engine modules aren't converted to an engine class, these builtin types will
still be needed.
expanded upon. In the long run, engines should be instances of
:py:obj:`searx.enginelib.Engine`. However, as long as long as all engine
modules aren't converted to this class, these builtin types will still be
needed.
"""
import logging
from searx.enginelib import traits as _traits
logger: logging.Logger
supported_languages: str
language_aliases: str
language_support: bool
language: str
region: str
traits: _traits.EngineTraits
# from searx.engines.ENGINE_DEFAULT_ARGS
+46 -8
View File
@@ -14,40 +14,48 @@ import sys
import copy
import os
from os.path import realpath, dirname
import warnings
import types
import inspect
import msgspec
from searx import logger, settings
from searx.utils import load_module
if t.TYPE_CHECKING:
from searx.enginelib import Engine
from searx.data import ENGINE_TRAITS
from searx.enginelib import Engine, EngineAbout
logger = logger.getChild('engines')
ENGINE_DIR = dirname(realpath(__file__))
# Defaults for the namespace of an engine module, see load_engine()
ENGINE_DEFAULT_ARGS: dict[str, int | str | list[t.Any] | dict[str, t.Any] | bool] = {
ENGINE_DEFAULT_ARGS: dict[str, t.Any] = {
# Common options in the engine module
"engine_type": "online",
"paging": False,
"max_page": 0,
"time_range_support": False,
"safesearch": False,
"language_support": False,
# settings.yml
"categories": ["general"],
"language": "",
"region": "",
"enable_http": False,
"shortcut": "-",
"timeout": settings["outgoing"]["request_timeout"],
"display_error_messages": True,
"disabled": False,
"inactive": False,
"about": {},
"about": EngineAbout(),
"using_tor_proxy": False,
"send_accept_language_header": True,
"tokens": [],
"max_page": 0,
"weight": 1.0,
}
"""Default values that are set in an engine of type *module*, please compare
with the class :py:obj:`searx.enginelib.Engine`."""
# set automatically when an engine does not have any tab category
DEFAULT_CATEGORY = 'other'
@@ -177,14 +185,41 @@ def set_loggers(engine: "Engine|types.ModuleType", engine_name: str):
def update_engine_attributes(engine: "Engine | types.ModuleType", engine_data: dict[str, t.Any]):
# pylint: disable=too-many-branches
# set engine attributes from engine_data
kvargs: dict[str, t.Any]
if isinstance(engine.about, EngineAbout):
kvargs = {**msgspec.to_builtins(engine.about), **engine_data.get("about", {})}
else:
kvargs = {**engine.about, **engine_data.get("about", {})}
try:
engine.about = EngineAbout(**kvargs)
except TypeError as exc:
raise TypeError(
f"engine '{engine_data['name']}' ({engine_data['engine']}) - in the about section --> {exc}"
) from exc
# warn about deprecated engine settings
if engine.about.language:
if hasattr(engine, "language") and not engine.language:
engine.language = engine.about.language
warnings.warn(
f"engine '{engine_data['name']}' ({engine_data['engine']})"
f" - migrate engine.about.language to engine.language!",
DeprecationWarning,
2,
)
for param_name, param_value in engine_data.items():
if param_name == "about":
continue
if param_name == 'categories':
if isinstance(param_value, str):
param_value = list(map(str.strip, param_value.split(',')))
engine.categories = param_value # type: ignore
elif hasattr(engine, 'about') and param_name == 'about':
engine.about = {**engine.about, **engine_data['about']} # type: ignore
else:
setattr(engine, param_name, param_value)
@@ -193,6 +228,9 @@ def update_engine_attributes(engine: "Engine | types.ModuleType", engine_data: d
if not hasattr(engine, arg_name):
setattr(engine, arg_name, copy.deepcopy(arg_value))
if ENGINE_TRAITS.get(engine.name, {}).get("languages") and not engine.language_support:
raise ValueError(f"engine '{engine.name}' ({engine_data['engine']}) language_support should be set to True")
def update_attributes_for_tor(engine: "Engine | types.ModuleType"):
if using_tor_proxy(engine) and hasattr(engine, 'onion_url'):
+1 -1
View File
@@ -16,12 +16,12 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "HTML",
"language": "zh",
}
# Engine Configuration
categories = ["videos"]
paging = True
language = "zh"
# Base URL
base_url = "https://www.acfun.cn"
+1
View File
@@ -64,6 +64,7 @@ about: dict[str, t.Any] = {
# engine dependent config
categories = ["files", "books"]
paging: bool = True
language_support = True
# search-url
base_url: list[str] | str = []
+1 -1
View File
@@ -42,8 +42,8 @@ about = {
'use_official_api': False,
'require_api_key': False,
'results': 'HTML',
'language': 'it',
}
language = "it"
def request(query, params):
+1
View File
@@ -35,6 +35,7 @@ about = {
categories = ["it", "software wikis"]
paging = True
main_wiki = "wiki.archlinux.org"
language_support = True
def request(query, params):
+1 -1
View File
@@ -54,8 +54,8 @@ about = {
"use_official_api": True,
"require_api_key": True,
"results": "JSON",
"language": "en",
}
language = "en"
CACHE: EngineCache
"""Persistent (SQLite) key/value cache that deletes its values after ``expire``
+1 -1
View File
@@ -23,8 +23,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "JSON",
"language": "zh",
}
language = "zh"
paging = True
categories = []
+1
View File
@@ -34,6 +34,7 @@ about = {
categories = ["general", "social media"]
paging = True
time_range_support = True
language_support = True
base_url = "https://boardreader.com"
time_range_map = {"day": "1", "week": "7", "month": "30", "year": "365"}
+1 -1
View File
@@ -13,8 +13,8 @@ about = {
'use_official_api': False,
'require_api_key': False,
'results': 'JSON',
'language': 'de',
}
language = "de"
paging = True
categories = ['general']
-19
View File
@@ -14,7 +14,6 @@ from searx.extended_types import SXNG_Response
from searx.network import get, post
from searx.result_types import EngineResults
from searx.utils import html_to_text
from searx.enginelib import EngineCache
if t.TYPE_CHECKING:
from searx.search.processors import OnlineParams
@@ -42,21 +41,7 @@ search_index = "cw22"
<https://www.chatnoir.eu/docs/api-general>`_ for a full list."""
CACHE: EngineCache
"""Cache to store session info (i.e. api key, csrf token, session id)."""
def setup(engine_settings: dict[str, t.Any]) -> bool:
global CACHE # pylint: disable=global-statement
CACHE = EngineCache(engine_settings["name"])
return True
def _obtain_api_key() -> tuple[str, str, str]:
cached_session = CACHE.get("session")
if cached_session:
return tuple(cached_session.split("|"))
home_resp = get(base_url)
if not home_resp.ok:
raise SearxEngineAPIException("failed to obtain api key")
@@ -76,10 +61,6 @@ def _obtain_api_key() -> tuple[str, str, str]:
session_id = token_resp.cookies["sessionid"]
scraped_api_key = token_resp.json()["token"]["token"]
# session keys seem to become rate-limited very fast, so only remembering
# for 1 minute here
CACHE.set("session", f"{csrf_token}|{session_id}|{scraped_api_key}", expire=60)
return csrf_token, session_id, scraped_api_key
+1 -1
View File
@@ -10,8 +10,8 @@ about = {
'use_official_api': False,
'require_api_key': False,
'results': 'JSON',
'language': 'de',
}
language = "de"
paging = True
categories = []
+8 -1
View File
@@ -70,13 +70,13 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "JSON",
"language": "zh",
}
paging = True
time_range_support = True
results_per_page = 10
categories = []
language = "zh"
ChinasoCategoryType = t.Literal['news', 'videos', 'images']
"""ChinaSo supports news, videos, images search.
@@ -156,6 +156,13 @@ def response(resp):
except Exception as e:
raise SearxEngineAPIException(f"Invalid response: {e}") from e
# Upstream returns {'status': 0, 'msg': 'empty result', 'data': {}} when there
# are no results; this is a valid empty result rather than an API error.
if not isinstance(data, dict) or "data" not in data:
raise SearxEngineAPIException("Invalid response")
if not data["data"]:
return []
parsers = {'news': parse_news, 'images': parse_images, 'videos': parse_videos}
return parsers[chinaso_category](data)
+1
View File
@@ -40,6 +40,7 @@ categories = ["videos"]
paging = True
page_size = 10
language_support = True
time_range_support = True
time_delta_dict = {
"day": timedelta(days=1),
+6 -8
View File
@@ -24,7 +24,7 @@ import typing as t
import json
from searx.result_types import EngineResults
from searx.enginelib import EngineCache
from searx.enginelib import EngineCache, EngineAbout
if t.TYPE_CHECKING:
from searx.search.processors import RequestParams
@@ -35,13 +35,11 @@ categories = ["general"]
disabled = True
timeout = 2.0
about = {
"wikidata_id": None,
"official_api_documentation": None,
"use_official_api": False,
"require_api_key": False,
"results": "JSON",
}
language = "en"
about = EngineAbout(
results="JSON",
description="Demo offline engine Engine with results in the English language.",
)
# if there is a need for globals, use a leading underline
_my_offline_engine: str = ""
+9 -8
View File
@@ -25,6 +25,7 @@ import typing as t
from urllib.parse import urlencode
from searx.result_types import EngineResults
from searx.enginelib import EngineAbout
if t.TYPE_CHECKING:
from searx.extended_types import SXNG_Response
@@ -43,14 +44,14 @@ page_size = 20
search_api = "https://api.artic.edu/api/v1/artworks/search"
image_api = "https://www.artic.edu/iiif/2/"
about = {
"website": "https://www.artic.edu",
"wikidata_id": "Q239303",
"official_api_documentation": "http://api.artic.edu/docs/",
"use_official_api": True,
"require_api_key": False,
"results": "JSON",
}
about = EngineAbout(
website="https://www.artic.edu",
wikidata_id="Q239303",
official_api_documentation="http://api.artic.edu/docs/",
use_official_api=True,
require_api_key=False,
results="JSON",
)
# if there is a need for globals, use a leading underline
+1 -1
View File
@@ -11,8 +11,8 @@ about = {
'use_official_api': False,
'require_api_key': False,
'results': 'HTML',
'language': 'de',
}
language = "de"
categories = []
paging = True
+1
View File
@@ -203,6 +203,7 @@ about: dict[str, str | bool] = {
categories: list[str] = ["general", "web"]
paging: bool = True
time_range_support: bool = True
language_support = True
safesearch: bool = True
"""DDG-lite: user can't select but the results are filtered."""
+1
View File
@@ -28,6 +28,7 @@ about = {
"require_api_key": False,
"results": "JSON (site requires js to get images)",
}
language_support = True
# engine dependent config
categories = []
+1
View File
@@ -26,6 +26,7 @@ about = {
"require_api_key": False,
"results": "JSON",
}
language_support = True
# engine dependent config
categories = ["weather"]
+1 -1
View File
@@ -14,8 +14,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": 'HTML',
"language": 'de',
}
language = "de"
categories = ['dictionaries']
paging = True
+1 -1
View File
@@ -55,7 +55,7 @@ about = {
'official_api_documentation': 'https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html',
'use_official_api': True,
'require_api_key': False,
'format': 'JSON',
"results": "JSON",
}
base_url = 'http://localhost:9200'
+1 -1
View File
@@ -27,8 +27,8 @@ about = {
'official_api_documentation': None,
'require_api_key': False,
'results': 'HTML',
'language': 'de',
}
language = "de"
paging = True
categories = ['shopping']
+1
View File
@@ -57,6 +57,7 @@ max_page = 50
.. _Google max 50 pages: https://github.com/searxng/searxng/issues/2982
"""
time_range_support = True
language_support = True
safesearch = True
time_range_dict = {"day": "d", "week": "w", "month": "m", "year": "y"}
+1
View File
@@ -43,6 +43,7 @@ max_page = 50
"""
time_range_support = True
language_support = True
safesearch = True
filter_mapping = {0: 'images', 1: 'active', 2: 'active'}
+1
View File
@@ -66,6 +66,7 @@ about = {
categories = ["news"]
paging = False
time_range_support = False
language_support = True
# Google-News results are always *SafeSearch*. Option 'safesearch' is set to
# False here.
+1 -1
View File
@@ -34,8 +34,8 @@ about = {
"use_official_api": True,
"require_api_key": False,
"results": "JSON",
"language": "it",
}
language = "it"
def request(query, params):
+1 -1
View File
@@ -16,8 +16,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": 'HTML',
"language": 'fr',
}
language = "fr"
# engine dependent config
categories = ['videos']
+1 -1
View File
@@ -14,9 +14,9 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "JSON",
"language": "zh",
}
language = "zh"
paging = True
time_range_support = True
categories = ["videos"]
+3 -3
View File
@@ -13,8 +13,8 @@ about = {
"use_official_api": True,
"require_api_key": False,
"results": 'JSON',
"language": 'ja',
}
language = "ja"
categories = ['dictionaries']
paging = False
@@ -110,8 +110,8 @@ def get_infobox(alt_forms, result_url, definitions):
# definitions
infobox_content.append(
'''
<small><a href="https://www.edrdg.org/wiki/index.php/JMdict-EDICT_Dictionary_Project">JMdict</a>
and <a href="https://www.edrdg.org/enamdict/enamdict_doc.html">JMnedict</a>
<small><a href="https://www.edrdg.org/wiki/index.php/JMdict-EDICT_Dictionary_Project">JMdict</a>
and <a href="https://www.edrdg.org/enamdict/enamdict_doc.html">JMnedict</a>
by <a href="https://www.edrdg.org/edrdg/licence.html">EDRDG</a>, CC BY-SA 3.0.</small>
<ul>
'''
+3
View File
@@ -79,6 +79,9 @@ from json import loads
from urllib.parse import urlencode
from searx.utils import to_string, html_to_text
from searx.network import raise_for_httperror
from searx.enginelib import EngineAbout
about = EngineAbout()
search_url = None
"""
+1 -1
View File
@@ -11,9 +11,9 @@ about = {
"use_official_api": True,
"require_api_key": False,
"results": 'JSON',
"language": "de",
}
language = "de"
categories = ['videos']
paging = True
time_range_support = False
+1
View File
@@ -20,6 +20,7 @@ about = {
}
paging = True # paging is only supported for general search
safesearch = True
language_support = True
time_range_support = True # time range search is supported for general and news
max_page = 10
+2 -1
View File
@@ -35,8 +35,9 @@ about = {
'use_official_api': False,
'require_api_key': False,
'results': 'JSON',
'language': 'de',
}
language = "de"
paging = True
categories = ["movies"]
+1 -1
View File
@@ -26,8 +26,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "HTML",
"language": "ko",
}
language = "ko"
categories = []
paging = True
+1 -1
View File
@@ -13,8 +13,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "HTML",
"language": "ja",
}
language = "ja"
categories = ["videos"]
paging = True
+1
View File
@@ -26,6 +26,7 @@ about = {
# Engine configuration
paging = True
time_range_support = True
language_support = True
results_per_page = 20
categories = ["videos"]
+1
View File
@@ -25,6 +25,7 @@ about = {
"require_api_key": False,
"results": "JSON",
}
language_support = True
# engine dependent config
categories = ["videos"]
+2 -2
View File
@@ -28,7 +28,7 @@ search_string = 'api/?{query}&limit={limit}'
result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}'
# list of supported languages
supported_languages = ['de', 'en', 'fr', 'it']
photon_supported_languages = ["de", "en", "fr", "it"]
# do search-request
@@ -37,7 +37,7 @@ def request(query, params):
if params['language'] != 'all':
language = params['language'].split('_')[0]
if language in supported_languages:
if language in photon_supported_languages:
params['url'] = params['url'] + "&lang=" + language
# using SearXNG User-Agent
+1 -1
View File
@@ -77,7 +77,7 @@ from searx.utils import gen_useragent, html_to_text, parse_duration_string
about = {
"website": "https://presearch.io",
"wikidiata_id": "Q7240905",
"wikidata_id": "Q7240905",
"official_api_documentation": "https://docs.presearch.io/nodes/api",
"use_official_api": False,
"require_api_key": False,
+1 -1
View File
@@ -16,8 +16,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "HTML",
"language": "zh",
}
language = "zh"
# Engine Configuration
categories = []
+1
View File
@@ -26,6 +26,7 @@ about = {
"require_api_key": False,
"results": "JSON",
}
language_support = True
paging = True
categories = ["music", "radio"]
+1 -1
View File
@@ -13,8 +13,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": 'JSON',
'language': 'fr',
}
language = "fr"
categories = ['movies']
paging = True
+1
View File
@@ -25,6 +25,7 @@ about = {
"require_api_key": False,
"results": 'JSON',
}
language_support = True
# engine dependent config
categories = ['videos']
+1 -1
View File
@@ -19,8 +19,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "HTML",
"language": "cz",
}
language = "cz"
categories = ['general', 'web']
base_url = 'https://search.seznam.cz/'
+1 -1
View File
@@ -16,8 +16,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "HTML",
"language": "zh",
}
language = "zh"
# Engine Configuration
categories = ["general"]
+1 -1
View File
@@ -11,8 +11,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "JSON",
"language": "zh",
}
language = "zh"
categories = ["videos"]
paging = True
+1 -1
View File
@@ -14,8 +14,8 @@ about = {
"use_official_api": False,
"require_api_key": False,
"results": "HTML",
"language": "zh",
}
language = "zh"
# Engine Configuration
categories = ["news"]
+1
View File
@@ -131,6 +131,7 @@ max_page = 18
"""Tested 18 pages maximum (argument ``page``), to be save max is set to 20."""
time_range_support = True
language_support = True
safesearch = True
time_range_dict = {"day": "d", "week": "w", "month": "m", "year": "y"}
+2 -1
View File
@@ -27,8 +27,9 @@ about = {
'use_official_api': True,
'require_api_key': False,
'results': 'JSON',
'language': 'de',
}
language = "de"
categories = ['general', 'news']
paging = True
+148
View File
@@ -0,0 +1,148 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""T-Online_ is a German news portal, which is powered by Ströer, a German
advertising company, not by Deutsche Telekom (contrary to its name).
It gets its web results from Google, image results from Flickr and videos
results from YouTube.
.. _T-Online: https://www.t-online.de/
"""
import typing as t
from urllib.parse import urlencode
from lxml import html
from searx.utils import eval_xpath_list, eval_xpath, extract_text, get_embeded_stream_url, ElementType
from searx.result_types import EngineResults
from searx.enginelib import EngineAbout
if t.TYPE_CHECKING:
from searx.extended_types import SXNG_Response
from searx.search.processors import OnlineParams
about = EngineAbout(
website="https://www.t-online.de",
wikidata_id="Q590940",
results="HTML",
)
paging = True
time_range_support = True
base_url = "https://suche.t-online.de"
tonline_categ = "web"
"""Supported categories are ``web``, ``videos``, ``news`` and ``images``."""
time_range_map = {"day": "d", "week": "w", "month": "m", "year": "y"}
# result provider has to be specified during pagination, pagination can alternatively
# use "tonline" to only search for results from t-online news articles
tonline_channel_map = {"images": "flickr", "videos": "yt"}
language = "de"
def init(_):
if tonline_categ not in ("web", "images", "videos", "news"):
raise ValueError("invalid category: %s" % tonline_categ)
def request(query: str, params: "OnlineParams") -> None:
# "mandant", "dia" and "ptl" are not needed, but this might reduce changes of captchas
args = {"q": query, "mandant": "toi", "dia": "suche", "ptl": "std"}
if params["time_range"]:
args["age"] = time_range_map[params["time_range"]]
if params["pageno"] > 1 and tonline_categ in tonline_channel_map:
ch = tonline_channel_map[tonline_categ]
args["ch"] = ch
args[f"{ch}_page"] = str(params["pageno"])
else:
args["page"] = str(params["pageno"])
params["url"] = f"{base_url}/{tonline_categ}?{urlencode(args)}"
def _general_results(doc: ElementType, res: EngineResults):
result: ElementType
for result in eval_xpath_list(doc, "//div[@id='google_re']/div[contains(@class, 'doc')]"):
(
res.add(
res.types.MainResult(
url=extract_text(eval_xpath(result, "./a/@href") or ""),
title=extract_text(eval_xpath(result, ".//span[contains(@class, 'tMMReshl')]") or "") or "",
content=extract_text(eval_xpath(result, ".//div[contains(@class, 'tMMRest')]") or "") or "",
),
)
)
suggestion: ElementType
for suggestion in eval_xpath_list(doc, "//div[starts-with(@class, 'rsbl')]/a"):
res.add(res.types.LegacyResult({"suggestion": extract_text(suggestion)}))
def _image_results(doc: ElementType, res: EngineResults):
result: ElementType
for result in eval_xpath_list(doc, "//div[@class='doc']"):
(
res.add(
res.types.Image(
url=extract_text(eval_xpath(result, "./a/@href") or ""),
title=extract_text(eval_xpath(result, ".//div[contains(@class, 'doc_info')]") or "") or "",
thumbnail_src=extract_text(eval_xpath(result, ".//img/@src") or "") or "",
),
)
)
def _news_results(doc: ElementType, res: EngineResults):
result: ElementType
title_parts: list[ElementType]
for result in eval_xpath_list(doc, "//div[@id='portal_re']/div[contains(@class, 'doc')]"):
title_parts = eval_xpath(result, ".//a[starts-with(@class, 'tMMReshl')]")
(
res.add(
res.types.MainResult(
url=extract_text(eval_xpath(result, "(./a/@href)[1]") or ""),
title=" - ".join(extract_text(part) or "" for part in title_parts),
content=extract_text(eval_xpath(result, ".//div[contains(@class, 'tMMRest')]") or "") or "",
thumbnail=extract_text(eval_xpath(result, ".//img[contains(@class, 'desk')]/@src") or "") or "",
),
)
)
def _video_results(doc: ElementType, res: EngineResults):
result: ElementType
for result in eval_xpath_list(doc, "//div[@class='doc']"):
url: str | None = extract_text(eval_xpath(result, "./a/@href") or "")
if url is None:
continue
title_parts: list[ElementType] = eval_xpath(result, ".//a[starts-with(@class, 'tMMReshl')]")
res.add(
res.types.LegacyResult(
template="videos.html",
url=url,
title=" - ".join(extract_text(part) or "" for part in title_parts),
thumbnail=extract_text(eval_xpath(result, ".//img/@src") or "") or "",
iframe_src=get_embeded_stream_url(url) or "",
)
)
def response(resp: "SXNG_Response") -> EngineResults:
doc = html.fromstring(resp.text)
res = EngineResults()
match tonline_categ:
case "web":
_general_results(doc, res)
case "news":
_news_results(doc, res)
case "images":
_image_results(doc, res)
case "videos":
_video_results(doc, res)
case _:
raise ValueError("invalid category: %s" % tonline_categ)
return res
+1
View File
@@ -40,6 +40,7 @@ about = {
"require_api_key": False,
"results": 'JSON',
}
language_support = True
display_type = ["infobox"]
"""A list of display types composed from ``infobox`` and ``list``. The latter
+1
View File
@@ -72,6 +72,7 @@ about = {
"require_api_key": False,
"results": "JSON",
}
language_support = True
display_type = ["infobox"]
"""A list of display types composed from ``infobox`` and ``list``. The latter
+4 -1
View File
@@ -76,6 +76,9 @@ from lxml import html
from searx.utils import extract_text, extract_url, eval_xpath, eval_xpath_list
from searx.network import raise_for_httperror
from searx.result_types import EngineResults
from searx.enginelib import EngineAbout
about = EngineAbout()
search_url = None
"""
@@ -289,7 +292,7 @@ def response(resp) -> EngineResults: # pylint: disable=too-many-branches
if results_xpath:
for result in eval_xpath_list(dom, results_xpath):
url = extract_url(eval_xpath_list(result, url_xpath, min_len=1), search_url)
url = extract_url(eval_xpath(result, url_xpath), search_url)
title = extract_text(eval_xpath_list(result, title_xpath, min_len=1))
content = extract_text(eval_xpath_list(result, content_xpath))
tmp_result = {'url': url, 'title': title, 'content': content}
+1
View File
@@ -22,6 +22,7 @@ about = {
"require_api_key": False,
"results": "JSON",
}
language_support = True
base_url = "https://api.yep.com"
web_base_url = "https://yep.com"
+1
View File
@@ -61,6 +61,7 @@ about: dict[str, t.Any] = {
categories: list[str] = ["files", "books"]
paging: bool = True
language_support = True
base_url: str = "https://zlibrary-global.se"
zlib_year_from: str = ""
+9
View File
@@ -11,6 +11,7 @@ __all__ = [
"PROCESSORS",
"ParamTypes",
"RequestParams",
"ProcessorType",
]
import typing as t
@@ -27,6 +28,14 @@ from .online_url_search import OnlineUrlSearchProcessor, OnlineUrlSearchParams
logger = logger.getChild("search.processors")
ProcessorType = t.Literal[
"offline",
"online",
"online_currency",
"online_dictionary",
"online_url_search",
]
OnlineParamTypes: t.TypeAlias = OnlineParams | OnlineDictParams | OnlineCurrenciesParams | OnlineUrlSearchParams
OfflineParamTypes: t.TypeAlias = RequestParams
ParamTypes: t.TypeAlias = OfflineParamTypes | OnlineParamTypes
+116 -4
View File
@@ -322,6 +322,7 @@ engines:
- name: abcnyheter
engine: xpath
categories: general
paging: true
search_url: https://startsiden.abcnyheter.no/sok/?q={query}&page={pageno}
shortcut: abc
@@ -330,12 +331,12 @@ engines:
url_xpath: ./a/@href
title_xpath: ./a/h3
content_xpath: ./div
language: "no"
about:
website: https://abcnyheter.no
use_official_api: false
require_api_key: false
results: HTML
language: "no"
- name: acfun
engine: acfun
@@ -491,6 +492,23 @@ engines:
engine: arxiv
shortcut: arx
- name: ayo
engine: xpath
categories: general
shortcut: ayo
search_url: https://search.ayo.de/search?q={query}
results_xpath: //div[contains(@class, 'search-result')]/div
url_xpath: .//a/@href
title_xpath: .//h3
content_xpath: .//p
suggestion_xpath: .//a[starts-with(@href, "https://search.ayo.de")]
disabled: true
about:
website: https://serach.ayo.de
use_official_api: false
require_api_key: false
results: HTML
- name: azure
engine: azure
shortcut: az
@@ -1063,6 +1081,7 @@ engines:
- name: gabanza
engine: xpath
categories: general
search_url: https://www.gabanza.com/search?query={query}
shortcut: gab
timeout: 4
@@ -2313,6 +2332,36 @@ engines:
shortcut: tm
disabled: true
- name: tonline
engine: tonline
shortcut: tol
disabled: true
inactive: true
- name: tonline images
engine: tonline
categories: images
tonline_categ: images
shortcut: toli
disabled: true
inactive: true
- name: tonline videos
engine: tonline
categories: videos
tonline_categ: videos
shortcut: tolv
disabled: true
inactive: true
- name: tonline news
engine: tonline
categories: news
tonline_categ: news
shortcut: toln
disabled: true
inactive: true
# Requires Tor
- name: torch
engine: xpath
@@ -2762,13 +2811,13 @@ engines:
shortcut: rel
categories: general
disabled: true
language: de
about:
website: https://reloado.com
official_api_documentation:
use_official_api: false
require_api_key: false
results: HTML
language: de
- name: repology
engine: repology
@@ -2790,6 +2839,68 @@ engines:
shortcut: rehi
disabled: true
- name: searchch
engine: xpath
shortcut: sch
paging: true
search_url: https://search.ch/web/api/loadmore.html?path=/web/&q={query}&page={pageno}
results_xpath: //div[contains(@class, 'www-feed-web-result')]
# the URL looks like "//search.ch/web/r/redirect?...result!uffe8997e781e241d/https://example.com"
url_xpath: concat('https://', substring-after(.//a[contains(@class, 'sl-gus-result-url')]/@href, '://'))
title_xpath: .//a[contains(@class, 'sl-gus-result-title')]
content_xpath: .//div[contains(@class, 'sl-gus-result-body')]
language: "ch"
disabled: true
about:
website: https://search.ch/web
description: "Swiss search engine with its own Swiss index"
use_official_api: false
require_api_key: false
results: HTML
- name: searchzee
engine: json_engine
search_url: https://searchzee.com/api/search?q={query}&type=web&offset={pageno}
paging: true
first_page_num: 0
results_query: results
url_query: url
title_query: title
content_query: summary
content_html_to_text: true
categories: general
shortcut: sz
disabled: true
inactive: true
about:
website: https://searchzee.com
use_official_api: false
require_api_key: false
results: JSON
- name: searchzee news
engine: json_engine
search_url: https://searchzee.com/api/search?q={query}&type=news&offset={pageno}{time_range}
paging: true
first_page_num: 0
time_range_support: true
time_range_url: "&freshness={time_range_val}"
time_range_map:
day: pd
week: pw
month: pm
year: py
results_query: results
url_query: url
title_query: title
content_query: summary
thumbnail_query: thumbnail
content_html_to_text: true
categories: news
shortcut: sznw
disabled: true
inactive: true
- name: swisscows
engine: swisscows
categories: general
@@ -2838,13 +2949,13 @@ engines:
content_xpath: //div[@class="synonyms-list-group"]
title_xpath: //div[@class="upper-synonyms"]/a
no_result_for_http_status: [404]
language: de
about:
website: https://www.woxikon.de/
wikidata_id: # No Wikidata ID
use_official_api: false
require_api_key: false
results: HTML
language: de
- name: tootfinder
engine: tootfinder
@@ -2899,13 +3010,13 @@ engines:
content_xpath: //li/div[@class="searchresult"]
categories: general
disabled: true
language: fr
about:
website: https://wikimini.org/
wikidata_id: Q3568032
use_official_api: false
require_api_key: false
results: HTML
language: fr
- name: wttr.in
engine: wttr
@@ -2915,6 +3026,7 @@ engines:
- name: zapmeta
engine: xpath
shortcut: zpm
categories: general
search_url: https://www.zapmeta.com/search?q={query}&pg={pageno}
results_xpath: //article[contains(@class, "organic-results-item")]
url_xpath: ./h2/a/@href
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -77,7 +77,7 @@
]
},
"src/js/plugin/Calculator.ts": {
"file": "chunk/DDL5uWMz.min.js",
"file": "chunk/CTP0QVHn.min.js",
"name": "calculator",
"src": "src/js/plugin/Calculator.ts",
"isDynamicEntry": true,
+2 -2
View File
@@ -1,3 +1,3 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./chunk/U6YV4Y8e.min.js","./sxng-mapview.min.css","./chunk/DpvWr1cn.min.js","./chunk/DK4yUVpy.min.js","./chunk/DcK-mo-Y.min.js","./chunk/DDL5uWMz.min.js","./chunk/C93hSkpT.min.js","./chunk/5Ako-qGW.min.js","./chunk/DvCYLbJr.min.js","./chunk/B8prKeWj.min.js","./chunk/e2-9fzwE.min.js"])))=>i.map(i=>d[i]);
var e=class{id;constructor(e){this.id=e,queueMicrotask(()=>this.invoke())}async invoke(){try{console.debug(`[PLUGIN] ${this.id}: Running...`);let e=await this.run();if(!e)return;console.debug(`[PLUGIN] ${this.id}: Running post-exec...`),await this.post(e)}catch(e){console.error(`[PLUGIN] ${this.id}:`,e)}finally{console.debug(`[PLUGIN] ${this.id}: Done.`)}}},t={index:`index`,results:`results`,preferences:`preferences`,unknown:`unknown`},n={closeDetail:void 0,scrollPageToSelected:void 0,selectImage:void 0,selectNext:void 0,selectPrevious:void 0},r=()=>{let e=document.querySelector(`meta[name="endpoint"]`)?.getAttribute(`content`);return e&&e in t?e:t.unknown},i=()=>{let e=document.querySelector(`script[client_settings]`)?.getAttribute(`client_settings`);if(!e)return{};try{return JSON.parse(atob(e))}catch(e){return console.error(`Failed to load client_settings:`,e),{}}},a=async(e,t,n)=>{let r=new AbortController,i=setTimeout(()=>r.abort(),n?.timeout??3e4),a=await fetch(t,{body:n?.body,method:e,signal:r.signal}).finally(()=>clearTimeout(i));if(!a.ok)throw Error(a.statusText);return a},o=(e,t,n,r)=>{if(typeof t!=`string`){t.addEventListener(e,n,r);return}document.addEventListener(e,e=>{for(let r of e.composedPath())if(r instanceof HTMLElement&&r.matches(t)){try{n.call(r,e)}catch(e){console.error(e)}break}},r)},s=(e,t)=>{for(let e of t?.on??[])if(!e)return;document.readyState===`loading`?o(`DOMContentLoaded`,document,e,{once:!0}):e()},c=r(),l=i(),u=(e,t)=>{d(t)&&e()},d=e=>{switch(e.on){case`global`:return!0;case`endpoint`:return!!e.where.includes(c)}},f=`modulepreload`,p=function(e,t){return new URL(e,t).href},m={},h=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=p(t,n),t in m)return;m[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:f,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};s(()=>{document.documentElement.classList.remove(`no-js`),document.documentElement.classList.add(`js`),o(`click`,`.close`,function(){this.parentNode?.classList.add(`invisible`)}),o(`click`,`.searxng_init_map`,async function(e){e.preventDefault(),this.classList.remove(`searxng_init_map`),u(()=>h(async()=>{let{default:e}=await import(`./chunk/U6YV4Y8e.min.js`);return{default:e}},__vite__mapDeps([0,1]),import.meta.url).then(({default:e})=>new e(this)),{on:`endpoint`,where:[t.results]})}),l.plugins?.includes(`infiniteScroll`)&&u(()=>h(async()=>{let{default:e}=await import(`./chunk/DpvWr1cn.min.js`);return{default:e}},__vite__mapDeps([2,3,4]),import.meta.url).then(({default:e})=>new e),{on:`endpoint`,where:[t.results]}),l.plugins?.includes(`calculator`)&&u(()=>h(async()=>{let{default:e}=await import(`./chunk/DDL5uWMz.min.js`);return{default:e}},__vite__mapDeps([5,4,3]),import.meta.url).then(({default:e})=>new e),{on:`endpoint`,where:[t.results]})}),s(()=>{h(()=>import(`./chunk/C93hSkpT.min.js`),__vite__mapDeps([6,3]),import.meta.url),h(()=>import(`./chunk/5Ako-qGW.min.js`),__vite__mapDeps([7,4,3]),import.meta.url),l.autocomplete&&h(()=>import(`./chunk/DvCYLbJr.min.js`),__vite__mapDeps([8,3]),import.meta.url)},{on:[c===t.index]}),s(()=>{h(()=>import(`./chunk/C93hSkpT.min.js`),__vite__mapDeps([6,3]),import.meta.url),h(()=>import(`./chunk/B8prKeWj.min.js`),__vite__mapDeps([9,3]),import.meta.url),h(()=>import(`./chunk/5Ako-qGW.min.js`),__vite__mapDeps([7,4,3]),import.meta.url),l.autocomplete&&h(()=>import(`./chunk/DvCYLbJr.min.js`),__vite__mapDeps([8,3]),import.meta.url)},{on:[c===t.results]}),s(()=>{h(()=>import(`./chunk/e2-9fzwE.min.js`),__vite__mapDeps([10,3]),import.meta.url)},{on:[c===t.preferences]});export{e as a,l as i,o as n,n as r,a as t};
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./chunk/U6YV4Y8e.min.js","./sxng-mapview.min.css","./chunk/DpvWr1cn.min.js","./chunk/DK4yUVpy.min.js","./chunk/DcK-mo-Y.min.js","./chunk/CTP0QVHn.min.js","./chunk/C93hSkpT.min.js","./chunk/5Ako-qGW.min.js","./chunk/DvCYLbJr.min.js","./chunk/B8prKeWj.min.js","./chunk/e2-9fzwE.min.js"])))=>i.map(i=>d[i]);
var e=class{id;constructor(e){this.id=e,queueMicrotask(()=>this.invoke())}async invoke(){try{console.debug(`[PLUGIN] ${this.id}: Running...`);let e=await this.run();if(!e)return;console.debug(`[PLUGIN] ${this.id}: Running post-exec...`),await this.post(e)}catch(e){console.error(`[PLUGIN] ${this.id}:`,e)}finally{console.debug(`[PLUGIN] ${this.id}: Done.`)}}},t={index:`index`,results:`results`,preferences:`preferences`,unknown:`unknown`},n={closeDetail:void 0,scrollPageToSelected:void 0,selectImage:void 0,selectNext:void 0,selectPrevious:void 0},r=()=>{let e=document.querySelector(`meta[name="endpoint"]`)?.getAttribute(`content`);return e&&e in t?e:t.unknown},i=()=>{let e=document.querySelector(`script[client_settings]`)?.getAttribute(`client_settings`);if(!e)return{};try{return JSON.parse(atob(e))}catch(e){return console.error(`Failed to load client_settings:`,e),{}}},a=async(e,t,n)=>{let r=new AbortController,i=setTimeout(()=>r.abort(),n?.timeout??3e4),a=await fetch(t,{body:n?.body,method:e,signal:r.signal}).finally(()=>clearTimeout(i));if(!a.ok)throw Error(a.statusText);return a},o=(e,t,n,r)=>{if(typeof t!=`string`){t.addEventListener(e,n,r);return}document.addEventListener(e,e=>{for(let r of e.composedPath())if(r instanceof HTMLElement&&r.matches(t)){try{n.call(r,e)}catch(e){console.error(e)}break}},r)},s=(e,t)=>{for(let e of t?.on??[])if(!e)return;document.readyState===`loading`?o(`DOMContentLoaded`,document,e,{once:!0}):e()},c=r(),l=i(),u=(e,t)=>{d(t)&&e()},d=e=>{switch(e.on){case`global`:return!0;case`endpoint`:return!!e.where.includes(c)}},f=`modulepreload`,p=function(e,t){return new URL(e,t).href},m={},h=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=p(t,n),t in m)return;m[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:f,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};s(()=>{document.documentElement.classList.remove(`no-js`),document.documentElement.classList.add(`js`),o(`click`,`.close`,function(){this.parentNode?.classList.add(`invisible`)}),o(`click`,`.searxng_init_map`,async function(e){e.preventDefault(),this.classList.remove(`searxng_init_map`),u(()=>h(async()=>{let{default:e}=await import(`./chunk/U6YV4Y8e.min.js`);return{default:e}},__vite__mapDeps([0,1]),import.meta.url).then(({default:e})=>new e(this)),{on:`endpoint`,where:[t.results]})}),l.plugins?.includes(`infiniteScroll`)&&u(()=>h(async()=>{let{default:e}=await import(`./chunk/DpvWr1cn.min.js`);return{default:e}},__vite__mapDeps([2,3,4]),import.meta.url).then(({default:e})=>new e),{on:`endpoint`,where:[t.results]}),l.plugins?.includes(`calculator`)&&u(()=>h(async()=>{let{default:e}=await import(`./chunk/CTP0QVHn.min.js`);return{default:e}},__vite__mapDeps([5,4,3]),import.meta.url).then(({default:e})=>new e),{on:`endpoint`,where:[t.results]})}),s(()=>{h(()=>import(`./chunk/C93hSkpT.min.js`),__vite__mapDeps([6,3]),import.meta.url),h(()=>import(`./chunk/5Ako-qGW.min.js`),__vite__mapDeps([7,4,3]),import.meta.url),l.autocomplete&&h(()=>import(`./chunk/DvCYLbJr.min.js`),__vite__mapDeps([8,3]),import.meta.url)},{on:[c===t.index]}),s(()=>{h(()=>import(`./chunk/C93hSkpT.min.js`),__vite__mapDeps([6,3]),import.meta.url),h(()=>import(`./chunk/B8prKeWj.min.js`),__vite__mapDeps([9,3]),import.meta.url),h(()=>import(`./chunk/5Ako-qGW.min.js`),__vite__mapDeps([7,4,3]),import.meta.url),l.autocomplete&&h(()=>import(`./chunk/DvCYLbJr.min.js`),__vite__mapDeps([8,3]),import.meta.url)},{on:[c===t.results]}),s(()=>{h(()=>import(`./chunk/e2-9fzwE.min.js`),__vite__mapDeps([10,3]),import.meta.url)},{on:[c===t.preferences]});export{e as a,l as i,o as n,n as r,a as t};
//# sourceMappingURL=sxng-core.min.js.map
@@ -60,8 +60,8 @@
{%- endif -%}
<label for="{{ engine_id }}">
{{- ' ' -}}{{- search_engine.name -}}
{%- if search_engine.about and search_engine.about.language -%}
{{- ' ' -}}({{search_engine.about.language | upper}})
{%- if search_engine.language -%}
{{- ' ' -}}({{search_engine.language | upper}})
{%- endif -%}
</label>
{{- engine_about(search_engine) -}}
Binary file not shown.
+36 -29
View File
@@ -17,22 +17,23 @@
# APoniatowski <aponiatowski@users.noreply.translate.codeberg.org>, 2025.
# French <french@noreply.codeberg.org>, 2025.
# return42 <return42@noreply.codeberg.org>, 2025, 2026.
# Raithlin <raithlin@noreply.codeberg.org>, 2025.
# Raithlin <raithlin@noreply.codeberg.org>, 2025, 2026.
# grumpyoldtechie <grumpyoldtechie@noreply.codeberg.org>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"PO-Revision-Date: 2026-05-25 10:44+0000\n"
"Last-Translator: grumpyoldtechie <grumpyoldtechie@noreply.codeberg.org>\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-06-19 05:08+0000\n"
"Last-Translator: Raithlin <raithlin@noreply.codeberg.org>\n"
"Language-Team: Afrikaans <https://translate.codeberg.org/projects/searxng/"
"searxng/af/>\n"
"Language: af\n"
"Language-Team: Afrikaans "
"<https://translate.codeberg.org/projects/searxng/searxng/af/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2026.6.1\n"
"Generated-By: Babel 2.18.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
@@ -76,7 +77,7 @@ msgid "videos"
msgstr "videos"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr "radio"
@@ -550,8 +551,8 @@ msgstr "geantwoord"
msgid "No item found"
msgstr "Geen item gevind"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr "Bron"
@@ -559,15 +560,15 @@ msgstr "Bron"
msgid "Error loading the next page"
msgstr "Fout met die laai van die volgende bladsy"
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "Ongeldige opstellings, redigeer asb jou voorkeure"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "Ongeldige opstellings"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "soekfout"
@@ -649,7 +650,7 @@ msgstr "Bereken {func} van die opsies"
#: searx/engines/boardreader.py:107
#, python-brace-format
msgid "Posted by {author}"
msgstr ""
msgstr "Geplaas deur {author}"
#: searx/engines/openstreetmap.py:155
msgid "Show route in map .."
@@ -664,19 +665,19 @@ msgstr "{title} (UITGEDIEN)"
msgid "This entry has been superseded by"
msgstr "Hierdie inskrywing was vervang deur"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr "Kanaal"
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr "bitsnelheid"
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr "stemme"
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr "klikke"
@@ -734,11 +735,11 @@ msgstr "Filter uit onion resultate wat op Ahmia se swartlys is."
#: searx/plugins/calculator.py:25
msgid "Calculator"
msgstr ""
msgstr "Sakrekenaar"
#: searx/plugins/calculator.py:26
msgid "Parses and solves mathematical expressions."
msgstr ""
msgstr "Ontleed en los wiskundige uitdrukkings op."
#: searx/plugins/hash_plugin.py:33
msgid "Hash plugin"
@@ -934,7 +935,7 @@ msgstr "sienings"
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr "Outeur"
@@ -1625,7 +1626,7 @@ msgid "This site did not provide any description."
msgstr "Hierdie webwerf het geen beskrywing verskaf nie."
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "Lêergrootte"
@@ -1643,21 +1644,25 @@ msgstr "Tik"
msgid "Download"
msgstr "Laai af"
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr "Resolusie"
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
msgstr "Formaat"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr "Beeldformate"
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr "oorspronklike formaat"
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr "Enjin"
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "Sien Bron"
msgstr "Bekyk bron"
#: searx/templates/simple/result_templates/map.html:12
msgid "address"
@@ -2159,3 +2164,5 @@ msgstr "versteek video"
#~ msgid "Number of results"
#~ msgstr "Aantal resultate"
#~ msgid "Format"
#~ msgstr "Formaat"
Binary file not shown.
+34 -27
View File
@@ -30,20 +30,19 @@
# mustafa-phd <mustafa-phd@noreply.codeberg.org>, 2026.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-05-27 12:07+0000\n"
"Last-Translator: mustafa-phd <mustafa-phd@noreply.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 2026.5\n"
"Generated-By: Babel 2.18.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
@@ -87,7 +86,7 @@ msgid "videos"
msgstr "ڤيديوهات"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr "إذاعة"
@@ -561,8 +560,8 @@ msgstr "تمت الإجابة"
msgid "No item found"
msgstr "لم يتم العثور على عنصر"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr "مصدر"
@@ -570,15 +569,15 @@ msgstr "مصدر"
msgid "Error loading the next page"
msgstr "خطأ في تحميل الصفحة التالية"
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "إعدادات غير صالحة، يرجى تعديل تفضيلاتك"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "إعدادات غير صالحة"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "خطأ في البحث"
@@ -675,19 +674,19 @@ msgstr "{title} (قديم)"
msgid "This entry has been superseded by"
msgstr "تم استبدال هذا الإدخال بـ"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr "القناة"
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr "معدل البت"
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr "تصويتات"
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr "نقرات"
@@ -942,7 +941,7 @@ msgstr "المشاهدات"
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr "الكاتب"
@@ -993,8 +992,8 @@ msgid ""
"This is a preview of the settings used by the 'Search URL' you used to "
"get here."
msgstr ""
"هذه معاينة للإعدادات المستخدمة في 'عنوان URL للبحث' الذي استخدمته للوصول إلى "
"هنا."
"هذه معاينة للإعدادات المستخدمة في 'عنوان URL للبحث' الذي استخدمته للوصول "
"إلى هنا."
#: searx/templates/simple/preferences.html:158
msgid "Press save to copy these preferences to your browser."
@@ -1630,7 +1629,7 @@ msgid "This site did not provide any description."
msgstr "هذا الموقع لم يقدم أي وصف."
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "حجم الملف"
@@ -1648,19 +1647,23 @@ msgstr "نوع"
msgid "Download"
msgstr "تنزيل"
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr "الدقة"
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
msgstr "صيغة"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr ""
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr ""
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr "محرك"
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "عرض المصدر"
@@ -2396,3 +2399,7 @@ msgstr "إخفاء الفيديو"
#~ msgid "Number of results"
#~ msgstr "حصيلة نتائج البحث"
#~ msgid "Format"
#~ msgstr "صيغة"
Binary file not shown.
+26 -19
View File
@@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-05-19 12:07+0000\n"
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
"Language: bg\n"
@@ -76,7 +76,7 @@ msgid "videos"
msgstr "видео"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr "радио"
@@ -550,8 +550,8 @@ msgstr "Отговорено"
msgid "No item found"
msgstr "Не е намерен артикул"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr "Източник"
@@ -559,15 +559,15 @@ msgstr "Източник"
msgid "Error loading the next page"
msgstr "Грешка при зареждането на следващата страница"
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "Неправилни настройки, моля редактирайте предпочитанията си"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "Невалидни настройки"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "Грешка при търсенето"
@@ -664,19 +664,19 @@ msgstr "{title} (ОСТАРЯЛО)"
msgid "This entry has been superseded by"
msgstr "Този запис е заменен от"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr "Канал"
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr "Скорост"
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr "Гласове"
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr "клика"
@@ -929,7 +929,7 @@ msgstr "Изгледи"
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr "Автор"
@@ -1627,7 +1627,7 @@ msgid "This site did not provide any description."
msgstr "Този сайт не предостави никакво описание."
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "Размер на файла"
@@ -1645,19 +1645,23 @@ msgstr "Тип"
msgid "Download"
msgstr "Изтегляне"
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr "Резолюция"
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
msgstr "Формат"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr ""
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr ""
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr "Търсачка"
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "Покажи източник"
@@ -2397,3 +2401,6 @@ msgstr "скрий видеото"
#~ msgid "Number of results"
#~ msgstr "Брой резултати"
#~ msgid "Format"
#~ msgstr "Формат"
Binary file not shown.
+26 -19
View File
@@ -29,7 +29,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-05-19 12:07+0000\n"
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
"Language: bn\n"
@@ -82,7 +82,7 @@ msgid "videos"
msgstr "ভিডিও"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr "বেতার"
@@ -556,8 +556,8 @@ msgstr "উত্তরকৃত"
msgid "No item found"
msgstr "কোন আইটেম পাওয়া যায়নি"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr "উৎস"
@@ -565,15 +565,15 @@ msgstr "উৎস"
msgid "Error loading the next page"
msgstr "পরবর্তী পৃষ্ঠাটি লোড করায় ত্রুটি দেখা যাচ্ছে"
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "অকেজো সেটিংস, অনুগ্রহ করে আপনার পছন্দগুলি সম্পাদনা করুন"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "অকেজো সেটিংস"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "সার্চ ত্রুটি"
@@ -670,19 +670,19 @@ msgstr "{title} (অচল)"
msgid "This entry has been superseded by"
msgstr "এই এনট্রিটি দ্বারা বাতিল করা হয়েছে৷"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr "চ্যানেল"
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr "বিটরেট"
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr "ভোট"
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr "ক্লিক সংখ্যা"
@@ -936,7 +936,7 @@ msgstr "ভিউ"
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr "লেখক"
@@ -1619,7 +1619,7 @@ msgid "This site did not provide any description."
msgstr "এই সাইট কোন বিবরণ প্রদান করেনি।"
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "ফাইলের আকার"
@@ -1637,19 +1637,23 @@ msgstr "ধরন"
msgid "Download"
msgstr "ডাউনলোড"
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr "আকার"
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
msgstr "সজ্জা"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr ""
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr ""
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr "ইঞ্জিন"
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "উৎস দেখুন"
@@ -2155,3 +2159,6 @@ msgstr "ভিডিও লুকিয়ে ফেলুন"
#~ msgid "Number of results"
#~ msgstr "ফলাফলের সংখ্যা"
#~ msgid "Format"
#~ msgstr "সজ্জা"
Binary file not shown.
+25 -18
View File
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-05-19 12:07+0000\n"
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
"Language: bo\n"
@@ -66,7 +66,7 @@ msgid "videos"
msgstr "བརྙན་ཟློས།"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr ""
@@ -540,8 +540,8 @@ msgstr ""
msgid "No item found"
msgstr "རྣམ་གྲངས་གང་ཡང་རྙེད་རྒྱུ་མ་བྱུང་།"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr ""
@@ -549,15 +549,15 @@ msgstr ""
msgid "Error loading the next page"
msgstr ""
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།ཁྱེད་ཀྱིས་གདམ་ཀ་ལ་བཅོས་སྒྲིག་གཏོང་རོགས།"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "འཚོལ་བཤེར་ལ་ནོར་འཁྲུལ་བྱུང་།"
@@ -654,19 +654,19 @@ msgstr ""
msgid "This entry has been superseded by"
msgstr "འཚོལ་བྱང་འདི་གཞན་གྱིས་ཚབ་བྱེད་འདུག"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr ""
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr ""
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr ""
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr ""
@@ -903,7 +903,7 @@ msgstr ""
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr ""
@@ -1576,7 +1576,7 @@ msgid "This site did not provide any description."
msgstr ""
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "ཡིག་ཆའི་ཆེ་ཆུང་།"
@@ -1594,19 +1594,23 @@ msgstr ""
msgid "Download"
msgstr ""
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr ""
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr ""
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr ""
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr ""
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "ཡོངས་ཁུངས་ལ་ལྟ།"
@@ -2288,3 +2292,6 @@ msgstr "རྙན་ཟློས་སྦས།"
#~ msgid "Number of results"
#~ msgstr "འཚོལ་འབྲས་ཀྱི་ཁ་གྲངས།"
#~ msgid "Format"
#~ msgstr ""
Binary file not shown.
+31 -24
View File
@@ -29,18 +29,19 @@
# MaCl0wSt <macl0wst@noreply.codeberg.org>, 2026.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"PO-Revision-Date: 2026-05-19 12:07+0000\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-06-17 20:19+0000\n"
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
"Language-Team: Catalan <https://translate.codeberg.org/projects/searxng/"
"searxng/ca/>\n"
"Language: ca\n"
"Language-Team: Catalan "
"<https://translate.codeberg.org/projects/searxng/searxng/ca/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2026.6.1\n"
"Generated-By: Babel 2.18.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
@@ -84,7 +85,7 @@ msgid "videos"
msgstr "vídeos"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr "radio"
@@ -558,8 +559,8 @@ msgstr "contestat"
msgid "No item found"
msgstr "No s'ha trobat cap element"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr "Origen"
@@ -567,15 +568,15 @@ msgstr "Origen"
msgid "Error loading the next page"
msgstr "S'ha produït un error en carregar la següent pàgina"
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "La configuració no és vàlida, editeu-la"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "La configuració no és vàlida"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "error de cerca"
@@ -672,19 +673,19 @@ msgstr "{title} (OBSOLET)"
msgid "This entry has been superseded by"
msgstr "Aquesta entrada ha estat substituïda per"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr "Canal"
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr "tasa de bits"
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr "vots"
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr "clics"
@@ -935,7 +936,7 @@ msgstr "Vistes"
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr "Autor"
@@ -1627,7 +1628,7 @@ msgid "This site did not provide any description."
msgstr "Aquest lloc no proporciona cap descripció."
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "Mida del fitxer"
@@ -1645,19 +1646,23 @@ msgstr "Tipus"
msgid "Download"
msgstr "Baixa"
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr "Resolució"
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
msgstr "Format"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr ""
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr "format original"
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr "Cercador"
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "Veure el codi font"
@@ -2417,3 +2422,5 @@ msgstr "oculta el vídeo"
#~ msgid "Number of results"
#~ msgstr "Nombre de resultats"
#~ msgid "Format"
#~ msgstr "Format"
Binary file not shown.
+32 -25
View File
@@ -25,19 +25,20 @@
# radekjuthner <radekjuthner@noreply.codeberg.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"PO-Revision-Date: 2026-03-26 03:57+0000\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-06-16 07:07+0000\n"
"Last-Translator: Fjuro <fjuro@noreply.codeberg.org>\n"
"Language-Team: Czech <https://translate.codeberg.org/projects/searxng/"
"searxng/cs/>\n"
"Language: cs\n"
"Language-Team: Czech "
"<https://translate.codeberg.org/projects/searxng/searxng/cs/>\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && "
"n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
"X-Generator: Weblate 2026.6.1\n"
"Generated-By: Babel 2.18.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
@@ -81,7 +82,7 @@ msgid "videos"
msgstr "videa"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr "rádio"
@@ -555,8 +556,8 @@ msgstr "zodpovězené"
msgid "No item found"
msgstr "Nic nenalezeno"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr "zdroj"
@@ -564,15 +565,15 @@ msgstr "zdroj"
msgid "Error loading the next page"
msgstr "Chyba při načítání další stránky"
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "Neplatné nastavení, upravte své předvolby"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "Neplatné nastavení"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "chyba vyhledávání"
@@ -669,19 +670,19 @@ msgstr "{title} (ZASTARALÉ)"
msgid "This entry has been superseded by"
msgstr "Tato položka byla nahrazena položkou"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr "Kanál"
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr "datový tok"
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr "hlasy"
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr "kliknutí"
@@ -936,7 +937,7 @@ msgstr "Zhlédnutí"
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr "Autor"
@@ -1628,7 +1629,7 @@ msgid "This site did not provide any description."
msgstr "Tato stránka nemá žádný popis."
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "Velikost"
@@ -1646,19 +1647,23 @@ msgstr "Typ"
msgid "Download"
msgstr "Stáhnout"
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr "Rozlišení"
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
msgstr "Formát"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr "Formáty obrázků"
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr "původní formát"
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr "Vyhledávač"
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "Zobrazit zdroj"
@@ -2403,3 +2408,5 @@ msgstr "skrýt video"
#~ msgid "Number of results"
#~ msgstr "Počet výsledků"
#~ msgid "Format"
#~ msgstr "Formát"
Binary file not shown.
+26 -19
View File
@@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-05-19 12:07+0000\n"
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
"Language: cy\n"
@@ -74,7 +74,7 @@ msgid "videos"
msgstr "fideos"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr "radio"
@@ -548,8 +548,8 @@ msgstr "wedi'i ateb"
msgid "No item found"
msgstr "Ni chanfuwyd eitem"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr "Ffynhonnell"
@@ -557,15 +557,15 @@ msgstr "Ffynhonnell"
msgid "Error loading the next page"
msgstr "Gwall wrth lwytho'r dudalen nesaf"
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "Gosodiadau annilys, golygwch eich dewisiadau"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "Gosodiadau annilys"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "gwall chwilio"
@@ -662,19 +662,19 @@ msgstr "{title} (OBSOLETE)"
msgid "This entry has been superseded by"
msgstr "Mae'r cofnod hwn wedi ei ddisodli gan"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr "Sianel"
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr "cyfradd didau"
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr "pleidleisiau"
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr "cliciau"
@@ -926,7 +926,7 @@ msgstr ""
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr "Awdur"
@@ -1608,7 +1608,7 @@ msgid "This site did not provide any description."
msgstr "Ni wnaeth y wefan ddarparu disgrifiad."
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "Maint ffeil"
@@ -1626,19 +1626,23 @@ msgstr "Math"
msgid "Download"
msgstr ""
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr "Cydraniad"
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
msgstr "Fformat"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr ""
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr ""
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr "Peiriant"
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "Gweld y ffynhonnell"
@@ -2356,3 +2360,6 @@ msgstr "cuddio'r fideo"
#~ msgid "Number of results"
#~ msgstr "Nifer o ganlyniadau"
#~ msgid "Format"
#~ msgstr "Fformat"
Binary file not shown.
+32 -25
View File
@@ -17,18 +17,19 @@
# return42 <return42@noreply.codeberg.org>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"PO-Revision-Date: 2026-05-19 12:07+0000\n"
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-06-16 07:07+0000\n"
"Last-Translator: AndersNordh <andersnordh@noreply.codeberg.org>\n"
"Language-Team: Danish <https://translate.codeberg.org/projects/searxng/"
"searxng/da/>\n"
"Language: da\n"
"Language-Team: Danish "
"<https://translate.codeberg.org/projects/searxng/searxng/da/>\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 2026.6.1\n"
"Generated-By: Babel 2.18.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
@@ -72,7 +73,7 @@ msgid "videos"
msgstr "videoer"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr "Radio"
@@ -546,8 +547,8 @@ msgstr "svaret"
msgid "No item found"
msgstr "Intet fundet"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr "Kilde"
@@ -555,15 +556,15 @@ msgstr "Kilde"
msgid "Error loading the next page"
msgstr "Fejl ved indlæsning af den næste side"
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "Ugyldige indstillinger, redigér venligst dine valg"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "Ugyldig indstilling"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "søgefejl"
@@ -660,19 +661,19 @@ msgstr "{title} (FORÆLDET)"
msgid "This entry has been superseded by"
msgstr "Denne værdi er blevet overskrevet af"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr "Kanal"
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr "Bitrate"
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr "Stemmer"
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr "Klik"
@@ -930,7 +931,7 @@ msgstr "Visninger"
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr "Forfatter"
@@ -1624,7 +1625,7 @@ msgid "This site did not provide any description."
msgstr "Denne side gav ikke nogen beskrivelse."
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "Filstørrelse"
@@ -1642,19 +1643,23 @@ msgstr "Type"
msgid "Download"
msgstr "Download"
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr "Opløsning"
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
msgstr "Format"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr "Billedformater"
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr "originalt format"
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr "Maskine"
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "Vis kilde"
@@ -2412,3 +2417,5 @@ msgstr "skjul video"
#~ msgid "Number of results"
#~ msgstr "Antal resultater"
#~ msgid "Format"
#~ msgstr "Format"
Binary file not shown.
+32 -25
View File
@@ -32,18 +32,19 @@
# Serpensin <serpensin@noreply.codeberg.org>, 2026.
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-05-25 10:44+0000\n"
"PO-Revision-Date: 2026-03-26 03:57+0000\n"
"POT-Creation-Date: 2026-06-13 11:31+0000\n"
"PO-Revision-Date: 2026-06-17 20:19+0000\n"
"Last-Translator: return42 <return42@noreply.codeberg.org>\n"
"Language-Team: German <https://translate.codeberg.org/projects/searxng/"
"searxng/de/>\n"
"Language: de\n"
"Language-Team: German "
"<https://translate.codeberg.org/projects/searxng/searxng/de/>\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 2026.6.1\n"
"Generated-By: Babel 2.18.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING']
@@ -87,7 +88,7 @@ msgid "videos"
msgstr "Videos"
#. CATEGORY_NAMES['RADIO']
#: searx/engines/radio_browser.py:146 searx/searxng.msg
#: searx/engines/radio_browser.py:159 searx/searxng.msg
msgid "radio"
msgstr "Radio"
@@ -561,8 +562,8 @@ msgstr "beantwortet"
msgid "No item found"
msgstr "Keine Einträge gefunden"
#: searx/engines/qwant.py:291
#: searx/templates/simple/result_templates/images.html:23 searx/webapp.py:328
#: searx/engines/qwant.py:258
#: searx/templates/simple/result_templates/images.html:62 searx/webapp.py:328
msgid "Source"
msgstr "Quelle"
@@ -570,15 +571,15 @@ msgstr "Quelle"
msgid "Error loading the next page"
msgstr "Fehler beim Laden der nächsten Seite"
#: searx/webapp.py:479 searx/webapp.py:877
#: searx/webapp.py:478 searx/webapp.py:876
msgid "Invalid settings, please edit your preferences"
msgstr "Ungültige Einstellungen, bitte Einstellungen ändern"
#: searx/webapp.py:495
#: searx/webapp.py:494
msgid "Invalid settings"
msgstr "Ungültige Einstellungen"
#: searx/webapp.py:571 searx/webapp.py:661
#: searx/webapp.py:570 searx/webapp.py:660
msgid "search error"
msgstr "Suchfehler"
@@ -675,19 +676,19 @@ msgstr "{title} (OBSOLET)"
msgid "This entry has been superseded by"
msgstr "Dieser Eintrag wurde überschrieben von"
#: searx/engines/qwant.py:293
#: searx/engines/qwant.py:260
msgid "Channel"
msgstr "Kanal"
#: searx/engines/radio_browser.py:148
#: searx/engines/radio_browser.py:161
msgid "bitrate"
msgstr "Bitrate"
#: searx/engines/radio_browser.py:149
#: searx/engines/radio_browser.py:162
msgid "votes"
msgstr "Stimmen"
#: searx/engines/radio_browser.py:150
#: searx/engines/radio_browser.py:163
msgid "clicks"
msgstr "Clicks"
@@ -947,7 +948,7 @@ msgstr "Aufrufe"
#: searx/templates/simple/macros.html:43
#: searx/templates/simple/result_templates/file.html:18
#: searx/templates/simple/result_templates/images.html:19
#: searx/templates/simple/result_templates/images.html:52
#: searx/templates/simple/result_templates/paper.html:14
msgid "Author"
msgstr "Autor"
@@ -1635,7 +1636,7 @@ msgstr "Medien anzeigen"
#: searx/templates/simple/result_templates/default.html:6
#: searx/templates/simple/result_templates/file.html:54
msgid "hide media"
msgstr "Medien verstecken"
msgstr "Medien ausblenden"
#: searx/templates/simple/result_templates/default.html:14
#: searx/templates/simple/result_templates/videos.html:14
@@ -1643,7 +1644,7 @@ msgid "This site did not provide any description."
msgstr "Diese Seite besitzt keine Beschreibung."
#: searx/templates/simple/result_templates/file.html:30
#: searx/templates/simple/result_templates/images.html:22
#: searx/templates/simple/result_templates/images.html:61
#: searx/templates/simple/result_templates/torrent.html:18
msgid "Filesize"
msgstr "Dateigröße"
@@ -1661,19 +1662,23 @@ msgstr "Medium"
msgid "Download"
msgstr "Herunterladen"
#: searx/templates/simple/result_templates/images.html:20
#: searx/templates/simple/result_templates/images.html:53
msgid "Resolution"
msgstr "Auflösung"
#: searx/templates/simple/result_templates/images.html:21
msgid "Format"
msgstr "Format"
#: searx/templates/simple/result_templates/images.html:55
msgid "Image formats"
msgstr "Bildformate"
#: searx/templates/simple/result_templates/images.html:24
#: searx/templates/simple/result_templates/images.html:56
msgid "original format"
msgstr "Originalformat"
#: searx/templates/simple/result_templates/images.html:63
msgid "Engine"
msgstr "Suchmaschine"
#: searx/templates/simple/result_templates/images.html:25
#: searx/templates/simple/result_templates/images.html:64
msgid "View source"
msgstr "Seite besuchen"
@@ -2459,3 +2464,5 @@ msgstr "Video verstecken"
#~ msgid "Number of results"
#~ msgstr "Trefferanzahl"
#~ msgid "Format"
#~ msgstr "Format"

Some files were not shown because too many files have changed in this diff Show More