mirror of https://github.com/searxng/searxng.git
Compare commits
18 Commits
2b32f13368
...
21f5c1b621
Author | SHA1 | Date |
---|---|---|
Grant Lanham Jr | 21f5c1b621 | |
dependabot[bot] | 4b57bc3db1 | |
searxng-bot | a345cbbe51 | |
Nicolas Dato | abd9b271bc | |
Leo Liu | dfaf5868e2 | |
Leo Liu | b173f3a8b9 | |
dependabot[bot] | 2fbf15eccb | |
searxng-bot | 08c5f258d8 | |
dependabot[bot] | cd384a8a60 | |
Markus Heiser | c4055e449f | |
Markus Heiser | 2fdbf2622b | |
Bnyro | b07c0ae39f | |
Markus Heiser | 56e3d72a76 | |
searxng-bot | cc148a76b0 | |
uply23333 | fa108c140f | |
Grant Lanham | 27aa9c4cb1 | |
Grant Lanham | 118a748fba | |
Grant Lanham | 9f7244d6f1 |
|
@ -1,5 +1,5 @@
|
|||
name: "Checker"
|
||||
on:
|
||||
on: # yamllint disable-line rule:truthy
|
||||
schedule:
|
||||
- cron: "0 4 * * 5"
|
||||
workflow_dispatch:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name: "Update searx.data"
|
||||
on:
|
||||
on: # yamllint disable-line rule:truthy
|
||||
schedule:
|
||||
- cron: "59 23 28 * *"
|
||||
workflow_dispatch:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
name: Integration
|
||||
|
||||
on:
|
||||
on: # yamllint disable-line rule:truthy
|
||||
push:
|
||||
branches: ["master"]
|
||||
pull_request:
|
||||
|
@ -16,70 +16,62 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-20.04]
|
||||
python-version: ["3.9", "3.10", "3.11", "3.12",]
|
||||
python-version: ["3.9", "3.10", "3.11", "3.12"]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Ubuntu packages
|
||||
run: |
|
||||
sudo ./utils/searxng.sh install packages
|
||||
sudo apt install firefox
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('requirements*.txt', 'setup.py') }}
|
||||
- name: Install Python dependencies
|
||||
if: steps.cache-python.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
make V=1 install
|
||||
make V=1 gecko.driver
|
||||
- name: Run tests
|
||||
run: make V=1 ci.test
|
||||
- name: Test coverage
|
||||
run: make V=1 test.coverage
|
||||
- name: Store coverage result
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: coverage-${{ matrix.python-version }}
|
||||
path: coverage/
|
||||
retention-days: 60
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Ubuntu packages
|
||||
run: |
|
||||
sudo ./utils/searxng.sh install packages
|
||||
sudo apt install firefox
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('requirements*.txt', 'setup.py') }}
|
||||
- name: Install Python dependencies
|
||||
if: steps.cache-python.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
make V=1 install
|
||||
make V=1 gecko.driver
|
||||
- name: Run tests
|
||||
run: make V=1 ci.test
|
||||
|
||||
themes:
|
||||
name: Themes
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Ubuntu packages
|
||||
run: sudo ./utils/searxng.sh install buildhost
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||
- name: Install node dependencies
|
||||
run: make V=1 node.env
|
||||
- name: Build themes
|
||||
run: make V=1 themes.all
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Ubuntu packages
|
||||
run: sudo ./utils/searxng.sh install buildhost
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||
- name: Install node dependencies
|
||||
run: make V=1 node.env
|
||||
- name: Build themes
|
||||
run: make V=1 themes.all
|
||||
|
||||
documentation:
|
||||
name: Documentation
|
||||
|
@ -87,40 +79,40 @@ jobs:
|
|||
permissions:
|
||||
contents: write # for JamesIves/github-pages-deploy-action to push changes in repo
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
persist-credentials: false
|
||||
- name: Install Ubuntu packages
|
||||
run: sudo ./utils/searxng.sh install buildhost
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||
- name: Build documentation
|
||||
run: |
|
||||
make V=1 docs.clean docs.html
|
||||
- name: Deploy
|
||||
if: github.ref == 'refs/heads/master'
|
||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
BRANCH: gh-pages
|
||||
FOLDER: dist/docs
|
||||
CLEAN: true # Automatically remove deleted files from the deploy branch
|
||||
SINGLE_COMMIT: True
|
||||
COMMIT_MESSAGE: '[doc] build from commit ${{ github.sha }}'
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
persist-credentials: false
|
||||
- name: Install Ubuntu packages
|
||||
run: sudo ./utils/searxng.sh install buildhost
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||
- name: Build documentation
|
||||
run: |
|
||||
make V=1 docs.clean docs.html
|
||||
- name: Deploy
|
||||
if: github.ref == 'refs/heads/master'
|
||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
BRANCH: gh-pages
|
||||
FOLDER: dist/docs
|
||||
CLEAN: true # Automatically remove deleted files from the deploy branch
|
||||
SINGLE_COMMIT: true
|
||||
COMMIT_MESSAGE: '[doc] build from commit ${{ github.sha }}'
|
||||
|
||||
babel:
|
||||
name: Update translations branch
|
||||
|
@ -133,37 +125,37 @@ jobs:
|
|||
permissions:
|
||||
contents: write # for make V=1 weblate.push.translations
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||
- name: weblate & git setup
|
||||
env:
|
||||
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
||||
run: |
|
||||
mkdir -p ~/.config
|
||||
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
||||
git config --global user.email "searxng-bot@users.noreply.github.com"
|
||||
git config --global user.name "searxng-bot"
|
||||
- name: Update transations
|
||||
id: update
|
||||
run: |
|
||||
make V=1 weblate.push.translations
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||
- name: weblate & git setup
|
||||
env:
|
||||
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
||||
run: |
|
||||
mkdir -p ~/.config
|
||||
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
||||
git config --global user.email "searxng-bot@users.noreply.github.com"
|
||||
git config --global user.name "searxng-bot"
|
||||
- name: Update transations
|
||||
id: update
|
||||
run: |
|
||||
make V=1 weblate.push.translations
|
||||
|
||||
dockers:
|
||||
name: Docker
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name: "Security checks"
|
||||
on:
|
||||
on: # yamllint disable-line rule:truthy
|
||||
schedule:
|
||||
- cron: "42 05 * * *"
|
||||
workflow_dispatch:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name: "Update translations"
|
||||
on:
|
||||
on: # yamllint disable-line rule:truthy
|
||||
schedule:
|
||||
- cron: "05 07 * * 5"
|
||||
workflow_dispatch:
|
||||
|
@ -10,50 +10,50 @@ jobs:
|
|||
runs-on: ubuntu-20.04
|
||||
if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||
- name: weblate & git setup
|
||||
env:
|
||||
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
||||
run: |
|
||||
mkdir -p ~/.config
|
||||
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
||||
git config --global user.email "searxng-bot@users.noreply.github.com"
|
||||
git config --global user.name "searxng-bot"
|
||||
- name: Merge and push transation updates
|
||||
run: |
|
||||
make V=1 weblate.translations.commit
|
||||
- name: Create Pull Request
|
||||
id: cpr
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
with:
|
||||
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||
commit-message: '[l10n] update translations from Weblate'
|
||||
committer: searxng-bot <searxng-bot@users.noreply.github.com>
|
||||
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
||||
signoff: false
|
||||
branch: translations_update
|
||||
delete-branch: true
|
||||
draft: false
|
||||
title: '[l10n] update translations from Weblate'
|
||||
body: |
|
||||
update translations from Weblate
|
||||
labels: |
|
||||
translation
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
architecture: 'x64'
|
||||
- name: Cache Python dependencies
|
||||
id: cache-python
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
./local
|
||||
./.nvm
|
||||
./node_modules
|
||||
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
|
||||
- name: weblate & git setup
|
||||
env:
|
||||
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
|
||||
run: |
|
||||
mkdir -p ~/.config
|
||||
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
|
||||
git config --global user.email "searxng-bot@users.noreply.github.com"
|
||||
git config --global user.name "searxng-bot"
|
||||
- name: Merge and push transation updates
|
||||
run: |
|
||||
make V=1 weblate.translations.commit
|
||||
- name: Create Pull Request
|
||||
id: cpr
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
with:
|
||||
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
|
||||
commit-message: '[l10n] update translations from Weblate'
|
||||
committer: searxng-bot <searxng-bot@users.noreply.github.com>
|
||||
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
||||
signoff: false
|
||||
branch: translations_update
|
||||
delete-branch: true
|
||||
draft: false
|
||||
title: '[l10n] update translations from Weblate'
|
||||
body: |
|
||||
update translations from Weblate
|
||||
labels: |
|
||||
translation
|
||||
|
|
2
manage
2
manage
|
@ -57,7 +57,7 @@ while IFS= read -r line; do
|
|||
if [ "$line" != "tests/unit/settings/syntaxerror_settings.yml" ]; then
|
||||
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' '.github/*.yml' '.github/*/*.yml')"
|
||||
|
||||
RST_FILES=(
|
||||
'README.rst'
|
||||
|
|
|
@ -4,7 +4,7 @@ cov-core==1.15.0
|
|||
black==24.3.0
|
||||
pylint==3.3.1
|
||||
splinter==0.21.0
|
||||
selenium==4.25.0
|
||||
selenium==4.26.1
|
||||
Pallets-Sphinx-Themes==2.3.0
|
||||
Sphinx==7.4.7
|
||||
sphinx-issues==5.0.0
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
certifi==2024.8.30
|
||||
babel==2.16.0
|
||||
flask-babel==4.0.0
|
||||
flask==3.0.3
|
||||
flask==3.1.0
|
||||
jinja2==3.1.4
|
||||
lxml==5.3.0
|
||||
pygments==2.18.0
|
||||
|
@ -18,4 +18,4 @@ fasttext-predict==0.9.2.2
|
|||
tomli==2.0.2; python_version < '3.11'
|
||||
msgspec==0.18.6
|
||||
eval_type_backport; python_version < '3.9'
|
||||
typer-slim==0.12.5
|
||||
typer-slim==0.13.0
|
||||
|
|
|
@ -34,10 +34,10 @@ Implementations
|
|||
"""
|
||||
|
||||
from typing import List, Dict, Any, Optional
|
||||
from urllib.parse import quote
|
||||
from urllib.parse import urlencode
|
||||
from lxml import html
|
||||
|
||||
from searx.utils import extract_text, eval_xpath, eval_xpath_list
|
||||
from searx.utils import extract_text, eval_xpath, eval_xpath_getindex, eval_xpath_list
|
||||
from searx.enginelib.traits import EngineTraits
|
||||
from searx.data import ENGINE_TRAITS
|
||||
|
||||
|
@ -53,7 +53,7 @@ about: Dict[str, Any] = {
|
|||
|
||||
# engine dependent config
|
||||
categories: List[str] = ["files"]
|
||||
paging: bool = False
|
||||
paging: bool = True
|
||||
|
||||
# search-url
|
||||
base_url: str = "https://annas-archive.org"
|
||||
|
@ -99,9 +99,18 @@ def init(engine_settings=None): # pylint: disable=unused-argument
|
|||
|
||||
|
||||
def request(query, params: Dict[str, Any]) -> Dict[str, Any]:
|
||||
q = quote(query)
|
||||
lang = traits.get_language(params["language"], traits.all_locale) # type: ignore
|
||||
params["url"] = base_url + f"/search?lang={lang or ''}&content={aa_content}&ext={aa_ext}&sort={aa_sort}&q={q}"
|
||||
args = {
|
||||
'lang': lang,
|
||||
'content': aa_content,
|
||||
'ext': aa_ext,
|
||||
'sort': aa_sort,
|
||||
'q': query,
|
||||
'page': params['pageno'],
|
||||
}
|
||||
# filter out None and empty values
|
||||
filtered_args = dict((k, v) for k, v in args.items() if v)
|
||||
params["url"] = f"{base_url}/search?{urlencode(filtered_args)}"
|
||||
return params
|
||||
|
||||
|
||||
|
@ -128,12 +137,12 @@ def response(resp) -> List[Dict[str, Optional[str]]]:
|
|||
def _get_result(item):
|
||||
return {
|
||||
'template': 'paper.html',
|
||||
'url': base_url + item.xpath('./@href')[0],
|
||||
'url': base_url + extract_text(eval_xpath_getindex(item, './@href', 0)),
|
||||
'title': extract_text(eval_xpath(item, './/h3/text()[1]')),
|
||||
'publisher': extract_text(eval_xpath(item, './/div[contains(@class, "text-sm")]')),
|
||||
'authors': [extract_text(eval_xpath(item, './/div[contains(@class, "italic")]'))],
|
||||
'content': extract_text(eval_xpath(item, './/div[contains(@class, "text-xs")]')),
|
||||
'thumbnail': item.xpath('.//img/@src')[0],
|
||||
'thumbnail': extract_text(eval_xpath_getindex(item, './/img/@src', 0, default=None), allow_none=True),
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ DuckDuckGo Lite
|
|||
|
||||
from typing import TYPE_CHECKING
|
||||
import re
|
||||
from urllib.parse import urlencode
|
||||
from urllib.parse import urlencode, quote_plus
|
||||
import json
|
||||
import babel
|
||||
import lxml.html
|
||||
|
@ -245,10 +245,12 @@ def request(query, params):
|
|||
|
||||
# Advanced search syntax ends in CAPTCHA
|
||||
# https://duckduckgo.com/duckduckgo-help-pages/results/syntax/
|
||||
query = [
|
||||
x.removeprefix("site:").removeprefix("intitle:").removeprefix("inurl:").removeprefix("filetype:")
|
||||
for x in query.split()
|
||||
]
|
||||
query = " ".join(
|
||||
[
|
||||
x.removeprefix("site:").removeprefix("intitle:").removeprefix("inurl:").removeprefix("filetype:")
|
||||
for x in query.split()
|
||||
]
|
||||
)
|
||||
eng_region = traits.get_region(params['searxng_locale'], traits.all_locale)
|
||||
if eng_region == "wt-wt":
|
||||
# https://html.duckduckgo.com/html sets an empty value for "all".
|
||||
|
@ -261,7 +263,7 @@ def request(query, params):
|
|||
|
||||
params['url'] = url
|
||||
params['method'] = 'POST'
|
||||
params['data']['q'] = query
|
||||
params['data']['q'] = quote_plus(query)
|
||||
|
||||
# The API is not documented, so we do some reverse engineering and emulate
|
||||
# what https://html.duckduckgo.com/html does when you press "next Page" link
|
||||
|
|
|
@ -62,7 +62,7 @@ filter_mapping = {0: 'off', 1: 'medium', 2: 'high'}
|
|||
results_xpath = './/div[contains(@jscontroller, "SC7lYd")]'
|
||||
title_xpath = './/a/h3[1]'
|
||||
href_xpath = './/a[h3]/@href'
|
||||
content_xpath = './/div[@data-sncf="1"]'
|
||||
content_xpath = './/div[contains(@data-sncf, "1")]'
|
||||
|
||||
# Suggestions are links placed in a *card-section*, we extract only the text
|
||||
# from the links not the links itself.
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
import typing
|
||||
import inspect
|
||||
import logging
|
||||
from json import JSONDecodeError
|
||||
from urllib.parse import urlparse
|
||||
from httpx import HTTPError, HTTPStatusError
|
||||
|
@ -30,10 +31,20 @@ class ErrorContext: # pylint: disable=missing-class-docstring
|
|||
'log_message',
|
||||
'log_parameters',
|
||||
'secondary',
|
||||
'log_level',
|
||||
)
|
||||
|
||||
def __init__( # pylint: disable=too-many-arguments
|
||||
self, filename, function, line_no, code, exception_classname, log_message, log_parameters, secondary
|
||||
self,
|
||||
filename,
|
||||
function,
|
||||
line_no,
|
||||
code,
|
||||
exception_classname,
|
||||
log_message,
|
||||
log_parameters,
|
||||
secondary,
|
||||
log_level=logging.WARN,
|
||||
):
|
||||
self.filename = filename
|
||||
self.function = function
|
||||
|
@ -43,6 +54,7 @@ class ErrorContext: # pylint: disable=missing-class-docstring
|
|||
self.log_message = log_message
|
||||
self.log_parameters = log_parameters
|
||||
self.secondary = secondary
|
||||
self.log_level: int = log_level
|
||||
|
||||
def __eq__(self, o) -> bool: # pylint: disable=invalid-name
|
||||
if not isinstance(o, ErrorContext):
|
||||
|
@ -56,6 +68,7 @@ class ErrorContext: # pylint: disable=missing-class-docstring
|
|||
and self.log_message == o.log_message
|
||||
and self.log_parameters == o.log_parameters
|
||||
and self.secondary == o.secondary
|
||||
and self.log_level == o.log_level
|
||||
)
|
||||
|
||||
def __hash__(self):
|
||||
|
@ -69,11 +82,12 @@ class ErrorContext: # pylint: disable=missing-class-docstring
|
|||
self.log_message,
|
||||
self.log_parameters,
|
||||
self.secondary,
|
||||
self.log_level,
|
||||
)
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return "ErrorContext({!r}, {!r}, {!r}, {!r}, {!r}, {!r}) {!r}".format(
|
||||
return "ErrorContext({!r}, {!r}, {!r}, {!r}, {!r}, {!r}), {!r}, {!r}".format(
|
||||
self.filename,
|
||||
self.line_no,
|
||||
self.code,
|
||||
|
@ -81,13 +95,14 @@ class ErrorContext: # pylint: disable=missing-class-docstring
|
|||
self.log_message,
|
||||
self.log_parameters,
|
||||
self.secondary,
|
||||
self.log_level,
|
||||
)
|
||||
|
||||
|
||||
def add_error_context(engine_name: str, error_context: ErrorContext) -> None:
|
||||
errors_for_engine = errors_per_engines.setdefault(engine_name, {})
|
||||
errors_for_engine[error_context] = errors_for_engine.get(error_context, 0) + 1
|
||||
engines[engine_name].logger.warning('%s', str(error_context))
|
||||
engines[engine_name].logger.log(error_context.log_level, '%s', str(error_context))
|
||||
|
||||
|
||||
def get_trace(traces):
|
||||
|
@ -157,7 +172,9 @@ def get_exception_classname(exc: Exception) -> str:
|
|||
return exc_module + '.' + exc_name
|
||||
|
||||
|
||||
def get_error_context(framerecords, exception_classname, log_message, log_parameters, secondary) -> ErrorContext:
|
||||
def get_error_context(
|
||||
framerecords, exception_classname, log_message, log_parameters, secondary, log_level: int
|
||||
) -> ErrorContext:
|
||||
searx_frame = get_trace(framerecords)
|
||||
filename = searx_frame.filename
|
||||
if filename.startswith(searx_parent_dir):
|
||||
|
@ -166,30 +183,36 @@ def get_error_context(framerecords, exception_classname, log_message, log_parame
|
|||
line_no = searx_frame.lineno
|
||||
code = searx_frame.code_context[0].strip()
|
||||
del framerecords
|
||||
return ErrorContext(filename, function, line_no, code, exception_classname, log_message, log_parameters, secondary)
|
||||
return ErrorContext(
|
||||
filename, function, line_no, code, exception_classname, log_message, log_parameters, secondary, log_level
|
||||
)
|
||||
|
||||
|
||||
def count_exception(engine_name: str, exc: Exception, secondary: bool = False) -> None:
|
||||
def count_exception(engine_name: str, exc: Exception, secondary: bool = False, log_level=logging.WARN) -> None:
|
||||
if not settings['general']['enable_metrics']:
|
||||
return
|
||||
framerecords = inspect.trace()
|
||||
try:
|
||||
exception_classname = get_exception_classname(exc)
|
||||
log_parameters = get_messages(exc, framerecords[-1][1])
|
||||
error_context = get_error_context(framerecords, exception_classname, None, log_parameters, secondary)
|
||||
error_context = get_error_context(framerecords, exception_classname, None, log_parameters, secondary, log_level)
|
||||
add_error_context(engine_name, error_context)
|
||||
finally:
|
||||
del framerecords
|
||||
|
||||
|
||||
def count_error(
|
||||
engine_name: str, log_message: str, log_parameters: typing.Optional[typing.Tuple] = None, secondary: bool = False
|
||||
engine_name: str,
|
||||
log_message: str,
|
||||
log_parameters: typing.Optional[typing.Tuple] = None,
|
||||
secondary: bool = False,
|
||||
log_level: int = logging.WARN,
|
||||
) -> None:
|
||||
if not settings['general']['enable_metrics']:
|
||||
return
|
||||
framerecords = list(reversed(inspect.stack()[1:]))
|
||||
try:
|
||||
error_context = get_error_context(framerecords, None, log_message, log_parameters or (), secondary)
|
||||
error_context = get_error_context(framerecords, None, log_message, log_parameters or (), secondary, log_level)
|
||||
add_error_context(engine_name, error_context)
|
||||
finally:
|
||||
del framerecords
|
||||
|
|
|
@ -357,6 +357,7 @@ class Checker: # pylint: disable=missing-class-docstring
|
|||
|
||||
def __init__(self, processor: EngineProcessor):
|
||||
self.processor = processor
|
||||
self.processor.log_engine_exc_info = False # Remove exception information from errors to reduce verbosity
|
||||
self.tests = self.processor.get_tests()
|
||||
self.test_results = TestResults()
|
||||
|
||||
|
@ -418,8 +419,10 @@ class Checker: # pylint: disable=missing-class-docstring
|
|||
result_container_check.check_basic()
|
||||
return result_container_check
|
||||
|
||||
def run_test(self, test_name):
|
||||
def run_test(self, test_name: str):
|
||||
test_parameters = self.tests[test_name]
|
||||
# Not really a warning, but an info log will not appear
|
||||
logger.warning('---%s---', test_name)
|
||||
search_query_list = list(Checker.search_query_matrix_iterator(self.engineref_list, test_parameters['matrix']))
|
||||
rct_list = [self.get_result_container_tests(test_name, search_query) for search_query in search_query_list]
|
||||
stop_test = False
|
||||
|
|
|
@ -20,7 +20,7 @@ if (next_call_ts == false or next_call_ts == nil) then
|
|||
-- 2/ the next call is a random time between start_after_from and start_after_to
|
||||
local initial_delay = math.random(start_after_from, start_after_to)
|
||||
redis.call('SET', redis_key, now + initial_delay)
|
||||
return { false, delay }
|
||||
return { false, initial_delay }
|
||||
end
|
||||
|
||||
-- next_call_ts is defined
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
"""
|
||||
|
||||
import logging
|
||||
from logging import Logger
|
||||
import threading
|
||||
from abc import abstractmethod, ABC
|
||||
from timeit import default_timer
|
||||
|
@ -58,12 +60,13 @@ class SuspendedStatus:
|
|||
class EngineProcessor(ABC):
|
||||
"""Base classes used for all types of request processors."""
|
||||
|
||||
__slots__ = 'engine', 'engine_name', 'lock', 'suspended_status', 'logger'
|
||||
__slots__ = 'engine', 'engine_name', 'lock', 'suspended_status', 'logger', 'log_engine_exc_info'
|
||||
|
||||
def __init__(self, engine, engine_name: str):
|
||||
self.engine = engine
|
||||
self.engine_name = engine_name
|
||||
self.logger = engines[engine_name].logger
|
||||
self.logger: Logger = engines[engine_name].logger
|
||||
self.log_engine_exc_info = True
|
||||
key = get_network(self.engine_name)
|
||||
key = id(key) if key else self.engine_name
|
||||
self.suspended_status = SUSPENDED_STATUS.setdefault(key, SuspendedStatus())
|
||||
|
@ -82,6 +85,10 @@ class EngineProcessor(ABC):
|
|||
def has_initialize_function(self):
|
||||
return hasattr(self.engine, 'init')
|
||||
|
||||
@property
|
||||
def metrics_log_level(self) -> int:
|
||||
return logging.WARN if self.log_engine_exc_info else logging.NOTSET
|
||||
|
||||
def handle_exception(self, result_container, exception_or_message, suspend=False):
|
||||
# update result_container
|
||||
if isinstance(exception_or_message, BaseException):
|
||||
|
@ -95,9 +102,9 @@ class EngineProcessor(ABC):
|
|||
# metrics
|
||||
counter_inc('engine', self.engine_name, 'search', 'count', 'error')
|
||||
if isinstance(exception_or_message, BaseException):
|
||||
count_exception(self.engine_name, exception_or_message)
|
||||
count_exception(self.engine_name, exception_or_message, log_level=self.metrics_log_level)
|
||||
else:
|
||||
count_error(self.engine_name, exception_or_message)
|
||||
count_error(self.engine_name, exception_or_message, log_level=self.metrics_log_level)
|
||||
# suspend the engine ?
|
||||
if suspend:
|
||||
suspended_time = None
|
||||
|
|
|
@ -127,6 +127,7 @@ class OnlineProcessor(EngineProcessor):
|
|||
'{} redirects, maximum: {}'.format(len(response.history), soft_max_redirects),
|
||||
(status_code, reason, hostname),
|
||||
secondary=True,
|
||||
log_level=self.metrics_log_level,
|
||||
)
|
||||
|
||||
return response
|
||||
|
@ -180,20 +181,21 @@ class OnlineProcessor(EngineProcessor):
|
|||
self.logger.exception(
|
||||
"requests exception (search duration : {0} s, timeout: {1} s) : {2}".format(
|
||||
default_timer() - start_time, timeout_limit, e
|
||||
)
|
||||
),
|
||||
exc_info=self.log_engine_exc_info,
|
||||
)
|
||||
except SearxEngineCaptchaException as e:
|
||||
self.handle_exception(result_container, e, suspend=True)
|
||||
self.logger.exception('CAPTCHA')
|
||||
self.logger.exception('CAPTCHA', exc_info=self.log_engine_exc_info)
|
||||
except SearxEngineTooManyRequestsException as e:
|
||||
self.handle_exception(result_container, e, suspend=True)
|
||||
self.logger.exception('Too many requests')
|
||||
self.logger.exception('Too many requests', exc_info=self.log_engine_exc_info)
|
||||
except SearxEngineAccessDeniedException as e:
|
||||
self.handle_exception(result_container, e, suspend=True)
|
||||
self.logger.exception('SearXNG is blocked')
|
||||
self.logger.exception('SearXNG is blocked', exc_info=self.log_engine_exc_info)
|
||||
except Exception as e: # pylint: disable=broad-except
|
||||
self.handle_exception(result_container, e)
|
||||
self.logger.exception('exception : {0}'.format(e))
|
||||
self.logger.exception('exception : {0}'.format(e), exc_info=self.log_engine_exc_info)
|
||||
|
||||
def get_default_tests(self):
|
||||
tests = {}
|
||||
|
|
|
@ -226,15 +226,12 @@ outgoing:
|
|||
# - 'Hash plugin'
|
||||
# - 'Self Information'
|
||||
# - 'Tracker URL remover'
|
||||
# - 'Unit converter plugin'
|
||||
# - 'Ahmia blacklist' # activation depends on outgoing.using_tor_proxy
|
||||
# # these plugins are disabled if nothing is configured ..
|
||||
# - 'Hostnames plugin' # see 'hostnames' configuration below
|
||||
# - 'Open Access DOI rewrite'
|
||||
# - 'Tor check plugin'
|
||||
# # Read the docs before activate: auto-detection of the language could be
|
||||
# # detrimental to users expectations / users can activate the plugin in the
|
||||
# # preferences if they want.
|
||||
# - 'Autodetect search language'
|
||||
|
||||
# Configuration of the "Hostnames plugin":
|
||||
#
|
||||
|
|
Binary file not shown.
|
@ -39,9 +39,8 @@ msgstr ""
|
|||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-06 14:31+0000\n"
|
||||
"Last-Translator: Atul_Eterno <Atul_Eterno@users.noreply.translate.codeberg."
|
||||
"org>\n"
|
||||
"PO-Revision-Date: 2024-11-14 14:07+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Spanish <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/es/>\n"
|
||||
"Language: es\n"
|
||||
|
@ -49,7 +48,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.7.2\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -155,7 +154,7 @@ msgstr "preguntas y respuestas"
|
|||
#. CATEGORY_GROUPS['REPOS']
|
||||
#: searx/searxng.msg
|
||||
msgid "repos"
|
||||
msgstr "repos"
|
||||
msgstr "repositorios"
|
||||
|
||||
#. CATEGORY_GROUPS['SOFTWARE_WIKIS']
|
||||
#: searx/searxng.msg
|
||||
|
@ -1246,11 +1245,11 @@ msgstr "Tiempo máximo"
|
|||
|
||||
#: searx/templates/simple/preferences/favicon.html:2
|
||||
msgid "Favicon Resolver"
|
||||
msgstr ""
|
||||
msgstr "Buscador de favicon"
|
||||
|
||||
#: searx/templates/simple/preferences/favicon.html:15
|
||||
msgid "Display favicons near search results"
|
||||
msgstr ""
|
||||
msgstr "Mostrar los favicons al lado de los resultados de búsqueda"
|
||||
|
||||
#: searx/templates/simple/preferences/footer.html:2
|
||||
msgid ""
|
||||
|
|
Binary file not shown.
|
@ -28,13 +28,14 @@
|
|||
# unoyoa <unoyoa@users.noreply.translate.codeberg.org>, 2024.
|
||||
# tiziodcaio <tiziodcaio@users.noreply.translate.codeberg.org>, 2024.
|
||||
# Fabio_Perri <Fabio_Perri@users.noreply.translate.codeberg.org>, 2024.
|
||||
# lrnz2 <lrnz2@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-08 13:41+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2024-11-14 02:16+0000\n"
|
||||
"Last-Translator: lrnz2 <lrnz2@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Italian <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/it/>\n"
|
||||
"Language: it\n"
|
||||
|
@ -42,13 +43,13 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.7.2\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
#: searx/searxng.msg
|
||||
msgid "without further subgrouping"
|
||||
msgstr "senza altri sottogruppi"
|
||||
msgstr "senza altri sottogruppamenti"
|
||||
|
||||
#. CONSTANT_NAMES['DEFAULT_CATEGORY']
|
||||
#: searx/searxng.msg
|
||||
|
@ -73,7 +74,7 @@ msgstr "musica"
|
|||
#. CATEGORY_NAMES['SOCIAL_MEDIA']
|
||||
#: searx/searxng.msg
|
||||
msgid "social media"
|
||||
msgstr "social"
|
||||
msgstr "social media"
|
||||
|
||||
#. CATEGORY_NAMES['IMAGES']
|
||||
#: searx/searxng.msg
|
||||
|
@ -113,7 +114,7 @@ msgstr "mappa"
|
|||
#. CATEGORY_NAMES['ONIONS']
|
||||
#: searx/searxng.msg
|
||||
msgid "onions"
|
||||
msgstr "onion"
|
||||
msgstr "cipolle"
|
||||
|
||||
#. CATEGORY_NAMES['SCIENCE']
|
||||
#: searx/searxng.msg
|
||||
|
@ -133,7 +134,7 @@ msgstr "dizionari"
|
|||
#. CATEGORY_GROUPS['LYRICS']
|
||||
#: searx/searxng.msg
|
||||
msgid "lyrics"
|
||||
msgstr "testi musicali"
|
||||
msgstr "testo musicale"
|
||||
|
||||
#. CATEGORY_GROUPS['PACKAGES']
|
||||
#: searx/searxng.msg
|
||||
|
@ -148,12 +149,12 @@ msgstr "d&r"
|
|||
#. CATEGORY_GROUPS['REPOS']
|
||||
#: searx/searxng.msg
|
||||
msgid "repos"
|
||||
msgstr "ripostigli"
|
||||
msgstr "repos"
|
||||
|
||||
#. CATEGORY_GROUPS['SOFTWARE_WIKIS']
|
||||
#: searx/searxng.msg
|
||||
msgid "software wikis"
|
||||
msgstr "wiki software"
|
||||
msgstr "wiki del software"
|
||||
|
||||
#. CATEGORY_GROUPS['WEB']
|
||||
#: searx/searxng.msg
|
||||
|
@ -193,7 +194,7 @@ msgstr "Tempo di attività"
|
|||
#. BRAND_CUSTOM_LINKS['ABOUT']
|
||||
#: searx/searxng.msg searx/templates/simple/base.html:50
|
||||
msgid "About"
|
||||
msgstr "A proposito"
|
||||
msgstr "Al riguardo"
|
||||
|
||||
#. WEATHER_TERMS['AVERAGE TEMP.']
|
||||
#: searx/engines/wttr.py:32 searx/searxng.msg
|
||||
|
|
Binary file not shown.
|
@ -10,21 +10,23 @@
|
|||
# return42 <return42@users.noreply.translate.codeberg.org>, 2024.
|
||||
# omfj <omfj@users.noreply.translate.codeberg.org>, 2024.
|
||||
# combwizard <combwizard@users.noreply.translate.codeberg.org>, 2024.
|
||||
# laaknor <laaknor@users.noreply.translate.codeberg.org>, 2024.
|
||||
# Aadniz <Aadniz@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-04 21:35+0000\n"
|
||||
"Last-Translator: combwizard "
|
||||
"<combwizard@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2024-11-09 12:07+0000\n"
|
||||
"Last-Translator: Aadniz <Aadniz@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Norwegian Bokmål <https://translate.codeberg.org/projects/"
|
||||
"searxng/searxng/nb_NO/>\n"
|
||||
"Language: nb_NO\n"
|
||||
"Language-Team: Norwegian Bokmål "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/nb_NO/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -191,13 +193,13 @@ msgstr "Skydekke"
|
|||
#: searx/engines/duckduckgo_weather.py:45 searx/engines/wttr.py:51
|
||||
#: searx/searxng.msg
|
||||
msgid "Condition"
|
||||
msgstr ""
|
||||
msgstr "Betingelse"
|
||||
|
||||
#. WEATHER_TERMS['CURRENT CONDITION']
|
||||
#: searx/engines/duckduckgo_weather.py:118 searx/engines/wttr.py:104
|
||||
#: searx/searxng.msg
|
||||
msgid "Current condition"
|
||||
msgstr ""
|
||||
msgstr "Nåværende betingelse"
|
||||
|
||||
#. WEATHER_TERMS['EVENING']
|
||||
#: searx/engines/wttr.py:100 searx/searxng.msg
|
||||
|
@ -220,13 +222,13 @@ msgstr "Luftfuktighet"
|
|||
#: searx/engines/duckduckgo_weather.py:77 searx/engines/wttr.py:34
|
||||
#: searx/searxng.msg
|
||||
msgid "Max temp."
|
||||
msgstr ""
|
||||
msgstr "Maks temp."
|
||||
|
||||
#. WEATHER_TERMS['MIN TEMP.']
|
||||
#: searx/engines/duckduckgo_weather.py:73 searx/engines/wttr.py:33
|
||||
#: searx/searxng.msg
|
||||
msgid "Min temp."
|
||||
msgstr ""
|
||||
msgstr "Min temp."
|
||||
|
||||
#. WEATHER_TERMS['MORNING']
|
||||
#: searx/engines/wttr.py:100 searx/searxng.msg
|
||||
|
@ -333,17 +335,17 @@ msgstr "opphavsmann"
|
|||
#. SOCIAL_MEDIA_TERMS['THREAD OPEN']
|
||||
#: searx/engines/discourse.py:149 searx/searxng.msg
|
||||
msgid "open"
|
||||
msgstr ""
|
||||
msgstr "åpen"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
|
||||
#: searx/engines/discourse.py:149 searx/searxng.msg
|
||||
msgid "closed"
|
||||
msgstr ""
|
||||
msgstr "lukket"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
|
||||
#: searx/engines/discourse.py:160 searx/searxng.msg
|
||||
msgid "answered"
|
||||
msgstr ""
|
||||
msgstr "svart på"
|
||||
|
||||
#: searx/webapp.py:332
|
||||
msgid "No item found"
|
||||
|
@ -420,7 +422,7 @@ msgstr "tilgang nektet"
|
|||
|
||||
#: searx/webutils.py:60
|
||||
msgid "server API error"
|
||||
msgstr "Tjener-API-feil"
|
||||
msgstr "server API feil"
|
||||
|
||||
#: searx/webutils.py:79
|
||||
msgid "Suspended"
|
||||
|
@ -452,7 +454,7 @@ msgstr "Regn ut {functions} av parameterne"
|
|||
|
||||
#: searx/engines/mozhi.py:57
|
||||
msgid "Synonyms"
|
||||
msgstr ""
|
||||
msgstr "Synonymer"
|
||||
|
||||
#: searx/engines/openstreetmap.py:159
|
||||
msgid "Get directions"
|
||||
|
@ -527,7 +529,7 @@ msgstr "Filkvalitet"
|
|||
|
||||
#: searx/plugins/calculator.py:14
|
||||
msgid "Calculate mathematical expressions via the search bar"
|
||||
msgstr ""
|
||||
msgstr "Kalkuler matematiske uttrykk via søkebaren"
|
||||
|
||||
#: searx/plugins/hash_plugin.py:10
|
||||
msgid "Converts strings to different hash digests."
|
||||
|
@ -571,7 +573,7 @@ msgstr ""
|
|||
|
||||
#: searx/plugins/self_info.py:28
|
||||
msgid "Your IP is: "
|
||||
msgstr ""
|
||||
msgstr "Din IP er "
|
||||
|
||||
#: searx/plugins/self_info.py:31
|
||||
msgid "Your user-agent is: "
|
||||
|
@ -579,16 +581,16 @@ msgstr ""
|
|||
|
||||
#: searx/plugins/tor_check.py:24
|
||||
msgid "Tor check plugin"
|
||||
msgstr "Tor sjekk pluggin"
|
||||
msgstr "Tor sjekking plugin"
|
||||
|
||||
#: searx/plugins/tor_check.py:27
|
||||
msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Denne plugin sjekker om adressen til forespørselen er en Tor utgangsnode,"
|
||||
" og informerer brukeren om den er det; som check.torproject.org, men fra "
|
||||
"SearXNG."
|
||||
"Denne plugin-en sjekker om adressen til forespørselen er en Tor utgangsnode, "
|
||||
"og informerer brukeren om den er det; slik som check.torproject.org gjør, "
|
||||
"men fra SearXNG."
|
||||
|
||||
#: searx/plugins/tor_check.py:61
|
||||
msgid ""
|
||||
|
@ -620,7 +622,7 @@ msgstr "Fjern sporer-argumenter fra returnert nettadresse"
|
|||
|
||||
#: searx/plugins/unit_converter.py:29
|
||||
msgid "Convert between units"
|
||||
msgstr ""
|
||||
msgstr "Konverter mellom forskjellige enheter"
|
||||
|
||||
#: searx/templates/simple/404.html:4
|
||||
msgid "Page not found"
|
||||
|
@ -687,7 +689,7 @@ msgstr "Lengde"
|
|||
|
||||
#: searx/templates/simple/macros.html:41
|
||||
msgid "Views"
|
||||
msgstr ""
|
||||
msgstr "Visninger"
|
||||
|
||||
#: searx/templates/simple/macros.html:42
|
||||
#: searx/templates/simple/result_templates/files.html:34
|
||||
|
@ -945,7 +947,7 @@ msgstr "Meldinger fra søkemotorene"
|
|||
|
||||
#: searx/templates/simple/elements/engines_msg.html:7
|
||||
msgid "seconds"
|
||||
msgstr ""
|
||||
msgstr "sekunder"
|
||||
|
||||
#: searx/templates/simple/elements/search_url.html:3
|
||||
msgid "Search URL"
|
||||
|
@ -1051,7 +1053,7 @@ msgstr "Det er ingen flere resultater. Du kan prøve å:"
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:19
|
||||
msgid "Refresh the page."
|
||||
msgstr "oppfrisk siden"
|
||||
msgstr "oppfrisk siden."
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:20
|
||||
msgid "Search for another query or select another category (above)."
|
||||
|
@ -1067,7 +1069,7 @@ msgstr "Bytt til en annen instans:"
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:24
|
||||
msgid "Search for another query or select another category."
|
||||
msgstr ""
|
||||
msgstr "Oppgi et annet søkeord eller velg en annen kategori."
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:25
|
||||
msgid "Go back to the previous page using the previous page button."
|
||||
|
@ -1193,11 +1195,11 @@ msgstr ""
|
|||
|
||||
#: searx/templates/simple/preferences/engines.html:15
|
||||
msgid "Enable all"
|
||||
msgstr ""
|
||||
msgstr "Aktiver alle"
|
||||
|
||||
#: searx/templates/simple/preferences/engines.html:16
|
||||
msgid "Disable all"
|
||||
msgstr ""
|
||||
msgstr "Deaktiver alle"
|
||||
|
||||
#: searx/templates/simple/preferences/engines.html:25
|
||||
msgid "!bang"
|
||||
|
@ -1882,4 +1884,3 @@ msgstr "skjul video"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "Søkemotorer kan ikke motta resultater"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -22,13 +22,15 @@
|
|||
# MVDW-Java <MVDW-Java@users.noreply.translate.codeberg.org>, 2024.
|
||||
# notlmutsaers <notlmutsaers@users.noreply.translate.codeberg.org>, 2024.
|
||||
# return42 <return42@users.noreply.translate.codeberg.org>, 2024.
|
||||
# ljansen <ljansen@users.noreply.translate.codeberg.org>, 2024.
|
||||
# zarlin <zarlin@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-15 12:18+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2024-11-02 04:00+0000\n"
|
||||
"Last-Translator: zarlin <zarlin@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Dutch <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/nl/>\n"
|
||||
"Language: nl\n"
|
||||
|
@ -36,7 +38,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.7.2\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -464,7 +466,7 @@ msgstr "Bereken {functions} van de opties"
|
|||
|
||||
#: searx/engines/mozhi.py:57
|
||||
msgid "Synonyms"
|
||||
msgstr ""
|
||||
msgstr "Synoniemen"
|
||||
|
||||
#: searx/engines/openstreetmap.py:159
|
||||
msgid "Get directions"
|
||||
|
@ -492,7 +494,7 @@ msgstr "stemmen"
|
|||
|
||||
#: searx/engines/radio_browser.py:107
|
||||
msgid "clicks"
|
||||
msgstr "clicks"
|
||||
msgstr "klikken"
|
||||
|
||||
#: searx/engines/seekr.py:193 searx/engines/yummly.py:71
|
||||
#: searx/engines/zlibrary.py:137
|
||||
|
@ -661,7 +663,7 @@ msgstr "Voorkeuren"
|
|||
|
||||
#: searx/templates/simple/base.html:68
|
||||
msgid "Powered by"
|
||||
msgstr "Zoekmachine"
|
||||
msgstr "Verzorgd door"
|
||||
|
||||
#: searx/templates/simple/base.html:68
|
||||
msgid "a privacy-respecting, open metasearch engine"
|
||||
|
@ -1068,7 +1070,7 @@ msgstr "Er zijn geen resultaten meer. U kunt proberen om:"
|
|||
|
||||
#: searx/templates/simple/messages/no_results.html:19
|
||||
msgid "Refresh the page."
|
||||
msgstr "Ververs de pagina"
|
||||
msgstr "Ververs de pagina."
|
||||
|
||||
#: searx/templates/simple/messages/no_results.html:20
|
||||
msgid "Search for another query or select another category (above)."
|
||||
|
@ -1235,11 +1237,11 @@ msgstr "Max. duur"
|
|||
|
||||
#: searx/templates/simple/preferences/favicon.html:2
|
||||
msgid "Favicon Resolver"
|
||||
msgstr ""
|
||||
msgstr "Favicon Oplosser"
|
||||
|
||||
#: searx/templates/simple/preferences/favicon.html:15
|
||||
msgid "Display favicons near search results"
|
||||
msgstr ""
|
||||
msgstr "Vertoon zoekresultaten naast favicons"
|
||||
|
||||
#: searx/templates/simple/preferences/footer.html:2
|
||||
msgid ""
|
||||
|
|
Binary file not shown.
|
@ -23,8 +23,8 @@ msgstr ""
|
|||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-15 12:18+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2024-10-28 21:07+0000\n"
|
||||
"Last-Translator: Eryk Michalak <gnu.ewm@protonmail.com>\n"
|
||||
"Language-Team: Polish <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/pl/>\n"
|
||||
"Language: pl\n"
|
||||
|
@ -34,7 +34,7 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && ("
|
||||
"n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && "
|
||||
"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
|
||||
"X-Generator: Weblate 5.7.2\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -1230,7 +1230,7 @@ msgstr "Maksymalny czas"
|
|||
|
||||
#: searx/templates/simple/preferences/favicon.html:2
|
||||
msgid "Favicon Resolver"
|
||||
msgstr ""
|
||||
msgstr "Pobieranie favikony"
|
||||
|
||||
#: searx/templates/simple/preferences/favicon.html:15
|
||||
msgid "Display favicons near search results"
|
||||
|
|
Binary file not shown.
|
@ -19,13 +19,14 @@
|
|||
# gvlx <gvlx@users.noreply.translate.codeberg.org>, 2024.
|
||||
# ds451 <ds451@users.noreply.translate.codeberg.org>, 2024.
|
||||
# Pedro_Tresp <Pedro_Tresp@users.noreply.translate.codeberg.org>, 2024.
|
||||
# saltsnorter <saltsnorter@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-13 23:26+0000\n"
|
||||
"Last-Translator: Pedro_Tresp <Pedro_Tresp@users.noreply.translate.codeberg."
|
||||
"PO-Revision-Date: 2024-10-29 05:54+0000\n"
|
||||
"Last-Translator: saltsnorter <saltsnorter@users.noreply.translate.codeberg."
|
||||
"org>\n"
|
||||
"Language-Team: Portuguese <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/pt/>\n"
|
||||
|
@ -34,7 +35,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 5.7.2\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -175,7 +176,7 @@ msgstr "escuro"
|
|||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
msgid "black"
|
||||
msgstr ""
|
||||
msgstr "preto"
|
||||
|
||||
#. BRAND_CUSTOM_LINKS['UPTIME']
|
||||
#: searx/searxng.msg
|
||||
|
@ -1228,11 +1229,11 @@ msgstr "Tempo máximo"
|
|||
|
||||
#: searx/templates/simple/preferences/favicon.html:2
|
||||
msgid "Favicon Resolver"
|
||||
msgstr ""
|
||||
msgstr "Solucionador do Favicon"
|
||||
|
||||
#: searx/templates/simple/preferences/favicon.html:15
|
||||
msgid "Display favicons near search results"
|
||||
msgstr ""
|
||||
msgstr "Monstra os favicons nos proximos os resultados"
|
||||
|
||||
#: searx/templates/simple/preferences/footer.html:2
|
||||
msgid ""
|
||||
|
|
Binary file not shown.
|
@ -30,13 +30,14 @@
|
|||
# Pyrbor <Pyrbor@users.noreply.translate.codeberg.org>, 2024.
|
||||
# rodgui <rodgui@users.noreply.translate.codeberg.org>, 2024.
|
||||
# rafablog77 <rafablog77@users.noreply.translate.codeberg.org>, 2024.
|
||||
# Juno Takano <jutty@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-15 12:18+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2024-10-31 12:16+0000\n"
|
||||
"Last-Translator: Juno Takano <jutty@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://translate.codeberg.org/projects/"
|
||||
"searxng/searxng/pt_BR/>\n"
|
||||
"Language: pt_BR\n"
|
||||
|
@ -44,7 +45,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.7.2\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -185,7 +186,7 @@ msgstr "escuro"
|
|||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
msgid "black"
|
||||
msgstr ""
|
||||
msgstr "preto"
|
||||
|
||||
#. BRAND_CUSTOM_LINKS['UPTIME']
|
||||
#: searx/searxng.msg
|
||||
|
@ -472,7 +473,7 @@ msgstr "Computar {functions} dos argumentos"
|
|||
|
||||
#: searx/engines/mozhi.py:57
|
||||
msgid "Synonyms"
|
||||
msgstr ""
|
||||
msgstr "Sinônimos"
|
||||
|
||||
#: searx/engines/openstreetmap.py:159
|
||||
msgid "Get directions"
|
||||
|
@ -1243,7 +1244,7 @@ msgstr "Tempo máximo"
|
|||
|
||||
#: searx/templates/simple/preferences/favicon.html:2
|
||||
msgid "Favicon Resolver"
|
||||
msgstr ""
|
||||
msgstr "Resolvedor de Favicons"
|
||||
|
||||
#: searx/templates/simple/preferences/favicon.html:15
|
||||
msgid "Display favicons near search results"
|
||||
|
|
Binary file not shown.
|
@ -8,21 +8,23 @@
|
|||
# return42 <return42@users.noreply.translate.codeberg.org>, 2024.
|
||||
# abhabongse <abhabongse@users.noreply.translate.codeberg.org>, 2024.
|
||||
# tutakrab <tutakrab@users.noreply.translate.codeberg.org>, 2024.
|
||||
# sahussawud <sahussawud@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-10-02 16:10+0000\n"
|
||||
"Last-Translator: tutakrab <tutakrab@users.noreply.translate.codeberg.org>"
|
||||
"PO-Revision-Date: 2024-11-06 07:26+0000\n"
|
||||
"Last-Translator: sahussawud <sahussawud@users.noreply.translate.codeberg.org>"
|
||||
"\n"
|
||||
"Language-Team: Thai <https://translate.codeberg.org/projects/searxng/searxng/"
|
||||
"th/>\n"
|
||||
"Language: th\n"
|
||||
"Language-Team: Thai "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/th/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -163,7 +165,7 @@ msgstr "มืด"
|
|||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
msgid "black"
|
||||
msgstr ""
|
||||
msgstr "สีดำ"
|
||||
|
||||
#. BRAND_CUSTOM_LINKS['UPTIME']
|
||||
#: searx/searxng.msg
|
||||
|
@ -331,12 +333,12 @@ msgstr "ผู้เขียน"
|
|||
#. SOCIAL_MEDIA_TERMS['THREAD OPEN']
|
||||
#: searx/engines/discourse.py:149 searx/searxng.msg
|
||||
msgid "open"
|
||||
msgstr ""
|
||||
msgstr "สร้าง"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
|
||||
#: searx/engines/discourse.py:149 searx/searxng.msg
|
||||
msgid "closed"
|
||||
msgstr ""
|
||||
msgstr "ลบ"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
|
||||
#: searx/engines/discourse.py:160 searx/searxng.msg
|
||||
|
@ -450,7 +452,7 @@ msgstr "คำนวณ {functions} จากอาร์กิวเมนต
|
|||
|
||||
#: searx/engines/mozhi.py:57
|
||||
msgid "Synonyms"
|
||||
msgstr ""
|
||||
msgstr "คำเหมือน"
|
||||
|
||||
#: searx/engines/openstreetmap.py:159
|
||||
msgid "Get directions"
|
||||
|
@ -538,8 +540,9 @@ msgid "hash digest"
|
|||
msgstr "แฮชย่อย"
|
||||
|
||||
#: searx/plugins/hostnames.py:103
|
||||
#, fuzzy
|
||||
msgid "Hostnames plugin"
|
||||
msgstr ""
|
||||
msgstr "ชื่อโฮส ปลั๊กอิน"
|
||||
|
||||
#: searx/plugins/hostnames.py:104
|
||||
msgid "Rewrite hostnames, remove results or prioritize them based on the hostname"
|
||||
|
@ -1698,4 +1701,3 @@ msgstr "ซ่อนวิดีโอ"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "เครื่องมือไม่สามารถดึงผลลัพธ์ได้"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -10,21 +10,22 @@
|
|||
# return42 <return42@users.noreply.translate.codeberg.org>, 2024.
|
||||
# vducong <vducong@users.noreply.translate.codeberg.org>, 2024.
|
||||
# tvminh19 <tvminh19@users.noreply.translate.codeberg.org>, 2024.
|
||||
# KhietVo <KhietVo@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-08-07 01:02+0000\n"
|
||||
"Last-Translator: tvminh19 <tvminh19@users.noreply.translate.codeberg.org>"
|
||||
"\n"
|
||||
"PO-Revision-Date: 2024-11-14 14:07+0000\n"
|
||||
"Last-Translator: KhietVo <KhietVo@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Vietnamese <https://translate.codeberg.org/projects/searxng/"
|
||||
"searxng/vi/>\n"
|
||||
"Language: vi\n"
|
||||
"Language-Team: Vietnamese "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/vi/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -166,7 +167,7 @@ msgstr "Tối"
|
|||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
msgid "black"
|
||||
msgstr ""
|
||||
msgstr "màu đen"
|
||||
|
||||
#. BRAND_CUSTOM_LINKS['UPTIME']
|
||||
#: searx/searxng.msg
|
||||
|
@ -186,7 +187,7 @@ msgstr "Nhiệt độ trung bình."
|
|||
#. WEATHER_TERMS['CLOUD COVER']
|
||||
#: searx/engines/open_meteo.py:91 searx/searxng.msg
|
||||
msgid "Cloud cover"
|
||||
msgstr ""
|
||||
msgstr "Mây che phủ"
|
||||
|
||||
#. WEATHER_TERMS['CONDITION']
|
||||
#: searx/engines/duckduckgo_weather.py:45 searx/engines/wttr.py:51
|
||||
|
@ -198,7 +199,7 @@ msgstr "Điều kiện"
|
|||
#: searx/engines/duckduckgo_weather.py:118 searx/engines/wttr.py:104
|
||||
#: searx/searxng.msg
|
||||
msgid "Current condition"
|
||||
msgstr ""
|
||||
msgstr "tình hình hiện tại"
|
||||
|
||||
#. WEATHER_TERMS['EVENING']
|
||||
#: searx/engines/wttr.py:100 searx/searxng.msg
|
||||
|
@ -209,25 +210,25 @@ msgstr "Buổi chiều"
|
|||
#: searx/engines/duckduckgo_weather.py:53 searx/engines/open_meteo.py:81
|
||||
#: searx/engines/wttr.py:59 searx/searxng.msg
|
||||
msgid "Feels like"
|
||||
msgstr ""
|
||||
msgstr "Cảm thấy"
|
||||
|
||||
#. WEATHER_TERMS['HUMIDITY']
|
||||
#: searx/engines/duckduckgo_weather.py:64 searx/engines/open_meteo.py:93
|
||||
#: searx/engines/wttr.py:68 searx/searxng.msg
|
||||
msgid "Humidity"
|
||||
msgstr ""
|
||||
msgstr "Độ ẩm"
|
||||
|
||||
#. WEATHER_TERMS['MAX TEMP.']
|
||||
#: searx/engines/duckduckgo_weather.py:77 searx/engines/wttr.py:34
|
||||
#: searx/searxng.msg
|
||||
msgid "Max temp."
|
||||
msgstr ""
|
||||
msgstr "Nhiệt độ tối đa"
|
||||
|
||||
#. WEATHER_TERMS['MIN TEMP.']
|
||||
#: searx/engines/duckduckgo_weather.py:73 searx/engines/wttr.py:33
|
||||
#: searx/searxng.msg
|
||||
msgid "Min temp."
|
||||
msgstr ""
|
||||
msgstr "Nhiệt độ thấp nhất"
|
||||
|
||||
#. WEATHER_TERMS['MORNING']
|
||||
#: searx/engines/wttr.py:100 searx/searxng.msg
|
||||
|
@ -247,53 +248,53 @@ msgstr "Buổi trưa"
|
|||
#. WEATHER_TERMS['PRESSURE']
|
||||
#: searx/engines/open_meteo.py:95 searx/searxng.msg
|
||||
msgid "Pressure"
|
||||
msgstr ""
|
||||
msgstr "Áp suất"
|
||||
|
||||
#. WEATHER_TERMS['SUNRISE']
|
||||
#: searx/engines/duckduckgo_weather.py:81 searx/engines/wttr.py:36
|
||||
#: searx/searxng.msg
|
||||
msgid "Sunrise"
|
||||
msgstr ""
|
||||
msgstr "Mặt trời mọc"
|
||||
|
||||
#. WEATHER_TERMS['SUNSET']
|
||||
#: searx/engines/duckduckgo_weather.py:82 searx/engines/wttr.py:37
|
||||
#: searx/searxng.msg
|
||||
msgid "Sunset"
|
||||
msgstr ""
|
||||
msgstr "mặt trời lặn"
|
||||
|
||||
#. WEATHER_TERMS['TEMPERATURE']
|
||||
#: searx/engines/duckduckgo_weather.py:48 searx/engines/open_meteo.py:76
|
||||
#: searx/engines/wttr.py:55 searx/searxng.msg
|
||||
msgid "Temperature"
|
||||
msgstr ""
|
||||
msgstr "Nhiệt độ"
|
||||
|
||||
#. WEATHER_TERMS['UV INDEX']
|
||||
#: searx/engines/duckduckgo_weather.py:80 searx/engines/wttr.py:35
|
||||
#: searx/searxng.msg
|
||||
msgid "UV index"
|
||||
msgstr ""
|
||||
msgstr "Chỉ số UV"
|
||||
|
||||
#. WEATHER_TERMS['VISIBILITY']
|
||||
#: searx/engines/duckduckgo_weather.py:62 searx/engines/wttr.py:66
|
||||
#: searx/searxng.msg
|
||||
msgid "Visibility"
|
||||
msgstr ""
|
||||
msgstr "Tầm nhìn"
|
||||
|
||||
#. WEATHER_TERMS['WIND']
|
||||
#: searx/engines/duckduckgo_weather.py:58 searx/engines/open_meteo.py:86
|
||||
#: searx/engines/wttr.py:62 searx/searxng.msg
|
||||
msgid "Wind"
|
||||
msgstr ""
|
||||
msgstr "Gió"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['SUBSCRIBERS']
|
||||
#: searx/engines/lemmy.py:85 searx/searxng.msg
|
||||
msgid "subscribers"
|
||||
msgstr ""
|
||||
msgstr "người đăng ký"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['POSTS']
|
||||
#: searx/engines/lemmy.py:86 searx/searxng.msg
|
||||
msgid "posts"
|
||||
msgstr ""
|
||||
msgstr "những bài đăng"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['ACTIVE USERS']
|
||||
#: searx/engines/lemmy.py:87 searx/searxng.msg
|
||||
|
@ -309,42 +310,42 @@ msgstr ""
|
|||
#. SOCIAL_MEDIA_TERMS['USER']
|
||||
#: searx/engines/lemmy.py:129 searx/engines/lemmy.py:164 searx/searxng.msg
|
||||
msgid "user"
|
||||
msgstr ""
|
||||
msgstr "người dùng"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['COMMUNITY']
|
||||
#: searx/engines/lemmy.py:131 searx/engines/lemmy.py:165 searx/searxng.msg
|
||||
msgid "community"
|
||||
msgstr ""
|
||||
msgstr "cộng đồng"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['POINTS']
|
||||
#: searx/engines/hackernews.py:78 searx/searxng.msg
|
||||
msgid "points"
|
||||
msgstr ""
|
||||
msgstr "điểm"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['TITLE']
|
||||
#: searx/searxng.msg
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
msgstr "tiêu đề"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['AUTHOR']
|
||||
#: searx/engines/hackernews.py:81 searx/searxng.msg
|
||||
msgid "author"
|
||||
msgstr ""
|
||||
msgstr "tác giả"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['THREAD OPEN']
|
||||
#: searx/engines/discourse.py:149 searx/searxng.msg
|
||||
msgid "open"
|
||||
msgstr ""
|
||||
msgstr "mở"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['THREAD CLOSED']
|
||||
#: searx/engines/discourse.py:149 searx/searxng.msg
|
||||
msgid "closed"
|
||||
msgstr ""
|
||||
msgstr "đóng"
|
||||
|
||||
#. SOCIAL_MEDIA_TERMS['THREAD ANSWERED']
|
||||
#: searx/engines/discourse.py:160 searx/searxng.msg
|
||||
msgid "answered"
|
||||
msgstr ""
|
||||
msgstr "đã trả lời"
|
||||
|
||||
#: searx/webapp.py:332
|
||||
msgid "No item found"
|
||||
|
@ -529,7 +530,7 @@ msgstr "Chất lượng tệp"
|
|||
|
||||
#: searx/plugins/calculator.py:14
|
||||
msgid "Calculate mathematical expressions via the search bar"
|
||||
msgstr ""
|
||||
msgstr "Tính toán bằng thanh tìm kiếm"
|
||||
|
||||
#: searx/plugins/hash_plugin.py:10
|
||||
msgid "Converts strings to different hash digests."
|
||||
|
@ -540,12 +541,14 @@ msgid "hash digest"
|
|||
msgstr "hash băm"
|
||||
|
||||
#: searx/plugins/hostnames.py:103
|
||||
#, fuzzy
|
||||
msgid "Hostnames plugin"
|
||||
msgstr ""
|
||||
msgstr "Mấy chủ bổ trợ"
|
||||
|
||||
#: searx/plugins/hostnames.py:104
|
||||
msgid "Rewrite hostnames, remove results or prioritize them based on the hostname"
|
||||
msgstr ""
|
||||
"Viết lại máy chủ, xoá các kểt quả tìm kiếm hoặc sắp xếp dựa trên máy chủ"
|
||||
|
||||
#: searx/plugins/oa_doi_rewrite.py:12
|
||||
msgid "Open Access DOI rewrite"
|
||||
|
@ -571,7 +574,7 @@ msgstr "Hiện IP của bạn khi gõ \"ip\" và hiện user agent khi gõ \"use
|
|||
|
||||
#: searx/plugins/self_info.py:28
|
||||
msgid "Your IP is: "
|
||||
msgstr ""
|
||||
msgstr "Địa chỉ IP của bạn: "
|
||||
|
||||
#: searx/plugins/self_info.py:31
|
||||
msgid "Your user-agent is: "
|
||||
|
@ -1990,4 +1993,3 @@ msgstr "ẩn phim"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "Các trình tìm kiếm không nhận được kết quả"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -28,18 +28,19 @@
|
|||
# hugoalh <hugoalh@users.noreply.translate.codeberg.org>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: searx\n"
|
||||
"Project-Id-Version: searx\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-10-05 06:24+0000\n"
|
||||
"PO-Revision-Date: 2024-08-12 04:00+0000\n"
|
||||
"Last-Translator: hugoalh <hugoalh@users.noreply.translate.codeberg.org>\n"
|
||||
"PO-Revision-Date: 2024-10-26 21:13+0000\n"
|
||||
"Last-Translator: return42 <return42@users.noreply.translate.codeberg.org>\n"
|
||||
"Language-Team: Chinese (Traditional Han script) <https://translate.codeberg."
|
||||
"org/projects/searxng/searxng/zh_Hant/>\n"
|
||||
"Language: zh_Hant_TW\n"
|
||||
"Language-Team: Chinese (Traditional) "
|
||||
"<https://translate.codeberg.org/projects/searxng/searxng/zh_Hant/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.8.1\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
#. CONSTANT_NAMES['NO_SUBGROUPING']
|
||||
|
@ -180,7 +181,7 @@ msgstr "黑暗"
|
|||
#. STYLE_NAMES['BLACK']
|
||||
#: searx/searxng.msg
|
||||
msgid "black"
|
||||
msgstr ""
|
||||
msgstr "黑色"
|
||||
|
||||
#. BRAND_CUSTOM_LINKS['UPTIME']
|
||||
#: searx/searxng.msg
|
||||
|
@ -467,7 +468,7 @@ msgstr "計算 {functions} 參數"
|
|||
|
||||
#: searx/engines/mozhi.py:57
|
||||
msgid "Synonyms"
|
||||
msgstr ""
|
||||
msgstr "同義詞"
|
||||
|
||||
#: searx/engines/openstreetmap.py:159
|
||||
msgid "Get directions"
|
||||
|
@ -942,7 +943,7 @@ msgstr "來自搜尋引擎的訊息"
|
|||
|
||||
#: searx/templates/simple/elements/engines_msg.html:7
|
||||
msgid "seconds"
|
||||
msgstr ""
|
||||
msgstr "秒"
|
||||
|
||||
#: searx/templates/simple/elements/search_url.html:3
|
||||
msgid "Search URL"
|
||||
|
@ -1206,11 +1207,11 @@ msgstr "最大時間"
|
|||
|
||||
#: searx/templates/simple/preferences/favicon.html:2
|
||||
msgid "Favicon Resolver"
|
||||
msgstr ""
|
||||
msgstr "網站圖標搜索器"
|
||||
|
||||
#: searx/templates/simple/preferences/favicon.html:15
|
||||
msgid "Display favicons near search results"
|
||||
msgstr ""
|
||||
msgstr "在搜尋結果旁顯示網站圖標"
|
||||
|
||||
#: searx/templates/simple/preferences/footer.html:2
|
||||
msgid ""
|
||||
|
@ -1911,4 +1912,3 @@ msgstr "隱藏影片"
|
|||
|
||||
#~ msgid "Engines cannot retrieve results"
|
||||
#~ msgstr "引擎無法擷取結果"
|
||||
|
||||
|
|
Loading…
Reference in New Issue