Compare commits

..
456 Commits
Author SHA1 Message Date
Safihre ab16e1359c Set version to 5.1.0 2026-08-10 11:58:24 +01:00
Safihre 442522c2ff Merge branch '5.1.x' 2026-08-10 11:57:24 +01:00
Safihre 54e868dd72 Update text files for 5.1.0 2026-08-10 09:36:48 +02:00
Safihre 128e0d03d7 Update version for 5.0.4 2026-06-11 10:29:35 +02:00
Safihre d6ccb620be Merge branch '5.0.x' 2026-06-11 10:29:12 +02:00
Safihre a498a98336 Update text files for 5.0.4 2026-06-11 10:28:54 +02:00
Safihre e39d1e323a Update text files for 5.0.4RC1 2026-06-07 12:46:52 +02:00
Safihre 091b9cfafd Update macOS build Python to 3.14.5 2026-06-07 12:43:37 +02:00
mnightingale 08aaca09df Add guards to blocking connections to prevent them processing the queue (#3444) 2026-06-07 12:36:50 +02:00
Ryan HollisterandClaude Sonnet 4.6 f99fb0202f Fix RuntimeError: dictionary changed size during iteration in stop_idle_jobs (#3432)
* Fix RuntimeError from dict mutation in stop_idle_jobs (#3431)

Collecting exhausted articles into a snapshot list while holding
nzf.lock, then calling register_article outside the iteration.
This prevents RuntimeError when register_article -> nzf.remove_article
pops from nzf.articles (a dict) while stop_idle_jobs is iterating it.

The original code in fd3ece31c used `nzf.articles[:]` which was safe
when articles was a list. When 44d94226e changed articles to a dict
the protective copy was dropped, leaving bare dict iteration that
mutates mid-loop.

The collect-then-act pattern matches nzf_remove_list in nzb/object.py
and the empty-nzo list already used in stop_idle_jobs itself. It also
correctly calls register_article outside nzf.lock, consistent with its
own "not locked for performance" contract.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Apply Black formatting to nzbqueue.py

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Soften comment per maintainer feedback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 12:36:29 +02:00
mnightingale 5636283f31 Match previous RSS parsing behaviour (#3425)
* Match to previous RSS behaviour

* Cleanup logic due to normalisation

* Tests comparing 4.5.5 outcome

* Remove comment - fixed since 4.5.5

* Consistent types for prio, rule, season, and episode

* Rename matching_rule_index

* Fix type warnings
2026-06-07 12:36:02 +02:00
Safihre 0ccb23b9d3 Refactor RSS processing for clarity and option precedence
Refactor RSS feed processing logic to enhance clarity and ensure correct precedence for resolved options. Renames functions and variables for better understanding, and inlines feed configuration logic. Adds new tests to verify how category, post-processing, script, and priority settings are applied hierarchically. Also provides a default display for empty RSS log categories.
2026-06-07 12:35:52 +02:00
Safihre ee9a6c0b6c Front-end would show job with invalid date as URL-fetching
Closes #3418
2026-06-07 12:33:32 +02:00
Safihre e3308e61b2 Replace unreliable directory access check
The `os.access()` function can produce false negatives for directory writability, particularly in environments like NFS with UID mapping or root-squashing.

This change replaces the `os.access()` call with a direct I/O test (creating and deleting a temporary file) to ensure accurate and reliable verification of directory permissions.
2026-06-07 12:33:16 +02:00
Safihre 53e6ae479d Use reduced progress bar width in compact layout
Apply the table-header-progress-smaller class (25% width) to both queue and
history when compact layout is enabled, matching the behavior when extra columns
are shown. This provides more horizontal space for longer NZB titles.

Fixes #3414
2026-06-07 12:33:03 +02:00
Safihre 7549f23956 Update version for 5.0.3 2026-05-15 16:22:13 +02:00
Safihre 2f92c2b3e9 Merge branch '5.0.x' 2026-05-15 16:21:36 +02:00
Safihre a2b3ed3de1 Update text files for 5.0.3 2026-05-15 16:19:48 +02:00
Safihre fb8b181205 URLGrabber would crash on new installs
Closes #3417
2026-05-15 14:40:28 +02:00
Safihre bc73f7de05 Set version for 5.0.2 2026-05-14 20:17:24 +02:00
Safihre 1355f40a60 Merge branch '5.0.x' 2026-05-14 20:16:56 +02:00
Safihre 45873d4cbb Update text files for 5.0.2 2026-05-14 20:16:11 +02:00
Safihre f32847229a Apply fixes found by ruff 2026-05-14 20:11:26 +02:00
Safihre 72630c30ae Update text files for 5.0.2RC1 2026-05-08 11:08:06 +02:00
Safihre 990dce2232 Merge branch 'develop' into 5.0.x 2026-05-08 10:02:38 +02:00
Safihre c56f974ee4 Set version for 5.0.1 2026-05-01 22:38:41 +02:00
Safihre 6d8fd5853a Merge branch '5.0.x' 2026-05-01 22:38:19 +02:00
Safihre 99447d7a62 Update text files for 5.0.1 2026-05-01 22:37:30 +02:00
Safihre 6455a44ed4 Add compatibility for pre-5.0 queue files
Closes #3388
2026-05-01 22:31:01 +02:00
Safihre cb05869e0c Adjust README formatting so highlights display as list 2026-05-01 10:41:42 +02:00
Safihre 56ced93868 Set version for 5.0.0 2026-05-01 09:58:38 +02:00
Safihre 50dad36028 Merge branch '5.0.x' 2026-05-01 09:58:07 +02:00
Safihre 936b2db7df Update text files for 5.0.0 2026-05-01 09:56:02 +02:00
Safihre 11ba9ae12a Set version to 4.5.5 2025-10-24 12:58:51 +02:00
Safihre a61a5539a7 Merge branch '4.5.x' 2025-10-24 12:58:35 +02:00
Safihre 77f7490aea Update text files for 4.5.5 2025-10-24 12:56:26 +02:00
Safihre a7198b6a81 Merge branch 'develop' into 4.5.x 2025-10-24 12:47:36 +02:00
Safihre 977dbc805f Set version to 4.5.4 2025-10-22 23:09:30 +02:00
Safihre abcca19820 Merge branch '4.5.x' 2025-10-22 23:09:14 +02:00
Safihre 52a7b5dcff Update text files for 4.5.4 2025-10-22 23:05:40 +02:00
Safihre 9518714885 Merge branch 'develop' into 4.5.x 2025-10-22 22:35:07 +02:00
Safihre 4a89fcf8ea Update text files for 4.5.4RC1 2025-10-13 16:25:48 +02:00
Safihre d11e757c6e Merge branch 'develop' into 4.5.x 2025-10-13 16:24:19 +02:00
Safihre 4f9ed7803f Update text files for 4.5.4Beta2 2025-10-05 23:08:14 +02:00
Safihre 95bc069af9 Merge branch 'develop' into 4.5.x 2025-10-05 22:58:51 +02:00
Safihre d1d9bab65a Update text files for 4.5.4 Beta 1 2025-09-22 14:11:13 +02:00
Safihre e2560bf214 Merge branch 'develop' into 4.5.x 2025-09-22 14:10:50 +02:00
Safihre 825322baa4 Set version to 4.5.3 2025-08-25 15:25:56 +02:00
Safihre 7a5ca5b226 Merge branch '4.5.x' 2025-08-25 15:25:41 +02:00
Safihre cb4f022d17 Update text files for 4.5.3 2025-08-25 15:25:21 +02:00
Safihre 913e4ea02e Update text files for 4.5.3RC1 2025-08-19 16:34:20 +02:00
Safihre aa0d44a60b Merge branch 'develop' into 4.5.x 2025-08-19 16:33:20 +02:00
Safihre 8b5f29df8f Update text files for 4.5.3Beta2 2025-08-11 12:10:29 +02:00
Safihre 82954f5930 Merge branch 'develop' into 4.5.x 2025-08-11 12:02:33 +02:00
Safihre 67f1858315 Update text files for 4.5.3 Beta 1 2025-08-05 11:33:53 +02:00
Safihre 55bb81ceef Merge branch 'develop' into 4.5.x 2025-08-05 11:33:00 +02:00
Safihre 6864810ace Set version to 4.5.2 2025-07-09 20:22:44 +02:00
Safihre bae55636a8 Merge branch '4.5.x' 2025-07-09 20:22:27 +02:00
Safihre f4778abd1f Update text files for 4.5.2 2025-07-09 20:22:04 +02:00
Safihre 2cb716ce26 Update text files for 4.5.2RC2 2025-06-27 10:53:56 +02:00
Safihre 3246e9c6d4 Merge branch 'develop' into 4.5.x 2025-06-27 10:52:13 +02:00
Safihre ae6d5f54bd Update text files for 4.5.2RC1 2025-06-17 13:51:24 +02:00
Safihre bd95c29866 Merge branch 'develop' into 4.5.x 2025-06-17 13:34:39 +02:00
thezoggy 074eed16e1 fixup prowl/pushover pri setting due to value returned as int not string now (#3070) 2025-04-17 21:52:32 +03:00
Safihre 3b72a005fd Set version to 4.5.1 2025-04-11 11:48:24 +02:00
Safihre afb9a4758f Merge branch '4.5.x' 2025-04-11 11:47:59 +02:00
Safihre 35c180216b Update text files for 4.5.1 2025-04-11 11:47:13 +02:00
jcfp f0c6fe5786 fix root dir check in make_mo (#3061) 2025-04-11 11:44:37 +02:00
Safihre bd8c245b83 Update text files for 4.5.1RC1
Get Unrar 7.11 to users due to the CVE
2025-04-04 14:19:58 +02:00
Safihre effc7265d4 Merge branch 'develop' into 4.5.x 2025-04-04 14:08:13 +02:00
Safihre bd9a8e5c33 Set version to 4.5.0 2025-03-30 18:09:51 +02:00
Safihre c55d662e1f Merge branch '4.5.x' 2025-03-30 18:07:42 +02:00
Safihre dbfabc1d80 Update text files for 4.5.0 2025-03-30 18:06:29 +02:00
Safihre d897936da5 Set version to 4.4.1 2024-12-20 14:10:49 +01:00
Safihre f81a8c97c4 Merge branch '4.4.x' 2024-12-20 11:16:30 +01:00
Safihre e93e01dd59 Update text files for 4.4.1 2024-12-20 11:16:01 +01:00
Safihre 79b504ff93 Update text files for 4.4.1RC1 2024-12-18 13:17:47 +01:00
Safihre 52dafd4ab8 Add new Certificate verification setting Medium
Closes #2993
2024-12-18 12:53:59 +01:00
Safihre 0cc538ac5a Don't block virusscanner certificates on Windows
See #2993
2024-12-14 21:52:47 +01:00
Safihre 4b99d04454 Add missing hidden import for Windows notifications 2024-12-13 15:00:19 +01:00
Safihre 708fad33f3 Set version to 4.4.0 2024-12-09 21:56:46 +01:00
Safihre c6dc25c9c2 Merge branch '4.4.x' 2024-12-09 21:56:29 +01:00
Safihre 07be38cd01 Update text files for 4.4.0 2024-12-09 21:55:33 +01:00
Safihre 0121e0ae16 Update release date of 4.4.0 in appdata 2024-12-09 21:50:07 +01:00
Safihre f24b3ced28 Set version to 4.3.3 2024-08-21 13:26:46 +02:00
Safihre 157dfc928d Merge branch '4.3.x' 2024-08-21 13:26:14 +02:00
Safihre d10639542d Update text files for 4.3.3 2024-08-21 13:25:48 +02:00
Safihre c0f0b7eb31 Add Docker to CPU label 2024-08-19 20:22:29 +02:00
Safihre d6d70325db Small style fixes for the Config 2024-08-19 20:22:23 +02:00
Safihre 46954165d2 Update text files for 4.3.3RC2 2024-08-17 15:08:57 +02:00
Safihre 58e7d520bf increase_bad_articles_counter should be called before register_article 2024-08-17 15:08:03 +02:00
Safihre a4f8040324 Prevent excessive newswrapper data buffer size
Closes #2895
2024-08-17 15:07:57 +02:00
Safihre 8d5cc9a3e6 Do not use article_queue when resetting newswrapper
Relates to #2866
2024-08-17 15:07:52 +02:00
jcfp 4592ce4d55 Remove pyfakefs workarounds and put its new apply_umask option to good use (#2922) 2024-08-17 15:07:47 +02:00
Safihre b62b38b5af Update text files for 4.3.3RC1 2024-08-13 10:29:25 +02:00
renovate[bot] 14b1d4630c Update all dependencies 2024-08-13 10:16:28 +02:00
Safihre 8a42abd1e7 Set version to 4.3.2 2024-05-29 16:38:23 +02:00
Safihre 41e5dfdf18 Merge branch '4.3.x' 2024-05-29 16:28:43 +02:00
Safihre 41de13388c Merge branch '4.3.x' 2024-05-04 09:48:35 +02:00
Safihre 1f16f13169 Set version to 4.3.1 2024-05-03 15:30:36 +02:00
Safihre ef23d40972 Merge branch '4.3.x' 2024-05-03 15:30:17 +02:00
Safihre b07b43496c Set version to 4.3.0 2024-05-01 21:45:22 +02:00
Safihre 2ba04f1a6a Merge branch '4.3.x' 2024-05-01 21:44:38 +02:00
Safihre e7e06dea41 Update text files for 4.2.3 2024-03-11 08:42:25 +01:00
Safihre ce32504a81 Set version to 4.2.3 2024-03-11 08:25:26 +01:00
Safihre 7cd6c94482 Merge branch '4.2.x' 2024-03-11 08:24:46 +01:00
Safihre fcb3d01194 Correct input placeholder styling in Night themes 2024-03-04 09:57:51 +01:00
Safihre af0b53990c Update text files for 4.2.3RC3 2024-03-04 08:46:42 +01:00
Safihre e3861954ba Support NNTP code 220 after ARTICLE request
Closes #2817
2024-03-02 21:40:56 +01:00
Safihre 006dd8dc77 Do not log NNTP data in unknown status code warning
See #2817
2024-03-02 21:23:25 +01:00
Safihre dbff203c62 Update text files for 4.2.3RC2 2024-02-26 22:30:38 +01:00
Safihre f45eb891cd Correct translatable texts about connection threads 2024-02-26 22:23:51 +01:00
Safihre 77b58240cf Reduce Server test timeout to 10s
Unless otherwise specified
Related to #2802
2024-02-26 22:23:51 +01:00
Safihre 97ae1ff10e Refactor part of database.py
Use autocommit and skip unnecessary checks on every connect
2024-02-26 22:23:51 +01:00
Safihre 8734a4f24b Update text files for 4.2.3RC1 2024-02-19 22:19:43 +01:00
Shane Mc Cormack 480fce55a8 Handle NNTP error code 451 (#2808)
* Handle error code 451.

This is used by some servers to show that an article was intentionally removed.
Fix #2807

* Add a warning when an unknown status code is given for an article.

* Make warning message translatable.
2024-02-19 22:06:29 +01:00
thezoggyandSafihre d4136fadd2 Add missing tooltips (#2800)
Co-authored-by: Safihre <safihre@sabnzbd.org>
2024-02-18 13:42:48 +01:00
Safihre 308bc375bd Update log message about version check 2024-02-18 13:42:31 +01:00
Safihre 3bbcf6a41e Update standby command on macOS 2024-02-18 13:41:33 +01:00
Safihre 3d5d10a4c1 Remove parsing of Group command code
Since we never request it.
2024-02-18 13:41:05 +01:00
Safihre 0e979c14f0 Remove Send Group option
Closes #2715
2024-02-18 13:38:31 +01:00
Safihre 70f49114ac Wrong archive password is used for Retry
Closes #2790
2024-02-18 13:38:13 +01:00
Safihre f730607414 Set version to 4.2.2 2024-01-30 21:48:15 +01:00
Safihre 0172ee25c9 Merge branch '4.2.x' 2024-01-30 21:47:59 +01:00
Safihre 699d75bb9f Update text files for 4.2.2 2024-01-30 21:46:56 +01:00
Safihre 95822704c8 Update black formatting 2024-01-30 21:36:34 +01:00
Safihre 76e5f69e67 Only attempt Windows Toasts on Windows 10 and above 2024-01-29 16:34:03 +01:00
Safihre abd31d0249 Update text files for 4.2.2RC2 2024-01-24 13:28:19 +01:00
Safihre 9ae7ee6e2d Add logging which notification will be sent 2024-01-22 15:15:44 +01:00
Safihre 18f4cc25f3 Add 4.2.1 to appdata 2024-01-05 10:11:07 +01:00
Safihre b755192600 Update version to 4.2.1 2024-01-05 09:54:19 +01:00
Safihre 045140cfbc Merge branch '4.2.x' 2024-01-05 09:54:04 +01:00
Safihre 4e7e44e25f Set version to 4.2.0 2024-01-03 14:17:07 +01:00
Safihre 5c4dfa4cc6 Merge branch '4.2.x' 2024-01-03 14:14:25 +01:00
Safihre b7e3401e8e Set version to 4.1.0 2023-09-26 15:12:39 +02:00
Safihre 90cee7fb31 Merge branch '4.1.x' 2023-09-26 15:11:58 +02:00
Safihre 8e0e3cf35e Update appdata.xml for 4.1.0 2023-09-26 15:07:08 +02:00
Safihre 7f72584537 Update text files for 4.1.0 2023-09-26 14:28:05 +02:00
renovate[bot] 8f0d606892 Update dependency cryptography to v41.0.4 [SECURITY] 2023-09-26 14:15:15 +02:00
Safihre 9fafe64cff Update version to 4.0.3 2023-07-10 14:55:46 +02:00
Safihre 94b42e0597 Merge branch '4.0.x' 2023-07-10 14:55:16 +02:00
Safihre b2c1960d93 Release notes were not present in releases 2023-07-10 14:54:34 +02:00
Safihre 9d24b4cc35 Correct finding of release in appdata 2023-07-10 14:19:56 +02:00
Safihre 3d675b033c Update text files for 4.0.3 2023-07-10 13:43:06 +02:00
Sanderandsander 0d2d9be8b3 better docker detections: works for older and newer docker versions (#2606)
* better docker detections: works for Ubuntu 18.04 and 22.04

* DOCKER = False, needed for non-POSIX

---------

Co-authored-by: sander <san.d.erjonkers+github@gmail.com>
2023-07-03 16:11:25 +02:00
Safihre 6e9b6dab97 add a grace period for expected filenames to show up (#2609) 2023-07-03 16:11:04 +02:00
Michael Nightingale 44a1717f6d Fix uu decoding when collapsing of lines starting with a doubled period is required (#2605) 2023-06-28 10:01:15 +02:00
Safihre 4f51c74297 Build binary using Python 3.11.4 2023-06-28 10:01:01 +02:00
thezoggy 87c64a8c5d add random import back to fixup (#2604) 2023-06-27 09:06:25 +02:00
Safihre b6c6635f22 Add newline after link to Downloads page in Reddit post 2023-06-23 21:45:36 +02:00
Safihre 5a7abcb07c Update text files for 4.0.3RC1 2023-06-23 14:03:26 +02:00
jcfp 65232d134b Fix sorting for #2551 (#2598)
* fix #2551

* add test data dirs

* move sorting test data into subdir

* undo change to sabnews.create_nzb
2023-06-23 13:52:26 +02:00
Safihre d7b4bdefe5 Check if version is present appdata before releasing 2023-06-23 13:52:12 +02:00
Safihre 6d9174bea1 Additional logging to debug Direct Unpack 2023-06-23 13:52:07 +02:00
François M 921edfd4c5 Add versions to appdata (#2595) 2023-06-23 13:52:00 +02:00
Safihre 786d5b0667 Lock add/remove_socket in Downloader
See if we can resolve #2591
2023-06-23 13:51:49 +02:00
Safihre e846c71f20 Link to Downloads page was not included in Reddit post 2023-06-16 11:48:52 +02:00
Safihre 0108e2ef5a Update text files for 4.0.3Beta1 2023-06-16 10:53:58 +02:00
Safihre 9a81277ff6 No longer * import AppKit and Foundation 2023-06-16 09:07:29 +02:00
Safihre 06cc2ff316 Update release script to post directly to r/usenet and include link 2023-06-13 14:06:38 +02:00
renovate[bot] 7cdf4cb48c Update all dependencies 2023-06-13 14:06:31 +02:00
thezoggy c34c547f1f Unable to modify Sorters (#2587) 2023-06-13 14:06:22 +02:00
Safihre 9507294db7 Move DirScanner Lock creation 2023-06-13 14:06:12 +02:00
Safihre ae7dd62d9f Only initialize DirScanner Lock after starting event loop 2023-06-13 14:06:05 +02:00
renovate[bot] 52e309cb09 Update all dependencies 2023-06-13 14:06:00 +02:00
jcfp b580373982 Fix sorting lowercasing (#2584)
* run lowercasing on season pack setname

* also subject %fn to lowercasing

* add tests

* woops
2023-06-13 14:05:37 +02:00
renovate[bot] ec7bde5bb2 Update dependency cryptography to v41 [SECURITY] (#2583)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-13 14:05:30 +02:00
Safihre 3516eeec5b Force full refresh after changing items-per-page
Closes #2416
2023-06-13 14:05:24 +02:00
Safihre 52351192e6 Use more reliable marker if job is still active 2023-06-13 14:05:18 +02:00
Safihre 3a6f04496d Set version to 4.0.2 2023-06-07 17:31:29 +02:00
Safihre 47f2df2112 Merge branch '4.0.x' 2023-06-07 17:25:45 +02:00
Safihre 363a26b8a1 Update text files for 4.0.2 2023-06-07 17:24:54 +02:00
Safihre 7e50a00f55 Correct parameter in release script to merge PR of update 2023-05-31 22:06:26 +02:00
Safihre a7d6a80e82 Update text files for 4.0.2RC2 2023-05-31 21:49:02 +02:00
Safihre e7da95b2ac Merge branch 'develop' into 4.0.x 2023-05-31 21:38:48 +02:00
Safihre 74fca23d59 Update text files for 4.0.2RC1 2023-05-23 21:31:43 +02:00
Safihre 0a12fa1253 Merge branch 'develop' into 4.0.x 2023-05-23 21:31:11 +02:00
Safihre 1263068140 Set version to 4.0.1 2023-05-01 21:46:30 +02:00
Safihre 916c191b18 Merge branch '4.0.x' 2023-05-01 21:46:02 +02:00
Safihre d8c0220353 Update text files for 4.0.1 2023-05-01 21:45:27 +02:00
Safihre 4ab425d15c Update appdata for 4.0.1 release 2023-05-01 21:41:48 +02:00
François M 74e5633d1c Add releases tag (#2539)
* Add 3.7.2 release tag

* Add 4.0.0 placeholder
2023-05-01 21:41:37 +02:00
Safihre 89d36bbc61 Update sabctools to 7.0.2 2023-05-01 21:36:32 +02:00
Safihre 1877ac18a5 Show a better crash on Python <3.8 2023-05-01 21:36:23 +02:00
Safihre 5e42e25617 Set version to 4.0.0 2023-04-28 14:56:51 +02:00
Safihre c27c9564cf Merge branch '4.0.x' 2023-04-28 14:53:02 +02:00
Safihre c4b0da335d Update text files for 4.0.0 2023-04-28 14:47:36 +02:00
Safihre fab36ec008 Set version to 3.7.2 2023-02-05 22:17:20 +01:00
Safihre 8a2b875779 Merge branch '3.7.x' 2023-02-05 22:15:54 +01:00
Safihre efaffb8298 Update text files for 3.7.2 2023-02-05 22:15:40 +01:00
jcfp e004eb3f00 restore startup history purge (#2449) 2023-02-05 22:08:12 +01:00
Safihre 43e8f6dc81 Update formatting with black 23 rules 2023-02-05 22:08:07 +01:00
Safihre f5bff8fe7c Update copyright year to 2023 2023-02-05 22:07:42 +01:00
Safihre fad8484b93 Update text files for 3.7.2RC1 2023-01-23 21:49:08 +01:00
Safihre 7664b54f89 Fix orjson to 3.8.3 due to issue in 3.8.4 2023-01-15 13:52:25 +01:00
Safihre 21cbc353dd Update text files for 3.7.2Beta1 2023-01-15 13:46:21 +01:00
Safihre 8d66306ec4 Merge branch 'develop' into 3.7.x 2023-01-15 13:35:21 +01:00
Safihre 479daf0e76 Set version to 3.7.1 2022-12-16 22:04:36 +01:00
Safihre bf0fbb7b10 Merge branch '3.7.x' 2022-12-16 22:03:56 +01:00
Safihre d3c91f1585 Update text files for 3.7.1 2022-12-16 22:02:40 +01:00
Safihre ca165b328a Update text files for 3.7.1RC2 2022-12-06 17:10:08 +01:00
Safihre fa2ffeea92 Merge branch 'develop' into 3.7.x 2022-12-06 17:07:31 +01:00
Safihre 0d00965ac3 Update text files for 3.7.1RC1 2022-12-01 16:33:59 +01:00
Safihre 7d7bec1f80 Merge branch 'develop' into 3.7.x 2022-12-01 16:09:09 +01:00
Safihre b6fd915365 Set version to 3.7.0 2022-11-04 10:36:24 +01:00
Safihre fecae72267 Merge branch '3.7.x' 2022-11-04 10:23:22 +01:00
Safihre 7bffd91e3f Update text files for 3.7.0 2022-11-04 10:18:37 +01:00
Safihre f859521a7e Replace apple-actions/import-codesign-certs 2022-11-04 10:17:28 +01:00
renovate[bot] a869386fac Update dependency cryptography to v38.0.3 [SECURITY] 2022-11-04 09:30:25 +01:00
Safihre 8bc7885b7a Update translatable texts
[skip ci]
2022-11-04 09:29:14 +01:00
Safihre 78be46738d Correct typo of Python 3.11 version 2022-10-27 10:07:01 +02:00
Safihre 6fce73855c Update text files for 3.7.0RC1 2022-10-27 09:08:20 +02:00
Safihre fa844a6223 Update Release Notes with right version 2022-08-18 10:46:08 +02:00
Safihre 906379dd09 Set all versions to 3.6.1 2022-08-18 09:52:31 +02:00
Safihre 37cded612f Set version to 3.6.1 2022-08-18 08:48:09 +02:00
Safihre 73e8fade61 Merge branch '3.6.x' 2022-08-18 08:47:17 +02:00
Safihre 758cc7afab Update text files for 3.6.1RC2 2022-08-12 20:18:11 +02:00
Safihre d74b7b06d2 Update Unrar to 6.11/6.12
Closes #2265
2022-08-12 20:16:34 +02:00
Safihre 39009f2f71 Update text files for 3.6.1RC1 2022-08-03 21:44:29 +02:00
jcfp 9fdc1c6813 use OSType in pyfakefs instead of setting separate properties (#2243) 2022-08-03 21:44:29 +02:00
Safihre c5568fe830 Remove deprecation notices 2022-08-02 22:31:49 +02:00
Safihre bad81f84b9 Update dependencies and Python version 2022-08-02 22:29:58 +02:00
Safihre 2ac08dd0e6 Remove new QuickCheck implementation
See https://github.com/sabnzbd/sabnzbd/discussions/2160
And https://github.com/sabnzbd/sabnzbd/issues/2251
2022-08-02 22:21:12 +02:00
Safihre 408ffc4539 Downloads in Checking-status were not displayed correctly
Closes #2249
2022-07-25 11:02:50 +02:00
Safihre eb958327c5 Prevent scheduler crash if event is canceled that was no longer queued
https://www.reddit.com/r/SABnzbd/comments/vfa1fr/what_is_causing_this_error_its_not_harming/
2022-06-19 20:37:14 +02:00
Safihre e157d77a1e Prevent crash in new Quick-check if file was already moved 2022-06-16 13:54:19 +02:00
Joulinar e961c9ea8f Update sabyenc3 to 5.4.3 (#2209)
* Update requirements.txt

Update requirements sabyenc3 to new version

* Update sabyenc3 to 5.4.3

Update sabyenc3 to 5.4.2
2022-06-15 13:25:27 +02:00
Safihre 258c4f769d Prevent showing crash on Status window during Shutdown 2022-06-14 14:59:06 +02:00
Safihre b31fedd857 Set version to 3.6.0 2022-06-07 12:23:13 +02:00
Safihre eafe69500b Merge branch '3.6.x' 2022-06-07 12:22:36 +02:00
Safihre ae09990c43 Update text files for 3.6.0 2022-06-07 12:20:28 +02:00
Safihre cf54b65c32 Remove enable_https_verification from possible deprecation list 2022-06-07 09:29:09 +02:00
Safihre 7974421fa1 Update text files for 3.6.0RC3 2022-05-29 14:34:48 +02:00
Safihre 847a098d4e Update sabyenc3 to 5.4.2 2022-05-29 14:28:55 +02:00
Safihre eb4de0ae0f Remove helpful warning about new quick-check for release 2022-05-28 20:19:59 +02:00
Safihre bca9f3b753 Set version to 3.5.3 2022-03-17 14:29:50 +01:00
Safihre cad8a9a5d3 Merge branch '3.5.x' 2022-03-17 14:12:55 +01:00
Safihre f5f36d21e8 Update text files 3.5.3 2022-03-17 14:12:40 +01:00
Safihre c51435c114 Revert "Notify users of Prowl/Pushover/Pushbullet to switch to nzb-notify"
This reverts commit 56fe140ebf.
2022-03-15 21:52:16 +01:00
Safihre 2a7f1780b4 Update text files for 3.5.3RC1 2022-03-13 13:26:18 +01:00
Safihre 98a44e40fb Jobs waiting to fetch get stuck indefinitely upon restart
Closes #2114
2022-03-11 16:29:28 +01:00
Safihre 65cf6fa9a1 Prevent Direct Unpack proceeding faster than it should, locking files
Relates to #2113
2022-03-11 16:29:19 +01:00
Safihre b2e32d1720 Log also the OSError.winerror just to be sure 2022-03-11 16:29:11 +01:00
Safihre f0bfedbe8e Revert "Revert "Disable buffering when writing files in assembler""
This reverts commit 03b380f90b.
2022-03-11 16:29:04 +01:00
Safihre fd4e059c13 Set version to 3.5.2 2022-03-09 14:33:48 +01:00
Safihre a53575e154 Merge branch '3.5.x' 2022-03-09 14:24:26 +01:00
Safihre 4a73484603 Update text files for 3.5.2 2022-03-09 14:24:13 +01:00
Safihre 03b380f90b Revert "Disable buffering when writing files in assembler"
This reverts commit 3c3aeac93c.

It turns out this causes problems!
2022-03-03 15:44:15 +01:00
Safihre a2bd3b2dfe RSS filters At most/least were broken 2022-03-01 08:42:31 +01:00
Safihre 56fe140ebf Notify users of Prowl/Pushover/Pushbullet to switch to nzb-notify
Relates to #2093
2022-02-24 16:47:44 +01:00
Safihre 4fafcce740 Set version to 3.5.1 2022-02-20 19:47:55 +01:00
Safihre 02352c4ae6 Merge branch '3.5.x' 2022-02-20 19:37:50 +01:00
Safihre 4b74aab335 Update text files for 3.5.1 2022-02-20 19:36:51 +01:00
Safihre 2d67ac189d Add Debug logging when applying permissions failed 2022-02-16 13:08:12 +01:00
Safihre 8ece62e23d Add small delay to test_download check of result file
To prevent zip-test-failures on Windows.
2022-02-16 12:48:53 +01:00
Safihre 56c2bdd77d Allow chmod failures if no custom permissions are set
This is the same as before 3.5.0!
2022-02-16 11:32:15 +01:00
Safihre 1f555f1930 Update text files for 3.5.1RC2 2022-02-14 09:22:45 +01:00
Wolfgang SchererandSafihre 8496432c14 Do not fail if attribute subject is missing in NZB file-section (#2075)
* Use attribute poster of file element, if attribute subject ist missing

* Don't fail, if subject is missing.

* Textual change

Co-authored-by: Safihre <safihre@sabnzbd.org>
2022-02-14 09:16:29 +01:00
jcfp 1672ffa670 set log level of "completed not on fat" to debug 2022-02-14 09:16:23 +01:00
Safihre 6aab199f12 Wait before removing the temporary directory in binary test 2022-02-09 14:58:17 +01:00
Safihre 46d0c379a4 Fix version of more dependencies 2022-02-09 14:58:12 +01:00
Safihre 99240f145a Restore correct display of Direct Unpack progress 2022-02-07 15:27:54 +01:00
Safihre 3c9079d73c Correctly handle the transition from download to active post-processing 2022-02-07 15:22:58 +01:00
Safihre 0eb98b9a6c Use nzo.deleted instead of nzo.is_gone to prevent assembly during pp
Relates to #2059, #2054 and #1509.
2022-02-07 12:14:00 +01:00
Safihre 76bfd98b77 Prevent Direct Unpack crash on obfuscated posts
Closes #2060
2022-02-07 11:57:55 +01:00
Safihre 3348640c88 Correct undefined function remove_data 2022-02-05 09:51:36 +01:00
Safihre d81c64fd2b Use notarytool on macOS to do notarization 2022-02-04 22:28:46 +01:00
Safihre 8b4c919617 Test starting of binary during release building 2022-02-04 21:53:04 +01:00
Safihre 76c58953df Pin even more requirements
Closes #2056
2022-02-04 10:09:53 +01:00
thezoggy 4ddc5caa49 pin builder setuptools to deal with breakage on pyinstaller 4.8 2022-02-04 09:08:51 +01:00
Safihre 694663bd95 Update text files for 3.5.1RC1 2022-02-03 20:09:38 +01:00
Safihre 62aba5844e Add small delay between volumes in Direct Unpack to prevent UnRar error 2022-01-31 12:23:38 +01:00
Safihre d0d60cef05 Disable buffering when writing files in assembler 2022-01-31 12:23:31 +01:00
Safihre 3d293fdcb0 RSS feeds with HTML-chars in the feed name would result in crash 2022-01-31 12:23:23 +01:00
Safihre 96e9528046 Fix dependencies in requirements.txt and configure dependabot 2022-01-30 10:52:52 +01:00
Safihre 4ea24b3203 Black formatting update 2022-01-30 09:43:31 +01:00
Safihre a756eea25a Set version to 3.5.0 2022-01-28 11:47:15 +01:00
Safihre 210020e489 Merge branch '3.5.x' 2022-01-28 11:42:22 +01:00
Safihre e586ead024 Update text files for 3.5.0 2022-01-28 11:39:21 +01:00
Safihre 14c80bf1dc Reduce par2cmdline output log in Debug mode 2022-01-28 11:35:59 +01:00
Safihre bdd56e794a Prevent extra error when no 7zip is available
Closes #2036, #2035
2022-01-23 13:41:26 +01:00
Safihre a544548934 Set Python for macOS release to 3.10.2 2022-01-21 16:53:29 +01:00
Safihre e06c1d61fb Update text files for 3.5.0RC4 2022-01-18 09:41:26 +01:00
Safihre 600c5209c6 HTML-sanitizer would sanitize the source data
Closes #2026
2022-01-17 14:08:08 +01:00
Safihre bee90366ee Update text files for 3.5.0RC3 2022-01-16 19:02:50 +01:00
Safihre e9bc4e9417 Sort sevenset so x.7z.001 is always the first file 2022-01-15 17:09:21 +01:00
Safihre f01ff15761 Failed 7zip unpack was not reported in the history 2022-01-15 17:05:03 +01:00
Safihre 356ada159d Update text files for 3.5.0RC2 2022-01-13 14:48:30 +01:00
Safihre cc831e16d8 Set version to 3.4.2 2021-10-15 08:28:14 +02:00
Safihre b8dc46ad01 Merge branch '3.4.x' 2021-10-15 08:24:21 +02:00
Safihre d8ab19087d Update text files for 3.4.2 2021-10-15 08:19:00 +02:00
Safihre ec8a79eedd Revert to using regex based sample detection
Closes #1964
2021-10-13 18:24:48 +02:00
Safihre f1e2a8e9d8 Prevent double guessit parsing 2021-10-12 09:02:03 +02:00
Safihre 4042a5fe5d Update text files for 3.4.2RC3 2021-10-08 10:41:27 +02:00
Safihre a4752751ed Fix tavern for Python 3.6 and run tests on Python 3.10 (Linux-only) 2021-10-08 10:34:14 +02:00
Safihre e23ecf46d1 Correct behavior of Sorter when no filename and/or extension is supplied
Closes #1962, #1957
2021-10-08 10:24:44 +02:00
Safihre 70a8c597a6 Only fail jobs if the sorter should have renamed 2021-10-08 09:58:17 +02:00
Safihre fa639bdb53 Use general detection of RAR-files in file-extension correction
Correct file_extension test
2021-10-08 09:58:17 +02:00
Safihre 233bdd5b1d Update text files for 3.4.2RC2 2021-10-06 15:00:44 +02:00
Safihre a0ab6d35c7 Require at least 1 category to be set for Sorting and warn if not set
Before 3.4.0, only for TV sorting we allowed to set 0 categories. But for Movies and Date Sorting we did require at least 1 category to be set. This was harmonized in 3.4.0, breaking existing setups. Added warning for those users.
The Sorting behavior is different from Notifications: in Notifications selecting Default only(!) means to apply it to all categories.
However, that has never been the case for Sorting. So for now added a bit more help texts to the Affected categories box on both pages.
2021-10-06 14:50:00 +02:00
Sander bd29680ce7 make .cbz a well-known extension, so that no extension is added (#1960) 2021-10-06 14:49:54 +02:00
Sander 7139e92554 make .cbr a well-known extension, so that no extension (".rar") is added (#1959) 2021-10-05 12:19:55 +02:00
Safihre 897df53466 Check for puremagic and guessit first and add comments about cherrypy 2021-10-04 08:57:58 +02:00
Safihre 58281711f6 Always show number of MB missing
https://forums.sabnzbd.org/viewtopic.php?f=2&t=25573
2021-10-04 08:57:51 +02:00
Safihre b524383aa3 Job failure due to Sorting-problems was not shown in the interface 2021-10-01 15:35:09 +02:00
Safihre 75a16e3588 Update text files for 3.4.2RC1 2021-09-30 09:04:12 +02:00
Safihre 1453032ad6 rXX files are popular extensions and don't need renames
Closes #1955
2021-09-29 13:53:47 +02:00
Safihre 824ab4afad Do not search whole file when checking if txt or nzb file 2021-09-29 13:53:37 +02:00
Safihre 73dd41c67f Only run process_unpacked_par2 when cleanup happened
Relates to https://forums.sabnzbd.org/viewtopic.php?f=1&t=25552
2021-09-29 13:53:32 +02:00
Safihre 59ee77355d Make add_parfile return if it could actually add the file
Maybe it was long finished, which could result in crashes.
Closes #1953
2021-09-29 13:53:20 +02:00
Safihre 5c758773ad Do not rename in decode_par2 if the filename didn't change
Closes #1952
2021-09-29 13:53:14 +02:00
Safihre 46de49df06 Set version to 3.4.1 2021-09-23 09:21:11 +02:00
Safihre d1c54a9a74 Merge branch 'develop' 2021-09-23 08:50:17 +02:00
Safihre e7527c45cd Set version to 3.4.0 2021-09-17 22:01:19 +02:00
Safihre 7d5207aa67 Merge branch 'develop' 2021-09-17 20:46:31 +02:00
Safihre 654302e691 Set version to 3.3.1 2021-06-18 13:52:58 +02:00
Safihre ee673b57fd Merge branch '3.3.x' 2021-06-18 13:51:48 +02:00
Safihre 2be374b841 Update text files for 3.3.1 2021-06-18 13:51:33 +02:00
puzzledsab 906e1eda89 Keep password order 2021-06-13 16:21:41 +02:00
Safihre ece02cc4fa Automatically publish release when all files are present 2021-06-11 17:39:30 +02:00
Safihre 876ad60ddf Update text files for 3.3.1RC1 2021-06-11 14:59:25 +02:00
Safihre 862da354ac Add direct opening of tabs by URL to Glitter tab-layout 2021-06-11 14:28:31 +02:00
Safihre 8fd477b979 Include wiki URL in Internal internet access denied message 2021-06-05 15:56:20 +02:00
Safihre 2d7005655c Clean timeline_total of BPSMeter
Received multiple reports that somehow it could get corrupt values in there
2021-06-05 15:56:16 +02:00
Safihre 7322f8348a Filtering active post-proc queue by category was broken 2021-06-05 15:56:09 +02:00
Safihre e3e3a12e73 Correct example in test_name_extractor 2021-06-05 15:56:04 +02:00
Safihre 77cdd057a4 Filenames should end after the extension 2021-06-01 11:19:49 +02:00
Safihre e8206fbdd9 Set version to 3.3.0 2021-06-01 07:35:13 +02:00
Jiri van Bergen 589f15a77b Merge branch '3.3.x' 2021-06-01 07:34:59 +02:00
Safihre 7bb443678a Build release when creating the tag 2021-06-01 07:18:41 +02:00
Safihre 6390415101 Update text files for 3.3.0 2021-06-01 07:16:42 +02:00
Sander 4abf192e11 deobfuscate: bugfix for collections if extension in CAPITALS (#1904) 2021-06-01 07:06:21 +02:00
Safihre 1fed37f9da Notify users that Plush will be removed in 3.4.0
Relates to #1902
2021-05-25 09:28:10 +02:00
Safihre a9d86a7447 Set version to 3.2.1 2021-03-31 10:24:42 +02:00
Safihre 2abe4c3cef Merge branch '3.2.x' 2021-03-31 09:25:49 +02:00
Safihre 0542c25003 Update text files for 3.2.1
draft release
2021-03-31 09:24:31 +02:00
puzzledsab 1b8ee4e290 Show server expiration date in server summary (#1841) 2021-03-31 08:57:38 +02:00
Safihre 51128cba55 Do not notify warning/errors from same source twice
Closes #1842
2021-03-30 17:30:07 +02:00
Safihre 3612432581 Do not discard data for CrcError's
https://forums.sabnzbd.org/viewtopic.php?f=11&t=25278
2021-03-30 16:05:04 +02:00
Safihre deca000a1b Revert some improvements to the encrypted RAR-detection
Closes #1840
2021-03-29 14:05:52 +02:00
Safihre 39cccb5653 Update text files for 3.2.1RC2
draft release
2021-03-24 10:13:43 +01:00
Safihre f6838dc985 Improvements to the encrypted RAR-detection 2021-03-20 18:32:11 +01:00
Safihre 8cd4d92395 Make get_all_passwords return only unique passwords
If the filename and the NZB specified the same one it could occur 2 or 3 times.
2021-03-20 18:32:05 +01:00
Safihre 3bf9906f45 Update text files for 3.2.1RC1
draft release
2021-03-18 10:30:05 +01:00
Safihre 9f7daf96ef Update URL for Python 3 information 2021-03-18 09:10:39 +01:00
Sander 67de4df155 deobfuscate: no globber, but use given filelist (#1830) 2021-03-18 09:10:31 +01:00
Safihre bc51a4bd1c Remove old compatibility code from BPSMeter that causes crash on startup
Closes #1827
2021-03-18 09:10:23 +01:00
Sander bb54616018 deobfuscate: rename accompanying (smaller) files with same basename, and no renaming of collections with same extension (#1826)
* deobfuscate: rename accompanying (smaller) files with same basename

* deobfuscate: do not rename collections of same extension

* deobfuscate: collection ... much easier with one loop, thanks safihre.

* deobfuscate: globber_full, and cleanup

* deobfuscate: unittest test_deobfuscate_big_file_small_accompanying_files

* deobfuscate: unittest test_deobfuscate_collection_with_same_extension

* deobfuscate: unittest test_deobfuscate_collection_with_same_extension
2021-03-18 09:10:18 +01:00
Safihre 6bcff5e014 More space for the RSS table
Closes #1824
2021-03-18 09:10:09 +01:00
puzzledsab 8970a03a9a Use binary mode to make write test more accurate on Windows (#1815) 2021-03-10 22:23:10 +01:00
Safihre 3ad717ca35 Single indexer categories would be saved with "," between each letter 2021-03-10 22:23:10 +01:00
jcfp b14f72c67a fix config auto_sort setting, broken by #1666 (#1813)
* fix config auto_sort setting, broken by #1666

* oops I did it again
2021-03-10 22:23:10 +01:00
Safihre 45d036804f Show name of item to be deleted from queue/history in confirm dialog 2021-03-10 22:23:10 +01:00
Safihre 8f606db233 Add traceback when failing to read the password file
Closes #1810
2021-03-10 22:23:10 +01:00
Safihre 3766ba5402 pre-create subdir if needed (POSIX, par2) (#1802)
* pre-create subdir it needed

* pre-create subdir it needed: check if already exists

* use os.makedirs() to handle subdir1/subdir2/blabla

* protect against malicous "..", and better naming

* check for Windows \ and POSIX /

* check again within path, typo and formatting

* regex: square brackets

* cleanup: only "/" can occur in par2

* cleanup: better logging

* unit test: testing of filesystem.renamer()

* if subdir specified in par2: let filesystem.renamer() do all the work

* if create_local_directories=True, then renamer() must stay within specified directory. Plus unittest for that.

* if create_local_directories=True, then renamer() must stay within specified directory. Plus unittest for that.

* more comments in code

* use filesystem.create_all_dirs(), less logging, clearer "..", and other feedback from Safihre

* make remote black happy too

* Small changes in wording of comments and error

Co-authored-by: Safihre <safihre@sabnzbd.org>
2021-03-10 22:23:10 +01:00
jxyzn e851813cef Sanitize names possibly derived from X-DNZB-EpisodeName (#1806) 2021-03-10 22:15:23 +01:00
thezoggy 4d49ad9141 3.2.x cleanup (#1808)
* Update uni_config bootstrap css to same version of js (3.3.7).
* small accessibility change, removed thin dot border on focus

* Ignore VS Code settings folder

* cherry picked 'Fix disabled select for Glitter Night'

* glitter night - fix search border color
2021-02-27 14:47:44 +01:00
Safihre 16618b3af2 Set version to 3.2.0 2021-02-26 10:30:00 +01:00
Safihre 0e5c0f664f Merge branch '3.2.x' 2021-02-26 10:29:39 +01:00
Safihre 7be9281431 Update text files for 3.2.0
draft release
2021-02-26 09:56:47 +01:00
Safihre ee0327fac1 Update macOS build Python to 3.9.2 2021-02-26 09:44:51 +01:00
Safihre 9930de3e7f Log all nzo_info when adding NZB's
Relates to #1806
2021-02-26 09:18:14 +01:00
Sander e8503e89c6 handle gracefully if no malloc_trim() available (#1800) 2021-02-26 09:18:00 +01:00
puzzledsab 1d9ed419eb Remove some redundant ifs (#1791) 2021-02-26 09:17:29 +01:00
Safihre 0207652e3e Update text files for 3.2.0RC2
draft release
2021-02-08 21:02:38 +01:00
Safihre 0f1e99c5cb Update translatable texts 2021-02-08 13:29:16 +01:00
puzzledsabandSafihre f134bc7efb Right-to-Left support for Glitter and Config (#1776)
* Add rtl on main page

* Adjustments to rtl

* Forgot to add black check for this checkout

* Remove unnecessary style

* Remove more redundant attributes

* Some more reordering and alignment

* Align sorting and nzb drop downs

* Update NZB details and shutdown page

* Fix format

* Fix SABnzbd Config title tag

* Change file list header direction

* Set rtl variables in build_header instead and test dir="rtl" in config pages

* Revert some changes and handle styling using CSS

* Move more items to CSS

* Config RTL

* Move even more to CSS

* Small tweak

Co-authored-by: Safihre <safihre@sabnzbd.org>
2021-02-08 13:23:03 +01:00
puzzledsab dcd7c7180e Do full server check when there are busy_threads (#1786)
* Do full server check when there are busy_threads

* Reduce next_article_search delay to 0.5s
2021-02-08 13:19:38 +01:00
jcfp fbbfcd075b fix bonjour with localhost, retire LOCALHOSTS constant (#1782)
* fix bonjour with localhost, retire LOCALHOSTS constant

* rename probablyipv[46] functions to is_ipv[46]_addr

* refuse to send ssdp description_xml to outsiders
2021-02-08 13:19:30 +01:00
Safihre f42d2e4140 Rename Glitter Default to Light and make Auto the new Default 2021-02-05 15:01:28 +01:00
Sam Edwards 88882cebbc Support for auto night mode switching in Glitter (#1783) 2021-02-05 15:01:13 +01:00
Safihre 17a979675c Do not re-release from GA when the release tag is pushed 2021-02-05 15:01:04 +01:00
Safihre 4642850c79 Set macOS Python installer target to "/" 2021-02-05 15:01:00 +01:00
Safihre e8d6eebb04 Set version to 3.1.1 2020-11-11 22:04:44 +01:00
Safihre 864c5160c0 Merge branch '3.1.x' 2020-11-11 22:01:20 +01:00
Safihre 99b5a00c12 Update text files for 3.1.1 2020-11-11 21:56:15 +01:00
Safihre 85ee1f07d7 Do not crash if we cannot format the error message 2020-11-08 15:06:50 +01:00
exizak42 e58b4394e0 Separate email message lines are with CRLF (#1671)
SMTP protocol dictates that all lines are supposed to be separated
with CRLF and not LF (even on LF-based systems). This change ensures
that even if the original byte string message is using `\n` for line
separators, the SMTP protocol will still work properly.

This resolves sabnzbd#1669

Fix code formatting
2020-11-08 14:44:44 +01:00
Safihre 1e91a57bf1 It was not possible to set directory-settings to empty values 2020-11-06 16:14:53 +01:00
Safihre 39cee52a7e Update text files for 3.1.1RC1 2020-11-02 20:03:43 +01:00
Safihre 72068f939d Improve handling of binary restarts (macOS / Windows) 2020-11-02 19:57:57 +01:00
Safihre 096d0d3cad Deobfuscate-during-download did not work
https://forums.sabnzbd.org/viewtopic.php?f=3&t=25037
2020-11-01 15:35:09 +01:00
Safihre 2472ab0121 Python 3.5 does not know ssl.PROTOCOL_TLS_SERVER
Closes #1658
2020-10-27 15:52:28 +01:00
Safihre 00421717b8 Queue Repair would fail if Rating is enabled
Closes #1649
2020-10-24 11:10:03 +02:00
Safihre ae96d93f94 Set version to 3.1.0 2020-10-16 17:02:28 +02:00
Safihre 8522c40c8f Merge branch '3.1.x' 2020-10-16 16:58:58 +02:00
Safihre 23f86e95f1 Update text files for 3.1.0 2020-10-16 16:42:35 +02:00
Safihre eed2045189 After pre-check the job was not restored to the original spot 2020-10-16 16:27:51 +02:00
Safihre 217785bf0f Applying Filters to a feed would result in crash
Closes #1634
2020-10-15 18:07:06 +02:00
Safihre 6aef50dc5d Update text files for 3.1.0RC3 2020-10-02 11:34:21 +02:00
Safihre 16b6e3caa7 Notify users of Deobfuscate.py that it is now part of SABnzbd 2020-09-29 14:08:51 +02:00
Safihre 3de4c99a8a Only set the "Waiting" status when the job hits post-processing
https://forums.sabnzbd.org/viewtopic.php?f=11&t=24969
2020-09-29 13:51:15 +02:00
Safihre 980aa19a75 Only run Windows Service code when executed from the executables
Could be made to work with the from-sources code.. But seems like very small usecase.
Closes #1623
2020-09-29 10:42:23 +02:00
Safihre fb4b57e056 Update text files for 3.1.0RC2 2020-09-27 17:19:34 +02:00
Safihre 03638365ea Set execute bit on Deobfuscate.py 2020-09-27 17:17:30 +02:00
Safihre 157cb1c83d Handle failing RSS-feeds for feedparser 6.0.0+
Closes #1621
Now throws warnings (that can be disabled, helpfull_warnings) if readout failed.
2020-09-27 13:32:38 +02:00
Safihre e51f11c2b1 Do not crash if attributes file is not present 2020-09-25 10:50:19 +02:00
Safihre 1ad0961dd8 Existing files were not parsed when re-adding a job 2020-09-25 10:49:50 +02:00
Safihre 46ff7dd4e2 Do not crash if we can't save attributes, the job might be gone 2020-09-25 10:03:05 +02:00
Safihre 8b067df914 Correctly parse failed_only for Plush 2020-09-23 16:56:57 +02:00
Safihre ef43b13272 Assume RarFile parses the correct filepaths for the RAR-volumes
Parsing UTF8 from command-line still fails.
https://forums.sabnzbd.org/viewtopic.php?p=122267#p122267
2020-09-21 22:12:43 +02:00
Safihre e8e9974224 work_name would not be sanatized when adding NZB's
Closes #1615
Now with tests, yeah.
2020-09-21 22:12:34 +02:00
Safihre feebbb9f04 Merge branch '3.0.x' 2020-09-13 16:40:43 +02:00
Safihre bc4f06dd1d Limit feedparser<6.0.0 for 3.0.x 2020-09-13 16:40:14 +02:00
Safihre 971e4fc909 Merge branch '3.0.x' 2020-08-30 20:58:31 +02:00
Safihre 51cc765949 Update text files for 3.0.2 2020-08-30 20:50:45 +02:00
Safihre 19c6a4fffa Propagation delay label was shown even if no delay was activated 2020-08-29 16:46:16 +02:00
Safihre 105ac32d2f Reading RSS feed with no categories set could result in crash
Closes #1589
2020-08-28 10:16:49 +02:00
Safihre 57550675d2 Removed logging in macOS sabApp that resulted in double logging 2020-08-28 10:16:41 +02:00
Safihre e674abc5c0 Update text files for 3.0.2RC2 2020-08-26 08:56:29 +02:00
Safihre f965c96f51 Change the macOS power assertion to NoIdleSleep 2020-08-26 08:50:54 +02:00
Safihre c76b8ed9e0 End-of-queue-script did not run on Windows due to long-path
https://forums.sabnzbd.org/viewtopic.php?f=3&t=24918

Will refactor this so they all call 1 function.
2020-08-24 11:28:14 +02:00
Safihre 4fbd0d8a7b Check if name is a string before switching to nzbfile in addfile
Closes #1584
2020-08-24 09:05:25 +02:00
Safihre 2186c0fff6 Update text files for 3.0.2 RC 1 2020-08-21 15:42:35 +02:00
Safihre 1adca9a9c1 Do not crash if certifi certificates are not available
This could happen on Windows, due to overactive virus scanners
2020-08-21 15:26:06 +02:00
Safihre 9408353f2b Priority was not parsed correctly if supplied as string 2020-08-21 15:12:09 +02:00
Safihre 84f4d453d2 Permissions would be set even if user didn't set any
Windows developers like me shouldn't do permissions stuff..
2020-08-21 15:12:01 +02:00
Safihre d10209f2a1 Extend tests of create_all_dirs to cover apply_umask=False 2020-08-21 15:11:53 +02:00
Safihre 3ae149c72f Split the make_mo.py command for NSIS 2020-08-19 22:21:02 +02:00
Safihre 47385acc3b Make sure we force the final_name to string on legacy get_attrib_file 2020-08-19 16:21:13 +02:00
Safihre 814eeaa900 Redesigned the saving of attributes
Now uses pickle, so that the type of the property is preserved.
Made flexible, so that more properties can be easily added later.
Closes #1575
2020-08-19 16:21:07 +02:00
Safihre 5f2ea13aad NzbFile comparison could crash when comparing finished_files
https://forums.sabnzbd.org/viewtopic.php?f=3&t=24902&p=121748
2020-08-19 08:50:06 +02:00
Safihre 41ca217931 Merge branch '3.0.x' 2020-08-18 11:05:50 +02:00
Safihre b57d36e8dd Set version information to 3.0.1 2020-08-18 11:05:36 +02:00
Safihre 9a4be70734 List Cheetah minimal version in requirements.txt 2020-08-18 08:21:20 +02:00
Safihre a8443595a6 Generalize use of certifi module 2020-08-18 08:20:47 +02:00
Safihre fd0a70ac58 Update text files for 3.0.1 2020-08-17 16:52:23 +02:00
Safihre 8a8685c968 Permissions should only be applied if requested
Corrects 050b925f7b
2020-08-16 18:28:39 +02:00
Safihre 9e6cb8da8e Temporarily set cheroot version due to it breaking our tests
cherrypy/cheroot/issues/312
2020-08-16 18:28:13 +02:00
Safihre 054ec54d51 Basic authentication option was broken
Closes #1571
2020-08-10 15:34:01 +02:00
Safihre 272ce773cb Update text files for 3.0.1RC1 2020-08-07 15:28:11 +02:00
Safihre 050b925f7b Permissions were not set correctly when creating directories (#1568)
Restores changes made in d2e0ebe
2020-08-07 15:22:53 +02:00
Safihre 0087940898 Merge branch '3.0.x' into master 2020-08-02 09:46:41 +02:00
Safihre e323c014f9 Set version information to 3.0.0 2020-08-01 16:17:08 +02:00
Safihre cc465c7554 Update text files for 3.0.0
🎉🎉
2020-08-01 15:59:30 +02:00
Safihre 14cb37564f Update translate-link in SABnzbd 2020-07-19 13:01:39 +02:00
Safihre 094db56c3b Default-text for Automatically sort queue 2020-07-16 22:29:02 +02:00
Safihre aabb709b8b Update text files for 3.0.0 RC 2 2020-07-15 14:10:35 +02:00
Safihre 0833dd2db9 Update translatable texts in 3.0.x branch 2020-07-15 14:07:21 +02:00
Safihre cd3f912be4 RAR-renamer should be run on badly named RAR-files
https://forums.sabnzbd.org/viewtopic.php?f=2&t=24514&p=121433
2020-07-15 14:01:48 +02:00
Safihre 665c516db6 Only really run pre-script when it is set 2020-07-12 14:20:18 +02:00
Safihre b670da9fa0 Always use Default-priority when creating NZB-objects
Closes #1552
2020-07-12 14:03:07 +02:00
Safihre 80bee9bffe Search-icon would be shown on top of drop-downs
Closes #1545
2020-06-30 12:57:28 +02:00
Safihre d85a70e8ad Always report API paused status as a boolean
Closes #1542
2020-06-30 10:26:34 +02:00
Safihre 8f21533e76 Set version to 2.3.9 2019-05-24 11:39:14 +02:00
Safihre 89996482a1 Merge branch '2.3.x' 2019-05-24 09:33:12 +02:00
Safihre 03c10dce91 Update text files for 2.3.9 2019-05-24 09:32:34 +02:00
Safihre bd5331be05 Merge branch 'develop' into 2.3.x 2019-05-24 09:12:02 +02:00
Safihre 46e1645289 Correct typo in release notes 2019-05-18 10:56:39 +02:00
Safihre 4ce3965747 Update text files for 2.3.9RC2 2019-05-18 09:56:05 +02:00
Safihre 9d4af19db3 Merge branch 'develop' into 2.3.x 2019-05-18 09:45:20 +02:00
Safihre 48e034f4be Update text files for 2.3.9RC1 2019-05-07 13:50:20 +02:00
Safihre f8959baa2f Revert "Notify develop-users that we will switch to Python 3"
This reverts commit fb238af7de.
2019-05-07 13:35:13 +02:00
Safihre 8ed5997eae Merge branch 'develop' into 2.3.x 2019-05-07 13:10:10 +02:00
Safihre daf9f50ac8 Set version to 2.3.8 2019-03-18 11:10:56 +01:00
Safihre 6b11013c1a Merge branch '2.3.x' 2019-03-18 11:09:35 +01:00
213 changed files with 6337 additions and 13559 deletions

No files matched your search

+2 -5
View File
@@ -11,7 +11,7 @@ env:
PYTHONNODEBUGRANGES: 1
# For macOS we download the official Python, because the GitHub one only support newer macOS 11+ versions
# We also use the specific pin for Windows release, so Renovate can update it all at once
PYTHON_VERSION: "3.14.7"
PYTHON_VERSION: "3.14.6"
jobs:
build_windows:
@@ -144,7 +144,7 @@ jobs:
run: |
python3 --version
pip3 install --upgrade pip wheel
pip3 install -r requirements.txt --no-binary cffi,CT3,PyYAML,httptools --no-dependencies
pip3 install -r requirements.txt --no-binary cffi,CT3,PyYAML --no-dependencies
pip3 install -r builder/requirements.txt --no-dependencies
- name: Import macOS codesign certificates
# Taken from https://github.com/Apple-Actions/import-codesign-certs/pull/27 (comments)
@@ -214,9 +214,6 @@ jobs:
env:
AUTOMATION_GITHUB_TOKEN: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
REDDIT_TOKEN: ${{ secrets.REDDIT_TOKEN }}
LINUXSERVER_WEBHOOK_TOKEN: ${{ secrets.LINUXSERVER_WEBHOOK_TOKEN }}
DISCORD_WEBHOOK_TESTING: ${{ secrets.DISCORD_WEBHOOK_TESTING }}
DISCORD_WEBHOOK_STABLE: ${{ secrets.DISCORD_WEBHOOK_STABLE }}
run: |
pip3 install -r builder/release-requirements.txt --no-dependencies
python3 builder/release.py
-6
View File
@@ -20,13 +20,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
# Full history so the review can diff the PR against its base branch
fetch-depth: 0
- uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
github_token: ${{ secrets.GITHUB_TOKEN }}
# Actual triggering is gated by the job-level `if` above; this disables
# the action's internal write-permission check, which contributors fail
allowed_non_write_users: "*"
+1 -3
View File
@@ -67,7 +67,5 @@ jobs:
python -m pip install --upgrade pip wheel
pip install -r requirements.txt --no-dependencies
pip install --upgrade -r tests/requirements.txt
- name: Install Playwright browser
run: python -m playwright install chromium --with-deps
- name: Test SABnzbd
run: pytest -n auto --dist loadscope
run: pytest -s
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
if: github.repository_owner == 'sabnzbd'
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v11
- uses: actions/stale@v10
with:
days-before-stale: 21
days-before-close: 7
-1
View File
@@ -16,7 +16,6 @@ jobs:
translations:
name: Update translatable texts
runs-on: ubuntu-latest
timeout-minutes: 10
env:
TX_TOKEN: ${{ secrets.TX_TOKEN }}
steps:
+3 -3
View File
@@ -16,7 +16,7 @@ jobs:
if: github.repository == 'sabnzbd/sabnzbd'
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
GH_TOKEN: ${{ github.token }}
BRANCH: automation/update-unrar
steps:
- uses: actions/checkout@v7
@@ -83,7 +83,7 @@ jobs:
if: github.repository == 'sabnzbd/sabnzbd'
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
GH_TOKEN: ${{ github.token }}
BRANCH: automation/update-7zip
steps:
- uses: actions/checkout@v7
@@ -144,7 +144,7 @@ jobs:
if: github.repository == 'sabnzbd/sabnzbd'
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ secrets.AUTOMATION_GITHUB_TOKEN }}
GH_TOKEN: ${{ github.token }}
BRANCH: automation/update-par2
steps:
- uses: actions/checkout@v7
-1
View File
@@ -32,7 +32,6 @@ SABnzbd-*/
# Testing folders
tests/cache
tests/cache_gw*
# General junk
*.keep
+50
View File
@@ -0,0 +1,50 @@
*******************************************
*** Known issues ***
*******************************************
- To prevent unexpectedly large NZBs from eating your download quota you can set
the option 'size_limit' on the Config->Special page.
Any NZB larger than this size will be set to paused and get a low priority.
- When par2 or unrar hang up, never just stop SABnzbd.
Instead use your operating system's task manager to stop the par2 or unrar program.
Forcing SABnzbd to quit may damage your queues.
- Some Usenet servers have intermittent login (or other) problems.
For these the server blocking method is not very favourable.
There is an INI-only option that will limit blocks to 1 minute.
no_penalties = 1
See: https://sabnzbd.org/wiki/configuration/3.4/special
- Some third-party utilities try to probe SABnzbd API in such a way that you will
often see warnings about unauthenticated access.
If you are sure these probes are harmless, you can suppress the warnings by
setting the option "api_warnings" to 0.
See: https://sabnzbd.org/wiki/configuration/3.4/special
- On macOS you may encounter downloaded files with foreign characters.
The par2 repair may fail when the files were created on a Windows system.
The problem is caused by the PAR2 utility and we cannot fix this now.
This does not apply to files inside RAR files.
- The "Watched Folder" sometimes fails to delete the NZB files it has
processed. This happens when other software still accesses these files.
Some third-party utilities supporting SABnzbd are known to do this.
We cannot solve this problem, because the Operating System (read Windows)
prevents the removal.
- When SABnzbd cannot send notification emails, check your virus scanner,
firewall or security suite. It may be blocking outgoing email.
- When you are using external drives or network shares on macOS or Linux
make sure that the drives are mounted.
The operating system will simply redirect your files to alternative locations.
You may have trouble finding the files when mounting the drive later.
On macOS, SABnzbd will not create new folders in /Volumes.
The result will be a failed job that can be retried once the volume has been mounted.
- If you use a mounted drive as "temporary download folder", it must be present when SABnzbd
starts up. If not, SABnzbd will use the default location.
You can make SABnzbd wait for a mount of the "temporary download folder" by setting
Config->Special->wait_for_dfolder to 1.
SABnzbd will appear to hang until the drive is mounted.
+11 -2
View File
@@ -1,7 +1,10 @@
Release Notes - SABnzbd 5.1.0 Release Candidate 2
Release Notes - SABnzbd 5.1.0
=========================================================
This is the second release candidate of version 5.1.
This release brings a fundamental improvement to "Retry": instead of
re-downloading any files with missing data, only the articles that were actually
missing are fetched again. RSS got an overhaul under the hood, the interface is
refreshed, and we added quite a long list of of long-requested features and bugfixes.
## New features in 5.1.0
@@ -39,16 +42,22 @@ This is the second release candidate of version 5.1.
* Diskspace checks would be too strict when unpacking to different disk.
* Prevent deadlock when a second signal arrives during shutdown procedure.
* Verification using SFV-checks could fail, even though files were correct.
* Don't log Warning during clean shutdowns.
* Windows: Uninstall would not remove Settings or Windows Service.
* Windows: Warn for OS-limit if more than 1024 connections are configured.
* macOS: AppleDouble files could result in failures in `Moving` stage.
* macOS: Restarting the application resulted in Terminal window.
* macOS: Included par2cmdline-turbo will now use all available CPU-features.
## Upgrade notices
* You can directly upgrade from version 3.0.0 and newer.
* Upgrading from older versions will require performing a `Queue repair`.
## Known problems and solutions
* Read `ISSUES.txt` or https://sabnzbd.org/wiki/introduction/known-issues
## Code Signing Policy
Windows code signing is provided by SignPath.io using a SignPath Foundation certificate.
+223 -131
View File
@@ -40,6 +40,7 @@ import time
import re
import gc
import threading
import http.cookies
from typing import Any
try:
@@ -47,7 +48,9 @@ try:
import Cheetah
import feedparser
import configobj
import uvicorn
import cherrypy
import cheroot.errors
import portend
import cryptography
import charset_normalizer
import guessit
@@ -66,7 +69,6 @@ import sabnzbd.interface
from sabnzbd.constants import (
DEF_NETWORKING_TIMEOUT,
DEF_LOG_ERRFILE,
DEF_LOG_ACCESSFILE,
DEF_MAIN_TMPL,
DEF_STD_WEB_DIR,
DEF_WORKDIR,
@@ -79,16 +81,13 @@ from sabnzbd.constants import (
RSS_FILE_NAME,
DEF_LOG_FILE,
DEF_STD_CONFIG,
DEF_LOG_CHERRY,
CONFIG_BACKUP_HTTPS,
)
import sabnzbd.newsunpack
from sabnzbd.misc import (
exit_sab,
split_host,
port_is_free,
find_free_port,
bind_web_socket,
HostNotAvailableError,
create_https_certificates,
ip_extract,
set_serv_parms,
@@ -100,7 +99,7 @@ from sabnzbd.misc import (
set_https_verification,
)
from sabnzbd.filesystem import get_ext, real_path, long_path, globber_full, remove_file
from sabnzbd.panic import panic_tmpl, panic_port, panic_port_permission, panic_host, panic, launch_a_browser
from sabnzbd.panic import panic_tmpl, panic_port, panic_host, panic, launch_a_browser
import sabnzbd.config as config
import sabnzbd.cfg
import sabnzbd.notifier as notifier
@@ -206,7 +205,7 @@ def print_help():
print(" -t --templates <templ> Template directory [*]")
print()
print(" -l --logging <-1..2> Set logging level (-1=off, 0=least,2= most) [*]")
print(" -w --weblogging Enable uvicorn access logging")
print(" -w --weblogging Enable cherrypy access logging")
print()
print(" -b --browser <0..1> Auto browser launch (0= off, 1= on) [*]")
if sabnzbd.WINDOWS:
@@ -292,41 +291,18 @@ def daemonize():
os.dup2(f.fileno(), sys.stderr.fileno())
def abort_and_show_error(browserhost, web_port, err="", panic_func=panic_port):
"""Abort program because the web-interface could not be started"""
def abort_and_show_error(browserhost, web_port, err=""):
"""Abort program because of CherryPy troubles"""
logging.error(T("Failed to start web-interface") + " : " + str(err))
if not sabnzbd.DAEMON:
panic_func(browserhost, web_port)
if "49" in err:
panic_host(browserhost, web_port)
else:
panic_port(browserhost, web_port)
sabnzbd.halt()
exit_sab(2)
def abort_for_unusable_address(browserhost, port, err):
"""Abort with the panic that matches why the address could not be used"""
if isinstance(err, PermissionError):
abort_and_show_error(browserhost, port, err, panic_func=panic_port_permission)
else:
abort_and_show_error(browserhost, port, err, panic_func=panic_host)
def port_is_free_or_abort(host, port, browserhost):
"""port_is_free(), but abort when the address cannot be used at all. Saying so
up front beats a search that can only fail, followed by a message claiming
some other program holds the port."""
try:
return port_is_free(host, port)
except (PermissionError, HostNotAvailableError) as err:
abort_for_unusable_address(browserhost, port, err)
def find_free_port_or_abort(host, currentport, browserhost):
"""find_free_port(), but abort when the address cannot be used at all"""
try:
return find_free_port(host, currentport)
except (PermissionError, HostNotAvailableError) as err:
abort_for_unusable_address(browserhost, currentport, err)
def identify_web_template(key, defweb, wdir):
"""Determine a correct web template set, return full template path"""
if wdir is None:
@@ -676,6 +652,19 @@ def get_webhost(web_host, web_port, https_port):
return web_host, web_port, browserhost, https_port
def attach_server(host, port, cert=None, key=None, chain=None):
"""Define and attach server, optionally HTTPS"""
if sabnzbd.cfg.ipv6_hosting() or "::1" not in host:
http_server = cherrypy._cpserver.Server()
http_server.bind_addr = (host, port)
if cert and key:
http_server.ssl_module = "builtin"
http_server.ssl_certificate = cert
http_server.ssl_private_key = key
http_server.ssl_certificate_chain = chain
http_server.subscribe()
def is_sabnzbd_running(url):
"""Return True when there's already a SABnzbd instance running."""
try:
@@ -689,6 +678,19 @@ def is_sabnzbd_running(url):
return False
def find_free_port(host, currentport):
"""Return a free port, 0 when nothing is free"""
n = 0
while n < 10 and currentport <= 49151:
try:
portend.free(host, currentport, timeout=0.025)
return currentport
except Exception:
currentport += 5
n += 1
return 0
def check_for_sabnzbd(url, upload_nzbs, allow_browser=True):
"""Check for a running instance of sabnzbd on this port
allow_browser==True|None will launch the browser, False will not.
@@ -835,7 +837,7 @@ def main():
web_host = None
web_port = None
https_port = None
weblogging = None
cherrypylogging = None
clean_up = False
logging_level = None
console_logging = False
@@ -881,7 +883,7 @@ def main():
elif opt in ("-c", "--clean"):
clean_up = True
elif opt in ("-w", "--weblogging"):
weblogging = True
cherrypylogging = True
elif opt in ("-l", "--logging"):
try:
logging_level = int(arg)
@@ -1000,54 +1002,78 @@ def main():
# When this is a daemon, just check and bail out if port in use
if sabnzbd.DAEMON:
if enable_https and https_port:
if not port_is_free_or_abort(web_host, https_port, browserhost):
try:
portend.free(web_host, https_port, timeout=0.05)
except IOError:
abort_and_show_error(browserhost, web_port)
if not port_is_free_or_abort(web_host, web_port, browserhost):
except Exception:
abort_and_show_error(browserhost, web_port, "49")
try:
portend.free(web_host, web_port, timeout=0.05)
except IOError:
abort_and_show_error(browserhost, web_port)
except Exception:
abort_and_show_error(browserhost, web_port, "49")
# Windows instance is reachable through registry
url = None
if sabnzbd.WINDOWS and not new_instance:
url = get_connection_info(inifile)
url = get_connection_info()
if url and check_for_sabnzbd(url, upload_nzbs, autobrowser):
exit_sab(0)
# SSL
if enable_https:
port = https_port or web_port
if not port_is_free_or_abort(web_host, port, browserhost):
if not url:
url = "https://%s:%s%s/api?" % (browserhost, port, sabnzbd.cfg.url_base())
if new_instance or not check_for_sabnzbd(url, upload_nzbs, autobrowser):
# Bail out if we have fixed our ports after first start-up
if sabnzbd.cfg.fixed_ports():
abort_and_show_error(browserhost, web_port)
# Find free port to bind
newport = find_free_port_or_abort(web_host, port, browserhost)
if newport:
# Save the new port
if https_port:
https_port = newport
sabnzbd.cfg.https_port.set(newport)
else:
# In case HTTPS == HTTP port
web_port = newport
sabnzbd.cfg.web_port.set(newport)
try:
portend.free(browserhost, port, timeout=0.05)
except IOError as error:
if str(error) == "Port not bound.":
pass
else:
if not url:
url = "https://%s:%s%s/api?" % (browserhost, port, sabnzbd.cfg.url_base())
if new_instance or not check_for_sabnzbd(url, upload_nzbs, autobrowser):
# Bail out if we have fixed our ports after first start-up
if sabnzbd.cfg.fixed_ports():
abort_and_show_error(browserhost, web_port)
# Find free port to bind
newport = find_free_port(browserhost, port)
if newport > 0:
# Save the new port
if https_port:
https_port = newport
sabnzbd.cfg.https_port.set(newport)
else:
# In case HTTPS == HTTP port
web_port = newport
sabnzbd.cfg.web_port.set(newport)
except Exception:
# Something else wrong, probably badly specified host
abort_and_show_error(browserhost, web_port, "49")
# NonSSL check if there's no HTTPS or we only use 1 port
if not (enable_https and not https_port):
if not port_is_free_or_abort(web_host, web_port, browserhost):
if not url:
url = "http://%s:%s%s/api?" % (browserhost, web_port, sabnzbd.cfg.url_base())
if new_instance or not check_for_sabnzbd(url, upload_nzbs, autobrowser):
# Bail out if we have fixed our ports after first start-up
if sabnzbd.cfg.fixed_ports():
abort_and_show_error(browserhost, web_port)
# Find free port to bind
port = find_free_port_or_abort(web_host, web_port, browserhost)
if port:
sabnzbd.cfg.web_port.set(port)
web_port = port
try:
portend.free(browserhost, web_port, timeout=0.05)
except IOError as error:
if str(error) == "Port not bound.":
pass
else:
if not url:
url = "http://%s:%s%s/api?" % (browserhost, web_port, sabnzbd.cfg.url_base())
if new_instance or not check_for_sabnzbd(url, upload_nzbs, autobrowser):
# Bail out if we have fixed our ports after first start-up
if sabnzbd.cfg.fixed_ports():
abort_and_show_error(browserhost, web_port)
# Find free port to bind
port = find_free_port(browserhost, web_port)
if port > 0:
sabnzbd.cfg.web_port.set(port)
web_port = port
except Exception:
# Something else wrong, probably badly specified host
abort_and_show_error(browserhost, web_port, "49")
# We found a port, now we never check again
sabnzbd.cfg.fixed_ports.set(True)
@@ -1085,9 +1111,6 @@ def main():
rollover_log = logging.handlers.RotatingFileHandler(
sabnzbd.LOGFILE, "a+", sabnzbd.cfg.log_size(), sabnzbd.cfg.log_backups()
)
# Set the level here as well as on the logger, so records that were
# created at a higher level and lowered afterwards are also dropped
rollover_log.setLevel(LOGLEVELS[logging_level + 1])
rollover_log.setFormatter(logging.Formatter(logformat))
logger.addHandler(rollover_log)
@@ -1196,14 +1219,41 @@ def main():
# Starting of the webserver
# Determine if this system has multiple definitions for 'localhost'
hosts = all_localhosts()
multilocal = len(hosts) > 1 and web_host in ("localhost", "0.0.0.0")
# For 0.0.0.0 CherryPy will always pick IPv4, so make sure the secondary localhost is IPv6
if multilocal and web_host == "0.0.0.0" and hosts[1] == "127.0.0.1":
hosts[1] = "::1"
# The Windows binary requires numeric localhost as primary address
if web_host == "localhost":
web_host = hosts[0]
if enable_https and https_port:
# Separate HTTPS port: switch the main server to the HTTPS port
web_port = https_port
if enable_https:
if https_port:
# Extra HTTP port for primary localhost
attach_server(web_host, web_port)
if multilocal:
# Extra HTTP port for secondary localhost
attach_server(hosts[1], web_port)
# Extra HTTPS port for secondary localhost
attach_server(hosts[1], https_port, https_cert, https_key, https_chain)
web_port = https_port
elif multilocal:
# Extra HTTPS port for secondary localhost
attach_server(hosts[1], web_port, https_cert, https_key, https_chain)
cherrypy.config.update(
{
"server.ssl_module": "builtin",
"server.ssl_certificate": https_cert,
"server.ssl_private_key": https_key,
"server.ssl_certificate_chain": https_chain,
}
)
elif multilocal:
# Extra HTTP port for secondary localhost
attach_server(hosts[1], web_port)
if no_login:
sabnzbd.cfg.username.set("")
@@ -1213,56 +1263,108 @@ def main():
if inet_exposure:
sabnzbd.cfg.inet_exposure.set(inet_exposure)
mime_gzip = (
"text/*",
"application/javascript",
"application/x-javascript",
"application/json",
"application/xml",
"application/vnd.ms-fontobject",
"application/font*",
"image/svg+xml",
)
cherrypy.config.update(
{
"server.environment": "production",
"server.socket_host": web_host,
"server.socket_port": web_port,
"server.shutdown_timeout": 0,
"engine.autoreload.on": False,
"tools.encode.on": True,
"tools.gzip.on": True,
"tools.gzip.mime_types": mime_gzip,
"error_page.401": sabnzbd.panic.error_page_401,
"error_page.404": sabnzbd.panic.error_page_404,
}
)
# Monkey-patch key validation to prevent cherrypy from stumbling over invalid cookies
http.cookies._is_legal_key = lambda _: True
# Catch shutdown errors that can break cherrypy/cheroot
# See https://github.com/cherrypy/cheroot/issues/710
try:
cheroot.errors.acceptable_sock_shutdown_exceptions += (OSError,)
except AttributeError:
pass
# Do we want CherryPy Logging? Cannot be done via the config
cherrypy.log.screen = False
cherrypy.log.access_log.propagate = False
if cherrypylogging:
sabnzbd.WEBLOGFILE = os.path.join(logdir, DEF_LOG_CHERRY)
cherrypy.log.access_file = str(sabnzbd.WEBLOGFILE)
# Force mimetypes (OS might overwrite them)
forced_mime_types = {"css": "text/css", "js": "application/javascript"}
static = {
"tools.staticdir.on": True,
"tools.staticdir.dir": os.path.join(sabnzbd.WEB_DIR, "static"),
"tools.staticdir.content_types": forced_mime_types,
}
staticcfg = {
"tools.staticdir.on": True,
"tools.staticdir.dir": os.path.join(sabnzbd.WEB_DIR_CONFIG, "staticcfg"),
"tools.staticdir.content_types": forced_mime_types,
}
wizard_static = {
"tools.staticdir.on": True,
"tools.staticdir.dir": os.path.join(sabnzbd.WIZARD_DIR, "static"),
"tools.staticdir.content_types": forced_mime_types,
}
appconfig = {
"/api": {
"tools.auth_basic.on": False,
"tools.response_headers.on": True,
"tools.response_headers.headers": [("Access-Control-Allow-Origin", "*")],
},
"/static": static,
"/wizard/static": wizard_static,
"/favicon.ico": {
"tools.staticfile.on": True,
"tools.staticfile.filename": os.path.join(sabnzbd.WEB_DIR_CONFIG, "staticcfg", "ico", "favicon.ico"),
},
"/staticcfg": staticcfg,
}
# Make available from both URLs
main_page = sabnzbd.interface.MainPage()
cherrypy.Application.relative_urls = "server"
cherrypy.tree.mount(main_page, "/", config=appconfig)
cherrypy.tree.mount(main_page, sabnzbd.cfg.url_base(), config=appconfig)
# Set authentication for CherryPy
sabnzbd.interface.set_auth(cherrypy.config)
logging.info("Starting web-interface on %s:%s", web_host, web_port)
sabnzbd.cfg.log_level.callback(guard_loglevel)
try:
cherrypy.engine.start()
except Exception:
# Since the webserver is started by cherrypy in a separate thread, we can't really catch any
# start-up errors. This try/except only catches very few errors, the rest is only shown in the console.
logging.error(T("Failed to start web-interface: "), exc_info=True)
abort_and_show_error(browserhost, web_port)
# Create a record of the active cert/key/chain files, for use with config.create_config_backup()
if enable_https:
for setting in CONFIG_BACKUP_HTTPS.values():
if full_path := getattr(sabnzbd.cfg, setting).get_path():
sabnzbd.CONFIG_BACKUP_HTTPS_OK.append(full_path)
# Do we want web-server access logging? Cannot be done via the config
if weblogging:
sabnzbd.WEBLOGFILE = os.path.join(logdir, DEF_LOG_ACCESSFILE)
# Catch logging using SABnzbd handlers
uvicorn_logging_config = sabnzbd.interface.uvicorn_logging_config(sabnzbd.WEBLOGFILE)
# Claim the port here rather than letting uvicorn do it, because this is the
# first point where the host and port are final. Everything before this was
# only picking a port, and anything could still have taken it since.
try:
web_socket = bind_web_socket(web_host, web_port)
except (PermissionError, HostNotAvailableError) as err:
abort_for_unusable_address(browserhost, web_port, err)
except OSError as err:
logging.error(T("Failed to start web-interface: "), exc_info=True)
abort_and_show_error(browserhost, web_port, err)
server_config = uvicorn.Config(
sabnzbd.interface.create_app(),
host=web_host,
port=web_port,
log_config=uvicorn_logging_config,
ssl_keyfile=https_key if enable_https else None,
ssl_certfile=https_cert if enable_https else None,
ssl_ca_certs=https_chain if enable_https else None,
# Handled by ProxyTrustMiddleware inside the application, which needs the untouched
# peer address. Defaults to True, so it has to be turned off rather than left out.
proxy_headers=False,
)
sabnzbd.WEB_SERVER = sabnzbd.interface.ThreadedServer(config=server_config, sockets=[web_socket])
try:
sabnzbd.WEB_SERVER.run_in_thread()
except Exception:
# The webserver runs in a separate thread; if it fails to start (bad cert,
# unusable TLS material) surface the error and abort instead of hanging.
# Details are also shown on the console.
logging.error(T("Failed to start web-interface: "), exc_info=True)
abort_and_show_error(browserhost, web_port)
# Set URL for browser
if enable_https:
sabnzbd.BROWSER_URL = "https://%s:%s%s" % (browserhost, web_port, sabnzbd.cfg.url_base())
@@ -1271,7 +1373,7 @@ def main():
if sabnzbd.WINDOWS:
# Write URL for uploads and version check directly to registry
set_connection_info(f"{sabnzbd.BROWSER_URL}/api?apikey={sabnzbd.cfg.api_key()}", inifile)
set_connection_info(f"{sabnzbd.BROWSER_URL}/api?apikey={sabnzbd.cfg.api_key()}")
if pid_path or pid_file:
sabnzbd.pid_file(pid_path, pid_file, web_port)
@@ -1319,8 +1421,6 @@ def main():
logger.setLevel(level)
if console_logging:
console.setLevel(level)
if not no_file_log:
rollover_log.setLevel(level)
# 300 sec polling tasks
if not timer % 100:
@@ -1382,21 +1482,13 @@ def main():
# Just a simple restart of the exe
os.execv(sys.executable, ['"%s"' % arg for arg in sys.argv])
else:
# Re-exec with interpreter flags (replaces cherrypy.engine._do_execv)
args = [sys.executable]
if sys.flags.optimize == 1:
args.append("-O")
elif sys.flags.optimize >= 2:
args.append("-OO")
args.extend(sys.argv)
os.execv(sys.executable, args)
# CherryPy has special logic to include interpreter options such as "-OO"
cherrypy.engine._do_execv()
# Send our final goodbyes!
notifier.send_notification("SABnzbd", T("SABnzbd shutdown finished"), "startup")
logging.info("Leaving SABnzbd")
sabnzbd.pid_file()
if sabnzbd.WEB_SERVER:
sabnzbd.WEB_SERVER.stop()
try:
sys.stderr.flush()
+1 -1
View File
@@ -13,7 +13,7 @@ from builder.common import EXTRA_FILES, EXTRA_FOLDERS, RELEASE_VERSION, RELEASE_
extra_pyinstaller_files = []
# Add hidden imports
extra_hiddenimports = ["Cheetah.DummyTransaction", "certifi"]
extra_hiddenimports = ["Cheetah.DummyTransaction", "cheroot.ssl.builtin", "certifi"]
extra_hiddenimports.extend(collect_submodules("apprise"))
extra_hiddenimports.extend(collect_submodules("babelfish.converters"))
extra_hiddenimports.extend(collect_submodules("guessit.data"))
+1
View File
@@ -63,6 +63,7 @@ EXTRA_FILES = [
"GPL2.txt",
"GPL3.txt",
"COPYRIGHT.txt",
"ISSUES.txt",
]
EXTRA_FOLDERS = [
"scripts/",
+1 -1
View File
@@ -246,7 +246,7 @@ def test_sab_binary(binary_path: str):
# Parse API-key so we can do a graceful shutdown
sab_config = configobj.ConfigObj(os.path.join(config_dir, "sabnzbd.ini"))
urllib.request.urlopen(base_url + "api?mode=shutdown&apikey=" + sab_config["misc"]["api_key"], timeout=10)
urllib.request.urlopen(base_url + "shutdown/?apikey=" + sab_config["misc"]["api_key"], timeout=10)
sabnzbd_process.wait()
# Print logs for verification
+6 -6
View File
@@ -1,6 +1,6 @@
# All sub-dependencies are listed below and installed with --no-dependencies for security
PyGithub==2.10.0
praw==8.0.3
PyGithub==2.9.1
praw==8.0.2
pefile==2024.8.26
# PyGithub dependencies
@@ -17,11 +17,11 @@ update-checker==1.0.0
websocket-client==1.9.0
# requests dependencies
charset_normalizer==3.5.1
idna==3.19
certifi==2026.7.22
charset_normalizer==3.4.9
idna==3.18
certifi==2026.6.17
# cryptography (via pyjwt[crypto]) dependencies
cryptography==49.0.0
cffi==2.1.1
cffi==2.1.0
pycparser==3.0
-43
View File
@@ -21,7 +21,6 @@ import re
import github
import praw
import requests
from common import (
RELEASE_VERSION,
@@ -187,20 +186,6 @@ if RELEASE_THIS and gh_token:
print("Merging pull request in sabnzbd/sabnzbd.github.io for the update")
update_pr.merge(merge_method="squash")
# Trigger the Docker image build at linuxserver.io
# Branch "develop" builds the pre-releases, "master" the stable releases
if linuxserver_token := os.environ.get("LINUXSERVER_WEBHOOK_TOKEN", ""):
linuxserver_branch = "develop" if PRERELEASE else "master"
print("Triggering linuxserver.io Docker build for branch %s" % linuxserver_branch)
requests.post(
"https://ci.linuxserver.io/generic-webhook-trigger/invoke?sabnzbd",
headers={"Authorization": "Bearer %s" % linuxserver_token},
json={"branch": linuxserver_branch},
timeout=30,
).raise_for_status()
else:
print("Missing LINUXSERVER_WEBHOOK_TOKEN")
# Only with GitHub success we proceed to Reddit
if reddit_token := os.environ.get("REDDIT_TOKEN", ""):
# Token format (without whitespace):
@@ -248,34 +233,6 @@ if RELEASE_THIS and gh_token:
else:
print("Missing REDDIT_TOKEN")
# Push release notes to Discord via an incoming webhook
# Separate channels for testing (pre-release) and stable, both are required
discord_webhook_testing = os.environ.get("DISCORD_WEBHOOK_TESTING", "")
discord_webhook_stable = os.environ.get("DISCORD_WEBHOOK_STABLE", "")
if discord_webhook_testing and discord_webhook_stable:
discord_webhook = discord_webhook_testing if PRERELEASE else discord_webhook_stable
print("Posting release notes to Discord")
# Reuse the release notes read earlier: line 0 is the title header
discord_lines = readme_data.splitlines(keepends=True)
discord_title = discord_lines[0].lstrip("# ").strip()
discord_body = "".join(discord_lines[2:])[:4096]
requests.post(
discord_webhook,
json={
"embeds": [
{
"title": discord_title,
"url": gh_release.html_url,
"description": discord_body,
"color": 0xFFA500 if PRERELEASE else 0x00A550,
}
]
},
timeout=30,
).raise_for_status()
else:
print("Missing DISCORD_WEBHOOK_TESTING and/or DISCORD_WEBHOOK_STABLE")
else:
print("To push release to GitHub, first tag the commit.")
print("Or missing the AUTOMATION_GITHUB_TOKEN, cannot push to GitHub without it.")
+5 -5
View File
@@ -1,11 +1,11 @@
# All sub-dependencies are listed below and installed with --no-dependencies for security
pyinstaller==6.22.2
packaging==26.3
pyinstaller==6.21.0
packaging==26.2
pyinstaller-hooks-contrib==2026.6
altgraph==0.17.5
wrapt==2.3.0
setuptools==84.0.0
markdown==3.10.3
wrapt==2.2.2
setuptools==83.0.0
markdown==3.10.2
pefile==2024.8.26
# For the Windows build
@@ -2,12 +2,12 @@
<div class="clearfix"></div>
<!-- Filebrowser modal -->
<div class="modal fade" id="filebrowser_modal" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="filebrowser-modal-title">
<div class="modal fade" id="filebrowser_modal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="filebrowser-modal-title"></h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title"></h4>
</div>
<div class="modal-body">
</div>
@@ -33,4 +33,4 @@
</div>
</div>
</body>
</html>
</html>
+35 -27
View File
@@ -1,5 +1,10 @@
#if $pane == "Config"#
#set global $root = '../'#
#else#
#set global $root = '../../'#
#end if#
<!DOCTYPE HTML>
<html lang="$active_lang" #if $rtl#dir="rtl"#end if# data-color-scheme="$color_scheme">
<html lang="$active_lang" #if $rtl#dir="rtl"#end if#>
<head>
<title>
SABnzbd $T('menu-config')
@@ -20,17 +25,20 @@
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, maximum-scale=1" />
<meta name="apple-mobile-web-app-title" content="SABnzbd" />
<link rel="apple-touch-icon" sizes="76x76" href="$url('staticcfg/ico/apple-touch-icon-76x76-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="120x120" href="$url('staticcfg/ico/apple-touch-icon-120x120-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="152x152" href="$url('staticcfg/ico/apple-touch-icon-152x152-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="180x180" href="$url('staticcfg/ico/apple-touch-icon-180x180-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="192x192" href="$url('staticcfg/ico/android-192x192.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="76x76" href="${root}staticcfg/ico/apple-touch-icon-76x76-precomposed.png" />
<link rel="apple-touch-icon" sizes="120x120" href="${root}staticcfg/ico/apple-touch-icon-120x120-precomposed.png" />
<link rel="apple-touch-icon" sizes="152x152" href="${root}staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
<link rel="apple-touch-icon" sizes="180x180" href="${root}staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
<link rel="apple-touch-icon" sizes="192x192" href="${root}staticcfg/ico/android-192x192.png" />
<link rel="stylesheet" type="text/css" href="$url('staticcfg/bootstrap/css/bootstrap.min.css', v=$cache_buster)" />
<link rel="stylesheet" type="text/css" href="$url('staticcfg/css/chartist.min.css', v=$cache_buster)" />
<link rel="stylesheet" type="text/css" href="$url('staticcfg/css/style.css', v=$cache_buster)" />
<link rel="stylesheet" type="text/css" href="${root}staticcfg/bootstrap/css/bootstrap.min.css?v=$cache_buster" />
<link rel="stylesheet" type="text/css" href="${root}staticcfg/css/chartist.min.css?v=$cache_buster" />
<link rel="stylesheet" type="text/css" href="${root}staticcfg/css/style.css?v=$cache_buster" />
<!--#if $color_scheme not in ('Light', '') #-->
<link rel="stylesheet" type="text/css" href="${root}staticcfg/css/${color_scheme}.css?v=$cache_buster"/>
<!--#end if#-->
<link rel="shortcut icon" href="$url('staticcfg/ico/favicon.ico', v=$cache_buster)" />
<link rel="shortcut icon" href="${root}staticcfg/ico/favicon.ico?v=$cache_buster" />
<script type="text/javascript">
// Keeping track of the form state
@@ -38,10 +46,10 @@
var formWasSubmitted = false;
// Information we need
var csrfToken = '$csrf_token';
var rootURL = '$url()'
var sabSession = '$apikey';
var rootURL = '${root}'
var urlBase = '${url_base}'
var folderBrowseUrl = "$url('api', mode='browse', output='json')";
var folderBrowseUrl = '${root}api?mode=browse&output=json&apikey=$apikey';
var folderSeperator = '#if $os.sep == '\\' then '\\\\' else '/'#'
// Translations
@@ -57,9 +65,9 @@
configTranslate.confirmLeave = "$T('confirmWithoutSavingPrompt')";
configTranslate.searchPages = ['$T('cmenu-general')', '$T('cmenu-folders')', '$T('cmenu-switches')', '$T('cmenu-sorting')', '$T('cmenu-notif')', '$T('cmenu-special')']
</script>
<script type="text/javascript" src="$url('staticcfg/js/jquery-3.7.1.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('staticcfg/bootstrap/js/bootstrap.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('staticcfg/js/script.js', v=$cache_buster)"></script>
<script type="text/javascript" src="${root}staticcfg/js/jquery-3.5.1.min.js?v=$cache_buster"></script>
<script type="text/javascript" src="${root}staticcfg/bootstrap/js/bootstrap.min.js?v=$cache_buster"></script>
<script type="text/javascript" src="${root}staticcfg/js/script.js?v=$cache_buster"></script>
<script type="text/javascript">
// Set default functions for the autocomplete everywhere
@@ -84,62 +92,62 @@
<span class="icon-bar"></span>
</button>
<a class="navbar-logo navbar-logo-small" href="$url()" title="$T('Home')" data-placement="bottom">
<a class="navbar-logo navbar-logo-small" href="${root}" title="$T('Home')" data-placement="bottom">
#include $webdir + "/staticcfg/images/logo-small.svg"#
</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>
<a href="$url('config/general')" #if $pane == "General" then 'class="active"' else ""#>
<a href="${root}config/general/" #if $pane == "General" then 'class="active"' else ""#>
<span class="glyphicon glyphicon-cog"></span>
<strong>$T('cmenu-general')</strong>
</a>
</li>
<li>
<a href="$url('config/folders')" #if $pane == "Folders" then 'class="active"' else ""#>
<a href="${root}config/folders/" #if $pane == "Folders" then 'class="active"' else ""#>
<span class="glyphicon glyphicon-folder-open"></span>
<strong>$T('cmenu-folders')</strong>
</a>
</li>
<li>
<a href="$url('config/server')" #if $pane == "Servers" then 'class="active"' else ""#>
<a href="${root}config/server/" #if $pane == "Servers" then 'class="active"' else ""#>
<span class="glyphicon glyphicon-sort"></span>
<strong>$T('cmenu-servers')</strong>
</a>
</li>
<li>
<a href="$url('config/categories')" #if $pane == "Categories" then 'class="active"' else ""#>
<a href="${root}config/categories/" #if $pane == "Categories" then 'class="active"' else ""#>
<span class="glyphicon glyphicon-tag"></span>
<strong>$T('cmenu-cat')</strong>
</a>
</li>
<li>
<a href="$url('config/switches')" #if $pane == "Switches" then 'class="active"' else ""#>
<a href="${root}config/switches/" #if $pane == "Switches" then 'class="active"' else ""#>
<span class="glyphicon glyphicon-check"></span>
<strong>$T('cmenu-switches')</strong>
</a>
</li>
<li>
<a href="$url('config/sorting')" #if $pane == "Sorting" then 'class="active"' else ""#>
<a href="${root}config/sorting/" #if $pane == "Sorting" then 'class="active"' else ""#>
<span class="glyphicon glyphicon-sort-by-alphabet"></span>
<strong>$T('cmenu-sorting')</strong>
</a>
</li>
<li>
<a href="$url('config/notify')" #if $pane == "Notify" then 'class="active"' else ""#>
<a href="${root}config/notify/" #if $pane == "Notify" then 'class="active"' else ""#>
<span class="glyphicon glyphicon-comment"></span>
<strong>$T('cmenu-notif')</strong>
</a>
</li>
<li>
<a href="$url('config/scheduling')" #if $pane == "Scheduling" then 'class="active"' else ""#>
<a href="${root}config/scheduling/" #if $pane == "Scheduling" then 'class="active"' else ""#>
<span class="glyphicon glyphicon-time"></span>
<strong>$T('cmenu-scheduling')</strong>
</a>
</li>
<li>
<a href="$url('config/rss')" #if $pane == "RSS" then 'class="active"' else ""#>
<a href="${root}config/rss/" #if $pane == "RSS" then 'class="active"' else ""#>
<svg class="rss-icon-svg" viewBox="0 0 8 8">
<rect class="rss-button" width="8" height="8" />
<circle class="rss-symbol" cx="2" cy="6" r="1" />
@@ -150,7 +158,7 @@
</a>
</li>
<li>
<a href="$url('config/special')" #if $pane == "Special" then 'class="active"' else ""#>
<a href="${root}config/special/" #if $pane == "Special" then 'class="active"' else ""#>
<span class="glyphicon glyphicon-education"></span>
<strong>$T('cmenu-special')</strong>
</a>
+6 -5
View File
@@ -10,7 +10,7 @@
<h5 class="darkred"><strong>$T('explain-relFolder'):</strong> <span class="path">$defdir</span></h5>
<!--#for $cur, $slot in enumerate($slotinfo)#-->
<!--#set $cansort = $slot.name != '*' and $slot.name != ''#-->
<form action="$url('config/categories/save')" method="post" class="fullform <!--#if $cansort then 'sorting-row' else ''#-->">
<form action="save" method="post" <!--#if $cansort#-->class="sorting-row"<!--#end if#-->>
<table class="catTable">
<!--#if $cur == 0#-->
<tr>
@@ -28,6 +28,7 @@
<span class="glyphicon glyphicon-option-vertical"></span>
</td>
<td>
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="order" value="$slot.order" />
<input type="hidden" value="$slot.name" name="name" />
<!--#if $slot.name != '*'#-->
@@ -102,12 +103,12 @@
</div>
</div>
</div>
<script type="text/javascript" src="$url('staticcfg/js/jquery-ui.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="${root}staticcfg/js/jquery-ui.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('.delCat').click(function() {
var theForm = jQuery(this).closest("form");
theForm.attr("action", "$url('config/categories/delete')").submit();
theForm.attr("action", "delete").submit();
});
// Add autocomplete and file-browser
@@ -127,8 +128,8 @@
var data = {}
jQuery(elm).extractFormDataTo(data);
jQuery.ajax({
type: "POST",
url: "$url('config/categories/save')",
type: "GET",
url: window.location.pathname + 'save',
data: data,
async: false // To prevent race-conditions when updating categories
})
@@ -8,8 +8,10 @@
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
</div>
<form action="$url('config/folders/save')" method="post" class="fullform" autocomplete="off">
<form action="saveDirectories" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="apikey" name="apikey" value="$apikey" />
<input type="hidden" name="output" value="json" />
<input type="hidden" id="ajax" name="ajax" value="1" />
<div class="section">
<div class="col2">
<h3>$T('userFolders') <a href="$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
@@ -33,7 +35,7 @@
<div class="field-pair">
<label class="config" for="complete_dir">$T('opt-complete_dir')</label>
<input type="text" name="complete_dir" id="complete_dir" value="$complete_dir" data-initialdir="$my_home" />
<a class="btn btn-default" href="$url('config/sorting')"><span class="glyphicon glyphicon-sort-by-alphabet"></span> $T('cmenu-sorting')</a>
<a class="btn btn-default" href="${root}config/sorting/"><span class="glyphicon glyphicon-sort-by-alphabet"></span> $T('cmenu-sorting')</a>
<span class="desc">$T('explain-complete_dir') <br/> $T('explain-complete_dir-sorting')</span>
</div>
<div class="field-pair advanced-settings">
@@ -111,7 +113,7 @@
<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" />
<a class="btn btn-default" id="purge_log_files" href="$url()"><span class="glyphicon glyphicon-trash"></span> $T('purge_log_files')</a>
<a class="btn btn-default" id="purge_log_files" href="${root}"><span class="glyphicon glyphicon-trash"></span> $T('purge_log_files')</a>
<span class="desc">$T('explain-log_dir')</span>
</div>
<div class="field-pair">
@@ -137,8 +139,8 @@
if ( confirm("$T('confirm')") ) {
$.ajax({
type: "POST",
url: "$url('api')",
data: {mode: 'config', name: 'purge_log_files', output: 'json'}
url: "../../api",
data: {mode: 'config', name: 'purge_log_files', output: 'json', apikey: jQuery('#apikey').val()}
})
} else {
return false;
+24 -15
View File
@@ -8,7 +8,9 @@
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
</div>
<form action="$url('config/general/save')" method="post" class="fullform" autocomplete="off">
<form action="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="apikey" name="apikey" value="$apikey" />
<input type="hidden" id="ajax" name="ajax" value="1" />
<input type="hidden" name="output" value="json" />
<div class="section">
<div class="col2">
@@ -44,6 +46,7 @@
<!--#end if#-->
<!--#end for#-->
</select>
<span class="desc">$T('explain-web_dir')&nbsp;&nbsp;<a href="$caller_url">$caller_url</a></span>
</div>
<div class="field-pair">
<label class="config" for="language">$T('opt-language')</label>
@@ -220,7 +223,9 @@
</div><!-- /section -->
</form>
<form action="$url('config/general/upload_config')" method="post" class="fullform" autocomplete="off" enctype="multipart/form-data">
<form action="uploadConfig" method="post" name="fullform" class="fullform" autocomplete="off" enctype="multipart/form-data">
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="ajax" value="1" />
<input type="hidden" name="output" value="json" />
<div class="section">
<div class="col2">
@@ -247,7 +252,7 @@
</form>
</div><!-- /colmask -->
<div class="modal fade" id="modal_qr" tabindex="-1" role="dialog" aria-modal="true" aria-label="$T('explain-qr-code')">
<div class="modal fade" id="modal_qr">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-body">
@@ -275,6 +280,8 @@ jQuery(document).ready(function(){
// Skip the fancy stuff, just submit
this.submit()
})
// No JSON response
jQuery('#ajax').val('')
})
hideOrShowTranslate()
@@ -305,16 +312,17 @@ jQuery(document).ready(function(){
safeCheck.on('change', checkSafety)
// Click functions
jQuery('#apikey_display, #nzbkey').click(function () { jQuery(this).select() });
jQuery('#apikey, #nzbkey').click(function () { jQuery(this).select() });
jQuery('#generate_new_apikey').click(function () {
if (confirm("$T('confirm')")) {
$.ajax({
type: "POST",
url: "$url('api')",
data: { mode: 'config', name: 'set_apikey' },
url: "../../api",
data: {mode:'config', name:'set_apikey', apikey: jQuery('#apikey').val()},
success: function(msg){
jQuery('#apikey_display').val(msg.apikey);
jQuery('#apikey').val(msg);
document.location = document.location;
}
});
}
@@ -323,10 +331,11 @@ jQuery(document).ready(function(){
if (confirm("$T('confirm')")) {
$.ajax({
type: "POST",
url: "$url('api')",
data: { mode: 'config', name: 'set_nzbkey' },
success: function(msg) {
jQuery('#nzbkey').val(msg.nzbkey);
url: "../../api",
data: { mode:'config', name:'set_nzbkey', apikey: jQuery('#apikey').val() },
success: function(msg){
jQuery('#nzbkey').val(msg);
document.location = document.location;
}
});
}
@@ -357,8 +366,8 @@ jQuery(document).ready(function(){
// Submit request and then restart
$.ajax({
type: "POST",
url: "$url('api')",
data: { mode: 'config', name: 'regenerate_certs' },
url: "../../api",
data: { mode: 'config', name: 'regenerate_certs', apikey: jQuery('#apikey').val() },
success: function(msg) {
do_restart()
}
@@ -395,8 +404,8 @@ jQuery(document).ready(function(){
jQuery('#create_backup').click(function () {
$.ajax({
type: "POST",
url: "$url('api')",
data: { mode: 'config', name: 'create_backup', output: 'json' },
url: "../../api",
data: {mode:'config', name:'create_backup', output:'json', apikey: jQuery('#apikey').val()},
success: function(data) {
if(data.value.result) {
alert("$T('backup'):\n" + data.value.message)
+26 -26
View File
@@ -30,8 +30,10 @@
<!--#end def#-->
<div class="colmask">
<form action="$url('config/notify/save')" method="post" class="fullform" autocomplete="off">
<form action="saveNotify" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="apikey" name="apikey" value="$apikey" />
<input type="hidden" name="output" value="json" />
<input type="hidden" id="ajax" name="ajax" value="1" />
<div class="section" id="email">
<div class="col2">
<h3>$T('cmenu-email') <a href="$help_uri#toc0" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
@@ -92,8 +94,8 @@
</div>
<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" type="button" id="test_email" rel="$T('askTestEmail')" aria-busy="false"><span class="glyphicon glyphicon-envelope" aria-hidden="true"></span> $T('link-testEmail')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default" type="button" id="test_email" rel="$T('askTestEmail')"><span class="glyphicon glyphicon-envelope"></span> $T('link-testEmail')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -116,8 +118,8 @@
$show_notify_checkboxes('ncenter')
<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" type="button" id="test_notif" aria-busy="false"><span class="glyphicon glyphicon-comment" aria-hidden="true"></span> $T('testNotify')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default" type="button" id="test_notif"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -142,8 +144,8 @@
$show_notify_checkboxes('acenter')
<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" type="button" id="test_windows" aria-busy="false"><span class="glyphicon glyphicon-comment" aria-hidden="true"></span> $T('testNotify')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default" type="button" id="test_windows"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -168,8 +170,8 @@
$show_notify_checkboxes('ntfosd')
<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" type="button" id="test_osd" aria-busy="false"><span class="glyphicon glyphicon-comment" aria-hidden="true"></span> $T('testNotify')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default" type="button" id="test_osd"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -215,8 +217,8 @@
<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" type="button" id="test_apprise" aria-busy="false"><span class="glyphicon glyphicon-comment" aria-hidden="true"></span> $T('testNotify')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default" type="button" id="test_apprise"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -254,8 +256,8 @@
$show_notify_checkboxes('nscript')
<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" type="button" id="test_nscript" aria-busy="false"><span class="glyphicon glyphicon-comment" aria-hidden="true"></span> $T('testNotify')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default" type="button" id="test_nscript"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -299,8 +301,8 @@
<!--#end for#-->
<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" type="button" id="test_prowl" aria-busy="false"><span class="glyphicon glyphicon-comment" aria-hidden="true"></span> $T('testNotify')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default" type="button" id="test_prowl"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -365,8 +367,8 @@
<!--#end for#-->
<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" type="button" id="test_pushover" aria-busy="false"><span class="glyphicon glyphicon-comment" aria-hidden="true"></span> $T('testNotify')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default" type="button" id="test_pushover"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -402,8 +404,8 @@
$show_notify_checkboxes('pushbullet')
<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" type="button" id="test_pushbullet" aria-busy="false"><span class="glyphicon glyphicon-comment" aria-hidden="true"></span> $T('testNotify')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default" type="button" id="test_pushbullet"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -444,9 +446,8 @@ jQuery(document).ready(function(){
}
// Disable button and get the data
jQuery(buttonObj).attr("disabled", "disabled")
jQuery(buttonObj).attr("aria-busy", "true")
jQuery(buttonObj).find('span').toggleClass('glyphicon-comment glyphicon-refresh spin-glyphicon')
var data = { mode: buttonObj.id, output: 'json' };
var data = { mode: buttonObj.id, apikey: '$apikey', output: 'json' };
jQuery(buttonObj).parents('.section').extractFormDataTo(data);
// Clear up the box
@@ -454,23 +455,22 @@ jQuery(document).ready(function(){
// Get the request
jQuery.ajax({
type: "POST",
url: "$url('api')",
type: "GET",
url: "../../api",
data: data
}).then(function(data) {
// Remove disabled and make the box
jQuery(buttonObj).removeAttr("disabled")
jQuery(buttonObj).attr("aria-busy", "false")
jQuery(buttonObj).find('span').toggleClass('glyphicon-comment glyphicon-refresh spin-glyphicon')
resultBox.removeClass('alert-success alert-danger').show()
if(data.status) {
resultBox.addClass('alert-success')
resultBox.text('$T('notifications-notesent')')
resultBox.prepend('<span class="glyphicon glyphicon-ok-sign" aria-hidden="true"></span> ')
resultBox.prepend('<span class="glyphicon glyphicon-ok-sign"></span> ')
} else {
resultBox.addClass('alert-danger')
resultBox.text(data.error)
resultBox.prepend('<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> ')
resultBox.prepend('<span class="glyphicon glyphicon-exclamation-sign"></span> ')
}
})
}
+39 -33
View File
@@ -8,7 +8,8 @@
<div class="padTable">
<a class="main-helplink" href="$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a>
<p>$T('explain-RSS')</p>
<form data-form="add-rss-feed" action="$url('config/rss/add_rss_feed')" method="post" autocomplete="off">
<form action="add_rss_feed" method="post" autocomplete="off">
<input type="hidden" name="apikey" value="$apikey" />
<table class="catTable addRssTable">
<tr>
<th>&nbsp;</th>
@@ -37,7 +38,8 @@
<!--#if $rss#-->
<div class="section">
<div class="padTable">
<form action="$url('config/rss/save_rss_feed')" method="post" autocomplete="off">
<form action="save_rss_feed" method="post" autocomplete="off">
<input type="hidden" name="apikey" value="$apikey" />
<table id="subscriptions">
<tbody>
<!--#set $feeds = sorted($rss.keys(), key=lambda x: x.lower())#-->
@@ -73,7 +75,8 @@
</form>
<!--#if $feeds#-->
<br/>
<form action="$url('config/rss/rss_now')" method="post" autocomplete="off">
<form action="rss_now" method="post" autocomplete="off">
<input type="hidden" name="apikey" value="$apikey" />
<button type="submit" class="btn btn-default readAll"><span class="glyphicon glyphicon-sort"></span> $T('button-rssNow')</button>
</form>
<!--#end if#-->
@@ -81,7 +84,8 @@
</div>
<!--#end if#-->
<div class="section">
<form action="$url('config/rss/save_rss_rate')" method="post" autocomplete="off">
<form action="save_rss_rate" method="post" autocomplete="off">
<input type="hidden" name="apikey" value="$apikey" />
<div class="col1">
<fieldset>
<div class="field-pair">
@@ -103,7 +107,7 @@
<div class="padTable">
<a class="main-helplink" href="$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a>
<h2 class="nomargin activeRSS">
<a href="$url('config/rss')">$T('cmenu-rss')</a> &raquo;
<a href="${root}config/rss/">$T('cmenu-rss')</a> &raquo;
$active_feed
</h2>
<!--#if $error#-->
@@ -112,7 +116,8 @@
$error
</div>
<!--#end if#-->
<form action="$url('config/rss/upd_rss_feed')" method="post">
<form action="upd_rss_feed" method="post">
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="feed" value="$active_feed" />
<input type="hidden" name="uri" value="$rss[$feed]['uris']" />
<table class="catTable">
@@ -203,7 +208,8 @@
</table>
</form>
<!-- add new filter -->
<form data-form="update-rss-filter" action="$url('config/rss/upd_rss_filter')" method="post">
<form action="upd_rss_filter" method="post">
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="index" value="$rss[$feed]['filtercount']" />
<input type="hidden" name="feed" value="$active_feed" />
<table class="catTable">
@@ -279,7 +285,8 @@
<!--#set $fnum = 0#-->
<!--#for $filter in $rss[$feed].filters#-->
<!--#set $odd = not $odd#-->
<form data-form="update-rss-filter" action="$url('config/rss/upd_rss_filter')" method="post" autocomplete="off">
<form action="upd_rss_filter" method="post" autocomplete="off">
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="index" value="$fnum" />
<input type="hidden" name="feed" value="$active_feed" />
<table class="catTable">
@@ -357,7 +364,8 @@
</form>
<!--#set $fnum = $fnum+1#-->
<!--#end for#-->
<form action="$url('config/rss/download_rss_feed')" method="post">
<form action="download_rss_feed" method="post">
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="feed" value="$active_feed" />
<div class="padding">
<button type="button" class="btn btn-default testFeed" rel="$active_feed"><span class="glyphicon glyphicon-sort"></span> $T('button-preFeed')</button>
@@ -392,8 +400,9 @@
<!--#for $job in $matched#-->
<tr class="infoTableSeperator">
<td>
<form data-form="download-rss-job" action="$url('config/rss/download')" method="post">
<form action="download" method="get">
<input type="hidden" value="$active_feed" name="feed" />
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="url" value="$job['url']" />
<input type="hidden" name="nzbname" value="$job['nzbname']" />
<button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-plus-sign"></span> $T('link-download')</button>
@@ -435,8 +444,9 @@
<!--#for $job in $unmatched#-->
<tr class="infoTableSeperator">
<td>
<form data-form="download-rss-job" action="$url('config/rss/download')" method="post">
<form action="download" method="get">
<input type="hidden" value="$active_feed" name="feed" />
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="url" value="$job['url']" />
<input type="hidden" name="nzbname" value="$job['nzbname']" />
<button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-plus-sign"></span> $T('link-download')</button>
@@ -463,8 +473,9 @@
</div>
<div class="tab-pane padTable" id="rss-tab-done">
<!--#if $downloaded#-->
<form action="$url('config/rss/clean_rss_jobs')" method="post">
<form action="clean_rss_jobs" method="post">
<input type="hidden" value="$active_feed" name="feed" />
<input type="hidden" name="apikey" value="$apikey" />
<table class="catTable">
<thead>
<tr>
@@ -497,7 +508,7 @@
</table>
</form>
<!--#else#-->
$T('none')
$T('none')
<!--#end if#-->
</div>
<!--#end if#-->
@@ -506,12 +517,12 @@
</div>
<!-- /colmask -->
<form method="post" action="$url('config/rss/save_rss_feed')" class="modal fade" id="rss_edit_modal" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="rss-edit-modal-title">
<form method="post" action="save_rss_feed" class="modal fade" id="rss_edit_modal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="rss-edit-modal-title">$T('Edit') <span id="feed_edit_name_label"></span></h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">$T('Edit') <span id="feed_edit_name_label"></span></h4>
</div>
<div class="modal-body">
<div class="form-group">
@@ -524,6 +535,7 @@
<span class="help-block">$T('addMultipleFeeds')</span>
</div>
<input type="hidden" name="feed" id="feed_edit_old_name" />
<input type="hidden" name="apikey" value="$apikey" />
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal"><span class="glyphicon glyphicon-remove"></span> $T('cancel')</button>
@@ -533,7 +545,7 @@
</div><!-- /.modal-dialog -->
</form><!-- /.modal -->
<script type="text/javascript" src="$url('staticcfg/js/jquery.tablesort.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="${root}staticcfg/js/jquery.tablesort.min.js"></script>
<script type="text/javascript">
function urlencode(str) {
return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
@@ -577,8 +589,8 @@ jQuery(document).ready(function(){
var whichFeed = jQuery(this).attr("rel");
jQuery.ajax({
type: "POST",
url: "$url('config/rss/del_rss_feed')",
data: {feed: whichFeed }
url: "del_rss_feed",
data: {feed: whichFeed, apikey: "$apikey" }
}).done(function( msg ) {
// Let us leave!
formWasSubmitted = true;
@@ -592,8 +604,8 @@ jQuery(document).ready(function(){
var whichFeed = jQuery(this).attr("rel");
jQuery.ajax({
type: "POST",
url: "$url('config/rss/toggle_rss_feed')",
data: {feed: whichFeed }
url: "toggle_rss_feed",
data: {feed: whichFeed, apikey: "$apikey" }
}).done(function() {
// Let us leave!
formWasSubmitted = true;
@@ -603,7 +615,7 @@ jQuery(document).ready(function(){
});
// Only the Accept filter needs all the options
jQuery('form[data-form="update-rss-filter"]').find('select[name="filter_type"]').change(function() {
jQuery('form[action="upd_rss_filter"]').find('select[name="filter_type"]').change(function() {
jQuery(this).parent().parent().find('select:not([name="filter_type"])').attr('disabled', jQuery(this).val() !== "A" && jQuery(this).val() !== "S")
})
// Trigger on-load for all
@@ -632,8 +644,8 @@ jQuery(document).ready(function(){
var whichFeed = jQuery(this).attr("rel");
jQuery.ajax({
type: "POST",
url: "$url('config/rss/test_rss_feed')",
data: {feed: whichFeed }
url: "test_rss_feed",
data: {feed: whichFeed, apikey: "$apikey" }
}).done(function( msg ) {
// Let us leave!
formWasSubmitted = true;
@@ -645,21 +657,15 @@ jQuery(document).ready(function(){
jQuery('.cleanFeed').click(function(){
setActiveIcon(this)
var theForm = jQuery(this).closest("form");
theForm.attr("action", "$url('config/rss/clean_rss_jobs')").submit();
});
jQuery('.evalFeed').click(function(){
setActiveIcon(this)
var theForm = jQuery(this).closest("form");
theForm.attr("action", "$url('config/rss/eval_rss_feed')").submit();
theForm.attr("action", "clean_rss_jobs").submit();
});
jQuery('.delFilter').click(function(){
var theForm = jQuery(this).closest("form");
theForm.attr("action", "$url('config/rss/del_rss_filter')").submit();
theForm.attr("action", "del_rss_filter").submit();
});
jQuery('form[data-form="download-rss-job"]').ajaxForm({
jQuery('form[action="download"]').ajaxForm({
datatype: 'json',
beforeSubmit: function (_, form) {
jQuery(form).find('button').attr("disabled", "disabled")
@@ -17,7 +17,8 @@ else:
<div class="col2">
<h3>$T('addSchedule') <a href="$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
</div><!-- /col2 -->
<form data-form="add-schedule" action="$url('config/scheduling/add_schedule')" method="post" autocomplete="off">
<form action="addSchedule" method="post" autocomplete="off">
<input type="hidden" id="apikey" name="apikey" value="$apikey" />
<div class="col1">
<fieldset>
<div class="field-pair">
@@ -89,7 +90,8 @@ else:
<!--#set $odd = True#-->
<!--#for $schednum, $line in enumerate($schedlines)#-->
<!--#set $odd = not $odd#-->
<form data-form="del-schedule" action="$url('config/scheduling/del_schedule')" method="post">
<form action="delSchedule" method="post">
<input type="hidden" name="apikey" value="$apikey"/>
<input type="hidden" name="line" value="$line"/>
<div class="field-pair infoTableSeperator <!--#if $odd then "" else " alt"#-->">
<input type="checkbox" name="schedenabled" value="$line" aria-label="$T('enabled')" aria-describedby="schedule-description-$schednum" <!--#if int($taskinfo[$schednum][5]) > 0 then 'checked="checked"' else ""#-->>
@@ -134,8 +136,8 @@ else:
jQuery('[name="schedenabled"]').click(function() {
jQuery.ajax({
type: "POST",
url: "$url('config/scheduling/toggle_schedule')",
data: {line: jQuery(this).val() }
url: "toggleSchedule",
data: {line: jQuery(this).val(), apikey: "$apikey" }
}).done(function() {
// Let us leave!
formWasSubmitted = true;
+25 -48
View File
@@ -40,7 +40,8 @@
<h3>$T('addServer') <a href="$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
</div>
<div class="col1">
<form data-form="add-server" action="$url('config/server/add_server')" method="post" autocomplete="off">
<form action="addServer" method="post" autocomplete="off" onsubmit="removeObfuscation();">
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="output" value="json" />
<fieldset>
<div class="field-pair">
@@ -137,8 +138,8 @@
</div>
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default addNewServer" disabled data-toggle="tooltip" data-placement="top" title="$T('wizard-test-server-required')"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
<button class="btn btn-default testServer" type="button" aria-busy="false"><span class="glyphicon glyphicon-sort" aria-hidden="true"></span> $T('button-testServer')</button>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -152,9 +153,11 @@
<!--#set $cur_prio_color = -1 #-->
<!--#set $last_prio = -1 #-->
<!--#for $cur, $server in enumerate($servers) #-->
<form action="$url('config/server/save_server')" method="post" class="fullform" autocomplete="off">
<form action="saveServer" method="post" class="fullform" autocomplete="off">
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="output" value="json" />
<input type="hidden" name="server" value="$server['name']" />
<input type="hidden" name="ajax" value=1 />
<div class="section <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
<div class="col2 <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
@@ -273,10 +276,10 @@
</div>
<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" aria-busy="false"><span class="glyphicon glyphicon-sort" aria-hidden="true"></span> $T('button-testServer')</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>
<div class="result-box" role="status" aria-live="polite" aria-atomic="true">
<div class="result-box">
<div class="alert"></div>
</div>
</div>
@@ -325,8 +328,8 @@
<!--#end for#-->
</div>
<script type="text/javascript" src="$url('staticcfg/js/chartist.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('staticcfg/js/filesize.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="${root}staticcfg/js/chartist.min.js"></script>
<script type="text/javascript" src="${root}staticcfg/js/filesize.min.js"></script>
<script type="text/javascript">
// Standardize chart options
var chartOptions = {
@@ -477,9 +480,11 @@
// Initialize tooltips
jQuery('[data-toggle="tooltip"]').tooltip()
// Reload the page after saving in case we change items that make the servers appear different
// Reload form in case we change items that make the servers appear different
jQuery('input[name="priority"], input[name="displayname"], textarea[name="notes"]').on('change', function(event) {
jQuery(event.target).parents("form").attr("data-reload-on-save", "")
var parentForm = jQuery(event.target).parents("form")
parentForm.unbind("submit")
parentForm.find('input[name="ajax"]').val('')
})
/**
@@ -544,31 +549,28 @@
var theButton = jQuery(this)
var resultBox = theButton.parents('.col1').find('.result-box .alert');
theButton.attr("disabled", "disabled")
theButton.attr("aria-busy", "true")
theButton.find('span').toggleClass('glyphicon-sort glyphicon-refresh spin-glyphicon')
resultBox.removeClass('alert-success alert-danger').addClass('alert-info').html("$T('srv-testing')").show()
jQuery.ajax({
type: "POST",
url: "$url('api')",
url: "../../api",
data: "mode=config&name=test_server&" + jQuery(this).parents('form:first').serialize()
}).then(function(data) {
// Let's replace the link
msg = data.value.message.replace('https://sabnzbd.org/certificate-errors', '<a href="https://sabnzbd.org/certificate-errors" class="alert-link" target="_blank">https://sabnzbd.org/certificate-errors</a>')
msg = msg.replace('-', '<br>')
// Fill the box and enable the button
resultBox.removeClass('alert-info alert-success alert-danger').show()
resultBox.removeClass('alert-success alert-danger').show()
resultBox.html(msg)
theButton.removeAttr("disabled")
theButton.attr("aria-busy", "false")
theButton.find('span').toggleClass('glyphicon-sort glyphicon-refresh spin-glyphicon')
// Success or not?
if(data.value.result) {
resultBox.addClass('alert-success')
resultBox.prepend('<span class="glyphicon glyphicon-ok-sign" aria-hidden="true"></span> ')
resultBox.prepend('<span class="glyphicon glyphicon-ok-sign"></span> ')
// Allow adding the new server if we are in the new-server section
if(theButton.parents("form[data-form='add-server']").length) {
if(theButton.parents("form[action='addServer']").length) {
jQuery(".addNewServer").removeAttr("disabled")
jQuery(".addNewServer").removeAttr("data-toggle")
jQuery(".addNewServer").removeAttr("title")
@@ -576,10 +578,10 @@
}
} else {
resultBox.addClass('alert-danger')
resultBox.prepend('<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> ')
resultBox.prepend('<span class="glyphicon glyphicon-exclamation-sign"></span> ')
// Disable the adding of new server, just to be sure
if(theButton.parents("form[data-form='add-server']").length) {
if(theButton.parents("form[action='addServer']").length) {
jQuery(".addNewServer").attr("disabled", "disabled")
jQuery(".addNewServer").attr("data-toggle", "tooltip")
jQuery(".addNewServer").attr("data-placement", "top")
@@ -590,34 +592,9 @@
});
});
jQuery('.addNewServer').click(function(event){
event.preventDefault()
removeObfuscation()
var theButton = jQuery(this)
var resultBox = theButton.parents('.col1').find('.result-box .alert')
theButton.attr("disabled", "disabled")
jQuery.ajax({
type: "POST",
url: "$url('config/server/add_server')",
data: theButton.parents('form:first').serialize()
}).then(function(data) {
if(data.status) {
// Success — reload to show the new server
formWasSubmitted = true
formHasChanged = false
location.reload()
} else {
// Show error in the result box
resultBox.removeClass('alert-success').addClass('alert-danger').show()
resultBox.html('<span class="glyphicon glyphicon-exclamation-sign"></span> ' + data.error)
theButton.removeAttr("disabled")
}
})
})
jQuery('.delServer').click(function(){
if( confirm("$T('confirm')") ) {
jQuery(this).parents('form:first').attr('action',"$url('config/server/delete_server')").submit();
jQuery(this).parents('form:first').attr('action','delServer').submit();
// Let us leave!
formWasSubmitted = true;
formHasChanged = false;
@@ -628,7 +605,7 @@
jQuery('.clrServer').click(function(){
if( confirm("$T('confirm')") ) {
jQuery(this).parents('form:first').attr('action',"$url('config/server/clear_server')").submit();
jQuery(this).parents('form:first').attr('action','clrServer').submit();
// Let us leave!
formWasSubmitted = true;
formHasChanged = false;
@@ -641,8 +618,8 @@
var whichServer = jQuery(this).attr("name");
jQuery.ajax({
type: "POST",
url: "$url('config/server/toggle_server')",
data: {server: whichServer }
url: "toggleServer",
data: {server: whichServer, apikey: "$apikey" }
}).done(function() {
// Let us leave!
formWasSubmitted = true;
+14 -10
View File
@@ -20,7 +20,8 @@
<!--#set $selected_types = ["0"] if not len($selected_types) else $selected_types #-->
<!-- SORTER $cur -->
<div class="section <!--#if $cur != 0#-->sorter<!--#end if#-->" id="sorter_$cur" <!--#if $cur == 0#-->style="display: none;"<!--#end if#-->>
<form action="$url('config/sorting/save_sorter')" method="post" autocomplete="off" <!--#if $cur != 0#-->class="sorting-row"<!--#end if#-->>
<form action="save_sorter" method="post" autocomplete="off" <!--#if $cur != 0#-->class="sorting-row"<!--#end if#-->>
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="order" value="$slot.order" />
<input type="hidden" value="$slot.name" name="name" />
<!--#if $cur == 0#-->
@@ -346,7 +347,8 @@
<div class="section align-center sorting-quick-setup">
<h3>$T('sort-quick-add'):</h3>
<!--#if "tv" in $categories#-->
<form action="$url('config/sorting/save_sorter')" method="post" autocomplete="off">
<form action="save_sorter" method="post" autocomplete="off">
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="order" value="0" />
<input type="hidden" name="is_active" value="1" />
<input type="hidden" name="name" value="">
@@ -364,7 +366,8 @@
</form>
<!--#end if#-->
<!--#if "movies" in $categories#-->
<form action="$url('config/sorting/save_sorter')" method="post" autocomplete="off">
<form action="save_sorter" method="post" autocomplete="off">
<input type="hidden" name="apikey" value="$apikey" />
<input type="hidden" name="order" value="0" />
<input type="hidden" name="is_active" value="1" />
<input type="hidden" name="name" value="">
@@ -385,7 +388,7 @@
</div>
<!--#end if#-->
</div>
<script type="text/javascript" src="$url('staticcfg/js/jquery-ui.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="${root}staticcfg/js/jquery-ui.min.js"></script>
<script type="text/javascript">
// http://stackoverflow.com/questions/2219924/
var typewatch = (function(){
@@ -411,12 +414,13 @@
typewatch(function () {
jQuery.ajax({
type: "GET",
url: "$url('api')",
url: "../../api",
data: {
mode: 'eval_sort',
job_name: jQuery('#preview_name_' + sort_nr).val(),
sort_string: preview_sort_string,
multipart_label: jQuery('#multipart_label_' + sort_nr).val(),
apikey: '$apikey',
output: 'json'
},
success: function(data) {
@@ -433,7 +437,7 @@
jQuery(document).ready(function() {
jQuery('.delSorter').click(function() {
var theForm = jQuery(this).closest("form");
theForm.attr("action", "$url('config/sorting/delete')").submit();
theForm.attr("action", "delete").submit();
});
jQuery('.addSorter').click(function(){
@@ -490,8 +494,8 @@
var data = {}
jQuery(elm).extractFormDataTo(data);
jQuery.ajax({
type: "POST",
url: "$url('config/sorting/save_sorter')",
type: "GET",
url: window.location.pathname + 'save_sorter',
data: data,
async: false // To prevent race-conditions when updating sorters
})
@@ -505,8 +509,8 @@
var whichSorter = jQuery(this).attr("rel");
jQuery.ajax({
type: "POST",
url: "$url('config/sorting/toggle_sorter')",
data: {sorter: whichSorter }
url: "toggle_sorter",
data: {sorter: whichSorter, apikey: "$apikey" }
}).done(function() {
formWasSubmitted = true;
formHasChanged = false;
@@ -3,7 +3,8 @@
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="$url('config/special/save')" method="post" class="fullform" autocomplete="off">
<form action="saveSpecial" method="post" autocomplete="off">
<input type="hidden" id="apikey" name="apikey" value="$apikey" />
<div class="padTable">
<h4 class="darkred nomargin">$T('explain-special')</h4>
</div>
@@ -8,7 +8,9 @@
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
</div>
<form action="$url('config/switches/save')" method="post" class="fullform" autocomplete="off">
<form action="saveSwitches" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="apikey" name="apikey" value="$apikey" />
<input type="hidden" id="ajax" name="ajax" value="1" />
<input type="hidden" name="output" value="json" />
<div class="section advanced-settings">
<div class="col2">
@@ -393,9 +395,9 @@ jQuery(document).ready(function() {
// Send request
jQuery.ajax({
type: "POST",
url: "$url('api')",
data: "mode=set_config_default&output=json&keyword=" + key_container.join('&keyword=')
type: "GET",
url: "../../api",
data: "mode=set_config_default&apikey=${apikey}&output=json&keyword=" + key_container.join('&keyword=')
}).then(function(data) {
// Reload page
document.location = document.location
+17 -13
View File
@@ -1,5 +1,5 @@
<!DOCTYPE HTML>
<html lang="$active_lang" data-color-scheme="$color_scheme">
<html lang="$active_lang">
<head>
<title>SABnzbd - $T('login')</title>
@@ -7,19 +7,23 @@
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, maximum-scale=1" />
<meta name="apple-mobile-web-app-title" content="SABnzbd" />
<link rel="apple-touch-icon" sizes="76x76" href="$url('staticcfg/ico/apple-touch-icon-76x76-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="120x120" href="$url('staticcfg/ico/apple-touch-icon-120x120-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="152x152" href="$url('staticcfg/ico/apple-touch-icon-152x152-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="180x180" href="$url('staticcfg/ico/apple-touch-icon-180x180-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="192x192" href="$url('staticcfg/ico/android-192x192.png', v=$cache_buster)" />
<link rel="shortcut icon" href="$url('staticcfg/ico/favicon.ico', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="76x76" href="../staticcfg/ico/apple-touch-icon-76x76-precomposed.png" />
<link rel="apple-touch-icon" sizes="120x120" href="../staticcfg/ico/apple-touch-icon-120x120-precomposed.png" />
<link rel="apple-touch-icon" sizes="152x152" href="../staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
<link rel="apple-touch-icon" sizes="180x180" href="../staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
<link rel="apple-touch-icon" sizes="192x192" href="../staticcfg/ico/android-192x192.png" />
<link rel="shortcut icon" href="../staticcfg/ico/favicon.ico?v=$cache_buster" />
<link rel="stylesheet" type="text/css" href="$url('staticcfg/bootstrap/css/bootstrap.min.css', v=$cache_buster)" />
<link rel="stylesheet" type="text/css" href="$url('staticcfg/css/login.css', v=$cache_buster)" />
<link rel="stylesheet" type="text/css" href="../staticcfg/bootstrap/css/bootstrap.min.css?v=$cache_buster" />
<link rel="stylesheet" type="text/css" href="../staticcfg/css/login.css?v=$cache_buster" />
<!--#if $color_scheme not in ('Light', '') #-->
<link rel="stylesheet" type="text/css" href="../staticcfg/css/${color_scheme}.css?v=$cache_buster"/>
<!--#end if#-->
<script type="text/javascript" src="$url('staticcfg/js/jquery-3.7.1.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('staticcfg/bootstrap/js/bootstrap.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="../staticcfg/js/jquery-3.5.1.min.js?v=$cache_buster"></script>
<script type="text/javascript" src="../staticcfg/bootstrap/js/bootstrap.min.js?v=$cache_buster"></script>
</head>
<html>
<body>
<div class="account-wall">
<div class="text-center logo-header">
@@ -28,7 +32,7 @@
<span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span>
</a>
</div>
<form class="form-signin" action="./login" method="post">
<form class="form-signin" action="./" method="post">
<!--#if $error#-->
<div class="alert alert-danger" role="alert">$error</div>
<!--#end if#-->
@@ -59,4 +63,4 @@
} catch(err) { }
</script>
</body>
</html>
</html>
@@ -0,0 +1 @@
@import url('Night.css') screen and (prefers-color-scheme: dark);
@@ -0,0 +1,311 @@
/*
* Night theme — overrides :root color tokens defined in style.css.
* Only structural/behavioural rules that can't be expressed as color tokens remain below.
*/
:root {
--clr-page-bg: black;
--clr-surface: #303030;
--clr-surface-alt: #444444;
--clr-surface-hover: #666666;
--clr-border: #555555;
--clr-border-subtle: #252525;
--clr-text: #EBEBEB;
--clr-text-muted: #c7c7c7;
--clr-error: #ff3333;
--clr-link: #63a7e1;
--clr-input-bg: #555555;
--clr-input-border: #252525;
--clr-dropdown-bg: #444444;
--clr-modal-bg: #727272;
--clr-modal-header-bg: #3C3C3C;
--clr-table-bg: #555555;
--clr-table-row-alt: #444444;
--clr-toggle-inactive: #666666;
}
/* Links use a custom colour in dark mode */
a:not(.btn) {
color: var(--clr-link);
}
/* Buttons get a subtle white shadow in dark mode for depth */
.btn {
box-shadow: 1px 1px 1px rgba(255, 255, 255, .1);
}
/* Borders on interactive controls */
.btn:not(.btn-danger),
.btn-default,
input,
select,
textarea,
.advanced-button,
.list-group-item {
border-color: var(--clr-input-border) !important;
}
.advanced-button {
background-color: var(--clr-surface-alt);
}
/* Sidebar section header */
.col2 h3 {
background: none repeat scroll 0 0 var(--clr-surface-alt);
}
/* Various elements that need the alt surface */
.catTable,
.dropdown-menu .divider,
.Key tr:nth-child(odd),
.language:hover,
.navbar-default .navbar-nav>.open>a,
.navbar-default .navbar-nav>.open>a:focus,
.navbar-default .navbar-nav>.open>a:hover,
.navbar-default .navbar-nav>li>a.active,
.navbar-default .navbar-nav>li>a:hover,
.navbar-default .navbar-nav>li>a:focus,
.navbar-logo:hover,
.quoteBlock,
.server-disabled,
#serverResponse,
.table>tbody>tr:nth-child(odd),
.table-striped>tbody>tr:nth-child(odd),
ul.tabs li.active a,
select[disabled],
select:hover {
background-color: var(--clr-surface-alt) !important;
color: var(--clr-text) !important;
}
/* Button hovers */
.btn:not(.btn-danger):hover,
.btn:not(.btn-danger):active:focus {
background-color: var(--clr-surface-hover);
}
.btn:not(.btn-danger):active {
color: var(--clr-text);
}
/* Error / failed colour */
.failed {
color: var(--clr-error) !important;
}
/* Secondary text */
#rightGreyText,
small {
color: var(--clr-text-muted) !important;
}
/* Controls and form elements using input bg */
.advanced-buttonSeperator,
.alt,
.infoTableSeperator.alt,
.btn:not(.btn-danger),
.btn-default.disabled:active,
.btn-default.disabled:focus,
.btn-default.disabled:hover,
a.btn.btn-default,
select.form-control,
.form-control[disabled],
.input-group-addon,
#inner,
.navbar-default,
.search-box input,
.select,
.table-striped>tbody>tr:nth-child(even),
.table>tbody>tr:nth-child(even),
.tab-pane tr:nth-child(odd),
textarea,
ul.tabs a.active,
a.list-group-item,
.dropdown-menu>li>a,
input[type="text"],
input[type="email"],
input[type="url"],
input[type="date"],
input[type="number"],
input[type="password"],
input[disabled],
select {
background-color: var(--clr-input-bg);
color: var(--clr-text);
}
.Categories form.sorting-row:nth-child(2n-1) tr {
background-color: var(--clr-surface);
}
/* Focus / active border */
.btn-default:focus,
.form-control:focus,
input:focus,
textarea:focus,
select:focus {
border-color: #707070 !important;
outline: initial !important;
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
}
/* Modal backdrop */
.modal-backdrop {
background-color: #262626 !important;
}
/* Table structural */
.Key tr,
.Config .table {
border: none;
}
.table>tbody>tr>td,
.table>tbody>tr>th,
.infoTableSeperator,
.data-row {
border-top: none;
}
.modal-footer {
border-top: 1px solid rgb(131 131 131);
}
hr {
border-top: 1px solid var(--clr-border);
}
/* Danger button dark border */
.btn-danger {
border-color: #7b2b28;
}
/* Section borders */
.tab-content .catTable tbody,
ul.tabs a,
.section,
#addFeed,
#addFeedContent,
#subscriptions,
.RSS form[action="add_rss_feed"] tr:nth-child(even) {
border: 1px solid var(--clr-border);
}
/* Hover states */
.Categories form:first-of-type tr:last-of-type,
.default,
.dropdown-menu>li>a:focus,
.dropdown-menu>li>a:hover {
background-color: var(--clr-surface-hover);
}
/* Elements using primary text colour */
.activeRSS,
.activeRSS a,
.activeRSS a:visited,
.btn-default,
.checkbox label,
.feed-row td,
.help-block,
#content,
.navbar-default .navbar-nav>li>a,
.navbar-default .navbar-nav>li>a>.glyphicon,
.path,
.Servers .ct-label,
.time,
.main-restarting.in,
#search-dropdown .dropdown-header,
ul.tabs a,
a.wizard-advanced-settings,
.quoteBlock a,
a.main-helplink,
.col2 h3 a,
.text-center a,
.text-center a:hover {
color: var(--clr-text);
}
/* Remove backgrounds on container/content wrappers */
.container,
#content {
background-color: unset !important;
}
/* Server chart lines */
.Servers .ct-series-a .ct-line,
.Servers .ct-series-a .ct-point {
stroke: var(--clr-text);
}
/* Sections/cards use dark surface */
#inner,
.section,
#addFeed,
#addFeedContent {
background-color: var(--clr-surface);
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
}
/* Active tab uses card surface */
.nav.nav-tabs li a {
color: var(--clr-text);
}
.nav.nav-tabs li a:hover {
background-color: var(--clr-surface-alt);
border-color: var(--clr-border);
border-bottom: none;
}
.nav.nav-tabs li.active a,
.nav.nav-tabs li.active a:hover {
border-color: var(--clr-border);
border-bottom: none;
background-color: var(--clr-surface);
color: var(--clr-text);
}
/* QR modal needs light background */
#modal_qr .modal-body {
background-color: #EBEBEB;
}
/* RSS icon */
.rss-icon-svg {
fill: white;
}
.rss-symbol {
fill: var(--clr-input-bg);
}
/* Placeholder */
::placeholder {
color: var(--clr-text) !important;
opacity: 0.5;
}
/* Tooltip — inverted (light tooltip on dark page) */
.tooltip-inner {
background-color: #E4E4E4 !important;
color: #000 !important;
}
.tooltip.bottom .tooltip-arrow {
border-bottom-color: #E4E4E4 !important;
}
.tooltip.top .tooltip-arrow {
border-top-color: #E4E4E4 !important;
}
.tooltip.left .tooltip-arrow {
border-left-color: #E4E4E4 !important;
}
.tooltip.right .tooltip-arrow {
border-right-color: #E4E4E4 !important;
}
.Special .glyphicon-asterisk {
color: #E4E4E4 !important;
}
@@ -1,32 +1,19 @@
:root {
/* Follow the OS by default (Auto); forced by data-color-scheme below */
color-scheme: light dark;
/* Color palette — light-dark(light value, dark value) */
--clr-page-bg: light-dark(#E4E4E4, black);
--clr-surface: light-dark(#FFFFFF, #303030);
--clr-input-bg: light-dark(#FFFFFF, #555555);
--clr-border: light-dark(rgba(0, 0, 0, 0.15), #555555);
--clr-text: light-dark(#000000, #EBEBEB);
--clr-text-muted: light-dark(#636363, #c7c7c7);
/* Light mode defaults — overridden by Night.css */
--clr-page-bg: #E4E4E4;
--clr-surface: #FFFFFF;
--clr-input-bg: #FFFFFF;
--clr-border: rgba(0, 0, 0, 0.15);
--clr-text: #000000;
--clr-text-muted: #636363;
--radius-lg: 8px;
--clr-toggle-active: #f9ca33;
--clr-toggle-inactive: light-dark(#aaaaaa, #666666);
}
/* The server renders the configured scheme into this attribute; empty/unknown = Auto */
html[data-color-scheme="light" i] {
color-scheme: light;
}
html[data-color-scheme="night" i] {
color-scheme: dark;
--clr-toggle-inactive: #aaaaaa;
}
body {
overflow-y: scroll;
background-color: var(--clr-page-bg);
color: var(--clr-text);
}
.logo-header {
@@ -71,23 +58,10 @@ body {
margin-top: 5px
}
.form-signin input,
.form-signin .btn {
background-color: var(--clr-input-bg);
color: var(--clr-text);
border-color: light-dark(#ccc, #252525);
}
.form-signin .btn {
width: 100%;
margin-top: 10px;
font-weight: bold;
box-shadow: 1px 1px 1px light-dark(transparent, rgba(255, 255, 255, .1));
}
::placeholder {
color: var(--clr-text) !important;
opacity: 0.5;
}
.btn .glyphicon {
@@ -137,69 +111,3 @@ input[type="checkbox"]:focus-visible {
outline-offset: 2px;
border-radius: 10px;
}
/***
Dark-mode structural rules
Colors live in the light-dark() tokens above; these are the rules that cannot
be expressed as a color value. The two blocks below MUST stay identical:
the first applies when Night is forced, the second when the OS is dark and Light is not forced.
***/
html[data-color-scheme="night" i] {
/* Focus / active border */
.form-signin input:focus,
.form-signin .btn:focus {
border-color: #707070 !important;
outline: initial !important;
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
}
.text-center a,
.text-center a:hover {
color: var(--clr-text);
}
/* Tooltip — inverted (light tooltip on dark page) */
.tooltip-inner {
background-color: #E4E4E4 !important;
color: #000 !important;
}
.tooltip.bottom .tooltip-arrow {
border-bottom-color: #E4E4E4 !important;
}
.tooltip.top .tooltip-arrow {
border-top-color: #E4E4E4 !important;
}
}
@media (prefers-color-scheme: dark) {
html:not([data-color-scheme="light" i]) {
/* Focus / active border */
.form-signin input:focus,
.form-signin .btn:focus {
border-color: #707070 !important;
outline: initial !important;
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
}
.text-center a,
.text-center a:hover {
color: var(--clr-text);
}
/* Tooltip — inverted (light tooltip on dark page) */
.tooltip-inner {
background-color: #E4E4E4 !important;
color: #000 !important;
}
.tooltip.bottom .tooltip-arrow {
border-bottom-color: #E4E4E4 !important;
}
.tooltip.top .tooltip-arrow {
border-top-color: #E4E4E4 !important;
}
}
}
@@ -1,40 +1,29 @@
:root {
/* Follow the OS by default (Auto); forced by data-color-scheme below */
color-scheme: light dark;
/* Border radius scale */
--radius-sm: 4px; /* dropdowns */
--radius-md: 4px; /* inputs, buttons, section headers */
--radius-lg: 6px; /* cards, modals */
/* Color palette — light-dark(light value, dark value) */
--clr-page-bg: light-dark(#E4E4E4, black); /* body/page background */
--clr-surface: light-dark(#FFFFFF, #303030); /* cards/sections (.section, #addFeed, etc.) */
--clr-surface-alt: light-dark(#F8F8F8, #444444); /* alternating rows, .alt elements */
--clr-surface-hover: light-dark(#f6f6f6, #666666); /* hovered rows and buttons */
--clr-border: light-dark(#dfdede, #555555); /* card/section borders */
--clr-border-subtle: light-dark(#E5E5E5, #252525); /* inner dividers (#subscriptions, data-row) */
--clr-text: light-dark(#000000, #EBEBEB); /* primary body text */
--clr-text-muted: light-dark(#666666, #c7c7c7); /* secondary text (.col2 p, .feed-row td) */
--clr-error: light-dark(red, #ff3333); /* errors, failed items */
--clr-input-bg: light-dark(#FFFFFF, #555555); /* form inputs, buttons */
--clr-input-border: light-dark(#d4d0c8, #252525); /* input borders */
--clr-toggle-active: #f9ca33; /* accent color (toggles, focus rings) */
--clr-toggle-inactive: light-dark(#aaaaaa, #666666); /* toggle track when off */
--clr-dropdown-bg: light-dark(#FFFFFF, #444444); /* dropdown menus */
--clr-modal-bg: light-dark(#FFFFFF, #727272); /* modal body/footer */
--clr-modal-header-bg: #3C3C3C; /* modal header (dark in both themes) */
--clr-table-bg: light-dark(#FFFFFF, #555555); /* table background */
--clr-table-row-alt: light-dark(#F8F8F8, #444444); /* alternating table row background */
}
/* The server renders the configured scheme into this attribute; empty/unknown = Auto */
html[data-color-scheme="light" i] {
color-scheme: light;
}
html[data-color-scheme="night" i] {
color-scheme: dark;
/* Color palette — light mode defaults; override in Night.css */
--clr-page-bg: #E4E4E4; /* body/page background */
--clr-surface: #FFFFFF; /* cards/sections (.section, #addFeed, etc.) */
--clr-surface-alt: #F8F8F8; /* alternating rows, .alt elements */
--clr-surface-hover: #f6f6f6; /* hovered rows and buttons */
--clr-border: #dfdede; /* card/section borders */
--clr-border-subtle: #E5E5E5; /* inner dividers (#subscriptions, data-row) */
--clr-text: #000000; /* primary body text */
--clr-text-muted: #666666; /* secondary text (.col2 p, .feed-row td) */
--clr-error: red; /* errors, failed items */
--clr-link: inherit; /* links (Bootstrap default in light) */
--clr-input-bg: #FFFFFF; /* form inputs, buttons */
--clr-input-border: #d4d0c8; /* input borders */
--clr-toggle-active: #f9ca33; /* accent color (toggles, focus rings) */
--clr-toggle-inactive: #aaaaaa; /* toggle track when off */
--clr-dropdown-bg: #FFFFFF; /* dropdown menus */
--clr-modal-bg: #FFFFFF; /* modal body/footer */
--clr-modal-header-bg: #3C3C3C; /* modal header (dark in both themes) */
--clr-table-bg: #FFFFFF; /* table background */
--clr-table-row-alt: #F8F8F8; /* alternating table row background */
}
body {
@@ -42,18 +31,6 @@ body {
background-color: var(--clr-page-bg);
color: var(--clr-text);
}
/* Bootstrap's `a:focus { outline: 5px auto -webkit-focus-ring-color }` renders as a
heavy dark ring once color-scheme is declared. Replace it with a subtle themed
outline shown only for keyboard focus, matching the toggle-switch focus style. */
a:focus {
outline: none;
}
a:focus-visible {
outline: 2px solid var(--clr-toggle-active);
outline-offset: 2px;
}
#logo {
display: block;
margin: 3px auto auto;
@@ -525,7 +502,7 @@ tr.separator {
.RSS .catTable select {
max-width: 120px;
}
.RSS form[data-form="add-rss-feed"] tr:nth-child(even) {
.RSS form[action="add_rss_feed"] tr:nth-child(even) {
border: 1px solid #E5E5E5;
}
.RSS .tab-pane table th:not(.no-sort) {
@@ -726,10 +703,6 @@ input:has(+ .clearBtn) {
#filebrowser_modal .list-group-item {
font-weight: bold;
}
#filebrowser_modal a.list-group-item:hover,
#filebrowser_modal a.list-group-item:focus {
background-color: var(--clr-surface-hover);
}
#filebrowser_modal .list-group-item span {
margin-right: 10px;
top: 0;
@@ -1035,12 +1008,12 @@ input[type="checkbox"] {
max-width: 150px !important;
}
.Scheduling form[data-form="add-schedule"] input[type="checkbox"] {
.Scheduling form[action="addSchedule"] input[type="checkbox"] {
margin-top: 0px;
margin-left: -20px;
}
.Scheduling form[data-form="del-schedule"] input[type="checkbox"] {
.Scheduling form[action="delSchedule"] input[type="checkbox"] {
position: initial;
float: left;
margin: 9px 10px 0px 5px;
@@ -1429,7 +1402,7 @@ html[dir="rtl"] .checkbox-days {
float: none;
}
html[dir="rtl"] .Scheduling form[data-form="add-schedule"] input[type="checkbox"] {
html[dir="rtl"] .Scheduling form[action="addSchedule"] input[type="checkbox"] {
right: 5px;
}
@@ -1627,591 +1600,3 @@ html[dir="rtl"] .Scheduling form[data-form="add-schedule"] input[type="checkbox"
padding-right: 5px;
}
}
/***
Dark-mode structural rules
Colors live in the light-dark() tokens above; these are the rules that cannot
be expressed as a color value. The two blocks below MUST stay identical:
the first applies when Night is forced, the second when the OS is dark and Light is not forced.
***/
html[data-color-scheme="night" i] {
/* Links use a custom colour in dark mode */
a:not(.btn) {
color: #63a7e1;
}
/* Buttons get a subtle white shadow in dark mode for depth */
.btn {
box-shadow: 1px 1px 1px rgba(255, 255, 255, .1);
}
/* Borders on interactive controls */
.btn:not(.btn-danger),
.btn-default,
input,
select,
textarea,
.advanced-button,
.list-group-item {
border-color: var(--clr-input-border) !important;
}
.advanced-button {
background-color: var(--clr-surface-alt);
}
/* Sidebar section header */
.col2 h3 {
background: none repeat scroll 0 0 var(--clr-surface-alt);
}
/* Various elements that need the alt surface */
.catTable,
.dropdown-menu .divider,
.Key tr:nth-child(odd),
.language:hover,
.navbar-default .navbar-nav>.open>a,
.navbar-default .navbar-nav>.open>a:focus,
.navbar-default .navbar-nav>.open>a:hover,
.navbar-default .navbar-nav>li>a.active,
.navbar-default .navbar-nav>li>a:hover,
.navbar-default .navbar-nav>li>a:focus,
.navbar-logo:hover,
.quoteBlock,
.server-disabled,
#serverResponse,
.table>tbody>tr:nth-child(odd),
.table-striped>tbody>tr:nth-child(odd),
ul.tabs li.active a,
select[disabled],
select:hover {
background-color: var(--clr-surface-alt) !important;
color: var(--clr-text) !important;
}
/* Button hovers */
.btn:not(.btn-danger):hover,
.btn:not(.btn-danger):active:focus {
background-color: var(--clr-surface-hover);
}
.btn:not(.btn-danger):active {
color: var(--clr-text);
}
/* Error / failed colour */
.failed {
color: var(--clr-error) !important;
}
/* Secondary text */
#rightGreyText,
small {
color: var(--clr-text-muted) !important;
}
/* Controls and form elements using input bg */
.advanced-buttonSeperator,
.alt,
.infoTableSeperator.alt,
.btn:not(.btn-danger),
.btn-default.disabled:active,
.btn-default.disabled:focus,
.btn-default.disabled:hover,
a.btn.btn-default,
select.form-control,
.form-control[disabled],
.input-group-addon,
#inner,
.navbar-default,
.search-box input,
.select,
.table-striped>tbody>tr:nth-child(even),
.table>tbody>tr:nth-child(even),
.tab-pane tr:nth-child(odd),
textarea,
ul.tabs a.active,
a.list-group-item,
.dropdown-menu>li>a,
input[type="text"],
input[type="email"],
input[type="url"],
input[type="date"],
input[type="number"],
input[type="password"],
input[disabled],
select {
background-color: var(--clr-input-bg);
color: var(--clr-text);
}
.Categories form.sorting-row:nth-child(2n-1) tr {
background-color: var(--clr-surface);
}
/* Focus / active border */
.btn-default:focus,
.form-control:focus,
input:focus,
textarea:focus,
select:focus {
border-color: #707070 !important;
outline: initial !important;
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
}
/* Modal backdrop */
.modal-backdrop {
background-color: #262626 !important;
}
/* Table structural */
.Key tr,
.Config .table {
border: none;
}
.table>tbody>tr>td,
.table>tbody>tr>th,
.infoTableSeperator,
.data-row {
border-top: none;
}
.modal-footer {
border-top: 1px solid rgb(131 131 131);
}
hr {
border-top: 1px solid var(--clr-border);
}
/* Danger button dark border */
.btn-danger {
border-color: #7b2b28;
}
/* Section borders */
.tab-content .catTable tbody,
ul.tabs a,
.section,
#addFeed,
#addFeedContent,
#subscriptions,
.RSS form[data-form="add-rss-feed"] tr:nth-child(even),
.Config .table {
border: 1px solid var(--clr-border);
}
/* Hover states */
.Categories form:first-of-type tr:last-of-type,
.default,
.dropdown-menu>li>a:focus,
.dropdown-menu>li>a:hover {
background-color: var(--clr-surface-hover);
}
/* Elements using primary text colour */
.activeRSS,
.activeRSS a,
.activeRSS a:visited,
.btn-default,
.checkbox label,
.feed-row td,
.help-block,
#content,
.navbar-default .navbar-nav>li>a,
.navbar-default .navbar-nav>li>a>.glyphicon,
.path,
.Servers .ct-label,
.time,
.main-restarting.in,
#search-dropdown .dropdown-header,
ul.tabs a,
a.wizard-advanced-settings,
.quoteBlock a,
a.main-helplink,
.col2 h3 a,
.text-center a,
.text-center a:hover {
color: var(--clr-text);
}
/* Remove backgrounds on container/content wrappers */
.container,
#content {
background-color: unset !important;
}
/* Server chart lines */
.Servers .ct-series-a .ct-line,
.Servers .ct-series-a .ct-point {
stroke: var(--clr-text);
}
/* Sections/cards use dark surface */
#inner,
.section,
#addFeed,
#addFeedContent {
background-color: var(--clr-surface);
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
}
/* Active tab uses card surface */
.nav.nav-tabs li a {
color: var(--clr-text);
}
.nav.nav-tabs li a:hover {
background-color: var(--clr-surface-alt);
border-color: var(--clr-border);
border-bottom: none;
}
.nav.nav-tabs li.active a,
.nav.nav-tabs li.active a:hover {
border-color: var(--clr-border);
border-bottom: none;
background-color: var(--clr-surface);
color: var(--clr-text);
}
/* QR modal needs light background */
#modal_qr .modal-body {
background-color: #EBEBEB;
}
/* RSS icon */
.rss-icon-svg {
fill: white;
}
.rss-symbol {
fill: var(--clr-input-bg);
}
/* Placeholder */
::placeholder {
color: var(--clr-text) !important;
opacity: 0.5;
}
/* Tooltip — inverted (light tooltip on dark page) */
.tooltip-inner {
background-color: #E4E4E4 !important;
color: #000 !important;
}
.tooltip.bottom .tooltip-arrow {
border-bottom-color: #E4E4E4 !important;
}
.tooltip.top .tooltip-arrow {
border-top-color: #E4E4E4 !important;
}
.tooltip.left .tooltip-arrow {
border-left-color: #E4E4E4 !important;
}
.tooltip.right .tooltip-arrow {
border-right-color: #E4E4E4 !important;
}
.Special .glyphicon-asterisk {
color: #E4E4E4 !important;
}
}
@media (prefers-color-scheme: dark) {
html:not([data-color-scheme="light" i]) {
/* Links use a custom colour in dark mode */
a:not(.btn) {
color: #63a7e1;
}
/* Buttons get a subtle white shadow in dark mode for depth */
.btn {
box-shadow: 1px 1px 1px rgba(255, 255, 255, .1);
}
/* Borders on interactive controls */
.btn:not(.btn-danger),
.btn-default,
input,
select,
textarea,
.advanced-button,
.list-group-item {
border-color: var(--clr-input-border) !important;
}
.advanced-button {
background-color: var(--clr-surface-alt);
}
/* Sidebar section header */
.col2 h3 {
background: none repeat scroll 0 0 var(--clr-surface-alt);
}
/* Various elements that need the alt surface */
.catTable,
.dropdown-menu .divider,
.Key tr:nth-child(odd),
.language:hover,
.navbar-default .navbar-nav>.open>a,
.navbar-default .navbar-nav>.open>a:focus,
.navbar-default .navbar-nav>.open>a:hover,
.navbar-default .navbar-nav>li>a.active,
.navbar-default .navbar-nav>li>a:hover,
.navbar-default .navbar-nav>li>a:focus,
.navbar-logo:hover,
.quoteBlock,
.server-disabled,
#serverResponse,
.table>tbody>tr:nth-child(odd),
.table-striped>tbody>tr:nth-child(odd),
ul.tabs li.active a,
select[disabled],
select:hover {
background-color: var(--clr-surface-alt) !important;
color: var(--clr-text) !important;
}
/* Button hovers */
.btn:not(.btn-danger):hover,
.btn:not(.btn-danger):active:focus {
background-color: var(--clr-surface-hover);
}
.btn:not(.btn-danger):active {
color: var(--clr-text);
}
/* Error / failed colour */
.failed {
color: var(--clr-error) !important;
}
/* Secondary text */
#rightGreyText,
small {
color: var(--clr-text-muted) !important;
}
/* Controls and form elements using input bg */
.advanced-buttonSeperator,
.alt,
.infoTableSeperator.alt,
.btn:not(.btn-danger),
.btn-default.disabled:active,
.btn-default.disabled:focus,
.btn-default.disabled:hover,
a.btn.btn-default,
select.form-control,
.form-control[disabled],
.input-group-addon,
#inner,
.navbar-default,
.search-box input,
.select,
.table-striped>tbody>tr:nth-child(even),
.table>tbody>tr:nth-child(even),
.tab-pane tr:nth-child(odd),
textarea,
ul.tabs a.active,
a.list-group-item,
.dropdown-menu>li>a,
input[type="text"],
input[type="email"],
input[type="url"],
input[type="date"],
input[type="number"],
input[type="password"],
input[disabled],
select {
background-color: var(--clr-input-bg);
color: var(--clr-text);
}
.Categories form.sorting-row:nth-child(2n-1) tr {
background-color: var(--clr-surface);
}
/* Focus / active border */
.btn-default:focus,
.form-control:focus,
input:focus,
textarea:focus,
select:focus {
border-color: #707070 !important;
outline: initial !important;
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
}
/* Modal backdrop */
.modal-backdrop {
background-color: #262626 !important;
}
/* Table structural */
.Key tr,
.Config .table {
border: none;
}
.table>tbody>tr>td,
.table>tbody>tr>th,
.infoTableSeperator,
.data-row {
border-top: none;
}
.modal-footer {
border-top: 1px solid rgb(131 131 131);
}
hr {
border-top: 1px solid var(--clr-border);
}
/* Danger button dark border */
.btn-danger {
border-color: #7b2b28;
}
/* Section borders */
.tab-content .catTable tbody,
ul.tabs a,
.section,
#addFeed,
#addFeedContent,
#subscriptions,
.RSS form[data-form="add-rss-feed"] tr:nth-child(even),
.Config .table {
border: 1px solid var(--clr-border);
}
/* Hover states */
.Categories form:first-of-type tr:last-of-type,
.default,
.dropdown-menu>li>a:focus,
.dropdown-menu>li>a:hover {
background-color: var(--clr-surface-hover);
}
/* Elements using primary text colour */
.activeRSS,
.activeRSS a,
.activeRSS a:visited,
.btn-default,
.checkbox label,
.feed-row td,
.help-block,
#content,
.navbar-default .navbar-nav>li>a,
.navbar-default .navbar-nav>li>a>.glyphicon,
.path,
.Servers .ct-label,
.time,
.main-restarting.in,
#search-dropdown .dropdown-header,
ul.tabs a,
a.wizard-advanced-settings,
.quoteBlock a,
a.main-helplink,
.col2 h3 a,
.text-center a,
.text-center a:hover {
color: var(--clr-text);
}
/* Remove backgrounds on container/content wrappers */
.container,
#content {
background-color: unset !important;
}
/* Server chart lines */
.Servers .ct-series-a .ct-line,
.Servers .ct-series-a .ct-point {
stroke: var(--clr-text);
}
/* Sections/cards use dark surface */
#inner,
.section,
#addFeed,
#addFeedContent {
background-color: var(--clr-surface);
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
}
/* Active tab uses card surface */
.nav.nav-tabs li a {
color: var(--clr-text);
}
.nav.nav-tabs li a:hover {
background-color: var(--clr-surface-alt);
border-color: var(--clr-border);
border-bottom: none;
}
.nav.nav-tabs li.active a,
.nav.nav-tabs li.active a:hover {
border-color: var(--clr-border);
border-bottom: none;
background-color: var(--clr-surface);
color: var(--clr-text);
}
/* QR modal needs light background */
#modal_qr .modal-body {
background-color: #EBEBEB;
}
/* RSS icon */
.rss-icon-svg {
fill: white;
}
.rss-symbol {
fill: var(--clr-input-bg);
}
/* Placeholder */
::placeholder {
color: var(--clr-text) !important;
opacity: 0.5;
}
/* Tooltip — inverted (light tooltip on dark page) */
.tooltip-inner {
background-color: #E4E4E4 !important;
color: #000 !important;
}
.tooltip.bottom .tooltip-arrow {
border-bottom-color: #E4E4E4 !important;
}
.tooltip.top .tooltip-arrow {
border-top-color: #E4E4E4 !important;
}
.tooltip.left .tooltip-arrow {
border-left-color: #E4E4E4 !important;
}
.tooltip.right .tooltip-arrow {
border-right-color: #E4E4E4 !important;
}
.Special .glyphicon-asterisk {
color: #E4E4E4 !important;
}
}
}
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
@@ -243,11 +243,6 @@ $.fn.extractFormDataTo = function(target) {
*
* (c) 2015 SABnzbd Team, Inc. All rights reserved.
*/
$.ajaxSetup({
headers: { "X-SABnzbd-CSRF": csrfToken }
});
function config_success() {
$('.saveButton[disabled=disabled]').each(function () {
$(this).removeAttr("disabled").html('<span class="glyphicon glyphicon-ok"></span> '+configTranslate.saveChanges);
@@ -296,7 +291,7 @@ function do_restart() {
$('.main-restarting .restarting-url').text(urlTotal)
// Initiate restart
$.ajax({ url: rootURL + 'api?mode=restart', type: 'POST',
$.ajax({ url: '../../api?mode=restart&apikey=' + sabSession,
complete: function() {
// Keep counter of failures
var loopCounter = 0;
@@ -376,8 +371,6 @@ jQuery.extend(jQuery.fn.typeahead.defaults, {
})
$(document).ready(function () {
$('form').append('<input type="hidden" name="csrf_token" value="' + csrfToken + '">');
/**
Restart function
**/
@@ -410,7 +403,7 @@ $(document).ready(function () {
$(this).attr("disabled", "disabled").removeClass('btn-danger').html('<span class="glyphicon glyphicon-transfer"></span> ' + configTranslate.saving);
});
},
success: function (json, statusText, xhr, form) {
success: function (json) {
if (json.error) {
$('#config_err_msg').text(json.error);
alert(json.error)
@@ -424,12 +417,6 @@ $(document).ready(function () {
$('#config_err_msg').text(" ");
setTimeout(config_success, 1000);
}
} else if(form && form.is('[data-reload-on-save]')) {
// Values changed that are rendered by the server, so reload the page
$('#config_err_msg').text(" ");
formWasSubmitted = true;
formHasChanged = false;
location.reload();
} else {
$('#config_err_msg').text(" ");
setTimeout(config_success, 1000);
@@ -522,7 +509,7 @@ $(document).ready(function() {
// Load things to search if we haven't yet
if(!pagesContainer[0]) {
$.each(arrPages, function(index, page) {
$.get(rootURL + 'config/' + page, function(data) {
$.get(rootURL + 'config/' + page + '/', function(data) {
pagesContainer[index] = $(data).find('label')
});
});
@@ -651,7 +638,7 @@ function doConfigSearch(value) {
searchOutput.append($('<li class="divider"></li>'))
searchOutput.append($('<li class="dropdown-header"></li>').text(configTranslate.searchPages[page_index]))
$.each(subResults, function(index, result) {
var resultUrl = rootURL + 'config/' + arrPages[page_index] + '#' + $(result).attr('for')
var resultUrl = rootURL + 'config/' + arrPages[page_index] + '/#' + $(result).attr('for')
searchOutput.append(
$('<li></li>').append(
$('<a class="config-search-result"></a>')
@@ -5,17 +5,17 @@
<span class="glyphicon glyphicon-tasks" data-tooltip="true" data-placement="left" title="$T('Glitter-multiOperations')"></span>
</a>
</div>
<table class="table table-hover history-table paginated" aria-label="$T('menu-history')">
<table class="table table-hover history-table paginated">
<thead>
<tr>
<th scope="col" style="width: 25px;"><span class="sr-only">$T('Glitter-result')</span></th>
<th scope="col"><span class="sr-only">$T('name')</span></th>
<th class="table-status-header" scope="col" data-bind="css: { 'table-header-status-smaller' : extraHistoryColumns().length || displayCompact() }"><span class="sr-only">$T('status')</span></th>
<th style="width: 25px;"></th>
<th></th>
<th class="table-status-header" data-bind="css: { 'table-header-status-smaller' : extraHistoryColumns().length || displayCompact() }"></th>
<!-- ko foreach: extraHistoryColumns -->
<th class="table-header-extra" scope="col"><span class="sr-only" data-bind="text: glitterTranslate.column[\$data]"></span></th>
<th class="table-header-extra"></th>
<!-- /ko -->
<th scope="col" style="width: 130px;"><span class="sr-only">$T('post-Completed')</span></th>
<th scope="col" style="width: 60px;"><span class="sr-only">$T('Glitter-actions')</span></th>
<th style="width: 130px;"></th>
<th style="width: 60px;"></th>
</tr>
</thead>
<!-- ko if: !hasHistory() -->
@@ -30,10 +30,10 @@
<tbody data-bind="foreach: history.historyItems, visible: hasHistory()" style="display: none;">
<tr class="history-item" data-bind="css: {'history-failed-download':failed()}">
<td>
<div role="img" aria-label="$T('post-Queued')" data-bind="visible: processingWaiting()">
<span class="glyphicon glyphicon-time" aria-hidden="true"></span>
<div data-bind="visible: processingWaiting()">
<span class="glyphicon glyphicon-time"></span>
</div>
<div role="img" aria-label="$T('stage-download')" data-bind="visible: processingDownload()">
<div data-bind="visible: processingDownload()">
<div class="processing-download">
<div class="loader-bar-one"></div>
<div class="loader-bar-two"></div>
@@ -41,17 +41,17 @@
<div class="loader-bar-four"></div>
</div>
</div>
<div role="img" aria-label="$T('post-Completed')" data-bind="visible: (!failed() && !processingDownload() && !processingWaiting())">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<div data-bind="visible: (!failed() && !processingDownload() && !processingWaiting())">
<span class="glyphicon glyphicon-ok"></span>
</div>
<div data-bind="visible: failed() && canRetry()">
<a class="retry-button" href="#" aria-label="$T('button-retry')" data-bind="click: retry">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="glyphicon glyphicon-exclamation-sign"></span>
</a>
</div>
<div data-bind="visible: failed() && !canRetry()">
<span class="retry-button-inactive" role="img" aria-label="$T('post-Failed')">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="glyphicon glyphicon-exclamation-sign"></span>
</span>
</div>
</td>
@@ -138,7 +138,7 @@
<div class="input-group search-box">
<input type="text" class="form-control" placeholder="$T('Glitter-search')" aria-label="$T('Glitter-search')" required data-bind="textInput: history.searchTerm, event: { keydown: history.clearSearchTerm }" />
<a href="#" data-tooltip="true" data-html="true" data-placement="right" title="$T('Glitter-searchExplain')" data-bind="click: history.clearSearchTerm, attr: { 'aria-label': history.searchTerm() ? '$T('Glitter-clearSearch')' : '$T('Glitter-search')' }">
<a href="#" data-bind="click: history.clearSearchTerm, attr: { 'aria-label': history.searchTerm() ? '$T('Glitter-clearSearch')' : '$T('Glitter-search')' }">
<span class="glyphicon" data-bind="css: { 'glyphicon-search' : !history.searchTerm(), 'glyphicon-remove' : history.searchTerm() }"></span>
</a>
</div>
+7 -21
View File
@@ -5,7 +5,7 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-logo" href="$url()" aria-label="SABnzbd $T('menu-queue')">
<a class="navbar-logo" href="./" aria-label="SABnzbd $T('menu-queue')">
#include $webdir + "/../../Config/templates/staticcfg/images/logo-small.svg"#
</a>
<div class="btn-group">
@@ -48,7 +48,7 @@
</a>
<div class="dropdown-menu max-speed-input">
<div data-bind="visible: !bandwithLimit()">
<a href="$url('config/general#bandwidth_max_value')">
<a href="./config/general/#bandwidth_max_value">
<span class="glyphicon glyphicon-cog"></span> $T('Glitter-setMaxLinespeed')
</a>
</div>
@@ -68,7 +68,7 @@
</li>
<!--#if $have_rss_defined#-->
<li data-tooltip="true" data-placement="bottom" title="$T('cmenu-rss')">
<a href="$url('config/rss')" aria-label="$T('cmenu-rss')">
<a href="./config/rss/" aria-label="$T('cmenu-rss')">
<svg class="rss-icon-svg" viewBox="0 0 8 8">
<rect class="rss-button" width="8" height="8" />
<circle class="rss-symbol" cx="2" cy="6" r="1" />
@@ -79,7 +79,7 @@
</li>
<!--#end if#-->
<li data-tooltip="true" data-placement="bottom" title="SABnzbd $T('menu-config')">
<a href="$url('config')" aria-label="SABnzbd $T('menu-config')"><span class="glyphicon glyphicon-cog"></span></a>
<a href="./config/" aria-label="SABnzbd $T('menu-config')"><span class="glyphicon glyphicon-cog"></span></a>
</li>
<li class="dropdown main-menu-link" data-bind="css: { 'active-on-queue-finish-menu': finishaction()}">
<a href="#" data-toggle="dropdown" onclick="keepOpen(this)" aria-label="$T('Glitter-mainMenu')" aria-haspopup="true" aria-expanded="false">
@@ -91,28 +91,14 @@
<li><a href="#modal-help" data-toggle="modal"><span class="glyphicon glyphicon-question-sign"></span> $T('menu-help')</a></li>
<li><a href="https://sabnzbd.org/donate" target="_blank"><span class="glyphicon glyphicon-heart"></span> $T('menu-donate')</a></li>
<!--#if $have_logout or $have_quota or $have_rss_defined or $have_watched_dir or $pp_pause_event#--><li class="divider"></li><!--#end if#-->
<!--#if $have_logout#--><li>
<form method="post" action="$url('logout')">
<input type="hidden" name="csrf_token" value="$csrf_token" />
<button type="submit"><span class="glyphicon glyphicon-log-out"></span> $T('logout')</button>
</form>
</li><!--#end if#-->
<!--#if $have_logout#--><li><a href="./login/?logout=1"><span class="glyphicon glyphicon-log-out"></span> $T('logout')</a></li><!--#end if#-->
<!--#if $have_quota#--><li><a href="#" data-bind="click: doQueueAction" data-mode="reset_quota">$T('link-resetQuota')</a></li><!--#end if#-->
<!--#if $have_rss_defined#--><li><a href="#" data-bind="click: doQueueAction" data-mode="rss_now">$T('button-rssNow')</a></li><!--#end if#-->
<!--#if $have_watched_dir#--><li><a href="#" data-bind="click: doQueueAction" data-mode="watched_now">$T('sch-scan_folder')</a></li><!--#end if#-->
<!--#if $pp_pause_event#--><li><a href="#" data-bind="click: doQueueAction" data-mode="resume_pp">$T('sch-resume_post')</a></li><!--#end if#-->
<li class="divider"></li>
<li>
<form method="post" action="$url('shutdown')" data-bind="submit: shutdownSAB">
<input type="hidden" name="csrf_token" value="$csrf_token" />
<button type="submit">$T('shutdownSab')</button>
</form>
</li>
<li>
<form data-bind="submit: restartSAB">
<button type="submit">$T('Glitter-restartSab')</button>
</form>
</li>
<li><a href="./shutdown/?apikey=$apikey&amp;pid=$pid" data-bind="click: shutdownSAB">$T('shutdownSab')</a></li>
<li><a href="#" data-bind="click: restartSAB">$T('Glitter-restartSab')</a></li>
<li class="divider"></li>
<li class="dropdown-header"><span class="glyphicon glyphicon-off"></span> $T('Glitter-onFinish'):</li>
<li>
@@ -72,13 +72,13 @@
</div>
<!-- Modals -->
<div id="modal-options" class="modal fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-options-title">
<div id="modal-options" class="modal fade" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<a href="#" data-bind="click: loadStatusInfo, css: { 'rotate-refresh': !hasStatusInfo() }" title="$T('Glitter-interfaceRefresh')"><span class="glyphicon glyphicon-repeat"></span></a>
<h4 class="modal-title" id="modal-options-title">$T('Glitter-statusInterfaceOptions')</h4>
<h4 class="modal-title">$T('Glitter-statusInterfaceOptions')</h4>
</div>
<div class="modal-body">
<ul class="nav nav-tabs">
@@ -197,12 +197,9 @@
</div>
<div class="row options-function-box">
<div class="col-sm-6">
<form method="post" action="$url('log')" target="_blank">
<input type="hidden" name="csrf_token" value="$csrf_token" />
<button type="submit" class="btn btn-default" data-tooltip="true" data-placement="top" title="$T('Glitter-logText')">
<span class="glyphicon glyphicon-file"></span> $T('link-showLog')
</button>
</form>
<a href="./api?mode=showlog&apikey=$apikey" target="_blank" class="btn btn-default" data-tooltip="true" data-placement="top" title="$T('Glitter-logText')">
<span class="glyphicon glyphicon-file"></span> $T('link-showLog')
</a>
</div>
<div class="col-sm-6">
<div class="input-group" data-tooltip="true" data-placement="top" title="$T('logging')">
@@ -488,12 +485,12 @@
</div>
</div>
<div id="modal-add-nzb" class="modal fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-add-nzb-title">
<div id="modal-add-nzb" class="modal fade" tabindex="-1">
<div class="modal-dialog">
<form class="modal-content" data-bind="submit: addNZB">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="modal-add-nzb-title">$T('Glitter-addNZB')</h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">$T('Glitter-addNZB')</h4>
</div>
<div class="modal-body form-horizontal">
<div class="row">
@@ -580,12 +577,12 @@
</div>
</div>
<div id="modal-item-files" class="modal fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-item-files-title">
<div id="modal-item-files" class="modal fade" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title row-wrap-text" id="modal-item-files-title" data-bind="text: filelist.filelist_name">$T('Glitter-loading')</h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title row-wrap-text" data-bind="text: filelist.filelist_name">$T('Glitter-loading')</h4>
</div>
<div class="modal-body">
<div id="modal-item-filelist">
@@ -648,12 +645,12 @@
</div>
</div>
<div id="modal-delete-queue-job" class="modal modal-delete-job fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-delete-queue-job-title">
<div id="modal-delete-queue-job" class="modal modal-delete-job fade" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title row-wrap-text" id="modal-delete-queue-job-title">$T('removeNZB-Files')</h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title row-wrap-text">$T('removeNZB-Files')</h4>
</div>
<form data-bind="submit: queue.removeDownloads">
<div class="modal-body">
@@ -672,12 +669,12 @@
</div>
</div>
<div id="modal-delete-history-job" class="modal modal-delete-job fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-delete-history-job-title">
<div id="modal-delete-history-job" class="modal modal-delete-job fade" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title row-wrap-text" id="modal-delete-history-job-title">$T('nzo-delete')</h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title row-wrap-text">$T('nzo-delete')</h4>
</div>
<form data-bind="submit: history.removeDownloads">
<div class="modal-body">
@@ -701,12 +698,12 @@
</div>
</div>
<div id="modal-retry-job" class="modal modal-small fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-retry-job-title">
<div id="modal-retry-job" class="modal modal-small fade" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="modal-retry-job-title">$T('Glitter-retryJob')</h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">$T('Glitter-retryJob')</h4>
</div>
<form id="retry-job-form" data-bind="submit: history.retryJob">
<div class="modal-body">
@@ -743,24 +740,24 @@
</div>
</div>
<div id="history-script-log" class="modal fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="history-script-log-title">
<div id="history-script-log" class="modal fade" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="history-script-log-title">$T('Glitter-scriptLog')</h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">$T('Glitter-scriptLog')</h4>
</div>
<div class="modal-body"><pre></pre></div>
<div class="modal-body"></div>
</div>
</div>
</div>
<div id="modal-help" class="modal fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-help-title">
<div id="modal-help" class="modal fade">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="modal-help-title">$T('menu-help')</h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">$T('menu-help')</h4>
</div>
<div class="modal-body">
#include $webdir + "/../../Config/templates/staticcfg/images/logo-full.svg"#
@@ -793,12 +790,12 @@
</div>
</div>
<div id="modal-purge-history" class="modal modal-small fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-purge-history-title">
<div id="modal-purge-history" class="modal modal-small fade" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="modal-purge-history-title">$T('Glitter-clearHistory')</h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">$T('Glitter-clearHistory')</h4>
</div>
<div class="modal-body">
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purge-failed"><span class="glyphicon glyphicon-floppy-remove"></span> $T('purgeFailed')</button>
@@ -817,12 +814,12 @@
</div>
</div>
<div id="modal-custom-pause" class="modal modal-small fade" tabindex="-1" role="dialog" aria-modal="true" aria-labelledby="modal-custom-pause-title">
<div id="modal-custom-pause" class="modal modal-small fade" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="$T('close')"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="modal-custom-pause-title">$T('Glitter-pauseFor')</h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">$T('Glitter-pauseFor')</h4>
</div>
<div class="modal-body">
<form data-bind="submit: saveCustomPause">
@@ -58,17 +58,17 @@
</div>
</div>
<div class="clearfix"></div>
<table class="table table-striped table-hover queue-table" aria-label="$T('menu-queue')">
<table class="table table-striped table-hover queue-table">
<thead>
<tr>
<th scope="col" style="width: 25px;"><span class="sr-only">$T('status')</span></th>
<th scope="col"><span class="sr-only">$T('name')</span></th>
<th style="width: 25px;"></th>
<th></th>
<!-- ko foreach: extraQueueColumns -->
<th class="table-header-extra" scope="col"><span class="sr-only" data-bind="text: glitterTranslate.column[\$data]"></span></th>
<th class="table-header-extra"></th>
<!-- /ko -->
<th class="table-header-progress" scope="col" data-bind="css: { 'table-header-progress-smaller' : extraQueueColumns().length || displayCompact() }"><span class="sr-only">$T('Glitter-progress')</span></th>
<th scope="col" style="width: 85px;"><span class="sr-only">$T('status')</span></th>
<th scope="col" style="width: 60px;"><span class="sr-only">$T('Glitter-actions')</span></th>
<th class="table-header-progress" data-bind="css: { 'table-header-progress-smaller' : extraQueueColumns().length || displayCompact() }"></th>
<th style="width: 85px;"></th>
<th style="width: 60px;"></th>
</tr>
</thead>
<!-- ko if: !hasQueue() -->
@@ -137,7 +137,7 @@
<!-- /ko -->
<td class="progress-indicator">
<div class="progress">
<div class="progress-bar progress-bar-info" role="progressbar" aria-label="$T('Glitter-progress')" aria-valuemin="0" aria-valuemax="100" data-bind="attr: { 'style': 'width: ' + percentage() + '%; background-color: ' + progressColor() + ';', 'aria-valuenow': percentage() }">
<div class="progress-bar progress-bar-info" data-bind="attr: { 'style': 'width: ' + percentage() + '%; background-color: ' + progressColor() + ';' }">
<strong data-bind="text: percentage() + '%'"></strong>
<i data-bind="text: missingText"></i>
</div>
@@ -232,7 +232,7 @@
<div class="input-group search-box" data-bind="visible: queue.hasQueueSearch" style="display: none;">
<input type="text" class="form-control" placeholder="$T('Glitter-search')" aria-label="$T('Glitter-search')" required data-bind="textInput: queue.searchTerm, event: { keydown: queue.clearSearchTerm }" />
<a href="#" data-tooltip="true" data-html="true" data-placement="right" title="$T('Glitter-searchExplain')" data-bind="click: queue.clearSearchTerm, attr: { 'aria-label': queue.searchTerm() ? '$T('Glitter-clearSearch')' : '$T('Glitter-search')' }">
<a href="#" data-bind="click: queue.clearSearchTerm, attr: { 'aria-label': queue.searchTerm() ? '$T('Glitter-clearSearch')' : '$T('Glitter-search')' }">
<span class="glyphicon" data-bind="css: { 'glyphicon-search' : !queue.searchTerm(), 'glyphicon-remove' : queue.searchTerm() }"></span>
</a>
</div>
+27 -39
View File
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--#set $active_lang=$active_lang.replace('_', '-').lower()#-->
<html lang="$active_lang" <!--#if $rtl#-->dir="rtl"<!--#end if#--> id="sabnzbd" data-color-scheme="$color_scheme" data-bind="filedrop: { overlaySelector: '.main-filedrop', onFileDrop: addNZBFromFile }">
<html lang="$active_lang" <!--#if $rtl#-->dir="rtl"<!--#end if#--> id="sabnzbd" data-bind="filedrop: { overlaySelector: '.main-filedrop', onFileDrop: addNZBFromFile }">
<head>
<!--
Glitter V2
@@ -25,23 +25,25 @@
<meta name="msapplication-navbutton-color" content="#000000" />
<meta name="theme-color" content="#000000" />
<link rel="apple-touch-icon" sizes="76x76" href="$url('staticcfg/ico/apple-touch-icon-76x76-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="120x120" href="$url('staticcfg/ico/apple-touch-icon-120x120-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="152x152" href="$url('staticcfg/ico/apple-touch-icon-152x152-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="180x180" href="$url('staticcfg/ico/apple-touch-icon-180x180-precomposed.png', v=$cache_buster)" />
<link rel="apple-touch-icon" sizes="192x192" href="$url('staticcfg/ico/android-192x192.png', v=$cache_buster)" />
<link rel="mask-icon" href="$url('staticcfg/ico/safari-pinned-tab.svg', v=$cache_buster)" color="#383F45">
<link rel="shortcut icon" type="image/ico" href="$url('staticcfg/ico/favicon.ico', v=$cache_buster)" data-bind="attr: { 'href': SABIcon }" />
<link rel="apple-touch-icon" sizes="76x76" href="./staticcfg/ico/apple-touch-icon-76x76-precomposed.png" />
<link rel="apple-touch-icon" sizes="120x120" href="./staticcfg/ico/apple-touch-icon-120x120-precomposed.png" />
<link rel="apple-touch-icon" sizes="152x152" href="./staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
<link rel="apple-touch-icon" sizes="180x180" href="./staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
<link rel="apple-touch-icon" sizes="192x192" href="./staticcfg/ico/android-192x192.png" />
<link rel="mask-icon" href="./staticcfg/ico/safari-pinned-tab.svg" color="#383F45">
<link rel="shortcut icon" type="image/ico" href="./staticcfg/ico/favicon.ico?v=$cache_buster" data-bind="attr: { 'href': SABIcon }" />
<link rel="stylesheet" type="text/css" href="$url('static/bootstrap/css/bootstrap.min.css', v=$cache_buster)" />
<link rel="stylesheet" type="text/css" href="$url('static/stylesheets/glitter.css', v=$cache_buster)" />
<link rel="stylesheet" type="text/css" href="$url('static/stylesheets/glitter.mobile.css', v=$cache_buster)" media="all and (max-width: 768px)" />
<link rel="stylesheet" type="text/css" href="./static/bootstrap/css/bootstrap.min.css?v=$cache_buster" />
<link rel="stylesheet" type="text/css" href="./static/stylesheets/glitter.css?v=$cache_buster" />
<link rel="stylesheet" type="text/css" href="./static/stylesheets/glitter.mobile.css?v=$cache_buster" media="all and (max-width: 768px)" />
<!--#if $color_scheme not in ('Light', '') #-->
<link rel="stylesheet" type="text/css" href="./static/stylesheets/colorschemes/${color_scheme}.css?v=$cache_buster"/>
<!--#end if#-->
<!-- Make translations available in scripts -->
<script type="text/javascript">
var csrfToken = "$csrf_token";
var apiKey = "$apikey";
var displayLang = "$active_lang";
var dateScriptUrl = "$url('static/javascripts/date.min.js', v=$cache_buster)";
var sabSpeedHistory = [$bytespersec_list];
var newRelease = "$new_release";
var newReleaseUrl = "$new_rel_url";
@@ -74,14 +76,6 @@
glitterTranslate.defaultText = "$T('default')";
glitterTranslate.noneText = "$T('None')";
glitterTranslate.moreText = "$T('Glitter-more')";
glitterTranslate.column = [];
glitterTranslate.column['category'] = "$T('category')";
glitterTranslate.column['priority'] = "$T('priority')";
glitterTranslate.column['processing'] = "$T('swtag-pp')";
glitterTranslate.column['scripts'] = "$T('eoq-scripts')";
glitterTranslate.column['age'] = "$T('nzo-age')";
glitterTranslate.column['size'] = "$T('size')";
glitterTranslate.column['speed'] = "$T('Glitter-speed')";
glitterTranslate.status = [];
glitterTranslate.status['DirectUnpack'] = "$T('opt-direct_unpack')";
glitterTranslate.status['Completed'] = "$T('post-Completed')";
@@ -122,27 +116,21 @@
glitterTranslate.priority['Stop'] = "$T('pr-stop')";
</script>
<script type="text/javascript" src="$url('staticcfg/js/jquery-3.7.1.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('staticcfg/js/jquery-ui.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/jquery.peity.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/jquery.hotkeys.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/moment-2.26.0.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/knockout-3.5.1.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/knockout-extensions.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/search-query-parser.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('staticcfg/bootstrap/js/bootstrap.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/glitter.basic.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/glitter.main.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/glitter.queue.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/glitter.history.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('static/javascripts/glitter.filelist.pagination.js', v=$cache_buster)"></script>
<!-- Inclusion is faster than external scripts. We load momentJS locale separately so failure won't break anything -->
<script type="text/javascript">
jQuery(function () {
ko.applyBindings(new ViewModel(), document.getElementById("sabnzbd"));
});
<!--#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>
<!--#if active_lang != 'en'#-->
<script type="text/javascript" src="$url('static/javascripts/momentjs_locale/' + $active_lang + '.js', v=$cache_buster)"></script>
<script type="text/javascript" src="./static/javascripts/momentjs_locale/${active_lang}.js?v=$cache_buster"></script>
<!--#end if#-->
</head>
<body>
File diff suppressed because one or more lines are too long.
@@ -23,17 +23,15 @@ if(isMobile) {
});
}
$.ajaxSetup({
headers: { "X-SABnzbd-CSRF": csrfToken }
});
// Basic API-call
function callAPI(data, timeout = 10000) {
// Fill basis var's
data.output = "json";
data.apikey = apiKey;
var ajaxQuery = $.ajax({
url: "./api",
type: "POST",
type: "GET",
cache: false,
data: data,
timeout: timeout
});
@@ -150,6 +150,7 @@ function HistoryListModel(parent) {
data.append("nzbfile", $(form.nzbFile)[0].files[0]);
data.append("value", $('#modal-retry-job input[name="retry_job_id"]').val());
data.append("password", $('#retry_job_password').val());
data.append("apikey", apiKey);
// Add
$.ajax({
@@ -637,10 +638,11 @@ function HistoryModel(parent, data) {
$(this).hide()
} else {
// Info in modal
$('#history-script-log .modal-body pre').load($(this).attr('href'), function(result) {
var modal = $('#history-script-log');
modal.find('.modal-title').text(self.historyStatus.name());
modal.modal('show');
$('#history-script-log .modal-body').load($(this).attr('href'), function(result) {
// Set title and then remove it
$('#history-script-log .modal-title').text($(this).find("h3").text())
$(this).find("h3, title").remove()
$('#history-script-log').modal('show');
});
}
return false;
@@ -0,0 +1,56 @@
/******
Glitter V1
By Safihre (2015) - safihre@sabnzbd.org
Code extended from Shiny-template
Code examples used from Knockstrap-template
The setup is hierarchical, 1 main ViewModel that contains:
- ViewModel
- QueueListModel
- paginationModel
- QueueModel (item 1)
- QueueModel (item 2)
- ...
- QueueModel (item n+1)
- HistoryListModel
- paginationModel
- HistoryModel (item 1)
- HistoryModel (item 2)
- ...
- HistoryModel (item n+1)
- Fileslisting
- FileslistingModel (file 1)
- FileslistingModel (file 2)
- ...
- FileslistingModel (file n+1)
ViewModel also contains all the code executed on document ready and
functions responsible for the status information, adding NZB, etc.
The QueueModel/HistoryModel's get added to the list-models when
jobs are added or on switching of pages (using paginationModel).
Once added only the properties that changed during a refresh
get updated. In the history all the detailed information is only
updated when created and when the user clicks on a detail.
The Fileslisting is only populated and updated when it is opened
for one of the QueueModel's.
******/
#include raw $webdir + "/static/javascripts/glitter.basic.js"#
/**
GLITTER CODE
**/
\$(function() {
'use strict';
#include raw $webdir + "/static/javascripts/glitter.main.js"#
#include raw $webdir + "/static/javascripts/glitter.queue.js"#
#include raw $webdir + "/static/javascripts/glitter.history.js"#
#include raw $webdir + "/static/javascripts/glitter.filelist.pagination.js"#
// GO!!!
ko.applyBindings(new ViewModel(), document.getElementById("sabnzbd"));
});
@@ -425,7 +425,7 @@ function ViewModel() {
self.openCustomPauseTime = function() {
// Was it loaded already?
if (!Date.i18n) {
jQuery.getScript(dateScriptUrl).then(function() {
jQuery.getScript('./static/javascripts/date.min.js').then(function() {
// After loading we start again
self.openCustomPauseTime()
})
@@ -702,6 +702,7 @@ function ViewModel() {
data.append("priority", $('#modal-add-nzb select[name="Priority"]').val())
data.append("pp", $('#modal-add-nzb select[name="Processing"]').val())
data.append("script", $('#modal-add-nzb select[name="Post-processing"]').val())
data.append("apikey", apiKey);
// Add this one
$.ajax({
@@ -1223,7 +1224,7 @@ function ViewModel() {
}
});
$(document).bind('keydown', 'c', function(e) {
window.location.href = './config';
window.location.href = './config/';
});
$(document).bind('keydown', 's', function(e) {
// Update the data
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
@@ -1 +1 @@
/* Placeholder — themes live in glitter.css; this file only populates the scheme dropdown */
@import url('Night.css') screen and (prefers-color-scheme: dark);
@@ -1 +1,163 @@
/* Placeholder — themes live in glitter.css; this file only populates the scheme dropdown */
/*
* Night theme overrides :root color tokens defined in glitter.css.
* Only structural/behavioural rules that can't be expressed as color tokens remain below.
*/
:root {
--clr-page-bg: black;
--clr-surface: #727272;
--clr-surface-alt: #444444;
--clr-surface-hover: #666666;
--clr-border: #808080;
--clr-border-subtle: #252525;
--clr-text: #EBEBEB;
--clr-text-muted: #D6D6D6;
--clr-error: #F95151;
--clr-input-bg: #555555;
--clr-input-border: #252525;
--clr-dropdown-bg: #727272;
--clr-modal-bg: #727272;
--clr-table-bg: #555555;
--clr-table-row-alt: #444444;
--clr-progress-track: #DADADA;
--clr-toggle-inactive: #666666;
}
/* Links and glyphicons inside links */
a, a:active,
a:hover,
a:focus,
.btn:not(.btn-danger):active,
.hover-button.glyphicon-play,
.hover-button.glyphicon-stop,
legend,
#modal-options legend label,
#modal-options legend a,
#modal-item-files .item-files-table .progress small,
.text-muted{
color: var(--clr-text);
}
/* Navbar needs structural dark-mode overrides */
nav {
background-color: #444444 !important;
border: 0 !important;
border-radius: var(--radius-lg);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
nav .btn {
background-color: #E4E4E4;
border-color: #5D5D5D !important;
}
nav .btn:active {
/* Restore bootstrap default */
color: #333 !important;
}
@media (max-width: 767px) {
nav {
background-color: black !important;
}
}
/* Collapse dropdown loses border in dark mode */
.navbar-collapse.in .dropdown-menu {
border: none;
}
/* Feedback slider needs explicit dark bg (not a card, not an input) */
#feedback-slider {
background-color: var(--clr-input-bg);
color: var(--clr-text);
}
/* Elements that must be white regardless of --clr-text */
.main-restarting,
.main-filedrop {
color: white !important;
}
/* Tab controls — dark-mode specific colours */
.max-speed-input-clear,
.max-speed-input-clear:hover,
.fileControls a {
color: black;
}
.nav-tabs>li.active>a,
.nav-tabs>li.active>a:focus,
.nav-tabs>li.active>a:hover,
.nav-tabs>li>a:hover,
.nav-tabs>li>a:focus {
background-color: #ddd;
color: #555 !important;
box-shadow: 0px -1px 1px 1px rgba(0, 0, 0, 0.15);
}
/* Opacity */
.hover-button,
.fileControls a:hover {
opacity: 0.7;
}
.form-control[disabled] {
opacity: 0.65;
}
/* Focus ring uses white glow in dark mode */
.form-control:focus,
input[type="submit"]:focus,
button:focus {
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
outline: initial;
}
/* Processing animation bars */
.processing-download > div {
background-color: var(--clr-text);
}
/* Legend / divider borders (dark-specific value, not matching any token) */
legend,
hr {
border-color: #C6C6C6 !important;
}
/* Slider handle */
.ui-slider .ui-slider-handle {
background-color: #969696;
border-color: #969696;
}
/* Compact layout progress shadow boost */
.container-compact .progress,
.container-compact .queue .progress-bar {
box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 1);
}
.modal-footer {
border-top: 1px solid rgb(131 131 131);
}
/* Help table transparent bg override */
#modal-help table td,
#modal-help table {
background-color: transparent;
}
/* File items table structural */
#modal-item-files .item-files-table td {
border-bottom: none !important;
}
#modal-item-files .item-files-table {
border-bottom: 1px solid black;
}
/* History/queue tab switcher */
.history-queue-swicher .nav-tabs>li>a,
.history-queue-swicher .nav-tabs>li.active>a {
border-bottom: none;
margin-bottom: 1px;
}
@@ -1,40 +1,28 @@
:root {
/* Follow the OS by default (Auto); forced by data-color-scheme below */
color-scheme: light dark;
/* Border radius scale */
--radius-sm: 4px; /* small elements: progress bars */
--radius-md: 6px; /* search bar, multi-edit toolbar, file controls */
--radius-lg: 8px; /* cards, modals, notification box */
/* Color palette — light-dark(light value, dark value) */
--clr-page-bg: light-dark(#E4E4E4, black); /* body/page background */
--clr-surface: light-dark(#FFFFFF, #727272); /* cards, modals, notification box */
--clr-surface-alt: light-dark(#F9F9F9, #444444); /* multi-edit toolbar, alternating rows */
--clr-surface-hover: light-dark(#f6f6f6, #666666); /* hovered rows, inputs, buttons */
--clr-border: light-dark(rgba(0,0,0,0.12), #808080); /* card outlines */
--clr-border-subtle: light-dark(#EBEBEB, #252525); /* table row separators, inner borders */
--clr-text: light-dark(#333333, #EBEBEB); /* primary body text */
--clr-text-muted: light-dark(#888888, #D6D6D6); /* secondary / dimmed text */
--clr-error: light-dark(red, #F95151); /* errors, failed downloads */
--clr-input-bg: light-dark(#FFFFFF, #555555); /* form inputs, buttons */
--clr-input-border: light-dark(#CCCCCC, #252525); /* input/search borders */
--clr-dropdown-bg: light-dark(#FFFFFF, #727272); /* dropdown menus */
--clr-modal-bg: light-dark(#FFFFFF, #727272); /* modal body/footer */
--clr-table-bg: light-dark(#F5F5F5, #555555); /* table and even-row background */
--clr-table-row-alt: light-dark(#FDFDFD, #444444); /* odd striped row background */
--clr-progress-track: light-dark(#f6f6f6, #DADADA); /* progress bar track */
--clr-toggle-active: #f9ca33; /* toggle knob track: on */
--clr-toggle-inactive: light-dark(#aaaaaa, #666666); /* toggle knob track: off */
}
/* The server renders the configured scheme into this attribute (main.tmpl); empty/unknown = Auto */
html[data-color-scheme="light" i] {
color-scheme: light;
}
html[data-color-scheme="night" i] {
color-scheme: dark;
/* Color palette — light mode defaults; override in Night.css */
--clr-page-bg: #E4E4E4; /* body/page background */
--clr-surface: #FFFFFF; /* cards, modals, notification box */
--clr-surface-alt: #F9F9F9; /* multi-edit toolbar, alternating rows */
--clr-surface-hover: #f6f6f6; /* hovered rows, inputs, buttons */
--clr-border: rgba(0,0,0,0.12); /* card outlines */
--clr-border-subtle: #EBEBEB; /* table row separators, inner borders */
--clr-text: #333333; /* primary body text */
--clr-text-muted: #888888; /* secondary / dimmed text */
--clr-error: red; /* errors, failed downloads */
--clr-input-bg: #FFFFFF; /* form inputs, buttons */
--clr-input-border: #CCCCCC; /* input/search borders */
--clr-dropdown-bg: #FFFFFF; /* dropdown menus */
--clr-modal-bg: #FFFFFF; /* modal body/footer */
--clr-table-bg: #F5F5F5; /* table and even-row background */
--clr-table-row-alt: #FDFDFD; /* odd striped row background */
--clr-progress-track: #f6f6f6; /* progress bar track */
--clr-toggle-active: #f9ca33; /* toggle knob track: on */
--clr-toggle-inactive: #aaaaaa; /* toggle knob track: off */
}
body {
@@ -52,16 +40,12 @@ h2 {
.container {
margin-top: 1em;
padding-left: 0;
padding-right: 0;
}
.main-navbar {
margin-bottom: 2px;
z-index: 999;
padding-left: 0;
padding-right: 0;
border: 0;
}
.navbar.main-navbar {
@@ -113,25 +97,6 @@ h2 {
color: white !important;
}
.dropdown-menu > li > form > button {
display: block;
width: 100%;
padding: 5px 15px 5px 25px;
border: 0;
background: transparent;
text-align: left;
font-weight: normal;
line-height: 1.42857143;
color: var(--clr-text);
white-space: nowrap;
}
@media (min-width: 768px) {
.dropdown-menu > li > form > button {
padding: 3px 20px;
}
}
.navbar-nav>li>a {
color: white !important;
opacity: 0.7;
@@ -200,6 +165,7 @@ li.dropdown {
line-height: 18px;
}
.max-speed-input-clear {
position: absolute;
top: 16px;
@@ -249,8 +215,8 @@ li.dropdown {
height: 24px;
top: -7px;
cursor: ew-resize;
background-color: light-dark(#767676, #969696);
border: 1px solid light-dark(white, #969696);
background-color: #767676;
border: 1px solid white;
margin-left: -.25em;
}
@@ -357,7 +323,7 @@ li.dropdown {
.main-restarting.in {
text-align: center;
opacity: 0.9;
color: light-dark(black, white);
color: black;
z-index: 2000;
padding: 15% 1em 1em;
}
@@ -398,8 +364,7 @@ li.dropdown {
width: 400px;
top: 40px;
left: -370px;
background: light-dark(white, #555555);
color: var(--clr-text);
background: white;
border: 1px solid rgba(0,0,0,.2);
border-radius: var(--radius-md);
transition-duration: 0.3s;
@@ -1347,7 +1312,7 @@ tr.queue-item>td:first-child>a {
}
.processing-download > div {
background-color: var(--clr-text);
background-color: #333;
height: 100%;
width: 2px;
float: left;
@@ -2013,34 +1978,8 @@ input[name="nzbURL"] {
padding-top: 5px;
}
/* Tighten the gaps between the main containers */
.container-compact .main-navbar {
margin-top: 3px;
}
.container-compact:not(.container-tabbed) .main-content {
padding-top: 0;
margin-bottom: 15px;
}
.container-compact .queue,
.container-compact .history,
.container-compact .queue-messages {
padding: 4px 6px;
margin-bottom: 6px;
}
.container-compact .queue-footer,
.container-compact .history-footer {
padding: 0;
}
.container-compact .table {
margin-bottom: 3px;
}
.container-full-width .container {
width: calc(100% - 40px);
width: calc(100% - 60px);
}
/***
@@ -2355,18 +2294,11 @@ legend {
.pagination li.active a:hover,
.pagination li.active span:hover,
.pagination>li>span:hover {
background-color: var(--clr-surface-hover);
background-color: var(--clr-table-bg);
border: 1px solid var(--clr-border-subtle);
color: var(--clr-text);
}
.pagination>li>a:focus,
.pagination>li>a:hover {
color: var(--clr-text);
background-color: var(--clr-surface-hover);
border-color: var(--clr-border-subtle);
}
.pagination>li>a,
.pagination>li>span,
.pagination>.disabled>span,
@@ -2440,7 +2372,6 @@ legend {
.modal-footer {
margin-top: 0;
background-color: var(--clr-modal-bg);
border-top: 1px solid light-dark(#e5e5e5, rgb(131, 131, 131));
}
.modal-dialog {
@@ -2458,26 +2389,11 @@ legend {
}
legend {
border-color: light-dark(#888888, #C6C6C6);
border-color: var(--clr-text-muted);
}
hr {
border-color: light-dark(#888888, #C6C6C6);
}
/* Bootstrap's `a:focus { outline: 5px auto -webkit-focus-ring-color }` renders as a
heavy dark ring once color-scheme is declared. Replace it with a subtle themed
outline shown only for keyboard focus, matching the toggle-switch focus style. */
a:focus {
outline: none !important;
}
a:focus-visible {
outline: 2px solid var(--clr-toggle-active) !important;
outline-offset: 2px !important;
}
input[type="checkbox"] {
color-scheme: light;
border-color: var(--clr-text-muted);
}
/***
@@ -2493,9 +2409,7 @@ input[type="checkbox"] {
}
.dropdown-menu>li>a:hover,
.dropdown-menu>li>a:focus,
.dropdown-menu>li>form>button:hover,
.dropdown-menu>li>form>button:focus {
.dropdown-menu>li>a:focus {
background-color: var(--clr-surface-hover);
color: var(--clr-text);
}
@@ -2592,225 +2506,3 @@ h2 small {
color: var(--clr-text) !important;
opacity: 0.5 !important;
}
/***
Dark-mode structural rules
Colors live in the light-dark() tokens above; these are the rules that cannot
be expressed as a color value. The two blocks below MUST stay identical:
the first applies when Night is forced, the second when the OS is dark and Light is not forced.
***/
html[data-color-scheme="night" i] {
/* Links and glyphicons inside links */
a, a:active,
a:hover,
a:focus,
.btn:not(.btn-danger):active,
.hover-button.glyphicon-play,
.hover-button.glyphicon-stop,
legend,
#modal-options legend label,
#modal-options legend a,
#modal-item-files .item-files-table .progress small,
.text-muted {
color: var(--clr-text);
}
/* Navbar needs structural dark-mode overrides */
nav {
background-color: #444444 !important;
border-radius: var(--radius-lg);
}
nav .btn {
background-color: #E4E4E4;
border-color: #5D5D5D !important;
}
nav .btn:active {
/* Restore bootstrap default */
color: #333 !important;
}
@media (max-width: 767px) {
nav {
background-color: black !important;
}
}
/* Collapse dropdown loses border in dark mode */
.navbar-collapse.in .dropdown-menu {
border: none;
}
/* Tab controls — dark-mode specific colours */
.max-speed-input-clear,
.max-speed-input-clear:hover,
.fileControls a {
color: black;
}
.nav-tabs>li.active>a,
.nav-tabs>li.active>a:focus,
.nav-tabs>li.active>a:hover,
.nav-tabs>li>a:hover,
.nav-tabs>li>a:focus {
background-color: #ddd;
color: #555 !important;
box-shadow: 0px -1px 1px 1px rgba(0, 0, 0, 0.15);
}
/* Opacity */
.hover-button,
.fileControls a:hover {
opacity: 0.7;
}
.form-control[disabled] {
opacity: 0.65;
}
/* Focus ring uses white glow in dark mode */
.form-control:focus,
input[type="submit"]:focus,
button:focus {
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
outline: initial;
}
/* Compact layout progress shadow boost */
.container-compact .progress,
.container-compact .queue .progress-bar {
box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 1);
}
/* Help table transparent bg override */
#modal-help table td,
#modal-help table {
background-color: transparent;
}
/* File items table structural */
#modal-item-files .item-files-table td {
border-bottom: none !important;
}
#modal-item-files .item-files-table {
border-bottom: 1px solid black;
}
/* History/queue tab switcher */
.history-queue-swicher .nav-tabs>li>a,
.history-queue-swicher .nav-tabs>li.active>a {
border-bottom: none;
margin-bottom: 1px;
}
}
@media (prefers-color-scheme: dark) {
html:not([data-color-scheme="light" i]) {
/* Links and glyphicons inside links */
a, a:active,
a:hover,
a:focus,
.btn:not(.btn-danger):active,
.hover-button.glyphicon-play,
.hover-button.glyphicon-stop,
legend,
#modal-options legend label,
#modal-options legend a,
#modal-item-files .item-files-table .progress small,
.text-muted {
color: var(--clr-text);
}
/* Navbar needs structural dark-mode overrides */
nav {
background-color: #444444 !important;
border-radius: var(--radius-lg);
}
nav .btn {
background-color: #E4E4E4;
border-color: #5D5D5D !important;
}
nav .btn:active {
/* Restore bootstrap default */
color: #333 !important;
}
@media (max-width: 767px) {
nav {
background-color: black !important;
}
}
/* Collapse dropdown loses border in dark mode */
.navbar-collapse.in .dropdown-menu {
border: none;
}
/* Tab controls — dark-mode specific colours */
.max-speed-input-clear,
.max-speed-input-clear:hover,
.fileControls a {
color: black;
}
.nav-tabs>li.active>a,
.nav-tabs>li.active>a:focus,
.nav-tabs>li.active>a:hover,
.nav-tabs>li>a:hover,
.nav-tabs>li>a:focus {
background-color: #ddd;
color: #555 !important;
box-shadow: 0px -1px 1px 1px rgba(0, 0, 0, 0.15);
}
/* Opacity */
.hover-button,
.fileControls a:hover {
opacity: 0.7;
}
.form-control[disabled] {
opacity: 0.65;
}
/* Focus ring uses white glow in dark mode */
.form-control:focus,
input[type="submit"]:focus,
button:focus {
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
outline: initial;
}
/* Compact layout progress shadow boost */
.container-compact .progress,
.container-compact .queue .progress-bar {
box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 1);
}
/* Help table transparent bg override */
#modal-help table td,
#modal-help table {
background-color: transparent;
}
/* File items table structural */
#modal-item-files .item-files-table td {
border-bottom: none !important;
}
#modal-item-files .item-files-table {
border-bottom: 1px solid black;
}
/* History/queue tab switcher */
.history-queue-swicher .nav-tabs>li>a,
.history-queue-swicher .nav-tabs>li.active>a {
border-bottom: none;
margin-bottom: 1px;
}
}
}
+9 -12
View File
@@ -1,19 +1,16 @@
<!DOCTYPE html>
<html lang="$active_lang" data-color-scheme="$color_scheme">
<html lang="$active_lang">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>$T('wizard-quickstart')</title>
<link rel="stylesheet" type="text/css" href="$url('staticcfg/bootstrap/css/bootstrap.min.css', v=$cache_buster)"/>
<link rel="stylesheet" type="text/css" href="$url('wizard/static/style.css', v=$cache_buster)"/>
<link rel="shortcut icon" href="$url('staticcfg/ico/favicon.ico', v=$cache_buster)" />
<script type="text/javascript" src="$url('staticcfg/js/jquery-3.7.1.min.js', v=$cache_buster)"></script>
<script type="text/javascript" src="$url('staticcfg/bootstrap/js/bootstrap.min.js', v=$cache_buster)"></script>
<script type="text/javascript">
var csrfToken = "$csrf_token";
$.ajaxSetup({
headers: { "X-SABnzbd-CSRF": csrfToken }
});
</script>
<link rel="stylesheet" type="text/css" href="../staticcfg/bootstrap/css/bootstrap.min.css?v=$cache_buster"/>
<link rel="stylesheet" type="text/css" href="static/style.css?v=$cache_buster"/>
<!--#if $color_scheme not in ('Light', '') #-->
<link rel="stylesheet" type="text/css" href="../staticcfg/css/${color_scheme}.css?v=$cache_buster"/>
<!--#end if#-->
<link rel="shortcut icon" href="../staticcfg/ico/favicon.ico?v=$cache_buster" />
<script type="text/javascript" src="../staticcfg/js/jquery-3.5.1.min.js?v=$cache_buster"></script>
<script type="text/javascript" src="../staticcfg/bootstrap/js/bootstrap.min.js?v=$cache_buster"></script>
</head>
<body>
<div id="logo">
+3 -5
View File
@@ -1,6 +1,5 @@
<!--#include $webdir + "/inc_top.tmpl"#-->
<form action="$url('wizard/one')" method="post">
<input type="hidden" name="csrf_token" value="$csrf_token" />
<form action="./one" method="post">
<div class="container">
<div id="inner">
<div id="content" class="bigger">
@@ -28,10 +27,10 @@
<hr />
<div class="row">
<div class="col-md-4 text-center">
<button class="btn btn-danger" type="submit" form="shutdown-form"><span class="glyphicon glyphicon-remove"></span> $T('wizard-exit')</button>
<a class="btn btn-danger" href="../shutdown/?apikey=$apikey&amp;pid=$pid"><span class="glyphicon glyphicon-remove"></span> $T('wizard-exit')</a>
</div>
<div class="col-md-4 text-center">
<a class="btn btn-default" href="$url('config/general#config_backup_file')"><span class="glyphicon glyphicon-open"></span> $T('restore-backup')</a>
<a class="btn btn-default" href="../config/general/#config_backup_file"><span class="glyphicon glyphicon-open"></span> $T('restore-backup')</a>
</div>
<div class="col-md-4 text-center">
<button class="btn btn-default">$T('wizard-start') <span class="glyphicon glyphicon-chevron-right"></span></button>
@@ -40,5 +39,4 @@
</div>
</div>
</form>
<form id="shutdown-form" method="post" action="$url('shutdown')"><input type="hidden" name="csrf_token" value="$csrf_token" /></form>
<!--#include $webdir + "/inc_bottom.tmpl"#-->
+5 -6
View File
@@ -1,6 +1,5 @@
<!--#include $webdir + "/inc_top.tmpl"#-->
<form action="$url('wizard/two')" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="$csrf_token" />
<form action="./two" method="post" autocomplete="off">
<div class="container">
<div id="inner">
<div id="content" class="bigger">
@@ -90,10 +89,10 @@
</div>
<div class="row">
<div class="col-sm-4">
<button id="serverTest" class="btn btn-default" data-toggle="tooltip" data-placement="left" aria-busy="false"><span class="glyphicon glyphicon-sort" aria-hidden="true"></span> $T('wizard-button-testServer')</button>
<button id="serverTest" class="btn btn-default" data-toggle="tooltip" data-placement="left"><span class="glyphicon glyphicon-sort"></span> $T('wizard-button-testServer')</button>
</div>
<div class="col-sm-8">
<div id="serverResponse" class="well well-sm" role="status" aria-live="polite" aria-atomic="true">$T('wizard-server-text')</div>
<div id="serverResponse" class="well well-sm">$T('wizard-server-text')</div>
</div>
</div>
@@ -103,12 +102,12 @@
<iframe style="float: right; width: 325px; height: 325px;" frameborder="0" src="https://sabnzbd.org/wizard#$active_lang"></iframe>
</div>
</div>
<input type="hidden" name="enable" value="1">
<input type="hidden" name="apikey" value="$apikey" />
</div>
<hr />
<div class="row">
<div class="col-xs-4 text-center">
<a class="btn btn-default" href="$url('wizard')"><span class="glyphicon glyphicon-chevron-left"></span> $T('wizard-previous')</a>
<a class="btn btn-default" href="./index"><span class="glyphicon glyphicon-chevron-left"></span> $T('wizard-previous')</a>
</div>
<div class="col-xs-4 text-center">
</div>
@@ -41,25 +41,22 @@ $(document).ready(function() {
return false;
}
$('#serverTest').attr('aria-busy', 'true');
$('#serverResponse').html(txtChecking);
$.ajax({
type: 'POST',
url: "../api?mode=config&name=test_server&output=json",
data: $("form").serialize(),
success: function(result) {
$.getJSON(
"../api?mode=config&name=test_server&output=json",
$("form").serialize(),
function(result) {
if (result.value.result) {
r = '<span class="success"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span> ' + result.value.message + '</span>';
r = '<span class="success"><span class="glyphicon glyphicon-ok"></span> ' + result.value.message + '</span>';
setTestResult(true);
} else {
r = '<span class="failed"><span class="glyphicon glyphicon-minus-sign" aria-hidden="true"></span> ' + result.value.message + '</span>';
r = '<span class="failed"><span class="glyphicon glyphicon-minus-sign"></span> ' + result.value.message + '</span>';
setTestResult(false);
}
r = r.replace('https://sabnzbd.org/certificate-errors', '<a href="https://sabnzbd.org/certificate-errors" class="failed" target="_blank">https://sabnzbd.org/certificate-errors</a>')
$('#serverResponse').html(r);
$('#serverTest').attr('aria-busy', 'false');
}
});
);
return false;
});
@@ -91,4 +88,4 @@ $(document).ready(function() {
event.preventDefault();
}
})
});
});
+13 -115
View File
@@ -4,31 +4,17 @@
--radius-md: 6px; /* search bar, multi-edit toolbar, file controls */
--radius-lg: 8px; /* cards, modals, notification box */
/* Follow the OS by default (Auto); forced by data-color-scheme below */
color-scheme: light dark;
/* Color palette — light-dark(light value, dark value) */
--clr-page-bg: light-dark(#E4E4E4, black);
--clr-surface: light-dark(#FFFFFF, #303030);
--clr-surface-alt: light-dark(#F5F5F5, #444444);
--clr-surface-hover: light-dark(#E4E4E4, #666666);
--clr-border: light-dark(rgba(0, 0, 0, 0.2), #555555);
--clr-text: light-dark(#000000, #EBEBEB);
--clr-text-muted: light-dark(#777777, #c7c7c7);
--clr-link: light-dark(#555555, #63a7e1);
--clr-input-bg: light-dark(#FFFFFF, #555555);
--clr-input-border: light-dark(#cccccc, #252525);
/* Color palette — light mode defaults; overridden by Night.css */
--clr-page-bg: #E4E4E4;
--clr-surface: #FFFFFF;
--clr-surface-alt: #F5F5F5;
--clr-surface-hover: #E4E4E4;
--clr-border: rgba(0, 0, 0, 0.2);
--clr-text: #000000;
--clr-text-muted: #777777;
--clr-link: #555555;
--clr-toggle-active: #f9ca33;
--clr-toggle-inactive: light-dark(#aaaaaa, #666666);
}
/* The server renders the configured scheme into this attribute; empty/unknown = Auto */
html[data-color-scheme="light" i] {
color-scheme: light;
}
html[data-color-scheme="night" i] {
color-scheme: dark;
--clr-toggle-inactive: #aaaaaa;
}
body {
@@ -96,10 +82,10 @@ a[target="_blank"] {
color: #00cc22;
}
.failed {
color: light-dark(red, #ff3333) !important;
color: red !important;
}
#rightGreyText {
color: light-dark(#cccccc, #c7c7c7);
color: #ccc;
width: 100%;
text-align: right;
padding-top: 3px;
@@ -213,25 +199,7 @@ a:visited,
}
.btn {
min-width: 150px;
box-shadow: 1px 0px 1px light-dark(rgba(0,0,0,.1), rgba(255,255,255,.1));
}
.btn-default,
input[type="text"],
input[type="number"],
input[type="email"],
input[type="password"],
input[type="url"],
select,
textarea {
background-color: var(--clr-input-bg);
color: var(--clr-text);
border-color: var(--clr-input-border);
}
::placeholder {
color: var(--clr-text) !important;
opacity: 0.5;
box-shadow: 1px 0px 1px rgba(0,0,0,.1);
}
.btn .glyphicon,
a .glyphicon {
@@ -239,74 +207,4 @@ a .glyphicon {
}
small {
color: var(--clr-text-muted);
}
/***
Dark-mode structural rules
Colors live in the light-dark() tokens above; these are the rules that cannot
be expressed as a color value. The two blocks below MUST stay identical:
the first applies when Night is forced, the second when the OS is dark and Light is not forced.
***/
html[data-color-scheme="night" i] {
.language:hover,
.quoteBlock,
.server-disabled,
#serverResponse {
background-color: var(--clr-surface-alt) !important;
color: var(--clr-text) !important;
}
.quoteBlock a,
.help-block,
a.wizard-advanced-settings {
color: var(--clr-text);
}
#inner {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
/* Focus / active border */
.btn-default:focus,
.form-control:focus,
input:focus,
textarea:focus,
select:focus {
border-color: #707070 !important;
outline: initial !important;
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
}
}
@media (prefers-color-scheme: dark) {
html:not([data-color-scheme="light" i]) {
.language:hover,
.quoteBlock,
.server-disabled,
#serverResponse {
background-color: var(--clr-surface-alt) !important;
color: var(--clr-text) !important;
}
.quoteBlock a,
.help-block,
a.wizard-advanced-settings {
color: var(--clr-text);
}
#inner {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
/* Focus / active border */
.btn-default:focus,
.form-control:focus,
input:focus,
textarea:focus,
select:focus {
border-color: #707070 !important;
outline: initial !important;
box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
}
}
}
+6 -5
View File
@@ -12,8 +12,8 @@
<p>$T('wizard-tip4')</p>
<div class="quoteBlock">
<!--#for $access_url in $urls#-->
<a href="$access_url">$access_url</a><br />
<!--#for $url in $urls#-->
<a href="$url">$url</a><br />
<!--#end for#-->
</div>
@@ -22,13 +22,13 @@
<p><strong>$T('opt-complete_dir')</strong></p>
<div class="quoteBlock">
$complete_dir
<a href="$url('config/folders#complete_dir')" class="indented"><span class="glyphicon glyphicon-cog"></span></a>
<a href="${access_url}/config/folders#complete_dir" class="indented"><span class="glyphicon glyphicon-cog"></span></a>
</div>
<p><strong>$T('opt-download_dir')</strong></p>
<div class="quoteBlock">
$download_dir
<a href="$url('config/folders#complete_dir')" class="indented"><span class="glyphicon glyphicon-cog"></span></a>
<a href="${access_url}/config/folders#complete_dir" class="indented"><span class="glyphicon glyphicon-cog"></span></a>
</div>
<hr/>
@@ -38,7 +38,8 @@
<hr />
<div class="row">
<div class="col-xs-12 text-center">
<a class="btn btn-success" href="$url()">$T('wizard-goto') <span class="glyphicon glyphicon-chevron-right"></span></a>
<input type="hidden" name="apikey" id="apikey" value="$apikey"/>
<a class="btn btn-success" href="$access_url">$T('wizard-goto') <span class="glyphicon glyphicon-chevron-right"></span></a>
</div>
</div>
</div>
+233 -233
View File
@@ -1,237 +1,237 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2022-2026 by The SABnzbd-Team (sabnzbd.org) -->
<component type="desktop-application">
<id>org.sabnzbd.sabnzbd</id>
<metadata_license>MIT</metadata_license>
<name>SABnzbd</name>
<summary>Free and easy binary newsreader</summary>
<summary xml:lang="fr">Lecteur de news binaire libre et facile à utiliser</summary>
<summary xml:lang="tr">Özgür ve kullanımı kolay Usenet ikili okuyucu</summary>
<branding>
<color type="primary" scheme_preference="light">#e7e7e7</color>
<color type="primary" scheme_preference="dark">#444444</color>
</branding>
<description>
<p>
SABnzbd is a free and Open Source web-based binary newsreader,
with support for the popular nzb file format. It greatly simplifies
the process of downloading from Usenet, thanks to a friendly
web-based user interface and advanced built-in post-processing
options including the ability to automatically verify, repair,
extract and clean up downloaded posts. It runs anywhere, comes in
over a dozen languages, and integrates with a host of tools, apps
and services that help automate the download process.
</p>
<p xml:lang="fr">
SABnzbd est un lecteur binaire de newsgroups libre et gratuit prenant
en charge le format nzb très répandu. Il simplifie grandement le processus
de téléchargement depuis Usenet grâce à une interface web conviviale
et à des options avancées de post-traitement intégrées qui comprennent
la capacité à vérifier, réparer, extraire et nettoyer automatiquement
les messages téléchargés. Il fonctionne partout, est fourni avec une
douzaine de traductions et s'intègre avec de nombreux outils, applications
et services qui aident à automatiser le processus de téléchargement.
</p>
<p xml:lang="tr">
SABnzbd, popüler nzb biçimini destekleyen özgür ve ücretsiz bir ikili
haber grupları okuyucusudur. Kullanıcı dostu Web tabanlı arayüzü ve
indirilen mesajları otomatik olarak doğrulama, tamir etme, çıkarma ve
temizleme kabiliyetine sahip gelişmiş yerleşik son işlem seçenekleri
sayesinde Usenet ağından indirmeyi büyük ölçüde kolaylaştırır. Her yerde
çalışabilir, bir düzineden fazla dil desteği sunar ve indirme sürecini
otomatik hâle getirmeye yardımcı olan birçok araç, uygulama ve hizmet ile
birlikte çalışabilir.
</p>
</description>
<keywords>
<keyword>usenet</keyword>
<keyword>nzb</keyword>
<keyword>download</keyword>
<keyword>newsreader</keyword>
<keyword>binary</keyword>
<keyword xml:lang="fr">usenet</keyword>
<keyword xml:lang="fr">nzb</keyword>
<keyword xml:lang="fr">téléchargement</keyword>
<keyword xml:lang="fr">binaires</keyword>
<keyword xml:lang="tr">usenet</keyword>
<keyword xml:lang="tr">nzb</keyword>
<keyword xml:lang="tr">indirme</keyword>
</keywords>
<categories>
<category>Network</category>
<category>FileTransfer</category>
</categories>
<url type="homepage">https://sabnzbd.org</url>
<url type="bugtracker">https://github.com/sabnzbd/sabnzbd/issues</url>
<url type="vcs-browser">https://github.com/sabnzbd/sabnzbd</url>
<url type="contribute">https://github.com/sabnzbd/sabnzbd</url>
<url type="translate">https://sabnzbd.org/wiki/translate</url>
<url type="donation">https://sabnzbd.org/donate</url>
<url type="help">https://sabnzbd.org/wiki/</url>
<url type="faq">https://sabnzbd.org/wiki/faq</url>
<url type="contact">https://sabnzbd.org/live-chat.html</url>
<releases>
<release version="5.1.0" date="2026-08-01" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.1.0</url>
</release>
<release version="5.0.4" date="2026-06-11" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.4</url>
</release>
<release version="5.0.3" date="2026-05-15" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.3</url>
</release>
<release version="5.0.2" date="2026-05-14" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.2</url>
</release>
<release version="5.0.1" date="2026-05-01" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.1</url>
</release>
<release version="5.0.0" date="2026-05-01" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.0</url>
</release>
<release version="4.5.5" date="2025-10-24" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.5</url>
</release>
<release version="4.5.4" date="2025-10-22" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.4</url>
</release>
<release version="4.5.3" date="2025-08-25" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.3</url>
</release>
<release version="4.5.2" date="2025-07-09" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.2</url>
</release>
<release version="4.5.1" date="2025-04-11" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.1</url>
</release>
<release version="4.5.0" date="2025-04-01" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.0</url>
</release>
<release version="4.4.1" date="2024-12-23" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.4.1</url>
</release>
<release version="4.4.0" date="2024-12-09" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.4.0</url>
</release>
<release version="4.3.3" date="2024-08-01" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.3.3</url>
</release>
<release version="4.3.2" date="2024-05-30" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.3.2</url>
</release>
<release version="4.3.1" date="2024-05-03" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.3.1</url>
</release>
</releases>
<launchable type="desktop-id">sabnzbd.desktop</launchable>
<provides>
<mediatype>application/x-nzb</mediatype>
<mediatype>application/x-compressed-nzb</mediatype>
</provides>
<supports>
<control>pointing</control>
<control>keyboard</control>
<control>touch</control>
</supports>
<recommends>
<display_length compare="ge">640</display_length>
<internet>always</internet>
</recommends>
<project_license>GPL-2.0-or-later</project_license>
<developer id="org.sabnzbd">
<name>The SABnzbd-Team</name>
</developer>
<screenshots>
<screenshot type="default">
<image>https://sabnzbd.org/images/landing/screenshots/interface.png</image>
<caption>Intuitive interface</caption>
<caption xml:lang="fr">Interface intuitive</caption>
<caption xml:lang="tr">Sezgisel arayüz</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/night-mode.png</image>
<caption>Also comes in Night-mode</caption>
<caption xml:lang="fr">Fourni également avec le mode nuit</caption>
<caption xml:lang="tr">Gece kipi ile de sunulur</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/add-nzb.png</image>
<caption>Add NZB's or use drag-and-drop!</caption>
<caption xml:lang="fr">Ajoutez des fichiers NZB ou utilisez le glisser - déposer !</caption>
<caption xml:lang="tr">NZB dosyaları ekleyin veya kaydır - bırak kullanın!</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/phone-interface.png</image>
<caption>Scales to any screen size</caption>
<caption xml:lang="fr">S'adapte à toutes les tailles d'écran</caption>
<caption xml:lang="tr">Her ekran boyutuna uyum sağlar</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/history-details.png</image>
<caption>Easy overview of all history details</caption>
<caption xml:lang="fr">Vue d'ensemble aisée de tous les détails de l'historique</caption>
<caption xml:lang="tr">Tarihçenin tüm ayrıntıları için kolay genel bakış</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/phone-extra.png</image>
<caption>Every option, on every screen size</caption>
<caption xml:lang="fr">Toutes les options, quelle que soit la taille d'écran</caption>
<caption xml:lang="tr">Ekran boyutu ne olursa olsun, tüm seçenekler elinizin altında</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/file-lists.png</image>
<caption>Manage a job's individual files</caption>
<caption xml:lang="fr">Gérez les fichiers individuels d'une tâche</caption>
<caption xml:lang="tr">Herhangi bir görevin dosyalarını tek tek yönetin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/set-speedlimit.png</image>
<caption>Easy speed limiting</caption>
<caption xml:lang="fr">Limitation facile du débit</caption>
<caption xml:lang="tr">Kolay hız sınırlaması</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/set-options.png</image>
<caption>Quickly change settings</caption>
<caption xml:lang="fr">Changement rapide des réglages</caption>
<caption xml:lang="tr">Ayarları hızlıca değiştirin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/dashboard.png</image>
<caption>Easy system check</caption>
<caption xml:lang="fr">Vérification facile du système</caption>
<caption xml:lang="tr">Sistemi kolayca kontrol edin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/connections-overview.png</image>
<caption>See active connections</caption>
<caption xml:lang="fr">Voyez les connexions actives</caption>
<caption xml:lang="tr">Etkin bağlantıları görüntüleyin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/skin-settings.png</image>
<caption>Customize the interface</caption>
<caption xml:lang="fr">Personnalisez l'interface</caption>
<caption xml:lang="tr">Arayüzü kişiselleştirin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/tabbed.png</image>
<caption>Tabbed-mode</caption>
<caption xml:lang="fr">Mode avec onglets</caption>
<caption xml:lang="tr">Sekmeli kip</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/set-custom-pause.png</image>
<caption>Specify any pause duration</caption>
<caption xml:lang="fr">Spécifiez une durée de pause quelconque</caption>
<caption xml:lang="tr">Herhangi bir duraklama süresi belirtin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/config.png</image>
<caption>Easy configuration</caption>
<caption xml:lang="fr">Configuration facile</caption>
<caption xml:lang="tr">Kolay yapılandırma</caption>
</screenshot>
</screenshots>
<content_rating type="oars-1.1"/>
<id>org.sabnzbd.sabnzbd</id>
<metadata_license>MIT</metadata_license>
<name>SABnzbd</name>
<summary>Free and easy binary newsreader</summary>
<summary xml:lang="fr">Lecteur de news binaire libre et facile à utiliser</summary>
<summary xml:lang="tr">Özgür ve kullanımı kolay Usenet ikili okuyucu</summary>
<branding>
<color type="primary" scheme_preference="light">#e7e7e7</color>
<color type="primary" scheme_preference="dark">#444444</color>
</branding>
<description>
<p>
SABnzbd is a free and Open Source web-based binary newsreader,
with support for the popular nzb file format. It greatly simplifies
the process of downloading from Usenet, thanks to a friendly
web-based user interface and advanced built-in post-processing
options including the ability to automatically verify, repair,
extract and clean up downloaded posts. It runs anywhere, comes in
over a dozen languages, and integrates with a host of tools, apps
and services that help automate the download process.
</p>
<p xml:lang="fr">
SABnzbd est un lecteur binaire de newsgroups libre et gratuit prenant
en charge le format nzb très répandu. Il simplifie grandement le processus
de téléchargement depuis Usenet grâce à une interface web conviviale
et à des options avancées de post-traitement intégrées qui comprennent
la capacité à vérifier, réparer, extraire et nettoyer automatiquement
les messages téléchargés. Il fonctionne partout, est fourni avec une
douzaine de traductions et s'intègre avec de nombreux outils, applications
et services qui aident à automatiser le processus de téléchargement.
</p>
<p xml:lang="tr">
SABnzbd, popüler nzb biçimini destekleyen özgür ve ücretsiz bir ikili
haber grupları okuyucusudur. Kullanıcı dostu Web tabanlı arayüzü ve
indirilen mesajları otomatik olarak doğrulama, tamir etme, çıkarma ve
temizleme kabiliyetine sahip gelişmiş yerleşik son işlem seçenekleri
sayesinde Usenet ağından indirmeyi büyük ölçüde kolaylaştırır. Her yerde
çalışabilir, bir düzineden fazla dil desteği sunar ve indirme sürecini
otomatik hâle getirmeye yardımcı olan birçok araç, uygulama ve hizmet ile
birlikte çalışabilir.
</p>
</description>
<keywords>
<keyword>usenet</keyword>
<keyword>nzb</keyword>
<keyword>download</keyword>
<keyword>newsreader</keyword>
<keyword>binary</keyword>
<keyword xml:lang="fr">usenet</keyword>
<keyword xml:lang="fr">nzb</keyword>
<keyword xml:lang="fr">téléchargement</keyword>
<keyword xml:lang="fr">binaires</keyword>
<keyword xml:lang="tr">usenet</keyword>
<keyword xml:lang="tr">nzb</keyword>
<keyword xml:lang="tr">indirme</keyword>
</keywords>
<categories>
<category>Network</category>
<category>FileTransfer</category>
</categories>
<url type="homepage">https://sabnzbd.org</url>
<url type="bugtracker">https://github.com/sabnzbd/sabnzbd/issues</url>
<url type="vcs-browser">https://github.com/sabnzbd/sabnzbd</url>
<url type="contribute">https://github.com/sabnzbd/sabnzbd</url>
<url type="translate">https://sabnzbd.org/wiki/translate</url>
<url type="donation">https://sabnzbd.org/donate</url>
<url type="help">https://sabnzbd.org/wiki/</url>
<url type="faq">https://sabnzbd.org/wiki/faq</url>
<url type="contact">https://sabnzbd.org/live-chat.html</url>
<releases>
<release version="5.1.0" date="2026-08-10" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.1.0</url>
</release>
<release version="5.0.4" date="2026-06-11" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.4</url>
</release>
<release version="5.0.3" date="2026-05-15" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.3</url>
</release>
<release version="5.0.2" date="2026-05-14" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.2</url>
</release>
<release version="5.0.1" date="2026-05-01" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.1</url>
</release>
<release version="5.0.0" date="2026-05-01" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/5.0.0</url>
</release>
<release version="4.5.5" date="2025-10-24" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.5</url>
</release>
<release version="4.5.4" date="2025-10-22" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.4</url>
</release>
<release version="4.5.3" date="2025-08-25" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.3</url>
</release>
<release version="4.5.2" date="2025-07-09" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.2</url>
</release>
<release version="4.5.1" date="2025-04-11" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.1</url>
</release>
<release version="4.5.0" date="2025-04-01" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.5.0</url>
</release>
<release version="4.4.1" date="2024-12-23" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.4.1</url>
</release>
<release version="4.4.0" date="2024-12-09" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.4.0</url>
</release>
<release version="4.3.3" date="2024-08-01" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.3.3</url>
</release>
<release version="4.3.2" date="2024-05-30" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.3.2</url>
</release>
<release version="4.3.1" date="2024-05-03" type="stable">
<url type="details">https://github.com/sabnzbd/sabnzbd/releases/tag/4.3.1</url>
</release>
</releases>
<launchable type="desktop-id">sabnzbd.desktop</launchable>
<provides>
<mediatype>application/x-nzb</mediatype>
<mediatype>application/x-compressed-nzb</mediatype>
</provides>
<supports>
<control>pointing</control>
<control>keyboard</control>
<control>touch</control>
</supports>
<recommends>
<display_length compare="ge">640</display_length>
<internet>always</internet>
</recommends>
<project_license>GPL-2.0-or-later</project_license>
<developer id="org.sabnzbd">
<name>The SABnzbd-Team</name>
</developer>
<screenshots>
<screenshot type="default">
<image>https://sabnzbd.org/images/landing/screenshots/interface.png</image>
<caption>Intuitive interface</caption>
<caption xml:lang="fr">Interface intuitive</caption>
<caption xml:lang="tr">Sezgisel arayüz</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/night-mode.png</image>
<caption>Also comes in Night-mode</caption>
<caption xml:lang="fr">Fourni également avec le mode nuit</caption>
<caption xml:lang="tr">Gece kipi ile de sunulur</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/add-nzb.png</image>
<caption>Add NZB's or use drag-and-drop!</caption>
<caption xml:lang="fr">Ajoutez des fichiers NZB ou utilisez le glisser - déposer !</caption>
<caption xml:lang="tr">NZB dosyaları ekleyin veya kaydır - bırak kullanın!</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/phone-interface.png</image>
<caption>Scales to any screen size</caption>
<caption xml:lang="fr">S'adapte à toutes les tailles d'écran</caption>
<caption xml:lang="tr">Her ekran boyutuna uyum sağlar</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/history-details.png</image>
<caption>Easy overview of all history details</caption>
<caption xml:lang="fr">Vue d'ensemble aisée de tous les détails de l'historique</caption>
<caption xml:lang="tr">Tarihçenin tüm ayrıntıları için kolay genel bakış</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/phone-extra.png</image>
<caption>Every option, on every screen size</caption>
<caption xml:lang="fr">Toutes les options, quelle que soit la taille d'écran</caption>
<caption xml:lang="tr">Ekran boyutu ne olursa olsun, tüm seçenekler elinizin altında</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/file-lists.png</image>
<caption>Manage a job's individual files</caption>
<caption xml:lang="fr">Gérez les fichiers individuels d'une tâche</caption>
<caption xml:lang="tr">Herhangi bir görevin dosyalarını tek tek yönetin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/set-speedlimit.png</image>
<caption>Easy speed limiting</caption>
<caption xml:lang="fr">Limitation facile du débit</caption>
<caption xml:lang="tr">Kolay hız sınırlaması</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/set-options.png</image>
<caption>Quickly change settings</caption>
<caption xml:lang="fr">Changement rapide des réglages</caption>
<caption xml:lang="tr">Ayarları hızlıca değiştirin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/dashboard.png</image>
<caption>Easy system check</caption>
<caption xml:lang="fr">Vérification facile du système</caption>
<caption xml:lang="tr">Sistemi kolayca kontrol edin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/connections-overview.png</image>
<caption>See active connections</caption>
<caption xml:lang="fr">Voyez les connexions actives</caption>
<caption xml:lang="tr">Etkin bağlantıları görüntüleyin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/skin-settings.png</image>
<caption>Customize the interface</caption>
<caption xml:lang="fr">Personnalisez l'interface</caption>
<caption xml:lang="tr">Arayüzü kişiselleştirin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/tabbed.png</image>
<caption>Tabbed-mode</caption>
<caption xml:lang="fr">Mode avec onglets</caption>
<caption xml:lang="tr">Sekmeli kip</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/set-custom-pause.png</image>
<caption>Specify any pause duration</caption>
<caption xml:lang="fr">Spécifiez une durée de pause quelconque</caption>
<caption xml:lang="tr">Herhangi bir duraklama süresi belirtin</caption>
</screenshot>
<screenshot>
<image>https://sabnzbd.org/images/landing/screenshots/config.png</image>
<caption>Easy configuration</caption>
<caption xml:lang="fr">Configuration facile</caption>
<caption xml:lang="tr">Kolay yapılandırma</caption>
</screenshot>
</screenshots>
<content_rating type="oars-1.1"/>
</component>
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: team@sabnzbd.org\n"
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
+1 -1
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Iamanro, 2026\n"
"Language-Team: Czech (https://app.transifex.com/sabnzbd/teams/111101/cs/)\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Danish (https://app.transifex.com/sabnzbd/teams/111101/da/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2025\n"
"Language-Team: German (https://app.transifex.com/sabnzbd/teams/111101/de/)\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Spanish (https://app.transifex.com/sabnzbd/teams/111101/es/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Finnish (https://app.transifex.com/sabnzbd/teams/111101/fi/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Fred L <88com88@gmail.com>, 2025\n"
"Language-Team: French (https://app.transifex.com/sabnzbd/teams/111101/fr/)\n"
+1 -1
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2025\n"
"Language-Team: Hebrew (https://app.transifex.com/sabnzbd/teams/111101/he/)\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Italian (https://app.transifex.com/sabnzbd/teams/111101/it/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Norwegian Bokmål (https://app.transifex.com/sabnzbd/teams/111101/nb/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2025\n"
"Language-Team: Dutch (https://app.transifex.com/sabnzbd/teams/111101/nl/)\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Polish (https://app.transifex.com/sabnzbd/teams/111101/pl/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Romanian (https://app.transifex.com/sabnzbd/teams/111101/ro/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Russian (https://app.transifex.com/sabnzbd/teams/111101/ru/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Serbian (https://app.transifex.com/sabnzbd/teams/111101/sr/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Swedish (https://app.transifex.com/sabnzbd/teams/111101/sv/)\n"
"MIME-Version: 1.0\n"
+1 -1
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Last-Translator: mauron, 2025\n"
"Language-Team: Turkish (https://app.transifex.com/sabnzbd/teams/111101/tr/)\n"
+1 -1
View File
@@ -3,7 +3,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:56+0000\n"
"Language-Team: Chinese (China) (https://app.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
"MIME-Version: 1.0\n"
+50 -94
View File
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: team@sabnzbd.org\n"
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
@@ -218,6 +218,14 @@ msgstr ""
msgid "Connection Successful!"
msgstr ""
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr ""
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
#. Warning message
#: sabnzbd/api.py
msgid "Server %s took %d ms to respond. On high-latency connections, increasing 'Articles per request' to a value between 5 and 10 can improve download speed. See: https://sabnzbd.org/wiki/advanced/nntp-pipelining"
@@ -238,12 +246,12 @@ msgid "Default"
msgstr ""
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr ""
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr ""
@@ -510,7 +518,15 @@ msgid "Fatal error in Downloader"
msgstr ""
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr ""
#: sabnzbd/downloader.py
msgid "Login from too many different IP addresses to server %s [%s] - https://sabnzbd.org/multiple-adresses"
msgstr ""
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr ""
#. Error message
@@ -674,16 +690,11 @@ msgid "Direct Write mode has been disabled because %s does not support sparse fi
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "API Key incorrect, Use the api key from Config->General in your 3rd party program:"
msgstr ""
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
#: sabnzbd/interface.py
@@ -691,16 +702,16 @@ msgid "API Key missing, please enter the api key from Config->General into your
msgstr ""
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid "API Key incorrect, Use the api key from Config->General in your 3rd party program:"
msgstr ""
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgid "User logged in to the web interface"
msgstr ""
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Warning message
@@ -761,6 +772,14 @@ msgstr ""
msgid "Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr ""
#: sabnzbd/interface.py
msgid "Back"
msgstr ""
#. Warning message
#: sabnzbd/internetspeed.py
msgid "Internet Bandwidth of IPv4 significantly different from IPv6: %f MB/s versus %f MB/s"
@@ -908,21 +927,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "%s in local_ranges is not a private network, list it in xff_trusted_hosts to trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1205,11 +1209,6 @@ msgstr ""
msgid "Queue finished"
msgstr ""
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1444,21 +1443,6 @@ msgstr ""
msgid "If you get this error message again, please try a different number.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid "To keep using the low port, put a reverse proxy in front of SABnzbd instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1521,15 +1505,19 @@ msgstr ""
msgid "Unable to bind to port %s on %s. Some other software uses the port or SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py
msgid "Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr ""
#: sabnzbd/panic.py
msgid "Access denied"
msgstr ""
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr ""
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1781,22 +1769,6 @@ msgstr ""
msgid "Trying to set status of non-existing server %s"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received while verify_xff_header is off, turn it on and list %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid "Forwarded is not supported, configure the proxy to send X-Forwarded-For instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2112,10 +2084,6 @@ msgstr ""
msgid "Cancel"
msgstr ""
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr ""
@@ -2671,6 +2639,10 @@ msgstr ""
msgid "Web Interface Theme"
msgstr ""
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr ""
@@ -3375,7 +3347,7 @@ msgid "Naming"
msgstr ""
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgid "How much can be downloaded this month (K/M/G)"
msgstr ""
#. Reset day of the download quota
@@ -4272,10 +4244,6 @@ msgstr ""
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid "Search by name, or refine with filters <code>cat:</code>, <code>status:</code> and <code>priority:</code> (Queue). For example: <code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr ""
@@ -4320,10 +4288,6 @@ msgstr ""
msgid "WARNING:"
msgstr ""
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr ""
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr ""
@@ -4360,14 +4324,6 @@ msgstr ""
msgid "Extra history columns"
msgstr ""
#: sabnzbd/skintext.py
msgid "Progress"
msgstr ""
#: sabnzbd/skintext.py
msgid "Actions"
msgstr ""
#: sabnzbd/skintext.py
msgid "page"
msgstr ""
+66 -116
View File
@@ -3,14 +3,14 @@
#
# Translators:
# Safihre <safihre@sabnzbd.org>, 2023
# Iamanro, 2026
# Pavel C <quoing_transifex@mess.cz>, 2026
# Iamanro, 2026
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Pavel C <quoing_transifex@mess.cz>, 2026\n"
"Last-Translator: Iamanro, 2026\n"
"Language-Team: Czech (https://app.transifex.com/sabnzbd/teams/111101/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -268,6 +268,16 @@ msgstr "Server vyžaduje zadání uživatelského jména a hesla."
msgid "Connection Successful!"
msgstr "Připojení proběhlo úspěšně!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Ověření se nezdařilo, zkontrolujte uživatelské jméno a heslo."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Příliš mnoho připojení pozastavte prosím stahování nebo to zkuste znovu "
"později"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -291,12 +301,12 @@ msgid "Default"
msgstr "Výchozí"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disk je plný! Vynucení pozastavení"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Probém s vytvořením souboru %s na disku"
@@ -597,8 +607,20 @@ msgid "Fatal error in Downloader"
msgstr "Závažná chyba ve Stahování"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Příliš mnoho spojení k serveru %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"Příliš mnoho přihlášení ze různých IP adres na server %s [%s] "
"https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Přihlášení k serveru %s se nezdařilo [%s]"
#. Error message
#: sabnzbd/downloader.py
@@ -787,22 +809,13 @@ msgstr ""
"https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Odmítnuté spojení s hostem \"%s\" z:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Nesprávný klíč API. Zadejte prosím klíč API z nabídky „Nastavení -> Obecné“ "
"do svého programu třetí strany:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "Odmítnuto spojení z:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Odmítnuté spojení s hostem \"%s\" z:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -812,17 +825,21 @@ msgstr ""
"svého programu třetí strany:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Nesprávný klíč API. Zadejte prosím klíč API z nabídky „Nastavení -> Obecné“ "
"do svého programu třetí strany:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Ověření se nezdařilo, zkontrolujte uživatelské jméno a heslo."
msgid "User logged in to the web interface"
msgstr "Uživatel se přihlásil do webového rozhraní"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Uživatel přihlášen"
#. Warning message
#: sabnzbd/interface.py
@@ -883,6 +900,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr "Složka kategorie nesmí být podsložkou složky pro dočasné stahování."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "CHYBA:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Zpět"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1045,23 +1070,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "Nezdařilo se přečíst soubor s hesly %s"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1362,11 +1370,6 @@ msgstr "Úkol neuspěšný"
msgid "Queue finished"
msgstr "Fronta dokončena"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Uživatel přihlášen"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1613,23 +1616,6 @@ msgstr ""
"Pokud se vám tato chybová zpráva zobrazí znovu, zkuste prosím jiné číslo. "
"<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1718,16 +1704,19 @@ msgstr ""
"Nelze navázat spojení %s s portem %s. Tento port používá jiný software nebo "
"již běží SABnzbd."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Nelze spustit webový prohlížeč, nejspíš nenalezen"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Přístup odepřen"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Chyba %s: Je třeba zadat platné uživatelské jméno a heslo."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1980,26 +1969,6 @@ msgstr "Plán pro neexistující server %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Zkouším aktualizovat stav neexistujícího serveru %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2315,10 +2284,6 @@ msgstr "Hostitel"
msgid "Cancel"
msgstr "Zrušit"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Přihlásit"
@@ -2905,6 +2870,10 @@ msgstr "Port, na kterém má SABnzbd naslouchat."
msgid "Web Interface Theme"
msgstr "Motiv webového rozhraní"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "Vyberte motiv."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "SABnzbd uživatelské jméno"
@@ -3745,8 +3714,8 @@ msgid "Naming"
msgstr "Pojmenování"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Kolik lze stáhnout tento měsíc (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4748,13 +4717,6 @@ msgstr "Dočasná složka"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Hromadné operace"
@@ -4799,10 +4761,6 @@ msgstr "V případě restartu SABnzbd tato obrazovka automaticky zmizí!"
msgid "WARNING:"
msgstr "VAROVÁNÍ:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "CHYBA:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Načíst"
@@ -4839,14 +4797,6 @@ msgstr "Další sloupce fronty"
msgid "Extra history columns"
msgstr "Další sloupce historie"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr ""
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Akce"
#: sabnzbd/skintext.py
msgid "page"
msgstr "stránka"
+63 -114
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Danish (https://app.transifex.com/sabnzbd/teams/111101/da/)\n"
@@ -262,6 +262,15 @@ msgstr "Serveren kræver brugernavn og adgangskode."
msgid "Connection Successful!"
msgstr "Tilslutning lykkedes!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Godkendelse mislykkedes, kontrollere brugernavn/adgangskode."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Alt for mange forbindelser, pause en download eller forsøg igen senere"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -285,12 +294,12 @@ msgid "Default"
msgstr "Standard"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disken er fuld! Pauser"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Diskfejl ved oprettelse af fil %s"
@@ -590,8 +599,20 @@ msgid "Fatal error in Downloader"
msgstr "Alvorlig fejl i Downloader"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Alt for mange forbindelser til serveren %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"Login fra for mange forskellige IP-adresser til server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Det lykkedes ikke at logge på serveren %s [%s]"
#. Error message
#: sabnzbd/downloader.py
@@ -778,22 +799,13 @@ msgstr ""
"https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Afviste forbindelse med værtsnavn \"%s\" fra:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Forkert API-nøgle, anvend api-nøglen fra Konfiguration->Generelt i dit "
"tredjepartsprogram:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "Afviste forbindelse fra:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Afviste forbindelse med værtsnavn \"%s\" fra:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -803,17 +815,21 @@ msgstr ""
"tredjepartsprogram:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Forkert API-nøgle, anvend api-nøglen fra Konfiguration->Generelt i dit "
"tredjepartsprogram:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Godkendelse mislykkedes, kontrollere brugernavn/adgangskode."
msgid "User logged in to the web interface"
msgstr "Bruger logget på webgrænsefladen"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Bruger logget ind"
#. Warning message
#: sabnzbd/interface.py
@@ -875,6 +891,14 @@ msgid ""
msgstr ""
"Kategorimappe kan ikke være en undermappe i den midlertidige download-mappe."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEJL:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Tilbage"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1037,23 +1061,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "Kunne ikke læse adgangskodefilen %s"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1352,11 +1359,6 @@ msgstr "Jobbet misllykedes"
msgid "Queue finished"
msgstr "Kø færdig"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Bruger logget ind"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1600,23 +1602,6 @@ msgid ""
"If you get this error message again, please try a different number.<br>"
msgstr "Hvis du får denne fejlmeddelelse igen, prøv et andet portnummer.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1705,16 +1690,19 @@ msgstr ""
"Kan ikke binde til port %s på %s. En anden software bruger porten eller "
"SABnzbd kører allerede."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Kan ikke starte browseren, sandsynligvis ikke fundet"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Adgang nægtet"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Fejl %s: Du skal angive et gyldigt brugernavn og adgangskode."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1966,26 +1954,6 @@ msgstr "Tidsplan for ikke-eksisterende server %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Forsøger at sætte status på ikke eksisterende server %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2301,10 +2269,6 @@ msgstr "Vært"
msgid "Cancel"
msgstr "Annullér"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Log in"
@@ -2891,6 +2855,10 @@ msgstr "Port som SABnzbd ska lytte på."
msgid "Web Interface Theme"
msgstr "Tema for webgrænseflade"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "Vælg et tema."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "SABnzbd brugernavn"
@@ -3735,8 +3703,8 @@ msgid "Naming"
msgstr "Navngivning"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Hvor meget der kan downloades i denne måned (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4740,13 +4708,6 @@ msgstr "Midlertidig mappe"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Multi-operationer"
@@ -4791,10 +4752,6 @@ msgstr "I tilfælde af SABnzbd genstart vil denne skærm forsvinde automatisk!"
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEJL:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Hent"
@@ -4831,14 +4788,6 @@ msgstr "Ekstra køkolonner"
msgid "Extra history columns"
msgstr "Ekstra historikkolonner"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Fremgang"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Handlinger"
#: sabnzbd/skintext.py
msgid "page"
msgstr "side"
+66 -115
View File
@@ -20,7 +20,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: German (https://app.transifex.com/sabnzbd/teams/111101/de/)\n"
@@ -287,6 +287,17 @@ msgstr "Server benötigt ein Benutzername und ein Passwort."
msgid "Connection Successful!"
msgstr "Verbindung erfolgreich hergestellt!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr ""
"Authentifizierung fehlgeschlagen. Überprüfen Sie Benutzername und Passwort."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Zu viele Verbindungen. Bitte halten Sie die Downloads an oder versuchen Sie "
"es später erneut."
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -310,12 +321,12 @@ msgid "Default"
msgstr "Standard"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Festplatte voll! Downloads werden angehalten."
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Festplattenfehler beim Anlegen der Datei %s"
@@ -621,8 +632,20 @@ msgid "Fatal error in Downloader"
msgstr "Schwerer Fehler im Downloader"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Zu viele Verbindungen zu Server %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"Von zu vielen unteschiedlichen IP Adressen beim Server eingeloggt %s[%s] "
"https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Anmelden beim Server fehlgeschlagen. %s [%s]"
#. Error message
#: sabnzbd/downloader.py
@@ -816,22 +839,13 @@ msgstr ""
"https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Verbindung vom Host \"%s\" abgelehnt von:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API-Schlüssel ungültig. Bitte API-Schlüssel aus Einstellungen->Allgemein in "
"die externe Anwendung eingeben:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "Abgelehnte Verbindung von:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Verbindung vom Host \"%s\" abgelehnt von:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -841,18 +855,21 @@ msgstr ""
" externe Anwendung eingeben:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API-Schlüssel ungültig. Bitte API-Schlüssel aus Einstellungen->Allgemein in "
"die externe Anwendung eingeben:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr ""
"Authentifizierung fehlgeschlagen. Überprüfen Sie Benutzername und Passwort."
msgid "User logged in to the web interface"
msgstr "Benutzer im Web-Interface angemeldet"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Benutzer angemeldet"
#. Warning message
#: sabnzbd/interface.py
@@ -915,6 +932,14 @@ msgstr ""
"Der Category-Ordner darf kein Unterordner des Temporärer Download-Ordners "
"sein."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEHLER:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Zurück"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1079,23 +1104,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "Die Passwortdatei %s konnte nicht gelesen werden"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1399,11 +1407,6 @@ msgstr "Auftrag fehlgeschlagen"
msgid "Queue finished"
msgstr "Warteschlange abgearbeitet"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Benutzer angemeldet"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1653,23 +1656,6 @@ msgstr ""
"Wenn Sie diesen Fehler wieder erhalten, probieren Sie eine andere "
"Nummer.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1758,11 +1744,6 @@ msgstr ""
"Konnte nicht an Port %s auf %s starten. Eine andere Software nutzt diesen "
"Port oder SABnzbd läuft bereits."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
@@ -1770,6 +1751,15 @@ msgstr ""
"Der Standard-Browser konnte nicht gestartet werden, da er wahrscheinlich "
"nicht gefunden wurde."
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Zugriff verweigert"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr ""
"Fehler %s: Sie müssen einen gültigen Benutzername und ein Passwort angeben."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -2025,26 +2015,6 @@ msgstr "Regel für nicht existierenden Server %s."
msgid "Trying to set status of non-existing server %s"
msgstr "Status für nicht vorhandenen Server wird versucht %s einzustellen"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2360,10 +2330,6 @@ msgstr "Adresse"
msgid "Cancel"
msgstr "Abbrechen"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Anmelden"
@@ -2955,6 +2921,10 @@ msgstr "Port, auf dem SABnzbd auf Anfragen warten soll."
msgid "Web Interface Theme"
msgstr "Benutzeroberfläche"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "Wählen Sie ein Theme."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "SABnzbd-Benutzername"
@@ -3837,8 +3807,8 @@ msgid "Naming"
msgstr "Benennung"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Wie viel kann in diesem Monat heruntergeladen werden (K/M/G)?"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4856,13 +4826,6 @@ msgstr "Temporärer Ordner"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Mehrfach-Funktionen"
@@ -4907,10 +4870,6 @@ msgstr "Wenn SABnzbd neustartet, wird diese Anzeige automatisch verschwinden!"
msgid "WARNING:"
msgstr "WARNUNG:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEHLER:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Abrufen"
@@ -4947,14 +4906,6 @@ msgstr "Weitere Spalten bei der Warteschlange"
msgid "Extra history columns"
msgstr "Weitere Spalten bei der Verlaufsliste"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Fortschritt"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Aktionen"
#: sabnzbd/skintext.py
msgid "page"
msgstr "Seite"
+63 -114
View File
@@ -9,7 +9,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Spanish (https://app.transifex.com/sabnzbd/teams/111101/es/)\n"
@@ -272,6 +272,15 @@ msgstr "El servidor necesita usuario y contraseña."
msgid "Connection Successful!"
msgstr "¡Conexión exitosa!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Autenticación fallida, compruebe el usuario o la contraseña."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Demasiadas conexiones; pause las descargas o inténtelo de nuevo más tarde"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -295,12 +304,12 @@ msgid "Default"
msgstr "Predeterminado"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disco lleno! Pausando la cola"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Error de disco al crear el archivo %s"
@@ -608,8 +617,20 @@ msgid "Fatal error in Downloader"
msgstr "Error grave en el descargador"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Demasiadas conexiones con el servidor %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"Inicio de sesión desde demasiadas direcciones IP diferentes en el servidor "
"%s [%s] - https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Registraccion fallo para servidor %s [%s]"
#. Error message
#: sabnzbd/downloader.py
@@ -802,22 +823,13 @@ msgstr ""
"https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Se deniega la conexión con el nombre de equipo \"%s\" desde:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Clave de API erróneo, favor ingresar la clave correcta desde Config->General"
" en tu aplicacion externa:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "Conexión rechazada de:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Se deniega la conexión con el nombre de equipo \"%s\" desde:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -827,17 +839,21 @@ msgstr ""
"aplicacion externa:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Clave de API erróneo, favor ingresar la clave correcta desde Config->General"
" en tu aplicacion externa:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Autenticación fallida, compruebe el usuario o la contraseña."
msgid "User logged in to the web interface"
msgstr "Usuario conectado a la interfaz web"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Usuario conectado"
#. Warning message
#: sabnzbd/interface.py
@@ -900,6 +916,14 @@ msgstr ""
"El directorio Categoría no puede ser un subdirectorio del directorio de "
"descargas temporal."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERROR:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Atrás"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1064,23 +1088,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "Error al leer el archivo de contraseña %s"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1391,11 +1398,6 @@ msgstr "Trabajo fallido"
msgid "Queue finished"
msgstr "Cola terminada"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Usuario conectado"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1646,23 +1648,6 @@ msgstr ""
"Si obtiene este mensaje de error consecutivamente, por favor inténtelo de "
"nuevo con otro número.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1751,17 +1736,20 @@ msgstr ""
"No es posible vincular al puerto %s en %s. Otro software está utilizando el "
"puerto o SABnzbd ya se está ejecutando."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr ""
"Imposible iniciar el navegador, probablemente no se le haya encontrado"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Acceso denegado"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Error %s: Necesitas introducir un usuario y contraseña válidos."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -2017,26 +2005,6 @@ msgstr "Planificación para servidor %s inexistente"
msgid "Trying to set status of non-existing server %s"
msgstr "Intentando cambiar el estado de servidor inexistente %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2352,10 +2320,6 @@ msgstr "Equipo"
msgid "Cancel"
msgstr "Cancelar"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Iniciar sesión"
@@ -2942,6 +2906,10 @@ msgstr "Puerto en que SABnzbd debería escuchar"
msgid "Web Interface Theme"
msgstr "Tema de la interfaz web"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "Elige un tema."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "Usuario SABnzbd"
@@ -3813,8 +3781,8 @@ msgid "Naming"
msgstr "Nombrado"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Cantidad de descarga permitida este mes (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4829,13 +4797,6 @@ msgstr "Carpeta temporal"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Op.Múltiples"
@@ -4882,10 +4843,6 @@ msgstr ""
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERROR:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Obtener"
@@ -4922,14 +4879,6 @@ msgstr "Columnas adicionales de la cola"
msgid "Extra history columns"
msgstr "Columnas adicionales del historial"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Progreso"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Acciones"
#: sabnzbd/skintext.py
msgid "page"
msgstr "página"
+58 -112
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Finnish (https://app.transifex.com/sabnzbd/teams/111101/fi/)\n"
@@ -250,6 +250,14 @@ msgstr "Palvelin vaatii käyttäjänimen ja salasanan."
msgid "Connection Successful!"
msgstr "Yhdistäminen onnistui!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Varmennus epäonnistui, tarkista käyttäjänimi/salasana."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr "Liikaa yhteyksiä, keskeytä lataaminen tai yritä myöhemmin uudelleen"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -273,12 +281,12 @@ msgid "Default"
msgstr "Oletus"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Levy täynnä! Pakotetaan keskeytys"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Levyvirhe luotaessa tiedostoa %s"
@@ -561,9 +569,19 @@ msgid "Fatal error in Downloader"
msgstr ""
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Liikaa yhteyksiä palvelimelle %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Kirjautuminen palvelimelle %s epäonnistui [%s]"
#. Error message
#: sabnzbd/downloader.py
msgid "Connecting %s@%s failed, message=%s"
@@ -742,20 +760,11 @@ msgid ""
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API avain virheellinen, käytä Asetukset->Yleiset löytyvää api avainta "
"käyttämääsi kolmannen osapuolen ohjelmaan:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
#: sabnzbd/interface.py
@@ -767,17 +776,21 @@ msgstr ""
"käyttämääsi kolmannen osapuolen ohjelmaan:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API avain virheellinen, käytä Asetukset->Yleiset löytyvää api avainta "
"käyttämääsi kolmannen osapuolen ohjelmaan:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Varmennus epäonnistui, tarkista käyttäjänimi/salasana."
msgid "User logged in to the web interface"
msgstr "Käyttäjä kirjautui sisään web-käyttöliittymään"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Käyttäjä kirjautui sisään"
#. Warning message
#: sabnzbd/interface.py
@@ -838,6 +851,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "VIRHE:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Takaisin"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -995,23 +1016,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1301,11 +1305,6 @@ msgstr "Lataus epäonnistui"
msgid "Queue finished"
msgstr "Jono valmistunut"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Käyttäjä kirjautui sisään"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1549,23 +1548,6 @@ msgid ""
"If you get this error message again, please try a different number.<br>"
msgstr "Jos saat tämän virhesanoman uudestaan, kokeile toista numeroa.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1652,16 +1634,19 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Selainta ei voida käynnistää, todennäköisesti ei löydy"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Ei käyttöoikeutta"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Virhe %s: Syötä kelvollinen käyttäjänimi ja salasana."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1913,26 +1898,6 @@ msgstr "Ajastettu tuntemattomalle palvelimelle %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Yritettiin asettaa tila ei olemassa olevalle palvelimelle %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2248,10 +2213,6 @@ msgstr "Isäntä"
msgid "Cancel"
msgstr "Peruuta"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Kirjaudu sisään"
@@ -2834,6 +2795,10 @@ msgstr "Portti jota SABnzbdn tulisi kuunnella."
msgid "Web Interface Theme"
msgstr ""
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "SABnzbd käyttäjänimi"
@@ -3656,8 +3621,8 @@ msgid "Naming"
msgstr "Nimeäminen"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Kuinka paljon voidaan ladata tässä kuussa (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4624,13 +4589,6 @@ msgstr "Väliaikaiskansio"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Monioperaatiot"
@@ -4676,10 +4634,6 @@ msgstr ""
msgid "WARNING:"
msgstr "VAROITUS:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "VIRHE:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Nouda"
@@ -4716,14 +4670,6 @@ msgstr ""
msgid "Extra history columns"
msgstr ""
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Edistyminen"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Toiminnot"
#: sabnzbd/skintext.py
msgid "page"
msgstr "sivu"
+68 -132
View File
@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Fred L <88com88@gmail.com>, 2026\n"
"Language-Team: French (https://app.transifex.com/sabnzbd/teams/111101/fr/)\n"
@@ -276,6 +276,16 @@ msgstr "Le serveur requiert un identifiant et un mot de passe."
msgid "Connection Successful!"
msgstr "Connexion réussie!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Echec d'authentification, vérifiez les identifiant/mot de passe."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Trop de connexions, veuillez mettre en pause le téléchargement ou essayer "
"plus tard"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -303,12 +313,12 @@ msgid "Default"
msgstr "Par défaut"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disque plein ! Pause forcée"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Erreur de disque lors de la création du fichier %s"
@@ -615,8 +625,20 @@ msgid "Fatal error in Downloader"
msgstr "Erreur fatale dans le Téléchargeur"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgstr "Le serveur %s a indiqué : %s"
msgid "Too many connections to server %s [%s]"
msgstr "Trop de connexions au serveur %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"Connexion au serveur %s [%s] à partir de trop d'adresses IP différentes - "
"https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Échec de la connexion au serveur %s [%s]"
#. Error message
#: sabnzbd/downloader.py
@@ -810,22 +832,13 @@ msgstr ""
"consultez : https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Connexion refusée avec le nom d'hôte \"%s\" à partir de :"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Clé API incorrecte, utilisez la clé API de la configuration générale dans "
"votre application tierce :"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "Connexion refusée de:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Connexion refusée avec le nom d'hôte \"%s\" à partir de :"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -835,17 +848,21 @@ msgstr ""
" application tierce :"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr "Trop de tentatives de connexion échouées, réessayer ultérieurement."
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgstr "Tentative de connexion refusée, trop d'échecs de %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Clé API incorrecte, utilisez la clé API de la configuration générale dans "
"votre application tierce :"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Echec d'authentification, vérifiez les identifiant/mot de passe."
msgid "User logged in to the web interface"
msgstr "Utilisateur connecté à l'interface web"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Utilisateur connecté"
#. Warning message
#: sabnzbd/interface.py
@@ -908,6 +925,14 @@ msgstr ""
"Le dossier de catégorie ne peut pas être un sous-dossier du dossier de "
"téléchargement temporaire."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERREUR:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Retour"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1072,23 +1097,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "Échec de lecture du fichier de mot de passe %s"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1392,11 +1400,6 @@ msgstr "La tâche a échoué"
msgid "Queue finished"
msgstr "File d'attente terminée"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Utilisateur connecté"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1642,32 +1645,6 @@ msgstr ""
"Si vous obtenez ce message d'erreur à nouveau, veuillez essayer un nombre "
"différent.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
"\n"
" SABnzbd n'est pas autorisé à utiliser le port %s sur %s.<br>\n"
" Sur la plupart des systèmes, les numéros de port faibles sont réservés aux processus privilégiés.\n"
" le port est donc disponible, mais ne peut pas être utilisé.<br>\n"
" <br>\n"
" Lancez SABnzbd avec les privilèges requis pour ce port, ou redémarrez-le\n"
" en lui attribuant un numéro de port supérieur ou égal à 1024."
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
"Pour continuer à utiliser un port privilégié, mettez un proxy inverse devant"
" SABnzbd.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1756,18 +1733,21 @@ msgstr ""
"Impossible de lier le port %s sur %s. Un autre logiciel utilise le port ou "
"SABnzbd est déjà en cours d'exécution."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
"Impossible de se lier au port %s sur %s. Les ports inférieurs à 1024 "
"demandent des privilèges élevés."
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Impossible de lancer le navigateur web, probablement pas trouvé"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Accès refusé"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr ""
"Erreur %s: vous devez fournir un nom d'utilisateur et un mot de passe "
"valide."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -2024,26 +2004,6 @@ msgstr "Planification pour un serveur non existant %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Test de l'état du serveur inexistant %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2359,10 +2319,6 @@ msgstr "Hôte"
msgid "Cancel"
msgstr "Annuler"
#: sabnzbd/skintext.py
msgid "Close"
msgstr "Fermer"
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Se connecter"
@@ -2954,6 +2910,10 @@ msgstr "Port que SABnzbd doit surveiller."
msgid "Web Interface Theme"
msgstr "Thème de l'interface web"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "Choisissez un thème."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "Identifiant SABnzbd"
@@ -3835,10 +3795,8 @@ msgid "Naming"
msgstr "Appellation"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
"Quantité de données pouvant être téléchargées durant ce cycle de quota "
"(K/M/G)"
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Combien peut-être télécharger ce mois (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4857,16 +4815,6 @@ msgstr "Dossier temporaire"
msgid "Clear search"
msgstr "Effacer la recherche"
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
"Rechercher par nom, ou affiner avec des filtres <code>cat :</code>, "
"<code>statut :</code> et <code>priorité :</code> (file d'attente). Par "
"exemple : <code>mon show cat:tv</code>"
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Multi-Operations"
@@ -4912,10 +4860,6 @@ msgstr ""
msgid "WARNING:"
msgstr "AVERTISSEMENT :"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERREUR:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Charger"
@@ -4952,14 +4896,6 @@ msgstr "Colonnes de file d'attente supplémentaires"
msgid "Extra history columns"
msgstr "Colonnes d'historique supplémentaires"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Avancement"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Actions"
#: sabnzbd/skintext.py
msgid "page"
msgstr "page"
+61 -113
View File
@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Hebrew (https://app.transifex.com/sabnzbd/teams/111101/he/)\n"
@@ -254,6 +254,14 @@ msgstr ".השרת דורש שם משתמש וסיסמה"
msgid "Connection Successful!"
msgstr "חיבור מוצלח!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "אימות נכשל, בדוק שם משתמש/סיסמה."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr "יותר מדי חיבורים, אנא השהה הורדה או נסה שוב מאוחר יותר"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -277,12 +285,12 @@ msgid "Default"
msgstr "ברירת מחדל"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "דיסק מלא! מאלץ השהיה"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "שגיאת דיסק ביצירת קובץ %s"
@@ -572,8 +580,20 @@ msgid "Fatal error in Downloader"
msgstr "שגיאה גורלית במורידן"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "יותר מדי חיבורים לשרת %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"כניסה מיותר מדי כתובות IP שונות אל שרת %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "כניסה נכשלה עבור שרת %s [%s]"
#. Error message
#: sabnzbd/downloader.py
@@ -757,20 +777,13 @@ msgstr ""
" אפשריים, ראה: https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "חיבור מסורב עם שם המארח \"%s\" מאת:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr "מפתח API שגוי, השתמש במפתח ה־API מתצורה->כללי בתוכנית הצד השלישי שלך:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "חיבור מסורב מאת:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "חיבור מסורב עם שם המארח \"%s\" מאת:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -780,17 +793,19 @@ msgstr ""
"שלך:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgstr ""
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr "מפתח API שגוי, השתמש במפתח ה־API מתצורה->כללי בתוכנית הצד השלישי שלך:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "אימות נכשל, בדוק שם משתמש/סיסמה."
msgid "User logged in to the web interface"
msgstr "משתמש התחבר לממשק הרשת"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "משתמש התחבר"
#. Warning message
#: sabnzbd/interface.py
@@ -851,6 +866,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr "תיקיית קטגוריה אינה יכולה להיות תת־תיקייה של תיקיית ההורדות הזמניות."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "שגיאה:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "הקודם"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1012,23 +1035,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "כישלון בקריאת קובץ הסיסמה %s"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1321,11 +1327,6 @@ msgstr "עבודה נכשלה"
msgid "Queue finished"
msgstr "תור הסתיים"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "משתמש התחבר"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1569,23 +1570,6 @@ msgid ""
"If you get this error message again, please try a different number.<br>"
msgstr "אם אתה מקבל את הודעת השגיאה הזו שוב, אנא נסה מספר שונה.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1674,16 +1658,19 @@ msgstr ""
"לא היה ניתן לקשר את פתחה %s על %s. איזשהי תוכנה אחרת משתמשת בפתחה או SABnzbd"
" כבר רץ."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "לא היה ניתן להפעיל את הדפדפן, כנראה שהוא לא נמצא"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "גישה נדחתה"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "שגיאה %s: אתה צריך לספק שם משתמש וסיסמה תקפים."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1935,26 +1922,6 @@ msgstr "תזמן עבור שרת בלתי קיים %s"
msgid "Trying to set status of non-existing server %s"
msgstr "מנסה לקבוע מעמד של שרת בלתי קיים %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2270,10 +2237,6 @@ msgstr "מארח"
msgid "Cancel"
msgstr "ביטול"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "התחבר"
@@ -2856,6 +2819,10 @@ msgstr "פתחה אשר SABnzbd צריך להאזין אליה."
msgid "Web Interface Theme"
msgstr "ערכת נושא של ממשק רשת"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "בחר ערכת נושא."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "שם משתמש SABnzbd"
@@ -3672,8 +3639,8 @@ msgid "Naming"
msgstr "מתן שמות"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "כמה ניתן להוריד החודש (ק״ב/מ״ב/ג״ב)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4659,13 +4626,6 @@ msgstr "תיקייה זמנית"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "רב־תפעולים"
@@ -4710,10 +4670,6 @@ msgstr "במקרה של הפעלה מחדש של SABnzbd המסך ייעלם ב
msgid "WARNING:"
msgstr "אזהרה:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "שגיאה:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "משוך"
@@ -4750,14 +4706,6 @@ msgstr "יותר עמודות תור"
msgid "Extra history columns"
msgstr "יותר עמודות היסטוריה"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "התקדמות"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "פעולות"
#: sabnzbd/skintext.py
msgid "page"
msgstr "דף"
+64 -114
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Italian (https://app.transifex.com/sabnzbd/teams/111101/it/)\n"
@@ -269,6 +269,16 @@ msgstr "Il server richiede nome utente e password."
msgid "Connection Successful!"
msgstr "Connessione riuscita!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Autenticazione fallita, controlla nome utente/password."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Troppe connessioni, si prega di mettere in pausa il download o riprovare più"
" tardi"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -292,12 +302,12 @@ msgid "Default"
msgstr "Predefinito"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disco pieno! Messa in pausa forzata"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Errore del disco durante la creazione del file %s"
@@ -604,8 +614,20 @@ msgid "Fatal error in Downloader"
msgstr "Errore fatale nel Downloader"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Troppe connessioni al server %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"Accesso da troppi indirizzi IP diversi al server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Accesso fallito per il server %s [%s]"
#. Error message
#: sabnzbd/downloader.py
@@ -797,22 +819,13 @@ msgstr ""
"https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Connessione rifiutata con hostname \"%s\" da:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Chiave API non corretta, Usa la chiave API da Config->Generale nel tuo "
"programma di terze parti:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "Connessione rifiutata da:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Connessione rifiutata con hostname \"%s\" da:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -822,17 +835,21 @@ msgstr ""
"nel proprio programma di terze parti:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Chiave API non corretta, Usa la chiave API da Config->Generale nel tuo "
"programma di terze parti:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Autenticazione fallita, controlla nome utente/password."
msgid "User logged in to the web interface"
msgstr "Utente ha effettuato l'accesso all'interfaccia web"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Utente ha effettuato l'accesso"
#. Warning message
#: sabnzbd/interface.py
@@ -895,6 +912,14 @@ msgstr ""
"La cartella della categoria non può essere una sottocartella della cartella "
"dei download temporanei."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERRORE:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Indietro"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1058,23 +1083,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "Lettura del file delle password %s fallita"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1374,11 +1382,6 @@ msgstr "Processo fallito"
msgid "Queue finished"
msgstr "Coda terminata"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Utente ha effettuato l'accesso"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1623,23 +1626,6 @@ msgid ""
msgstr ""
"Se ricevi di nuovo questo messaggio di errore, prova un numero diverso.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1728,16 +1714,19 @@ msgstr ""
"Impossibile collegarsi alla porta %s su %s. Qualche altro software sta "
"usando la porta o SABnzbd è già in esecuzione."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Impossibile avviare il browser, probabilmente non trovato"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Accesso negato"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Errore %s: È necessario fornire un nome utente e una password validi."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1989,26 +1978,6 @@ msgstr "Pianificazione per server inesistente %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Tentativo di impostare lo stato del server inesistente %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2324,10 +2293,6 @@ msgstr "Host"
msgid "Cancel"
msgstr "Annulla"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Accedi"
@@ -2917,6 +2882,10 @@ msgstr "Porta su cui SABnzbd dovrebbe essere in ascolto."
msgid "Web Interface Theme"
msgstr "Tema interfaccia web"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "Scegli un tema."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "Nome utente SABnzbd"
@@ -3779,8 +3748,8 @@ msgid "Naming"
msgstr "Denominazione"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Quanto può essere scaricato questo mese (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4793,13 +4762,6 @@ msgstr "Cartella temporanea"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Operazioni multiple"
@@ -4845,10 +4807,6 @@ msgstr ""
msgid "WARNING:"
msgstr "ATTENZIONE:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERRORE:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Recupera"
@@ -4885,14 +4843,6 @@ msgstr "Colonne extra della coda"
msgid "Extra history columns"
msgstr "Colonne extra della cronologia"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr ""
#: sabnzbd/skintext.py
msgid "Actions"
msgstr ""
#: sabnzbd/skintext.py
msgid "page"
msgstr "pagina"
+59 -112
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Norwegian Bokmål (https://app.transifex.com/sabnzbd/teams/111101/nb/)\n"
@@ -247,6 +247,15 @@ msgstr "Server krever brukernavn og passord."
msgid "Connection Successful!"
msgstr "Tilkobling lyktes!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Godkjenning mislyktes, kontroller brukernavn og passord."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"For mange tilkoblinger, sett nedlasting på pause eller prøv igjen senere"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -270,12 +279,12 @@ msgid "Default"
msgstr "Standard"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disken er full! Pauser..."
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Diskfeil under opprettelse av fil %s"
@@ -557,9 +566,19 @@ msgid "Fatal error in Downloader"
msgstr ""
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "For mange tilkoblinger til server %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Kunne ikke logge inn på server %s [%s]"
#. Error message
#: sabnzbd/downloader.py
msgid "Connecting %s@%s failed, message=%s"
@@ -738,20 +757,11 @@ msgid ""
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API-nøkkel er feil, bruk API-nøkkel fra Konfigurasjon->Generelt i ditt "
"tredjepartsprogram:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
#: sabnzbd/interface.py
@@ -763,17 +773,21 @@ msgstr ""
"ditt tredjepartsprogram:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API-nøkkel er feil, bruk API-nøkkel fra Konfigurasjon->Generelt i ditt "
"tredjepartsprogram:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Godkjenning mislyktes, kontroller brukernavn og passord."
msgid "User logged in to the web interface"
msgstr "Bruker logget inn i webgrensesnitt"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Bruker pålogget"
#. Warning message
#: sabnzbd/interface.py
@@ -834,6 +848,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEIL:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Tilbake"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -991,23 +1013,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1298,11 +1303,6 @@ msgstr "Jobb mislyktes"
msgid "Queue finished"
msgstr "Køen er ferdig"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Bruker pålogget"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1546,23 +1546,6 @@ msgid ""
"If you get this error message again, please try a different number.<br>"
msgstr "Prøv et annet nummer hvis du får denne feilmeldingen på nytt.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1649,16 +1632,19 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Kan ikke starte webserveren, ble sannsynlig vis ikke funnet"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Ingen tilgang"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Feil %s: Du må oppgi et gyldig brukernavn og passord."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1910,26 +1896,6 @@ msgstr "Skjema for ikke eksisterende server %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Forsøker å sette status på ikke-eksisterende server %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2245,10 +2211,6 @@ msgstr "Adresse"
msgid "Cancel"
msgstr "Avbryt"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Logg på"
@@ -2829,6 +2791,10 @@ msgstr "Porten som SABnzbd skal bruke."
msgid "Web Interface Theme"
msgstr ""
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "SABnzbd Brukernavn"
@@ -3632,8 +3598,8 @@ msgid "Naming"
msgstr "Filnavn"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Hvor mye can lastes ned denne måneden (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4597,13 +4563,6 @@ msgstr "Midlertidig Mappe"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Multioperasjoner"
@@ -4649,10 +4608,6 @@ msgstr ""
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEIL:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Hent"
@@ -4689,14 +4644,6 @@ msgstr ""
msgid "Extra history columns"
msgstr ""
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Jobb"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Hendelser"
#: sabnzbd/skintext.py
msgid "page"
msgstr "side"
+63 -114
View File
@@ -8,7 +8,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Dutch (https://app.transifex.com/sabnzbd/teams/111101/nl/)\n"
@@ -268,6 +268,15 @@ msgstr "Server heeft een gebruikersnaam en een wachtwoord nodig."
msgid "Connection Successful!"
msgstr "Succesvol verbonden!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Inloggen mislukt, controleer gebruikersnaam en wachtwoord."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Te veel verbindingen, onderbreek het downloaden of probeer later nog eens."
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -291,12 +300,12 @@ msgid "Default"
msgstr "Standaard"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Schijf is vol; gedwongen pauze"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Schrijffout bij opslaan van bestand %s"
@@ -605,8 +614,20 @@ msgid "Fatal error in Downloader"
msgstr "Onherstelbare fout in de Downloader"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Te veel verbindingen met server %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"Teveel verschillende IP-adressen probeerde in te loggen op server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Aanmelden bij server %s mislukt [%s]"
#. Error message
#: sabnzbd/downloader.py
@@ -800,22 +821,13 @@ msgstr ""
"https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Verbinding met hostnaam \"%s\" geweigerd van:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API-sleutel incorrect; vul de API-sleutel van 'Configuratie' => 'Algemeen' "
"in bij het externe programma:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "Verbinding geweigerd van: "
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Verbinding met hostnaam \"%s\" geweigerd van:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -825,17 +837,21 @@ msgstr ""
"in bij het externe programma:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API-sleutel incorrect; vul de API-sleutel van 'Configuratie' => 'Algemeen' "
"in bij het externe programma:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Inloggen mislukt, controleer gebruikersnaam en wachtwoord."
msgid "User logged in to the web interface"
msgstr "Gebruiker heeft ingelogd"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Gebruiker ingelogd"
#. Warning message
#: sabnzbd/interface.py
@@ -898,6 +914,14 @@ msgstr ""
"Een Categorie specifieke map mag niet een map in de Tijdelijke download map "
"zijn."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FOUT:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Terug"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1062,23 +1086,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "Kan het wachtwoord bestand niet uitlezen %s"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1378,11 +1385,6 @@ msgstr "Download mislukt"
msgid "Queue finished"
msgstr "Wachtrij voltooid"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Gebruiker ingelogd"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1626,23 +1628,6 @@ msgid ""
"If you get this error message again, please try a different number.<br>"
msgstr "Als je dit bericht weer krijgt, probeer dan een ander nummer.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1731,16 +1716,19 @@ msgstr ""
"Kan niet binden aan poort %s van %s. Andere software gebruikt deze poort of "
"SABnzbd is al actief."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Kan de web-browser niet starten, geen gevonden"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Toegang geweigerd"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Fout %s: Je moet een geldige gebruikersnaam en wachtwoord invullen."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1993,26 +1981,6 @@ msgstr "Taak voor niet bestaande server %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Poging de status van niet-bestaande server %s in te stellen"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2328,10 +2296,6 @@ msgstr "Server"
msgid "Cancel"
msgstr "Annuleren"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Aanmelden"
@@ -2920,6 +2884,10 @@ msgstr "Poort waar op SABnzbd luistert."
msgid "Web Interface Theme"
msgstr "Webinterface Stijl"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "Kies een stijl voor de webinterface."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "Gebruikersnaam"
@@ -3781,8 +3749,8 @@ msgid "Naming"
msgstr "Naamgeving"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Hoeval mag deze maand worden gedownload (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4793,13 +4761,6 @@ msgstr "Tijdelijke map"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Meervoudige bewerking"
@@ -4844,10 +4805,6 @@ msgstr "Wanneer SABnzbd opnieuw is gestart, gaat dit venster vanzelf weg!"
msgid "WARNING:"
msgstr "WAARSCHUWING:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FOUT:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Ophalen"
@@ -4884,14 +4841,6 @@ msgstr "Extra kolommen aan wachtrij toevoegen"
msgid "Extra history columns"
msgstr "Extra kolommen aan geschiedenis toevoegen"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Voortgang"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Acties"
#: sabnzbd/skintext.py
msgid "page"
msgstr "Pagina"
+60 -112
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Polish (https://app.transifex.com/sabnzbd/teams/111101/pl/)\n"
@@ -245,6 +245,16 @@ msgstr "Serwer wymaga podania nazwy użytkownika i hasła."
msgid "Connection Successful!"
msgstr "Połączenie udane!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Błąd połączenia, sprawdź nazwę użytkownika i hasło."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Zbyt wiele połączeń, proszę wstrzymać pobieranie lub spróbować ponownie "
"później"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -268,12 +278,12 @@ msgid "Default"
msgstr "Domyślne"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Dysk pełny! Wstrzymuję pobieranie"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Błąd dysku podczas tworzenia pliku %s"
@@ -557,9 +567,19 @@ msgid "Fatal error in Downloader"
msgstr ""
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Zbyt wiele połączeń do serwera %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Błąd logowania do serwera %s [%s]"
#. Error message
#: sabnzbd/downloader.py
msgid "Connecting %s@%s failed, message=%s"
@@ -740,20 +760,11 @@ msgid ""
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Klucz API jest nieprawidłowy, użyj klucza API z sekcji Konfiguracja->Ogólne "
"w zewnętrznym programie:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
#: sabnzbd/interface.py
@@ -765,17 +776,21 @@ msgstr ""
"do zewnętrznego programu:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Klucz API jest nieprawidłowy, użyj klucza API z sekcji Konfiguracja->Ogólne "
"w zewnętrznym programie:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Błąd połączenia, sprawdź nazwę użytkownika i hasło."
msgid "User logged in to the web interface"
msgstr ""
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Warning message
#: sabnzbd/interface.py
@@ -836,6 +851,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "BŁĄD:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Powrót"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -993,23 +1016,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1302,11 +1308,6 @@ msgstr "Zadanie nie powiodło się"
msgid "Queue finished"
msgstr "Kolejka ukończona"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1551,23 +1552,6 @@ msgid ""
msgstr ""
"Jeśli ponownie otrzymasz ten sam błąd, spróbuj zmienić numer portu.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1654,17 +1638,20 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr ""
"Nie można uruchomić przeglądarki, prawdopodobnie nie została znaleziona"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Brak dostępu"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Błąd %s: należy podać prawidłową nazwę użytkownika i hasło."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1918,26 +1905,6 @@ msgstr "Harmonogram dla nieistniejącego serwera %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Próba ustawienia statusu nieistniejącego serwera %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2253,10 +2220,6 @@ msgstr "Host"
msgid "Cancel"
msgstr "Anuluj"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr ""
@@ -2836,6 +2799,10 @@ msgstr "Port, na którym ma nasłuchiwać SABnzbd"
msgid "Web Interface Theme"
msgstr ""
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "Użytkownik SABnzbd"
@@ -3642,8 +3609,8 @@ msgid "Naming"
msgstr "Nazwy"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Ile danych można pobrać w miesiącu (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4608,13 +4575,6 @@ msgstr "Folder tymczasowy"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Operacje na wielu"
@@ -4660,10 +4620,6 @@ msgstr ""
msgid "WARNING:"
msgstr "UWAGA:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "BŁĄD:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Pobierz"
@@ -4700,14 +4656,6 @@ msgstr ""
msgid "Extra history columns"
msgstr ""
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Postęp"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Działania"
#: sabnzbd/skintext.py
msgid "page"
msgstr "strona"
+60 -112
View File
@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/sabnzbd/teams/111101/pt_BR/)\n"
@@ -251,6 +251,16 @@ msgstr "Servidor requer usuário e senha."
msgid "Connection Successful!"
msgstr "Conexão com Sucesso!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Falha de autenticação, verifique usuário / senha."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Excesso de conexões, por favor pause o download ou tente novamente mais "
"tarde"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -274,12 +284,12 @@ msgid "Default"
msgstr "Padrão"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disco cheio! Forçando Pausa"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Erro de disco na criação do arquivo %s"
@@ -571,9 +581,19 @@ msgid "Fatal error in Downloader"
msgstr ""
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Excesso de conexões ao servidor %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Falha de logon ao servidor %s [%s]"
#. Error message
#: sabnzbd/downloader.py
msgid "Connecting %s@%s failed, message=%s"
@@ -752,20 +772,11 @@ msgid ""
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Chave de API incorreta. Use a chave de API de Configuração->Geral em seu "
"programa de terceiros:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
#: sabnzbd/interface.py
@@ -777,17 +788,21 @@ msgstr ""
"Configuração->Geral em seu programa de terceiros:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Chave de API incorreta. Use a chave de API de Configuração->Geral em seu "
"programa de terceiros:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Falha de autenticação, verifique usuário / senha."
msgid "User logged in to the web interface"
msgstr ""
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Warning message
#: sabnzbd/interface.py
@@ -848,6 +863,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERRO:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Voltar"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1005,23 +1028,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1311,11 +1317,6 @@ msgstr "Tarefa com falha"
msgid "Queue finished"
msgstr "Fila concluída"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1561,23 +1562,6 @@ msgstr ""
"Se você receber esta mensagem de erro outra vez, tente um número "
"diferente.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1664,16 +1648,19 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Não é possível iniciar o navegador. Provavelmente não foi encontrado"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Acesso negado"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Erro %s: Você precisa fornecer um nome de usuário e senha válidos."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1929,26 +1916,6 @@ msgstr "Agendamento para um servidor inexistente %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Tentando definir o status do servidor inexistente %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2264,10 +2231,6 @@ msgstr "Host"
msgid "Cancel"
msgstr "Cancelar"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr ""
@@ -2847,6 +2810,10 @@ msgstr "Porta onde o SABnzbd será ativado."
msgid "Web Interface Theme"
msgstr ""
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "Usuário do SABnzbd"
@@ -3654,8 +3621,8 @@ msgid "Naming"
msgstr "Nomeando"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Quanto pode ser baixado neste mês (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4619,13 +4586,6 @@ msgstr "Pasta temporária"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Multi-Operações"
@@ -4671,10 +4631,6 @@ msgstr ""
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERRO:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Obter"
@@ -4711,14 +4667,6 @@ msgstr ""
msgid "Extra history columns"
msgstr ""
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Progresso"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Ações"
#: sabnzbd/skintext.py
msgid "page"
msgstr "página"
+62 -114
View File
@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Romanian (https://app.transifex.com/sabnzbd/teams/111101/ro/)\n"
@@ -255,6 +255,16 @@ msgstr "Serverul necesită nume utilizator şi parolă"
msgid "Connection Successful!"
msgstr "Conexiune Reuşită!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Autentificare nereuşită, verifică nume utilizator/parolă."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Prea multe conexiuni, vă rugăm să întrerupeţi descărcarea sau să încercaţi "
"din nou mai târziu"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -278,12 +288,12 @@ msgid "Default"
msgstr "Implicit"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disc plin! Pauză Forţată"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Eroare disc la crearea fişierului %s"
@@ -579,9 +589,19 @@ msgid "Fatal error in Downloader"
msgstr ""
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Prea multe conexiuni la serverul %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Autentificare nereuşită la serverul %s [%s]"
#. Error message
#: sabnzbd/downloader.py
msgid "Connecting %s@%s failed, message=%s"
@@ -760,22 +780,13 @@ msgid ""
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Conectare refuzată cu gazda „%s” de la:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Cheie API incorectă, Folosiţi cheia api din Configurare->General în "
"programul dumneavoastră terţ:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Conectare refuzată cu gazda „%s” de la:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -785,17 +796,21 @@ msgstr ""
"Configurare->General în programul dumneavoastră terţ"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Cheie API incorectă, Folosiţi cheia api din Configurare->General în "
"programul dumneavoastră terţ:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Autentificare nereuşită, verifică nume utilizator/parolă."
msgid "User logged in to the web interface"
msgstr "Utilizatorul s-a autentificat în interfața web"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Utilizator logat"
#. Warning message
#: sabnzbd/interface.py
@@ -858,6 +873,14 @@ msgstr ""
"Directorul de categorii nu poate fi un subdirector al directorului de "
"descărcări temporare."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "EROARE:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Înapoi"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1017,23 +1040,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "Eșuare la citirea fișierului cu parole %s"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1329,11 +1335,6 @@ msgstr "Sarcină eșuată"
msgid "Queue finished"
msgstr "Coadă finalizată"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Utilizator logat"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1579,23 +1580,6 @@ msgstr ""
"Dacă primiţi acest mesaj de eroare din nou, vă rugăm să încercaţi un alt "
"număr. <br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1684,16 +1668,19 @@ msgstr ""
"Nu pot rezerva portul %s pe %s. Alt software utilizează portul sau SABnzbs "
"rulează deja."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Nu pot porni navigatorul web, probabil nu a fost găsit"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Acces interzis"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Eroare %s: Trebuie să furnizaţi un nume utilizator şi parolă valid"
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1947,26 +1934,6 @@ msgstr "Planificare pentru un server inexistent %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Încerc să setez starea unui server nexistent %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2282,10 +2249,6 @@ msgstr "Gazdă"
msgid "Cancel"
msgstr "Anulează"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Autentificare"
@@ -2868,6 +2831,10 @@ msgstr "Portul pe care SABnzbd îl va asculta."
msgid "Web Interface Theme"
msgstr ""
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "Nume Utilizator SABnzbd"
@@ -3673,8 +3640,8 @@ msgid "Naming"
msgstr "Redenumire"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Cât de mult poate fi descărcat în acestă lună (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4639,13 +4606,6 @@ msgstr "Dosar Temporar"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Operaţii-Multiple"
@@ -4690,10 +4650,6 @@ msgstr "În cazul repornirii SABnzbd acest ecran va dispărea în mod automat!"
msgid "WARNING:"
msgstr "ATENŢIE:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "EROARE:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Descarcă"
@@ -4730,14 +4686,6 @@ msgstr ""
msgid "Extra history columns"
msgstr ""
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Progres"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Acțiuni"
#: sabnzbd/skintext.py
msgid "page"
msgstr "pagină"
+60 -112
View File
@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Russian (https://app.transifex.com/sabnzbd/teams/111101/ru/)\n"
@@ -246,6 +246,16 @@ msgstr "Для сервера требуется имя пользователя
msgid "Connection Successful!"
msgstr "Подключение установлено!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Ошибка проверки подлинности. Проверьте имя и пароль."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Слишком много подключений. Приостановите загрузку или повторите попытку "
"позже"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -269,12 +279,12 @@ msgid "Default"
msgstr "по умолчанию"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "На диске нет места Принудительная приостановка"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Ошибка диска при создании файла %s"
@@ -556,9 +566,19 @@ msgid "Fatal error in Downloader"
msgstr ""
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr ""
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Ошибка входа на сервер %s [%s]"
#. Error message
#: sabnzbd/downloader.py
msgid "Connecting %s@%s failed, message=%s"
@@ -737,20 +757,11 @@ msgid ""
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Неправильный ключ API. Используйте в сторонней программе ключ API из раздела"
" «Настройка -> Общие»:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
#: sabnzbd/interface.py
@@ -762,17 +773,21 @@ msgstr ""
"«Настройка -> Общие»:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Неправильный ключ API. Используйте в сторонней программе ключ API из раздела"
" «Настройка -> Общие»:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Ошибка проверки подлинности. Проверьте имя и пароль."
msgid "User logged in to the web interface"
msgstr ""
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Warning message
#: sabnzbd/interface.py
@@ -833,6 +848,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ОШИБКА"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Назад"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -990,23 +1013,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1298,11 +1304,6 @@ msgstr ""
msgid "Queue finished"
msgstr ""
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1548,23 +1549,6 @@ msgstr ""
"Если снова появляется это сообщение об ошибке, попробуйте указать другой "
"номер порта."
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1651,16 +1635,19 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Не удаётся запустить браузер. Возможно, он не было найден"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Доступ запрещён"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Ошибка %s: укажите действительное имя пользователя и пароль."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1912,26 +1899,6 @@ msgstr "Расписание для несуществующего сервер
msgid "Trying to set status of non-existing server %s"
msgstr "Попытка установить статус для несуществующего сервера %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2247,10 +2214,6 @@ msgstr "Адрес"
msgid "Cancel"
msgstr ""
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr ""
@@ -2830,6 +2793,10 @@ msgstr "Порт, по которому будет доступна служба
msgid "Web Interface Theme"
msgstr ""
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "Имя пользователя SABnzbd"
@@ -3636,8 +3603,8 @@ msgid "Naming"
msgstr "Именование"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Объем, который можно загрузить в месяц (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4606,13 +4573,6 @@ msgstr ""
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Пакетные операции"
@@ -4657,10 +4617,6 @@ msgstr ""
msgid "WARNING:"
msgstr "ПРЕДУПРЕЖДЕНИЕ"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ОШИБКА"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Загрузить"
@@ -4697,14 +4653,6 @@ msgstr ""
msgid "Extra history columns"
msgstr ""
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Ход выполнения"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Действия"
#: sabnzbd/skintext.py
msgid "page"
msgstr "стр."
+57 -111
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Serbian (https://app.transifex.com/sabnzbd/teams/111101/sr/)\n"
@@ -244,6 +244,14 @@ msgstr "Серверу су потребни име и лозинка."
msgid "Connection Successful!"
msgstr "Успешно привезивање!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Аутентификација погрешна, проверити име/лозинку."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr "Превише конекција, паузирајте преузимање или поновите касније"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -267,12 +275,12 @@ msgid "Default"
msgstr "Подразумевано"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disk je pun! Tera Pause"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Greška na disku prilikom kreiranja datoteke %s"
@@ -555,9 +563,19 @@ msgid "Fatal error in Downloader"
msgstr ""
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "Previše konekcija ka serveru %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Неуспешно пријављивање на сервер %s [%s]"
#. Error message
#: sabnzbd/downloader.py
msgid "Connecting %s@%s failed, message=%s"
@@ -736,19 +754,11 @@ msgid ""
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API кључ је погрешан, унети у спољни програм API кључ из Подешавања->Опште:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
#: sabnzbd/interface.py
@@ -759,17 +769,20 @@ msgstr ""
"API кључ недостаје, унети у спољни програм API кључ из Подешавање->Опште:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API кључ је погрешан, унети у спољни програм API кључ из Подешавања->Опште:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Аутентификација погрешна, проверити име/лозинку."
msgid "User logged in to the web interface"
msgstr ""
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Warning message
#: sabnzbd/interface.py
@@ -830,6 +843,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ГРЕШКА:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Назад"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -987,23 +1008,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1294,11 +1298,6 @@ msgstr "Неуспешан рад"
msgid "Queue finished"
msgstr "Ред завршен"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1542,23 +1541,6 @@ msgid ""
"If you get this error message again, please try a different number.<br>"
msgstr "Ако опет имате ову грешку, покушајте други број.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1645,16 +1627,19 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Немогуће је покренути претраживач, вероватно није нађен"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Приступ одбијен"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Грешка %s: Требате да унесете важеће име/лозинку."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1906,26 +1891,6 @@ msgstr "Планификација за непостојећи сервер %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Покушај постављања статуса за непостојећи сервер %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2241,10 +2206,6 @@ msgstr "Хост"
msgid "Cancel"
msgstr "Откажи"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr ""
@@ -2822,6 +2783,10 @@ msgstr "Порт на који SABnzbd чека везе."
msgid "Web Interface Theme"
msgstr ""
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "Корисничко име SABnzbd-а"
@@ -3620,8 +3585,8 @@ msgid "Naming"
msgstr "Именовање"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Колико може да се преузме овог месеца (К/М/Г)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4583,13 +4548,6 @@ msgstr "Привремено"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Мулти-операције"
@@ -4635,10 +4593,6 @@ msgstr ""
msgid "WARNING:"
msgstr "ПАЖЊА:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ГРЕШКА:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Преузми"
@@ -4675,14 +4629,6 @@ msgstr ""
msgid "Extra history columns"
msgstr ""
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Напредак"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Акције"
#: sabnzbd/skintext.py
msgid "page"
msgstr "страни"
+58 -112
View File
@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Swedish (https://app.transifex.com/sabnzbd/teams/111101/sv/)\n"
@@ -244,6 +244,14 @@ msgstr "Servern kräver användarnamn och lösenord."
msgid "Connection Successful!"
msgstr "Anslutning lyckades!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Autentisering misslyckades, kontrollera användarnamn och lösenord."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr "För många anslutningar, pausa en nedladdning eller försök igen senare"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -267,12 +275,12 @@ msgid "Default"
msgstr "Standard"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disken är full! Pausar..."
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "Diskfel vid skapande av fil %s"
@@ -555,9 +563,19 @@ msgid "Fatal error in Downloader"
msgstr ""
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgid "Too many connections to server %s [%s]"
msgstr "För många anslutningar till servern %s [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "Det gick inte att logga in på server %s [%s]"
#. Error message
#: sabnzbd/downloader.py
msgid "Connecting %s@%s failed, message=%s"
@@ -736,20 +754,11 @@ msgid ""
msgstr ""
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgid "Refused connection from:"
msgstr ""
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API-nyckel felaktig, använd api-nyckeln från Konfiguration-> Allmänt i ditt "
"tredjepartsprogram:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgid "Refused connection with hostname \"%s\" from:"
msgstr ""
#: sabnzbd/interface.py
@@ -761,17 +770,21 @@ msgstr ""
"tredjepartsprogram:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API-nyckel felaktig, använd api-nyckeln från Konfiguration-> Allmänt i ditt "
"tredjepartsprogram:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "Autentisering misslyckades, kontrollera användarnamn och lösenord."
msgid "User logged in to the web interface"
msgstr ""
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Warning message
#: sabnzbd/interface.py
@@ -832,6 +845,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEL:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Bakåt"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -989,23 +1010,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1298,11 +1302,6 @@ msgstr "Jobb misslyckades"
msgid "Queue finished"
msgstr "Kön färdig"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr ""
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1548,23 +1547,6 @@ msgstr ""
"Om du får detta felmeddelande igen, var vänlig försök med en annan "
"siffra.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1651,16 +1633,19 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Kan inte starta webbläsaren, hittades troligtvis inte"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Åtkomst nekades"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Error %s: Du måste ange ett giltigt användarnamn och lösenord."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1912,26 +1897,6 @@ msgstr "Schema för icke existerande server %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Försöker att sätta status på icke existerande server %s"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2247,10 +2212,6 @@ msgstr "Adress"
msgid "Cancel"
msgstr "Avbryt"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr ""
@@ -2830,6 +2791,10 @@ msgstr "Port som SABnzbd ska lyssna på."
msgid "Web Interface Theme"
msgstr ""
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr ""
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "SABnzbd Användarnamn"
@@ -3632,8 +3597,8 @@ msgid "Naming"
msgstr "Döpning"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Hur mycket kan laddas ner denna månad (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4596,13 +4561,6 @@ msgstr "Temporär Mapp"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Multi-operationer"
@@ -4647,10 +4605,6 @@ msgstr "Om SABnzbd startar om kommer denna skärm att försvinna automatiskt!"
msgid "WARNING:"
msgstr "VARNING:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEL:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Hämta"
@@ -4687,14 +4641,6 @@ msgstr ""
msgid "Extra history columns"
msgstr ""
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "Förlopp"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Åtgärder"
#: sabnzbd/skintext.py
msgid "page"
msgstr "sida"
+66 -129
View File
@@ -8,7 +8,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: mauron, 2026\n"
"Language-Team: Turkish (https://app.transifex.com/sabnzbd/teams/111101/tr/)\n"
@@ -268,6 +268,17 @@ msgstr "Sunucu kullanıcı ismi ve parola gerektiriyor."
msgid "Connection Successful!"
msgstr "Bağlantı Başarılı!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr ""
"Kimlik doğrulaması başarısız oldu, kullanıcı ismi/parola kontrolü yapın."
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr ""
"Çok fazla bağlantı, lütfen indirmeyi duraklatın veya daha sonra tekrar "
"deneyin"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -295,12 +306,12 @@ msgid "Default"
msgstr "Varsayılan"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "Disk dolu! Duraklatma Zorlanıyor"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "%s dosyasının oluşturulmasında disk hatası"
@@ -603,8 +614,20 @@ msgid "Fatal error in Downloader"
msgstr "İndirici'de ölümcül hata"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgstr "%s sunucusu şunu bildirdi: %s"
msgid "Too many connections to server %s [%s]"
msgstr "%s [%s] sunucusuna çok fazla bağlantı"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr ""
"%s [%s] sunucusuna çok fazla farklı IP adreslerinden oturum açılışı yapıldı "
"- https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "%s [%s] sunucusunda oturum açılışı başarısız oldu"
#. Error message
#: sabnzbd/downloader.py
@@ -791,22 +814,13 @@ msgstr ""
"https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Şuradan \"%s\" makine ismi ile bağlantı reddedildi:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"API anahtarı yanlış, 3. taraf programınızda Yapılandırma->Genel'den api "
"anahtarını kullanın:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "Şuradan bağlantı reddedildi:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "Şuradan \"%s\" makine ismi ile bağlantı reddedildi:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -816,19 +830,21 @@ msgstr ""
"programınıza girin:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr "Çok fazla oturum açma teşebbüssü, daha sonra tekrar deneyin."
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr ""
"Oturum açma teşebbüsü reddedildi, %s unsurundan çok fazla başarısız girişim."
"API anahtarı yanlış, 3. taraf programınızda Yapılandırma->Genel'den api "
"anahtarını kullanın:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr ""
"Kimlik doğrulaması başarısız oldu, kullanıcı ismi/parola kontrolü yapın."
msgid "User logged in to the web interface"
msgstr "Kullanıcı web arayüzünde oturum açtı"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "Kullanıcı oturum açtı"
#. Warning message
#: sabnzbd/interface.py
@@ -889,6 +905,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr "Kategori dizini Geçici İndirme Dizini'nin bir alt dizini olamaz."
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "HATA:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "Geri"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -1052,23 +1076,6 @@ msgstr ""
msgid "Failed to read the password file %s"
msgstr "%s parola dosyasının okunması başarısız oldu"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1367,11 +1374,6 @@ msgstr "İş başarısız oldu"
msgid "Queue finished"
msgstr "Kuyruk bitti"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "Kullanıcı oturum açtı"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1615,30 +1617,6 @@ msgid ""
"If you get this error message again, please try a different number.<br>"
msgstr "Bu hata mesajını tekrar alırsanız, lütfen başka bir sayı deneyin.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
"\n"
"SABnzbd'nin %s bağlantı noktasını %s üzerinde kullanma izni yoktur. <br>\n"
"Düşük bağlantı noktaları, sistemlerin çoğunluğunda imtiyazlı süreçler için ayrılmıştır, yani bağlantı noktası mevcuttur ama talep edilemezler.<br>\n"
"<br>\n"
"Ya SABnzbd'yi bu bağlantı noktası için ihtiyaç duyulan izinlerle çalıştırın ya da onu 1024 veya daha yüksek bir bağlantı noktası sayısı ile tekrar başlatın."
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
"Düşük bağlantı noktasını kullanmaya devam etmek için bunun yerine "
"SABnzbd'nin önüne ters bir vekil sunucu koyun.<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1727,18 +1705,19 @@ msgstr ""
"%s bağlantı noktasına %s üzerinde bağlanılamıyor. Başka bir yazılım bağlantı"
" noktasını kullanıyor veya SABnzbd zaten çalışıyor."
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
"%s bağlantı noktasına %s üzerinde bağlanma izni yoktur. Düşük bağlantı "
"noktaları yüksek izinler gerektirir."
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "Tarayıcı başlatılamıyor, muhtemelen bulunamadı"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "Erişim reddedildi"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "Hata %s: geçerli bir kullanıcı ismi ve parola sağlamanız gerekiyor."
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1992,26 +1971,6 @@ msgstr "Mevcut olmayan %s sunucu için zamanlama"
msgid "Trying to set status of non-existing server %s"
msgstr "Mevcut olmayan %s sunucu için durum ayarlanmaya çalışılıyor"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2327,10 +2286,6 @@ msgstr "Makine"
msgid "Cancel"
msgstr "İptal"
#: sabnzbd/skintext.py
msgid "Close"
msgstr "Kapat"
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "Oturum aç"
@@ -2921,6 +2876,10 @@ msgstr "SABnzbd'nin dinleyeceği bağlantı noktası (port)."
msgid "Web Interface Theme"
msgstr "Web Arayüz Teması"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "Bir tema seçin."
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "SABnzbd Kullanıcı ismi"
@@ -3779,8 +3738,8 @@ msgid "Naming"
msgstr "İsimlendirme"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr "Bu kota süresinde ne kadar indirme yapılabileceği (K/M/G)"
msgid "How much can be downloaded this month (K/M/G)"
msgstr "Bu ay ne kadar indirme yapılabileceği (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4792,16 +4751,6 @@ msgstr "Geçici Dizin"
msgid "Clear search"
msgstr "Aramayı temizle"
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
"İsimle arama yapın veya <code>kat:</code>, <code>durum:</code> ve "
"<code>öncelik</code> (Kuyruk) süzgeçleriyle aramayı daraltın. Mesela: "
"<code>benim programım kat:tv</code>"
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "Çoklu-İşlemler"
@@ -4848,10 +4797,6 @@ msgstr ""
msgid "WARNING:"
msgstr "İKAZ:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "HATA:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "Al"
@@ -4888,14 +4833,6 @@ msgstr "Ek kuyruk sütunları"
msgid "Extra history columns"
msgstr "Ek tarihçe sütunları"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "İlerleme"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "Eylemler"
#: sabnzbd/skintext.py
msgid "page"
msgstr "sayfa"
+60 -114
View File
@@ -8,7 +8,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: 2020-06-27 15:49+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>, 2026\n"
"Language-Team: Chinese (China) (https://app.transifex.com/sabnzbd/teams/111101/zh_CN/)\n"
@@ -245,6 +245,14 @@ msgstr "服务器需要用户名与密码。"
msgid "Connection Successful!"
msgstr "连接成功!"
#: sabnzbd/api.py, sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "身份认证失败,请检查用户名/密码。"
#: sabnzbd/api.py
msgid "Too many connections, please pause downloading or try again later"
msgstr "连接数过多,请先暂停下载或稍后再试"
#. Warning message
#: sabnzbd/api.py
msgid ""
@@ -268,12 +276,12 @@ msgid "Default"
msgstr "默认"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk full! Forcing Pause"
msgstr "磁盘已满! 强制暂停"
#. Error message
#: sabnzbd/assembler.py, sabnzbd/decoder.py
#: sabnzbd/assembler.py
msgid "Disk error on creating file %s"
msgstr "创建文件 %s 时磁盘出错"
@@ -555,8 +563,18 @@ msgid "Fatal error in Downloader"
msgstr "下载器出现致命错误"
#: sabnzbd/downloader.py
msgid "Server %s reported: %s"
msgstr ""
msgid "Too many connections to server %s [%s]"
msgstr "服务器 %s 连接数过多 [%s]"
#: sabnzbd/downloader.py
msgid ""
"Login from too many different IP addresses to server %s [%s] - "
"https://sabnzbd.org/multiple-adresses"
msgstr "从太多不同的 IP 地址登录到服务器 %s [%s] - https://sabnzbd.org/multiple-adresses"
#: sabnzbd/downloader.py
msgid "Failed login for server %s [%s]"
msgstr "无法登录服务器 %s [%s]"
#. Error message
#: sabnzbd/downloader.py
@@ -738,20 +756,13 @@ msgstr ""
"不支持稀疏文件。有关详细信息和可能的解决方案,请参阅:https://sabnzbd.org/wiki/advanced/direct-write"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "拒绝来自主机名 \"%s\" 的连接:"
#: sabnzbd/interface.py
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr "API Key 不正确,请在第三方程序中使用“配置”->“常规”中的 api key:"
#. Warning message
#: sabnzbd/interface.py, sabnzbd/security.py
msgid "Refused connection from:"
msgstr "拒绝来自以下的连接:"
#: sabnzbd/interface.py
msgid "Refused connection with hostname \"%s\" from:"
msgstr "拒绝来自主机名 \"%s\" 的连接:"
#: sabnzbd/interface.py
msgid ""
"API Key missing, please enter the api key from Config->General into your 3rd"
@@ -759,17 +770,19 @@ msgid ""
msgstr "缺 API Key,请将“配置”->“常规”中的 api key 输入到第三方程序中:"
#: sabnzbd/interface.py
msgid "Too many failed login attempts, try again later."
msgstr ""
#. Warning message
#: sabnzbd/interface.py
msgid "Login attempt refused, too many failures from %s"
msgstr ""
msgid ""
"API Key incorrect, Use the api key from Config->General in your 3rd party "
"program:"
msgstr "API Key 不正确,请在第三方程序中使用“配置”->“常规”中的 api key:"
#: sabnzbd/interface.py
msgid "Authentication failed, check username/password."
msgstr "身份认证失败,请检查用户名/密码。"
msgid "User logged in to the web interface"
msgstr "用户已在 web 界面登录"
#. Notification
#: sabnzbd/interface.py, sabnzbd/notifier.py
msgid "User logged in"
msgstr "用户已登录"
#. Warning message
#: sabnzbd/interface.py
@@ -830,6 +843,14 @@ msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr "类别文件夹不能是临时下载文件夹的子文件夹。"
#: sabnzbd/interface.py, sabnzbd/skintext.py
msgid "ERROR:"
msgstr "错误:"
#: sabnzbd/interface.py
msgid "Back"
msgstr "返回"
#. Warning message
#: sabnzbd/internetspeed.py
msgid ""
@@ -987,23 +1008,6 @@ msgstr "您的密码文件包含超过 30 个密码,测试所有这些密码
msgid "Failed to read the password file %s"
msgstr "读取密码文件 %s 失败"
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid entry in local_ranges: %s"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid ""
"%s in local_ranges is not a private network, list it in xff_trusted_hosts to"
" trust it"
msgstr ""
#. Warning message
#: sabnzbd/misc.py
msgid "Ignoring invalid network in the forwarded-header trust list: %s"
msgstr ""
#. Error message
#: sabnzbd/misc.py
msgid "[%s] The command in build_command is undefined."
@@ -1292,11 +1296,6 @@ msgstr "任务失败"
msgid "Queue finished"
msgstr "队列已完成"
#. Notification
#: sabnzbd/notifier.py
msgid "User logged in"
msgstr "用户已登录"
#. Notification
#: sabnzbd/notifier.py
msgid "Other Messages"
@@ -1540,23 +1539,6 @@ msgid ""
"If you get this error message again, please try a different number.<br>"
msgstr "如果您再次收到本错误信息,请尝试其他数字。<br>"
#: sabnzbd/panic.py
msgid ""
"\n"
" SABnzbd is not allowed to use port %s on %s.<br>\n"
" Low port numbers are reserved for privileged processes on most systems,\n"
" so the port itself is available but cannot be claimed.<br>\n"
" <br>\n"
" Either run SABnzbd with the privileges needed for that port, or restart it\n"
" with a port number of 1024 or higher."
msgstr ""
#: sabnzbd/panic.py
msgid ""
"To keep using the low port, put a reverse proxy in front of SABnzbd "
"instead.<br>"
msgstr ""
#: sabnzbd/panic.py
msgid ""
"\n"
@@ -1643,16 +1625,19 @@ msgid ""
"SABnzbd is already running."
msgstr "绑定端口 %s 在 %s 上失败。其它的程序正在使用此端口或者说 SABnzbd 正在运行。"
#: sabnzbd/panic.py
msgid ""
"Not allowed to bind to port %s on %s. Low ports need elevated privileges."
msgstr ""
#. Warning message
#: sabnzbd/panic.py
msgid "Cannot launch the browser, probably not found"
msgstr "无法启动浏览器,可能未找到"
#: sabnzbd/panic.py
msgid "Access denied"
msgstr "访问被拒绝"
#: sabnzbd/panic.py
msgid "Error %s: You need to provide a valid username and password."
msgstr "错误 %s: 您需要提供有效的用户名与密码。"
#. Warning message
#: sabnzbd/postproc.py
msgid "Old queue detected, use Status->Repair to convert the queue"
@@ -1904,26 +1889,6 @@ msgstr "定时任务的服务器不存在 %s"
msgid "Trying to set status of non-existing server %s"
msgstr "正在尝试设置不存在的服务器 %s 的状态"
#: sabnzbd/security.py
msgid ""
"X-Forwarded-For received while verify_xff_header is off, turn it on and list"
" %s in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For received from %s, which is not in xff_trusted_hosts"
msgstr ""
#: sabnzbd/security.py
msgid "X-Forwarded-For from %s does not name a client address"
msgstr ""
#: sabnzbd/security.py
msgid ""
"Forwarded is not supported, configure the proxy to send X-Forwarded-For "
"instead"
msgstr ""
#. PP phase "filejoin"
#: sabnzbd/skintext.py
msgid "Join files"
@@ -2239,10 +2204,6 @@ msgstr "主机"
msgid "Cancel"
msgstr "取消"
#: sabnzbd/skintext.py
msgid "Close"
msgstr ""
#: sabnzbd/skintext.py
msgid "Log in"
msgstr "登录"
@@ -2814,6 +2775,10 @@ msgstr "SABnzbd 应监听的端口。"
msgid "Web Interface Theme"
msgstr "Web 界面主题"
#: sabnzbd/skintext.py
msgid "Choose a theme."
msgstr "选择一个主题。"
#: sabnzbd/skintext.py
msgid "SABnzbd Username"
msgstr "SABnzbd 用户名"
@@ -3589,8 +3554,8 @@ msgid "Naming"
msgstr "命名"
#: sabnzbd/skintext.py
msgid "How much can be downloaded this Quota period (K/M/G)"
msgstr ""
msgid "How much can be downloaded this month (K/M/G)"
msgstr "本月能下载多少数据量 (K/M/G)"
#. Reset day of the download quota
#: sabnzbd/skintext.py
@@ -4553,13 +4518,6 @@ msgstr "临时文件夹"
msgid "Clear search"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Search by name, or refine with filters <code>cat:</code>, "
"<code>status:</code> and <code>priority:</code> (Queue). For example: "
"<code>my show cat:tv</code>"
msgstr ""
#: sabnzbd/skintext.py
msgid "Multi-Operations"
msgstr "多选操作"
@@ -4604,10 +4562,6 @@ msgstr "SABnzbd 重启后本画面将自动消失!"
msgid "WARNING:"
msgstr "警告:"
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "错误:"
#: sabnzbd/skintext.py
msgid "Fetch"
msgstr "装取"
@@ -4644,14 +4598,6 @@ msgstr "额外的队列列"
msgid "Extra history columns"
msgstr "额外的历史记录列"
#: sabnzbd/skintext.py
msgid "Progress"
msgstr "进度"
#: sabnzbd/skintext.py
msgid "Actions"
msgstr "操作"
#: sabnzbd/skintext.py
msgid "page"
msgstr "页"
+1 -1
View File
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-5.2.0\n"
"Project-Id-Version: SABnzbd-5.1.0\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: team@sabnzbd.org\n"
"Language-Team: SABnzbd <team@sabnzbd.org>\n"
Loaded 100 of 213 files, more files were not shown because too many files have changed in this diff. Show more