Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Arcane Spark 2024-07-19 07:20:53 +02:00
commit 3e9e39febb
38 changed files with 523 additions and 321 deletions

View file

@ -1,4 +1,4 @@
FROM alpine:3.19 FROM alpine:3.20
ENTRYPOINT ["/sbin/tini","--","/usr/local/searxng/dockerfiles/docker-entrypoint.sh"] ENTRYPOINT ["/sbin/tini","--","/usr/local/searxng/dockerfiles/docker-entrypoint.sh"]
EXPOSE 8080 EXPOSE 8080
VOLUME /etc/searxng VOLUME /etc/searxng

View file

@ -1,3 +1,5 @@
.. _searxng settings.yml:
======== ========
Settings Settings
======== ========

View file

@ -0,0 +1,13 @@
.. _alpinelinux engine:
=====================
Alpine Linux Packages
=====================
.. contents::
:depth: 2
:local:
:backlinks: entry
.. automodule:: searx.engines.alpinelinux
:members:

View file

@ -0,0 +1,8 @@
.. _searx.settings_loader:
===============
Settings Loader
===============
.. automodule:: searx.settings_loader
:members:

2
manage
View file

@ -54,7 +54,9 @@ fi
YAMLLINT_FILES=() YAMLLINT_FILES=()
while IFS= read -r line; do while IFS= read -r line; do
if [ "$line" != "tests/unit/settings/syntaxerror_settings.yml" ]; then
YAMLLINT_FILES+=("$line") YAMLLINT_FILES+=("$line")
fi
done <<< "$(git ls-files './tests/*.yml' './searx/*.yml' './utils/templates/etc/searxng/*.yml')" done <<< "$(git ls-files './tests/*.yml' './searx/*.yml' './utils/templates/etc/searxng/*.yml')"
RST_FILES=( RST_FILES=(

View file

@ -0,0 +1,83 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""`Alpine Linux binary packages`_. `Alpine Linux`_ is a Linux-based operation
system designed to be small, simple and secure. Contrary to many other Linux
distributions, it uses musl, BusyBox and OpenRC. Alpine is mostly used on
servers and for Docker images.
.. _Alpine Linux binary packages: https://pkgs.alpinelinux.org
.. _Alpine Linux: https://www.alpinelinux.org
"""
import re
from urllib.parse import urlencode
from lxml import html
from dateutil import parser
from searx.utils import eval_xpath, eval_xpath_list, extract_text
about = {
'website': 'https://www.alpinelinux.org',
'wikidata_id': 'Q4033826',
'use_official_api': False,
'official_api_documentation': None,
'require_api_key': False,
'results': 'HTML',
}
paging = True
categories = ['packages', 'it']
base_url = "https://pkgs.alpinelinux.org"
alpine_arch = 'x86_64'
"""Kernel architecture: ``x86_64``, ``x86``, ``aarch64``, ``armhf``,
``ppc64le``, ``s390x``, ``armv7`` or ``riscv64``"""
ARCH_RE = re.compile("x86_64|x86|aarch64|armhf|ppc64le|s390x|armv7|riscv64")
"""Regular expression to match supported architectures in the query string."""
def request(query, params):
query_arch = ARCH_RE.search(query)
if query_arch:
query_arch = query_arch.group(0)
query = query.replace(query_arch, '').strip()
args = {
# use wildcards to match more than just packages with the exact same
# name as the query
'name': f"*{query}*",
'page': params['pageno'],
'arch': query_arch or alpine_arch,
}
params['url'] = f"{base_url}/packages?{urlencode(args)}"
return params
def response(resp):
results = []
doc = html.fromstring(resp.text)
for result in eval_xpath_list(doc, "//table/tbody/tr"):
if len(result.xpath("./td")) < 9:
# skip non valid entries in the result table
# e.g the "No item found..." message
continue
results.append(
{
'template': 'packages.html',
'url': base_url + extract_text(eval_xpath(result, './td[contains(@class, "package")]/a/@href')),
'title': extract_text(eval_xpath(result, './td[contains(@class, "package")]')),
'package_name': extract_text(eval_xpath(result, './td[contains(@class, "package")]')),
'publishedDate': parser.parse(extract_text(eval_xpath(result, './td[contains(@class, "bdate")]'))),
'version': extract_text(eval_xpath(result, './td[contains(@class, "version")]')),
'homepage': extract_text(eval_xpath(result, './td[contains(@class, "url")]/a/@href')),
'maintainer': extract_text(eval_xpath(result, './td[contains(@class, "maintainer")]')),
'license_name': extract_text(eval_xpath(result, './td[contains(@class, "license")]')),
'tags': [extract_text(eval_xpath(result, './td[contains(@class, "repo")]'))],
}
)
return results

View file

@ -128,7 +128,14 @@ def request(query: str, params: dict):
def extract_result(dom_result: list[html.HtmlElement]): def extract_result(dom_result: list[html.HtmlElement]):
# Infoboxes sometimes appear in the beginning and will have a length of 0
if len(dom_result) == 3:
[a_elem, h3_elem, p_elem] = dom_result [a_elem, h3_elem, p_elem] = dom_result
elif len(dom_result) == 4:
[_, a_elem, h3_elem, p_elem] = dom_result
else:
return None
return { return {
'url': extract_text(a_elem.text), 'url': extract_text(a_elem.text),
'title': extract_text(h3_elem), 'title': extract_text(h3_elem),
@ -139,9 +146,9 @@ def extract_result(dom_result: list[html.HtmlElement]):
def extract_results(search_results: html.HtmlElement): def extract_results(search_results: html.HtmlElement):
for search_result in search_results: for search_result in search_results:
dom_result = eval_xpath_list(search_result, 'div/div/*') dom_result = eval_xpath_list(search_result, 'div/div/*')
# sometimes an info box pops up, will need to filter that out result = extract_result(dom_result)
if len(dom_result) == 3: if result is not None:
yield extract_result(dom_result) yield result
def response(resp: Response): def response(resp: Response):

View file

@ -11,16 +11,12 @@ from typing import Any, Dict
import httpx import httpx
from httpx_socks import AsyncProxyTransport from httpx_socks import AsyncProxyTransport
from python_socks import parse_proxy_url, ProxyConnectionError, ProxyTimeoutError, ProxyError from python_socks import parse_proxy_url, ProxyConnectionError, ProxyTimeoutError, ProxyError
import uvloop
from searx import logger from searx import logger
# Optional uvloop (support Python 3.6)
try: uvloop.install()
import uvloop
except ImportError:
pass
else:
uvloop.install()
logger = logger.getChild('searx.network.client') logger = logger.getChild('searx.network.client')

View file

@ -96,7 +96,7 @@ from flask_babel import gettext
from searx import settings from searx import settings
from searx.plugins import logger from searx.plugins import logger
from searx.settings_loader import get_yaml_file from searx.settings_loader import get_yaml_cfg
name = gettext('Hostnames plugin') name = gettext('Hostnames plugin')
description = gettext('Rewrite hostnames, remove results or prioritize them based on the hostname') description = gettext('Rewrite hostnames, remove results or prioritize them based on the hostname')
@ -118,7 +118,7 @@ def _load_regular_expressions(settings_key):
# load external file with configuration # load external file with configuration
if isinstance(setting_value, str): if isinstance(setting_value, str):
setting_value = get_yaml_file(setting_value) setting_value = get_yaml_cfg(setting_value)
if isinstance(setting_value, list): if isinstance(setting_value, list):
return {re.compile(r) for r in setting_value} return {re.compile(r) for r in setting_value}
@ -163,10 +163,10 @@ def _matches_parsed_url(result, pattern):
def on_result(_request, _search, result): def on_result(_request, _search, result):
for pattern, replacement in replacements.items(): for pattern, replacement in replacements.items():
if _matches_parsed_url(result, pattern): if _matches_parsed_url(result, pattern):
logger.debug(result['url']) # logger.debug(result['url'])
result[parsed] = result[parsed]._replace(netloc=pattern.sub(replacement, result[parsed].netloc)) result[parsed] = result[parsed]._replace(netloc=pattern.sub(replacement, result[parsed].netloc))
result['url'] = urlunparse(result[parsed]) result['url'] = urlunparse(result[parsed])
logger.debug(result['url']) # logger.debug(result['url'])
for url_field in _url_fields: for url_field in _url_fields:
if not result.get(url_field): if not result.get(url_field):

View file

@ -325,6 +325,11 @@ engines:
shortcut: 9g shortcut: 9g
disabled: true disabled: true
- name: alpine linux packages
engine: alpinelinux
disabled: true
shortcut: alp
- name: annas archive - name: annas archive
engine: annas_archive engine: annas_archive
disabled: true disabled: true

View file

@ -1,68 +1,116 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
# pylint: disable=missing-module-docstring, too-many-branches """Implementations for loading configurations from YAML files. This essentially
includes the configuration of the (:ref:`SearXNG appl <searxng settings.yml>`)
server. The default configuration for the application server is loaded from the
:origin:`DEFAULT_SETTINGS_FILE <searx/settings.yml>`. This default
configuration can be completely replaced or :ref:`customized individually
<use_default_settings.yml>` and the ``SEARXNG_SETTINGS_PATH`` environment
variable can be used to set the location from which the local customizations are
to be loaded. The rules used for this can be found in the
:py:obj:`get_user_cfg_folder` function.
from typing import Optional - By default, local configurations are expected in folder ``/etc/searxng`` from
from os import environ where applications can load them with the :py:obj:`get_yaml_cfg` function.
from os.path import dirname, join, abspath, isfile
- By default, customized :ref:`SearXNG appl <searxng settings.yml>` settings are
expected in a file named ``settings.yml``.
"""
from __future__ import annotations
import os.path
from collections.abc import Mapping from collections.abc import Mapping
from itertools import filterfalse from itertools import filterfalse
from pathlib import Path
import yaml import yaml
from searx.exceptions import SearxSettingsException from searx.exceptions import SearxSettingsException
searx_dir = os.path.abspath(os.path.dirname(__file__))
searx_dir = abspath(dirname(__file__)) SETTINGS_YAML = Path("settings.yml")
DEFAULT_SETTINGS_FILE = Path(searx_dir) / SETTINGS_YAML
"""The :origin:`searx/settings.yml` file with all the default settings."""
def existing_filename_or_none(file_name: str) -> Optional[str]: def load_yaml(file_name: str | Path):
if isfile(file_name): """Load YAML config from a file."""
return file_name
return None
def load_yaml(file_name):
try: try:
with open(file_name, 'r', encoding='utf-8') as settings_yaml: with open(file_name, 'r', encoding='utf-8') as settings_yaml:
return yaml.safe_load(settings_yaml) return yaml.safe_load(settings_yaml) or {}
except IOError as e: except IOError as e:
raise SearxSettingsException(e, file_name) from e raise SearxSettingsException(e, str(file_name)) from e
except yaml.YAMLError as e: except yaml.YAMLError as e:
raise SearxSettingsException(e, file_name) from e raise SearxSettingsException(e, str(file_name)) from e
def get_yaml_file(file_name): def get_yaml_cfg(file_name: str | Path) -> dict:
path = existing_filename_or_none(join(searx_dir, file_name)) """Shortcut to load a YAML config from a file, located in the
if path is None:
raise FileNotFoundError(f"File {file_name} does not exist!")
return load_yaml(path) - :py:obj:`get_user_cfg_folder` or
- in the ``searx`` folder of the SearXNG installation
def get_default_settings_path():
return existing_filename_or_none(join(searx_dir, 'settings.yml'))
def get_user_settings_path() -> Optional[str]:
"""Get an user settings file.
By descending priority:
1. ``environ['SEARXNG_SETTINGS_PATH']``
2. ``/etc/searxng/settings.yml`` except if ``SEARXNG_DISABLE_ETC_SETTINGS`` is ``true`` or ``1``
3. ``None``
""" """
# check the environment variable SEARXNG_SETTINGS_PATH folder = get_user_cfg_folder() or Path(searx_dir)
# if the environment variable is defined, this is the last check fname = folder / file_name
if 'SEARXNG_SETTINGS_PATH' in environ: if not fname.is_file():
return existing_filename_or_none(environ['SEARXNG_SETTINGS_PATH']) raise FileNotFoundError(f"File {fname} does not exist!")
# if SEARXNG_DISABLE_ETC_SETTINGS don't look any further return load_yaml(fname)
if environ.get('SEARXNG_DISABLE_ETC_SETTINGS', '').lower() in ('1', 'true'):
return None
# check /etc/searxng/settings.yml
# (continue with other locations if the file is not found) def get_user_cfg_folder() -> Path | None:
return existing_filename_or_none('/etc/searxng/settings.yml') """Returns folder where the local configurations are located.
1. If the ``SEARXNG_SETTINGS_PATH`` environment is set and points to a
folder (e.g. ``/etc/mysxng/``), all local configurations are expected in
this folder. The settings of the :ref:`SearXNG appl <searxng
settings.yml>` then expected in ``settings.yml``
(e.g. ``/etc/mysxng/settings.yml``).
2. If the ``SEARXNG_SETTINGS_PATH`` environment is set and points to a file
(e.g. ``/etc/mysxng/myinstance.yml``), this file contains the settings of
the :ref:`SearXNG appl <searxng settings.yml>` and the folder
(e.g. ``/etc/mysxng/``) is used for all other configurations.
This type (``SEARXNG_SETTINGS_PATH`` points to a file) is suitable for
use cases in which different profiles of the :ref:`SearXNG appl <searxng
settings.yml>` are to be managed, such as in test scenarios.
3. If folder ``/etc/searxng`` exists, it is used.
In case none of the above path exists, ``None`` is returned. In case of
environment ``SEARXNG_SETTINGS_PATH`` is set, but the (folder or file) does
not exists, a :py:obj:`EnvironmentError` is raised.
"""
folder = None
settings_path = os.environ.get("SEARXNG_SETTINGS_PATH")
# Disable default /etc/searxng is intended exclusively for internal testing purposes
# and is therefore not documented!
disable_etc = os.environ.get('SEARXNG_DISABLE_ETC_SETTINGS', '').lower() in ('1', 'true')
if settings_path:
# rule 1. and 2.
settings_path = Path(settings_path)
if settings_path.is_dir():
folder = settings_path
elif settings_path.is_file():
folder = settings_path.parent
else:
raise EnvironmentError(1, f"{settings_path} not exists!", settings_path)
if not folder and not disable_etc:
# default: rule 3.
folder = Path("/etc/searxng")
if not folder.is_dir():
folder = None
return folder
def update_dict(default_dict, user_dict): def update_dict(default_dict, user_dict):
@ -74,7 +122,9 @@ def update_dict(default_dict, user_dict):
return default_dict return default_dict
def update_settings(default_settings, user_settings): def update_settings(default_settings: dict, user_settings: dict):
# pylint: disable=too-many-branches
# merge everything except the engines # merge everything except the engines
for k, v in user_settings.items(): for k, v in user_settings.items():
if k not in ('use_default_settings', 'engines'): if k not in ('use_default_settings', 'engines'):
@ -124,6 +174,7 @@ def update_settings(default_settings, user_settings):
def is_use_default_settings(user_settings): def is_use_default_settings(user_settings):
use_default_settings = user_settings.get('use_default_settings') use_default_settings = user_settings.get('use_default_settings')
if use_default_settings is True: if use_default_settings is True:
return True return True
@ -134,25 +185,37 @@ def is_use_default_settings(user_settings):
raise ValueError('Invalid value for use_default_settings') raise ValueError('Invalid value for use_default_settings')
def load_settings(load_user_settings=True): def load_settings(load_user_settings=True) -> tuple[dict, str]:
default_settings_path = get_default_settings_path() """Function for loading the settings of the SearXNG application
user_settings_path = get_user_settings_path() (:ref:`settings.yml <searxng settings.yml>`)."""
if user_settings_path is None or not load_user_settings:
# no user settings
return (load_yaml(default_settings_path), 'load the default settings from {}'.format(default_settings_path))
# user settings msg = f"load the default settings from {DEFAULT_SETTINGS_FILE}"
user_settings = load_yaml(user_settings_path) cfg = load_yaml(DEFAULT_SETTINGS_FILE)
if is_use_default_settings(user_settings): cfg_folder = get_user_cfg_folder()
if not load_user_settings or not cfg_folder:
return cfg, msg
settings_yml = os.environ.get("SEARXNG_SETTINGS_PATH")
if settings_yml and Path(settings_yml).is_file():
# see get_user_cfg_folder() --> SEARXNG_SETTINGS_PATH points to a file
settings_yml = Path(settings_yml).name
else:
# see get_user_cfg_folder() --> SEARXNG_SETTINGS_PATH points to a folder
settings_yml = SETTINGS_YAML
cfg_file = cfg_folder / settings_yml
if not cfg_file.exists():
return cfg, msg
msg = f"load the user settings from {cfg_file}"
user_cfg = load_yaml(cfg_file)
if is_use_default_settings(user_cfg):
# the user settings are merged with the default configuration # the user settings are merged with the default configuration
default_settings = load_yaml(default_settings_path) msg = f"merge the default settings ( {DEFAULT_SETTINGS_FILE} ) and the user settings ( {cfg_file} )"
update_settings(default_settings, user_settings) update_settings(cfg, user_cfg)
return ( else:
default_settings, cfg = user_cfg
'merge the default settings ( {} ) and the user settings ( {} )'.format(
default_settings_path, user_settings_path
),
)
# the user settings, fully replace the default configuration return cfg, msg
return (user_settings, 'load the user settings from {}'.format(user_settings_path))

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -245,6 +245,7 @@ article[data-vim-selected].category-social {
.url_o1 { .url_o1 {
white-space: nowrap; white-space: nowrap;
flex-shrink: 1; flex-shrink: 1;
padding-bottom: 1px;
} }
.url_o1::after { .url_o1::after {
@ -260,6 +261,7 @@ article[data-vim-selected].category-social {
flex-grow: 0; flex-grow: 0;
flex-shrink: 1; flex-shrink: 1;
text-align: right; text-align: right;
padding-bottom: 1px;
.url_i2 { .url_i2 {
float: right; float: right;

View file

@ -1,12 +1,19 @@
<select class="language" id="language" name="language" aria-label="{{ _('Search language') }}">{{- '' -}} <select class="language" id="language" name="language" aria-label="{{ _('Search language') }}">{{- '' -}}
<option value="all" {% if current_language == 'all' %}selected="selected"{% endif %}>{{ _('Default language') }} [all]</option> <option value="all" {% if current_language == 'all' %}selected="selected"{% endif %}>{{ _('Default language') }} [all]</option>{{- '' -}}
<option value="auto" {% if current_language == 'auto' %}selected="selected"{% endif %}> <option value="all"
{{- _('Auto-detect') -}} {%- if current_language == 'all' %} selected="selected" {%- endif -%}>
{%- if current_language == 'auto' %} ({{ search_language }}){%- endif -%} {{- _('Default language') }} [all] {{- '' -}}
</option> </option>{{- '' -}}
{%- for sxng_tag,lang_name,country_name,english_name,flag in sxng_locales | sort(attribute=1) -%} <option value="auto"
<option value="{{ sxng_tag }}" {% if sxng_tag == current_language %}selected="selected"{% endif %}> {%- if current_language == 'auto' %} selected="selected" {%- endif -%}>
{% if flag %}{{ flag }} {% endif%} {{- lang_name }} {% if country_name %} - {{ country_name }} {% endif %} [{{sxng_tag}}] {{- _('Auto-detect') }} [auto] {{- '' -}}
</option>{{- '' -}}
{% for sxng_tag,lang_name,country_name,english_name,flag in sxng_locales | sort(attribute=1) -%}
<option value="{{ sxng_tag }}"
{%- if sxng_tag == current_language %} selected="selected" {%- endif -%}>
{{ lang_name }}{%- if country_name -%}-{{ country_name }}{%- endif -%}
{{- ' ' -}}[{{sxng_tag}}]{{- ' ' -}}
{%- if flag -%}{{ flag }}{%- endif -%}
</option> </option>
{%- endfor -%} {%- endfor -%}
</select> </select>

View file

@ -13,9 +13,9 @@
{% for sxng_tag,lang_name,country_name,english_name,flag in sxng_locales | sort(attribute=1) -%} {% for sxng_tag,lang_name,country_name,english_name,flag in sxng_locales | sort(attribute=1) -%}
<option value="{{ sxng_tag }}" <option value="{{ sxng_tag }}"
{%- if sxng_tag == current_language %} selected="selected" {%- endif -%}> {%- if sxng_tag == current_language %} selected="selected" {%- endif -%}>
{%- if flag -%}{{ flag }} {% endif -%}
{{ lang_name }}{%- if country_name -%}-{{ country_name }}{%- endif -%} {{ lang_name }}{%- if country_name -%}-{{ country_name }}{%- endif -%}
{{- ' ' -}}[{{sxng_tag}}]{{- '' -}} {{- ' ' -}}[{{sxng_tag}}]{{- ' ' -}}
{%- if flag -%}{{ flag }}{%- endif -%}
</option> </option>
{%- endfor -%} {%- endfor -%}
</select>{{- '' -}} </select>{{- '' -}}

View file

@ -9,21 +9,24 @@
# return42 <markus.heiser@darmarit.de>, 2023, 2024. # return42 <markus.heiser@darmarit.de>, 2023, 2024.
# APoniatowski <adam@poniatowski.dev>, 2023. # APoniatowski <adam@poniatowski.dev>, 2023.
# return42 <return42@users.noreply.translate.codeberg.org>, 2024. # return42 <return42@users.noreply.translate.codeberg.org>, 2024.
# louispires <louispires@users.noreply.translate.codeberg.org>, 2024.
# notlmutsaers <notlmutsaers@users.noreply.translate.codeberg.org>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-06-17 12:15+0000\n" "POT-Creation-Date: 2024-06-17 12:15+0000\n"
"PO-Revision-Date: 2024-06-08 13:18+0000\n" "PO-Revision-Date: 2024-07-09 15:18+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>" "Last-Translator: notlmutsaers <notlmutsaers@users.noreply.translate.codeberg."
"\n" "org>\n"
"Language-Team: Afrikaans <https://translate.codeberg.org/projects/searxng/"
"searxng/af/>\n"
"Language: af\n" "Language: af\n"
"Language-Team: Afrikaans "
"<https://translate.codeberg.org/projects/searxng/searxng/af/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6.2\n"
"Generated-By: Babel 2.15.0\n" "Generated-By: Babel 2.15.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -189,7 +192,7 @@ msgstr "geval"
#. WEATHER_TERMS['CURRENT CONDITION'] #. WEATHER_TERMS['CURRENT CONDITION']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Current condition" msgid "Current condition"
msgstr "" msgstr "Huidige toestand"
#. WEATHER_TERMS['EVENING'] #. WEATHER_TERMS['EVENING']
#: searx/engines/wttr.py:100 searx/searxng.msg #: searx/engines/wttr.py:100 searx/searxng.msg
@ -199,22 +202,22 @@ msgstr "aand"
#. WEATHER_TERMS['FEELS LIKE'] #. WEATHER_TERMS['FEELS LIKE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Feels like" msgid "Feels like"
msgstr "" msgstr "Voel soos"
#. WEATHER_TERMS['HUMIDITY'] #. WEATHER_TERMS['HUMIDITY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Humidity" msgid "Humidity"
msgstr "" msgstr "Humiditeit"
#. WEATHER_TERMS['MAX TEMP.'] #. WEATHER_TERMS['MAX TEMP.']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Max temp." msgid "Max temp."
msgstr "" msgstr "Maksimum temp."
#. WEATHER_TERMS['MIN TEMP.'] #. WEATHER_TERMS['MIN TEMP.']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Min temp." msgid "Min temp."
msgstr "" msgstr "Minimum temp."
#. WEATHER_TERMS['MORNING'] #. WEATHER_TERMS['MORNING']
#: searx/engines/wttr.py:100 searx/searxng.msg #: searx/engines/wttr.py:100 searx/searxng.msg
@ -234,97 +237,97 @@ msgstr "Middag"
#. WEATHER_TERMS['PRESSURE'] #. WEATHER_TERMS['PRESSURE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Pressure" msgid "Pressure"
msgstr "" msgstr "Druk"
#. WEATHER_TERMS['SUNRISE'] #. WEATHER_TERMS['SUNRISE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Sunrise" msgid "Sunrise"
msgstr "" msgstr "Sonopkoms"
#. WEATHER_TERMS['SUNSET'] #. WEATHER_TERMS['SUNSET']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Sunset" msgid "Sunset"
msgstr "" msgstr "Sonsondergang"
#. WEATHER_TERMS['TEMPERATURE'] #. WEATHER_TERMS['TEMPERATURE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Temperature" msgid "Temperature"
msgstr "" msgstr "Temperatuur"
#. WEATHER_TERMS['UV INDEX'] #. WEATHER_TERMS['UV INDEX']
#: searx/searxng.msg #: searx/searxng.msg
msgid "UV index" msgid "UV index"
msgstr "" msgstr "UV indeks"
#. WEATHER_TERMS['VISIBILITY'] #. WEATHER_TERMS['VISIBILITY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Visibility" msgid "Visibility"
msgstr "" msgstr "Sigbaarheid"
#. WEATHER_TERMS['WIND'] #. WEATHER_TERMS['WIND']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Wind" msgid "Wind"
msgstr "" msgstr "Wind"
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS'] #. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "subscribers" msgid "subscribers"
msgstr "" msgstr "intekenare"
#. SOCIAL_MEDIA_TERMS['POSTS'] #. SOCIAL_MEDIA_TERMS['POSTS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "posts" msgid "posts"
msgstr "" msgstr "plasings"
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS'] #. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "active users" msgid "active users"
msgstr "" msgstr "aktiewe gebruikers"
#. SOCIAL_MEDIA_TERMS['COMMENTS'] #. SOCIAL_MEDIA_TERMS['COMMENTS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "comments" msgid "comments"
msgstr "" msgstr "kommentaar"
#. SOCIAL_MEDIA_TERMS['USER'] #. SOCIAL_MEDIA_TERMS['USER']
#: searx/searxng.msg #: searx/searxng.msg
msgid "user" msgid "user"
msgstr "" msgstr "gebruiker"
#. SOCIAL_MEDIA_TERMS['COMMUNITY'] #. SOCIAL_MEDIA_TERMS['COMMUNITY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "community" msgid "community"
msgstr "" msgstr "gemeenskap"
#. SOCIAL_MEDIA_TERMS['POINTS'] #. SOCIAL_MEDIA_TERMS['POINTS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "points" msgid "points"
msgstr "" msgstr "punte"
#. SOCIAL_MEDIA_TERMS['TITLE'] #. SOCIAL_MEDIA_TERMS['TITLE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "title" msgid "title"
msgstr "" msgstr "titel"
#. SOCIAL_MEDIA_TERMS['AUTHOR'] #. SOCIAL_MEDIA_TERMS['AUTHOR']
#: searx/searxng.msg #: searx/searxng.msg
msgid "author" msgid "author"
msgstr "" msgstr "outeur"
#. SOCIAL_MEDIA_TERMS['THREAD OPEN'] #. SOCIAL_MEDIA_TERMS['THREAD OPEN']
#: searx/engines/discourse.py:121 searx/searxng.msg #: searx/engines/discourse.py:121 searx/searxng.msg
msgid "open" msgid "open"
msgstr "" msgstr "oop"
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED'] #. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
#: searx/engines/discourse.py:121 searx/searxng.msg #: searx/engines/discourse.py:121 searx/searxng.msg
msgid "closed" msgid "closed"
msgstr "" msgstr "toe"
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED'] #. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
#: searx/engines/discourse.py:132 searx/searxng.msg #: searx/engines/discourse.py:132 searx/searxng.msg
msgid "answered" msgid "answered"
msgstr "" msgstr "geantwoord"
#: searx/webapp.py:330 #: searx/webapp.py:330
msgid "No item found" msgid "No item found"
@ -505,7 +508,7 @@ msgstr "Lêer kwaliteit"
#: searx/plugins/calculator.py:12 #: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar" msgid "Calculate mathematical expressions via the search bar"
msgstr "" msgstr "Bereken wiskundige uitdrukkings via die soekbalk"
#: searx/plugins/hash_plugin.py:10 #: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
@ -521,11 +524,13 @@ msgstr "vervang Gasheernaam"
#: searx/plugins/hostnames.py:68 #: searx/plugins/hostnames.py:68
msgid "Hostnames plugin" msgid "Hostnames plugin"
msgstr "" msgstr "Gasheername-inprop"
#: searx/plugins/hostnames.py:69 #: searx/plugins/hostnames.py:69
msgid "Rewrite hostnames, remove results or prioritize them based on the hostname" msgid "Rewrite hostnames, remove results or prioritize them based on the hostname"
msgstr "" msgstr ""
"Herskryf gasheername, verwyder resultate of prioritiseer dit op grond van "
"die gasheernaam"
#: searx/plugins/oa_doi_rewrite.py:12 #: searx/plugins/oa_doi_rewrite.py:12
msgid "Open Access DOI rewrite" msgid "Open Access DOI rewrite"
@ -553,11 +558,11 @@ msgstr ""
#: searx/plugins/self_info.py:28 #: searx/plugins/self_info.py:28
msgid "Your IP is: " msgid "Your IP is: "
msgstr "" msgstr "Jou IP is: "
#: searx/plugins/self_info.py:31 #: searx/plugins/self_info.py:31
msgid "Your user-agent is: " msgid "Your user-agent is: "
msgstr "" msgstr "Jou gebruiker-agent is: "
#: searx/plugins/tor_check.py:24 #: searx/plugins/tor_check.py:24
msgid "Tor check plugin" msgid "Tor check plugin"
@ -604,7 +609,7 @@ msgstr "Verwyder spoorsnyersargumente van die teruggestuurde URL"
#: searx/plugins/unit_converter.py:29 #: searx/plugins/unit_converter.py:29
msgid "Convert between units" msgid "Convert between units"
msgstr "" msgstr "Skakel tussen eenhede om"
#: searx/templates/simple/404.html:4 #: searx/templates/simple/404.html:4
msgid "Page not found" msgid "Page not found"
@ -1148,15 +1153,15 @@ msgstr ""
#: searx/templates/simple/preferences/cookies.html:46 #: searx/templates/simple/preferences/cookies.html:46
msgid "Copy preferences hash" msgid "Copy preferences hash"
msgstr "" msgstr "Kopieer voorkeur-hash"
#: searx/templates/simple/preferences/cookies.html:57 #: searx/templates/simple/preferences/cookies.html:57
msgid "Insert copied preferences hash (without URL) to restore" msgid "Insert copied preferences hash (without URL) to restore"
msgstr "" msgstr "Voeg gekopieerde voorkeur-hash (sonder URL) in om te herstel"
#: searx/templates/simple/preferences/cookies.html:59 #: searx/templates/simple/preferences/cookies.html:59
msgid "Preferences hash" msgid "Preferences hash"
msgstr "" msgstr "Voorkeure hash"
#: searx/templates/simple/preferences/doi_resolver.html:2 #: searx/templates/simple/preferences/doi_resolver.html:2
msgid "Open Access DOI resolver" msgid "Open Access DOI resolver"
@ -1176,11 +1181,11 @@ msgstr ""
#: searx/templates/simple/preferences/engines.html:15 #: searx/templates/simple/preferences/engines.html:15
msgid "Enable all" msgid "Enable all"
msgstr "" msgstr "Aktiveer alles"
#: searx/templates/simple/preferences/engines.html:16 #: searx/templates/simple/preferences/engines.html:16
msgid "Disable all" msgid "Disable all"
msgstr "" msgstr "Deaktiveer alles"
#: searx/templates/simple/preferences/engines.html:25 #: searx/templates/simple/preferences/engines.html:25
msgid "!bang" msgid "!bang"
@ -1372,7 +1377,7 @@ msgstr "Lêergrootte"
#: searx/templates/simple/result_templates/files.html:40 #: searx/templates/simple/result_templates/files.html:40
msgid "Date" msgid "Date"
msgstr "" msgstr "Datum"
#: searx/templates/simple/result_templates/files.html:42 #: searx/templates/simple/result_templates/files.html:42
#: searx/templates/simple/result_templates/paper.html:24 #: searx/templates/simple/result_templates/paper.html:24
@ -1381,7 +1386,7 @@ msgstr "Tik"
#: searx/templates/simple/result_templates/images.html:20 #: searx/templates/simple/result_templates/images.html:20
msgid "Resolution" msgid "Resolution"
msgstr "" msgstr "Resolusie"
#: searx/templates/simple/result_templates/images.html:21 #: searx/templates/simple/result_templates/images.html:21
msgid "Format" msgid "Format"
@ -1409,15 +1414,15 @@ msgstr "versteek kaart"
#: searx/templates/simple/result_templates/packages.html:12 #: searx/templates/simple/result_templates/packages.html:12
msgid "Version" msgid "Version"
msgstr "" msgstr "Weergawe"
#: searx/templates/simple/result_templates/packages.html:18 #: searx/templates/simple/result_templates/packages.html:18
msgid "Maintainer" msgid "Maintainer"
msgstr "" msgstr "Onderhouer"
#: searx/templates/simple/result_templates/packages.html:24 #: searx/templates/simple/result_templates/packages.html:24
msgid "Updated at" msgid "Updated at"
msgstr "" msgstr "Opgedateer by"
#: searx/templates/simple/result_templates/packages.html:30 #: searx/templates/simple/result_templates/packages.html:30
#: searx/templates/simple/result_templates/paper.html:25 #: searx/templates/simple/result_templates/paper.html:25
@ -1426,7 +1431,7 @@ msgstr "Merkers"
#: searx/templates/simple/result_templates/packages.html:36 #: searx/templates/simple/result_templates/packages.html:36
msgid "Popularity" msgid "Popularity"
msgstr "" msgstr "Gewildheid"
#: searx/templates/simple/result_templates/packages.html:42 #: searx/templates/simple/result_templates/packages.html:42
msgid "License" msgid "License"
@ -1434,11 +1439,11 @@ msgstr "Lisensie"
#: searx/templates/simple/result_templates/packages.html:52 #: searx/templates/simple/result_templates/packages.html:52
msgid "Project" msgid "Project"
msgstr "" msgstr "Projek"
#: searx/templates/simple/result_templates/packages.html:55 #: searx/templates/simple/result_templates/packages.html:55
msgid "Project homepage" msgid "Project homepage"
msgstr "" msgstr "Projek tuisblad"
#: searx/templates/simple/result_templates/paper.html:5 #: searx/templates/simple/result_templates/paper.html:5
msgid "Published date" msgid "Published date"
@ -1679,4 +1684,3 @@ msgstr "versteek video"
#~ msgid "TiB" #~ msgid "TiB"
#~ msgstr "TiB" #~ msgstr "TiB"

View file

@ -12,21 +12,23 @@
# KDesp73 <kdesp2003@gmail.com>, 2023. # KDesp73 <kdesp2003@gmail.com>, 2023.
# RaptaG <george-raptis@tutamail.com>, 2023. # RaptaG <george-raptis@tutamail.com>, 2023.
# return42 <return42@users.noreply.translate.codeberg.org>, 2024. # return42 <return42@users.noreply.translate.codeberg.org>, 2024.
# notlmutsaers <notlmutsaers@users.noreply.translate.codeberg.org>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-06-17 12:15+0000\n" "POT-Creation-Date: 2024-06-17 12:15+0000\n"
"PO-Revision-Date: 2024-06-14 07:08+0000\n" "PO-Revision-Date: 2024-07-09 15:18+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>" "Last-Translator: notlmutsaers <notlmutsaers@users.noreply.translate.codeberg."
"\n" "org>\n"
"Language-Team: Greek <https://translate.codeberg.org/projects/searxng/"
"searxng/el/>\n"
"Language: el_GR\n" "Language: el_GR\n"
"Language-Team: Greek "
"<https://translate.codeberg.org/projects/searxng/searxng/el/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6.2\n"
"Generated-By: Babel 2.15.0\n" "Generated-By: Babel 2.15.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -167,7 +169,7 @@ msgstr "σκοτεινό"
#. BRAND_CUSTOM_LINKS['UPTIME'] #. BRAND_CUSTOM_LINKS['UPTIME']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Uptime" msgid "Uptime"
msgstr "" msgstr "χρόνο λειτουργίας"
#. BRAND_CUSTOM_LINKS['ABOUT'] #. BRAND_CUSTOM_LINKS['ABOUT']
#: searx/searxng.msg searx/templates/simple/base.html:50 #: searx/searxng.msg searx/templates/simple/base.html:50
@ -177,7 +179,7 @@ msgstr "Σχετικά με το SearXNG"
#. WEATHER_TERMS['AVERAGE TEMP.'] #. WEATHER_TERMS['AVERAGE TEMP.']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Average temp." msgid "Average temp."
msgstr "Μέση Θερμοκρασία" msgstr "Μέση θερμοκρασία."
#. WEATHER_TERMS['CLOUD COVER'] #. WEATHER_TERMS['CLOUD COVER']
#: searx/searxng.msg #: searx/searxng.msg
@ -187,12 +189,12 @@ msgstr "Νεφοκάλυψη"
#. WEATHER_TERMS['CONDITION'] #. WEATHER_TERMS['CONDITION']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Condition" msgid "Condition"
msgstr "" msgstr "Κατάσταση"
#. WEATHER_TERMS['CURRENT CONDITION'] #. WEATHER_TERMS['CURRENT CONDITION']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Current condition" msgid "Current condition"
msgstr "" msgstr "Τωρινή κατάσταση"
#. WEATHER_TERMS['EVENING'] #. WEATHER_TERMS['EVENING']
#: searx/engines/wttr.py:100 searx/searxng.msg #: searx/engines/wttr.py:100 searx/searxng.msg
@ -212,7 +214,7 @@ msgstr "Υγρασία"
#. WEATHER_TERMS['MAX TEMP.'] #. WEATHER_TERMS['MAX TEMP.']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Max temp." msgid "Max temp."
msgstr "Μέγιστη Θερμοκρασία" msgstr "Μέγιστη θερμοκρασία."
#. WEATHER_TERMS['MIN TEMP.'] #. WEATHER_TERMS['MIN TEMP.']
#: searx/searxng.msg #: searx/searxng.msg
@ -242,92 +244,92 @@ msgstr "Πίεση"
#. WEATHER_TERMS['SUNRISE'] #. WEATHER_TERMS['SUNRISE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Sunrise" msgid "Sunrise"
msgstr "" msgstr "Ανατολή ηλίου"
#. WEATHER_TERMS['SUNSET'] #. WEATHER_TERMS['SUNSET']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Sunset" msgid "Sunset"
msgstr "" msgstr "Η δυση του ηλιου"
#. WEATHER_TERMS['TEMPERATURE'] #. WEATHER_TERMS['TEMPERATURE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Temperature" msgid "Temperature"
msgstr "" msgstr "Θερμοκρασία"
#. WEATHER_TERMS['UV INDEX'] #. WEATHER_TERMS['UV INDEX']
#: searx/searxng.msg #: searx/searxng.msg
msgid "UV index" msgid "UV index"
msgstr "" msgstr "Δείκτης UV"
#. WEATHER_TERMS['VISIBILITY'] #. WEATHER_TERMS['VISIBILITY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Visibility" msgid "Visibility"
msgstr "" msgstr "Ορατότητα"
#. WEATHER_TERMS['WIND'] #. WEATHER_TERMS['WIND']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Wind" msgid "Wind"
msgstr "" msgstr "Ανεμος"
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS'] #. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "subscribers" msgid "subscribers"
msgstr "" msgstr "συνδρομητές"
#. SOCIAL_MEDIA_TERMS['POSTS'] #. SOCIAL_MEDIA_TERMS['POSTS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "posts" msgid "posts"
msgstr "" msgstr "αναρτήσεις"
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS'] #. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "active users" msgid "active users"
msgstr "" msgstr "ενεργούς χρήστες"
#. SOCIAL_MEDIA_TERMS['COMMENTS'] #. SOCIAL_MEDIA_TERMS['COMMENTS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "comments" msgid "comments"
msgstr "" msgstr "σχόλια"
#. SOCIAL_MEDIA_TERMS['USER'] #. SOCIAL_MEDIA_TERMS['USER']
#: searx/searxng.msg #: searx/searxng.msg
msgid "user" msgid "user"
msgstr "" msgstr "χρήστης"
#. SOCIAL_MEDIA_TERMS['COMMUNITY'] #. SOCIAL_MEDIA_TERMS['COMMUNITY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "community" msgid "community"
msgstr "" msgstr "κοινότητα"
#. SOCIAL_MEDIA_TERMS['POINTS'] #. SOCIAL_MEDIA_TERMS['POINTS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "points" msgid "points"
msgstr "" msgstr "σημεία"
#. SOCIAL_MEDIA_TERMS['TITLE'] #. SOCIAL_MEDIA_TERMS['TITLE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "title" msgid "title"
msgstr "" msgstr "τίτλος"
#. SOCIAL_MEDIA_TERMS['AUTHOR'] #. SOCIAL_MEDIA_TERMS['AUTHOR']
#: searx/searxng.msg #: searx/searxng.msg
msgid "author" msgid "author"
msgstr "" msgstr "συγγραφέας"
#. SOCIAL_MEDIA_TERMS['THREAD OPEN'] #. SOCIAL_MEDIA_TERMS['THREAD OPEN']
#: searx/engines/discourse.py:121 searx/searxng.msg #: searx/engines/discourse.py:121 searx/searxng.msg
msgid "open" msgid "open"
msgstr "" msgstr "Άνοιξε"
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED'] #. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
#: searx/engines/discourse.py:121 searx/searxng.msg #: searx/engines/discourse.py:121 searx/searxng.msg
msgid "closed" msgid "closed"
msgstr "" msgstr "κλειστό"
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED'] #. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
#: searx/engines/discourse.py:132 searx/searxng.msg #: searx/engines/discourse.py:132 searx/searxng.msg
msgid "answered" msgid "answered"
msgstr "" msgstr "απάντησε"
#: searx/webapp.py:330 #: searx/webapp.py:330
msgid "No item found" msgid "No item found"
@ -508,7 +510,7 @@ msgstr "Ποιότητα αρχείου"
#: searx/plugins/calculator.py:12 #: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar" msgid "Calculate mathematical expressions via the search bar"
msgstr "" msgstr "Υπολογίστε μαθηματικές εκφράσεις μέσω της γραμμής αναζήτησης"
#: searx/plugins/hash_plugin.py:10 #: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
@ -524,15 +526,17 @@ msgstr "Αντικατάσταση hostname"
#: searx/plugins/hostnames.py:68 #: searx/plugins/hostnames.py:68
msgid "Hostnames plugin" msgid "Hostnames plugin"
msgstr "" msgstr "Προσθήκη ονομάτων κεντρικού υπολογιστή"
#: searx/plugins/hostnames.py:69 #: searx/plugins/hostnames.py:69
msgid "Rewrite hostnames, remove results or prioritize them based on the hostname" msgid "Rewrite hostnames, remove results or prioritize them based on the hostname"
msgstr "" msgstr ""
"Ξαναγράψτε ονόματα κεντρικών υπολογιστών, αφαιρέστε τα αποτελέσματα ή δώστε "
"προτεραιότητα σε αυτά με βάση το όνομα κεντρικού υπολογιστή"
#: searx/plugins/oa_doi_rewrite.py:12 #: searx/plugins/oa_doi_rewrite.py:12
msgid "Open Access DOI rewrite" msgid "Open Access DOI rewrite"
msgstr "Αντικατάσταση με DOI ανοιχτής πρόσβασης" msgstr "Ανοίξτε την επανεγγραφή DOI της Access"
#: searx/plugins/oa_doi_rewrite.py:13 #: searx/plugins/oa_doi_rewrite.py:13
msgid "" msgid ""
@ -556,11 +560,11 @@ msgstr ""
#: searx/plugins/self_info.py:28 #: searx/plugins/self_info.py:28
msgid "Your IP is: " msgid "Your IP is: "
msgstr "" msgstr "Η IP σας είναι: "
#: searx/plugins/self_info.py:31 #: searx/plugins/self_info.py:31
msgid "Your user-agent is: " msgid "Your user-agent is: "
msgstr "" msgstr "Ο χρήστης-πράκτοράς σας είναι: "
#: searx/plugins/tor_check.py:24 #: searx/plugins/tor_check.py:24
msgid "Tor check plugin" msgid "Tor check plugin"
@ -607,7 +611,7 @@ msgstr "Αφαίρεση ιχνηλατών από τους επιστρεφόμ
#: searx/plugins/unit_converter.py:29 #: searx/plugins/unit_converter.py:29
msgid "Convert between units" msgid "Convert between units"
msgstr "" msgstr "Μετατροπή μεταξύ μονάδων"
#: searx/templates/simple/404.html:4 #: searx/templates/simple/404.html:4
msgid "Page not found" msgid "Page not found"
@ -1037,7 +1041,7 @@ msgstr "Δεν βρέθηκαν αποτελέσματα. Μπορείτε να
#: searx/templates/simple/messages/no_results.html:14 #: searx/templates/simple/messages/no_results.html:14
msgid "There are no more results. You can try to:" msgid "There are no more results. You can try to:"
msgstr "" msgstr "Δεν υπάρχουν άλλα αποτελέσματα. Μπορείτε να προσπαθήσετε να:"
#: searx/templates/simple/messages/no_results.html:19 #: searx/templates/simple/messages/no_results.html:19
msgid "Refresh the page." msgid "Refresh the page."
@ -1057,11 +1061,13 @@ msgstr "Αλλαγή σε άλλη έκδοση:"
#: searx/templates/simple/messages/no_results.html:24 #: searx/templates/simple/messages/no_results.html:24
msgid "Search for another query or select another category." msgid "Search for another query or select another category."
msgstr "" msgstr "Αναζητήστε άλλο ερώτημα ή επιλέξτε άλλη κατηγορία."
#: searx/templates/simple/messages/no_results.html:25 #: searx/templates/simple/messages/no_results.html:25
msgid "Go back to the previous page using the previous page button." msgid "Go back to the previous page using the previous page button."
msgstr "" msgstr ""
"Επιστρέψτε στην προηγούμενη σελίδα χρησιμοποιώντας το κουμπί της "
"προηγούμενης σελίδας."
#: searx/templates/simple/preferences/answerers.html:4 #: searx/templates/simple/preferences/answerers.html:4
#: searx/templates/simple/preferences/engines.html:23 #: searx/templates/simple/preferences/engines.html:23
@ -1157,15 +1163,16 @@ msgstr ""
#: searx/templates/simple/preferences/cookies.html:46 #: searx/templates/simple/preferences/cookies.html:46
msgid "Copy preferences hash" msgid "Copy preferences hash"
msgstr "" msgstr "Αντιγραφή κατακερματισμού προτιμήσεων"
#: searx/templates/simple/preferences/cookies.html:57 #: searx/templates/simple/preferences/cookies.html:57
msgid "Insert copied preferences hash (without URL) to restore" msgid "Insert copied preferences hash (without URL) to restore"
msgstr "" msgstr ""
"Εισαγάγετε αντιγραμμένο κατακερματισμό προτιμήσεων (χωρίς URL) για επαναφορά"
#: searx/templates/simple/preferences/cookies.html:59 #: searx/templates/simple/preferences/cookies.html:59
msgid "Preferences hash" msgid "Preferences hash"
msgstr "" msgstr "Κατακερματισμός προτιμήσεων"
#: searx/templates/simple/preferences/doi_resolver.html:2 #: searx/templates/simple/preferences/doi_resolver.html:2
msgid "Open Access DOI resolver" msgid "Open Access DOI resolver"
@ -1185,11 +1192,11 @@ msgstr ""
#: searx/templates/simple/preferences/engines.html:15 #: searx/templates/simple/preferences/engines.html:15
msgid "Enable all" msgid "Enable all"
msgstr "" msgstr "Ενεργοποίηση όλων"
#: searx/templates/simple/preferences/engines.html:16 #: searx/templates/simple/preferences/engines.html:16
msgid "Disable all" msgid "Disable all"
msgstr "" msgstr "Απενεργοποίηση όλων"
#: searx/templates/simple/preferences/engines.html:25 #: searx/templates/simple/preferences/engines.html:25
msgid "!bang" msgid "!bang"
@ -1427,11 +1434,11 @@ msgstr "Έκδοση"
#: searx/templates/simple/result_templates/packages.html:18 #: searx/templates/simple/result_templates/packages.html:18
msgid "Maintainer" msgid "Maintainer"
msgstr "" msgstr "Συντηρητής"
#: searx/templates/simple/result_templates/packages.html:24 #: searx/templates/simple/result_templates/packages.html:24
msgid "Updated at" msgid "Updated at"
msgstr "" msgstr "Ενημερώθηκε στις"
#: searx/templates/simple/result_templates/packages.html:30 #: searx/templates/simple/result_templates/packages.html:30
#: searx/templates/simple/result_templates/paper.html:25 #: searx/templates/simple/result_templates/paper.html:25
@ -1440,7 +1447,7 @@ msgstr "Σημάνσεις"
#: searx/templates/simple/result_templates/packages.html:36 #: searx/templates/simple/result_templates/packages.html:36
msgid "Popularity" msgid "Popularity"
msgstr "" msgstr "Δημοτικότητα"
#: searx/templates/simple/result_templates/packages.html:42 #: searx/templates/simple/result_templates/packages.html:42
msgid "License" msgid "License"
@ -1452,7 +1459,7 @@ msgstr "Έργο"
#: searx/templates/simple/result_templates/packages.html:55 #: searx/templates/simple/result_templates/packages.html:55
msgid "Project homepage" msgid "Project homepage"
msgstr "" msgstr "Αρχική σελίδα του έργου"
#: searx/templates/simple/result_templates/paper.html:5 #: searx/templates/simple/result_templates/paper.html:5
msgid "Published date" msgid "Published date"
@ -1951,4 +1958,3 @@ msgstr "απόκρυψη βίντεο"
#~ msgid "TiB" #~ msgid "TiB"
#~ msgstr "TiB" #~ msgstr "TiB"

View file

@ -17,16 +17,16 @@ msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-06-17 12:15+0000\n" "POT-Creation-Date: 2024-06-17 12:15+0000\n"
"PO-Revision-Date: 2024-05-02 12:18+0000\n" "PO-Revision-Date: 2024-07-09 15:18+0000\n"
"Last-Translator: alexgabi <alexgabi@users.noreply.translate.codeberg.org>" "Last-Translator: alexgabi <alexgabi@users.noreply.translate.codeberg.org>\n"
"\n" "Language-Team: Basque <https://translate.codeberg.org/projects/searxng/"
"searxng/eu/>\n"
"Language: eu\n" "Language: eu\n"
"Language-Team: Basque "
"<https://translate.codeberg.org/projects/searxng/searxng/eu/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6.2\n"
"Generated-By: Babel 2.15.0\n" "Generated-By: Babel 2.15.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -317,17 +317,17 @@ msgstr "egilea"
#. SOCIAL_MEDIA_TERMS['THREAD OPEN'] #. SOCIAL_MEDIA_TERMS['THREAD OPEN']
#: searx/engines/discourse.py:121 searx/searxng.msg #: searx/engines/discourse.py:121 searx/searxng.msg
msgid "open" msgid "open"
msgstr "" msgstr "ireki"
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED'] #. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
#: searx/engines/discourse.py:121 searx/searxng.msg #: searx/engines/discourse.py:121 searx/searxng.msg
msgid "closed" msgid "closed"
msgstr "" msgstr "itxita"
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED'] #. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
#: searx/engines/discourse.py:132 searx/searxng.msg #: searx/engines/discourse.py:132 searx/searxng.msg
msgid "answered" msgid "answered"
msgstr "" msgstr "erantzunda"
#: searx/webapp.py:330 #: searx/webapp.py:330
msgid "No item found" msgid "No item found"
@ -507,7 +507,7 @@ msgstr "Fitxategiaren kalitatea"
#: searx/plugins/calculator.py:12 #: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar" msgid "Calculate mathematical expressions via the search bar"
msgstr "" msgstr "Kalkulatu adierazpen matematikoak bilaketa-barraren bidez"
#: searx/plugins/hash_plugin.py:10 #: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
@ -523,11 +523,13 @@ msgstr "Ostalariaren izena ordezkatu"
#: searx/plugins/hostnames.py:68 #: searx/plugins/hostnames.py:68
msgid "Hostnames plugin" msgid "Hostnames plugin"
msgstr "" msgstr "Hostnames plugina"
#: searx/plugins/hostnames.py:69 #: searx/plugins/hostnames.py:69
msgid "Rewrite hostnames, remove results or prioritize them based on the hostname" msgid "Rewrite hostnames, remove results or prioritize them based on the hostname"
msgstr "" msgstr ""
"Berridatzi ostalari-izenak, kendu emaitzak edo eman lehentasuna ostalari-"
"izenaren arabera"
#: searx/plugins/oa_doi_rewrite.py:12 #: searx/plugins/oa_doi_rewrite.py:12
msgid "Open Access DOI rewrite" msgid "Open Access DOI rewrite"
@ -555,11 +557,11 @@ msgstr ""
#: searx/plugins/self_info.py:28 #: searx/plugins/self_info.py:28
msgid "Your IP is: " msgid "Your IP is: "
msgstr "" msgstr "zure IPa hau da: "
#: searx/plugins/self_info.py:31 #: searx/plugins/self_info.py:31
msgid "Your user-agent is: " msgid "Your user-agent is: "
msgstr "" msgstr "Zure erabiltzaile-agentea hau da: "
#: searx/plugins/tor_check.py:24 #: searx/plugins/tor_check.py:24
msgid "Tor check plugin" msgid "Tor check plugin"
@ -1926,4 +1928,3 @@ msgstr "ezkutatu bideoa"
#~ msgid "TiB" #~ msgid "TiB"
#~ msgstr "TiB" #~ msgstr "TiB"

View file

@ -11,13 +11,14 @@
# return42 <return42@users.noreply.translate.codeberg.org>, 2024. # return42 <return42@users.noreply.translate.codeberg.org>, 2024.
# Implosion <Implosion@users.noreply.translate.codeberg.org>, 2024. # Implosion <Implosion@users.noreply.translate.codeberg.org>, 2024.
# artnay <artnay@users.noreply.translate.codeberg.org>, 2024. # artnay <artnay@users.noreply.translate.codeberg.org>, 2024.
# jonkke9 <jonkke9@users.noreply.translate.codeberg.org>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-06-17 12:15+0000\n" "POT-Creation-Date: 2024-06-17 12:15+0000\n"
"PO-Revision-Date: 2024-06-27 19:18+0000\n" "PO-Revision-Date: 2024-07-06 16:18+0000\n"
"Last-Translator: artnay <artnay@users.noreply.translate.codeberg.org>\n" "Last-Translator: jonkke9 <jonkke9@users.noreply.translate.codeberg.org>\n"
"Language-Team: Finnish <https://translate.codeberg.org/projects/searxng/" "Language-Team: Finnish <https://translate.codeberg.org/projects/searxng/"
"searxng/fi/>\n" "searxng/fi/>\n"
"Language: fi\n" "Language: fi\n"
@ -25,7 +26,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5.5\n" "X-Generator: Weblate 5.6.2\n"
"Generated-By: Babel 2.15.0\n" "Generated-By: Babel 2.15.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -321,7 +322,7 @@ msgstr ""
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED'] #. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
#: searx/engines/discourse.py:121 searx/searxng.msg #: searx/engines/discourse.py:121 searx/searxng.msg
msgid "closed" msgid "closed"
msgstr "" msgstr "suljettu"
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED'] #. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
#: searx/engines/discourse.py:132 searx/searxng.msg #: searx/engines/discourse.py:132 searx/searxng.msg

View file

@ -22,13 +22,14 @@
# Heyian <Heyian@users.noreply.translate.codeberg.org>, 2024. # Heyian <Heyian@users.noreply.translate.codeberg.org>, 2024.
# return42 <return42@users.noreply.translate.codeberg.org>, 2024. # return42 <return42@users.noreply.translate.codeberg.org>, 2024.
# Vulcain <Vulcain@users.noreply.translate.codeberg.org>, 2024. # Vulcain <Vulcain@users.noreply.translate.codeberg.org>, 2024.
# wags07 <wags07@users.noreply.translate.codeberg.org>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-06-17 12:15+0000\n" "POT-Creation-Date: 2024-06-17 12:15+0000\n"
"PO-Revision-Date: 2024-06-21 07:09+0000\n" "PO-Revision-Date: 2024-07-06 16:18+0000\n"
"Last-Translator: Vulcain <Vulcain@users.noreply.translate.codeberg.org>\n" "Last-Translator: wags07 <wags07@users.noreply.translate.codeberg.org>\n"
"Language-Team: French <https://translate.codeberg.org/projects/searxng/" "Language-Team: French <https://translate.codeberg.org/projects/searxng/"
"searxng/fr/>\n" "searxng/fr/>\n"
"Language: fr\n" "Language: fr\n"
@ -36,7 +37,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.5.5\n" "X-Generator: Weblate 5.6.2\n"
"Generated-By: Babel 2.15.0\n" "Generated-By: Babel 2.15.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -534,7 +535,7 @@ msgstr "Remplacer les noms de domaine"
#: searx/plugins/hostnames.py:68 #: searx/plugins/hostnames.py:68
msgid "Hostnames plugin" msgid "Hostnames plugin"
msgstr "" msgstr "Plugin de noms dhôtes"
#: searx/plugins/hostnames.py:69 #: searx/plugins/hostnames.py:69
msgid "Rewrite hostnames, remove results or prioritize them based on the hostname" msgid "Rewrite hostnames, remove results or prioritize them based on the hostname"

View file

@ -10,27 +10,29 @@
# alma <alma@users.noreply.translate.codeberg.org>, 2023. # alma <alma@users.noreply.translate.codeberg.org>, 2023.
# staram <gritty.year0043@fastmail.com>, 2023. # staram <gritty.year0043@fastmail.com>, 2023.
# return42 <return42@users.noreply.translate.codeberg.org>, 2024. # return42 <return42@users.noreply.translate.codeberg.org>, 2024.
# wazhanudin <wazhanudin@users.noreply.translate.codeberg.org>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-06-17 12:15+0000\n" "POT-Creation-Date: 2024-06-17 12:15+0000\n"
"PO-Revision-Date: 2024-03-12 17:28+0000\n" "PO-Revision-Date: 2024-07-11 16:18+0000\n"
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>" "Last-Translator: wazhanudin <wazhanudin@users.noreply.translate.codeberg.org>"
"\n" "\n"
"Language-Team: Malay <https://translate.codeberg.org/projects/searxng/"
"searxng/ms/>\n"
"Language: ms\n" "Language: ms\n"
"Language-Team: Malay "
"<https://translate.codeberg.org/projects/searxng/searxng/ms/>\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.6.2\n"
"Generated-By: Babel 2.15.0\n" "Generated-By: Babel 2.15.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
#: searx/searxng.msg #: searx/searxng.msg
msgid "without further subgrouping" msgid "without further subgrouping"
msgstr "" msgstr "tanpa pengelompokan lanjut"
#. CONSTANT_NAMES['DEFAULT_CATEGORY'] #. CONSTANT_NAMES['DEFAULT_CATEGORY']
#: searx/searxng.msg #: searx/searxng.msg
@ -75,7 +77,7 @@ msgstr "radio"
#. CATEGORY_NAMES['TV'] #. CATEGORY_NAMES['TV']
#: searx/searxng.msg #: searx/searxng.msg
msgid "tv" msgid "tv"
msgstr "" msgstr "tv"
#. CATEGORY_NAMES['IT'] #. CATEGORY_NAMES['IT']
#: searx/searxng.msg #: searx/searxng.msg
@ -165,7 +167,7 @@ msgstr "gelap"
#. BRAND_CUSTOM_LINKS['UPTIME'] #. BRAND_CUSTOM_LINKS['UPTIME']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Uptime" msgid "Uptime"
msgstr "" msgstr "Masa aktif"
#. BRAND_CUSTOM_LINKS['ABOUT'] #. BRAND_CUSTOM_LINKS['ABOUT']
#: searx/searxng.msg searx/templates/simple/base.html:50 #: searx/searxng.msg searx/templates/simple/base.html:50
@ -175,22 +177,22 @@ msgstr "Tentang"
#. WEATHER_TERMS['AVERAGE TEMP.'] #. WEATHER_TERMS['AVERAGE TEMP.']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Average temp." msgid "Average temp."
msgstr "" msgstr "Suhu purata."
#. WEATHER_TERMS['CLOUD COVER'] #. WEATHER_TERMS['CLOUD COVER']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Cloud cover" msgid "Cloud cover"
msgstr "" msgstr "Litupan awan"
#. WEATHER_TERMS['CONDITION'] #. WEATHER_TERMS['CONDITION']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Condition" msgid "Condition"
msgstr "" msgstr "Keadaan"
#. WEATHER_TERMS['CURRENT CONDITION'] #. WEATHER_TERMS['CURRENT CONDITION']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Current condition" msgid "Current condition"
msgstr "" msgstr "Keadaan semasa"
#. WEATHER_TERMS['EVENING'] #. WEATHER_TERMS['EVENING']
#: searx/engines/wttr.py:100 searx/searxng.msg #: searx/engines/wttr.py:100 searx/searxng.msg
@ -200,22 +202,22 @@ msgstr "Petang"
#. WEATHER_TERMS['FEELS LIKE'] #. WEATHER_TERMS['FEELS LIKE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Feels like" msgid "Feels like"
msgstr "" msgstr "Rasa seperti"
#. WEATHER_TERMS['HUMIDITY'] #. WEATHER_TERMS['HUMIDITY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Humidity" msgid "Humidity"
msgstr "" msgstr "Kelembapan"
#. WEATHER_TERMS['MAX TEMP.'] #. WEATHER_TERMS['MAX TEMP.']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Max temp." msgid "Max temp."
msgstr "" msgstr "Suhu max."
#. WEATHER_TERMS['MIN TEMP.'] #. WEATHER_TERMS['MIN TEMP.']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Min temp." msgid "Min temp."
msgstr "" msgstr "Suhu min."
#. WEATHER_TERMS['MORNING'] #. WEATHER_TERMS['MORNING']
#: searx/engines/wttr.py:100 searx/searxng.msg #: searx/engines/wttr.py:100 searx/searxng.msg
@ -235,97 +237,97 @@ msgstr "Tengah hari"
#. WEATHER_TERMS['PRESSURE'] #. WEATHER_TERMS['PRESSURE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Pressure" msgid "Pressure"
msgstr "" msgstr "Tekanan"
#. WEATHER_TERMS['SUNRISE'] #. WEATHER_TERMS['SUNRISE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Sunrise" msgid "Sunrise"
msgstr "" msgstr "Matahari terbit"
#. WEATHER_TERMS['SUNSET'] #. WEATHER_TERMS['SUNSET']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Sunset" msgid "Sunset"
msgstr "" msgstr "Matahari terbenam"
#. WEATHER_TERMS['TEMPERATURE'] #. WEATHER_TERMS['TEMPERATURE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Temperature" msgid "Temperature"
msgstr "" msgstr "Suhu"
#. WEATHER_TERMS['UV INDEX'] #. WEATHER_TERMS['UV INDEX']
#: searx/searxng.msg #: searx/searxng.msg
msgid "UV index" msgid "UV index"
msgstr "" msgstr "Indeks UV"
#. WEATHER_TERMS['VISIBILITY'] #. WEATHER_TERMS['VISIBILITY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Visibility" msgid "Visibility"
msgstr "" msgstr "Penglihatan"
#. WEATHER_TERMS['WIND'] #. WEATHER_TERMS['WIND']
#: searx/searxng.msg #: searx/searxng.msg
msgid "Wind" msgid "Wind"
msgstr "" msgstr "Angin"
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS'] #. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "subscribers" msgid "subscribers"
msgstr "" msgstr "Langganan"
#. SOCIAL_MEDIA_TERMS['POSTS'] #. SOCIAL_MEDIA_TERMS['POSTS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "posts" msgid "posts"
msgstr "" msgstr "kiriman"
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS'] #. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "active users" msgid "active users"
msgstr "" msgstr "pengguna aktif"
#. SOCIAL_MEDIA_TERMS['COMMENTS'] #. SOCIAL_MEDIA_TERMS['COMMENTS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "comments" msgid "comments"
msgstr "" msgstr "komen"
#. SOCIAL_MEDIA_TERMS['USER'] #. SOCIAL_MEDIA_TERMS['USER']
#: searx/searxng.msg #: searx/searxng.msg
msgid "user" msgid "user"
msgstr "" msgstr "pengguna"
#. SOCIAL_MEDIA_TERMS['COMMUNITY'] #. SOCIAL_MEDIA_TERMS['COMMUNITY']
#: searx/searxng.msg #: searx/searxng.msg
msgid "community" msgid "community"
msgstr "" msgstr "komuniti"
#. SOCIAL_MEDIA_TERMS['POINTS'] #. SOCIAL_MEDIA_TERMS['POINTS']
#: searx/searxng.msg #: searx/searxng.msg
msgid "points" msgid "points"
msgstr "" msgstr "mata"
#. SOCIAL_MEDIA_TERMS['TITLE'] #. SOCIAL_MEDIA_TERMS['TITLE']
#: searx/searxng.msg #: searx/searxng.msg
msgid "title" msgid "title"
msgstr "" msgstr "tajuk"
#. SOCIAL_MEDIA_TERMS['AUTHOR'] #. SOCIAL_MEDIA_TERMS['AUTHOR']
#: searx/searxng.msg #: searx/searxng.msg
msgid "author" msgid "author"
msgstr "" msgstr "penulis"
#. SOCIAL_MEDIA_TERMS['THREAD OPEN'] #. SOCIAL_MEDIA_TERMS['THREAD OPEN']
#: searx/engines/discourse.py:121 searx/searxng.msg #: searx/engines/discourse.py:121 searx/searxng.msg
msgid "open" msgid "open"
msgstr "" msgstr "buka"
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED'] #. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
#: searx/engines/discourse.py:121 searx/searxng.msg #: searx/engines/discourse.py:121 searx/searxng.msg
msgid "closed" msgid "closed"
msgstr "" msgstr "tutup"
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED'] #. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
#: searx/engines/discourse.py:132 searx/searxng.msg #: searx/engines/discourse.py:132 searx/searxng.msg
msgid "answered" msgid "answered"
msgstr "" msgstr "dijawab"
#: searx/webapp.py:330 #: searx/webapp.py:330
msgid "No item found" msgid "No item found"
@ -430,7 +432,7 @@ msgstr "Fungsi statistik"
#: searx/answerers/statistics/answerer.py:49 #: searx/answerers/statistics/answerer.py:49
msgid "Compute {functions} of the arguments" msgid "Compute {functions} of the arguments"
msgstr "" msgstr "Mengira {functions} dari hujah-hujah"
#: searx/engines/openstreetmap.py:159 #: searx/engines/openstreetmap.py:159
msgid "Get directions" msgid "Get directions"
@ -450,7 +452,7 @@ msgstr "Saluran"
#: searx/engines/radio_browser.py:105 #: searx/engines/radio_browser.py:105
msgid "bitrate" msgid "bitrate"
msgstr "" msgstr "kadar bit"
#: searx/engines/radio_browser.py:106 #: searx/engines/radio_browser.py:106
msgid "votes" msgid "votes"
@ -470,6 +472,8 @@ msgid ""
"{numCitations} citations from the year {firstCitationVelocityYear} to " "{numCitations} citations from the year {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}" "{lastCitationVelocityYear}"
msgstr "" msgstr ""
"{numCitations} cetusan daripada tahun {firstCitationVelocityYear} to "
"{lastCitationVelocityYear}"
#: searx/engines/tineye.py:39 #: searx/engines/tineye.py:39
msgid "" msgid ""
@ -486,6 +490,8 @@ msgid ""
"The image is too simple to find matches. TinEye requires a basic level of" "The image is too simple to find matches. TinEye requires a basic level of"
" visual detail to successfully identify matches." " visual detail to successfully identify matches."
msgstr "" msgstr ""
"Gambar ini terlalu mudah untuk mencari padanan. TinEye memerlukan tahap "
"butiran visual asas untuk mengenal pasti padanan dengan berjaya."
#: searx/engines/tineye.py:51 #: searx/engines/tineye.py:51
msgid "The image could not be downloaded." msgid "The image could not be downloaded."
@ -493,7 +499,7 @@ msgstr "Imej tidak dapat dimuat turun."
#: searx/engines/zlibrary.py:129 #: searx/engines/zlibrary.py:129
msgid "Book rating" msgid "Book rating"
msgstr "" msgstr "Penarafan buku"
#: searx/engines/zlibrary.py:130 #: searx/engines/zlibrary.py:130
msgid "File quality" msgid "File quality"
@ -501,7 +507,7 @@ msgstr "Kualiti fail"
#: searx/plugins/calculator.py:12 #: searx/plugins/calculator.py:12
msgid "Calculate mathematical expressions via the search bar" msgid "Calculate mathematical expressions via the search bar"
msgstr "" msgstr "Kira ungkapan matematik melalui bar carian"
#: searx/plugins/hash_plugin.py:10 #: searx/plugins/hash_plugin.py:10
msgid "Converts strings to different hash digests." msgid "Converts strings to different hash digests."
@ -509,7 +515,7 @@ msgstr "Ubah rentetan kepada \"hash digest\" yang berbeza."
#: searx/plugins/hash_plugin.py:38 #: searx/plugins/hash_plugin.py:38
msgid "hash digest" msgid "hash digest"
msgstr "" msgstr "huraian hash"
#: searx/plugins/hostname_replace.py:7 #: searx/plugins/hostname_replace.py:7
msgid "Hostname replace" msgid "Hostname replace"
@ -517,11 +523,13 @@ msgstr "Gantikan nama hos"
#: searx/plugins/hostnames.py:68 #: searx/plugins/hostnames.py:68
msgid "Hostnames plugin" msgid "Hostnames plugin"
msgstr "" msgstr "Plugin nama hos"
#: searx/plugins/hostnames.py:69 #: searx/plugins/hostnames.py:69
msgid "Rewrite hostnames, remove results or prioritize them based on the hostname" msgid "Rewrite hostnames, remove results or prioritize them based on the hostname"
msgstr "" msgstr ""
"Menulis semula nama hos, buang keputusan atau memberi keutamaan kepada "
"mereka berdasarkan nama hos"
#: searx/plugins/oa_doi_rewrite.py:12 #: searx/plugins/oa_doi_rewrite.py:12
msgid "Open Access DOI rewrite" msgid "Open Access DOI rewrite"
@ -549,11 +557,11 @@ msgstr ""
#: searx/plugins/self_info.py:28 #: searx/plugins/self_info.py:28
msgid "Your IP is: " msgid "Your IP is: "
msgstr "" msgstr "IP anda adalah: "
#: searx/plugins/self_info.py:31 #: searx/plugins/self_info.py:31
msgid "Your user-agent is: " msgid "Your user-agent is: "
msgstr "" msgstr "Agen pengguna anda adalah: "
#: searx/plugins/tor_check.py:24 #: searx/plugins/tor_check.py:24
msgid "Tor check plugin" msgid "Tor check plugin"
@ -564,6 +572,9 @@ msgid ""
"This plugin checks if the address of the request is a Tor exit-node, and " "This plugin checks if the address of the request is a Tor exit-node, and "
"informs the user if it is; like check.torproject.org, but from SearXNG." "informs the user if it is; like check.torproject.org, but from SearXNG."
msgstr "" msgstr ""
"Plugin ini memeriksa jika alamat permintaan adalah nod-keluaran Tor, dan "
"memberitahu pengguna jika ya; seperti check.torproject.org, tetapi dari "
"SearXNG."
#: searx/plugins/tor_check.py:61 #: searx/plugins/tor_check.py:61
msgid "" msgid ""
@ -587,15 +598,15 @@ msgstr "Anda tidak mengguna Tor dan ini adalah alamat IP luaran anda: {ip_addres
#: searx/plugins/tracker_url_remover.py:16 #: searx/plugins/tracker_url_remover.py:16
msgid "Tracker URL remover" msgid "Tracker URL remover"
msgstr "" msgstr "Pemadam penjejak URL"
#: searx/plugins/tracker_url_remover.py:17 #: searx/plugins/tracker_url_remover.py:17
msgid "Remove trackers arguments from the returned URL" msgid "Remove trackers arguments from the returned URL"
msgstr "" msgstr "Buang hujah penjejak dari URL yang dikembalikan"
#: searx/plugins/unit_converter.py:29 #: searx/plugins/unit_converter.py:29
msgid "Convert between units" msgid "Convert between units"
msgstr "" msgstr "Tukar antara unit"
#: searx/templates/simple/404.html:4 #: searx/templates/simple/404.html:4
msgid "Page not found" msgid "Page not found"
@ -625,7 +636,7 @@ msgstr "Didukung oleh"
#: searx/templates/simple/base.html:68 #: searx/templates/simple/base.html:68
msgid "a privacy-respecting, open metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "" msgstr "enjin carian meta terbuka yang menghormati privasi"
#: searx/templates/simple/base.html:69 #: searx/templates/simple/base.html:69
#: searx/templates/simple/result_templates/packages.html:59 #: searx/templates/simple/result_templates/packages.html:59
@ -634,7 +645,7 @@ msgstr "Kod sumber"
#: searx/templates/simple/base.html:70 #: searx/templates/simple/base.html:70
msgid "Issue tracker" msgid "Issue tracker"
msgstr "" msgstr "Isu penjejak"
#: searx/templates/simple/base.html:71 searx/templates/simple/stats.html:18 #: searx/templates/simple/base.html:71 searx/templates/simple/stats.html:18
msgid "Engine stats" msgid "Engine stats"
@ -642,7 +653,7 @@ msgstr "Statistik enjin"
#: searx/templates/simple/base.html:73 #: searx/templates/simple/base.html:73
msgid "Public instances" msgid "Public instances"
msgstr "" msgstr "Kejadian awam"
#: searx/templates/simple/base.html:76 #: searx/templates/simple/base.html:76
msgid "Privacy policy" msgid "Privacy policy"
@ -650,11 +661,11 @@ msgstr "Polisi privasi"
#: searx/templates/simple/base.html:79 #: searx/templates/simple/base.html:79
msgid "Contact instance maintainer" msgid "Contact instance maintainer"
msgstr "" msgstr "Hubungi penyelenggara kejadian"
#: searx/templates/simple/categories.html:26 #: searx/templates/simple/categories.html:26
msgid "Click on the magnifier to perform search" msgid "Click on the magnifier to perform search"
msgstr "" msgstr "Klik pada kanta pembesar untuk melakukan carian"
#: searx/templates/simple/macros.html:35 #: searx/templates/simple/macros.html:35
msgid "Length" msgid "Length"
@ -673,15 +684,15 @@ msgstr "dicache"
#: searx/templates/simple/macros.html:44 #: searx/templates/simple/macros.html:44
msgid "proxied" msgid "proxied"
msgstr "" msgstr "diproksi"
#: searx/templates/simple/new_issue.html:64 #: searx/templates/simple/new_issue.html:64
msgid "Start submiting a new issue on GitHub" msgid "Start submiting a new issue on GitHub"
msgstr "" msgstr "Mula menghantar isu baru di Github"
#: searx/templates/simple/new_issue.html:66 #: searx/templates/simple/new_issue.html:66
msgid "Please check for existing bugs about this engine on GitHub" msgid "Please check for existing bugs about this engine on GitHub"
msgstr "" msgstr "Sila semak untuk bug yang sedia ada tentang enjin ini di Github"
#: searx/templates/simple/new_issue.html:69 #: searx/templates/simple/new_issue.html:69
msgid "I confirm there is no existing bug about the issue I encounter" msgid "I confirm there is no existing bug about the issue I encounter"
@ -1636,4 +1647,3 @@ msgstr "sembunyikkan video"
#~ msgid "TiB" #~ msgid "TiB"
#~ msgstr "TiB" #~ msgstr "TiB"

View file

@ -20,21 +20,23 @@
# marcelStangenberger <codeberg@xo.nl>, 2024. # marcelStangenberger <codeberg@xo.nl>, 2024.
# yannickmaes <yannickmaes@users.noreply.translate.codeberg.org>, 2024. # yannickmaes <yannickmaes@users.noreply.translate.codeberg.org>, 2024.
# MVDW-Java <MVDW-Java@users.noreply.translate.codeberg.org>, 2024. # MVDW-Java <MVDW-Java@users.noreply.translate.codeberg.org>, 2024.
# notlmutsaers <notlmutsaers@users.noreply.translate.codeberg.org>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-06-17 12:15+0000\n" "POT-Creation-Date: 2024-06-17 12:15+0000\n"
"PO-Revision-Date: 2024-06-12 12:24+0000\n" "PO-Revision-Date: 2024-07-09 15:18+0000\n"
"Last-Translator: MVDW-Java <MVDW-" "Last-Translator: notlmutsaers <notlmutsaers@users.noreply.translate.codeberg."
"Java@users.noreply.translate.codeberg.org>\n" "org>\n"
"Language-Team: Dutch <https://translate.codeberg.org/projects/searxng/"
"searxng/nl/>\n"
"Language: nl\n" "Language: nl\n"
"Language-Team: Dutch "
"<https://translate.codeberg.org/projects/searxng/searxng/nl/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6.2\n"
"Generated-By: Babel 2.15.0\n" "Generated-By: Babel 2.15.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -566,11 +568,11 @@ msgstr ""
#: searx/plugins/self_info.py:28 #: searx/plugins/self_info.py:28
msgid "Your IP is: " msgid "Your IP is: "
msgstr "" msgstr "Jouw IP is: "
#: searx/plugins/self_info.py:31 #: searx/plugins/self_info.py:31
msgid "Your user-agent is: " msgid "Your user-agent is: "
msgstr "" msgstr "Jouw gebruiker-agent is: "
#: searx/plugins/tor_check.py:24 #: searx/plugins/tor_check.py:24
msgid "Tor check plugin" msgid "Tor check plugin"
@ -1966,4 +1968,3 @@ msgstr "verberg video"
#~ msgid "TiB" #~ msgid "TiB"
#~ msgstr "TiB" #~ msgstr "TiB"

View file

@ -17,13 +17,14 @@
# lspepinho <lspepinho@users.noreply.translate.codeberg.org>, 2024. # lspepinho <lspepinho@users.noreply.translate.codeberg.org>, 2024.
# diodio <diodio@users.noreply.translate.codeberg.org>, 2024. # diodio <diodio@users.noreply.translate.codeberg.org>, 2024.
# gvlx <gvlx@users.noreply.translate.codeberg.org>, 2024. # gvlx <gvlx@users.noreply.translate.codeberg.org>, 2024.
# ds451 <ds451@users.noreply.translate.codeberg.org>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: searx\n" "Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-06-17 12:15+0000\n" "POT-Creation-Date: 2024-06-17 12:15+0000\n"
"PO-Revision-Date: 2024-06-25 11:18+0000\n" "PO-Revision-Date: 2024-07-11 16:18+0000\n"
"Last-Translator: gvlx <gvlx@users.noreply.translate.codeberg.org>\n" "Last-Translator: ds451 <ds451@users.noreply.translate.codeberg.org>\n"
"Language-Team: Portuguese <https://translate.codeberg.org/projects/searxng/" "Language-Team: Portuguese <https://translate.codeberg.org/projects/searxng/"
"searxng/pt/>\n" "searxng/pt/>\n"
"Language: pt\n" "Language: pt\n"
@ -31,7 +32,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Weblate 5.5.5\n" "X-Generator: Weblate 5.6.2\n"
"Generated-By: Babel 2.15.0\n" "Generated-By: Babel 2.15.0\n"
#. CONSTANT_NAMES['NO_SUBGROUPING'] #. CONSTANT_NAMES['NO_SUBGROUPING']
@ -640,7 +641,7 @@ msgstr "Produzido por"
#: searx/templates/simple/base.html:68 #: searx/templates/simple/base.html:68
msgid "a privacy-respecting, open metasearch engine" msgid "a privacy-respecting, open metasearch engine"
msgstr "Um motor de multi-pesquisa, que repeita a privacidade" msgstr "Um motor de multi-pesquisa, que respeita a privacidade"
#: searx/templates/simple/base.html:69 #: searx/templates/simple/base.html:69
#: searx/templates/simple/result_templates/packages.html:59 #: searx/templates/simple/result_templates/packages.html:59

View file

@ -61,7 +61,7 @@ from searx.botdetection import link_token
from searx.data import ENGINE_DESCRIPTIONS from searx.data import ENGINE_DESCRIPTIONS
from searx.results import Timing from searx.results import Timing
from searx.settings_defaults import OUTPUT_FORMATS from searx.settings_defaults import OUTPUT_FORMATS
from searx.settings_loader import get_default_settings_path from searx.settings_loader import DEFAULT_SETTINGS_FILE
from searx.exceptions import SearxParameterException from searx.exceptions import SearxParameterException
from searx.engines import ( from searx.engines import (
DEFAULT_CATEGORY, DEFAULT_CATEGORY,
@ -1347,7 +1347,7 @@ def run():
port=settings['server']['port'], port=settings['server']['port'],
host=settings['server']['bind_address'], host=settings['server']['bind_address'],
threaded=True, threaded=True,
extra_files=[get_default_settings_path()], extra_files=[DEFAULT_SETTINGS_FILE],
) )

View file

@ -1,2 +1,3 @@
Test: Test:
"**********" "**********"
xxx

View file

@ -1,7 +1,6 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
# pylint: disable=missing-module-docstring # pylint: disable=missing-module-docstring
from searx import settings
from searx.engines import load_engines from searx.engines import load_engines
from searx.query import RawTextQuery from searx.query import RawTextQuery
from tests import SearxTestCase from tests import SearxTestCase
@ -234,9 +233,14 @@ class TestBang(SearxTestCase): # pylint:disable=missing-class-docstring
SPECIFIC_BANGS = ['!dummy_engine', '!du', '!general'] SPECIFIC_BANGS = ['!dummy_engine', '!du', '!general']
THE_QUERY = 'the query' THE_QUERY = 'the query'
def test_bang(self): def setUp(self):
load_engines(TEST_ENGINES) load_engines(TEST_ENGINES)
def tearDown(self):
load_engines([])
def test_bang(self):
for bang in TestBang.SPECIFIC_BANGS: for bang in TestBang.SPECIFIC_BANGS:
with self.subTest(msg="Check bang", bang=bang): with self.subTest(msg="Check bang", bang=bang):
query_text = TestBang.THE_QUERY + ' ' + bang query_text = TestBang.THE_QUERY + ' ' + bang
@ -247,7 +251,6 @@ class TestBang(SearxTestCase): # pylint:disable=missing-class-docstring
self.assertEqual(query.user_query_parts, TestBang.THE_QUERY.split(' ')) self.assertEqual(query.user_query_parts, TestBang.THE_QUERY.split(' '))
def test_specific(self): def test_specific(self):
load_engines(TEST_ENGINES)
for bang in TestBang.SPECIFIC_BANGS: for bang in TestBang.SPECIFIC_BANGS:
with self.subTest(msg="Check bang is specific", bang=bang): with self.subTest(msg="Check bang is specific", bang=bang):
query_text = TestBang.THE_QUERY + ' ' + bang query_text = TestBang.THE_QUERY + ' ' + bang
@ -255,12 +258,10 @@ class TestBang(SearxTestCase): # pylint:disable=missing-class-docstring
self.assertTrue(query.specific) self.assertTrue(query.specific)
def test_bang_not_found(self): def test_bang_not_found(self):
load_engines(TEST_ENGINES)
query = RawTextQuery('the query !bang_not_found', []) query = RawTextQuery('the query !bang_not_found', [])
self.assertEqual(query.getFullQuery(), 'the query !bang_not_found') self.assertEqual(query.getFullQuery(), 'the query !bang_not_found')
def test_bang_autocomplete(self): def test_bang_autocomplete(self):
load_engines(TEST_ENGINES)
query = RawTextQuery('the query !dum', []) query = RawTextQuery('the query !dum', [])
self.assertEqual(query.autocomplete_list, ['!dummy_engine']) self.assertEqual(query.autocomplete_list, ['!dummy_engine'])
@ -269,7 +270,6 @@ class TestBang(SearxTestCase): # pylint:disable=missing-class-docstring
self.assertEqual(query.getQuery(), '!dum the query') self.assertEqual(query.getQuery(), '!dum the query')
def test_bang_autocomplete_empty(self): def test_bang_autocomplete_empty(self):
load_engines(settings['engines'])
query = RawTextQuery('the query !', []) query = RawTextQuery('the query !', [])
self.assertEqual(query.autocomplete_list, ['!images', '!wikipedia', '!osm']) self.assertEqual(query.autocomplete_list, ['!images', '!wikipedia', '!osm'])

View file

@ -1,7 +1,9 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
# pylint: disable=missing-module-docstring # pylint: disable=missing-module-docstring
from os.path import dirname, join, abspath from pathlib import Path
import os
from unittest.mock import patch from unittest.mock import patch
from searx.exceptions import SearxSettingsException from searx.exceptions import SearxSettingsException
@ -9,7 +11,8 @@ from searx import settings_loader
from tests import SearxTestCase from tests import SearxTestCase
test_dir = abspath(dirname(__file__)) def _settings(f_name):
return str(Path(__file__).parent.absolute() / "settings" / f_name)
class TestLoad(SearxTestCase): # pylint: disable=missing-class-docstring class TestLoad(SearxTestCase): # pylint: disable=missing-class-docstring
@ -18,16 +21,9 @@ class TestLoad(SearxTestCase): # pylint: disable=missing-class-docstring
settings_loader.load_yaml('/dev/zero') settings_loader.load_yaml('/dev/zero')
with self.assertRaises(SearxSettingsException): with self.assertRaises(SearxSettingsException):
settings_loader.load_yaml(join(test_dir, '/settings/syntaxerror_settings.yml')) settings_loader.load_yaml(_settings("syntaxerror_settings.yml"))
with self.assertRaises(SearxSettingsException): self.assertEqual(settings_loader.load_yaml(_settings("empty_settings.yml")), {})
settings_loader.load_yaml(join(test_dir, '/settings/empty_settings.yml'))
def test_existing_filename_or_none(self):
self.assertIsNone(settings_loader.existing_filename_or_none('/dev/zero'))
bad_settings_path = join(test_dir, 'settings/syntaxerror_settings.yml')
self.assertEqual(settings_loader.existing_filename_or_none(bad_settings_path), bad_settings_path)
class TestDefaultSettings(SearxTestCase): # pylint: disable=missing-class-docstring class TestDefaultSettings(SearxTestCase): # pylint: disable=missing-class-docstring
@ -55,24 +51,22 @@ class TestUserSettings(SearxTestCase): # pylint: disable=missing-class-docstrin
self.assertFalse(settings_loader.is_use_default_settings({'use_default_settings': 0})) self.assertFalse(settings_loader.is_use_default_settings({'use_default_settings': 0}))
def test_user_settings_not_found(self): def test_user_settings_not_found(self):
with patch.dict(settings_loader.environ, {'SEARXNG_SETTINGS_PATH': '/dev/null'}): with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("not_exists.yml")}):
settings, msg = settings_loader.load_settings() with self.assertRaises(EnvironmentError):
self.assertTrue(msg.startswith('load the default settings from')) _s, _m = settings_loader.load_settings()
self.assertEqual(settings['server']['secret_key'], "ultrasecretkey") with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': "/folder/not/exists"}):
with self.assertRaises(EnvironmentError):
_s, _m = settings_loader.load_settings()
def test_user_settings(self): def test_user_settings(self):
with patch.dict( with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_simple.yml")}):
settings_loader.environ, {'SEARXNG_SETTINGS_PATH': join(test_dir, 'settings/user_settings_simple.yml')}
):
settings, msg = settings_loader.load_settings() settings, msg = settings_loader.load_settings()
self.assertTrue(msg.startswith('merge the default settings')) self.assertTrue(msg.startswith('merge the default settings'))
self.assertEqual(settings['server']['secret_key'], "user_secret_key") self.assertEqual(settings['server']['secret_key'], "user_secret_key")
self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value") self.assertEqual(settings['server']['default_http_headers']['Custom-Header'], "Custom-Value")
def test_user_settings_remove(self): def test_user_settings_remove(self):
with patch.dict( with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_remove.yml")}):
settings_loader.environ, {'SEARXNG_SETTINGS_PATH': join(test_dir, 'settings/user_settings_remove.yml')}
):
settings, msg = settings_loader.load_settings() settings, msg = settings_loader.load_settings()
self.assertTrue(msg.startswith('merge the default settings')) self.assertTrue(msg.startswith('merge the default settings'))
self.assertEqual(settings['server']['secret_key'], "user_secret_key") self.assertEqual(settings['server']['secret_key'], "user_secret_key")
@ -83,9 +77,7 @@ class TestUserSettings(SearxTestCase): # pylint: disable=missing-class-docstrin
self.assertIn('wikipedia', engine_names) self.assertIn('wikipedia', engine_names)
def test_user_settings_remove2(self): def test_user_settings_remove2(self):
with patch.dict( with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_remove2.yml")}):
settings_loader.environ, {'SEARXNG_SETTINGS_PATH': join(test_dir, 'settings/user_settings_remove2.yml')}
):
settings, msg = settings_loader.load_settings() settings, msg = settings_loader.load_settings()
self.assertTrue(msg.startswith('merge the default settings')) self.assertTrue(msg.startswith('merge the default settings'))
self.assertEqual(settings['server']['secret_key'], "user_secret_key") self.assertEqual(settings['server']['secret_key'], "user_secret_key")
@ -101,9 +93,7 @@ class TestUserSettings(SearxTestCase): # pylint: disable=missing-class-docstrin
self.assertEqual(newengine[0]['engine'], 'dummy') self.assertEqual(newengine[0]['engine'], 'dummy')
def test_user_settings_keep_only(self): def test_user_settings_keep_only(self):
with patch.dict( with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings_keep_only.yml")}):
settings_loader.environ, {'SEARXNG_SETTINGS_PATH': join(test_dir, 'settings/user_settings_keep_only.yml')}
):
settings, msg = settings_loader.load_settings() settings, msg = settings_loader.load_settings()
self.assertTrue(msg.startswith('merge the default settings')) self.assertTrue(msg.startswith('merge the default settings'))
engine_names = [engine['name'] for engine in settings['engines']] engine_names = [engine['name'] for engine in settings['engines']]
@ -112,9 +102,7 @@ class TestUserSettings(SearxTestCase): # pylint: disable=missing-class-docstrin
self.assertEqual(len(settings['engines'][2]), 1) self.assertEqual(len(settings['engines'][2]), 1)
def test_custom_settings(self): def test_custom_settings(self):
with patch.dict( with patch.dict(os.environ, {'SEARXNG_SETTINGS_PATH': _settings("user_settings.yml")}):
settings_loader.environ, {'SEARXNG_SETTINGS_PATH': join(test_dir, 'settings/user_settings.yml')}
):
settings, msg = settings_loader.load_settings() settings, msg = settings_loader.load_settings()
self.assertTrue(msg.startswith('load the user settings from')) self.assertTrue(msg.startswith('load the user settings from'))
self.assertEqual(settings['server']['port'], 9000) self.assertEqual(settings['server']['port'], 9000)