mirror of
https://github.com/sabnzbd/sabnzbd.git
synced 2026-01-19 13:01:11 -05:00
Compare commits
167 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b6fd915365 | ||
|
|
fecae72267 | ||
|
|
7bffd91e3f | ||
|
|
f859521a7e | ||
|
|
a869386fac | ||
|
|
8bc7885b7a | ||
|
|
78be46738d | ||
|
|
6fce73855c | ||
|
|
5fa7bea885 | ||
|
|
62fb85a94b | ||
|
|
c840e3485e | ||
|
|
04c72d51fd | ||
|
|
eae1250cac | ||
|
|
634801431d | ||
|
|
e9a884ab39 | ||
|
|
40fc1511d0 | ||
|
|
8642723c77 | ||
|
|
15ac97e41a | ||
|
|
8202ae7cf6 | ||
|
|
1b459460dc | ||
|
|
bdf7df9ecd | ||
|
|
7e55c6a79d | ||
|
|
183570aaa5 | ||
|
|
de1d66d4dd | ||
|
|
0b27e57ad7 | ||
|
|
182bbd43c5 | ||
|
|
cdf4d6c5fd | ||
|
|
86db74c394 | ||
|
|
856e63794b | ||
|
|
c29a57445a | ||
|
|
4aba90ad3f | ||
|
|
4f2b6d4cd7 | ||
|
|
92067fa3f3 | ||
|
|
c26ea4ceeb | ||
|
|
35ccbff5b9 | ||
|
|
1a265a5176 | ||
|
|
ef2d243fa8 | ||
|
|
c2b8fa59a6 | ||
|
|
a85f9e39bd | ||
|
|
a13f8828fb | ||
|
|
7d391b8465 | ||
|
|
dbfa7cc4eb | ||
|
|
66e99df303 | ||
|
|
77ecf64443 | ||
|
|
f7060804b2 | ||
|
|
a44a1269c0 | ||
|
|
ac6fc37c7d | ||
|
|
9472d65af9 | ||
|
|
1b4c07f229 | ||
|
|
a645058ae1 | ||
|
|
edec6defbb | ||
|
|
27b3a3ddef | ||
|
|
da0903b8a6 | ||
|
|
a49a3b45e5 | ||
|
|
b9225fb153 | ||
|
|
656b7f0948 | ||
|
|
08b249ee09 | ||
|
|
5d76ebfe6e | ||
|
|
0d53b12ade | ||
|
|
f403e12a2a | ||
|
|
5abce26309 | ||
|
|
e73cb0958f | ||
|
|
70070e2f1c | ||
|
|
2685f9adab | ||
|
|
c43e74eabd | ||
|
|
b0d3306209 | ||
|
|
4aaabae109 | ||
|
|
b8188f999e | ||
|
|
4dc5ceb9b1 | ||
|
|
4f8e5053f7 | ||
|
|
3d97ce99e1 | ||
|
|
8620412b3a | ||
|
|
a6d07d89d0 | ||
|
|
a63efcefd6 | ||
|
|
bce9207161 | ||
|
|
12670dedbe | ||
|
|
40393f9548 | ||
|
|
94cae5f015 | ||
|
|
8353227f9d | ||
|
|
5c1d69b934 | ||
|
|
fb04b58b57 | ||
|
|
2bb14bba2a | ||
|
|
91195eb21b | ||
|
|
fa844a6223 | ||
|
|
906379dd09 | ||
|
|
37cded612f | ||
|
|
73e8fade61 | ||
|
|
3b8d6dd3c8 | ||
|
|
ff2ab2da8d | ||
|
|
85aed457b2 | ||
|
|
d624d1d5b6 | ||
|
|
758cc7afab | ||
|
|
d74b7b06d2 | ||
|
|
6c6a1049ea | ||
|
|
f380889d98 | ||
|
|
f61df0e126 | ||
|
|
ffca12123f | ||
|
|
1077ca3753 | ||
|
|
c7189dbceb | ||
|
|
f2361c49b4 | ||
|
|
f84cbb66c3 | ||
|
|
e45f254d19 | ||
|
|
b6cd3c0bae | ||
|
|
4a98724a35 | ||
|
|
4680fa5ae9 | ||
|
|
458f4e2bdc | ||
|
|
3357fd81c7 | ||
|
|
39009f2f71 | ||
|
|
9fdc1c6813 | ||
|
|
c5568fe830 | ||
|
|
3ebe277303 | ||
|
|
bad81f84b9 | ||
|
|
2ac08dd0e6 | ||
|
|
29c57dce0f | ||
|
|
27a9330638 | ||
|
|
4b42b1f55d | ||
|
|
db761395e5 | ||
|
|
249d73e270 | ||
|
|
408ffc4539 | ||
|
|
5d359afedb | ||
|
|
5e8e37e6a2 | ||
|
|
a74df6f04f | ||
|
|
10991d5472 | ||
|
|
b3206fe1db | ||
|
|
70391ea055 | ||
|
|
5b69155d49 | ||
|
|
941bb8adca | ||
|
|
b5eb014084 | ||
|
|
ee4b9339a7 | ||
|
|
3acfe19499 | ||
|
|
9bac23b38f | ||
|
|
b028258cbd | ||
|
|
4d442159cb | ||
|
|
181a91ccf6 | ||
|
|
1c6f2e9d10 | ||
|
|
244fe3b116 | ||
|
|
9ee7391918 | ||
|
|
2eadc3ace6 | ||
|
|
786b29c18d | ||
|
|
315f787d20 | ||
|
|
eb958327c5 | ||
|
|
e157d77a1e | ||
|
|
0347907044 | ||
|
|
e961c9ea8f | ||
|
|
f2ae281195 | ||
|
|
258c4f769d | ||
|
|
a4f76d59b0 | ||
|
|
52a3e04eae | ||
|
|
390abb00df | ||
|
|
02c50e4b17 | ||
|
|
8c8a78c0ab | ||
|
|
fb75cde710 | ||
|
|
fc855dccff | ||
|
|
3d57def676 | ||
|
|
74d2da8857 | ||
|
|
8cfd721ef6 | ||
|
|
d4e10f32e7 | ||
|
|
5a7cff491d | ||
|
|
392ae695d0 | ||
|
|
b39effc067 | ||
|
|
908f4f01cf | ||
|
|
8baab13192 | ||
|
|
abb38d3e49 | ||
|
|
d0016e390a | ||
|
|
c80012e367 | ||
|
|
19fc60a1d8 | ||
|
|
487c9e96ce |
36
.github/renovate.json
vendored
Normal file
36
.github/renovate.json
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"$schema":"https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends":[
|
||||
"config:base",
|
||||
":disableDependencyDashboard"
|
||||
],
|
||||
"schedule":[
|
||||
"before 3am on Monday"
|
||||
],
|
||||
"ignorePaths":[
|
||||
"tests/**",
|
||||
".github/workflows/**"
|
||||
],
|
||||
"pip_requirements":{
|
||||
"fileMatch":[
|
||||
"requirements.txt",
|
||||
"builder/requirements.txt",
|
||||
"builder/osx/requirements.txt"
|
||||
]
|
||||
},
|
||||
"ignoreDeps":[
|
||||
"jaraco.text"
|
||||
],
|
||||
"packageRules":[
|
||||
{
|
||||
"matchPackagePatterns":[
|
||||
"*"
|
||||
],
|
||||
"groupName":"all dependencies",
|
||||
"groupSlug":"all",
|
||||
"automerge":true
|
||||
}
|
||||
],
|
||||
"automergeStrategy":"squash",
|
||||
"platformAutomerge":true
|
||||
}
|
||||
68
.github/workflows/build_release.yml
vendored
68
.github/workflows/build_release.yml
vendored
@@ -2,8 +2,10 @@ name: Build binaries and source distribution
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
# Setting PYTHONNODEBUGRANGES reduces binary size
|
||||
env:
|
||||
AUTOMATION_GITHUB_TOKEN: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
|
||||
PYTHONNODEBUGRANGES: 1
|
||||
|
||||
jobs:
|
||||
build_windows:
|
||||
@@ -12,13 +14,13 @@ jobs:
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python 3.10 (64bit)
|
||||
uses: actions/setup-python@v3
|
||||
- name: Set up Python 3.11 (64bit)
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
python-version: "3.11"
|
||||
architecture: "x64"
|
||||
- name: Cache Python virtualenv (64bit)
|
||||
uses: syphar/restore-virtualenv@v1.2
|
||||
uses: syphar/restore-virtualenv@v1.3
|
||||
id: cache-virtualenv-64bit
|
||||
with:
|
||||
custom_virtualenv_dir: "venv64"
|
||||
@@ -46,12 +48,12 @@ jobs:
|
||||
path: "*-win-setup.exe"
|
||||
name: Windows installer
|
||||
- name: Set up Python 3.8 (32bit and legacy)
|
||||
uses: actions/setup-python@v3
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.8"
|
||||
architecture: "x86"
|
||||
- name: Cache Python virtualenv (32bit and legacy)
|
||||
uses: syphar/restore-virtualenv@v1.2
|
||||
uses: syphar/restore-virtualenv@v1.3
|
||||
id: cache-virtualenv-32bit
|
||||
with:
|
||||
custom_virtualenv_dir: "venv32"
|
||||
@@ -82,16 +84,14 @@ jobs:
|
||||
runs-on: macos-11
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
SIGNING_AUTH: ${{ secrets.SIGNING_AUTH }}
|
||||
NOTARIZATION_USER: ${{ secrets.NOTARIZATION_USER }}
|
||||
NOTARIZATION_PASS: ${{ secrets.NOTARIZATION_PASS }}
|
||||
# We need the official Python, because the GA ones only support newer macOS versions
|
||||
# The deployment target is picked up by the Python build tools automatically
|
||||
# If updated, make sure to also set LSMinimumSystemVersion in SABnzbd.spec
|
||||
PYTHON_VERSION: "3.10.4"
|
||||
PYTHON_VERSION: "3.11.0"
|
||||
MACOSX_DEPLOYMENT_TARGET: "10.9"
|
||||
# We need to force compile for universal2 support
|
||||
CFLAGS: -arch arm64 -arch x86_64
|
||||
CFLAGS: -arch x86_64 -arch arm64
|
||||
ARCHFLAGS: -arch x86_64 -arch arm64
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Cache Python download
|
||||
@@ -99,7 +99,7 @@ jobs:
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/python.pkg
|
||||
key: macOS-Python-${{ env.PYTHON_VERSION }}
|
||||
key: cache-macOS-Python-${{ env.PYTHON_VERSION }}
|
||||
- name: Get Python
|
||||
if: steps.cache-python-download.outputs.cache-hit != 'true'
|
||||
run: curl https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-macos11.pkg -o ~/python.pkg
|
||||
@@ -109,7 +109,7 @@ jobs:
|
||||
unlink /usr/local/bin/python
|
||||
ln -s /usr/local/bin/python3 /usr/local/bin/python
|
||||
- name: Cache Python virtualenv
|
||||
uses: syphar/restore-virtualenv@v1.2
|
||||
uses: syphar/restore-virtualenv@v1.3
|
||||
id: cache-virtualenv
|
||||
with:
|
||||
custom_cache_key_element: "release"
|
||||
@@ -117,34 +117,41 @@ jobs:
|
||||
**/requirements.txt
|
||||
PKG-INFO
|
||||
- name: Install Python dependencies
|
||||
# We have to manually install a few packages:
|
||||
# 1. cffi will pick up the single-arch libffi from Homebrew, while Apple provides universal2-version
|
||||
# of libffi with XCode. So we forcefully have to remove the Homebrew one.
|
||||
# 2. Because building cryptography is hard, and we cannot force pip to fetch universal2 version we
|
||||
# We have to manually take a few steps:
|
||||
# 1. Because building cryptography is hard, and we cannot force pip to fetch universal2 version we
|
||||
# first install the x86 version (and it's dependencies) and then manually fetch the universal2 build
|
||||
# https://github.com/pyca/cryptography/issues/5918
|
||||
# 3. We need to build the PyInstaller bootloader from sources:
|
||||
# 2. We need to build the PyInstaller bootloader:
|
||||
# https://github.com/pyinstaller/pyinstaller/issues/6235
|
||||
# 3. TEMPORARY: Add aarch64 for orjson universal2 build, until they provide a wheel
|
||||
if: steps.cache-virtualenv.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
python3 --version
|
||||
pip3 install --upgrade pip wheel
|
||||
|
||||
brew uninstall libffi --ignore-dependencies
|
||||
ARCHFLAGS="-arch x86_64 -arch arm64" pip3 install --upgrade cffi --no-binary cffi
|
||||
pip3 install --upgrade -r requirements.txt
|
||||
pip3 install --upgrade -r requirements.txt --no-binary cffi
|
||||
|
||||
pip3 uninstall cryptography -y
|
||||
pip3 download -r builder/osx/requirements.txt --platform macosx_10_10_universal2 --only-binary :all: --no-deps --dest .
|
||||
pip3 install -r builder/osx/requirements.txt --no-cache-dir --no-index --find-links .
|
||||
|
||||
rustup target add aarch64-apple-darwin
|
||||
|
||||
PYINSTALLER_COMPILE_BOOTLOADER=1 pip3 install --upgrade -r builder/requirements.txt --no-binary pyinstaller
|
||||
- name: Import macOS codesign certificates
|
||||
uses: apple-actions/import-codesign-certs@v1
|
||||
if: env.SIGNING_AUTH
|
||||
with:
|
||||
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
|
||||
p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
|
||||
# Taken from https://github.com/Apple-Actions/import-codesign-certs/pull/27 (comments)
|
||||
env:
|
||||
CERTIFICATES_P12: ${{ secrets.CERTIFICATES_P12 }}
|
||||
CERTIFICATES_P12_PASSWORD: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
|
||||
MACOS_KEYCHAIN_TEMP_PASSWORD: ${{ secrets.MACOS_KEYCHAIN_TEMP_PASSWORD }}
|
||||
run: |
|
||||
echo $CERTIFICATES_P12 | base64 --decode > certificate.p12
|
||||
security create-keychain -p "$MACOS_KEYCHAIN_TEMP_PASSWORD" build.keychain
|
||||
security default-keychain -s build.keychain
|
||||
security unlock-keychain -p "$MACOS_KEYCHAIN_TEMP_PASSWORD" build.keychain
|
||||
security set-keychain-settings -lut 21600 build.keychain
|
||||
security import certificate.p12 -k build.keychain -P "$CERTIFICATES_P12_PASSWORD" -T /usr/bin/codesign -T /usr/bin/productsign -T /usr/bin/xcrun
|
||||
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_KEYCHAIN_TEMP_PASSWORD" build.keychain
|
||||
- name: Build source distribution
|
||||
# Run this on macOS so the line endings are correct by default
|
||||
run: python builder/package.py source
|
||||
@@ -154,6 +161,10 @@ jobs:
|
||||
path: "*-src.tar.gz"
|
||||
name: Source distribution
|
||||
- name: Build macOS binary
|
||||
env:
|
||||
SIGNING_AUTH: ${{ secrets.SIGNING_AUTH }}
|
||||
NOTARIZATION_USER: ${{ secrets.NOTARIZATION_USER }}
|
||||
NOTARIZATION_PASS: ${{ secrets.NOTARIZATION_PASS }}
|
||||
run: |
|
||||
python3 builder/package.py app
|
||||
python3 builder/make_dmg.py
|
||||
@@ -171,15 +182,14 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
|
||||
env:
|
||||
SNAP_TOKEN: ${{ secrets.SNAP_TOKEN }}
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_TOKEN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v3
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- name: Release latest available Snap
|
||||
run: |
|
||||
sudo snap install snapcraft --classic
|
||||
echo "${SNAP_TOKEN}" | snapcraft login --with -
|
||||
python3 snap/local/release_snap.py
|
||||
|
||||
11
.github/workflows/integration_testing.yml
vendored
11
.github/workflows/integration_testing.yml
vendored
@@ -31,27 +31,29 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version: ["3.7", "3.8", "3.9", "3.10"]
|
||||
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"]
|
||||
os: [ubuntu-20.04]
|
||||
include:
|
||||
- name: macOS
|
||||
os: macos-latest
|
||||
python-version: "3.10"
|
||||
python-version: "3.11"
|
||||
- name: Windows
|
||||
os: windows-latest
|
||||
# lxml is not yet available for Python 3.11, so CI is stuck on 3.10 for now
|
||||
python-version: "3.10"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v3
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
architecture: "x64"
|
||||
- name: Install system dependencies
|
||||
if: runner.os == 'Linux'
|
||||
run: sudo apt-get install unrar p7zip-full par2
|
||||
- name: Cache Python virtualenv
|
||||
uses: syphar/restore-virtualenv@v1.2
|
||||
uses: syphar/restore-virtualenv@v1.3
|
||||
id: cache-virtualenv
|
||||
with:
|
||||
custom_cache_key_element: "ci"
|
||||
@@ -62,6 +64,7 @@ jobs:
|
||||
if: steps.cache-virtualenv.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
python --version
|
||||
pip install --upgrade pip wheel
|
||||
pip install --upgrade -r requirements.txt
|
||||
pip install --upgrade -r tests/requirements.txt
|
||||
- name: Test SABnzbd
|
||||
|
||||
21
.github/workflows/translations.yml
vendored
21
.github/workflows/translations.yml
vendored
@@ -13,28 +13,29 @@ jobs:
|
||||
TX_TOKEN: ${{ secrets.TX_TOKEN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
|
||||
- name: Generate translatable texts
|
||||
run: |
|
||||
python3 tools/extract_pot.py
|
||||
- name: Install Transifex client
|
||||
if: env.TX_TOKEN
|
||||
# Sudo is needed to link the "tx"-command
|
||||
run: |
|
||||
sudo -H python3 -m pip install setuptools wheel
|
||||
sudo -H python3 -m pip install transifex-client
|
||||
- name: Push/pull Transifex translations
|
||||
if: env.TX_TOKEN
|
||||
run: |
|
||||
tx push --source --parallel
|
||||
tx pull --all --force --parallel
|
||||
curl -o- https://raw.githubusercontent.com/transifex/cli/master/install.sh | bash
|
||||
./tx push --source
|
||||
./tx pull --all --force
|
||||
- name: Compile translations to validate them
|
||||
run: |
|
||||
python3 tools/make_mo.py
|
||||
- name: Push translatable and translated texts back to repo
|
||||
uses: stefanzweifel/git-auto-commit-action@v4.14.1
|
||||
uses: stefanzweifel/git-auto-commit-action@v4.15.2
|
||||
if: env.TX_TOKEN
|
||||
with:
|
||||
commit_message: Update translatable texts
|
||||
commit_message: |
|
||||
Update translatable texts
|
||||
[skip ci]
|
||||
commit_user_name: SABnzbd Automation
|
||||
commit_user_email: bugs@sabnzbd.org
|
||||
commit_author: SABnzbd Automation <bugs@sabnzbd.org>
|
||||
file_pattern: "po/*.pot po/*.po"
|
||||
push_options: --force
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
branch: develop
|
||||
schedule: every week
|
||||
update: all
|
||||
pin: False
|
||||
label_prs: dependencies
|
||||
branch_prefix: pyup/
|
||||
@@ -1,21 +1,21 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[sabnzbd-translations.po-main-sabnzbd-pot--develop]
|
||||
[o:sabnzbd:p:sabnzbd-translations:r:po-main-sabnzbd-pot--develop]
|
||||
file_filter = po/main/<lang>.po
|
||||
minimum_perc = 0
|
||||
source_file = po/main/SABnzbd.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[sabnzbd-translations.po-email-sabemail-pot--develop]
|
||||
[o:sabnzbd:p:sabnzbd-translations:r:po-email-sabemail-pot--develop]
|
||||
file_filter = po/email/<lang>.po
|
||||
minimum_perc = 0
|
||||
source_file = po/email/SABemail.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[sabnzbd-translations.po-nsis-sabnsis-pot--develop]
|
||||
[o:sabnzbd:p:sabnzbd-translations:r:po-nsis-sabnsis-pot--develop]
|
||||
file_filter = po/nsis/<lang>.po
|
||||
minimum_perc = 0
|
||||
source_file = po/nsis/SABnsis.pot
|
||||
|
||||
@@ -53,3 +53,6 @@
|
||||
to your servers to a total of 7. There is a CPU-usage reduction feature in SABnzbd that
|
||||
gets confused by the way some VPN's handle the state of a connection. Below 8 connections
|
||||
this feature is not active.
|
||||
|
||||
- If the queue is paused but one or more jobs have the Force priority, SABnzbd might still
|
||||
download some data from other jobs in the queue if active servers have unused connections.
|
||||
|
||||
4
PKG-INFO
4
PKG-INFO
@@ -1,7 +1,7 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: SABnzbd
|
||||
Version: 3.6.0
|
||||
Summary: SABnzbd-3.6.0
|
||||
Version: 3.7.0
|
||||
Summary: SABnzbd-3.7.0
|
||||
Home-page: https://sabnzbd.org
|
||||
Author: The SABnzbd Team
|
||||
Author-email: team@sabnzbd.org
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
SABnzbd - The automated Usenet download tool
|
||||
============================================
|
||||
|
||||

|
||||

|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](https://discord.gg/KQzDe7fvNU)
|
||||
|
||||
SABnzbd is an Open Source Binary Newsreader written in Python.
|
||||
|
||||
|
||||
78
README.mkd
78
README.mkd
@@ -1,53 +1,39 @@
|
||||
Release Notes - SABnzbd 3.6.0
|
||||
Release Notes - SABnzbd 3.7.0
|
||||
=========================================================
|
||||
|
||||
## Changes since 3.5.3
|
||||
- Significantly increased performance by using the yEnc-decoding
|
||||
library of @animetosho. Usenet articles are now decoded using
|
||||
specialized CPU instructions (SIMD) on x86 and ARM systems.
|
||||
- Create and restore a backup of configuration and database.
|
||||
- Show source of lower download speed (CPU or disk).
|
||||
- Added keyboard shortcuts (`P`ause, `A`dd, `S`tatus, `C`onfig).
|
||||
- Result of the `Deobfuscate` step is listed in History details.
|
||||
- `Path` of `Default` category will be used if category doesn't have one.
|
||||
- Disabling `api_warnings` prevents showing `Access Denied`
|
||||
information to the external client.
|
||||
- Jobs with `Force` priority will always skip the duplicate check.
|
||||
- Added `ext_rename_ignore` to add custom extensions that should
|
||||
be ignored during the `Deobfuscate` step.
|
||||
- Removed Indexer Feedback Integration.
|
||||
- Removed included `Deobfuscate.py` as it is outdated.
|
||||
- Show a warning when there are no valid news servers active.
|
||||
- Show a warning if the filesystem does not support special characters.
|
||||
- Allow multiple parameters to be passed to par2cmdline/Multipar.
|
||||
- Linux: Added AppStream metadata, desktop shortcut and MimeInfo.
|
||||
- Linux: Added support for bash completion.
|
||||
- macOS: Application and included tools fully native on M1 systems.
|
||||
- macOS/Windows: Updated UnRar to 6.10 and 7-Zip to 21.07.
|
||||
- Windows: Updated MultiPar to v1.3.2.3.
|
||||
## Changes since 3.6.1
|
||||
- The queue and history can be filtered using keywords:
|
||||
`cat` and `priority`. For example: `show name cat:tv`.
|
||||
- Use shortcut `shift + arrow-key` to navigate the queue/history pages.
|
||||
- The backup is now created in a local folder for security.
|
||||
- Recurring backups can be configured using the scheduler.
|
||||
- Improvements to Deobfuscate Final Filenames.
|
||||
- RSS overview shows the rule that accepted the job.
|
||||
- Added option to sort the queue by `% downloaded`.
|
||||
- Added option to replace underscores with dots in folder names.
|
||||
- SABnzbd Host input will be validated before being applied.
|
||||
- Moved system load information from the main page to the Status window.
|
||||
- Console logging is now written to `stdout` instead of `stderr`.
|
||||
- Removed Special settings `enable_meta`, `disable_key`,
|
||||
`replace_illegal`, `osx_speed` and `show_sysload`.
|
||||
- Merged Special settings `win_menu` and `osx_menu` into `tray_icon`.
|
||||
- macOS/Windows: Use Python 3.11, slightly boosting overall performance.
|
||||
- macOS/Windows: Updated UnRar to 6.12.
|
||||
- Windows: Updated MultiPar to 1.3.2.5.
|
||||
|
||||
# API changes since 3.5.3
|
||||
- Removed several (status) fields from the `queue` API call.
|
||||
- Remove unused and undocumented API calls: `addid`, `options`, `rescan`,
|
||||
`osx_icon`, `set_speedlimit`, `get_speedlimit`, `set_colorscheme`.
|
||||
- Removed undocumented `xcat` parameter.
|
||||
- `None` values in XML API-output are left empty.
|
||||
- Adding NZB's would not always return `nzo_ids`.
|
||||
- Prevent crash in `history` call during post-processing.
|
||||
# API changes since 3.6.1
|
||||
- Minor improvements in API performance.
|
||||
- Removed fields `scripts` and `categories` from `queue` API call.
|
||||
- Moved `loadavg` from `queue` to `status` API call.
|
||||
|
||||
# Bugfixes since 3.5.3
|
||||
- Extended timeout when measuring system performance.
|
||||
- Interface settings were sometimes reset on page reload.
|
||||
- Par2 sets with duplicate names could skip verification and repair.
|
||||
- Ignore `.par2` files that could not be parsed.
|
||||
- Correctly default to `Glitter - Auto` on new installs.
|
||||
- Download speed was not updated when stalled due to disk performance.
|
||||
- Prevent traceback when status functions timeout.
|
||||
- Prevent crash if not enough repair blocks are available.
|
||||
- Prevent crash when there is an unknown `language` setting.
|
||||
- Source release had Windows line-endings.
|
||||
- Windows: If a job password contained a double quote it
|
||||
would not be picked up by UnRar and unpack would fail.
|
||||
# Bugfixes since 3.6.1
|
||||
- Free Space Detection was too strict when using Direct Unpack.
|
||||
- File uploads with special characters would be parsed incorrectly.
|
||||
- Passwords from NZB meta-data were tried multiple times.
|
||||
- Passwords were not always supplied to the pre-queue script.
|
||||
- RSS-feed names were not sanitized when renamed.
|
||||
- Make sure short-dates are detected as `YY-MM-DD` in Sorting.
|
||||
- Show the custom job name in History when the NZB could not be fetched.
|
||||
|
||||
## Upgrade notices
|
||||
- The download statistics file `totals10.sab` is updated in 3.2.x
|
||||
|
||||
@@ -1156,7 +1156,7 @@ def main():
|
||||
daemonize()
|
||||
else:
|
||||
if console_logging:
|
||||
console = logging.StreamHandler()
|
||||
console = logging.StreamHandler(stream=sys.stdout)
|
||||
console.setLevel(LOGLEVELS[logging_level + 1])
|
||||
console.setFormatter(logging.Formatter(logformat))
|
||||
logger.addHandler(console)
|
||||
@@ -1260,7 +1260,7 @@ def main():
|
||||
sabnzbd.cfg.web_color.set(sabnzbd.WEB_COLOR)
|
||||
|
||||
# Handle the several tray icons
|
||||
if sabnzbd.cfg.win_menu() and not sabnzbd.DAEMON and not sabnzbd.WIN_SERVICE:
|
||||
if sabnzbd.cfg.tray_icon() and not sabnzbd.DAEMON and not sabnzbd.WIN_SERVICE:
|
||||
if sabnzbd.WIN32:
|
||||
sabnzbd.WINTRAY = sabnzbd.sabtray.SABTrayThread()
|
||||
elif sabnzbd.LINUX_POWER and os.environ.get("DISPLAY"):
|
||||
@@ -1271,7 +1271,7 @@ def main():
|
||||
from gi.repository import Gtk
|
||||
import sabnzbd.sabtraylinux
|
||||
|
||||
sabnzbd.LINUXTRAY = sabnzbd.sabtraylinux.StatusIcon()
|
||||
sabnzbd.sabtraylinux.StatusIcon()
|
||||
except:
|
||||
logging.info("python3-gi not found, no SysTray.")
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# Special requirements for macOS universal2 binary release
|
||||
# This way dependabot can auto-update them
|
||||
cryptography==37.0.2
|
||||
cryptography==38.0.3
|
||||
@@ -16,6 +16,7 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
import glob
|
||||
import hashlib
|
||||
import platform
|
||||
import re
|
||||
import sys
|
||||
@@ -482,6 +483,16 @@ if __name__ == "__main__":
|
||||
# Remove source folder
|
||||
safe_remove(src_folder)
|
||||
|
||||
# Calculate hashes for Synology release
|
||||
with open(RELEASE_SRC, "rb") as inp_file:
|
||||
source_data = inp_file.read()
|
||||
|
||||
print("----")
|
||||
print(RELEASE_SRC, "SHA1", hashlib.sha1(source_data).hexdigest())
|
||||
print(RELEASE_SRC, "SHA256", hashlib.sha256(source_data).hexdigest())
|
||||
print(RELEASE_SRC, "MD5", hashlib.md5(source_data).hexdigest())
|
||||
print("----")
|
||||
|
||||
# Release to github
|
||||
if "release" in sys.argv:
|
||||
# Check if tagged as release and check for token
|
||||
|
||||
@@ -1,21 +1,22 @@
|
||||
# Basic build requirements
|
||||
# Note that not all sub-dependencies are listed, but only ones we know could cause trouble
|
||||
pyinstaller==5.1
|
||||
pyinstaller-hooks-contrib==2022.5
|
||||
altgraph==0.17.2
|
||||
pyinstaller==5.6.1
|
||||
pyinstaller-hooks-contrib==2022.10
|
||||
altgraph==0.17.3
|
||||
wrapt==1.14.1
|
||||
setuptools==62.3.2
|
||||
pkginfo==1.8.2
|
||||
PyGithub==1.55
|
||||
charset-normalizer==2.0.12
|
||||
setuptools==65.5.0
|
||||
pkginfo==1.8.3
|
||||
PyGithub==1.56
|
||||
charset-normalizer==3.0.0
|
||||
certifi
|
||||
|
||||
# orjson does not support 32bit Windows, exclude it based on Python-version
|
||||
orjson==3.6.8; python_version > '3.8'
|
||||
# This way we also test ujson on Python 3.7 and 3.8 in the CI-tests
|
||||
orjson==3.8.0; python_version > '3.8'
|
||||
|
||||
# For the macOS build
|
||||
dmgbuild==1.5.2; sys_platform == 'darwin'
|
||||
mac-alias==2.2.0; sys_platform == 'darwin'
|
||||
macholib==1.16; sys_platform == 'darwin'
|
||||
macholib==1.16.2; sys_platform == 'darwin'
|
||||
ds-store==1.3.0; sys_platform == 'darwin'
|
||||
PyNaCl==1.5.0; sys_platform == 'darwin'
|
||||
PyNaCl==1.5.0; sys_platform == 'darwin'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Config"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/configure"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/configure"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<!--#from sabnzbd.encoding import CODEPAGE#-->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Categories"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/categories"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/categories"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
<div class="colmask">
|
||||
<div class="section">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Folders"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/folders"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/folders"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
@@ -104,6 +104,11 @@
|
||||
<span class="desc">$T('explain-admin_dir1')</span>
|
||||
<span class="desc">$T('explain-admin_dir2')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="backup_dir">$T('opt-backup_dir')</label>
|
||||
<input type="text" name="backup_dir" id="backup_dir" value="$backup_dir" data-initialdir="$my_home" />
|
||||
<span class="desc">$T('explain-backup_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="log_dir">$T('opt-log_dir')</label>
|
||||
<input type="text" name="log_dir" id="log_dir" value="$log_dir" data-initialdir="$my_lcldata" />
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="General"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/general"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/general"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
@@ -231,18 +231,18 @@
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('backup') <a href="$helpuri$help_uri#toc3" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
<p><b>$T('restartRequired')</b></p>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="download_backup">$T('download-backup')</label>
|
||||
<span class="desc"><a class="btn btn-default" href="../backup/?apikey=$apikey" target="_blank" id="download_backup"><span class="glyphicon glyphicon-download-alt"></span> $T('download-backup')</a></span>
|
||||
<label class="config" for="create_backup">$T('create-backup')</label>
|
||||
<span class="desc"><button class="btn btn-default createBackup" type="button" id="create_backup"><span class="glyphicon glyphicon glyphicon-import"></span> $T('create-backup')</button></span>
|
||||
<span class="desc">$T('explain-create_backup')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="config_backup_file">$T('restore-backup')</label>
|
||||
<input type="file" accept=".zip" name="config_backup_file" id="config_backup_file" />
|
||||
<span class="desc">$T('explain-admin_backup')</span>
|
||||
<span class="desc">$T('restartRequired')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-open"></span> $T('restore-backup')</button>
|
||||
@@ -399,6 +399,20 @@
|
||||
}
|
||||
})
|
||||
|
||||
\$('#create_backup').click(function () {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "../../api",
|
||||
data: {mode:'config', name:'create_backup', output:'json', apikey: \$('#apikey').val()},
|
||||
success: function(data) {
|
||||
if(data.value.result) {
|
||||
alert("$T('backup'):\n" + data.value.message)
|
||||
} else {
|
||||
alert("$T('button-failed')")
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Email"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/notifications"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/notifications"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<!--#def show_notify_checkboxes($section_label)#-->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="RSS"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/rss"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/rss"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
<!--#import html#-->
|
||||
<div class="colmask">
|
||||
@@ -481,18 +481,22 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="default-sort">$T('rss-added')</th>
|
||||
<th>$T('rss-filter')</th>
|
||||
<th>$T('size')</th>
|
||||
<th width="60%">$T('sort-title')</th>
|
||||
<th>$T('category')</th>
|
||||
<th>$T('nzo-age')</th>
|
||||
<th>$T('source')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!--#for $job in $downloaded#-->
|
||||
<tr class="infoTableSeperator">
|
||||
<td data-sort-value="$job['time_downloaded_ms']">$job['time_downloaded']</td>
|
||||
<td>$job['rule'] $job['skip']</td>
|
||||
<td data-sort-value="$job['size']">$job['size_units']</td>
|
||||
<td>$job['title']</td>
|
||||
<td>$job['cat']</td>
|
||||
<td data-sort-value="$job['age_ms']">$job['age']</td>
|
||||
<td data-sort-value="$job['baselink']" title="$job['baselink']">
|
||||
<!--#if not $job['infourl']#-->
|
||||
<div class="favicon source-icon" style="background-image: url(//$job['baselink']/favicon.ico);" data-domain="$job['baselink']"></div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Scheduling"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/scheduling"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/scheduling"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<%
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Servers"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/servers"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/servers"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<!--#import json#-->
|
||||
@@ -49,7 +49,7 @@
|
||||
<label class="config" for="host">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="port">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port" size="8" value="119" min="0" />
|
||||
</div>
|
||||
@@ -180,7 +180,7 @@
|
||||
<label class="config" for="host$cur">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host$cur" value="$server['host']" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="port$cur">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port$cur" value="$server['port']" size="8" min="0" required />
|
||||
</div>
|
||||
@@ -259,7 +259,7 @@
|
||||
<label class="config" for="notes$cur">$T('srv-notes')</label>
|
||||
<textarea name="notes" id="notes$cur" rows="3" cols="50">$server['notes']</textarea>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<div class="field-pair no-field-pair-bg">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
|
||||
<button class="btn btn-default delServer"><span class="glyphicon glyphicon-trash"></span> $T('button-delServer')</button>
|
||||
@@ -283,7 +283,8 @@
|
||||
|
||||
<p title="$T('readwiki')">
|
||||
<b>$T('srv-article-availability'):</b><br/>
|
||||
$T('selectedDates'): <span id="server-article-value-${cur}"></span>
|
||||
$T('selectedDates'): <span id="server-article-value-${cur}"></span><br/>
|
||||
<a href="https://sabnzbd.org/not-complete" id="server-article-not-complete-${cur}" target="_blank">https://sabnzbd.org/not-complete</a>
|
||||
</p>
|
||||
<!--#if $server['expire_date']#-->
|
||||
<p><b>$T('srv-expire_date'):</b> $(server['expire_date'])</p>
|
||||
@@ -402,8 +403,11 @@
|
||||
if(!isNaN(articleRatio)) {
|
||||
// Use filesize to convert to unit-display
|
||||
\$('#server-article-value-' + server_id).text('$T("srv-articles-tried")'.replace('%f', articleRatio).replace('%d', filesize(totalArticlesTriedThisRange, {unix: true, round: 0, spacer: "", base: 1})))
|
||||
// If we have a low value, we link them to the website
|
||||
if(articleRatio > 60) \$('#server-article-not-complete-' + server_id).hide()
|
||||
} else {
|
||||
\$('#server-article-value-' + server_id).text('$T("notAvailable")')
|
||||
\$('#server-article-not-complete-' + server_id).hide()
|
||||
}
|
||||
|
||||
// Save bandwidth data in a very ugly way, but we need to do this
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Sorting"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/sorting"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/sorting"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Special"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/special"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/special"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Switches"#-->
|
||||
<!--#set global $help_uri="configuration/3.6/switches"#-->
|
||||
<!--#set global $help_uri="configuration/3.7/switches"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
@@ -141,6 +141,7 @@
|
||||
<label class="config" for="auto_sort">$T('opt-auto_sort')</label>
|
||||
<select name="auto_sort" id="auto_sort">
|
||||
<option value="">$T('default')</option>
|
||||
<option value="remaining asc" <!--#if $auto_sort == "remaining asc" then 'selected="selected"' else ""#--> >$T('Glitter-sortRemaining')</option>
|
||||
<option value="avg_age desc" <!--#if $auto_sort == "avg_age desc" then 'selected="selected"' else ""#--> >$T('Glitter-sortAgeAsc')</option>
|
||||
<option value="avg_age asc" <!--#if $auto_sort == "avg_age asc" then 'selected="selected"' else ""#--> >$T('Glitter-sortAgeDesc')</option>
|
||||
<option value="name asc" <!--#if $auto_sort == "name asc" then 'selected="selected"' else ""#--> >$T('Glitter-sortNameAsc')</option>
|
||||
@@ -148,7 +149,7 @@
|
||||
<option value="size asc" <!--#if $auto_sort == "size asc" then 'selected="selected"' else ""#--> >$T('Glitter-sortSizeAsc')</option>
|
||||
<option value="size desc" <!--#if $auto_sort == "size desc" then 'selected="selected"' else ""#--> >$T('Glitter-sortSizeDesc')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-auto_sort')</span>
|
||||
<span class="desc">$T('explain-auto_sort') $T('explain-auto_sort_remaining')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="direct_unpack">$T('opt-direct_unpack')</label>
|
||||
@@ -247,11 +248,6 @@
|
||||
<input type="checkbox" name="deobfuscate_final_filenames" id="deobfuscate_final_filenames" value="1" <!--#if int($deobfuscate_final_filenames) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-deobfuscate_final_filenames') $T('explain-deobfuscate_final_filenames-ext')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="enable_meta">$T('opt-enable_meta')</label>
|
||||
<input type="checkbox" name="enable_meta" id="enable_meta" value="1" <!--#if int($enable_meta) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-enable_meta').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="cleanup_list">$T('opt-cleanup_list')</label>
|
||||
<input type="text" name="cleanup_list" id="cleanup_list" value="$cleanup_list"/>
|
||||
@@ -292,6 +288,11 @@
|
||||
<input type="checkbox" name="replace_spaces" id="replace_spaces" value="1" <!--#if int($replace_spaces) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-replace_spaces')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="replace_underscores">$T('opt-replace_underscores')</label>
|
||||
<input type="checkbox" name="replace_underscores" id="replace_underscores" value="1" <!--#if int($replace_underscores) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-replace_underscores')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="replace_dots">$T('opt-replace_dots')</label>
|
||||
<input type="checkbox" name="replace_dots" id="replace_dots" value="1" <!--#if int($replace_dots) > 0 then 'checked="checked"' else ""#--> />
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
<div class="col-sm-2">$T('srv-password')</div>
|
||||
<div class="col-sm-10" data-bind="text: historyStatus.password"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="row" data-bind="visible: historyStatus.storage() || historyStatus.path()">
|
||||
<div class="col-sm-2">$T('msg-path')</div>
|
||||
<div class="col-sm-10" data-bind="text: historyStatus.storage() == '' ? historyStatus.path : historyStatus.storage"></div>
|
||||
</div>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<button type="button" class="btn btn-default navbar-btn dropdown-toggle" data-toggle="dropdown" onclick="keepOpen(this)">
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<a href="#" class="max-speed-input-clear hover-button" data-bind="click: clearSpeedLimit, visible:(speedLimit() != 100)" style="display: none;">
|
||||
<a href="#" class="max-speed-input-clear hover-button" data-bind="click: clearSpeedLimit, visible:(speedLimit() < 100 && speedLimit() > 0)" style="display: none;">
|
||||
<span class="glyphicon glyphicon-link"></span>
|
||||
</a>
|
||||
<div class="dropdown-menu max-speed-input">
|
||||
@@ -81,7 +81,7 @@
|
||||
<li data-tooltip="true" data-placement="bottom" title="SABnzbd $T('menu-config')">
|
||||
<a href="./config/"><span class="glyphicon glyphicon-cog"></span></a>
|
||||
</li>
|
||||
<li class="dropdown main-menu-link" data-bind="css: { 'active-on-queue-finish-menu': onQueueFinish()}">
|
||||
<li class="dropdown main-menu-link" data-bind="css: { 'active-on-queue-finish-menu': finishaction()}">
|
||||
<a href="#" data-toggle="dropdown" onclick="keepOpen(this)">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
@@ -102,7 +102,8 @@
|
||||
<li class="divider"></li>
|
||||
<li class="dropdown-header"><span class="glyphicon glyphicon-off"></span> $T('Glitter-onFinish'):</li>
|
||||
<li>
|
||||
<select data-bind="value: onQueueFinish, event: { change: setOnQueueFinish }" class="form-control">
|
||||
<!-- ko if: queue.scriptsListLoaded -->
|
||||
<select data-bind="value: finishaction, event: { change: setOnQueueFinish }" class="form-control">
|
||||
<option value=""></option>
|
||||
<optgroup label="$T('eoq-actions')">
|
||||
<option value="shutdown_program">$T('shutdownSab')</option>
|
||||
@@ -114,12 +115,13 @@
|
||||
</optgroup>
|
||||
<optgroup label="$T('eoq-scripts')" data-bind="visible: queue.scriptsList().length > 1">
|
||||
<!-- ko foreach: queue.scriptsList -->
|
||||
<!-- ko if: \$data != glitterTranslate.noneText -->
|
||||
<option data-bind="text: \$data, attr: { value: 'script_'+\$data } " ></option>
|
||||
<!-- ko if: \$data.scriptValue != 'None' -->
|
||||
<option data-bind="text: \$data.scriptText, attr: { value: 'script_'+\$data.scriptValue } " ></option>
|
||||
<!-- /ko -->
|
||||
<!-- /ko -->
|
||||
</optgroup>
|
||||
</select>
|
||||
<!-- /ko -->
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -117,6 +117,12 @@
|
||||
<span data-bind="text: cacheSize"></span> (<span data-bind="text: cacheArticles"></span> $T('Glitter-articles'))
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: statusInfo.loadavg()">
|
||||
<div class="col-sm-6">$T('dashboard-loadavg') </div>
|
||||
<div class="col-sm-6">
|
||||
<span data-bind="text: statusInfo.loadavg"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: statusInfo.delayed_decoder() > 5 || statusInfo.delayed_assembler() > 5">
|
||||
<div class="col-sm-6">$T('dashboard-delayed') </div>
|
||||
<div class="col-sm-6">
|
||||
@@ -517,7 +523,7 @@
|
||||
<div class="form-group">
|
||||
<label class="col-sm-4 control-label">$T('category')</label>
|
||||
<div class="col-sm-6">
|
||||
<select name="Category" class="form-control" data-bind="options: queue.categoriesList, optionsValue: 'catValue', optionsText: 'catText',"></select>
|
||||
<select name="Category" class="form-control" data-bind="options: queue.categoriesList, optionsValue: 'catValue', optionsText: 'catText'"></select>
|
||||
<span class="glyphicon glyphicon-tag"></span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -538,7 +544,7 @@
|
||||
<div class="form-group">
|
||||
<label class="col-sm-4 control-label">$T('eoq-scripts')</label>
|
||||
<div class="col-sm-6">
|
||||
<select name="Post-processing" class="form-control" data-bind="options: queue.scriptsList, optionsCaption: '$T('default')', enable: (queue.scriptsList().length > 1)"></select>
|
||||
<select name="Post-processing" class="form-control" data-bind="options: queue.scriptsList, optionsCaption: '$T('default')', optionsValue: 'scriptValue', optionsText: 'scriptText', enable: (queue.scriptsList().length > 1)"></select>
|
||||
<span class="glyphicon glyphicon-flash"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,12 +9,6 @@
|
||||
</a>
|
||||
</div>
|
||||
<!-- /ko -->
|
||||
<!--#if $loadavg#-->
|
||||
<div class="info-container-box" title="$T('ft-sysload') - $T('menu-config') ➜ $T('cmenu-special') ➜ show_sysload">
|
||||
<span class="glyphicon glyphicon-record"></span>
|
||||
<span data-bind="text: systemLoad"></span>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
<!-- ko if: (queueDataLeft() != '') -->
|
||||
<div class="info-container-box">
|
||||
<span class="glyphicon glyphicon-save"></span>
|
||||
@@ -52,6 +46,7 @@
|
||||
<span class="glyphicon glyphicon-tasks" data-tooltip="true" data-placement="left" title="$T('Glitter-multiOperations')"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="#" data-action="sortRemainingAsc" data-bind="click: queue.queueSorting">$T('Glitter-sortRemaining')</a></li>
|
||||
<li><a href="#" data-action="sortAgeAsc" data-bind="click: queue.queueSorting">$T('Glitter-sortAgeAsc')</a></li>
|
||||
<li><a href="#" data-action="sortAgeDesc" data-bind="click: queue.queueSorting">$T('Glitter-sortAgeDesc')</a></li>
|
||||
<li><a href="#" data-action="sortNameAsc" data-bind="click: queue.queueSorting">$T('Glitter-sortNameAsc')</a></li>
|
||||
@@ -162,7 +157,7 @@
|
||||
</li>
|
||||
<li title="$T('eoq-scripts')" data-tooltip="true" data-placement="left">
|
||||
<span class="glyphicon glyphicon-flash"></span>
|
||||
<select name="Post-processing" class="form-control" data-bind="options: parent.scriptsList, value: script, event: { change: changeScript }, enable: (parent.scriptsList().length > 1)"></select>
|
||||
<select name="Post-processing" class="form-control" data-bind="options: parent.scriptsList, value: script, optionsValue: 'scriptValue', optionsText: 'scriptText', event: { change: changeScript }, enable: (parent.scriptsList().length > 1)"></select>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- /ko -->
|
||||
@@ -209,7 +204,7 @@
|
||||
</div>
|
||||
<div class="add-nzb-inputbox" data-tooltip="true" data-placement="top" title="$T('eoq-scripts')">
|
||||
<span class="glyphicon glyphicon-flash"></span>
|
||||
<select name="Post-processing" class="form-control" data-bind="options: queue.scriptsList, optionsCaption: '', event: { change: queue.doMultiEditUpdate }"></select>
|
||||
<select name="Post-processing" class="form-control" data-bind="options: queue.scriptsList, optionsValue: 'scriptValue', optionsText: 'scriptText', optionsCaption: '', event: { change: queue.doMultiEditUpdate }"></select>
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</form>
|
||||
|
||||
@@ -65,16 +65,8 @@
|
||||
glitterTranslate.renameAbort = "$T('Glitter-confirmAbortDirectUnpack')\n$T('confirm')";
|
||||
glitterTranslate.retryAll = "$T('link-retryAll')?";
|
||||
glitterTranslate.fetch = "$T('Glitter-fetch')";
|
||||
glitterTranslate.encrypted = "$T('Glitter-encrypted')";
|
||||
glitterTranslate.duplicate = "$T('Glitter-duplicate')";
|
||||
glitterTranslate.tooLarge = "$T('Glitter-tooLarge')";
|
||||
glitterTranslate.unwanted = "$T('Glitter-unwanted')";
|
||||
glitterTranslate.incomplete = "$T('Glitter-incomplete')";
|
||||
glitterTranslate.waitSec = "$T('Glitter-waitSec')";
|
||||
glitterTranslate.checking = "$T('post-Checking')";
|
||||
glitterTranslate.misingArt = "$T('missingArt')";
|
||||
glitterTranslate.noSelect = "$T('Glitter-noSelect')";
|
||||
glitterTranslate.sendThanks = "$T('Glitter-sendThanks')";
|
||||
glitterTranslate.chooseFile = "$T('Glitter-chooseFile')";
|
||||
glitterTranslate.orphanedJobsMsg = "$T('explain-orphans')";
|
||||
glitterTranslate.useCache = "$T('explain-cache_limitstr').replace("64M", "256M").replace("128M", "512M")";
|
||||
@@ -129,9 +121,11 @@
|
||||
<!--#include raw $webdir + "/static/javascripts/jquery-3.5.1.min.js"#-->
|
||||
<!--#include raw $webdir + "/static/javascripts/jquery-ui.min.js"#-->
|
||||
<!--#include raw $webdir + "/static/javascripts/jquery.peity.min.js"#-->
|
||||
<!--#include raw $webdir + "/static/javascripts/jquery.hotkeys.min.js"#-->
|
||||
<!--#include raw $webdir + "/static/javascripts/moment-2.26.0.min.js"#-->
|
||||
<!--#include raw $webdir + "/static/javascripts/knockout-3.5.1.min.js"#-->
|
||||
<!--#include raw $webdir + "/static/javascripts/knockout-extensions.js"#-->
|
||||
<!--#include raw $webdir + "/static/javascripts/search-query-parser.js"#-->
|
||||
<!--#include raw $webdir + "/static/bootstrap/js/bootstrap.min.js"#-->
|
||||
<!--#include $webdir + "/static/javascripts/glitter.js"#-->
|
||||
</script>
|
||||
|
||||
@@ -294,7 +294,7 @@ function paginationModel(parent) {
|
||||
self.nrPages(1)
|
||||
self.currentStart(0);
|
||||
|
||||
// Are we on next page?
|
||||
// Are we on next page? Bad!
|
||||
if(self.currentPage() > 1) {
|
||||
// Force full update
|
||||
parent.parent.refresh(true);
|
||||
@@ -302,9 +302,6 @@ function paginationModel(parent) {
|
||||
|
||||
// Move to current page
|
||||
self.currentPage(1);
|
||||
|
||||
// Force full update
|
||||
parent.parent.refresh(true);
|
||||
} else {
|
||||
// Calculate number of pages needed
|
||||
var newNrPages = Math.ceil(parent.totalItems() / parent.paginationLimit())
|
||||
|
||||
@@ -10,7 +10,7 @@ function HistoryListModel(parent) {
|
||||
self.historyItems = ko.observableArray([])
|
||||
self.showFailed = ko.observable(false).extend({ persist: 'historyShowFailed' });
|
||||
self.isLoading = ko.observable(false).extend({ rateLimit: 100 });
|
||||
self.searchTerm = ko.observable('').extend({ rateLimit: { timeout: 200, method: "notifyWhenChangesStop" } });
|
||||
self.searchTerm = ko.observable('').extend({ rateLimit: { timeout: 400, method: "notifyWhenChangesStop" } });
|
||||
self.paginationLimit = ko.observable(10).extend({ persist: 'historyPaginationLimit' });
|
||||
self.totalItems = ko.observable(0);
|
||||
self.pagination = new paginationModel(self);
|
||||
@@ -139,14 +139,15 @@ function HistoryListModel(parent) {
|
||||
form.reset()
|
||||
}
|
||||
|
||||
// Searching in history (rate-limited in decleration)
|
||||
// Searching in history (rate-limited in declaration)
|
||||
self.searchTerm.subscribe(function() {
|
||||
// Make sure we refresh
|
||||
self.lastUpdate = 0
|
||||
self.parent.refresh();
|
||||
// Go back to page 1
|
||||
if(self.pagination.currentPage() != 1) {
|
||||
// This forces a refresh
|
||||
self.pagination.moveToPage(1);
|
||||
} else {
|
||||
// Make sure we refresh
|
||||
self.parent.refresh(true);
|
||||
}
|
||||
})
|
||||
|
||||
@@ -157,7 +158,6 @@ function HistoryListModel(parent) {
|
||||
// Set the loader so it doesn't flicker and then switch
|
||||
self.isLoading(true)
|
||||
self.searchTerm('');
|
||||
self.parent.refresh()
|
||||
}
|
||||
// Was it click and the field is empty? Then we focus on the field
|
||||
if(event.type == 'mousedown' && self.searchTerm() == '') {
|
||||
|
||||
@@ -48,7 +48,7 @@ function ViewModel() {
|
||||
self.nrWarnings = ko.observable(0);
|
||||
self.allWarnings = ko.observableArray([]);
|
||||
self.allMessages = ko.observableArray([]);
|
||||
self.onQueueFinish = ko.observable('');
|
||||
self.finishaction = ko.observable();
|
||||
self.speedHistory = [];
|
||||
|
||||
// Statusinfo container
|
||||
@@ -64,6 +64,7 @@ function ViewModel() {
|
||||
self.statusInfo.dnslookup = ko.observable();
|
||||
self.statusInfo.delayed_decoder = ko.observable();
|
||||
self.statusInfo.delayed_assembler = ko.observable();
|
||||
self.statusInfo.loadavg = ko.observable();
|
||||
self.statusInfo.pystone = ko.observable();
|
||||
self.statusInfo.downloaddir = ko.observable();
|
||||
self.statusInfo.downloaddirspeed = ko.observable();
|
||||
@@ -78,7 +79,7 @@ function ViewModel() {
|
||||
// Make the speedlimit tekst
|
||||
self.speedLimitText = ko.pureComputed(function() {
|
||||
// Set?
|
||||
if(!self.bandwithLimit()) return;
|
||||
if (!self.bandwithLimit()) return;
|
||||
|
||||
// The text
|
||||
var bandwithLimitText = self.bandwithLimit().replace(/[^a-zA-Z]+/g, '');
|
||||
@@ -87,10 +88,10 @@ function ViewModel() {
|
||||
var speedLimitNumberFull = (parseFloat(self.bandwithLimit()) * (self.speedLimit() / 100));
|
||||
|
||||
// Trick to only get decimal-point when needed
|
||||
var speedLimitNumber = Math.round(speedLimitNumberFull*10)/10;
|
||||
var speedLimitNumber = Math.round(speedLimitNumberFull * 10) / 10;
|
||||
|
||||
// Fix it for lower than 1MB/s
|
||||
if(bandwithLimitText == 'M' && speedLimitNumber < 1) {
|
||||
if (bandwithLimitText == 'M' && speedLimitNumber < 1) {
|
||||
bandwithLimitText = 'K';
|
||||
speedLimitNumber = Math.round(speedLimitNumberFull * 1024);
|
||||
}
|
||||
@@ -106,7 +107,7 @@ function ViewModel() {
|
||||
|
||||
// Dynamic icon
|
||||
self.SABIcon = ko.pureComputed(function() {
|
||||
if(self.downloadsPaused()) {
|
||||
if (self.downloadsPaused()) {
|
||||
return './staticcfg/ico/faviconpaused.ico?v=1.1.0';
|
||||
} else {
|
||||
return './staticcfg/ico/favicon.ico?v=1.1.0';
|
||||
@@ -115,7 +116,7 @@ function ViewModel() {
|
||||
|
||||
// Dynamic queue length check
|
||||
self.hasQueue = ko.pureComputed(function() {
|
||||
return(self.queue.queueItems().length > 0 || self.queue.searchTerm() || self.queue.isLoading())
|
||||
return (self.queue.queueItems().length > 0 || self.queue.searchTerm() || self.queue.isLoading())
|
||||
})
|
||||
|
||||
// Dynamic history length check
|
||||
@@ -125,7 +126,7 @@ function ViewModel() {
|
||||
})
|
||||
|
||||
self.hasWarnings = ko.pureComputed(function() {
|
||||
return(self.allWarnings().length > 0)
|
||||
return (self.allWarnings().length > 0)
|
||||
})
|
||||
|
||||
// Check for any warnings/messages
|
||||
@@ -136,10 +137,10 @@ function ViewModel() {
|
||||
// Update main queue
|
||||
self.updateQueue = function(response) {
|
||||
// Block in case off dragging
|
||||
if(!self.queue.shouldUpdate()) return;
|
||||
if (!self.queue.shouldUpdate()) return;
|
||||
|
||||
// Make sure we are displaying the interface
|
||||
if(self.isRestarting() >= 1) {
|
||||
if (self.isRestarting() >= 1) {
|
||||
// Decrease the counter by 1
|
||||
// In case of restart (which takes time to fire) we count down
|
||||
// In case of re-connect after failure it counts from 1 so emmediate continuation
|
||||
@@ -150,7 +151,7 @@ function ViewModel() {
|
||||
/***
|
||||
Possible login failure?
|
||||
***/
|
||||
if(response.hasOwnProperty('error') && response.error == 'Missing authentication') {
|
||||
if (response.hasOwnProperty('error') && response.error == 'Missing authentication') {
|
||||
// Restart
|
||||
document.location = document.location;
|
||||
}
|
||||
@@ -165,29 +166,26 @@ function ViewModel() {
|
||||
self.downloadsPaused(response.queue.paused);
|
||||
|
||||
// Finish action. Replace null with empty
|
||||
self.onQueueFinish(response.queue.finishaction ? response.queue.finishaction : '');
|
||||
self.finishaction(response.queue.finishaction ? response.queue.finishaction : '');
|
||||
|
||||
// Disk sizes
|
||||
self.diskSpaceLeft1(response.queue.diskspace1_norm)
|
||||
|
||||
// Same sizes? Then it's all 1 disk!
|
||||
if(response.queue.diskspace1 != response.queue.diskspace2) {
|
||||
if (response.queue.diskspace1 != response.queue.diskspace2) {
|
||||
self.diskSpaceLeft2(response.queue.diskspace2_norm)
|
||||
} else {
|
||||
self.diskSpaceLeft2('')
|
||||
}
|
||||
|
||||
// Did we exceed the space?
|
||||
self.diskSpaceExceeded1(parseInt(response.queue.mbleft)/1024 > parseFloat(response.queue.diskspace1))
|
||||
self.diskSpaceExceeded2(parseInt(response.queue.mbleft)/1024 > parseFloat(response.queue.diskspace2))
|
||||
self.diskSpaceExceeded1(parseInt(response.queue.mbleft) / 1024 > parseFloat(response.queue.diskspace1))
|
||||
self.diskSpaceExceeded2(parseInt(response.queue.mbleft) / 1024 > parseFloat(response.queue.diskspace2))
|
||||
|
||||
// Quota
|
||||
self.quotaLimit(response.queue.quota)
|
||||
self.quotaLimitLeft(response.queue.left_quota)
|
||||
|
||||
// System load
|
||||
self.systemLoad(response.queue.loadavg)
|
||||
|
||||
// Cache
|
||||
self.cacheSize(response.queue.cache_size)
|
||||
self.cacheArticles(response.queue.cache_art)
|
||||
@@ -199,7 +197,7 @@ function ViewModel() {
|
||||
Spark line
|
||||
***/
|
||||
// Break the speed if empty queue
|
||||
if(response.queue.sizeleft == '0 B') {
|
||||
if (response.queue.sizeleft == '0 B') {
|
||||
response.queue.kbpersec = 0;
|
||||
response.queue.speed = '0';
|
||||
}
|
||||
@@ -210,7 +208,7 @@ function ViewModel() {
|
||||
self.speedMetric(speedSplit[1]);
|
||||
|
||||
// Update sparkline data
|
||||
if(self.speedHistory.length >= 275) {
|
||||
if (self.speedHistory.length >= 275) {
|
||||
// Remove first one
|
||||
self.speedHistory.shift();
|
||||
}
|
||||
@@ -218,12 +216,12 @@ function ViewModel() {
|
||||
self.speedHistory.push(parseInt(response.queue.kbpersec));
|
||||
|
||||
// Is sparkline visible? Not on small mobile devices..
|
||||
if($('.sparkline-container').css('display') != 'none') {
|
||||
if ($('.sparkline-container').css('display') != 'none') {
|
||||
// Make sparkline
|
||||
if(self.speedHistory.length == 1) {
|
||||
if (self.speedHistory.length == 1) {
|
||||
// We only use speedhistory from SAB if we use global settings
|
||||
// Otherwise SAB doesn't know the refresh rate
|
||||
if(!self.useGlobalOptions()) {
|
||||
if (!self.useGlobalOptions()) {
|
||||
sabSpeedHistory = [];
|
||||
} else {
|
||||
// Update internally
|
||||
@@ -254,30 +252,31 @@ function ViewModel() {
|
||||
/***
|
||||
Speedlimit
|
||||
***/
|
||||
// Nothing = 100%
|
||||
response.queue.speedlimit = (response.queue.speedlimit == '') ? 100.0 : parseFloat(response.queue.speedlimit).toFixed(1);
|
||||
// Trick to only get decimal-point when needed
|
||||
response.queue.speedlimit = Math.round(response.queue.speedlimit*10)/10;
|
||||
self.speedLimitInt(response.queue.speedlimit)
|
||||
// Nothing or 0 means 100%
|
||||
if(response.queue.speedlimit == '' || response.queue.speedlimit == '0') {
|
||||
self.speedLimitInt(100)
|
||||
} else {
|
||||
self.speedLimitInt(parseInt(response.queue.speedlimit));
|
||||
}
|
||||
|
||||
// Only update from external source when user isn't doing input
|
||||
if(!$('.speedlimit-dropdown .btn-group .btn-group').is('.open')) {
|
||||
self.speedLimit(response.queue.speedlimit)
|
||||
if (!$('.speedlimit-dropdown .btn-group .btn-group').is('.open')) {
|
||||
self.speedLimit(self.speedLimitInt())
|
||||
}
|
||||
|
||||
/***
|
||||
Download timing and pausing
|
||||
***/
|
||||
var timeString = response.queue.timeleft;
|
||||
if(timeString === '') {
|
||||
if (timeString === '') {
|
||||
timeString = '0:00';
|
||||
} else {
|
||||
timeString = rewriteTime(response.queue.timeleft)
|
||||
}
|
||||
|
||||
// Paused main queue
|
||||
if(self.downloadsPaused()) {
|
||||
if(response.queue.pause_int == '0') {
|
||||
if (self.downloadsPaused()) {
|
||||
if (response.queue.pause_int == '0') {
|
||||
timeString = glitterTranslate.paused;
|
||||
} else {
|
||||
var pauseSplit = response.queue.pause_int.split(/:/);
|
||||
@@ -287,21 +286,21 @@ function ViewModel() {
|
||||
seconds -= minutes * 60;
|
||||
|
||||
// Add leading zeros
|
||||
if(minutes < 10) minutes = '0' + minutes;
|
||||
if(seconds < 10) seconds = '0' + seconds;
|
||||
if (minutes < 10) minutes = '0' + minutes;
|
||||
if (seconds < 10) seconds = '0' + seconds;
|
||||
|
||||
// Final formating
|
||||
timeString = glitterTranslate.paused + ' (' + rewriteTime(hours + ":" + minutes + ":" + seconds) + ')';
|
||||
}
|
||||
|
||||
// Add info about amount of download (if actually downloading)
|
||||
if(response.queue.noofslots > 0 && parseInt(self.queueDataLeft()) > 0) {
|
||||
if (response.queue.noofslots > 0 && parseInt(self.queueDataLeft()) > 0) {
|
||||
self.title(timeString + ' - ' + self.queueDataLeft() + ' ' + glitterTranslate.left + ' - SABnzbd')
|
||||
} else {
|
||||
// Set title with pause information
|
||||
self.title(timeString + ' - SABnzbd')
|
||||
}
|
||||
} else if(response.queue.noofslots > 0 && parseInt(self.queueDataLeft()) > 0) {
|
||||
} else if (response.queue.noofslots > 0 && parseInt(self.queueDataLeft()) > 0) {
|
||||
// Set title only if we are actually downloading something..
|
||||
self.title(self.speedText() + ' - ' + self.queueDataLeft() + ' ' + glitterTranslate.left + ' - SABnzbd')
|
||||
} else {
|
||||
@@ -318,7 +317,7 @@ function ViewModel() {
|
||||
|
||||
// Update history items
|
||||
self.updateHistory = function(response) {
|
||||
if(!response) return;
|
||||
if (!response) return;
|
||||
self.history.updateFromData(response.history);
|
||||
}
|
||||
|
||||
@@ -334,38 +333,46 @@ function ViewModel() {
|
||||
|
||||
// Do requests for full information
|
||||
// Catch the fail to display message
|
||||
var queueApi = callAPI({
|
||||
var api_call = {
|
||||
mode: "queue",
|
||||
search: self.queue.searchTerm(),
|
||||
start: self.queue.pagination.currentStart(),
|
||||
limit: parseInt(self.queue.paginationLimit())
|
||||
})
|
||||
.done(self.updateQueue)
|
||||
.fail(function(response) {
|
||||
// Catch the failure of authorization error
|
||||
if(response.status == 401) {
|
||||
// Stop refresh and reload
|
||||
clearInterval(self.interval)
|
||||
location.reload();
|
||||
}
|
||||
// Show screen
|
||||
self.isRestarting(1)
|
||||
}).always(self.setNextUpdate);
|
||||
}
|
||||
if (self.queue.searchTerm()) {
|
||||
parseSearchQuery(api_call, self.queue.searchTerm(), ["cat", "category", "priority"])
|
||||
}
|
||||
var queueApi = callAPI(api_call)
|
||||
.done(self.updateQueue)
|
||||
.fail(function(response) {
|
||||
// Catch the failure of authorization error
|
||||
if (response.status == 401) {
|
||||
// Stop refresh and reload
|
||||
clearInterval(self.interval)
|
||||
location.reload();
|
||||
}
|
||||
// Show screen
|
||||
self.isRestarting(1)
|
||||
}).always(self.setNextUpdate);
|
||||
|
||||
// Force full history update?
|
||||
if(forceFullHistory) {
|
||||
if (forceFullHistory) {
|
||||
self.history.lastUpdate = 0
|
||||
}
|
||||
|
||||
// History
|
||||
callAPI({
|
||||
// Build history request and parse search
|
||||
var history_call = {
|
||||
mode: "history",
|
||||
search: self.history.searchTerm(),
|
||||
failed_only: self.history.showFailed()*1,
|
||||
failed_only: self.history.showFailed() * 1,
|
||||
start: self.history.pagination.currentStart(),
|
||||
limit: parseInt(self.history.paginationLimit()),
|
||||
last_history_update: self.history.lastUpdate
|
||||
}).done(self.updateHistory);
|
||||
}
|
||||
if (self.history.searchTerm()) {
|
||||
parseSearchQuery(history_call, self.history.searchTerm(), ["cat", "category"])
|
||||
}
|
||||
|
||||
// History
|
||||
callAPI(history_call).done(self.updateHistory);
|
||||
|
||||
// We are now done with any loading
|
||||
// But we wait a few ms so Knockout has time to update
|
||||
@@ -378,6 +385,25 @@ function ViewModel() {
|
||||
return queueApi;
|
||||
};
|
||||
|
||||
function parseSearchQuery(api_request, search, keywords) {
|
||||
var parsed_query = search_query_parse(search, { keywords: keywords })
|
||||
api_request["search"] = parsed_query.text
|
||||
for (const keyword of keywords) {
|
||||
if (Array.isArray(parsed_query[keyword])) {
|
||||
api_request[keyword] = parsed_query[keyword].join(",")
|
||||
} else {
|
||||
api_request[keyword] = parsed_query[keyword]
|
||||
}
|
||||
// Special case for priority, dirty replace of string by numeric value
|
||||
if (keyword == "priority" && api_request["priority"]) {
|
||||
for (const prio_name in self.queue.priorityName) {
|
||||
api_request["priority"] = api_request["priority"].replace(prio_name, self.queue.priorityName[prio_name])
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set pause action on click of toggle
|
||||
self.pauseToggle = function() {
|
||||
callAPI({
|
||||
@@ -399,23 +425,23 @@ function ViewModel() {
|
||||
// Open modal
|
||||
self.openCustomPauseTime = function() {
|
||||
// Was it loaded already?
|
||||
if(!Date.i18n) {
|
||||
jQuery.getScript('./static/javascripts/date.min.js').then(function() {
|
||||
if (!Date.i18n) {
|
||||
jQuery.getScript('./static/javascripts/date.min.js').then(function() {
|
||||
// After loading we start again
|
||||
self.openCustomPauseTime()
|
||||
})
|
||||
return;
|
||||
})
|
||||
return;
|
||||
}
|
||||
// Show modal
|
||||
$('#modal_custom_pause').modal('show')
|
||||
|
||||
// Focus on the input field
|
||||
$('#modal_custom_pause').on('shown.bs.modal', function () {
|
||||
$('#modal_custom_pause').on('shown.bs.modal', function() {
|
||||
$('#customPauseInput').focus()
|
||||
})
|
||||
|
||||
// Reset on modal close
|
||||
$('#modal_custom_pause').on('hide.bs.modal', function () {
|
||||
$('#modal_custom_pause').on('hide.bs.modal', function() {
|
||||
self.pauseCustom('');
|
||||
})
|
||||
}
|
||||
@@ -423,13 +449,13 @@ function ViewModel() {
|
||||
// Update on changes
|
||||
self.pauseCustom.subscribe(function(newValue) {
|
||||
// Is it plain numbers?
|
||||
if(newValue.match(/^\s*\d+\s*$/)) {
|
||||
if (newValue.match(/^\s*\d+\s*$/)) {
|
||||
// Treat it as a number of minutes
|
||||
newValue += "minutes";
|
||||
}
|
||||
|
||||
// At least 3 charaters
|
||||
if(newValue.length < 3) {
|
||||
if (newValue.length < 3) {
|
||||
$('#customPauseOutput').text('').data('time', 0)
|
||||
$('#modal_custom_pause .btn-default').addClass('disabled')
|
||||
return;
|
||||
@@ -445,19 +471,19 @@ function ViewModel() {
|
||||
var pauseParsed = Date.parse(newValue);
|
||||
|
||||
// Did we get it?
|
||||
if(pauseParsed) {
|
||||
if (pauseParsed) {
|
||||
// Is it just now?
|
||||
if(pauseParsed <= Date.parse('now')) {
|
||||
if (pauseParsed <= Date.parse('now')) {
|
||||
// Try again with the '+' in front, the parser doesn't get 100min
|
||||
pauseParsed = Date.parse('+' + newValue);
|
||||
}
|
||||
|
||||
// Calculate difference in minutes and save
|
||||
var pauseDuration = Math.round((pauseParsed - Date.parse('now'))/1000/60);
|
||||
$('#customPauseOutput').html('<span class="glyphicon glyphicon-pause"></span> ' +glitterTranslate.pauseFor + ' ' + pauseDuration + ' ' + glitterTranslate.minutes)
|
||||
var pauseDuration = Math.round((pauseParsed - Date.parse('now')) / 1000 / 60);
|
||||
$('#customPauseOutput').html('<span class="glyphicon glyphicon-pause"></span> ' + glitterTranslate.pauseFor + ' ' + pauseDuration + ' ' + glitterTranslate.minutes)
|
||||
$('#customPauseOutput').data('time', pauseDuration)
|
||||
$('#modal_custom_pause .btn-default').removeClass('disabled')
|
||||
} else if(newValue) {
|
||||
} else if (newValue) {
|
||||
// No..
|
||||
$('#customPauseOutput').text(glitterTranslate.pausePromptFail)
|
||||
$('#modal_custom_pause .btn-default').addClass('disabled')
|
||||
@@ -470,7 +496,7 @@ function ViewModel() {
|
||||
var pauseDuration = $('#customPauseOutput').data('time');
|
||||
|
||||
// If in the future
|
||||
if(pauseDuration > 0) {
|
||||
if (pauseDuration > 0) {
|
||||
callAPI({
|
||||
mode: 'config',
|
||||
name: 'set_pause',
|
||||
@@ -487,7 +513,7 @@ function ViewModel() {
|
||||
// Update the warnings
|
||||
self.nrWarnings.subscribe(function(newValue) {
|
||||
// Really any change?
|
||||
if(newValue == self.allWarnings().length) return;
|
||||
if (newValue == self.allWarnings().length) return;
|
||||
|
||||
// Get all warnings
|
||||
callAPI({
|
||||
@@ -496,7 +522,7 @@ function ViewModel() {
|
||||
|
||||
// Reset it all
|
||||
self.allWarnings.removeAll();
|
||||
if(response) {
|
||||
if (response) {
|
||||
// Newest first
|
||||
response.warnings.reverse()
|
||||
|
||||
@@ -537,10 +563,10 @@ function ViewModel() {
|
||||
// Update on speed-limit change
|
||||
self.speedLimit.subscribe(function(newValue) {
|
||||
// Only on new load
|
||||
if(!self.speedLimitInt()) return;
|
||||
if (!self.speedLimitInt()) return;
|
||||
|
||||
// Update
|
||||
if(self.speedLimitInt() != newValue) {
|
||||
if (self.speedLimitInt() != newValue) {
|
||||
callAPI({
|
||||
mode: "config",
|
||||
name: "speedlimit",
|
||||
@@ -563,24 +589,18 @@ function ViewModel() {
|
||||
|
||||
// Shutdown options
|
||||
self.setOnQueueFinish = function(model, event) {
|
||||
// Ignore updates before the page is done
|
||||
if(!self.hasStatusInfo()) return;
|
||||
|
||||
// Something changes
|
||||
callAPI({
|
||||
mode: 'queue',
|
||||
name: 'change_complete_action',
|
||||
value: $(event.target).val()
|
||||
})
|
||||
|
||||
// Top stop blinking while the API is calling
|
||||
self.onQueueFinish($(event.target).val())
|
||||
}
|
||||
|
||||
// Use global settings or device-specific?
|
||||
self.useGlobalOptions.subscribe(function(newValue) {
|
||||
// Reload in case of enabling global options
|
||||
if(newValue) document.location = document.location;
|
||||
if (newValue) document.location = document.location;
|
||||
})
|
||||
|
||||
// Update refreshrate
|
||||
@@ -589,7 +609,7 @@ function ViewModel() {
|
||||
self.refresh();
|
||||
|
||||
// Save in config if global-settings
|
||||
if(self.useGlobalOptions()) {
|
||||
if (self.useGlobalOptions()) {
|
||||
callAPI({
|
||||
mode: "set_config",
|
||||
section: "misc",
|
||||
@@ -607,24 +627,24 @@ function ViewModel() {
|
||||
// Get filename
|
||||
var fileName = $(event.target).val().replace(/\\/g, '/').replace(/.*\//, '');
|
||||
// Set label
|
||||
if(fileName) $('.btn-file em').text(fileName)
|
||||
if (fileName) $('.btn-file em').text(fileName)
|
||||
}
|
||||
|
||||
// Add NZB form
|
||||
self.addNZB = function(form) {
|
||||
// Anything?
|
||||
if(!$(form.nzbFile)[0].files[0] && !$(form.nzbURL).val()) {
|
||||
if (!$(form.nzbFile)[0].files[0] && !$(form.nzbURL).val()) {
|
||||
$('.btn-file, input[name="nzbURL"]').attr('style', 'border-color: red !important')
|
||||
setTimeout(function() { $('.btn-file, input[name="nzbURL"]').css('border-color', '') }, 2000)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Upload file using the method we also use for drag-and-drop
|
||||
if($(form.nzbFile)[0].files[0]) {
|
||||
if ($(form.nzbFile)[0].files[0]) {
|
||||
self.addNZBFromFile($(form.nzbFile)[0].files);
|
||||
// Hide modal, upload will reset the form
|
||||
$("#modal-add-nzb").modal("hide");
|
||||
} else if($(form.nzbURL).val()) {
|
||||
} else if ($(form.nzbURL).val()) {
|
||||
// Or add URL
|
||||
var theCall = {
|
||||
mode: "addurl",
|
||||
@@ -637,8 +657,8 @@ function ViewModel() {
|
||||
}
|
||||
|
||||
// Optional, otherwise they get mis-labeled if left empty
|
||||
if($('#modal-add-nzb select[name="Category"]').val() != '*') theCall.cat = $('#modal-add-nzb select[name="Category"]').val()
|
||||
if($('#modal-add-nzb select[name="Processing"]').val()) theCall.pp = $('#modal-add-nzb select[name="Category"]').val()
|
||||
if ($('#modal-add-nzb select[name="Category"]').val() != '*') theCall.cat = $('#modal-add-nzb select[name="Category"]').val()
|
||||
if ($('#modal-add-nzb select[name="Processing"]').val()) theCall.pp = $('#modal-add-nzb select[name="Category"]').val()
|
||||
|
||||
// Add
|
||||
callAPI(theCall).then(function(r) {
|
||||
@@ -654,14 +674,14 @@ function ViewModel() {
|
||||
// From the upload or filedrop
|
||||
self.addNZBFromFile = function(files, fileindex) {
|
||||
// First file
|
||||
if(fileindex === undefined) {
|
||||
if (fileindex === undefined) {
|
||||
fileindex = 0
|
||||
}
|
||||
var file = files[fileindex]
|
||||
fileindex++
|
||||
|
||||
// Check if it's maybe a folder, we can't handle those
|
||||
if(!file.type && file.size % 4096 == 0) return;
|
||||
if (!file.type && file.size % 4096 == 0) return;
|
||||
|
||||
// Add notification
|
||||
showNotification('.main-notification-box-uploading', 0, fileindex)
|
||||
@@ -677,8 +697,8 @@ function ViewModel() {
|
||||
data.append("apikey", apiKey);
|
||||
|
||||
// Optional, otherwise they get mis-labeled if left empty
|
||||
if($('#modal-add-nzb select[name="Category"]').val() != '*') data.append("cat", $('#modal-add-nzb select[name="Category"]').val());
|
||||
if($('#modal-add-nzb select[name="Processing"]').val()) data.append("pp", $('#modal-add-nzb select[name="Processing"]').val());
|
||||
if ($('#modal-add-nzb select[name="Category"]').val() != '*') data.append("cat", $('#modal-add-nzb select[name="Category"]').val());
|
||||
if ($('#modal-add-nzb select[name="Processing"]').val()) data.append("pp", $('#modal-add-nzb select[name="Processing"]').val());
|
||||
|
||||
// Add this one
|
||||
$.ajax({
|
||||
@@ -690,7 +710,7 @@ function ViewModel() {
|
||||
data: data
|
||||
}).then(function(r) {
|
||||
// Are we done?
|
||||
if(fileindex < files.length) {
|
||||
if (fileindex < files.length) {
|
||||
// Do the next one
|
||||
self.addNZBFromFile(files, fileindex)
|
||||
} else {
|
||||
@@ -716,28 +736,29 @@ function ViewModel() {
|
||||
|
||||
// Make it spin if the user requested it otherwise we don't,
|
||||
// because browsers use a lot of CPU for the animation
|
||||
if(statusFullRefresh) {
|
||||
if (statusFullRefresh) {
|
||||
self.hasStatusInfo(false)
|
||||
}
|
||||
|
||||
// Show loading text for performance measures
|
||||
if(statusPerformance) {
|
||||
if (statusPerformance) {
|
||||
self.hasPerformanceInfo(false)
|
||||
}
|
||||
|
||||
// Load the custom status info, allowing for longer timeouts
|
||||
callAPI({
|
||||
mode: 'status',
|
||||
skip_dashboard: (!statusFullRefresh)*1,
|
||||
calculate_performance: statusPerformance*1,
|
||||
skip_dashboard: (!statusFullRefresh) * 1,
|
||||
calculate_performance: statusPerformance * 1,
|
||||
}, 30000).then(function(data) {
|
||||
// Update basic
|
||||
self.statusInfo.folders(data.status.folders)
|
||||
self.statusInfo.loadavg(data.status.loadavg)
|
||||
self.statusInfo.delayed_decoder(data.status.delayed_decoder)
|
||||
self.statusInfo.delayed_assembler(data.status.delayed_assembler)
|
||||
|
||||
// Update the full set if the data is available
|
||||
if("dnslookup" in data.status) {
|
||||
if ("dnslookup" in data.status) {
|
||||
self.statusInfo.pystone(data.status.pystone)
|
||||
self.statusInfo.downloaddir(data.status.downloaddir)
|
||||
self.statusInfo.downloaddirspeed(data.status.downloaddirspeed)
|
||||
@@ -752,7 +773,7 @@ function ViewModel() {
|
||||
}
|
||||
|
||||
// Update the servers
|
||||
if(self.statusInfo.servers().length != data.status.servers.length) {
|
||||
if (self.statusInfo.servers().length != data.status.servers.length) {
|
||||
// Empty them, in case of update
|
||||
self.statusInfo.servers([])
|
||||
|
||||
@@ -777,21 +798,21 @@ function ViewModel() {
|
||||
$.each(data.status.servers, function(index) {
|
||||
var activeServer = self.statusInfo.servers()[index];
|
||||
activeServer.servername(this.servername),
|
||||
activeServer.serveroptional(this.serveroptional),
|
||||
activeServer.serverpriority(this.serverpriority),
|
||||
activeServer.servertotalconn(this.servertotalconn),
|
||||
activeServer.serverssl(this.serverssl),
|
||||
activeServer.serversslinfo(this.serversslinfo),
|
||||
activeServer.serveractiveconn(this.serveractiveconn),
|
||||
activeServer.servererror(this.servererror),
|
||||
activeServer.serveractive(this.serveractive),
|
||||
activeServer.serverconnections(this.serverconnections),
|
||||
activeServer.serverbps(this.serverbps)
|
||||
activeServer.serveroptional(this.serveroptional),
|
||||
activeServer.serverpriority(this.serverpriority),
|
||||
activeServer.servertotalconn(this.servertotalconn),
|
||||
activeServer.serverssl(this.serverssl),
|
||||
activeServer.serversslinfo(this.serversslinfo),
|
||||
activeServer.serveractiveconn(this.serveractiveconn),
|
||||
activeServer.servererror(this.servererror),
|
||||
activeServer.serveractive(this.serveractive),
|
||||
activeServer.serverconnections(this.serverconnections),
|
||||
activeServer.serverbps(this.serverbps)
|
||||
})
|
||||
}
|
||||
|
||||
// Add tooltips to possible new items
|
||||
if(!isMobile) $('#modal-options [data-tooltip="true"]').tooltip({ trigger: 'hover', container: 'body' })
|
||||
if (!isMobile) $('#modal-options [data-tooltip="true"]').tooltip({ trigger: 'hover', container: 'body' })
|
||||
|
||||
// Stop it spin
|
||||
self.hasStatusInfo(true)
|
||||
@@ -804,7 +825,7 @@ function ViewModel() {
|
||||
var nzbSize = $(event.target).data('size')
|
||||
|
||||
// Maybe it was a click on the icon?
|
||||
if(nzbSize == undefined) {
|
||||
if (nzbSize == undefined) {
|
||||
nzbSize = $(event.target.parentElement).data('size')
|
||||
}
|
||||
|
||||
@@ -846,7 +867,7 @@ function ViewModel() {
|
||||
checkSize()
|
||||
|
||||
// Check if still visible
|
||||
if(!$('#options_connections').is(':visible') && connectionRefresh) {
|
||||
if (!$('#options_connections').is(':visible') && connectionRefresh) {
|
||||
// Stop refreshing
|
||||
clearInterval(connectionRefresh)
|
||||
return
|
||||
@@ -865,9 +886,9 @@ function ViewModel() {
|
||||
// Function that handles the actual sizing of connections tab
|
||||
function checkSize() {
|
||||
// Any connections?
|
||||
if(self.showActiveConnections() && $('#options_connections').is(':visible') && $('.table-server-connections').height() > 1) {
|
||||
if (self.showActiveConnections() && $('#options_connections').is(':visible') && $('.table-server-connections').height() > 1) {
|
||||
var mainWidth = $('.main-content').width()
|
||||
$('#modal-options .modal-dialog').width(mainWidth*0.85 > 650 ? mainWidth*0.85 : '')
|
||||
$('#modal-options .modal-dialog').width(mainWidth * 0.85 > 650 ? mainWidth * 0.85 : '')
|
||||
} else {
|
||||
// Small again
|
||||
$('#modal-options .modal-dialog').width('')
|
||||
@@ -875,7 +896,7 @@ function ViewModel() {
|
||||
}
|
||||
|
||||
// Make sure Connections get refreshed also after open->close->open
|
||||
$('#modal-options').on('show.bs.modal', function () {
|
||||
$('#modal-options').on('show.bs.modal', function() {
|
||||
// Trigger
|
||||
$('.nav-tabs a[href="#options_connections"]').trigger('shown.bs.tab')
|
||||
})
|
||||
@@ -886,7 +907,7 @@ function ViewModel() {
|
||||
$('#options-orphans [data-tooltip="true"]').tooltip('hide')
|
||||
|
||||
// Show notification on delete
|
||||
if($(htmlElement.currentTarget).data('action') == 'delete_orphan') {
|
||||
if ($(htmlElement.currentTarget).data('action') == 'delete_orphan') {
|
||||
showNotification('.main-notification-box-removing', 1000)
|
||||
} else {
|
||||
// Adding back to queue
|
||||
@@ -908,8 +929,8 @@ function ViewModel() {
|
||||
|
||||
// Orphaned folder deletion of all
|
||||
self.removeAllOrphaned = function() {
|
||||
if(!self.confirmDeleteHistory() || confirm(glitterTranslate.clearWarn)) {
|
||||
// Show notification
|
||||
if (!self.confirmDeleteHistory() || confirm(glitterTranslate.clearWarn)) {
|
||||
// Show notification
|
||||
showNotification('.main-notification-box-removing-multiple', 0, self.statusInfo.folders().length)
|
||||
// Delete them all
|
||||
callAPI({
|
||||
@@ -925,8 +946,8 @@ function ViewModel() {
|
||||
|
||||
// Orphaned folder adding of all
|
||||
self.addAllOrphaned = function() {
|
||||
if(!self.confirmDeleteHistory() || confirm(glitterTranslate.clearWarn)) {
|
||||
// Show notification
|
||||
if (!self.confirmDeleteHistory() || confirm(glitterTranslate.clearWarn)) {
|
||||
// Show notification
|
||||
showNotification('.main-notification-box-sendback')
|
||||
// Delete them all
|
||||
callAPI({
|
||||
@@ -956,7 +977,7 @@ function ViewModel() {
|
||||
})
|
||||
|
||||
// Change hash for page-reload
|
||||
$('.history-queue-swicher .nav-tabs a').on('shown.bs.tab', function (e) {
|
||||
$('.history-queue-swicher .nav-tabs a').on('shown.bs.tab', function(e) {
|
||||
window.location.hash = e.target.hash;
|
||||
})
|
||||
|
||||
@@ -965,7 +986,7 @@ function ViewModel() {
|
||||
**/
|
||||
// Shutdown
|
||||
self.shutdownSAB = function() {
|
||||
if(confirm(glitterTranslate.shutdown)) {
|
||||
if (confirm(glitterTranslate.shutdown)) {
|
||||
// Show notification and return true to follow the URL
|
||||
showNotification('.main-notification-box-shutdown')
|
||||
return true
|
||||
@@ -973,14 +994,14 @@ function ViewModel() {
|
||||
}
|
||||
// Restart
|
||||
self.restartSAB = function() {
|
||||
if(!confirm(glitterTranslate.restart)) return;
|
||||
if (!confirm(glitterTranslate.restart)) return;
|
||||
// Call restart function
|
||||
callAPI({ mode: "restart" })
|
||||
|
||||
// Set counter, we need at least 15 seconds
|
||||
self.isRestarting(Math.max(1, Math.floor(15 / self.refreshRate())));
|
||||
// Force refresh in case of very long refresh-times
|
||||
if(self.refreshRate() > 30) {
|
||||
if (self.refreshRate() > 30) {
|
||||
setTimeout(self.refresh, 30 * 1000)
|
||||
}
|
||||
}
|
||||
@@ -989,7 +1010,7 @@ function ViewModel() {
|
||||
// Event
|
||||
var theAction = $(event.target).data('mode');
|
||||
// Show notification if available
|
||||
if(['rss_now', 'watched_now'].indexOf(theAction) > -1) {
|
||||
if (['rss_now', 'watched_now'].indexOf(theAction) > -1) {
|
||||
showNotification('.main-notification-box-' + theAction, 2000)
|
||||
}
|
||||
// Send to the API
|
||||
@@ -997,7 +1018,7 @@ function ViewModel() {
|
||||
}
|
||||
// Repair queue
|
||||
self.repairQueue = function() {
|
||||
if(!confirm(glitterTranslate.repair)) return;
|
||||
if (!confirm(glitterTranslate.repair)) return;
|
||||
// Hide the modal and show the notifucation
|
||||
$("#modal-options").modal("hide");
|
||||
showNotification('.main-notification-box-queue-repair', 5000)
|
||||
@@ -1018,18 +1039,18 @@ function ViewModel() {
|
||||
Retrieve config information and do startup functions
|
||||
***/
|
||||
// Force compact mode as fast as possible
|
||||
if(localStorageGetItem('displayCompact') === 'true') {
|
||||
if (localStorageGetItem('displayCompact') === 'true') {
|
||||
// Add extra class
|
||||
$('body').addClass('container-compact')
|
||||
}
|
||||
|
||||
if(localStorageGetItem('displayFullWidth') === 'true') {
|
||||
if (localStorageGetItem('displayFullWidth') === 'true') {
|
||||
// Add extra class
|
||||
$('body').addClass('container-full-width')
|
||||
}
|
||||
|
||||
// Tabbed layout?
|
||||
if(localStorageGetItem('displayTabbed') === 'true') {
|
||||
if (localStorageGetItem('displayTabbed') === 'true') {
|
||||
$('body').addClass('container-tabbed')
|
||||
|
||||
var tab_from_hash = location.hash.replace(/^#/, '');
|
||||
@@ -1069,9 +1090,9 @@ function ViewModel() {
|
||||
mode: 'get_config'
|
||||
}).then(function(response) {
|
||||
// Do we use global, or local settings?
|
||||
if(self.useGlobalOptions()) {
|
||||
if (self.useGlobalOptions()) {
|
||||
// Set refreshrate (defaults to 1/s)
|
||||
if(!response.config.misc.refresh_rate) response.config.misc.refresh_rate = 1;
|
||||
if (!response.config.misc.refresh_rate) response.config.misc.refresh_rate = 1;
|
||||
self.refreshRate(response.config.misc.refresh_rate.toString());
|
||||
|
||||
// Set history and queue limit
|
||||
@@ -1079,10 +1100,10 @@ function ViewModel() {
|
||||
self.queue.paginationLimit(response.config.misc.queue_limit.toString())
|
||||
|
||||
// Import the rest of the settings
|
||||
if(response.config.misc.interface_settings) {
|
||||
if (response.config.misc.interface_settings) {
|
||||
var interfaceSettings = JSON.parse(response.config.misc.interface_settings);
|
||||
for (const setting of self.globalInterfaceSettings){
|
||||
if(setting in interfaceSettings) {
|
||||
for (const setting of self.globalInterfaceSettings) {
|
||||
if (setting in interfaceSettings) {
|
||||
self[setting](interfaceSettings[setting]);
|
||||
}
|
||||
}
|
||||
@@ -1094,14 +1115,37 @@ function ViewModel() {
|
||||
}
|
||||
|
||||
// Set bandwidth limit
|
||||
if(!response.config.misc.bandwidth_max) response.config.misc.bandwidth_max = false;
|
||||
if (!response.config.misc.bandwidth_max) response.config.misc.bandwidth_max = false;
|
||||
self.bandwithLimit(response.config.misc.bandwidth_max);
|
||||
|
||||
// Save servers (for reporting functionality)
|
||||
self.servers = response.config.servers;
|
||||
// Reformat and set categories
|
||||
self.queue.categoriesList($.map(response.config.categories, function(cat) {
|
||||
// Default?
|
||||
if(cat.name == '*') return { catValue: '*', catText: glitterTranslate.defaultText };
|
||||
return { catValue: cat.name, catText: cat.name };
|
||||
}))
|
||||
|
||||
// Get the scripts, if there are any
|
||||
if(response.config.misc.script_dir) {
|
||||
callAPI({
|
||||
mode: 'get_scripts'
|
||||
}).then(function(script_response) {
|
||||
// Reformat script-list
|
||||
self.queue.scriptsList($.map(script_response.scripts, function(script) {
|
||||
// None?
|
||||
if(script == 'None') return { scriptValue: 'None', scriptText: glitterTranslate.noneText };
|
||||
return { scriptValue: script, scriptText: script };
|
||||
}))
|
||||
self.queue.scriptsListLoaded(true)
|
||||
})
|
||||
} else {
|
||||
// We can already continue
|
||||
self.queue.scriptsListLoaded(true)
|
||||
}
|
||||
|
||||
|
||||
// Already set if we are using a proxy
|
||||
if(response.config.misc.socks5_proxy_url) self.statusInfo.active_socks5_proxy(true)
|
||||
if (response.config.misc.socks5_proxy_url) self.statusInfo.active_socks5_proxy(true)
|
||||
|
||||
// Set logging and only then subscribe to changes
|
||||
self.loglevel(response.config.logging.log_level);
|
||||
@@ -1115,28 +1159,28 @@ function ViewModel() {
|
||||
})
|
||||
|
||||
// Update message
|
||||
if(newRelease) {
|
||||
if (newRelease) {
|
||||
self.allMessages.push({
|
||||
index: 'UpdateMsg',
|
||||
type: glitterTranslate.status['INFO'],
|
||||
text: ('<a class="queue-update-sab" href="'+newReleaseUrl+'" target="_blank">'+glitterTranslate.updateAvailable+' '+newRelease+' <span class="glyphicon glyphicon-save"></span></a>'),
|
||||
text: ('<a class="queue-update-sab" href="' + newReleaseUrl + '" target="_blank">' + glitterTranslate.updateAvailable + ' ' + newRelease + ' <span class="glyphicon glyphicon-save"></span></a>'),
|
||||
css: 'info'
|
||||
});
|
||||
}
|
||||
|
||||
// Message about cache - Not for 5 days if user ignored it
|
||||
if(!response.config.misc.cache_limit && localStorageGetItem('CacheMsg')*1+(1000*3600*24*5) < Date.now()) {
|
||||
if (!response.config.misc.cache_limit && localStorageGetItem('CacheMsg') * 1 + (1000 * 3600 * 24 * 5) < Date.now()) {
|
||||
self.allMessages.push({
|
||||
index: 'CacheMsg',
|
||||
type: glitterTranslate.status['INFO'],
|
||||
text: ('<a href="./config/general/#cache_limit">'+glitterTranslate.useCache.replace(/<br \/>/g, " ")+' <span class="glyphicon glyphicon-cog"></span></a>'),
|
||||
text: ('<a href="./config/general/#cache_limit">' + glitterTranslate.useCache.replace(/<br \/>/g, " ") + ' <span class="glyphicon glyphicon-cog"></span></a>'),
|
||||
css: 'info',
|
||||
clear: function() { self.clearMessages('CacheMsg')}
|
||||
clear: function() { self.clearMessages('CacheMsg') }
|
||||
});
|
||||
}
|
||||
|
||||
// Message about tips and tricks, only once
|
||||
if(response.config.misc.notified_new_skin < 2) {
|
||||
if (response.config.misc.notified_new_skin < 2) {
|
||||
self.allMessages.push({
|
||||
index: 'TipsMsgV110',
|
||||
type: glitterTranslate.status['INFO'],
|
||||
@@ -1159,71 +1203,87 @@ function ViewModel() {
|
||||
})
|
||||
|
||||
// Orphaned folder check - Not for 5 days if user ignored it
|
||||
var orphanMsg = localStorageGetItem('OrphanedMsg')*1+(1000*3600*24*5) < Date.now();
|
||||
var orphanMsg = localStorageGetItem('OrphanedMsg') * 1 + (1000 * 3600 * 24 * 5) < Date.now();
|
||||
// Delay the check
|
||||
if(orphanMsg) {
|
||||
if (orphanMsg) {
|
||||
setTimeout(self.loadStatusInfo, 200);
|
||||
}
|
||||
|
||||
// On any status load we check Orphaned folders
|
||||
self.hasStatusInfo.subscribe(function(finishedLoading) {
|
||||
// Loaded or just starting?
|
||||
if(!finishedLoading) return;
|
||||
if (!finishedLoading) return;
|
||||
|
||||
// Orphaned folders? If user clicked away we check again in 5 days
|
||||
if(self.statusInfo.folders().length >= 3 && orphanMsg) {
|
||||
if (self.statusInfo.folders().length >= 3 && orphanMsg) {
|
||||
// Check if not already there
|
||||
if(!ko.utils.arrayFirst(self.allMessages(), function(item) { return item.index == 'OrphanedMsg' })) {
|
||||
if (!ko.utils.arrayFirst(self.allMessages(), function(item) { return item.index == 'OrphanedMsg' })) {
|
||||
self.allMessages.push({
|
||||
index: 'OrphanedMsg',
|
||||
type: glitterTranslate.status['INFO'],
|
||||
text: glitterTranslate.orphanedJobsMsg + ' <a href="#" onclick="showOrphans()"><span class="glyphicon glyphicon-wrench"></span></a>',
|
||||
css: 'info',
|
||||
clear: function() { self.clearMessages('OrphanedMsg')}
|
||||
clear: function() { self.clearMessages('OrphanedMsg') }
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// Remove any message, if it was there
|
||||
self.allMessages.remove(function(item) {
|
||||
return item.index == 'OrphanedMsg';
|
||||
return item.index == 'OrphanedMsg';
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// Message about localStorage not being enabled every 20 days
|
||||
if(!hasLocalStorage && localStorageGetItem('LocalStorageMsg')*1+(1000*3600*24*20) < Date.now()) {
|
||||
if (!hasLocalStorage && localStorageGetItem('LocalStorageMsg') * 1 + (1000 * 3600 * 24 * 20) < Date.now()) {
|
||||
self.allMessages.push({
|
||||
index: 'LocalStorageMsg',
|
||||
type: glitterTranslate.status['WARNING'].replace(':', ''),
|
||||
text: glitterTranslate.noLocalStorage,
|
||||
css: 'warning',
|
||||
clear: function() { self.clearMessages('LocalStorageMsg')}
|
||||
clear: function() { self.clearMessages('LocalStorageMsg') }
|
||||
});
|
||||
}
|
||||
|
||||
document.onkeydown = function(e) {
|
||||
if(self.keyboardShortcuts()) {
|
||||
// Ignore if the user used a combination
|
||||
if(e.altKey || e.metaKey || e.ctrlKey) return;
|
||||
|
||||
// Do not act if the user is typing something
|
||||
if($("input:focus, textarea:focus").length === 0) {
|
||||
if (e.code === 'KeyP') {
|
||||
self.pauseToggle();
|
||||
}
|
||||
if (e.code === 'KeyA') {
|
||||
$('#modal-add-nzb').modal('show');
|
||||
}
|
||||
if (e.code === 'KeyC') {
|
||||
window.location.href = './config/';
|
||||
}
|
||||
if (e.code === 'KeyS') {
|
||||
self.loadStatusInfo(true, true)
|
||||
$('#modal-options').modal('show');
|
||||
}
|
||||
if (self.keyboardShortcuts()) {
|
||||
$(document).bind('keydown', 'p', function(e) {
|
||||
self.pauseToggle();
|
||||
});
|
||||
$(document).bind('keydown', 'a', function(e) {
|
||||
// avoid modal clashes
|
||||
if (!$('.modal-dialog').is(':visible')) {
|
||||
$('#modal-add-nzb').modal('show');
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
$(document).bind('keydown', 'c', function(e) {
|
||||
window.location.href = './config/';
|
||||
});
|
||||
$(document).bind('keydown', 's', function(e) {
|
||||
// avoid modal clashes
|
||||
if (!$('.modal-dialog').is(':visible')) {
|
||||
$('#modal-options').modal('show');
|
||||
}
|
||||
});
|
||||
$(document).bind('keydown', 'shift+left', function(e) {
|
||||
$('#history-tab.active > ul.pagination li.active').prev().click();
|
||||
$('#queue-tab.active > ul.pagination li.active').prev().click();
|
||||
e.preventDefault();
|
||||
});
|
||||
$(document).bind('keydown', 'shift+right', function(e) {
|
||||
$('#history-tab.active > ul.pagination li.active').next().click();
|
||||
$('#queue-tab.active > ul.pagination li.active').next().click();
|
||||
e.preventDefault();
|
||||
});
|
||||
$(document).bind('keydown', 'shift+up', function(e) {
|
||||
$('#history-tab.active > ul.pagination li').first().click();
|
||||
$('#queue-tab.active > ul.pagination li').first().click();
|
||||
e.preventDefault();
|
||||
});
|
||||
$(document).bind('keydown', 'shift+down', function(e) {
|
||||
$('#history-tab.active > ul.pagination li').last().click();
|
||||
$('#queue-tab.active > ul.pagination li').last().click();
|
||||
e.preventDefault();
|
||||
});
|
||||
}
|
||||
|
||||
/***
|
||||
@@ -1241,7 +1301,7 @@ function ViewModel() {
|
||||
$('[data-timestamp]').each(function() {
|
||||
$(this).text(displayDateTime($(this).data('timestamp'), self.dateFormat(), 'X'))
|
||||
})
|
||||
}, 60*1000)
|
||||
}, 60 * 1000)
|
||||
|
||||
/***
|
||||
End of main functions, start of the fun!
|
||||
@@ -1253,5 +1313,5 @@ function ViewModel() {
|
||||
self.refresh()
|
||||
|
||||
// Activate tooltips
|
||||
if(!isMobile) $('[data-tooltip="true"]').tooltip({ trigger: 'hover', container: 'body' })
|
||||
if (!isMobile) $('[data-tooltip="true"]').tooltip({ trigger: 'hover', container: 'body' })
|
||||
}
|
||||
|
||||
@@ -6,8 +6,6 @@ function QueueListModel(parent) {
|
||||
var self = this;
|
||||
self.parent = parent;
|
||||
self.dragging = false;
|
||||
self.rawCatList = [];
|
||||
self.rawScriptList = [];
|
||||
|
||||
// Because SABNZB returns the name
|
||||
// But when you want to set Priority you need the number..
|
||||
@@ -39,7 +37,8 @@ function QueueListModel(parent) {
|
||||
self.multiEditItems = ko.observableArray([]);
|
||||
self.categoriesList = ko.observableArray([]);
|
||||
self.scriptsList = ko.observableArray([]);
|
||||
self.searchTerm = ko.observable('').extend({ rateLimit: { timeout: 200, method: "notifyWhenChangesStop" } });
|
||||
self.scriptsListLoaded = ko.observable(false);
|
||||
self.searchTerm = ko.observable('').extend({ rateLimit: { timeout: 400, method: "notifyWhenChangesStop" } });
|
||||
self.paginationLimit = ko.observable(20).extend({ persist: 'queuePaginationLimit' });
|
||||
self.pagination = new paginationModel(self);
|
||||
|
||||
@@ -66,31 +65,6 @@ function QueueListModel(parent) {
|
||||
return i.id;
|
||||
});
|
||||
|
||||
// Did the category-list change?
|
||||
// Otherwise KO will send updates to all <select> for every refresh()
|
||||
if(self.rawCatList != data.categories.toString()) {
|
||||
// Reformat categories
|
||||
self.categoriesList($.map(data.categories, function(cat) {
|
||||
// Default?
|
||||
if(cat == '*') return { catValue: '*', catText: glitterTranslate.defaultText };
|
||||
return { catValue: cat, catText: cat };
|
||||
}))
|
||||
// Update
|
||||
self.rawCatList = data.categories.toString();
|
||||
}
|
||||
|
||||
// Did the script-list change?
|
||||
if(self.rawScriptList != data.scripts.toString()) {
|
||||
// Reformat script-list
|
||||
self.scriptsList($.map(data.scripts, function(script) {
|
||||
// Default?
|
||||
if(script == 'None') return glitterTranslate.noneText;
|
||||
return script;
|
||||
}))
|
||||
// Update
|
||||
self.rawScriptList = data.scripts.toString();
|
||||
}
|
||||
|
||||
// Set limit
|
||||
self.totalItems(data.noofslots);
|
||||
|
||||
@@ -194,11 +168,13 @@ function QueueListModel(parent) {
|
||||
|
||||
// Searching in queue (rate-limited in decleration)
|
||||
self.searchTerm.subscribe(function() {
|
||||
// Refresh now
|
||||
self.parent.refresh();
|
||||
// Go back to page 1
|
||||
if(self.pagination.currentPage() != 1) {
|
||||
// This forces a refresh
|
||||
self.pagination.moveToPage(1);
|
||||
} else {
|
||||
// Refresh now
|
||||
self.parent.refresh();
|
||||
}
|
||||
})
|
||||
|
||||
@@ -208,7 +184,6 @@ function QueueListModel(parent) {
|
||||
if(event.type == 'mousedown' || (event.keyCode && event.keyCode == 27)) {
|
||||
self.isLoading(true)
|
||||
self.searchTerm('');
|
||||
self.parent.refresh()
|
||||
}
|
||||
// Was it click and the field is empty? Then we focus on the field
|
||||
if(event.type == 'mousedown' && self.searchTerm() == '') {
|
||||
@@ -226,6 +201,10 @@ function QueueListModel(parent) {
|
||||
// What action?
|
||||
var sort, dir;
|
||||
switch($(event.currentTarget).data('action')) {
|
||||
case 'sortRemainingAsc':
|
||||
sort = 'remaining';
|
||||
dir = 'asc';
|
||||
break;
|
||||
case 'sortAgeAsc':
|
||||
sort = 'avg_age';
|
||||
dir = 'desc';
|
||||
@@ -693,8 +672,6 @@ function QueueModel(parent, data) {
|
||||
})
|
||||
}
|
||||
self.changeScript = function(item) {
|
||||
// Not on empty handlers
|
||||
if(!item.script() || parent.scriptsList().length <= 1) return;
|
||||
callAPI({
|
||||
mode: 'change_script',
|
||||
value: item.id,
|
||||
|
||||
12
interfaces/Glitter/templates/static/javascripts/jquery.hotkeys.min.js
vendored
Normal file
12
interfaces/Glitter/templates/static/javascripts/jquery.hotkeys.min.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
* jQuery Hotkeys Plugin
|
||||
* Copyright 2010, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
*
|
||||
* Based upon the plugin by Tzury Bar Yochay:
|
||||
* https://github.com/tzuryby/jquery.hotkeys
|
||||
*
|
||||
* Original idea by:
|
||||
* Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
|
||||
*/
|
||||
!function(c){function e(e){var o,f;"string"==typeof e.data&&(e.data={keys:e.data}),e.data&&e.data.keys&&"string"==typeof e.data.keys&&(o=e.handler,f=e.data.keys.toLowerCase().split(" "),e.handler=function(a){if(this===a.target||!(/textarea|select/i.test(a.target.nodeName)||c.hotkeys.options.filterTextInputs&&-1<c.inArray(a.target.type,c.hotkeys.textAcceptingInputTypes))){var s="keypress"!==a.type&&c.hotkeys.specialKeys[a.which],e=String.fromCharCode(a.which).toLowerCase(),r="",t={};c.each(["alt","ctrl","shift"],function(e,t){a[t+"Key"]&&s!==t&&(r+=t+"+")}),a.metaKey&&!a.ctrlKey&&"meta"!==s&&(r+="meta+"),a.metaKey&&"meta"!==s&&-1<r.indexOf("alt+ctrl+shift+")&&(r=r.replace("alt+ctrl+shift+","hyper+")),s?t[r+s]=!0:(t[r+e]=!0,t[r+c.hotkeys.shiftNums[e]]=!0,"shift+"===r&&(t[c.hotkeys.shiftNums[e]]=!0));for(var i=0,n=f.length;i<n;i++)if(t[f[i]])return o.apply(this,arguments)}})}c.hotkeys={version:"0.8",specialKeys:{8:"backspace",9:"tab",10:"return",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",59:";",61:"=",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},shiftNums:{"`":"~",1:"!",2:"@",3:"#",4:"$",5:"%",6:"^",7:"&",8:"*",9:"(",0:")","-":"_","=":"+",";":": ","'":'"',",":"<",".":">","/":"?","\\":"|"},textAcceptingInputTypes:["text","password","number","email","url","range","date","month","week","time","datetime","datetime-local","search","color","tel"],options:{filterTextInputs:!0}},c.each(["keydown","keyup","keypress"],function(){c.event.special[this]={add:e}})}(jQuery||this.jQuery||window.jQuery);
|
||||
@@ -0,0 +1,307 @@
|
||||
/*!
|
||||
* search-search-query-parser.js
|
||||
* Copyright(c) 2014-2019
|
||||
* MIT Licensed
|
||||
*
|
||||
* Modified for SABnzbd use!
|
||||
* Adapted to use without NPM.
|
||||
*/
|
||||
|
||||
function search_query_parse(string, options) {
|
||||
// Set a default options object when none is provided
|
||||
if (!options) {
|
||||
options = {offsets: true};
|
||||
} else {
|
||||
// If options offsets was't passed, set it to true
|
||||
options.offsets = (typeof options.offsets === 'undefined' ? true : options.offsets)
|
||||
}
|
||||
|
||||
if (!string) {
|
||||
string = '';
|
||||
}
|
||||
|
||||
// When no keywords or ranges set, treat as a simple string
|
||||
else if (!options.keywords && !options.ranges && !options.tokenize) {
|
||||
return string;
|
||||
}
|
||||
// Otherwise parse the advanced query syntax
|
||||
else {
|
||||
// Our object to store the query object
|
||||
var query = {text: []};
|
||||
// When offsets is true, create their array
|
||||
if (options.offsets) {
|
||||
query.offsets = [];
|
||||
}
|
||||
var exclusion = {};
|
||||
var terms = [];
|
||||
// Get a list of search terms respecting single and double quotes
|
||||
var regex = /(\S+:'(?:[^'\\]|\\.)*')|(\S+:"(?:[^"\\]|\\.)*")|(-?"(?:[^"\\]|\\.)*")|(-?'(?:[^'\\]|\\.)*')|\S+|\S+:\S+/g;
|
||||
var match;
|
||||
while ((match = regex.exec(string)) !== null) {
|
||||
var term = match[0];
|
||||
var sepIndex = term.indexOf(':');
|
||||
if (sepIndex !== -1) {
|
||||
var split = term.split(':'),
|
||||
key = term.slice(0, sepIndex),
|
||||
val = term.slice(sepIndex + 1);
|
||||
// Strip surrounding quotes
|
||||
val = val.replace(/^\"|\"$|^\'|\'$/g, '');
|
||||
// Strip backslashes respecting escapes
|
||||
val = (val + '').replace(/\\(.?)/g, function (s, n1) {
|
||||
switch (n1) {
|
||||
case '\\':
|
||||
return '\\';
|
||||
case '0':
|
||||
return '\u0000';
|
||||
case '':
|
||||
return '';
|
||||
default:
|
||||
return n1;
|
||||
}
|
||||
});
|
||||
terms.push({
|
||||
keyword: key,
|
||||
value: val,
|
||||
offsetStart: match.index,
|
||||
offsetEnd: match.index + term.length
|
||||
});
|
||||
} else {
|
||||
var isExcludedTerm = false;
|
||||
if (term[0] === '-') {
|
||||
isExcludedTerm = true;
|
||||
term = term.slice(1);
|
||||
}
|
||||
|
||||
// Strip surrounding quotes
|
||||
term = term.replace(/^\"|\"$|^\'|\'$/g, '');
|
||||
// Strip backslashes respecting escapes
|
||||
term = (term + '').replace(/\\(.?)/g, function (s, n1) {
|
||||
switch (n1) {
|
||||
case '\\':
|
||||
return '\\';
|
||||
case '0':
|
||||
return '\u0000';
|
||||
case '':
|
||||
return '';
|
||||
default:
|
||||
return n1;
|
||||
}
|
||||
});
|
||||
|
||||
if (isExcludedTerm) {
|
||||
if (exclusion['text']) {
|
||||
if (exclusion['text'] instanceof Array) {
|
||||
exclusion['text'].push(term);
|
||||
} else {
|
||||
exclusion['text'] = [exclusion['text']];
|
||||
exclusion['text'].push(term);
|
||||
}
|
||||
} else {
|
||||
// First time seeing an excluded text term
|
||||
exclusion['text'] = term;
|
||||
}
|
||||
} else {
|
||||
terms.push({
|
||||
text: term,
|
||||
offsetStart: match.index,
|
||||
offsetEnd: match.index + term.length
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
// Reverse to ensure proper order when pop()'ing.
|
||||
terms.reverse();
|
||||
// For each search term
|
||||
var term;
|
||||
while (term = terms.pop()) {
|
||||
// When just a simple term
|
||||
if (term.text) {
|
||||
// We add it as pure text
|
||||
query.text.push(term.text);
|
||||
// When offsets is true, push a new offset
|
||||
if (options.offsets) {
|
||||
query.offsets.push(term);
|
||||
}
|
||||
}
|
||||
// We got an advanced search syntax
|
||||
else {
|
||||
var key = term.keyword;
|
||||
// Check if the key is a registered keyword
|
||||
options.keywords = options.keywords || [];
|
||||
var isKeyword = false;
|
||||
var isExclusion = false;
|
||||
if (!/^-/.test(key)) {
|
||||
isKeyword = !(-1 === options.keywords.indexOf(key));
|
||||
} else if (key[0] === '-') {
|
||||
var _key = key.slice(1);
|
||||
isKeyword = !(-1 === options.keywords.indexOf(_key))
|
||||
if (isKeyword) {
|
||||
key = _key;
|
||||
isExclusion = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the key is a registered range
|
||||
options.ranges = options.ranges || [];
|
||||
var isRange = !(-1 === options.ranges.indexOf(key));
|
||||
// When the key matches a keyword
|
||||
if (isKeyword) {
|
||||
// When offsets is true, push a new offset
|
||||
if (options.offsets) {
|
||||
query.offsets.push({
|
||||
keyword: key,
|
||||
value: term.value,
|
||||
offsetStart: isExclusion ? term.offsetStart + 1 : term.offsetStart,
|
||||
offsetEnd: term.offsetEnd
|
||||
});
|
||||
}
|
||||
|
||||
var value = term.value;
|
||||
// When value is a thing
|
||||
if (value.length) {
|
||||
// Get an array of values when several are there
|
||||
var values = value.split(',');
|
||||
if (isExclusion) {
|
||||
if (exclusion[key]) {
|
||||
// ...many times...
|
||||
if (exclusion[key] instanceof Array) {
|
||||
// ...and got several values this time...
|
||||
if (values.length > 1) {
|
||||
// ... concatenate both arrays.
|
||||
exclusion[key] = exclusion[key].concat(values);
|
||||
} else {
|
||||
// ... append the current single value.
|
||||
exclusion[key].push(value);
|
||||
}
|
||||
}
|
||||
// We saw that keyword only once before
|
||||
else {
|
||||
// Put both the current value and the new
|
||||
// value in an array
|
||||
exclusion[key] = [exclusion[key]];
|
||||
exclusion[key].push(value);
|
||||
}
|
||||
}
|
||||
// First time we see that keyword
|
||||
else {
|
||||
// ...and got several values this time...
|
||||
if (values.length > 1) {
|
||||
// ...add all values seen.
|
||||
exclusion[key] = values;
|
||||
}
|
||||
// Got only a single value this time
|
||||
else {
|
||||
// Record its value as a string
|
||||
if (options.alwaysArray) {
|
||||
// ...but we always return an array if option alwaysArray is true
|
||||
exclusion[key] = [value];
|
||||
} else {
|
||||
// Record its value as a string
|
||||
exclusion[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// If we already have seen that keyword...
|
||||
if (query[key]) {
|
||||
// ...many times...
|
||||
if (query[key] instanceof Array) {
|
||||
// ...and got several values this time...
|
||||
if (values.length > 1) {
|
||||
// ... concatenate both arrays.
|
||||
query[key] = query[key].concat(values);
|
||||
} else {
|
||||
// ... append the current single value.
|
||||
query[key].push(value);
|
||||
}
|
||||
}
|
||||
// We saw that keyword only once before
|
||||
else {
|
||||
// Put both the current value and the new
|
||||
// value in an array
|
||||
query[key] = [query[key]];
|
||||
query[key].push(value);
|
||||
}
|
||||
}
|
||||
// First time we see that keyword
|
||||
else {
|
||||
// ...and got several values this time...
|
||||
if (values.length > 1) {
|
||||
// ...add all values seen.
|
||||
query[key] = values;
|
||||
}
|
||||
// Got only a single value this time
|
||||
else {
|
||||
if (options.alwaysArray) {
|
||||
// ...but we always return an array if option alwaysArray is true
|
||||
query[key] = [value];
|
||||
} else {
|
||||
// Record its value as a string
|
||||
query[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// The key allows a range
|
||||
else if (isRange) {
|
||||
// When offsets is true, push a new offset
|
||||
if (options.offsets) {
|
||||
query.offsets.push(term);
|
||||
}
|
||||
|
||||
var value = term.value;
|
||||
// Range are separated with a dash
|
||||
var rangeValues = value.split('-');
|
||||
// When both end of the range are specified
|
||||
// keyword:XXXX-YYYY
|
||||
query[key] = {};
|
||||
if (2 === rangeValues.length) {
|
||||
query[key].from = rangeValues[0];
|
||||
query[key].to = rangeValues[1];
|
||||
}
|
||||
// When pairs of ranges are specified
|
||||
// keyword:XXXX-YYYY,AAAA-BBBB
|
||||
else if (!rangeValues.length % 2) {
|
||||
}
|
||||
// When only getting a single value,
|
||||
// or an odd number of values
|
||||
else {
|
||||
query[key].from = value;
|
||||
}
|
||||
} else {
|
||||
// We add it as pure text
|
||||
var text = term.keyword + ':' + term.value;
|
||||
query.text.push(text);
|
||||
|
||||
// When offsets is true, push a new offset
|
||||
if (options.offsets) {
|
||||
query.offsets.push({
|
||||
text: text,
|
||||
offsetStart: term.offsetStart,
|
||||
offsetEnd: term.offsetEnd
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Concatenate all text terms if any
|
||||
if (query.text.length) {
|
||||
if (!options.tokenize) {
|
||||
query.text = query.text.join(' ').trim();
|
||||
}
|
||||
}
|
||||
// Just remove the attribute text when it's empty
|
||||
else {
|
||||
delete query.text;
|
||||
}
|
||||
|
||||
// Return forged query object
|
||||
query.exclude = exclusion;
|
||||
return query;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Binary file not shown.
BIN
osx/unrar/unrar
BIN
osx/unrar/unrar
Binary file not shown.
@@ -5,7 +5,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: team@sabnzbd.org\n"
|
||||
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Language-Team: Czech (https://www.transifex.com/sabnzbd/teams/111101/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Danish (https://www.transifex.com/sabnzbd/teams/111101/da/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: German (https://www.transifex.com/sabnzbd/teams/111101/de/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Spanish (https://www.transifex.com/sabnzbd/teams/111101/es/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Finnish (https://www.transifex.com/sabnzbd/teams/111101/fi/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: French (https://www.transifex.com/sabnzbd/teams/111101/fr/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: ION, 2020\n"
|
||||
"Language-Team: Hebrew (https://www.transifex.com/sabnzbd/teams/111101/he/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Norwegian Bokmål (https://www.transifex.com/sabnzbd/teams/111101/nb/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Dutch (https://www.transifex.com/sabnzbd/teams/111101/nl/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Polish (https://www.transifex.com/sabnzbd/teams/111101/pl/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Romanian (https://www.transifex.com/sabnzbd/teams/111101/ro/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Russian (https://www.transifex.com/sabnzbd/teams/111101/ru/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Serbian (https://www.transifex.com/sabnzbd/teams/111101/sr/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Swedish (https://www.transifex.com/sabnzbd/teams/111101/sv/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Chinese (China) (https://www.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: team@sabnzbd.org\n"
|
||||
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
|
||||
@@ -124,11 +124,6 @@ msgstr ""
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr ""
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "We are planning to remove the '%s' setting, which you have changed from the default value. Could you let us know why you made this change at: https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -264,6 +259,10 @@ msgstr ""
|
||||
msgid "Server address required"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -603,10 +602,6 @@ msgstr ""
|
||||
msgid "API Key incorrect, Use the api key from Config->General in your 3rd party program:"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid "Authentication missing, please enter username/password from Config->General into your 3rd party program:"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr ""
|
||||
@@ -1139,27 +1134,27 @@ msgstr ""
|
||||
msgid "Error importing %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr ""
|
||||
|
||||
@@ -2062,10 +2057,6 @@ msgstr ""
|
||||
msgid "Download Dir"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr ""
|
||||
@@ -2358,6 +2349,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2602,12 +2597,13 @@ msgstr ""
|
||||
msgid "Cache articles in memory to reduce disk access.<br /><i>In bytes, optionally follow with K,M,G. For example: \"64M\" or \"128M\"</i>"
|
||||
msgstr ""
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid "Create a backup of the configuration file and databases in the Backup Folder.<br>If the Backup Folder is not set, the backup will be created in the Completed Download Folder.<br>Recurring backups can be configured on the Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -2840,6 +2836,14 @@ msgstr ""
|
||||
msgid "Location for queue admin and history database.<br /><i>Can only be changed when queue is empty.</i>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Location where the backups of the configuration file and databases are stored.<br />If left empty, the backup will be created in the Completed Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3004,14 +3008,6 @@ msgstr ""
|
||||
msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "When sorting, use tags from indexer for title, season, episode, etc. Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr ""
|
||||
@@ -3060,6 +3056,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr ""
|
||||
@@ -3089,6 +3089,14 @@ msgstr ""
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr ""
|
||||
@@ -4193,14 +4201,6 @@ msgstr ""
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr ""
|
||||
@@ -4285,6 +4285,10 @@ msgstr ""
|
||||
msgid "All usernames, passwords and API-keys are automatically removed from the log and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr ""
|
||||
@@ -4490,10 +4494,6 @@ msgstr ""
|
||||
msgid "Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr ""
|
||||
|
||||
100
po/main/cs.po
100
po/main/cs.po
@@ -8,7 +8,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Czech (https://www.transifex.com/sabnzbd/teams/111101/cs/)\n"
|
||||
@@ -142,14 +142,6 @@ msgstr "Vypnutí SABnzbd dokončeno"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Zachycen signál %s, ukládám a ukončuji..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -293,6 +285,10 @@ msgstr "%s není validní emailová adresa"
|
||||
msgid "Server address required"
|
||||
msgstr "Adresa serveru je vyžadována"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr "%s neni validní skript"
|
||||
@@ -651,14 +647,6 @@ msgstr ""
|
||||
"Nesprávný API klíč, použijte api klíč z Nastavení->Obecné ve vašem programu "
|
||||
"třetí strany:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Chybějící přihlašovací údaje, prosím zadejte jméno/heslo z Nastavení->Obecné"
|
||||
" do vašeho programu třetí strany:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Přihlášené selhalo, zkontrolujte jméno a heslo."
|
||||
@@ -1211,27 +1199,27 @@ msgstr "Zrušeno, nelze dokončit"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Chyba při importu %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUPLIKÁT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "ŠIFROVANÉ"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "PŘÍLIŠ VELKÝ"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "NEKOMPLETNÍ"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "NECHTĚNÝ"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "ČEKÁNÍ %s s"
|
||||
|
||||
@@ -2142,10 +2130,6 @@ msgstr "Vyhledávání"
|
||||
msgid "Download Dir"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr ""
|
||||
@@ -2440,6 +2424,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2711,12 +2699,17 @@ msgid ""
|
||||
" follow with K,M,G. For example: \"64M\" or \"128M\"</i>"
|
||||
msgstr ""
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -2974,6 +2967,17 @@ msgid ""
|
||||
"when queue is empty.</i>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3156,16 +3160,6 @@ msgstr ""
|
||||
msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr ""
|
||||
@@ -3216,6 +3210,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr ""
|
||||
@@ -3247,6 +3245,14 @@ msgstr ""
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr ""
|
||||
@@ -4385,14 +4391,6 @@ msgstr ""
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr ""
|
||||
@@ -4481,6 +4479,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr ""
|
||||
@@ -4689,10 +4691,6 @@ msgid ""
|
||||
"Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr ""
|
||||
|
||||
100
po/main/da.po
100
po/main/da.po
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Danish (https://www.transifex.com/sabnzbd/teams/111101/da/)\n"
|
||||
@@ -142,14 +142,6 @@ msgstr "SABnzbd lukning udført"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Signal %s modtaget, gemmer og lukker..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -293,6 +285,10 @@ msgstr "%s er ikke en godkendt e-mail adresse"
|
||||
msgid "Server address required"
|
||||
msgstr "Kræver serveradresse"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ugyldig server adresse."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -659,14 +655,6 @@ msgstr ""
|
||||
"Forkert API-nøgle, anvend api-nøglen fra Konfiguration->Generelt i dit "
|
||||
"tredjepartsprogram:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Brugeroplysninger mangler, indtast brugernavn/adgangskode fra "
|
||||
"Konfiguration->Generelt i dit tredjepartsprogram:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Godkendelse mislykkedes, kontrollere brugernavn/adgangskode."
|
||||
@@ -1214,27 +1202,27 @@ msgstr "Afbrudt, kan ikke afsluttes"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Det lykkedes ikke at importere %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUPLIKERE"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "KRYPTEREDE"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "FOR STOR"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "UFULDSTÆNDIG"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "UØNSKET"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "VENT %s sekunder"
|
||||
|
||||
@@ -2173,10 +2161,6 @@ msgstr "Søg"
|
||||
msgid "Download Dir"
|
||||
msgstr "Download mappe"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Sysload"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Er du sikker på du vil lukke SABnzbd?"
|
||||
@@ -2471,6 +2455,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2757,12 +2745,17 @@ msgstr ""
|
||||
"Cache artikler i hukommelsen for at reducere diskadgang.<br /><i>I bytes, "
|
||||
"efterfulgt af K,M,G. For eksempel: \"64M\" eller \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3039,6 +3032,17 @@ msgstr ""
|
||||
"Placering for kø administrativ og historik database.<br /><i>Kan kun ændres,"
|
||||
" når køen er tom.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr "<i>Data vil <b>ikke</b> blive flyttet. Kræver SABnzbd genstartet!</i>"
|
||||
@@ -3233,16 +3237,6 @@ msgstr "Ved fejl, prøv alternativ NZB"
|
||||
msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr "Nogle servere levere en alternativ NZB når et download mislykkes."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr "Brug mærker fra indexer"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Aktiver mappe omdøbning"
|
||||
@@ -3295,6 +3289,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr "Propagation delay"
|
||||
@@ -3328,6 +3326,14 @@ msgstr "Erstat mellemrum i mappenavn"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Erstat mellemrum med understreg i mappenavn."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Erstat punktummer i mappenavn"
|
||||
@@ -4490,14 +4496,6 @@ msgstr "Angiv et valgfrit filnavn"
|
||||
msgid "Submit"
|
||||
msgstr "Tilføj"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Tilføjet. Mange tak!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Intet er valgt!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Fjern alle valgte filer"
|
||||
@@ -4588,6 +4586,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortere efter alder <small>Ældst→Nyeste</small>"
|
||||
@@ -4804,10 +4806,6 @@ msgstr ""
|
||||
"Ukendt SSL protokol: Prøv at deaktivere SSL eller forbinder på en anden "
|
||||
"port."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ugyldig server adresse."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Server afslut under login-sekvens."
|
||||
|
||||
233
po/main/de.po
233
po/main/de.po
@@ -1,7 +1,7 @@
|
||||
# SABnzbd Translation Template file MAIN
|
||||
# Copyright 2007-2022 The SABnzbd-Team
|
||||
# team@sabnzbd.org
|
||||
#
|
||||
#
|
||||
# Translators:
|
||||
# C E <githubce@eiselt.ch>, 2020
|
||||
# Nikolai Bohl <n.kay01@gmail.com>, 2020
|
||||
@@ -12,10 +12,10 @@
|
||||
# Simon W., 2021
|
||||
# Nils Briggen, 2022
|
||||
# Safihre <safihre@sabnzbd.org>, 2022
|
||||
#
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: German (https://www.transifex.com/sabnzbd/teams/111101/de/)\n"
|
||||
@@ -157,14 +157,6 @@ msgstr "SABnzbd wurde beendet"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Signal %s erkannt. Wird gespeichert und beendet …"
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -173,7 +165,7 @@ msgstr "Schwerer Fehler beim Speichern des Zustands"
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Restarting because of crashed postprocessor"
|
||||
msgstr "Neustart aufgrund eines abgestürzten Postprocessors"
|
||||
msgstr "Neustart aufgrund eines abgestürzten Nachbearbeitungsprozesses"
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
@@ -183,7 +175,7 @@ msgstr "Neustart aufgrund eines abgestürzten Downloaders"
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Restarting because of crashed decoder"
|
||||
msgstr "Neustart aufgrund eines abgestürzten Dekoders"
|
||||
msgstr "Neustart aufgrund eines abgestürzten Decoders"
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
@@ -311,6 +303,10 @@ msgstr "%s ist keine gültige E-Mail-Adresse"
|
||||
msgid "Server address required"
|
||||
msgstr "Server-Adresse wird benötigt"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ungültige Server-Adresse."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr "%s ist kein gültiges Script"
|
||||
@@ -400,14 +396,15 @@ msgstr "Unbekannter Fehler %s beim Dekodieren"
|
||||
#: sabnzbd/deobfuscate_filenames.py
|
||||
msgid "Deobfuscate skipped due to DVD/Bluray directories"
|
||||
msgstr ""
|
||||
"Entschleiern wird aufgrund von DVD/Blu-ray-Verzeichnissen übersprungen"
|
||||
|
||||
#: sabnzbd/deobfuscate_filenames.py
|
||||
msgid "Deobfuscate corrected the extension of %d file(s)"
|
||||
msgstr ""
|
||||
msgstr "Entschleiern korrigierte die Erweiterung von %d Datei(en)"
|
||||
|
||||
#: sabnzbd/deobfuscate_filenames.py
|
||||
msgid "Deobfuscate renamed %d file(s)"
|
||||
msgstr ""
|
||||
msgstr "Entschleiern hat %dDatei(en) umbenannt"
|
||||
|
||||
#: sabnzbd/directunpacker.py, sabnzbd/skintext.py
|
||||
msgid "Direct Unpack"
|
||||
@@ -475,7 +472,7 @@ msgstr "Server %s wird für %s Minuten ignoriert"
|
||||
#. Warning message
|
||||
#: sabnzbd/downloader.py
|
||||
msgid "There are no active servers!"
|
||||
msgstr ""
|
||||
msgstr "Es gibt keine aktiven Server!"
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/downloader.py
|
||||
@@ -519,7 +516,7 @@ msgstr "Server %s läuft in %s Tag(en) ab"
|
||||
#. Warning message
|
||||
#: sabnzbd/downloader.py
|
||||
msgid "Server %s has used the specified quota"
|
||||
msgstr "Server %s hat die angegebene Quote verbraucht"
|
||||
msgstr "Server %s hat das angegebene Kontingent verbraucht"
|
||||
|
||||
#: sabnzbd/emailer.py
|
||||
msgid "Failed to connect to mail server"
|
||||
@@ -650,11 +647,13 @@ msgid ""
|
||||
"%s is not writable with special character filenames. This can cause "
|
||||
"problems."
|
||||
msgstr ""
|
||||
"Dateinamen mit Umlaute können nicht in %s gespeichert werden. Dies kann zu "
|
||||
"Problemen führen."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/filesystem.py
|
||||
msgid "%s is not writable at all. This blocks downloads."
|
||||
msgstr ""
|
||||
msgstr "%s ist nicht beschreibbar. Downloads sind dadurch blockiert."
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid "Refused connection from:"
|
||||
@@ -689,14 +688,6 @@ msgstr ""
|
||||
"API-Schlüssel ungültig. Bitte API-Schlüssel aus Einstellungen->Allgemein in "
|
||||
"die externe Anwendung eingeben:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Authentifizierung fehlt. Bitte Benutzernamen und Passwort aus "
|
||||
"Einstellungen->Allgemein in die externe Anwendung eingeben:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr ""
|
||||
@@ -717,7 +708,7 @@ msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid "Invalid backup archive"
|
||||
msgstr ""
|
||||
msgstr "Invalides Backup Archiv"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address."
|
||||
@@ -1143,12 +1134,12 @@ msgstr "Senden von macOS Benachrichtigung fehlgeschlagen"
|
||||
#. Warning message
|
||||
#: sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Konnte Prowl-Nachricht nicht versenden"
|
||||
msgstr "Prowl-Nachricht konnte nicht versendet werden"
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/notifier.py
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Fehlerhafte Antwort von Pushbullet (%s): %s"
|
||||
msgstr "Fehlerhafte Antwort von Pushover (%s): %s"
|
||||
|
||||
#. Error message - Warning message
|
||||
#: sabnzbd/notifier.py
|
||||
@@ -1163,7 +1154,7 @@ msgstr "Fehlerhafte Antwort von Pushbullet (%s): %s"
|
||||
#. Warning message
|
||||
#: sabnzbd/notifier.py
|
||||
msgid "Failed to send pushbullet message"
|
||||
msgstr "Konnte Pushbullet-Nachricht nicht versenden"
|
||||
msgstr "Pushbullet-Nachricht konnte nicht versendet werden"
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/notifier.py
|
||||
@@ -1215,7 +1206,7 @@ msgstr "NZB zur Warteschlange hinzugefügt"
|
||||
#. Warning message
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "Invalid NZB file %s, skipping (error: %s)"
|
||||
msgstr "Ungültige NZB-Datei %s wird übersprungen: %s "
|
||||
msgstr "Ungültige NZB-Datei %s wird übersprungen (Fehler: %s)"
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/urlgrabber.py
|
||||
@@ -1262,27 +1253,27 @@ msgstr "Abgebrochen, kann nicht fertiggestellt werden"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Fehler beim Importieren von %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUPLIKAT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "VERSCHLÜSSELT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "ZU GROSS"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "UNVOLLSTÄNDIG"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "UNERWÜNSCHT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "WARTE %s Sek"
|
||||
|
||||
@@ -1816,7 +1807,7 @@ msgstr "Entpacken"
|
||||
#. PP phase "deobfuscate"
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Deobfuscate"
|
||||
msgstr ""
|
||||
msgstr "Entschleiern"
|
||||
|
||||
#. PP phase "script" - Notification Script settings
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -2234,10 +2225,6 @@ msgstr "Suchen"
|
||||
msgid "Download Dir"
|
||||
msgstr "Downloads"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Systemlast"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Möchten Sie SABnzbd wirklich beenden?"
|
||||
@@ -2280,7 +2267,7 @@ msgstr "Erzwingen"
|
||||
#. Priority pick list
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Stop"
|
||||
msgstr "Anhalten"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#. Add NZB Dialog
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -2525,15 +2512,19 @@ msgstr "DNS-Server"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download speed limited by"
|
||||
msgstr ""
|
||||
msgstr "Downloadgeschwindigkeit begrenzt durch"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "CPU"
|
||||
msgstr ""
|
||||
msgstr "CPU"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
msgstr "Festplattengeschwindigkeit"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr "Systemlast"
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -2755,7 +2746,7 @@ msgid ""
|
||||
"Modern web browsers and other clients will not accept self-signed "
|
||||
"certificates and will give a warning and/or won't connect at all."
|
||||
msgstr ""
|
||||
"Moderne Webbrowser und andere Clients akzeptieren keine selbstsignierten "
|
||||
"Moderne Webbrowser und andere Clients akzeptieren keine selbst signierten "
|
||||
"Zertifikate und geben eine Warnung aus und/oder stellen gar keine Verbindung"
|
||||
" her."
|
||||
|
||||
@@ -2841,13 +2832,23 @@ msgstr ""
|
||||
"Festplatte zu reduzieren.<br /><i>In Bytes, gefolgt von einem optionalen K, "
|
||||
"M oder G. Zum Beispiel: \"64M\" oder \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgstr ""
|
||||
msgid "Create backup"
|
||||
msgstr "Backup erstellen"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
"Erstelle eine Sicherungskopie der Konfigurationsdatei und der Datenbanken im"
|
||||
" Backup-Ordner.<br>Wenn der Backup-Ordner nicht festgelegt ist, wird die "
|
||||
"Sicherungskopie im Ordner der abgeschlossenen Downloads "
|
||||
"erstellt.<br>Wiederkehrende Sicherungen können auf der Seite Planung "
|
||||
"konfiguriert werden."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Cleanup List"
|
||||
@@ -2956,7 +2957,8 @@ msgstr "Externer Internetzugriff"
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "You can set access rights for systems outside your local network."
|
||||
msgstr ""
|
||||
"Du kannst Zugriffsrechte für Systeme ausserhalb deines Netzwerkes setzen."
|
||||
"Es können Zugriffsrechte für Systeme außerhalb des Netzwerkes gesetzt "
|
||||
"werden."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "No access"
|
||||
@@ -3038,12 +3040,12 @@ msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Minimum Free Space for Completed Download Folder"
|
||||
msgstr "Minimaler freier Speicherplatz im Download Ordner"
|
||||
msgstr "Minimaler freier Speicherplatz des abgeschlossene Downloads-Ordners"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Will not work if a category folder is on a different disk."
|
||||
msgstr ""
|
||||
"Funktioniert nicht, wenn sich der Kategorie Ordner auf einer anderen "
|
||||
"Funktioniert nicht, wenn sich der Kategorie-Ordner auf einer anderen "
|
||||
"Festplatte befindet."
|
||||
|
||||
#. Auto-resume download on the reset day
|
||||
@@ -3057,9 +3059,10 @@ msgid ""
|
||||
" again.<br />Applies to both the Temporary and Complete Download Folder.<br "
|
||||
"/>Checked every few minutes."
|
||||
msgstr ""
|
||||
"Das Herunterladen wird automatisch fortgesetzt, wenn der minimale freie Speicherplatz wieder verfügbar ist. <br />\n"
|
||||
"Gilt sowohl für den temporären als auch für den Download Ordner.<br />\n"
|
||||
"Wird alle paar Minuten überprüft."
|
||||
"Das Herunterladen wird automatisch fortgesetzt, wenn der minimale freie "
|
||||
"Speicherplatz wieder verfügbar ist.<br />Gilt sowohl für den temporären als "
|
||||
"auch für den abgeschlossene Downloads-Ordner.<br />Dies wird alle paar "
|
||||
"Minuten überprüft."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Permissions for completed downloads"
|
||||
@@ -3136,6 +3139,20 @@ msgstr ""
|
||||
"Datenbanken enthält.<br /><i>Kann nur geändert werden, wenn die "
|
||||
"Warteschlange leer ist.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr "Backup Ordner"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
"Pfad, an dem die Sicherungen der Konfigurationsdatei und der Datenbanken "
|
||||
"gespeichert werden.<br />Wenn diese Option leer bleibt, wird die Sicherung "
|
||||
"im Ordner der abgeschlossenen Downloads erstellt."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3217,7 +3234,7 @@ msgid ""
|
||||
"incomplete."
|
||||
msgstr ""
|
||||
"Entpacken und starten von Skripten nur bei verifizierten Jobs. Wenn "
|
||||
"ausgeschaltet werden alle Jobs als vollständig markiert, selbst wenn sie "
|
||||
"ausgeschaltet, werden alle Jobs als vollständig markiert, selbst wenn sie "
|
||||
"unvollständig sind."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3292,7 +3309,7 @@ msgstr "Aktion bei ungewollter Dateienendung"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Action when an unwanted extension is detected"
|
||||
msgstr "Aktion bei ungewollter Dateienendung"
|
||||
msgstr "Aktion bei ungewollter Dateiendung"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Unwanted extensions"
|
||||
@@ -3300,11 +3317,11 @@ msgstr "Ungewollte Dateiendungen"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Blacklist"
|
||||
msgstr "Blacklist"
|
||||
msgstr "Sperrliste"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Whitelist"
|
||||
msgstr "Whitelist"
|
||||
msgstr "Erlaubtliste"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
@@ -3312,7 +3329,7 @@ msgid ""
|
||||
" <b>exe, com</b>"
|
||||
msgstr ""
|
||||
"Modus auswählen, und alle (nicht-)erwünschten Erweiterungen auflisten. Zum "
|
||||
"Beispiel : <b>exe</b> oder <b>exe, com</b>"
|
||||
"Beispiel: <b>exe</b> oder <b>exe, com</b>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable SFV-based checks"
|
||||
@@ -3344,18 +3361,6 @@ msgstr ""
|
||||
"Manche Server stellen ein alternatives NZB zur Verfügung, falls ein Download"
|
||||
" fehlschlägt."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr "Übernehme Markierungen vom Indexer"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
"Beim Sortieren, verwende Tags aus Indexer für Titel, Saison, Episode, usw. "
|
||||
"Andernfalls wird alle Namensgebung aus dem NZB-Namen abgeleitet."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Ordner-Umbenennung aktivieren"
|
||||
@@ -3412,6 +3417,12 @@ msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
"Warteschlange automatisch sortieren wenn ein neuer Job hinzugefügt wird."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
"Die Warteschlange wird alle 30 Sekunden neu sortiert, wenn % "
|
||||
"heruntergeladen, ausgewählt ist."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr "Ausbreitungsverzögerung"
|
||||
@@ -3446,6 +3457,14 @@ msgstr "Leerzeichen in Ordnernamen ersetzen"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Leerzeichen in Ordnernamen durch Unterstriche ersetzen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr "Ersetze Unterstriche in Ordnernamen"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr "Ersetze Unterstriche mit Punkte in Ordnernamen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Punkte in Ordner-Namen ersetzen"
|
||||
@@ -3512,7 +3531,7 @@ msgid ""
|
||||
"Additionally, attempts to set the correct file extension based on the file "
|
||||
"signature if the extension is not present or meaningless."
|
||||
msgstr ""
|
||||
"Zusätzlich wird versucht die korrekte Dateierweiterung mithilfe der "
|
||||
"Zusätzlich wird versucht, die korrekte Dateierweiterung mithilfe der "
|
||||
"Dateisignatur zu ermitteln, falls noch keine Dateierweiterung vorhanden, "
|
||||
"oder sie sinnlos sein sollte."
|
||||
|
||||
@@ -3689,6 +3708,9 @@ msgid ""
|
||||
"optionally follow with K,M,G.<br />Warn when it reaches 0, checked every few"
|
||||
" minutes."
|
||||
msgstr ""
|
||||
"Kontingent für dieses Konto, gezählt ab dem Zeitpunkt, an dem es festgelegt "
|
||||
"wird. In Bytes, optional gefolgt von K, M, G.<br />Warne, wenn es 0 "
|
||||
"erreicht, wird alle paar Minuten überprüft."
|
||||
|
||||
#. Server's retention time in days
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3737,15 +3759,15 @@ msgstr "0 ist die höchste, 99 die niedrigste Priorität"
|
||||
#. Server required tickbox
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Required"
|
||||
msgstr "Benötigt"
|
||||
msgstr "Erforderlich"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"In case of connection failures, the download queue will be paused for a few "
|
||||
"minutes instead of skipping this server"
|
||||
msgstr ""
|
||||
"Im Fall von Verbindungsausfällen wird die Downloadwarteschlange für ein paar"
|
||||
" Minuten pausiert, statt diesen Server zu überspringen"
|
||||
"Im Fall von Verbindungsausfällen wird die Download-Warteschlange für ein "
|
||||
"paar Minuten pausiert, anstatt diesen Server zu überspringen"
|
||||
|
||||
#. Server optional tickbox
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3946,7 +3968,7 @@ msgid ""
|
||||
"If only the <em>Default</em> category is selected, notifications are enabled"
|
||||
" for jobs in all categories."
|
||||
msgstr ""
|
||||
"Wenn nur die <em>Standart</em> Kategorie ausgewählt ist werden die "
|
||||
"Wenn nur die <em>Standard</em>-Kategorie ausgewählt ist, werden die "
|
||||
"Benachrichtigungen für Jobs in allen Kategorien aktiviert. "
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -4066,7 +4088,7 @@ msgstr "Prowl-Benachrichtigungen aktivieren"
|
||||
#. Prowl settings
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Requires a Prowl account"
|
||||
msgstr "Benötigt einen Prowl-Account"
|
||||
msgstr "Erfordert ein Prowl-Konto"
|
||||
|
||||
#. Prowl settings
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -4091,17 +4113,17 @@ msgstr "Pushover-Benachrichtungen aktivieren"
|
||||
#. Pushoversettings
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Requires a Pushover account"
|
||||
msgstr "Benötigt einen Pushover-Account"
|
||||
msgstr "Benötigt einen Pushover-Konto"
|
||||
|
||||
#. Pushover settings
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Application Token"
|
||||
msgstr "Applikationstoken"
|
||||
msgstr "Anwendungs-Token"
|
||||
|
||||
#. Pushover settings
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Application token (required)"
|
||||
msgstr "Applikationstoken (benötigt)"
|
||||
msgstr "Anwendungs-Token (erforderlich)"
|
||||
|
||||
#. Pushover settings
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -4111,7 +4133,7 @@ msgstr "Benutzer-Schlüssel"
|
||||
#. Pushover settings
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "User Key (required)"
|
||||
msgstr "Benutzer-Schlüssel (benötigt)"
|
||||
msgstr "Benutzer-Schlüssel (erforderlich)"
|
||||
|
||||
#. Pushover settings
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -4130,7 +4152,8 @@ msgstr "Notfall Wiederanlauf"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr "Wie oft die selbe benachrichtigung (in Sekunden) geschickt wird."
|
||||
msgstr ""
|
||||
"Wie oft dieselbe Benachrichtigung (in Sekunden) geschickt werden soll."
|
||||
|
||||
#. Pushover settings
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -4140,7 +4163,7 @@ msgstr "Notfall Verfall"
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
"Wieviele Sekunden soll versucht werden deine Nachricht erneut zu versenden"
|
||||
"Wie viele Sekunden soll versucht werden die Nachricht erneut zu versenden"
|
||||
|
||||
#. Header for Pushbullet notification section
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -4155,17 +4178,17 @@ msgstr "Pushbullet-Benachrichtigungen aktivieren"
|
||||
#. Pushbulletsettings
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Requires a Pushbullet account"
|
||||
msgstr "Benötigt einen Pushbullet-Account"
|
||||
msgstr "Erfordert ein Pushbullet-Konto"
|
||||
|
||||
#. Pushbullet settings
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Personal API key"
|
||||
msgstr "Persönlicher API-Key"
|
||||
msgstr "Persönlicher API-Schlüssel"
|
||||
|
||||
#. Pushbullet settings
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Your personal Pushbullet API key (required)"
|
||||
msgstr "Dein Pushbullet API-Key (benötigt)"
|
||||
msgstr "Dein Pushbullet API-Schlüssel (erforderlich)"
|
||||
|
||||
#. Pushbullet settings
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -4441,23 +4464,23 @@ msgstr "Ergebnis"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Any property"
|
||||
msgstr ""
|
||||
msgstr "Jede Eigenschaft"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "property"
|
||||
msgstr ""
|
||||
msgstr "Eigenschaft"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "GuessIt Property"
|
||||
msgstr "GuessIt Property"
|
||||
msgstr "GuessIt Eigenschaft"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "GuessIt.Property"
|
||||
msgstr "GuessIt.Property"
|
||||
msgstr "GuessIt.Eigenschaft"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "GuessIt_Property"
|
||||
msgstr "GuessIt_Property"
|
||||
msgstr "GuessIt_Eigenschaft"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
@@ -4564,11 +4587,11 @@ msgstr "Datumsformat"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Extra queue columns"
|
||||
msgstr "Weitere Warteschlangen Spalten"
|
||||
msgstr "Weitere Spalten bei der Warteschlange"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Extra history columns"
|
||||
msgstr "Weitere Verlaufspalten"
|
||||
msgstr "Weitere Spalten bei der Verlaufsliste"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "page"
|
||||
@@ -4630,14 +4653,6 @@ msgstr "Wahlweise einen Dateinamen angeben:"
|
||||
msgid "Submit"
|
||||
msgstr "Senden"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Versendet. Danke!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Nichts ausgewählt!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Alle ausgewählten Dateien entfernen"
|
||||
@@ -4704,7 +4719,7 @@ msgstr "Löschen von Verlaufeinträgen bestätigen"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr ""
|
||||
msgstr "Tastaturkürzel"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "How long or untill when do you want to pause? (in English!)"
|
||||
@@ -4730,6 +4745,10 @@ msgstr ""
|
||||
"Alle Benutzernamen, Passwörter und API-Schlüssel werden automatisch aus dem "
|
||||
"Log und der darin enthaltenen Kopie deiner Einstellungen entfernt."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr "Sortiere nach % heruntergeladen <small>Viel→Wenig</small>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortieren nach Alter <small>Älteste→Neuste</small>"
|
||||
@@ -4862,7 +4881,7 @@ msgstr "Assistenten starten"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Restore backup"
|
||||
msgstr ""
|
||||
msgstr "Backup wiederherstellen"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
@@ -4950,10 +4969,6 @@ msgstr ""
|
||||
"Unbekanntes SSL-Protokoll: SSL deaktivieren oder alternativen Port "
|
||||
"versuchen."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ungültige Server-Adresse."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Sever beendet beim Anmeldeverlauf."
|
||||
|
||||
103
po/main/es.po
103
po/main/es.po
@@ -9,7 +9,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Spanish (https://www.transifex.com/sabnzbd/teams/111101/es/)\n"
|
||||
@@ -150,14 +150,6 @@ msgstr "Cierre de SABnzbd terminado"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Señal %s capturado, guardando y saliendo..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -307,6 +299,10 @@ msgstr "%s no es una dirección de correo electrónico válida."
|
||||
msgid "Server address required"
|
||||
msgstr "Se necesita la dirección del servidor"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Dirección del servidor no válida."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -680,14 +676,6 @@ msgstr ""
|
||||
"Clave de API erróneo, favor ingresar la clave correcta desde Config->General"
|
||||
" en tu aplicacion externa:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Faltaron datos de cuenta, favor ingresar usuario/contraseña desde "
|
||||
"Config->General en tu aplicacion externa:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Autenticación fallida, compruebe el usuario o la contraseña."
|
||||
@@ -1258,27 +1246,27 @@ msgstr "Abortado, No puede ser completado"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Error importando %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUPLICADO"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "ENCRIPTADO"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "DEMASIADO GRANDE"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "INCOMPLETO"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "NO DESEADO"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "ESPERAR %s seg"
|
||||
|
||||
@@ -2228,10 +2216,6 @@ msgstr "Buscar"
|
||||
msgid "Download Dir"
|
||||
msgstr "Dir de Descarga"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Carga del Sistema"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "¿Seguro que deseas detener SABnzbd?"
|
||||
@@ -2529,6 +2513,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2829,12 +2817,17 @@ msgstr ""
|
||||
"Cachear artículos en memoria para reducir el acceso a disco.<br /><i>En "
|
||||
"bytes, opcionalmente seguido de K,M,G. Por ejemplo: \"64M\" o \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3117,6 +3110,17 @@ msgstr ""
|
||||
"Ubicación de la base de datos de historial y administración.<br /><i>Sólo se"
|
||||
" puede cambiar si la cola está vacía.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3317,19 +3321,6 @@ msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr ""
|
||||
"Algunos servidores ofrecen una NZB alternativa cuando falla una descarga ."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr "Utilizar etiquetas del indexer"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
"Al clasificar, utilice etiquetas del indexer para el título, temporada, "
|
||||
"episodio, etc. De no hacerlo así, todos los nombres se extraen del nombre "
|
||||
"NZB."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Habilitar renombrado de directorios"
|
||||
@@ -3385,6 +3376,10 @@ msgstr ""
|
||||
"Clasifique tareas de forma automática en la cola cuando se añade una tarea "
|
||||
"nueva."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr "Demora de la propagación"
|
||||
@@ -3420,6 +3415,14 @@ msgid "Replace spaces with underscores in folder names."
|
||||
msgstr ""
|
||||
"Reemplaza los espacios con guiones bajos en los nombres de directorio."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Reemplazar puntos en los directorios"
|
||||
@@ -4599,14 +4602,6 @@ msgstr "Opcionalmente especificar un nombre de fichero"
|
||||
msgid "Submit"
|
||||
msgstr "Enviar"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Enviado. ¡Muchas gracias!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "¡No hay nada seleccionado!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Eliminar todos los ficheros seleccionados"
|
||||
@@ -4700,6 +4695,10 @@ msgstr ""
|
||||
"Todos los nombres de usuarios, contraseñas y llaves-API se eliminan "
|
||||
"automáticamente del registro y se incluye una copia de su configuración."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Ordenar por Fecha <small>Más viejo→Más nuevo</small>"
|
||||
@@ -4916,10 +4915,6 @@ msgstr ""
|
||||
"Protocolo SSL desconocido: intente desabilitar el SSL o conectarse a un "
|
||||
"puerto diferente."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Dirección del servidor no válida."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "El servidor se ha cerrado durante el login"
|
||||
|
||||
100
po/main/fi.po
100
po/main/fi.po
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Finnish (https://www.transifex.com/sabnzbd/teams/111101/fi/)\n"
|
||||
@@ -143,14 +143,6 @@ msgstr "SABnzbd sammutus valmis"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Signaali %s kaapattu, tallennetaan ja lopetetaan..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -290,6 +282,10 @@ msgstr "%s ei ole kelvollinen sähköpostiosoite"
|
||||
msgid "Server address required"
|
||||
msgstr "Palvelimen osoite vaaditaan"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Virheellinen palvelimen osoite."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -655,14 +651,6 @@ msgstr ""
|
||||
"API avain virheellinen, käytä Asetukset->Yleiset löytyvää api avainta "
|
||||
"käyttämääsi kolmannen osapuolen ohjelmaan:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Authentikointi puuttuu, ole hyvä ja syötä käyttäjänimi/salasana "
|
||||
"Asetukset->Yleiset kolmannen osapuolen ohjelmaasi:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Varmennus epäonnistui, tarkista käyttäjänimi/salasana."
|
||||
@@ -1207,27 +1195,27 @@ msgstr "Peruutettu, ei voi valmistua"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Virhe tuotaessa %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "KAKSOISKAPPALE"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "SALATTU"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "LIIAN SUURI"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "KESKENERÄINEN"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "EI TOIVOTTU"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "ODOTA %s sekuntia"
|
||||
|
||||
@@ -2166,10 +2154,6 @@ msgstr "Etsi"
|
||||
msgid "Download Dir"
|
||||
msgstr "Lataukset-kansio"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Kuorma"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Oletko varma, että haluat sammuttaa SABnzbdn?"
|
||||
@@ -2464,6 +2448,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2754,12 +2742,17 @@ msgstr ""
|
||||
"/><i>Tavuina, vaihtoehtoisesti lisää pääte K,M,G. Esimerkiksi: \"64M\" tai "
|
||||
"\"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3041,6 +3034,17 @@ msgstr ""
|
||||
"Sijainti jonne tallennetaan jonon hallinnan ja historian tietokannat.<br "
|
||||
"/><i>Voidaan muuttaa vain jonon ollessa tyhjä.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3234,16 +3238,6 @@ msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr ""
|
||||
"Jotkin palvelimet tarjoavat vaihtoehtoisen NZB:n kun lataus epäonnistuu."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Kansion uudelleennimeäminen käytössä"
|
||||
@@ -3298,6 +3292,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr "Levitysviive"
|
||||
@@ -3331,6 +3329,14 @@ msgstr "Korvaa välilyönnit kansionimessä"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Korvaa välilyönnit alaviivoilla kansionimissä."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Korvaa pisteet kansionimessä"
|
||||
@@ -4493,14 +4499,6 @@ msgstr "Vaihtoehtoisesti anna tiedostonimi"
|
||||
msgid "Submit"
|
||||
msgstr "Lähetä"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Lähetetty. Kiitos!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Ei mitään valittuna!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Poista kaikki valitut tiedostot"
|
||||
@@ -4592,6 +4590,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Järjestä iän mukaan <small>Vanhin→Uusin</small>"
|
||||
@@ -4808,10 +4810,6 @@ msgid ""
|
||||
msgstr ""
|
||||
"Tuntematon SSL protokolla: Kokeile ottaa SSL käytöstä tai vaihda porttia."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Virheellinen palvelimen osoite."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Palvelin lopetettiin kesken kirjautumisen"
|
||||
|
||||
126
po/main/fr.po
126
po/main/fr.po
@@ -8,7 +8,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Fred L <88com88@gmail.com>, 2022\n"
|
||||
"Language-Team: French (https://www.transifex.com/sabnzbd/teams/111101/fr/)\n"
|
||||
@@ -153,17 +153,6 @@ msgstr "Arrêt de SABnzbd terminé"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Signal %s intercepté, enregistrement et fermeture en cours..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
"Nous envisageons de supprimer le paramètre '%s' que vous avez modifié par "
|
||||
"rapport à la valeur par défaut. Pourriez-vous nous dire pourquoi vous avez "
|
||||
"fait ce changement à : https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -313,6 +302,10 @@ msgstr "%s n'est pas une adresse email valide"
|
||||
msgid "Server address required"
|
||||
msgstr "Adresse du serveur requise"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Adresse du serveur erronée"
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr "%s n'est pas un script valide"
|
||||
@@ -691,14 +684,6 @@ msgstr ""
|
||||
"Clé API incorrecte, utilisez la clé API de la configuration générale dans "
|
||||
"votre application tierce :"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Authentification manquante, entrez vos identifiant/mot de passe de la "
|
||||
"configuration générale dans votre application tierce :"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Echec d'authentification, vérifiez les identifiant/mot de passe."
|
||||
@@ -1261,27 +1246,27 @@ msgstr "Interrompu, ne peut être achevé"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Erreur lors de l'importation de %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DOUBLON"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "CHIFFRÉ"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "TROP VOLUMINEUX"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "INCOMPLET"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "INDÉSIRABLE"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "PATIENTER %s sec"
|
||||
|
||||
@@ -1547,7 +1532,7 @@ msgid ""
|
||||
"Completed Download Folder %s is on FAT file system, limiting maximum file "
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
"Le système de fichiers du dossier de téléchargements terminés %s est au "
|
||||
"Le système de fichiers du dossier des téléchargements terminés %s est au "
|
||||
"format FAT, limitant la taille maximale d'un fichier à 4 Go"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -2233,10 +2218,6 @@ msgstr "Rechercher"
|
||||
msgid "Download Dir"
|
||||
msgstr "Dossier de téléchargement"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Sysload"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Etes-vous sûr de vouloir arrêter SABnzbd ?"
|
||||
@@ -2534,6 +2515,10 @@ msgstr "processeur"
|
||||
msgid "Disk speed"
|
||||
msgstr "Vitesse du disque"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr "Charge du système"
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2839,15 +2824,23 @@ msgstr ""
|
||||
"Mettre les articles en cache pour réduire les accès disque.<br /><i>En "
|
||||
"Octets, peut être suivi de K,M,G. Par exemple : \"64M\" ou \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgstr "Télécharger la sauvegarde"
|
||||
msgid "Create backup"
|
||||
msgstr "Créer une sauvegarde"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
"Sauvegarder ou restaurer une sauvegarde du fichier de configuration et des "
|
||||
"bases de données."
|
||||
"Créer une sauvegarde du fichier de configuration et des bases de données "
|
||||
"dans le Dossier de sauvegarde.<br>Si le Dossier de sauvegarde n'est pas "
|
||||
"défini, la sauvegarde sera créée dans le Dossier des téléchargements "
|
||||
"terminés.<br>Les sauvegardes récurrentes peuvent être configurées sur la "
|
||||
"page Planification."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Cleanup List"
|
||||
@@ -3028,7 +3021,7 @@ msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Completed Download Folder"
|
||||
msgstr "Dossier de téléchargements terminés"
|
||||
msgstr "Dossier des téléchargements terminés"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
@@ -3060,7 +3053,7 @@ msgid ""
|
||||
"/>Checked every few minutes."
|
||||
msgstr ""
|
||||
"Le téléchargement reprendra automatiquement si l'espace libre minimum est à "
|
||||
"nouveau disponible.<br />S'applique aux dossiers de téléchargements "
|
||||
"nouveau disponible.<br />S'applique aux dossiers des téléchargements "
|
||||
"temporaires et terminés.<br />Vérifié toutes les quelques minutes."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3139,6 +3132,20 @@ msgstr ""
|
||||
"Emplacement de la file d'attente et de la base de données d'historique.<br "
|
||||
"/><i>Ne peut être changé que lorsque la file d'attente est vide.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr "Dossier de sauvegarde"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
"Emplacement où sont stockées les sauvegardes du fichier de configuration et "
|
||||
"des bases de données.<br />Si laissé vide, la sauvegarde sera créée dans le "
|
||||
"Dossier des téléchargements terminés."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3346,19 +3353,6 @@ msgstr ""
|
||||
"Certains serveurs proposent un NZB alternatif lorsqu'un téléchargement "
|
||||
"échoue."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr "Utiliser les tags de l'indexeur"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
"Lors du tri, utiliser les tags de l'indexeur pour le titre, la saison, "
|
||||
"l'episode, etc. Sinon, toutes les dénominations seront dérivées du fichier "
|
||||
"NZB."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Activer le renommage du dossier"
|
||||
@@ -3415,6 +3409,12 @@ msgstr ""
|
||||
"Trier automatiquement la file d'attente lorsqu'une nouvelle tâche est "
|
||||
"ajoutée."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
"La file d'attente sera triée toutes les 30 secondes si le % de "
|
||||
"téléchargement est sélectionné."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr "Délai de propagation"
|
||||
@@ -3450,6 +3450,14 @@ msgid "Replace spaces with underscores in folder names."
|
||||
msgstr ""
|
||||
"Remplace les espaces par des underscores ( _ ) dans les noms de dossiers."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr "Remplacer les underscores dans le nom du dossier"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr "Remplacer les underscores par des points dans les noms de dossiers"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Remplacer les points dans les noms de dossier"
|
||||
@@ -4639,14 +4647,6 @@ msgstr "Vous pouvez également indiquer un nom de fichier"
|
||||
msgid "Submit"
|
||||
msgstr "Soumettre"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Soumis. Merci !"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Pas de sélection!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Supprimer tous les fichiers sélectionnés"
|
||||
@@ -4741,6 +4741,10 @@ msgstr ""
|
||||
"Tous les noms d'utilisateur, mots de passe et clés API sont automatiquement "
|
||||
"supprimés du journal et de la copie de vos réglages."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr "Trier par % téléchargé <small>Most→Least</small>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Trier par Age <small>Moins récent→Plus récent</small>"
|
||||
@@ -4961,10 +4965,6 @@ msgstr ""
|
||||
"Protocole SSL inconnu: essayez de désactiver SSL ou de vous connecter sur un"
|
||||
" autre port."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Adresse du serveur erronée"
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Le serveur a interrompu l'ouverture de session."
|
||||
|
||||
109
po/main/he.po
109
po/main/he.po
@@ -8,7 +8,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: ION, 2022\n"
|
||||
"Language-Team: Hebrew (https://www.transifex.com/sabnzbd/teams/111101/he/)\n"
|
||||
@@ -140,17 +140,6 @@ msgstr "כיבוי SABnzbd הסתיים"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "אות %s נתפס, שומר ויוצא…"
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
"אנחנו מתכננים להסיר את ההגדרה '%s', אשר שינית מערך ברירת המחדל. אתה יכול "
|
||||
"ליידע אותנו למה עשית את השינוי הזה בכתובת: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -291,6 +280,10 @@ msgstr "%s אינה כתובת דוא״ל תקפה"
|
||||
msgid "Server address required"
|
||||
msgstr "כתובת שרת דרושה"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "כתובת שרת בלתי תקפה."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr "%s הוא לא תסריט תקף"
|
||||
@@ -656,14 +649,6 @@ msgid ""
|
||||
"program:"
|
||||
msgstr "מפתח API שגוי, השתמש במפתח ה־API מתצורה->כללי בתוכנית הצד השלישי שלך:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"אימות חסר, אנא הכנס שם משתמש/סיסמה מתוך תצורה->כללי לתוך תוכנית הצד השלישי "
|
||||
"שלך:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "אימות נכשל, בדוק שם משתמש/סיסמה."
|
||||
@@ -1213,27 +1198,27 @@ msgstr "בוטל, לא יכול להיות שלם"
|
||||
msgid "Error importing %s"
|
||||
msgstr "שגיאה ביבוא %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "כפול"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "מוצפן"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "גדול מדי"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "בלתי שלם"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "בלתי רצוי"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "המתן %s שניות"
|
||||
|
||||
@@ -2176,10 +2161,6 @@ msgstr "חיפוש"
|
||||
msgid "Download Dir"
|
||||
msgstr "תיקיית הורדות"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "עומס מערכת"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "האם אתה בטוח שאתה רוצה לכבות את SABnzbd?"
|
||||
@@ -2476,6 +2457,10 @@ msgstr "יע״מ"
|
||||
msgid "Disk speed"
|
||||
msgstr "מהירות דיסק"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2764,13 +2749,18 @@ msgstr ""
|
||||
"הטמן מאמרים בזיכרון כדי להפחית גישת דיסק.<br /><i>בבתים, יכול לבוא עם K,M,G."
|
||||
" לדוגמה: \"64M\" או \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgstr "הורד גיבוי"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgstr "שמור או שחזר גיבוי של קובץ התצורה ומסדי נתונים."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Cleanup List"
|
||||
@@ -3047,6 +3037,17 @@ msgstr ""
|
||||
"מיקום עבור מנהלן התור ומסד נתוני ההיסטוריה.<br /><i>ניתן לשינוי רק כאשר התור"
|
||||
" ריק.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr "<i>נתונים <b>לא</b> יועברו. דורש הפעלה מחדש של SABnzbd!</i>"
|
||||
@@ -3237,18 +3238,6 @@ msgstr "בכישלון, נסה NZB חלופי"
|
||||
msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr "מספר שרתים מספקים קובץ NZB חלופי כאשר הורדה נכשלת."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr "השתמש בתגים ממדדן"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
"בעת מיון, השתמש בתגים ממדדן עבור כותרת, עונה, פרק וכדומה. אחרת כל מתן השמות "
|
||||
"נגזר משם קובץ NZB."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "אפשר שינוי שם תיקייה"
|
||||
@@ -3301,6 +3290,10 @@ msgstr "מיין תור באופן אוטומטי"
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr "מיין עבודות בתור באופן אוטומטי כאשר עבודה חדשה מתווספת."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr "התור ימוין כל 30 שניות אם האפשרות % ירד נבחרה."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr "עיכוב רביה"
|
||||
@@ -3334,6 +3327,14 @@ msgstr "החלף רווחים בשמות תיקיות"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "החלף רווחים בקווים תחתונים בשמות תיקיות."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "החלף נקודות בשמות תיקיות"
|
||||
@@ -4496,14 +4497,6 @@ msgstr "ציין באופן רשותי שם קובץ"
|
||||
msgid "Submit"
|
||||
msgstr "הגש"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "הוגש. תודה!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "שום דבר לא נבחר!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "הסר את כל הקבצים הנבחרים"
|
||||
@@ -4596,6 +4589,10 @@ msgstr ""
|
||||
"כל שמות המשתמש, הסיסמאות ומפתחות API מוסרים באופן אוטומטי מהיומן ומהעותק "
|
||||
"הכלול של ההגדרות שלך."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr "מיין לפי % ירד <small>הכי הרבה→הכי מעט</small>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "מיין לפי גיל <small>החדש ביותר←הישן ביותר</small>"
|
||||
@@ -4810,10 +4807,6 @@ msgid ""
|
||||
"Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr "פרוטוקול SSL בלתי ידוע: נסה להשבית SSL או להתחבר על פתחה שונה."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "כתובת שרת בלתי תקפה."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "שרת יצא במהלך רצף כניסות."
|
||||
|
||||
100
po/main/nb.po
100
po/main/nb.po
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Norwegian Bokmål (https://www.transifex.com/sabnzbd/teams/111101/nb/)\n"
|
||||
@@ -140,14 +140,6 @@ msgstr "SABnzbd er nå avsluttet"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Signal %s mottatt, lagrer og avslutter..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -287,6 +279,10 @@ msgstr "%s er ikke en godkjent e-post-adresse"
|
||||
msgid "Server address required"
|
||||
msgstr "Krever server-adresse"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ugyldig server-adresse."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -651,14 +647,6 @@ msgstr ""
|
||||
"API-nøkkel er feil, bruk API-nøkkel fra Konfigurasjon->Generelt i ditt "
|
||||
"tredjepartsprogram:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Autentisering mangler, angi brukernavn/passord fra Konfigurasjon->Generelt i"
|
||||
" ditt tredjepartsprogram:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Godkjenning mislyktes, kontroller brukernavn og passord."
|
||||
@@ -1204,27 +1192,27 @@ msgstr "Avbrutt, kan ikke fullføres"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Kunne ikke importere %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUPLIKAT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "KRYPTERT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "FOR STOR"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "UFULLSTENDIG"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "UØNSKET"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "VENT %s sek"
|
||||
|
||||
@@ -2163,10 +2151,6 @@ msgstr "Søk"
|
||||
msgid "Download Dir"
|
||||
msgstr "Midlertidig nedlastingsmappe"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Systemlast"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Er sikker på at du vil slå av SABnzbd?"
|
||||
@@ -2461,6 +2445,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2745,12 +2733,17 @@ msgstr ""
|
||||
"Lagrer artikler i minnet for å redusere diskaktivitet.<br /><i>I bytes, "
|
||||
"fulgt av K,M,G. For eksempel: \"64M\" eller \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3026,6 +3019,17 @@ msgstr ""
|
||||
"Lokasjon for køadmin og historikkdatabase.<br /><i>Kan bare endres når køen "
|
||||
"er tom.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr "<i>Data vil <b>ikke</b> bli flyttet. Krever SABnzbd restart!</i>"
|
||||
@@ -3215,16 +3219,6 @@ msgstr "Når den feiler, prøv alternativ NZB-fil"
|
||||
msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr "Noen servere vil gi en alternativ NZB når en nedlasting mislykkes."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Aktiver omdøping av mappe"
|
||||
@@ -3277,6 +3271,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr ""
|
||||
@@ -3308,6 +3306,14 @@ msgstr "Erstatt mellomrom i mappenavn"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Erstatt mellomrom med understrek i mappenavn."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Erstatt punktum i mappenavn"
|
||||
@@ -4464,14 +4470,6 @@ msgstr "Valgfritt spesifiser filnavn"
|
||||
msgid "Submit"
|
||||
msgstr "Send"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Sendt. Takk!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Ingenting er valgt!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Fjern alle valgte filer"
|
||||
@@ -4560,6 +4558,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sorter etter alder <small>Eldst→Ny</small>"
|
||||
@@ -4778,10 +4780,6 @@ msgstr ""
|
||||
"Ukjent SSL-protokoll: Prøv å deaktivere SSL eller koble til på en annen "
|
||||
"port."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ugyldig server-adresse."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Server avbrøt undet innloggingssekvens"
|
||||
|
||||
124
po/main/nl.po
124
po/main/nl.po
@@ -1,14 +1,14 @@
|
||||
# SABnzbd Translation Template file MAIN
|
||||
# Copyright 2007-2022 The SABnzbd-Team
|
||||
# team@sabnzbd.org
|
||||
#
|
||||
#
|
||||
# Translators:
|
||||
# Rik Brouwer, 2022
|
||||
# Safihre <safihre@sabnzbd.org>, 2022
|
||||
#
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Dutch (https://www.transifex.com/sabnzbd/teams/111101/nl/)\n"
|
||||
@@ -147,14 +147,6 @@ msgstr "SABnzbd is afgesloten"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Signaal %s ontvangen, opslaan en afsluiten..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -302,6 +294,10 @@ msgstr "%s is geen geldig e-mailadres"
|
||||
msgid "Server address required"
|
||||
msgstr "Serveradres verplicht"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ongeldige servernaam"
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr "%s is geen geldig script."
|
||||
@@ -639,11 +635,15 @@ msgid ""
|
||||
"%s is not writable with special character filenames. This can cause "
|
||||
"problems."
|
||||
msgstr ""
|
||||
"Het is niet mogelijk bestanden met speciale tekens op te slaan in %s. Dit "
|
||||
"geeft mogelijk problemen bij het verwerken van downloads."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/filesystem.py
|
||||
msgid "%s is not writable at all. This blocks downloads."
|
||||
msgstr ""
|
||||
"Het is niet mogelijk bestanden te schrijven in %s. Hierdoor kan er niet "
|
||||
"gedownload worden."
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid "Refused connection from:"
|
||||
@@ -678,14 +678,6 @@ msgstr ""
|
||||
"API-sleutel incorrect; vul de API-sleutel van 'Configuratie' => 'Algemeen' "
|
||||
"in bij het externe programma:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Autenticatie ontbreekt; vul gebruikersnaam en wachtwoord van 'Configuratie' "
|
||||
"=> 'Algemeen' in bij het externe programma:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Inloggen mislukt, controleer gebruikersnaam en wachtwoord."
|
||||
@@ -1243,27 +1235,27 @@ msgstr "Afgebroken, kan niet voltooid worden"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Fout bij importeren van %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUBBEL"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "VERSLEUTELD"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "TE GROOT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "ONVOLLEDIG"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "ONGEWENST"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "WACHT %s sec"
|
||||
|
||||
@@ -2207,10 +2199,6 @@ msgstr "Zoeken"
|
||||
msgid "Download Dir"
|
||||
msgstr "Map voor verwerkte downloads"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Sysload"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Weet je zeker dat je SABnzbd wilt afsluiten?"
|
||||
@@ -2507,6 +2495,10 @@ msgstr "Processor"
|
||||
msgid "Disk speed"
|
||||
msgstr "Hardeschijf"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr "Systeembelasting"
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2811,13 +2803,22 @@ msgstr ""
|
||||
"Bewaar de artikelen in het werkgeheugen (verminderd schijf gebruik).<br "
|
||||
"/><i>In bytes, in K,M,G notatie. Bijvoorbeeld: \"64M\" of \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgstr "Backup downloaden"
|
||||
msgid "Create backup"
|
||||
msgstr "Maak backup"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgstr "Backup van de configuratie en de database opslaan of herstellen"
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
"Maak een backup van de configuratie en de database in de Backup Map.<br>Als "
|
||||
"er geen Backup Map is ingesteld wordt de backup aangemaakt in de Map voor "
|
||||
"verwerkte downloads.<br>Automatische backups kunnen worden ingesteld via de "
|
||||
"Taakplanner."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Cleanup List"
|
||||
@@ -3094,6 +3095,20 @@ msgstr ""
|
||||
"Map waar de wachtrij en geschiedenisdatabase worden opgeslagen.<br /><i>Kan "
|
||||
"alleen gewijzigd worden als de wachtrij leeg is.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr "Backup map"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
"Map waar de backups van de configuratie en databases worden opgeslagen.<br "
|
||||
"/>Als deze map niet is ingesteld worden de backups aangemaakt in de Map voor"
|
||||
" verwerkte downloads."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3300,19 +3315,6 @@ msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr ""
|
||||
"Sommige indexers hebben een alternatieve NZB wanneer een download mislukt"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr "Gebruik indexer informatie"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
"Maak tijdens het sorteren gebruik van informatie van de indexer zoals titel,"
|
||||
" seizoen, aflevering, enz. Anders wordt alle informatie uit de naam van de "
|
||||
"download gehaald."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Gebruik tijdelijke mapnamen"
|
||||
@@ -3368,6 +3370,12 @@ msgstr ""
|
||||
"De wachtrij wordt automatisch gesorteerd wanneer er een nieuwe opdracht "
|
||||
"wordt toegevoegd"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
"De wachtrij wordt elke 30 seconden opnieuw gesorteerd als de optie % "
|
||||
"gedownload is gekozen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr "Verspreidingswachttijd"
|
||||
@@ -3401,6 +3409,14 @@ msgstr "Vervang spaties in mapnamen"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Vervang spaties door onderliggende streepjes in namen van mappen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr "Vervang onderstrepingstekens in mapnamen"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr "Vervang onderstrepingstekens door punten in mapnamen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Vervang punten in mapnamen"
|
||||
@@ -4587,14 +4603,6 @@ msgstr "Geef eventueel een andere naam"
|
||||
msgid "Submit"
|
||||
msgstr "Verstuur"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Ingediend. Bedankt!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Niets geselecteerd!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Verwijder alle geselecteerde bestanden"
|
||||
@@ -4687,6 +4695,10 @@ msgstr ""
|
||||
"Alle gebruikersnamen, wachtwoorden en API-sleutels worden automatisch "
|
||||
"verwijderd uit het logbestand en de bijgevoegde kopie van je instellingen."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr "Sorteer Op % Gedownload <small>Meest→Minst</small>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sorteer op Leeftijd <small>Oud→Nieuw</small>"
|
||||
@@ -4904,10 +4916,6 @@ msgid ""
|
||||
msgstr ""
|
||||
"Onbekend SSL protocol: probeer het zonder SSL of probeer een andere poort."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ongeldige servernaam"
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "De server stopte tijdens de login"
|
||||
|
||||
100
po/main/pl.po
100
po/main/pl.po
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Polish (https://www.transifex.com/sabnzbd/teams/111101/pl/)\n"
|
||||
@@ -135,14 +135,6 @@ msgstr "SABnzbd został wyłączony"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Odebrano sygnał %s, zapisywanie i zamykanie programu..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -282,6 +274,10 @@ msgstr "%s nie jest prawidłowym adresem email"
|
||||
msgid "Server address required"
|
||||
msgstr "Wymagane jest podanie adresu serwera"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Nieprawidłowy adres serwera."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -650,14 +646,6 @@ msgstr ""
|
||||
"Klucz API jest nieprawidłowy, użyj klucza API z sekcji Konfiguracja->Ogólne "
|
||||
"w zewnętrznym programie:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Brak danych uwierzytelniających, wprowadź nazwę użytkownika/hasło z sekcji "
|
||||
"Konfiguracja->Ogólne do zewnętrznego programu:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Błąd połączenia, sprawdź nazwę użytkownika i hasło."
|
||||
@@ -1205,27 +1193,27 @@ msgstr "Przerwano, nie można ukończyć"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Błąd importu %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUPLIKAT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "ZASZYFROWANY"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "ZA DUŻY"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "NIEKOMPLETNY"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "NIEPOŻĄDANY"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "CZEKAM %s s"
|
||||
|
||||
@@ -2168,10 +2156,6 @@ msgstr "Szukaj"
|
||||
msgid "Download Dir"
|
||||
msgstr "Katalog pobierania"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Obciążenie"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Czy na pewno wyłączyć SABnzbd?"
|
||||
@@ -2466,6 +2450,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2752,12 +2740,17 @@ msgstr ""
|
||||
"dostępu do dysku.<br /><i>W bajtach, opcjonalnie z przyrostkiem K, M, G. "
|
||||
"Przykład: \"64M\" lub \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3035,6 +3028,17 @@ msgstr ""
|
||||
"Lokalizacja bazy danych administracyjnych i historycznych kolejki.<br "
|
||||
"/><i>Można zmienić tylko kiedy kolejka jest pusta.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr "<i>Dane <b>nie</b> zostaną przeniesione. Wymaga restartu SABnzbd!</i>"
|
||||
@@ -3224,16 +3228,6 @@ msgstr ""
|
||||
"Niektóre serwery udostępniają alternatywne NZB, kiedy pobieranie kończy się "
|
||||
"niepowodzeniem"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Włącz zmianę nazw katalogów"
|
||||
@@ -3286,6 +3280,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr ""
|
||||
@@ -3317,6 +3315,14 @@ msgstr "Zastąp spacje w nazwach katalogów"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Zastąp spacje w nazwach katalogów podkreśleniami"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Zastąp kropki w nazwach katalogów"
|
||||
@@ -4474,14 +4480,6 @@ msgstr "Opcjonalnie podaj nazwę pliku"
|
||||
msgid "Submit"
|
||||
msgstr "Wyślij"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Wysłano. Dzięki!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Nic nie zaznaczono!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Usuń wszystkie zaznaczone pliki"
|
||||
@@ -4570,6 +4568,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortuj według wieku <small>Najstarsze→Najnowsze</small>"
|
||||
@@ -4788,10 +4790,6 @@ msgid ""
|
||||
"Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Nieprawidłowy adres serwera."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Serwer przerwał połączenie w trakcie logowania."
|
||||
|
||||
100
po/main/pt_BR.po
100
po/main/pt_BR.po
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
|
||||
@@ -139,14 +139,6 @@ msgstr "Encerramento do SABnzbd concluído"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Sinal %s encontrado. Salvando e saindo..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -286,6 +278,10 @@ msgstr "%s não é um endereço de e-mail válido"
|
||||
msgid "Server address required"
|
||||
msgstr "Endereço do servidor necessário"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Endereço do servidor inválido."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -654,14 +650,6 @@ msgstr ""
|
||||
"Chave de API incorreta. Use a chave de API de Configuração->Geral em seu "
|
||||
"programa de terceiros:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Autenticação faltando. Por favor insira usuário/senha de Configuração->Geral"
|
||||
" em seu programa de terceiros:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Falha de autenticação, verifique usuário / senha."
|
||||
@@ -1206,27 +1194,27 @@ msgstr "Cancelado, não é possível concluir"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Erro ao importar %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUPLICADO"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "CRIPTOGRAFADO"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "MUITO GRANDE"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "INCOMPLETO"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "INDESEJADO"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "Espere %s segundo(s)"
|
||||
|
||||
@@ -2171,10 +2159,6 @@ msgstr "Busca"
|
||||
msgid "Download Dir"
|
||||
msgstr "Pasta de Download"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Carga do sistema"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Tem certeza de que quer encerrar o SABnzbd?"
|
||||
@@ -2469,6 +2453,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2754,12 +2742,17 @@ msgstr ""
|
||||
"Manter artigos em memória para reduzir o acesso a disco.<br /><i>Em bytes, "
|
||||
"opcionalmente seguido de K,M,G. Por exemplo: \"64M\" ou \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3035,6 +3028,17 @@ msgstr ""
|
||||
"Localização do banco de dados de histórico e administrador de fila.<br "
|
||||
"/><i>Só pode ser alterado quando a fila estiver vazia.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3225,16 +3229,6 @@ msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr ""
|
||||
"Alguns servidores fornecem um NZB alternativo quando um download falha."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Habilitar renomeação de pasta"
|
||||
@@ -3289,6 +3283,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr ""
|
||||
@@ -3320,6 +3318,14 @@ msgstr "Substituir espaços no nome da pasta"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Substituir espaços por sublinhado no nome das pastas."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Substituir pontos no nome da pasta"
|
||||
@@ -4476,14 +4482,6 @@ msgstr "Opcionalmente, especifique um nome de arquivo"
|
||||
msgid "Submit"
|
||||
msgstr "Enviar"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Enviado. Obrigado!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Nada selecionado!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Remover todos os arquivos selecionados"
|
||||
@@ -4572,6 +4570,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Ordenar por Idade <small>Mais antigo→Mais novo</small>"
|
||||
@@ -4787,10 +4789,6 @@ msgid ""
|
||||
"Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Endereço do servidor inválido."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Servidor parou durante a sequência de login."
|
||||
|
||||
100
po/main/ro.po
100
po/main/ro.po
@@ -8,7 +8,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Romanian (https://www.transifex.com/sabnzbd/teams/111101/ro/)\n"
|
||||
@@ -145,14 +145,6 @@ msgstr "Închidere SABnzbd terminată"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Semnal %s prins, salvez şi ies..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -298,6 +290,10 @@ msgstr "%s nu este o adresă email validă"
|
||||
msgid "Server address required"
|
||||
msgstr "Adresă server necesară"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Adresă server invalidă"
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -668,14 +664,6 @@ msgstr ""
|
||||
"Cheie API incorectă, Folosiţi cheia api din Configurare->General în "
|
||||
"programul dumneavoastră terţ:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Autentificare lipsă, vă rugăm să introduceţi numele de utilizator/parola de "
|
||||
"la Configurare->General în programul dumneavoastră terţ:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Autentificare nereuşită, verifică nume utilizator/parolă."
|
||||
@@ -1232,27 +1220,27 @@ msgstr "Anulat nu poate fi finalizat"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Eroare importare %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUPLICAT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "ENCRIPTAT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "PREA MARE"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "INCOMPLET"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "NEDORIT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "AŞTEAPTĂ %s sec"
|
||||
|
||||
@@ -2199,10 +2187,6 @@ msgstr "Caută"
|
||||
msgid "Download Dir"
|
||||
msgstr "Dosar Descărcare"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Încărcare sistem"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Sunteţi sigur că doriţi să inchideţi SABnzbd?"
|
||||
@@ -2497,6 +2481,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2783,12 +2771,17 @@ msgstr ""
|
||||
"Stochează articolele în memorie pentru a reduce acesul disc.<br /><i>În "
|
||||
"octeţi, opţional urmaţi de K,M,G. De exemplu : \"64M\" sau\"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3061,6 +3054,17 @@ msgstr ""
|
||||
"Locaţia coadei admin şi istoricul bazei de date.<br /><i>Poate fi folosit "
|
||||
"doar când coada e goală.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3252,16 +3256,6 @@ msgstr "La eroare, încearcă NZB alternativ"
|
||||
msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr "Unele server oferă o alternativă dacă un NZB eșuează."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Activează redenumire dosar"
|
||||
@@ -3315,6 +3309,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr "Întârziere de propagare"
|
||||
@@ -3348,6 +3346,14 @@ msgstr "Înlocuieşte Spaţiile din Numele Dosarelor"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Înlocuieşte spaţiile cu _ în numele dosarelor."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Înlocuieşte punctele din Numele Dosarelor"
|
||||
@@ -4504,14 +4510,6 @@ msgstr "Opţional specifică un nume de fişier"
|
||||
msgid "Submit"
|
||||
msgstr "Trimite"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Trimis. Vă mulțumim!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Nimic selectat!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Elimină toate fișierele selectate"
|
||||
@@ -4602,6 +4600,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortează după Vârstă <small>Cel mai Vechi→Cel mai Nou</small>"
|
||||
@@ -4820,10 +4822,6 @@ msgid ""
|
||||
"Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Adresă server invalidă"
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Serverul a renunţat în timpul logării."
|
||||
|
||||
100
po/main/ru.po
100
po/main/ru.po
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Russian (https://www.transifex.com/sabnzbd/teams/111101/ru/)\n"
|
||||
@@ -139,14 +139,6 @@ msgstr "Завершение работы SABnzbd закончено"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Получен сигнал %s. Выполняется сохранение и выход..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -286,6 +278,10 @@ msgstr "%s не является допустимым адресом элект
|
||||
msgid "Server address required"
|
||||
msgstr "Требуется адрес сервера"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Недопустимый адрес сервера."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -650,14 +646,6 @@ msgstr ""
|
||||
"Неправильный ключ API. Используйте в сторонней программе ключ API из раздела"
|
||||
" «Настройка -> Общие»:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Отсутствуют учётные данные. Введите в сторонней программе имя пользователя и"
|
||||
" пароль из раздела «Настройка -> Общие»:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Ошибка проверки подлинности. Проверьте имя и пароль."
|
||||
@@ -1206,27 +1194,27 @@ msgstr ""
|
||||
msgid "Error importing %s"
|
||||
msgstr "Ошибка импорта %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "ПОВТОР"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "ЗАШИФРОВАН"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "СЛИШКОМ БОЛЬШОЙ"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "НЕПОЛНЫЙ"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "ОЖИДАНИЕ %s с"
|
||||
|
||||
@@ -2167,10 +2155,6 @@ msgstr ""
|
||||
msgid "Download Dir"
|
||||
msgstr "Каталог загрузки"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Загрузка системы"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Остановить SABnzbd?"
|
||||
@@ -2465,6 +2449,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2749,12 +2737,17 @@ msgstr ""
|
||||
"/><i>В байтах, после числа можно добавить K, M или G. Пример: «64M» или "
|
||||
"«128M»</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3031,6 +3024,17 @@ msgstr ""
|
||||
"Место для хранения и базы данных очереди и журнала.<br /><i>Изменить можно "
|
||||
"только тогда, когда очередь пуста.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3218,16 +3222,6 @@ msgstr ""
|
||||
msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Переименовывать папки"
|
||||
@@ -3281,6 +3275,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr ""
|
||||
@@ -3312,6 +3310,14 @@ msgstr "Заменять пробелы в названиях папок"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Заменять пробелы на символы подчёркивания в названиях папок."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Заменять точки в названиях папок"
|
||||
@@ -4472,14 +4478,6 @@ msgstr "Имя файла (необязательно)"
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr ""
|
||||
@@ -4568,6 +4566,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Сортировать по возрасту <small>от старых к новым</small>"
|
||||
@@ -4784,10 +4786,6 @@ msgid ""
|
||||
"Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Недопустимый адрес сервера."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Во время входа на сервер был выполнен выход."
|
||||
|
||||
100
po/main/sr.po
100
po/main/sr.po
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Serbian (https://www.transifex.com/sabnzbd/teams/111101/sr/)\n"
|
||||
@@ -137,14 +137,6 @@ msgstr "Гашење SABnzbd је завршено"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Signal %s primljen, snimanje i napuštanje..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -284,6 +276,10 @@ msgstr "%s nije ispravna email adresa"
|
||||
msgid "Server address required"
|
||||
msgstr "Потребна је адреса сервера"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Погрешна адреса сервера."
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -647,14 +643,6 @@ msgid ""
|
||||
msgstr ""
|
||||
"API кључ је погрешан, унети у спољни програм API кључ из Подешавања->Опште:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Недостаје аутентификација, унети у спољни програм име/лозинку из "
|
||||
"Подешавања->Опште:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Аутентификација погрешна, проверити име/лозинку."
|
||||
@@ -1200,27 +1188,27 @@ msgstr "Поништено, не може да се заврши"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Грешка увоза %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "ДУПЛИКАТ"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "ШИФРИРАНО"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "ПРЕВЕЛИКО"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "НЕПОТПУНО"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "NEŽELJENI"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "Чекање %s сек"
|
||||
|
||||
@@ -2159,10 +2147,6 @@ msgstr "Претрага"
|
||||
msgid "Download Dir"
|
||||
msgstr "Фасцикла преузимања"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Sysload"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Da li ste sigurni da želite ugasiti SABnzbd?"
|
||||
@@ -2457,6 +2441,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2737,12 +2725,17 @@ msgstr ""
|
||||
"Кеширати артикле у меморији. То смањује приступ диска.<br /><i>У бајтовима, "
|
||||
"опционо додати K,M,G. Пример: \"64M\" или \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3016,6 +3009,17 @@ msgstr ""
|
||||
"Локацију за ред и хронологију базе.<br /><i>Промене су могуће само када је "
|
||||
"ред празан.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr ""
|
||||
@@ -3206,16 +3210,6 @@ msgstr "U slučaju neuspeha, pokušaj sa alternativnim NZB-om"
|
||||
msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr "Neki serveri nude alternativni NZB pri neuspešnom preuzimanju"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Упали преименовање фасцикле"
|
||||
@@ -3268,6 +3262,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr ""
|
||||
@@ -3299,6 +3297,14 @@ msgstr "Размени размаке у имену фасцикле"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Размени <b>размаке</b> са <b>_</b> у имену фасцикле."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Размени тачке у имену фасцикле"
|
||||
@@ -4451,14 +4457,6 @@ msgstr "Опционо специфирати име"
|
||||
msgid "Submit"
|
||||
msgstr "Пошаљи"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Poslato. Hvala!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Mišta nije odabrano!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Ukloni sve odabrane fajlove"
|
||||
@@ -4547,6 +4545,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Среди по старост <small>Старије→Новије</small>"
|
||||
@@ -4762,10 +4764,6 @@ msgid ""
|
||||
"Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Погрешна адреса сервера."
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Сервер се затворио при пријављивање"
|
||||
|
||||
100
po/main/sv.po
100
po/main/sv.po
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Swedish (https://www.transifex.com/sabnzbd/teams/111101/sv/)\n"
|
||||
@@ -137,14 +137,6 @@ msgstr "SABnzbd nedstängning utförd."
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "Signal %s mottagen, sparar och stänger..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -284,6 +276,10 @@ msgstr "%s är inte en godkänd e-mail adress"
|
||||
msgid "Server address required"
|
||||
msgstr "Kräver serveradress"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ogiltig serveradress"
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -649,14 +645,6 @@ msgstr ""
|
||||
"API-nyckel felaktig, använd api-nyckeln från Konfiguration-> Allmänt i ditt "
|
||||
"tredjepartsprogram:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr ""
|
||||
"Autentisering saknas, ange användarnamn / lösenord från Konfiguration-> "
|
||||
"Allmänt i ditt tredjepartsprogram:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "Autentisering misslyckades, kontrollera användarnamn och lösenord."
|
||||
@@ -1204,27 +1192,27 @@ msgstr "Avbrutet, kan inte slutföras"
|
||||
msgid "Error importing %s"
|
||||
msgstr "Det gick inte att importera %s"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "DUBLETT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "KRYPTERAT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "FÖR STOR"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "INKOMPLETT"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "OÖNSKAD"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "VÄNTA %s SEKUNDER"
|
||||
|
||||
@@ -2165,10 +2153,6 @@ msgstr "Sök"
|
||||
msgid "Download Dir"
|
||||
msgstr "Temporär nedladdningmapp"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "Systembelastning"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "Är du säker på att du vill stänga av SABnzbd?"
|
||||
@@ -2463,6 +2447,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2746,12 +2734,17 @@ msgstr ""
|
||||
"Sparar artiklar i minnet för att reducera diskåtkomst.<br /><i>I bytes, "
|
||||
"följt av K,M,G. Till exempel: \"64M\" eller \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3027,6 +3020,17 @@ msgstr ""
|
||||
"Plats för köadministration och historiedatabas.<br /><i>Kan bara ändras när "
|
||||
"kön är tom.</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr "<i>Data kommer <b>inte</b> tas bort. Kräver omstart av SABnzbd!</i>"
|
||||
@@ -3216,16 +3220,6 @@ msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr ""
|
||||
"Vissa servrar kan förse en alternativ NZB när en nerladdning misslyckas"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "Döp om mappar"
|
||||
@@ -3278,6 +3272,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr ""
|
||||
@@ -3309,6 +3307,14 @@ msgstr "Ersätt mellanslag i mappnamn"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "Ersätt mellanslag med understreck i mappnamn."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "Ersätt punkter i mappnamn"
|
||||
@@ -4463,14 +4469,6 @@ msgstr "Alternativt ange ett filnamn"
|
||||
msgid "Submit"
|
||||
msgstr "Skicka"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "Skickat. Tack!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "Inget markerat!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "Ta bort alla markerade filer"
|
||||
@@ -4559,6 +4557,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortera efter ålder <small>Äldst→Nyast</small>"
|
||||
@@ -4776,10 +4778,6 @@ msgid ""
|
||||
"Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "Ogiltig serveradress"
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "Servern avslutades under inloggning"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2022\n"
|
||||
"Language-Team: Chinese (China) (https://www.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
|
||||
@@ -135,14 +135,6 @@ msgstr "SABnzbd 关闭完成"
|
||||
msgid "Signal %s caught, saving and exiting..."
|
||||
msgstr "捕捉到 %s 信号,正在保存并退出..."
|
||||
|
||||
#. Warning message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid ""
|
||||
"We are planning to remove the '%s' setting, which you have changed from the "
|
||||
"default value. Could you let us know why you made this change at: "
|
||||
"https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
msgstr ""
|
||||
|
||||
#. Error message
|
||||
#: sabnzbd/__init__.py
|
||||
msgid "Fatal error at saving state"
|
||||
@@ -282,6 +274,10 @@ msgstr "%s 不是有效的电子邮箱地址"
|
||||
msgid "Server address required"
|
||||
msgstr "服务器地址必填"
|
||||
|
||||
#: sabnzbd/cfg.py, sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "服务器地址无效。"
|
||||
|
||||
#: sabnzbd/cfg.py
|
||||
msgid "%s is not a valid script"
|
||||
msgstr ""
|
||||
@@ -642,12 +638,6 @@ msgid ""
|
||||
"program:"
|
||||
msgstr "API Key 不正确,请在第三方程序中使用“配置”->“常规”中的 api key:"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Authentication missing, please enter username/password from Config->General "
|
||||
"into your 3rd party program:"
|
||||
msgstr "缺身份认证信息,请在第三方程序中输入“配置”->“常规”中的用户名/密码:"
|
||||
|
||||
#: sabnzbd/interface.py, sabnzbd/newswrapper.py, sabnzbd/utils/servertests.py
|
||||
msgid "Authentication failed, check username/password."
|
||||
msgstr "身份认证失败,请检查用户名/密码。"
|
||||
@@ -1191,27 +1181,27 @@ msgstr "已中止,无法完成"
|
||||
msgid "Error importing %s"
|
||||
msgstr "导入 %s 出错"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "DUPLICATE"
|
||||
msgstr "*重复*"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "ENCRYPTED"
|
||||
msgstr "*加密*"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "TOO LARGE"
|
||||
msgstr "*太大*"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "INCOMPLETE"
|
||||
msgstr "*不完整*"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "UNWANTED"
|
||||
msgstr "不需要"
|
||||
|
||||
#: sabnzbd/nzbstuff.py, sabnzbd/skintext.py
|
||||
#: sabnzbd/nzbstuff.py
|
||||
msgid "WAIT %s sec"
|
||||
msgstr "*等待* %s 秒"
|
||||
|
||||
@@ -2150,10 +2140,6 @@ msgstr "搜索"
|
||||
msgid "Download Dir"
|
||||
msgstr "下载目录"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sysload"
|
||||
msgstr "系统负载"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Are you sure you want to shutdown SABnzbd?"
|
||||
msgstr "是否确定要关闭 SABnzbd?"
|
||||
@@ -2448,6 +2434,10 @@ msgstr ""
|
||||
msgid "Disk speed"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System load"
|
||||
msgstr ""
|
||||
|
||||
#. Do not translate Pystone
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "System Performance (Pystone)"
|
||||
@@ -2719,12 +2709,17 @@ msgid ""
|
||||
" follow with K,M,G. For example: \"64M\" or \"128M\"</i>"
|
||||
msgstr "在内存中缓存文章,以减轻硬盘访问压力。<br /><i>单位为字节,可以选择加上 K、M、G 后缀。例如: \"64M\" 或 \"128M\"</i>"
|
||||
|
||||
#. Config->Scheduling
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Download backup"
|
||||
msgid "Create backup"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Save or restore a backup of the configuration file and databases."
|
||||
msgid ""
|
||||
"Create a backup of the configuration file and databases in the Backup "
|
||||
"Folder.<br>If the Backup Folder is not set, the backup will be created in "
|
||||
"the Completed Download Folder.<br>Recurring backups can be configured on the"
|
||||
" Scheduling page."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -2981,6 +2976,17 @@ msgid ""
|
||||
"when queue is empty.</i>"
|
||||
msgstr "队列管理及历史数据库的存放位置。<br /><i>仅当队列为空时可以修改。</i>"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Backup Folder"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Location where the backups of the configuration file and databases are "
|
||||
"stored.<br />If left empty, the backup will be created in the Completed "
|
||||
"Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "<i>Data will <b>not</b> be moved. Requires SABnzbd restart!</i>"
|
||||
msgstr "<i>数据<b>不会</b>自动移动。需要重启 SABnzbd 才能生效!</i>"
|
||||
@@ -3163,16 +3169,6 @@ msgstr "失败时,尝试备用 NZB"
|
||||
msgid "Some servers provide an alternative NZB when a download fails."
|
||||
msgstr "部分服务器在下载失败时可提供备用 NZB 文件。"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Use tags from indexer"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"When sorting, use tags from indexer for title, season, episode, etc. "
|
||||
"Otherwise all naming is derived from the NZB name."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Enable folder rename"
|
||||
msgstr "启用文件夹重命名"
|
||||
@@ -3223,6 +3219,10 @@ msgstr ""
|
||||
msgid "Automatically sort jobs in the queue when a new job is added."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "The queue will resort every 30 seconds if % downloaded is selected."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Propagation delay"
|
||||
msgstr "传播延迟"
|
||||
@@ -3254,6 +3254,14 @@ msgstr "替换文件夹名称中的空格"
|
||||
msgid "Replace spaces with underscores in folder names."
|
||||
msgstr "将文件夹名称中的空格替换成下划线。"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores in folder name"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace underscores with dots in folder names."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Replace dots in Foldername"
|
||||
msgstr "替换文件夹名称中的点号"
|
||||
@@ -4398,14 +4406,6 @@ msgstr "可以选择指定文件名"
|
||||
msgid "Submit"
|
||||
msgstr "提交"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Submitted. Thank you!"
|
||||
msgstr "已提交。感谢!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Nothing selected!"
|
||||
msgstr "未选择任何内容!"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Remove all selected files"
|
||||
msgstr "移除已选文件"
|
||||
@@ -4494,6 +4494,10 @@ msgid ""
|
||||
" and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by % downloaded <small>Most→Least</small>"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "按发布时间排序 <small>最早→最新</small>"
|
||||
@@ -4706,10 +4710,6 @@ msgid ""
|
||||
"Unknown SSL protocol: Try disabling SSL or connecting on a different port."
|
||||
msgstr "未知的 SSL 协议:尝试禁用 SSL 或者连接不同的端口。"
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Invalid server address."
|
||||
msgstr "服务器地址无效。"
|
||||
|
||||
#: sabnzbd/utils/servertests.py
|
||||
msgid "Server quit during login sequence."
|
||||
msgstr "登录过程中服务器退出。"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: team@sabnzbd.org\n"
|
||||
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Pavel C <quoing_transifex@mess.cz>, 2022\n"
|
||||
"Language-Team: Czech (https://www.transifex.com/sabnzbd/teams/111101/cs/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Danish (https://www.transifex.com/sabnzbd/teams/111101/da/)\n"
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
# SABnzbd Translation Template file NSIS
|
||||
# Copyright 2007-2022 The SABnzbd-Team
|
||||
# team@sabnzbd.org
|
||||
#
|
||||
#
|
||||
# Translators:
|
||||
# Safihre <safihre@sabnzbd.org>, 2020
|
||||
# Simon W., 2021
|
||||
#
|
||||
# reloxx13 <reloxx@interia.pl>, 2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Simon W., 2021\n"
|
||||
"Last-Translator: reloxx13 <reloxx@interia.pl>, 2022\n"
|
||||
"Language-Team: German (https://www.transifex.com/sabnzbd/teams/111101/de/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -44,15 +44,15 @@ msgid ""
|
||||
"The installer only supports 64-bit Windows, use the standalone version to "
|
||||
"run on 32-bit Windows."
|
||||
msgstr ""
|
||||
"Der Installer unterstützt nur Windows 64-bit. Benutze die Standalone Version"
|
||||
" für Windows 32-bit."
|
||||
"Der Installer unterstützt nur Windows 64-Bit. Benutze die Portable Version "
|
||||
"für Windows 32-Bit."
|
||||
|
||||
#: builder/win/NSIS_Installer.nsi
|
||||
msgid ""
|
||||
"The installer only supports Windows 8.1 and above, use the standalone legacy"
|
||||
" version to run on older Windows version."
|
||||
msgstr ""
|
||||
"Der Installer unterstützt nur Windows 8.1 und höher. Benutze die standalone "
|
||||
"Der Installer unterstützt nur Windows 8.1 und höher. Benutze die Standalone-"
|
||||
"Version für ältere Windows Versionen."
|
||||
|
||||
#: builder/win/NSIS_Installer.nsi
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Ester Molla Aragones <moarages@gmail.com>, 2020\n"
|
||||
"Language-Team: Spanish (https://www.transifex.com/sabnzbd/teams/111101/es/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Finnish (https://www.transifex.com/sabnzbd/teams/111101/fi/)\n"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Fred L <88com88@gmail.com>, 2021\n"
|
||||
"Language-Team: French (https://www.transifex.com/sabnzbd/teams/111101/fr/)\n"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: ION, 2021\n"
|
||||
"Language-Team: Hebrew (https://www.transifex.com/sabnzbd/teams/111101/he/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Norwegian Bokmål (https://www.transifex.com/sabnzbd/teams/111101/nb/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2021\n"
|
||||
"Language-Team: Dutch (https://www.transifex.com/sabnzbd/teams/111101/nl/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Polish (https://www.transifex.com/sabnzbd/teams/111101/pl/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Romanian (https://www.transifex.com/sabnzbd/teams/111101/ro/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Russian (https://www.transifex.com/sabnzbd/teams/111101/ru/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Serbian (https://www.transifex.com/sabnzbd/teams/111101/sr/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Swedish (https://www.transifex.com/sabnzbd/teams/111101/sv/)\n"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-3.6.0RC2\n"
|
||||
"Project-Id-Version: SABnzbd-3.7.0Beta1\n"
|
||||
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2020\n"
|
||||
"Language-Team: Chinese (China) (https://www.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
# Main requirements
|
||||
# Note that not all sub-dependencies are listed, but only ones we know could cause trouble
|
||||
sabyenc3==5.4.2
|
||||
cheetah3==3.2.6 # pyup: ignore
|
||||
cffi==1.15
|
||||
sabyenc3==5.4.4
|
||||
cheetah3==3.2.6.post1
|
||||
cffi==1.15.1
|
||||
pycparser==2.21
|
||||
feedparser==6.0.10
|
||||
configobj==5.0.6
|
||||
cheroot==8.6.0
|
||||
six==1.16.0
|
||||
cherrypy==18.6.1
|
||||
jaraco.functools==3.5.0
|
||||
jaraco.collections==3.5.1
|
||||
jaraco.text==3.7.0
|
||||
jaraco.classes==3.2.1
|
||||
jaraco.context==4.1.1
|
||||
more-itertools==8.13.0
|
||||
cherrypy==18.8.0
|
||||
jaraco.functools==3.5.2
|
||||
jaraco.collections==3.6.0
|
||||
jaraco.text==3.8.1 # Newer version introduces irrelevant extra dependencies
|
||||
jaraco.classes==3.2.3
|
||||
jaraco.context==4.1.2
|
||||
more-itertools==9.0.0
|
||||
zc.lockfile==2.0
|
||||
python-dateutil==2.8.2
|
||||
tempora==5.0.1
|
||||
pytz==2022.1
|
||||
tempora==5.0.2
|
||||
pytz==2022.5
|
||||
sgmllib3k==1.0.0
|
||||
portend==3.1.0
|
||||
chardet==4.0.0
|
||||
chardet==5.0.0
|
||||
PySocks==1.7.1
|
||||
puremagic==1.14
|
||||
guessit==3.4.3
|
||||
@@ -30,17 +30,17 @@ rebulk==3.1.0
|
||||
|
||||
# Recent cryptography versions require Rust. If you run into issues compiling this
|
||||
# SABnzbd will also work with older pre-Rust versions such as cryptography==3.3.2
|
||||
cryptography==37.0.2
|
||||
cryptography==38.0.3
|
||||
|
||||
# We recommend using "orjson" as it is 2x as fast as "ujson". However, it requires
|
||||
# Rust so SABnzbd works just as well with "ujson" or the Python built in "json" module
|
||||
ujson==5.3.0
|
||||
ujson==5.5.0
|
||||
|
||||
# Windows system integration
|
||||
pywin32==304; sys_platform == 'win32'
|
||||
|
||||
# macOS system calls
|
||||
pyobjc==8.5; sys_platform == 'darwin'
|
||||
pyobjc==8.5.1; sys_platform == 'darwin'
|
||||
|
||||
# Linux notifications
|
||||
notify2==0.3.1; sys_platform != 'win32' and sys_platform != 'darwin'
|
||||
|
||||
@@ -317,27 +317,6 @@ def initialize(pause_downloader=False, clean_up=False, repair=0):
|
||||
cfg.cache_limit.set(misc.get_cache_limit())
|
||||
sabnzbd.ArticleCache.new_limit(cfg.cache_limit.get_int())
|
||||
|
||||
# Values we want to remove
|
||||
deprecated_options = [
|
||||
cfg.ampm,
|
||||
cfg.enable_meta,
|
||||
cfg.replace_illegal,
|
||||
cfg.html_login,
|
||||
cfg.osx_speed,
|
||||
cfg.allow_incomplete_nzb,
|
||||
cfg.disable_key,
|
||||
cfg.show_sysload,
|
||||
]
|
||||
for deprecated_option in deprecated_options:
|
||||
if deprecated_option() != deprecated_option.default:
|
||||
sabnzbd.misc.helpful_warning(
|
||||
T(
|
||||
"We are planning to remove the '%s' setting, which you have changed from the default value. "
|
||||
"Could you let us know why you made this change at: https://github.com/sabnzbd/sabnzbd/discussions"
|
||||
),
|
||||
deprecated_option.keyword,
|
||||
)
|
||||
|
||||
logging.info("All processes started")
|
||||
sabnzbd.RESTART_REQ = False
|
||||
sabnzbd.__INITIALIZED__ = True
|
||||
@@ -533,6 +512,9 @@ def check_all_tasks():
|
||||
# Check (and terminate) idle jobs
|
||||
sabnzbd.NzbQueue.stop_idle_jobs()
|
||||
|
||||
# Check that the queue is sorted correctly
|
||||
sabnzbd.NzbQueue.update_sort_order()
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
@@ -258,16 +258,28 @@ def _api_queue_sort(value, kwargs):
|
||||
|
||||
|
||||
def _api_queue_default(value, kwargs):
|
||||
"""API: accepts sort, dir, start, limit"""
|
||||
"""API: accepts sort, dir, start, limit and search terms"""
|
||||
start = int_conv(kwargs.get("start"))
|
||||
limit = int_conv(kwargs.get("limit"))
|
||||
search = kwargs.get("search")
|
||||
categories = kwargs.get("cat") or kwargs.get("category")
|
||||
priorities = kwargs.get("priority")
|
||||
nzo_ids = kwargs.get("nzo_ids")
|
||||
|
||||
if categories and not isinstance(categories, list):
|
||||
categories = categories.split(",")
|
||||
if priorities and not isinstance(priorities, list):
|
||||
# Make sure it's an integer
|
||||
priorities = [int_conv(prio) for prio in priorities.split(",")]
|
||||
if nzo_ids and not isinstance(nzo_ids, list):
|
||||
nzo_ids = nzo_ids.split(",")
|
||||
|
||||
return report(keyword="queue", data=build_queue(start=start, limit=limit, search=search, nzo_ids=nzo_ids))
|
||||
return report(
|
||||
keyword="queue",
|
||||
data=build_queue(
|
||||
start=start, limit=limit, search=search, categories=categories, priorities=priorities, nzo_ids=nzo_ids
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
def _api_translate(name, kwargs):
|
||||
@@ -474,7 +486,7 @@ def _api_history(name, kwargs):
|
||||
return report(keyword="history", data=False)
|
||||
|
||||
if categories and not isinstance(categories, list):
|
||||
categories = [categories]
|
||||
categories = categories.split(",")
|
||||
|
||||
if nzo_ids and not isinstance(nzo_ids, list):
|
||||
nzo_ids = nzo_ids.split(",")
|
||||
@@ -668,19 +680,15 @@ def _api_version(name, kwargs):
|
||||
|
||||
|
||||
def _api_auth(name, kwargs):
|
||||
auth = "None"
|
||||
if not cfg.disable_key():
|
||||
key = kwargs.get("key", "")
|
||||
if not key:
|
||||
auth = "apikey"
|
||||
else:
|
||||
auth = "badkey"
|
||||
key = kwargs.get("key", "")
|
||||
if not key:
|
||||
if key == cfg.nzb_key():
|
||||
auth = "nzbkey"
|
||||
if key == cfg.api_key():
|
||||
auth = "apikey"
|
||||
else:
|
||||
if key == cfg.nzb_key():
|
||||
auth = "nzbkey"
|
||||
if key == cfg.api_key():
|
||||
auth = "apikey"
|
||||
elif cfg.username() and cfg.password():
|
||||
auth = "login"
|
||||
return report(keyword="auth", data=auth)
|
||||
|
||||
|
||||
@@ -898,6 +906,11 @@ def _api_config_test_server(kwargs):
|
||||
return report(data={"result": result, "message": msg})
|
||||
|
||||
|
||||
def _api_config_create_backup(kwargs):
|
||||
backup_file = config.create_config_backup()
|
||||
return report(data={"result": bool(backup_file), "message": backup_file})
|
||||
|
||||
|
||||
def _api_config_undefined(kwargs):
|
||||
return report(_MSG_NOT_IMPLEMENTED)
|
||||
|
||||
@@ -1011,6 +1024,7 @@ _api_config_table = {
|
||||
"set_nzbkey": (_api_config_set_nzbkey, 3),
|
||||
"regenerate_certs": (_api_config_regenerate_certs, 3),
|
||||
"test_server": (_api_config_test_server, 3),
|
||||
"create_backup": (_api_config_create_backup, 3),
|
||||
}
|
||||
|
||||
|
||||
@@ -1084,9 +1098,6 @@ class XmlOutputFactory:
|
||||
In Three tiered lists hard-coded name of "slot": <tier1><slot><tier2> </tier2></slot></tier1>
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.__text = ""
|
||||
|
||||
def _tuple(self, keyw, lst):
|
||||
text = []
|
||||
for item in lst:
|
||||
@@ -1235,7 +1246,8 @@ def build_status(calculate_performance: bool = False, skip_dashboard: bool = Fal
|
||||
info["delayed_decoder"] = sabnzbd.BPSMeter.delayed_decoder
|
||||
info["delayed_assembler"] = sabnzbd.BPSMeter.delayed_assembler
|
||||
|
||||
# Dashboard: Speed of System
|
||||
# Dashboard: Speed and load of System
|
||||
info["loadavg"] = loadavg()
|
||||
info["pystone"] = sabnzbd.PYSTONE_SCORE
|
||||
|
||||
# Dashboard: Speed of Download directory:
|
||||
@@ -1299,7 +1311,14 @@ def build_status(calculate_performance: bool = False, skip_dashboard: bool = Fal
|
||||
return info
|
||||
|
||||
|
||||
def build_queue(start: int = 0, limit: int = 0, search: Optional[str] = None, nzo_ids: Optional[List[str]] = None):
|
||||
def build_queue(
|
||||
start: int = 0,
|
||||
limit: int = 0,
|
||||
search: Optional[str] = None,
|
||||
categories: Optional[List[str]] = None,
|
||||
priorities: Optional[List[str]] = None,
|
||||
nzo_ids: Optional[List[str]] = None,
|
||||
):
|
||||
info = build_header(for_template=False)
|
||||
(
|
||||
queue_bytes_total,
|
||||
@@ -1308,7 +1327,9 @@ def build_queue(start: int = 0, limit: int = 0, search: Optional[str] = None, nz
|
||||
nzo_list,
|
||||
queue_fullsize,
|
||||
nzos_matched,
|
||||
) = sabnzbd.NzbQueue.queue_info(search=search, nzo_ids=nzo_ids, start=start, limit=limit)
|
||||
) = sabnzbd.NzbQueue.queue_info(
|
||||
search=search, categories=categories, priorities=priorities, nzo_ids=nzo_ids, start=start, limit=limit
|
||||
)
|
||||
|
||||
info["kbpersec"] = "%.2f" % (sabnzbd.BPSMeter.bps / KIBI)
|
||||
info["speed"] = to_units(sabnzbd.BPSMeter.bps)
|
||||
@@ -1320,7 +1341,7 @@ def build_queue(start: int = 0, limit: int = 0, search: Optional[str] = None, nz
|
||||
info["noofslots"] = nzos_matched
|
||||
info["start"] = start
|
||||
info["limit"] = limit
|
||||
info["finish"] = info["start"] + info["limit"]
|
||||
info["finish"] = start + limit
|
||||
|
||||
if sabnzbd.Downloader.paused or sabnzbd.Downloader.paused_for_postproc:
|
||||
status = Status.PAUSED
|
||||
@@ -1330,8 +1351,6 @@ def build_queue(start: int = 0, limit: int = 0, search: Optional[str] = None, nz
|
||||
status = Status.IDLE
|
||||
info["status"] = status
|
||||
info["timeleft"] = calc_timeleft(queue_bytes_left, sabnzbd.BPSMeter.bps)
|
||||
info["scripts"] = list_scripts()
|
||||
info["categories"] = list_cats()
|
||||
|
||||
n = start
|
||||
running_bytes = bytes_left_previous_page
|
||||
@@ -1362,7 +1381,7 @@ def build_queue(start: int = 0, limit: int = 0, search: Optional[str] = None, nz
|
||||
if not sabnzbd.Downloader.paused and nzo.status not in (Status.PAUSED, Status.FETCHING, Status.GRABBING):
|
||||
if is_propagating:
|
||||
slot["status"] = Status.PROP
|
||||
elif status == Status.CHECKING:
|
||||
elif nzo.status == Status.CHECKING:
|
||||
slot["status"] = Status.CHECKING
|
||||
else:
|
||||
slot["status"] = Status.DOWNLOADING
|
||||
@@ -1524,15 +1543,6 @@ def clear_trans_cache():
|
||||
|
||||
def build_header(webdir: str = "", for_template: bool = True, trans_functions: bool = True) -> Dict:
|
||||
"""Build the basic header"""
|
||||
speed_limit = sabnzbd.Downloader.get_limit()
|
||||
if speed_limit <= 0:
|
||||
speed_limit = 100
|
||||
speed_limit_abs = sabnzbd.Downloader.get_limit_abs()
|
||||
if speed_limit_abs <= 0:
|
||||
speed_limit_abs = ""
|
||||
|
||||
diskspace_info = diskspace()
|
||||
|
||||
header = {}
|
||||
|
||||
# We don't output everything for API
|
||||
@@ -1569,15 +1579,15 @@ def build_header(webdir: str = "", for_template: bool = True, trans_functions: b
|
||||
header["pause_int"] = sabnzbd.Scheduler.pause_int()
|
||||
header["paused_all"] = sabnzbd.PAUSED_ALL
|
||||
|
||||
diskspace_info = diskspace()
|
||||
header["diskspace1"] = "%.2f" % diskspace_info["download_dir"][1]
|
||||
header["diskspace2"] = "%.2f" % diskspace_info["complete_dir"][1]
|
||||
header["diskspace1_norm"] = to_units(diskspace_info["download_dir"][1] * GIGI)
|
||||
header["diskspace2_norm"] = to_units(diskspace_info["complete_dir"][1] * GIGI)
|
||||
header["diskspacetotal1"] = "%.2f" % diskspace_info["download_dir"][0]
|
||||
header["diskspacetotal2"] = "%.2f" % diskspace_info["complete_dir"][0]
|
||||
header["loadavg"] = loadavg()
|
||||
header["speedlimit"] = "{1:0.{0}f}".format(int(speed_limit % 1 > 0), speed_limit)
|
||||
header["speedlimit_abs"] = "%s" % speed_limit_abs
|
||||
header["speedlimit"] = str(sabnzbd.Downloader.bandwidth_perc)
|
||||
header["speedlimit_abs"] = str(sabnzbd.Downloader.bandwidth_limit)
|
||||
|
||||
header["have_warnings"] = str(sabnzbd.GUIHANDLER.count())
|
||||
header["finishaction"] = sabnzbd.QUEUECOMPLETE
|
||||
|
||||
@@ -132,7 +132,8 @@ class Assembler(Thread):
|
||||
|
||||
@staticmethod
|
||||
def diskspace_check(nzo: NzbObject, nzf: NzbFile):
|
||||
"""Check diskspace requirements. If not enough space left, pause downloader and send email"""
|
||||
"""Check diskspace requirements.
|
||||
If not enough space left, pause downloader and send email"""
|
||||
freespace = diskspace(force=True)
|
||||
full_dir = None
|
||||
required_space = (cfg.download_free.get_float() + nzf.bytes) / GIGI
|
||||
@@ -144,11 +145,13 @@ class Assembler(Thread):
|
||||
if complete_free > 0 and not full_dir:
|
||||
required_space = 0
|
||||
if cfg.direct_unpack():
|
||||
required_space = (complete_free + nzo.bytes_downloaded) / GIGI
|
||||
else:
|
||||
# Continue downloading until 95% complete before checking
|
||||
if nzo.bytes_tried > (nzo.bytes - nzo.bytes_par2) * 0.95:
|
||||
required_space = (complete_free + nzo.bytes) / GIGI
|
||||
# We unpack while we download, so we should check every time
|
||||
# if the unpack maybe already filled up the drive
|
||||
required_space = complete_free / GIGI
|
||||
elif nzo.bytes_tried > (nzo.bytes - nzo.bytes_par2) * 0.95:
|
||||
# Since only at 100% unpack is started, continue
|
||||
# downloading until 95% complete before checking
|
||||
required_space = (complete_free + nzo.bytes) / GIGI
|
||||
|
||||
if required_space and freespace["complete_dir"][1] < required_space:
|
||||
full_dir = "complete_dir"
|
||||
|
||||
@@ -391,10 +391,10 @@ class BPSMeter:
|
||||
def get_sums(self):
|
||||
"""return tuple of grand, month, week, day totals"""
|
||||
return (
|
||||
sum([v for v in self.grand_total.values()]),
|
||||
sum([v for v in self.month_total.values()]),
|
||||
sum([v for v in self.week_total.values()]),
|
||||
sum([v for v in self.day_total.values()]),
|
||||
sum(self.grand_total.values()),
|
||||
sum(self.month_total.values()),
|
||||
sum(self.week_total.values()),
|
||||
sum(self.day_total.values()),
|
||||
)
|
||||
|
||||
def amounts(self, server: str):
|
||||
|
||||
@@ -22,6 +22,8 @@ sabnzbd.cfg - Configuration Parameters
|
||||
import logging
|
||||
import re
|
||||
import argparse
|
||||
import socket
|
||||
import ipaddress
|
||||
from typing import List, Tuple
|
||||
|
||||
import sabnzbd
|
||||
@@ -147,6 +149,48 @@ def validate_server(value):
|
||||
return None, value
|
||||
|
||||
|
||||
def validate_host(value):
|
||||
"""Check if host is valid: an IP address, or a name/FQDN that resolves to an IP address"""
|
||||
|
||||
# easy: value is a plain IPv4 or IPv6 address:
|
||||
try:
|
||||
ipaddress.ip_address(value)
|
||||
# valid host, so return it
|
||||
return None, value
|
||||
except:
|
||||
pass
|
||||
|
||||
# we don't want a plain number. As socket.getaddrinfo("100", ...) allows that, we have to pre-check
|
||||
try:
|
||||
int(value)
|
||||
# plain int as input, which is not allowed
|
||||
return T("Invalid server address."), None
|
||||
except:
|
||||
pass
|
||||
|
||||
# not a plain IPv4 nor IPv6 address, so let's check if it's a name that resolves to IPv4
|
||||
try:
|
||||
socket.getaddrinfo(value, None, socket.AF_INET)
|
||||
# all good
|
||||
logging.debug("Valid host name")
|
||||
return None, value
|
||||
except:
|
||||
pass
|
||||
|
||||
# ... and if not: does it resolve to IPv6 ... ?
|
||||
try:
|
||||
socket.getaddrinfo(value, None, socket.AF_INET6)
|
||||
# all good
|
||||
logging.debug("Valid host name")
|
||||
return None, value
|
||||
except:
|
||||
logging.debug("No valid host name")
|
||||
pass
|
||||
|
||||
# if we get here, it is not valid host, so return None
|
||||
return T("Invalid server address."), None
|
||||
|
||||
|
||||
def validate_script(value):
|
||||
"""Check if value is a valid script"""
|
||||
if not sabnzbd.__INITIALIZED__ or (value and sabnzbd.filesystem.is_valid_script(value)):
|
||||
@@ -226,7 +270,7 @@ version_check = OptionNumber("misc", "check_new_rel", 1)
|
||||
autobrowser = OptionBool("misc", "auto_browser", True)
|
||||
language = OptionStr("misc", "language", "en")
|
||||
enable_https_verification = OptionBool("misc", "enable_https_verification", True)
|
||||
cherryhost = OptionStr("misc", "host", DEF_HOST)
|
||||
cherryhost = OptionStr("misc", "host", DEF_HOST, validation=validate_host)
|
||||
cherryport = OptionStr("misc", "port", DEF_PORT)
|
||||
https_port = OptionStr("misc", "https_port")
|
||||
username = OptionStr("misc", "username")
|
||||
@@ -261,6 +305,7 @@ fulldisk_autoresume = OptionBool("misc", "fulldisk_autoresume", False)
|
||||
script_dir = OptionDir("misc", "script_dir", writable=False)
|
||||
nzb_backup_dir = OptionDir("misc", "nzb_backup_dir", DEF_NZBBACK_DIR)
|
||||
admin_dir = OptionDir("misc", "admin_dir", DEF_ADMIN_DIR, validation=validate_safedir)
|
||||
backup_dir = OptionDir("misc", "backup_dir")
|
||||
dirscan_dir = OptionDir("misc", "dirscan_dir", writable=False)
|
||||
dirscan_speed = OptionNumber("misc", "dirscan_speed", DEF_SCANRATE, minval=0, maxval=3600)
|
||||
password_file = OptionDir("misc", "password_file", "", create=False)
|
||||
@@ -296,6 +341,7 @@ direct_unpack = OptionBool("misc", "direct_unpack", False)
|
||||
propagation_delay = OptionNumber("misc", "propagation_delay", 0)
|
||||
folder_rename = OptionBool("misc", "folder_rename", True)
|
||||
replace_spaces = OptionBool("misc", "replace_spaces", False)
|
||||
replace_underscores = OptionBool("misc", "replace_underscores", False)
|
||||
replace_dots = OptionBool("misc", "replace_dots", False)
|
||||
safe_postproc = OptionBool("misc", "safe_postproc", True)
|
||||
pause_on_post_processing = OptionBool("misc", "pause_on_post_processing", False)
|
||||
@@ -307,7 +353,6 @@ action_on_unwanted_extensions = OptionNumber("misc", "action_on_unwanted_extensi
|
||||
unwanted_extensions_mode = OptionNumber("misc", "unwanted_extensions_mode", 0)
|
||||
new_nzb_on_failure = OptionBool("misc", "new_nzb_on_failure", False)
|
||||
history_retention = OptionStr("misc", "history_retention", "0")
|
||||
enable_meta = OptionBool("misc", "enable_meta", True)
|
||||
|
||||
quota_size = OptionStr("misc", "quota_size")
|
||||
quota_day = OptionStr("misc", "quota_day")
|
||||
@@ -341,7 +386,6 @@ rss_rate = OptionNumber("misc", "rss_rate", 60, minval=15, maxval=24 * 60)
|
||||
##############################################################################
|
||||
# Bool switches
|
||||
ampm = OptionBool("misc", "ampm", False)
|
||||
replace_illegal = OptionBool("misc", "replace_illegal", True)
|
||||
start_paused = OptionBool("misc", "start_paused", False)
|
||||
preserve_paused_state = OptionBool("misc", "preserve_paused_state", False)
|
||||
enable_par_cleanup = OptionBool("misc", "enable_par_cleanup", True)
|
||||
@@ -359,17 +403,14 @@ wait_for_dfolder = OptionBool("misc", "wait_for_dfolder", False)
|
||||
rss_filenames = OptionBool("misc", "rss_filenames", False)
|
||||
api_logging = OptionBool("misc", "api_logging", True)
|
||||
html_login = OptionBool("misc", "html_login", True)
|
||||
osx_menu = OptionBool("misc", "osx_menu", True)
|
||||
osx_speed = OptionBool("misc", "osx_speed", True)
|
||||
warn_dupl_jobs = OptionBool("misc", "warn_dupl_jobs", True)
|
||||
helpful_warnings = OptionBool("misc", "helpful_warnings", True)
|
||||
keep_awake = OptionBool("misc", "keep_awake", True)
|
||||
win_menu = OptionBool("misc", "win_menu", True)
|
||||
tray_icon = OptionBool("misc", "tray_icon", True)
|
||||
allow_incomplete_nzb = OptionBool("misc", "allow_incomplete_nzb", False)
|
||||
enable_broadcast = OptionBool("misc", "enable_broadcast", True)
|
||||
ipv6_hosting = OptionBool("misc", "ipv6_hosting", False)
|
||||
api_warnings = OptionBool("misc", "api_warnings", True, protect=True)
|
||||
disable_key = OptionBool("misc", "disable_api_key", False, protect=True)
|
||||
no_penalties = OptionBool("misc", "no_penalties", False)
|
||||
x_frame_options = OptionBool("misc", "x_frame_options", True)
|
||||
allow_old_ssl_tls = OptionBool("misc", "allow_old_ssl_tls", False)
|
||||
@@ -382,7 +423,6 @@ selftest_host = OptionStr("misc", "selftest_host", "self-test.sabnzbd.org")
|
||||
movie_rename_limit = OptionStr("misc", "movie_rename_limit", "100M")
|
||||
episode_rename_limit = OptionStr("misc", "episode_rename_limit", "20M")
|
||||
size_limit = OptionStr("misc", "size_limit", "0")
|
||||
show_sysload = OptionNumber("misc", "show_sysload", 2, minval=0, maxval=2)
|
||||
direct_unpack_threads = OptionNumber("misc", "direct_unpack_threads", 3, minval=1)
|
||||
history_limit = OptionNumber("misc", "history_limit", 10, minval=0)
|
||||
wait_ext_drive = OptionNumber("misc", "wait_ext_drive", 5, minval=1, maxval=60)
|
||||
@@ -547,6 +587,7 @@ def set_root_folders(home, lcldata):
|
||||
script_dir.set_root(home)
|
||||
nzb_backup_dir.set_root(lcldata)
|
||||
admin_dir.set_root(lcldata)
|
||||
backup_dir.set_root(home)
|
||||
dirscan_dir.set_root(home)
|
||||
log_dir.set_root(lcldata)
|
||||
password_file.set_root(home)
|
||||
|
||||
@@ -24,6 +24,7 @@ import os
|
||||
import re
|
||||
import shutil
|
||||
import threading
|
||||
import time
|
||||
import uuid
|
||||
import io
|
||||
import zipfile
|
||||
@@ -649,12 +650,15 @@ class ConfigRSS:
|
||||
"""Remove from database"""
|
||||
delete_from_database("rss", self.__name)
|
||||
|
||||
def rename(self, new_name: str):
|
||||
def rename(self, new_name: str) -> str:
|
||||
"""Update the name and the saved entries"""
|
||||
# Sanitize the name before using it
|
||||
new_name = clean_section_name(new_name)
|
||||
delete_from_database("rss", self.__name)
|
||||
sabnzbd.RSSReader.rename(self.__name, new_name)
|
||||
self.__name = new_name
|
||||
add_to_database("rss", self.__name, self)
|
||||
return self.__name
|
||||
|
||||
|
||||
# Add typing to the options database-dict
|
||||
@@ -917,20 +921,33 @@ def save_config(force=False):
|
||||
return res
|
||||
|
||||
|
||||
def create_config_backup():
|
||||
"""Put config data in a zip file"""
|
||||
adminpath = sabnzbd.cfg.admin_dir.get_path()
|
||||
logging.debug("Backing up %s + %s", adminpath, CFG_OBJ.filename)
|
||||
with io.BytesIO() as zip_buffer:
|
||||
with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zip_ref:
|
||||
for filename in CONFIG_BACKUP_FILES:
|
||||
full_path = os.path.join(adminpath, filename)
|
||||
if os.path.isfile(full_path):
|
||||
with open(full_path, "rb") as data:
|
||||
zip_ref.writestr(filename, data.read())
|
||||
with open(CFG_OBJ.filename, "rb") as data:
|
||||
zip_ref.writestr(DEF_INI_FILE, data.read())
|
||||
return zip_buffer.getvalue()
|
||||
def create_config_backup() -> Union[str, bool]:
|
||||
"""Put config data in a zip file, returns path on success"""
|
||||
admin_path = sabnzbd.cfg.admin_dir.get_path()
|
||||
output_filename = "sabnzbd_backup_%s_%s.zip" % (sabnzbd.__version__, time.strftime("%Y.%m.%d_%H.%M.%S"))
|
||||
|
||||
# Check if there is a backup folder set, use complete otherwise
|
||||
if sabnzbd.cfg.backup_dir():
|
||||
backup_dir = sabnzbd.cfg.backup_dir.get_path()
|
||||
else:
|
||||
backup_dir = sabnzbd.cfg.complete_dir.get_path()
|
||||
complete_path = os.path.join(backup_dir, output_filename)
|
||||
logging.debug("Backing up %s + %s in %s", admin_path, CFG_OBJ.filename, complete_path)
|
||||
|
||||
try:
|
||||
with open(complete_path, "wb") as zip_buffer:
|
||||
with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zip_ref:
|
||||
for filename in CONFIG_BACKUP_FILES:
|
||||
full_path = os.path.join(admin_path, filename)
|
||||
if os.path.isfile(full_path):
|
||||
with open(full_path, "rb") as data:
|
||||
zip_ref.writestr(filename, data.read())
|
||||
with open(CFG_OBJ.filename, "rb") as data:
|
||||
zip_ref.writestr(DEF_INI_FILE, data.read())
|
||||
return clip_path(complete_path)
|
||||
except:
|
||||
logging.info("Failed to create backup: ", exc_info=True)
|
||||
return False
|
||||
|
||||
|
||||
def validate_config_backup(config_backup_data: bytes) -> bool:
|
||||
@@ -945,7 +962,7 @@ def validate_config_backup(config_backup_data: bytes) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
def restore_config_backup(config_backup_data: bytes) -> bool:
|
||||
def restore_config_backup(config_backup_data: bytes):
|
||||
"""Restore configuration files from zip file"""
|
||||
try:
|
||||
with io.BytesIO(config_backup_data) as backup_ref:
|
||||
|
||||
@@ -36,7 +36,6 @@ GIGI = float(2**30)
|
||||
MEBI = float(2**20)
|
||||
KIBI = float(2**10)
|
||||
|
||||
BYTES_FILE_NAME_OLD = "totals9.sab"
|
||||
BYTES_FILE_NAME = "totals10.sab"
|
||||
QUEUE_FILE_TMPL = "queue%s.sab"
|
||||
QUEUE_FILE_NAME = QUEUE_FILE_TMPL % QUEUE_VERSION
|
||||
@@ -50,7 +49,7 @@ RENAMES_FILE = "__renames__"
|
||||
ATTRIB_FILE = "SABnzbd_attrib"
|
||||
REPAIR_REQUEST = "repair-all.sab"
|
||||
|
||||
SABYENC_VERSION_REQUIRED = "5.4.2"
|
||||
SABYENC_VERSION_REQUIRED = "5.4.4"
|
||||
|
||||
DB_HISTORY_VERSION = 1
|
||||
DB_HISTORY_NAME = "history%s.db" % DB_HISTORY_VERSION
|
||||
|
||||
@@ -26,7 +26,8 @@ import logging
|
||||
import sys
|
||||
import threading
|
||||
import sqlite3
|
||||
from typing import Union, Dict, Optional, List
|
||||
from sqlite3 import Connection, Cursor
|
||||
from typing import Union, Dict, Optional, List, Sequence
|
||||
|
||||
import sabnzbd
|
||||
import sabnzbd.cfg
|
||||
@@ -76,7 +77,8 @@ class HistoryDB:
|
||||
@synchronized(DB_LOCK)
|
||||
def __init__(self):
|
||||
"""Determine databse path and create connection"""
|
||||
self.con = self.c = None
|
||||
self.connection: Optional[Connection] = None
|
||||
self.cursor: Optional[Cursor] = None
|
||||
if not HistoryDB.db_path:
|
||||
HistoryDB.db_path = os.path.join(sabnzbd.cfg.admin_dir.get_path(), DB_HISTORY_NAME)
|
||||
self.connect()
|
||||
@@ -84,9 +86,9 @@ class HistoryDB:
|
||||
def connect(self):
|
||||
"""Create a connection to the database"""
|
||||
create_table = not os.path.exists(HistoryDB.db_path)
|
||||
self.con = sqlite3.connect(HistoryDB.db_path)
|
||||
self.con.row_factory = sqlite3.Row
|
||||
self.c = self.con.cursor()
|
||||
self.connection = sqlite3.connect(HistoryDB.db_path)
|
||||
self.connection.row_factory = sqlite3.Row
|
||||
self.cursor = self.connection.cursor()
|
||||
if create_table:
|
||||
self.create_history_db()
|
||||
elif not HistoryDB.done_cleaning:
|
||||
@@ -98,7 +100,7 @@ class HistoryDB:
|
||||
|
||||
self.execute("PRAGMA user_version;")
|
||||
try:
|
||||
version = self.c.fetchone()["user_version"]
|
||||
version = self.cursor.fetchone()["user_version"]
|
||||
except IndexError:
|
||||
version = 0
|
||||
if version < 1:
|
||||
@@ -116,16 +118,13 @@ class HistoryDB:
|
||||
'ALTER TABLE "history" ADD COLUMN password TEXT;'
|
||||
)
|
||||
|
||||
def execute(self, command, args=(), save=False):
|
||||
def execute(self, command: str, args: Sequence = (), save: bool = False) -> bool:
|
||||
"""Wrapper for executing SQL commands"""
|
||||
for tries in range(5, 0, -1):
|
||||
try:
|
||||
if args and isinstance(args, tuple):
|
||||
self.c.execute(command, args)
|
||||
else:
|
||||
self.c.execute(command)
|
||||
self.cursor.execute(command, args)
|
||||
if save:
|
||||
self.con.commit()
|
||||
self.connection.commit()
|
||||
return True
|
||||
except:
|
||||
error = str(sys.exc_info()[1])
|
||||
@@ -155,7 +154,7 @@ class HistoryDB:
|
||||
logging.info("Arguments: %s", repr(args))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
try:
|
||||
self.con.rollback()
|
||||
self.connection.rollback()
|
||||
except:
|
||||
logging.debug("Rollback Failed:", exc_info=True)
|
||||
return False
|
||||
@@ -200,8 +199,8 @@ class HistoryDB:
|
||||
def close(self):
|
||||
"""Close database connection"""
|
||||
try:
|
||||
self.c.close()
|
||||
self.con.close()
|
||||
self.cursor.close()
|
||||
self.connection.close()
|
||||
except:
|
||||
logging.error(T("Failed to close database, see log"))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -221,7 +220,7 @@ class HistoryDB:
|
||||
"""SELECT path FROM history WHERE name LIKE ? AND status = ?""", (search, Status.FAILED)
|
||||
)
|
||||
if fetch_ok:
|
||||
return [item["path"] for item in self.c.fetchall()]
|
||||
return [item["path"] for item in self.cursor.fetchall()]
|
||||
else:
|
||||
return []
|
||||
|
||||
@@ -322,8 +321,8 @@ class HistoryDB:
|
||||
|
||||
cmd = "SELECT COUNT(*) FROM history WHERE name LIKE ?"
|
||||
total_items = -1
|
||||
if self.execute(cmd + post, tuple(command_args)):
|
||||
total_items = self.c.fetchone()["COUNT(*)"]
|
||||
if self.execute(cmd + post, command_args):
|
||||
total_items = self.cursor.fetchone()["COUNT(*)"]
|
||||
|
||||
if not start:
|
||||
start = 0
|
||||
@@ -332,8 +331,8 @@ class HistoryDB:
|
||||
|
||||
command_args.extend([start, limit])
|
||||
cmd = "SELECT * FROM history WHERE name LIKE ?"
|
||||
if self.execute(cmd + post + " ORDER BY completed desc LIMIT ?, ?", tuple(command_args)):
|
||||
items = self.c.fetchall()
|
||||
if self.execute(cmd + post + " ORDER BY completed desc LIMIT ?, ?", command_args):
|
||||
items = self.cursor.fetchall()
|
||||
else:
|
||||
items = []
|
||||
|
||||
@@ -351,7 +350,7 @@ class HistoryDB:
|
||||
if self.execute(
|
||||
"""SELECT COUNT(*) FROM History WHERE series = ? AND STATUS != ?""", (pattern, Status.FAILED)
|
||||
):
|
||||
total = self.c.fetchone()["COUNT(*)"]
|
||||
total = self.cursor.fetchone()["COUNT(*)"]
|
||||
return total > 0
|
||||
|
||||
def have_name_or_md5sum(self, name: str, md5sum: str) -> bool:
|
||||
@@ -361,7 +360,7 @@ class HistoryDB:
|
||||
"""SELECT COUNT(*) FROM History WHERE ( LOWER(name) = LOWER(?) OR md5sum = ? ) AND STATUS != ?""",
|
||||
(name, md5sum, Status.FAILED),
|
||||
):
|
||||
total = self.c.fetchone()["COUNT(*)"]
|
||||
total = self.cursor.fetchone()["COUNT(*)"]
|
||||
return total > 0
|
||||
|
||||
def get_history_size(self):
|
||||
@@ -371,21 +370,21 @@ class HistoryDB:
|
||||
# Total Size of the history
|
||||
total = 0
|
||||
if self.execute("""SELECT sum(bytes) FROM history"""):
|
||||
total = self.c.fetchone()["sum(bytes)"]
|
||||
total = self.cursor.fetchone()["sum(bytes)"]
|
||||
|
||||
# Amount downloaded this month
|
||||
month_timest = int(this_month(time.time()))
|
||||
|
||||
month = 0
|
||||
if self.execute("""SELECT sum(bytes) FROM history WHERE completed > ?""", (month_timest,)):
|
||||
month = self.c.fetchone()["sum(bytes)"]
|
||||
month = self.cursor.fetchone()["sum(bytes)"]
|
||||
|
||||
# Amount downloaded this week
|
||||
week_timest = int(this_week(time.time()))
|
||||
|
||||
week = 0
|
||||
if self.execute("""SELECT sum(bytes) FROM history WHERE completed > ?""", (week_timest,)):
|
||||
week = self.c.fetchone()["sum(bytes)"]
|
||||
week = self.cursor.fetchone()["sum(bytes)"]
|
||||
|
||||
return total, month, week
|
||||
|
||||
@@ -395,7 +394,7 @@ class HistoryDB:
|
||||
t = (nzo_id,)
|
||||
if self.execute("""SELECT script_log FROM history WHERE nzo_id = ?""", t):
|
||||
try:
|
||||
data = ubtou(zlib.decompress(self.c.fetchone()["script_log"]))
|
||||
data = ubtou(zlib.decompress(self.cursor.fetchone()["script_log"]))
|
||||
except:
|
||||
pass
|
||||
return data
|
||||
@@ -406,7 +405,7 @@ class HistoryDB:
|
||||
name = ""
|
||||
if self.execute("""SELECT name FROM history WHERE nzo_id = ?""", t):
|
||||
try:
|
||||
name = self.c.fetchone()["name"]
|
||||
name = self.cursor.fetchone()["name"]
|
||||
except TypeError:
|
||||
# No records found
|
||||
pass
|
||||
@@ -418,7 +417,7 @@ class HistoryDB:
|
||||
path = ""
|
||||
if self.execute("""SELECT path FROM history WHERE nzo_id = ?""", t):
|
||||
try:
|
||||
path = self.c.fetchone()["path"]
|
||||
path = self.cursor.fetchone()["path"]
|
||||
except TypeError:
|
||||
# No records found
|
||||
pass
|
||||
@@ -431,7 +430,7 @@ class HistoryDB:
|
||||
t = (nzo_id,)
|
||||
if self.execute("""SELECT * FROM history WHERE nzo_id = ?""", t):
|
||||
try:
|
||||
item = self.c.fetchone()
|
||||
item = self.cursor.fetchone()
|
||||
return item["report"], item["url"], item["pp"], item["script"], item["category"]
|
||||
except TypeError:
|
||||
# No records found
|
||||
|
||||
@@ -216,7 +216,7 @@ class DecoderWorker(Thread):
|
||||
elif not article_success:
|
||||
# If not pre-check, this must be a bad article
|
||||
if not nzo.precheck:
|
||||
logging.info("Badly formed yEnc article in %s", art_id, exc_info=True)
|
||||
logging.info("Badly formed yEnc article %s", art_id)
|
||||
|
||||
# Continue to the next one if we found new server
|
||||
if search_new_server(article):
|
||||
|
||||
@@ -168,11 +168,58 @@ def is_probably_obfuscated(myinputfilename: str) -> bool:
|
||||
return True # default is obfuscated
|
||||
|
||||
|
||||
def first_file_is_much_bigger(filelist):
|
||||
# returns True if first file is much bigger than second file
|
||||
# Note: input parameter filelist must ordered on size!
|
||||
try:
|
||||
factor = os.path.getsize(filelist[0]) / os.path.getsize(filelist[1])
|
||||
if factor > 3:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
except:
|
||||
# no second file at all
|
||||
return True
|
||||
|
||||
|
||||
def deobfuscate(nzo, filelist: List[str], usefulname: str):
|
||||
"""Check all files in filelist, and deobfuscate: rename to filename based on usefulname.
|
||||
Methods
|
||||
# 1. if no meaningful extension, add it
|
||||
# 2. based on detecting obfuscated filenames"""
|
||||
"""
|
||||
For files in filelist:
|
||||
1. if a file has no meaningful extension, add it (for example ".txt" or ".png")
|
||||
2. pick biggest file (and its lookalikes), and deobfuscate (if needed), to usefulname
|
||||
|
||||
Typical cases for step 2:
|
||||
|
||||
Case 1:
|
||||
|
||||
bla.iso (1000MB, so much bigger than next biggest file)
|
||||
bla-sample.iso (100MB)
|
||||
bla.txt (1MB)
|
||||
something.txt (1MB)
|
||||
|
||||
Because "bla" (of biggest file bla.iso) looks meaningless / obfuscated, we rename these files to
|
||||
|
||||
Nice_Name_1234.iso
|
||||
Nice_Name_1234-sample.iso
|
||||
Nice_Name_1234.txt
|
||||
something.txt (no renaming)
|
||||
|
||||
Case 2:
|
||||
|
||||
one.bin (10MB)
|
||||
two.bin (12MB)
|
||||
three.bin (8MB)
|
||||
|
||||
No renaming, because the biggest file (12MB) is not much bigger than the second biggest file (10MB)
|
||||
|
||||
Case 3:
|
||||
|
||||
Great_File_1969.iso (1000MB)
|
||||
|
||||
No renaming because the filename looks OK already (not obfuscated)
|
||||
|
||||
"""
|
||||
|
||||
# Can't be imported directly due to circular import
|
||||
nzo: sabnzbd.nzbstuff.NzbObject
|
||||
|
||||
@@ -190,8 +237,7 @@ def deobfuscate(nzo, filelist: List[str], usefulname: str):
|
||||
nzo.set_unpack_info("Deobfuscate", T("Deobfuscate skipped due to DVD/Bluray directories"))
|
||||
return
|
||||
|
||||
# let's see if there are files with uncommon/unpopular (so: obfuscated) extensions
|
||||
# if so, let's give them a better extension based on their internal content/info
|
||||
# If needed, add a useful extension (by looking at file contents)
|
||||
# Example: if 'kjladsflkjadf.adsflkjads' is probably a PNG, rename to 'kjladsflkjadf.adsflkjads.png'
|
||||
newlist = []
|
||||
nr_ext_renamed = 0
|
||||
@@ -217,64 +263,51 @@ def deobfuscate(nzo, filelist: List[str], usefulname: str):
|
||||
nzo.set_unpack_info("Deobfuscate", T("Deobfuscate corrected the extension of %d file(s)") % nr_ext_renamed)
|
||||
filelist = newlist
|
||||
|
||||
# Now we try to rename qualifying (big, not-excluded, obfuscated) files to the job-name
|
||||
excluded_file_exts = EXCLUDED_FILE_EXTS
|
||||
# If there is a collection with bigger files with the same extension, we don't want to rename it
|
||||
extcounter = {}
|
||||
for file in filelist:
|
||||
if os.path.getsize(file) < MIN_FILE_SIZE:
|
||||
# too small to care
|
||||
continue
|
||||
ext = get_ext(file)
|
||||
if ext in extcounter:
|
||||
extcounter[ext] += 1
|
||||
else:
|
||||
extcounter[ext] = 1
|
||||
if extcounter[ext] >= 3 and ext not in excluded_file_exts:
|
||||
# collection, and extension not yet in excluded_file_exts, so add it
|
||||
excluded_file_exts = (*excluded_file_exts, ext)
|
||||
logging.debug(
|
||||
"Found a collection of at least %s files with extension %s, so not renaming those files",
|
||||
extcounter[ext],
|
||||
ext,
|
||||
)
|
||||
|
||||
logging.debug("Trying to see if there are qualifying files to be deobfuscated")
|
||||
# We start with he biggest file ... probably the most important file
|
||||
filelist = sorted(filelist, key=os.path.getsize, reverse=True)
|
||||
nr_files_renamed = 0
|
||||
for filename in filelist:
|
||||
# check that file is still there (and not renamed by the secondary renaming process below)
|
||||
if not os.path.isfile(filename):
|
||||
continue
|
||||
|
||||
logging.debug("Deobfuscate inspecting %s", filename)
|
||||
# Do we need to rename this file?
|
||||
# Criteria: big, not-excluded extension, obfuscated (in that order)
|
||||
if (
|
||||
os.path.getsize(filename) > MIN_FILE_SIZE
|
||||
and get_ext(filename) not in excluded_file_exts
|
||||
and is_probably_obfuscated(filename) # this as last test to avoid unnecessary analysis
|
||||
):
|
||||
# We pick the biggest file ... probably the most important file
|
||||
# so sort filelist on size:
|
||||
filelist = sorted(filelist, key=os.path.getsize, reverse=True)
|
||||
if filelist:
|
||||
biggest_file = filelist[0]
|
||||
else:
|
||||
biggest_file = None
|
||||
if not biggest_file or not os.path.isfile(biggest_file):
|
||||
# no file found, which is weird
|
||||
logging.info("No file given, or not found (%s)", biggest_file)
|
||||
return
|
||||
logging.debug("Deobfuscate inspecting biggest file%s", biggest_file)
|
||||
if not first_file_is_much_bigger(filelist):
|
||||
logging.debug("%s excluded from deobfuscation because it is not much bigger than other file(s)", biggest_file)
|
||||
return
|
||||
if get_ext(biggest_file) in EXCLUDED_FILE_EXTS:
|
||||
logging.debug("%s excluded from deobfuscation because of excluded extension", biggest_file)
|
||||
return
|
||||
if not is_probably_obfuscated(biggest_file):
|
||||
logging.debug("%s excluded from deobfuscation because filename does not look obfuscated", biggest_file)
|
||||
return
|
||||
|
||||
# if we get here, the biggest_file is relatively big, has no excluded extension, and is obfuscated
|
||||
# Rename the biggest_file and make sure the new filename is unique
|
||||
path, file = os.path.split(biggest_file)
|
||||
# construct new_name: <path><usefulname><extension>
|
||||
new_name = get_unique_filename("%s%s" % (os.path.join(path, usefulname), get_ext(biggest_file)))
|
||||
logging.info("Deobfuscate renaming %s to %s", biggest_file, new_name)
|
||||
renamer(biggest_file, new_name)
|
||||
nr_files_renamed += 1
|
||||
|
||||
# Now find other files with the same basename in filelist, and rename them in the same way:
|
||||
basedirfile, _ = os.path.splitext(biggest_file) # something like "/home/this/myiso"
|
||||
for otherfile in filelist:
|
||||
if otherfile.startswith(basedirfile) and os.path.isfile(otherfile):
|
||||
# yes, same basedirfile, only different ending
|
||||
remaining_ending = otherfile.replace(basedirfile, "") # might be long ext, like ".dut.srt" or "-sample.iso"
|
||||
new_name = get_unique_filename("%s%s" % (os.path.join(path, usefulname), remaining_ending))
|
||||
logging.info("Deobfuscate renaming %s to %s", otherfile, new_name)
|
||||
# Rename and make sure the new filename is unique
|
||||
path, file = os.path.split(filename)
|
||||
# construct new_name: <path><usefulname><extension>
|
||||
new_name = get_unique_filename("%s%s" % (os.path.join(path, usefulname), get_ext(filename)))
|
||||
logging.info("Deobfuscate renaming %s to %s", filename, new_name)
|
||||
renamer(filename, new_name)
|
||||
# find other files with the same basename in filelist, and rename them in the same way:
|
||||
basedirfile, _ = os.path.splitext(filename) # something like "/home/this/myiso"
|
||||
for otherfile in filelist:
|
||||
if otherfile.startswith(basedirfile + ".") and os.path.isfile(otherfile):
|
||||
# yes, same basedirfile, only different extension
|
||||
remainingextension = otherfile.replace(basedirfile, "") # might be long ext, like ".dut.srt"
|
||||
new_name = get_unique_filename("%s%s" % (os.path.join(path, usefulname), remainingextension))
|
||||
logging.info("Deobfuscate renaming %s to %s", otherfile, new_name)
|
||||
# Rename and make sure the new filename is unique
|
||||
renamer(otherfile, new_name)
|
||||
nr_files_renamed += 1
|
||||
else:
|
||||
logging.debug("%s excluded from deobfuscation based on size, extension or non-obfuscation", filename)
|
||||
renamer(otherfile, new_name)
|
||||
nr_files_renamed += 1
|
||||
|
||||
if nr_files_renamed:
|
||||
nzo.set_unpack_info("Deobfuscate", T("Deobfuscate renamed %d file(s)") % nr_files_renamed)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user