Compare commits

...

569 Commits

Author SHA1 Message Date
Safihre
3c87fd45c3 Set version to 2.3.2 2017-12-21 20:41:52 +01:00
Safihre
d0a258ce28 Merge branch 'develop' 2017-12-21 20:38:19 +01:00
Safihre
1cac5799eb Update text files for 2.3.2 2017-12-21 20:19:15 +01:00
Safihre
a56e4f3650 Small reduction of the unused encoding functions 2017-12-20 15:07:50 +01:00
Safihre
9970d2ee6f Remove obsolete UNTRANS function
We now use subprocessww, to pass real unicode to new processes on Windows.
2017-12-20 14:10:39 +01:00
Safihre
f2695e9305 Correctly handle unicode/deunicode in pre-queue script 2017-12-20 14:10:13 +01:00
Safihre
d333f1b56b Deunicode should make string of everything 2017-12-20 14:10:13 +01:00
shypike
00f5b29caa Fix CP850-Latin1 mapping, prevent "f" from being converted to 0x9F 2017-12-20 13:46:32 +01:00
Safihre
16aa43c120 Also extract password from job filename
Closes #1084
2017-12-19 22:27:36 +01:00
Safihre
b2179d5b3e Small patch of Categorie Config highlights 2017-12-14 15:36:43 +01:00
Safihre
8e2e9fd5c9 Remove extra logging for missing article DB errors
Closes #952
2017-12-14 10:36:17 +01:00
Safihre
2e3181779a Correct highlighting in Config for each sub-section 2017-12-14 10:19:52 +01:00
Safihre
8a270e49be Add caller name to logging for purging of job data 2017-12-11 15:15:47 +01:00
Safihre
32e26c804b Correctly update row colors when selecting Advanced Settings 2017-12-10 15:35:25 +01:00
Safihre
5cf87be51e Update README typo 2017-12-10 15:35:11 +01:00
SABnzbd Automation
781c45bf3b Automatic translation update 2017-12-09 15:32:43 +00:00
Safihre
df5a85f851 Correctly update text files for 2.3.2RC2
Typo!
2017-12-09 16:23:49 +01:00
Safihre
8373994be6 Add extra logging when folder wasn't removed in purge 2017-12-09 16:20:36 +01:00
Safihre
437ff427f8 Improvements to Advanced Settings switching in Config 2017-12-09 15:16:38 +01:00
Safihre
ea5e4dfee1 If Download all par2 was enabled jobs would get orphaned
Mistake in fd1975617b
Jobs were incorrectly re-added after QC failure because already downloaded par2 files were "added" as new ones, resulting in orphaned jobs because there were no new files.
2017-12-09 14:18:22 +01:00
SABnzbd Automation
2e45f4028c Automatic translation update 2017-12-08 11:17:18 +00:00
Safihre
d7cdce9278 Update text files for 2.3.2RC2 2017-12-08 11:49:33 +01:00
Safihre
38c329ade2 Hide Advanced Settings
Closes #1082
2017-12-08 10:15:18 +01:00
Safihre
933d0c073c If wizard started with already setup servers, select the right one 2017-12-06 16:10:50 +01:00
Safihre
1f49bba343 Make warning about SABnzbd possibly being exposed more prominent 2017-12-06 15:49:12 +01:00
Safihre
0ac712dce1 Add 'Job Name as Folder Name' as Sorting Preset for de-obfuscation
Also rename internal variable `dirname`, since it's really just the job-name.
2017-12-06 10:57:36 +01:00
Safihre
f1ae9060c3 Remove white space before some warnings
Closes #1081
2017-12-04 10:30:09 +01:00
Safihre
263231bb62 Lower upper-bound for auto-detected Article Cache to 1G
2G is a bit too much and should only happen in extreme cases
2017-12-03 20:36:30 +01:00
SABnzbd Automation
a7b964c153 Automatic translation update 2017-12-03 16:42:42 +00:00
Safihre
78035eed12 Wizard server test with existing server would require re-entering pass 2017-12-03 13:47:42 +01:00
Safihre
0e7ac8ec5e Add new %dn to Pattern Key for Date Sorting
Closes #1080
2017-12-03 10:49:38 +01:00
Safihre
00f262c90e Rename tvsort.py to sorting.py for consistency 2017-12-03 10:44:20 +01:00
Safihre
68df476603 Rename Generic Sorter to Movie Sorter to match interface name 2017-12-03 10:38:48 +01:00
Safihre
5da03f506d Replace ".avi" by ".mkv" in examples for Sorting 2017-12-03 10:34:40 +01:00
Safihre
0c9540e41e Add %dn to DateSorter 2017-12-03 10:29:59 +01:00
Safihre
c6226c6adb Add per-day download-stats to server_stats API-call
Linked #1079
2017-12-01 19:03:52 +01:00
Safihre
b8aab5c0f8 Lower bound for auto-detected article cache set to 32M again
For systems with 256MB or 512MB memory the auto-detected values are valid (e.g. 64MB and 128MB) and would otherwise be discarded.
2017-12-01 00:22:51 +01:00
Safihre
e29e7a65b5 Limit auto-detected article cache to 2GB
Users can set more if they want, or if they are on 32bit system it will be limited automatically to 1GB.
2017-11-30 23:59:44 +01:00
Safihre
eb46ed80b6 Also use 1/4th of memory on macOS for Article Cache 2017-11-30 23:45:32 +01:00
Safihre
50b2d558eb Also use 1/4th of memory on Windows for Article Cache 2017-11-30 23:45:20 +01:00
Fish2
3b4b3dcca2 Add moment.js Language he.js - Hebrew 2017-11-27 20:54:16 +01:00
Fish2
e0f8410918 Remove Unused Language Files 2017-11-27 20:54:16 +01:00
Fish2
581942ca11 Update bootstrap3-typeahead.js to V4.0.2, Update jQuery Form Plugin To 4.2.2, Update jquery-qrcode To v0.14.0 2017-11-27 20:54:16 +01:00
Fish2
005fd399d0 Update Glitter moment.js to 2.19.2 2017-11-27 20:54:16 +01:00
Fish2
6ff00bc992 Update Six to 1.11.0 2017-11-27 20:54:16 +01:00
Safihre
ca66eb04ad Note restoring of OSX 10.11.6 compatibility for 2.3.2RC1
Closes #1075
2017-11-26 11:07:24 +01:00
Safihre
91a2532c95 Show warning in wizard when language files are not present
Closes #1074
2017-11-25 10:51:31 +01:00
SABnzbd Automation
cb49f7bb53 Automatic translation update 2017-11-23 17:12:04 +00:00
Safihre
0049f14d7f Update text files for 2.3.2RC1 2017-11-23 17:31:22 +01:00
Safihre
e414874910 Only report missing UnZip when missing 7Zip 2017-11-23 13:39:04 +01:00
Safihre
5931beaa5c Quote all arguments to external processes on Windows 2017-11-23 13:36:47 +01:00
Safihre
b3d80b7c65 Remove unzip from Windows distribution 2017-11-20 20:24:01 +01:00
shypike
9aa90083b2 When available, use 7zip instead of built-in unzip.
7zip supports passwords, many old platform unzips do not.
2017-11-20 20:24:01 +01:00
Safihre
0b939a9519 Notification category Default only means "all categories" if non other 2017-11-20 20:08:32 +01:00
Safihre
501867137a Reset also article try-list on dropped server connections
Test release for these users showed that "server dropped connection" also needed a reset of the article trylist.
Linked:
https://forums.sabnzbd.org/viewtopic.php?f=2&t=23111
https://forums.sabnzbd.org/viewtopic.php?f=2&t=23109
2017-11-20 12:06:56 +01:00
Safihre
75d4b5deca Add tooltip to server graph month selector 2017-11-19 15:02:17 +01:00
Safihre
442591f20c Link server graphs (month and scale) and show monthly total
Closes #1028
2017-11-19 14:58:43 +01:00
Safihre
74b7f383db Always show 1 decimal for MB and above
So it is similar to the JS filesize function
2017-11-19 14:55:46 +01:00
Safihre
b966707247 Implement fast and slow queue in postprocessor
So I implemented this in a kind of cheeky easy way: 
There is a fast and a slow queue in the `PostProcessor`, if we see it has completed Direct Unpack or if it is still active (might be unpacking that last volume) it is put in the fast queue.
We always check the fast queue first, then the slow one. To not have slow jobs be stuck in the post-proc queue forever, every 3 fast jobs we force a slow job (if present).
Closes #1014
2017-11-18 19:00:52 +01:00
Safihre
eada7286d1 Small optimization in registering of article for first articles 2017-11-18 16:31:47 +01:00
Safihre
b9c312961b listdir can fail on Windows for C: instead of C:\ and crashing postproc 2017-11-18 09:55:56 +01:00
Safihre
8389b4fedb Re-evaluate filenames after first par2 file is finished
Just in case it came in after all first articles were downloaded.
2017-11-18 00:57:15 +01:00
Safihre
7720cd60ec Decode first articles of each file first to find filenames
Get first article of each file first, so that we can use the par2 information to get the filename. This way on obfuscated posts we can faster start Direct Unpack.
In a bit convoluted way so that we can also stay performance tuned.
Closes #1044
2017-11-18 00:45:40 +01:00
Safihre
d1d437074a Do not flush article cache to disk on pause
Overly cautious
2017-11-18 00:13:50 +01:00
Safihre
30d3d62e09 Correct MultiPar Extra Par2 Option passing 2017-11-17 22:29:15 +01:00
Safihre
fd1975617b Simplify and comment code on par2 errors
Closes #1070 (read for details)
2017-11-17 22:24:55 +01:00
SABnzbd Automation
1d037dcb62 Automatic translation update 2017-11-16 22:12:35 +00:00
Safihre
bd5fb3e88f Remove unused crash_msg postproc code 2017-11-16 22:21:39 +01:00
Safihre
5ca66bfeef Only require SABYenc to match minor version and bump to 3.3.2 2017-11-16 20:27:32 +01:00
Safihre
c9fbadd097 Improve progressbar on new Firefox 2017-11-15 15:33:44 +02:00
Safihre
f4568ad7dd Do not warn about disk-errors when job is deleted/done
Only happens in really fast situations with many server connections for small downloads completed within 1 or 2 seconds.
2017-11-15 13:02:01 +02:00
Safihre
74a395f584 Increase wait-time in URLGrabber and stop after 10 tries
Closes #1069
2017-11-13 18:10:18 +02:00
Safihre
dd703ace7f Fully parse output of Pre-Q script correctly
PP/Priority are different, since 0 is also a valid value for these settings.
2017-11-12 14:19:10 +02:00
Safihre
ddc8396260 Empty values in Pre-Q script should not just be ignored 2017-11-12 13:07:41 +02:00
Safihre
e6724e347c Do not 'fix' sending of priority and pp-setting, removes the 0 setting
Priority Normal and PP-setting Download have a value of 0, so they were not send to the pre-Q script.
2017-11-11 17:26:14 +02:00
Safihre
7fa0508ae8 Show tooltip to explain 'Show Logging' anonymized the data 2017-11-11 17:03:53 +02:00
Safihre
06c6f7d38e Auto-history-purge on start-up
Closes #1065
2017-11-11 16:46:11 +02:00
Safihre
59ef400fec Log history-status of failure during repair
For easier debugging
2017-11-11 16:40:04 +02:00
Safihre
0acdf15755 Always show user-entered password in History-info
People like to have this info, some users want to only unpack later etc.
2017-11-11 16:31:38 +02:00
SABnzbd Automation
40128f59dd Automatic translation update 2017-11-07 13:33:01 +00:00
Safihre
286914f253 Correctly report when repair is performed, but fails
Strange, but it can happen. There has been an uptick in this kind of failing downloads. Seems to be a problem with the original par2-files, but not sure yet what it is.
 https://forums.sabnzbd.org/viewtopic.php?f=2&t=23048&p=114059
2017-11-06 13:02:23 +01:00
Fish2
f9bd58bb74 lossless compression of images 2017-11-04 11:47:21 +01:00
Safihre
30cfb9c6fc Prevent potential pause/unpause loop after tray click 2017-10-27 23:39:01 +02:00
Safihre
5ca4811689 Set version to 2.3.1 and resolve merge conflicts 2017-10-27 10:12:36 +02:00
Safihre
043e5966ff Merge branch 'develop' 2017-10-27 10:07:42 +02:00
Safihre
f1695ec875 Set Windows tray double click timeout to user double-click timeout 2017-10-26 20:30:49 +02:00
Safihre
a3db910a4d Update text files for 2.3.1 Final 2017-10-26 20:15:21 +02:00
Safihre
80a29c50c9 In the binaries (macOS/Windows) getmodule does not work
Because the files are compiled, they loose this info it seems.
2017-10-26 14:23:58 +02:00
SABnzbd Automation
d693e20e1a Automatic translation update 2017-10-26 11:23:00 +00:00
SABnzbd Automation
1a36f548df Automatic translation update 2017-10-25 23:23:37 +00:00
Safihre
a6f6d88ab9 Move get_from_url to sabnzbd.misc 2017-10-25 23:00:32 +02:00
Safihre
aa7fb17b4e Reduce standard timeout of new servers to 60 seconds
In line with other usenet software.
2017-10-25 22:08:14 +02:00
Safihre
a99d333272 Fix racing-condition for files coming in after post-proc is started
Files could still come in after post-proc is already started. Post-proc could even have already deleted the job folder, resulting in Assembler errors for these new files. So when post-proc is active, it is safe to ignore write-errors.
Linked topic: https://forums.sabnzbd.org/viewtopic.php?f=3&t=23049
2017-10-25 11:21:59 +02:00
Safihre
801aadecfc Add logging to stop_idle_jobs 2017-10-24 10:46:18 +02:00
Safihre
124e2b253c Do not crash when unrar gets stopped or killed in Direct Unpacker 2017-10-24 10:32:17 +02:00
Safihre
39cceed580 NZF completed is a property method, not an attribute 2017-10-24 10:07:45 +02:00
Safihre
bfcf56ec45 Log traceback on assembler disk error 2017-10-23 21:58:24 +02:00
Safihre
01603b24f5 Do not log decoding of articles by default to reduce logging density
The Debug logs were getting way too confusing with all the "Decoding X" in there, when 99% of the time it is of no importance.
2017-10-23 20:42:17 +02:00
Safihre
d93d2591b7 Do not pause after sending notifications 2017-10-23 11:33:11 +02:00
Safihre
c17fcec499 Correctly handle single and double clicks on Windows tray-icon
On Windows, double click is actually 1 single click followed by a double-click event, no way to differentiate that first click-event of a double-click from an actual just single-click. So we need a timed callback to cancel when we do get the double-click event. Luckily the win32api provides this function.
2017-10-23 11:11:39 +02:00
Safihre
6804ac20da Remove unused is_utf8 function 2017-10-23 11:09:55 +02:00
Safihre
4ed7ac3dea Do not crash when directory creation fails in Direct Unpack 2017-10-22 13:23:57 +02:00
Safihre
eae8056366 Remove old par2cmdline/par2tbb options for MultiPar 2017-10-22 12:58:07 +02:00
Safihre
df4680b6d0 Simply function-caller detection for performance
Much much faster.
#1059
2017-10-22 11:46:41 +02:00
Safihre
b8f5861044 Add new translatable text 2017-10-22 11:24:46 +02:00
Safihre
8e01ceca7a Show current output of running script in History
For long-running scripts.
2017-10-21 14:31:22 +02:00
Safihre
0e1cdec78f Log actual filename and ID of new files 2017-10-21 14:07:06 +02:00
Safihre
13e5e93953 Tweak display of Direct Unpack and Fetching jobs 2017-10-20 21:56:26 +02:00
Safihre
02d08f38eb Correct handeling of jobs fetching extra blocks
Always need to set status to Fetching when getting more blocks and not show the priority selector in Glitter to prevent it from updating the priority. 
@OneCDOnly
2017-10-20 21:03:58 +02:00
Safihre
770951bfe6 Update text files for 2.3.1RC2 2017-10-20 10:59:21 +02:00
Safihre
022898bf63 ENV fields of 0 should be listed as 0 and not empty
So first convert to string, then de-unicode.
2017-10-20 10:58:48 +02:00
Safihre
4fd2d8505b Reset last_volume_linebuf for multi-sets in Direct Unpacker
And log in case of duplicate lines in Unrar output
2017-10-19 22:32:11 +02:00
Safihre
cc72bb743a Use C for [C]ontinue in Direct Unpack 2017-10-19 17:24:06 +02:00
Safihre
d7869fc3a1 Make Direct Unpack icon always visible
Add also the info to the hover, to somehow still explain the icon. Having this info always visible is more important than being able to hover over it directly.
Closes #1013
2017-10-19 15:07:47 +02:00
Sander Jo
4fbf870028 Example Post-Processing Script, written in Python. 2017-10-16 10:21:08 +02:00
Safihre
306558b52f Tracing of function caller only on Debug level logging
And add caller-name to NzbQueue-remove
2017-10-15 16:26:04 +02:00
Safihre
db19875f5d Add caller name to more logging 2017-10-15 10:46:44 +02:00
Safihre
f8061dc9c8 Log caller of history delete and pickle loading/saving
#1054
2017-10-15 10:30:38 +02:00
Safihre
c73591eb20 Allow up to 4GB Article Cache on 64bit systems 2017-10-15 09:58:51 +02:00
Safihre
ec132374a6 Resolve locking situation by only using 1 lock 2017-10-14 15:06:45 +02:00
Safihre
262964c6c2 Add path to gzipped NZB to script environment variables 2017-10-14 10:42:15 +02:00
OneCDOnly
cdaad3ed90 Correct spelling of 'separate' in a few contexts 2017-10-14 09:51:25 +02:00
SABnzbd Automation
84f54f5c57 Automatic translation update 2017-10-13 14:36:36 +00:00
Safihre
00436dfb2c Update text files for 2.3.1RC1 2017-10-13 16:07:21 +02:00
Safihre
c3ce87bd10 TRANS/UNTRANS fails when input is None 2017-10-13 14:03:55 +02:00
Safihre
c3a48a61b6 Correctly fix deadlock of NZBQUEUE_LOCK and DOWNLOADER_CV 2017-10-13 14:03:49 +02:00
Safihre
0c03476d76 Always send failure_url, like we say in the documentation 2017-10-12 16:23:26 +02:00
Safihre
6148cd5445 NZBQUEUE_LOCK in DirScanner causes lock-up when changing prio during add 2017-10-12 15:39:44 +02:00
Safihre
7f72e2042c Add 'Accept' to 'From Show SxxEyy' 2017-10-12 15:28:06 +02:00
Safihre
638b29819c 'From Show SxxEyy' is an Accept filter
Oops.........
2017-10-11 22:23:25 +02:00
Safihre
b950820099 Testing notification email and limiting to certain categories was broken 2017-10-11 13:27:01 +02:00
Safihre
96adf76ef1 Show NZF-ID in warning to find where files got deleted
Linked: #1034 and #952
2017-10-11 11:59:53 +02:00
Safihre
556a4db186 Log all file and folder removal
Linked: #1034 and #973
2017-10-11 11:55:53 +02:00
Safihre
b9fbd19064 Prevent downloader crash when performing slowdown check 2017-10-11 10:13:30 +02:00
Safihre
167e7f2870 Do not warn too much when renames can't be saved
Probably happens after the sucessfull finishing of the job anyway.
2017-10-10 16:25:19 +02:00
Safihre
4dba5b8caa Make sure that Category folders are not a sub-folder of Incomplete
We only check during adding or updating of categories, but that's already better than before.
Example: #1047
2017-10-09 23:11:11 +02:00
SABnzbd Automation
831b64daa8 Automatic translation update 2017-10-09 21:04:38 +00:00
Safihre
38fd5cde29 Unicode needs to be de-unicoded on all platforms 2017-10-09 22:34:47 +02:00
Safihre
e39456cca1 Filter out any unicode in ENV variables 2017-10-09 22:21:19 +02:00
andofrjando
8e9425855b Much nicer icon and colour 2017-10-08 11:39:37 +02:00
andofrjando
89add6edac New feature: Safari pinned tab icon 2017-10-08 11:39:37 +02:00
SABnzbd Automation
16b85429ae Automatic translation update 2017-10-06 09:14:40 +00:00
Safihre
2482c8e70a Update text files for 2.3.1Beta1 2017-10-06 10:58:23 +02:00
Safihre
ad2bb6c3a7 Also remove trailing .par2 from final folder
Otherwise Deobfuscate.py fails due to bug in par2cmdline that can't handle folders with "par2" in it.
2017-10-06 10:32:53 +02:00
SABnzbd Automation
2c7e725e39 Automatic translation update 2017-10-05 13:29:56 +00:00
Safihre
123f05f164 Use internal list2cmdline to correct path escaping on Windows
More info: #1043
Closes #1043
2017-10-05 14:46:13 +02:00
Safihre
4ade2e0c60 Special Windows-names can break RarFile 2017-10-05 14:29:04 +02:00
Safihre
c908a396df Correct the Deobfuscate script 2017-10-04 19:51:28 +02:00
Safihre
15f2370bca Leave undefined ENV variables empty 2017-10-04 19:51:04 +02:00
Safihre
a5e208eb11 Abort Direct Unpack if stuck for more than 2 minutes
Safety measure
2017-10-04 15:21:22 +02:00
Safihre
d59b3b3679 Also parse extracted files during DirectUnpack 2017-10-04 15:21:22 +02:00
Safihre
476542463a Start-up check for subprocessww 2017-10-04 15:21:21 +02:00
Safihre
52267a9565 Use special patched version of subprocess for Unicode POpen on Windows 2017-10-03 14:31:49 +02:00
SABnzbd Automation
972e708810 Automatic translation update 2017-10-02 20:48:06 +00:00
walgarch
a636f7f18e Added 'with' to list of lowercase words in titles 2017-10-02 14:02:47 +02:00
Safihre
9d5b3e9621 When re-adding set status to Downloading so time left is calculated
@OneCDOnly
2017-09-30 22:54:20 +02:00
SABnzbd Automation
9e2d8e5e55 Automatic translation update 2017-09-30 19:32:39 +00:00
Safihre
d9899cc5cd Increase delay to 2 seconds between sub-processes on Windows
1 was not enough, or something else is wrong
2017-09-30 21:18:44 +02:00
Safihre
650e83e1b8 Datetimes in history/warnings were displayed in UTC and not local time 2017-09-30 17:55:22 +02:00
Safihre
4296e1628b Add NZBQUEUE_LOCK to importing of NZBs
So that nothing can happen between uploading/adding and when they are actually in the Queue. Before this it would show the job as "orphaned" while it was being added.
2017-09-28 17:17:16 +02:00
Safihre
5dddc7ab61 Re-introduce NZBQUEUE_LOCK
There seems to be no performance impact.

Linked #1034 and #952 

Reverts partially 02ebb97a8b
2017-09-28 16:52:31 +02:00
Safihre
529ba69584 Do not save to disk when pausing due to import error
Linked #1034
2017-09-28 16:22:49 +02:00
Safihre
9f35568a24 UnRar prints path including folder, even when set to flat-unpack 2017-09-28 11:13:23 +02:00
Safihre
fe40d49c26 Update server-info on every update
https://forums.sabnzbd.org/viewtopic.php?f=3&t=23003
@OneCDOnly
2017-09-28 10:25:14 +02:00
Safihre
6c0b32004a Update RecursivePar2 to be more general deobfuscation
On top of scanning for the "rename.par2", it will also rename the largest file to the job-name. But only if there's 1 large file, otherwise it could get messy. If they want more, they can do it themselves or submit a PR.
2017-09-27 14:32:12 +02:00
Safihre
bda4e102d6 Correctly display Force priority icon in Glitter Night 2017-09-27 10:27:14 +02:00
Safihre
5e03204dbc The From SxxEyy filters need integers, not strings 2017-09-26 11:53:08 +02:00
Safihre
b5deda4195 Revert "Improve display of quota"
This reverts commit 5076892d83.
2017-09-25 21:57:42 +02:00
Safihre
5076892d83 Improve display of quota 2017-09-25 21:17:17 +02:00
Safihre
6c3a3e1694 Update translatable texts 2017-09-25 21:02:32 +02:00
Safihre
edbbcec272 Remove unused imports 2017-09-24 17:45:08 +02:00
Safihre
aced381763 Add example script for users that will handle "rename.par2" after unpack 2017-09-24 11:46:43 +02:00
Safihre
cdd3f9cc8a Add also program information to PostProcessing-ENV vars 2017-09-24 11:46:33 +02:00
Safihre
a2074f06d5 Only run Pre-Queue script section when it is set 2017-09-24 11:02:06 +02:00
Safihre
39aa3a9c51 Fix the priority assigment when uploading file
Thanks @OneCDOnly

https://forums.sabnzbd.org/viewtopic.php?f=3&p=113482#p113482
2017-09-24 11:02:00 +02:00
Safihre
c6cf3cc45d Left-click on Windows-tray now toggles Pause/Resume (did nothing before) 2017-09-22 13:50:41 +02:00
Safihre
0378f6f8b1 Show pop-up on Windows for some start failures like port occupied 2017-09-22 10:50:01 +02:00
Safihre
d6b48803a6 Priority of category was ignored when adding NZB 2017-09-22 09:42:37 +02:00
Safihre
6da23930bf Let browsers do part of the input validation 2017-09-22 09:19:11 +02:00
Safihre
d4e1464cc0 Server priority is maxium 99, not 100
Otherwise the sorting and selecting does not work.
https://forums.sabnzbd.org/viewtopic.php?f=3&p=113467
2017-09-22 09:10:12 +02:00
Safihre
e8dc3ebd51 Bump version to 2.4.0 2017-09-22 09:05:30 +02:00
onno.vos.dev
4009d855c3 Ensure that Pushover works for Emergency prio as well 2017-09-21 21:12:57 +02:00
Safihre
d69796d351 Set version to 2.3.0 and resolve merge conflict 2017-09-21 10:13:56 +02:00
Safihre
a2d5713477 Merge branch 'develop' 2017-09-21 10:10:45 +02:00
Safihre
ba7d906bea Update text files for 2.3.0 2017-09-20 23:16:26 +02:00
Safihre
68f78b0e71 Subprocess on Windows needs at least 1 second timeout globally 2017-09-20 11:50:41 +02:00
Safihre
d5cd0180d8 Update SABYenc to 3.3.1 2017-09-19 17:23:29 +02:00
Safihre
10265bdfb4 Always use save-routine in database.execute so we can catch locked DB
Linked #1034
2017-09-19 09:18:22 +02:00
Safihre
3d0d67bffc Update SABYenc to 3.3.0
Faster!
2017-09-19 08:31:31 +02:00
Safihre
11bd16a653 Accidentally removed HTML-cleaning from error display
Linked #1034
2017-09-19 06:44:29 +02:00
Safihre
248f2da8a6 Pause job in case of failing imports
Linked #1034
2017-09-19 06:19:06 +02:00
Safihre
7b7aaaf467 Widen Confg Servers month selector
Closes #1032
2017-09-16 10:15:20 +02:00
SABnzbd Automation
0030e4dd36 Automatic translation update 2017-09-15 13:51:26 +00:00
Safihre
c3013d67b4 Show NZB name from RSS-feed when fetching
Of course not the name of the RSS-feed itself.
2017-09-15 14:21:45 +02:00
Safihre
ddb7f2a40c Require SABYenc 3.1.1 due to PyPi mixup
Broken source-distribution resulted in heaving to create new release, PyPi does not allow to re-upload files.
2017-09-15 12:59:24 +02:00
Safihre
167a94736e Update text files for 2.3.0RC2 2017-09-15 09:41:12 +02:00
Safihre
8b3e30f0a1 Require SABYenc 3.1.0 and no longer list CRC values
Since SABYenc 3.1.0 doesn't calculate them anymore for speed improvements.
2017-09-15 09:36:24 +02:00
Safihre
c383fa88fb Update ISSUES to match the website and list Synology being special 2017-09-13 20:51:07 +02:00
Safihre
ee72c1e4d5 Correct the testing-releases feedback slider 2017-09-11 22:13:06 +02:00
Safihre
a80bd826d6 Use the NZO password to save in database
build_history_info is called on every interface update to pretend the post-processing job is a history-job. So a password file (if set) would be loaded every second. Thanks @sanderjo!
2017-09-11 20:43:27 +02:00
Safihre
63e6d45bb1 Make sure users are warned that their settings could be unsafe 2017-09-10 21:45:19 +02:00
SABnzbd Automation
61300db1fb Automatic translation update 2017-09-10 18:24:12 +00:00
Safihre
23d005fc36 Update texts and links for 2.3.0 release to come 2017-09-10 20:01:45 +02:00
Safihre
871b351656 Set could potentially be missing from extrapars
Some bad handeling of newsunpack possibly
2017-09-10 19:29:58 +02:00
Safihre
6b53b9934e Waiting for URL would result in 100% CPU usage due to constant looping 2017-09-10 12:45:30 +02:00
Safihre
e038e08a60 Revert "Permanent notice in Plush to upgrade to Glitter"
6fdeab6948
2017-09-09 23:51:23 +02:00
Safihre
8300cb7762 Correct command-line help 2017-09-09 17:31:00 +02:00
Safihre
ec8302717f Warnings API-call now returns a dict like it should 2017-09-09 16:27:55 +02:00
Safihre
6b872b44db MultiPar can report both "PAR File(s) Incomplete" and "Need more blocks" 2017-09-09 16:20:35 +02:00
Safihre
6e48ebccc7 Correctly display time if server and brower are not in same timezone
#989
2017-09-09 13:16:11 +02:00
Safihre
1cd24d1fd0 Locking when iterating over extrapars for queue-stats
But only when we request all the files.
Closes #1029
2017-09-09 10:45:39 +02:00
Safihre
fa6bb79f53 Fix Chrome 61 table border change 2017-09-08 14:51:43 +02:00
Safihre
22e9086e09 Add AppVeyor for Windows testing
#999
2017-09-08 12:07:28 +02:00
Safihre
408b84e02d Basic NZB adding via upload or from disk 2017-09-08 10:28:01 +02:00
Safihre
16ac4dce21 Use requests module for testing 2017-09-08 10:28:01 +02:00
Safihre
5ce1554a46 Hide/Show Details in Config > Servers 2017-09-08 10:27:46 +02:00
Safihre
2d84ed6813 Always have something in RSS jobs storage 2017-09-07 00:26:59 +02:00
Safihre
06dc5b181e Do not leave rss.jobs empty to prevent crash later on
See: https://forums.sabnzbd.org/viewtopic.php?f=11&t=22952
2017-09-06 20:54:21 +02:00
Safihre
37b759fece Only notify upon testing failures 2017-09-06 20:50:27 +02:00
Safihre
3f8430780d Add test requirements 2017-09-06 20:44:47 +02:00
Safihre
9e9bc5f3b0 Very basic testing
Does it start, does it serve pages, does it serve api-requests
2017-09-06 20:44:47 +02:00
Safihre
85204105c2 Check input when setting priority of job
There was no input validation, via the API you could set any value.
2017-09-06 20:25:08 +02:00
SABnzbd Automation
f13339d64d Automatic translation update 2017-09-05 19:53:42 +00:00
Safihre
fa5b44be99 Update text files for 2.3.0Alpha2 2017-09-05 16:36:12 +02:00
Safihre
08bc7c5b9d Use NZO_LOCK to limit possible dir conflicts when adding NZBs
Hopefully resolving problems with possible overlapping directory names and import errors.
2017-09-05 16:07:43 +02:00
Safihre
d9b5dd549a Revert "Only allow 1 NZB to be added at the same time"
Could result in deadlock for some reason.
This reverts commit e64df8ed60.
2017-09-05 16:05:48 +02:00
Safihre
8ec53a3bce Giving up on elegant solutions to prevent stalling, just use a check
This stupid nightmare still wasn't fixed.
The proper solution creates slowdown on many systems because it's not efficient enough. Instead just do a check every 90 seconds if there's stalled stuff.
2017-09-05 16:05:19 +02:00
Safihre
0aac9a5e5c Correct display of download percentage
No need to calculate in javascript, we get it from API
2017-09-05 16:03:58 +02:00
Safihre
11a880d040 MultiPar shows 'PAR File(s) Incomplete' on verification success
When there are Par2-files with very similar filenames in the folder.
2017-09-05 13:21:48 +02:00
Safihre
67b66beb13 Only count really extra files during Multipar 2017-09-04 22:43:59 +02:00
Safihre
1da633442b Correct byte counts when retrying 2017-09-04 22:43:01 +02:00
Safihre
13de40881e Correct display of Forced items 2017-09-04 21:44:00 +02:00
Safihre
1c6419ea65 Revert "Paused status for individual download trumps Force priority"
Oops, I was wrong. This reverts commit d06c11673f.
2017-09-04 20:51:05 +02:00
Safihre
a2adeffc1a Correctly count all bytes and drop 'missing' use 'mbmissing'
Reporting number of missing articles makes 0 sense, it's the MB that matters.
2017-09-04 20:39:15 +02:00
Safihre
71fa3c544a Also shjow scanning of extra files for par2cmdline/tbb 2017-09-04 14:54:41 +02:00
Safihre
b739fb7f07 Do not count overhead-bytes for NZO statistics 2017-09-04 14:18:55 +02:00
Safihre
860728beae Show counter when Multipar is scanning other files in the directory 2017-09-04 13:58:50 +02:00
Safihre
1bdbf1c6a8 Show different icon when priority is Force 2017-09-04 10:59:48 +02:00
Safihre
abbed4cd77 Show missing articles starting at 2% 2017-09-04 10:59:18 +02:00
Safihre
d06c11673f Paused status for individual download trumps Force priority 2017-09-04 10:57:02 +02:00
Safihre
67d67f5ff6 Correct typo in reject_duplicate_files
Closes #1021
2017-09-03 17:07:41 +02:00
Safihre
2386d65b84 Extrapars could be empty if not +Repair set for job 2017-09-03 16:54:07 +02:00
SABnzbd Automation
be638ecca1 Automatic translation update 2017-09-03 08:23:45 +00:00
Safihre
c32bcea3f6 Re-update text files for 2.3.0 Alpha 1 2017-09-03 10:16:08 +02:00
Safihre
bf0aa6569b Need to do comparison to true number of servers
Previous solution was too simple and could still fail.
2017-09-03 10:12:52 +02:00
Safihre
e64df8ed60 Only allow 1 NZB to be added at the same time 2017-09-02 19:18:13 +02:00
Safihre
f7c3a4381d More efficient to compare TryList sizes
Only less is more.
2017-09-02 17:45:32 +02:00
Safihre
55efb34f03 Allow duplicate filenames by default 2017-09-02 15:39:55 +02:00
Safihre
ae8e9d83f1 Less CPU intensive anti-stall fix 2017-09-02 15:27:31 +02:00
SABnzbd Automation
c4406df73f Automatic translation update 2017-09-02 09:23:23 +00:00
Safihre
12004802b6 Allow users to set custom basepath
Closes #904
https://forums.sabnzbd.org/viewtopic.php?f=11&t=22511
2017-09-02 11:10:13 +02:00
Safihre
6068ca6376 Disable CherryPy timeout monitor
Besides throwing errors, it doesn't really help anything. The actions still get performed. 
See also: https://github.com/cherrypy/cherrypy/issues/1625
2017-09-02 09:50:55 +02:00
Safihre
613ba49165 Only really count passwords that came from the passwords file 2017-09-01 21:21:48 +02:00
Safihre
9cd21d84ee Only reset trylist once when reset of nw
Also happens within the decode()
2017-09-01 13:36:04 +02:00
SABnzbd Automation
8d813f125e Automatic translation update 2017-08-31 14:44:35 +00:00
Safihre
cb66bc28ab create_default_context only availble on Python 2.7.9+ 2017-08-31 13:14:29 +02:00
Safihre
30b13b1856 Small tweaks to startup logging 2017-08-30 23:59:27 +02:00
Safihre
67a133068c Move logging of number of certificates to Debug only
It's a bit slow, can take up to 1.5 seconds of startup time.
2017-08-30 23:48:07 +02:00
Safihre
731a3bcb22 Move Bonjour/ZeroConfig to after SABnzbd start
Slow to mount or to fail (1-2 seconds)
2017-08-30 23:25:49 +02:00
Safihre
724ec8ca9f ZeroConfig could crash due to UTF8 hostname 2017-08-30 23:21:54 +02:00
Safihre
d28f775c71 Remove information about SSL/TSL Protocols because it is inccorect
There is no way to get the actually enabled SSL/TLS protcols on a system, let along from Python. It's not even possible from the `openssl` command line.
See also #994
And: https://stackoverflow.com/questions/45924030/get-available-ssl-tls-protocols-in-python-2-7
2017-08-30 23:15:19 +02:00
Safihre
a834c1c7a7 Add Refresh button to Glitter when Refresh Rate > 2
Linked #842
2017-08-30 15:28:17 +02:00
Safihre
04e595e706 Update text files for 2.3.0Alpha1 (2) 2017-08-29 23:53:36 +02:00
Safihre
46c28dbf68 Do not show dropdown for URL-grabs that are paused
Setting changes are not propegated to the actual downloading, could be optimized.
2017-08-29 23:50:54 +02:00
Safihre
8594bfe817 Timing of try-list check could cause stalling
My god I hate this stalling problem, it haunts me in my dreams.
2017-08-29 23:42:27 +02:00
SABnzbd Automation
e61a01512b Automatic translation update 2017-08-29 16:04:48 +00:00
Safihre
657e3bb594 Update text files for 2.3.0Alpha1 2017-08-29 16:42:34 +02:00
Safihre
bbbdca6a00 Update INSTALL.txt 2017-08-29 16:01:59 +02:00
Safihre
a95c705e4c Auto-disconnect if the last item was deleted from the Queue 2017-08-29 10:02:25 +02:00
Safihre
446c5ba80f Block for more reasons so that try-lists get reset 2017-08-29 09:06:38 +02:00
Safihre
7641c0e1cc Correct Retry function after par2-changes 2017-08-27 23:56:24 +02:00
Safihre
42fdd9c890 Flexible block-search
Also add blocks from setnames that are a lot a like. Especially in those cases with multi-sets where the sets have the same filenames.
2017-08-27 22:48:30 +02:00
Safihre
dca63878db Force priority should be listed as 'Downloading' even if Queue paused
Closes #1012
2017-08-27 22:37:13 +02:00
Safihre
dc67fc414c Do not rely on par2/Multipar parsing to detect par2 files of the parset
We know much bettter now we do full parsing of each par2 file that comes in.
2017-08-27 20:09:40 +02:00
Safihre
90be3cc5a0 Only remove par2's that really belong to the set 2017-08-27 18:49:03 +02:00
Safihre
42cdba5ce3 Improve Prospective Par2 to handle multisets better
Now we get too many blocks, but before the second set wouldn't get enough blocks
2017-08-27 18:32:13 +02:00
Safihre
9c069cfb2c Let par2/MultiPar only remove used par2-files
In case of duplicae filenames we don't want "base.1.par2" to be removed when checking "base.par2".
2017-08-27 17:41:44 +02:00
Safihre
544b420baa Correct get_files API-call to only show really queued files 2017-08-27 16:18:48 +02:00
Safihre
094c96f270 Improve obfuscated and broken par2 handeling
Linked #998.
- In case of full obfuscation we detect the files directly after assembling and rename it such that par2 will pick it up
- Turns out we do need 'partable' to keep track what is the main par2 file
- Handle missing of first par2 file, automatically fetch next one
2017-08-27 14:49:01 +02:00
Safihre
aa7bad56f0 Fix get_unique_filename function 2017-08-27 14:42:08 +02:00
Safihre
977f4e1036 Rework par2-handeling
See #998
- Seperate par2 functions in new file
- Always check for par2-signature if file is not a rar-file
- Always parse par2 contents for signatures (hash -> filename)
- Use the signatures to keep track of par2-packs, not basenames
- Remove seperate 'extrapars' for NZF's, all in the NZO
- Remove 'partable' for NZO, it's all in it's 'extrapars'
2017-08-27 12:23:17 +02:00
Safihre
e05a98d22b Do not show 'Apply filters' from the start
Nothing more we can do to speed up the RSS evaluation.
Closes #679
2017-08-26 18:57:47 +02:00
Safihre
452e955a1e Disable extra features of feedparser
NZB-feeds do not contain the properties that feedparser has fancy parsing for.
The reduces the time spent in feedparser by 40%. 
Linked #679
2017-08-25 22:59:40 +02:00
Safihre
29ec4d9a23 Set 2.2.1 version and update translations 2017-08-25 22:11:47 +02:00
Safihre
22517a7cd7 Merge branch '2.2.x' 2017-08-25 22:07:15 +02:00
Safihre
a724f6a979 Revert "Remove locks from ArticleCache"
This reverts commit 5e7558ce4a.
2017-08-25 21:59:11 +02:00
Safihre
715b25b52f More logging when adding NZB's 2017-08-25 21:59:07 +02:00
Safihre
bcc4dd75cf Update text files for 2.2.1 2017-08-25 21:58:48 +02:00
Safihre
97711ca82e Revert "Remove locks from ArticleCache"
This reverts commit 5e7558ce4a.
2017-08-25 21:57:16 +02:00
Safihre
e782237f27 More logging when adding NZB's 2017-08-25 21:49:24 +02:00
SABnzbd Automation
4d3f370b3a Automatic translation update 2017-08-25 16:04:37 +00:00
Safihre
07f6717728 Duplicate files in NZB could result in broken unpack after repair
Because par2 would detect them, but not use them. So ".1" files would later be used for unpack, even though it's not a real set.
2017-08-25 16:59:01 +02:00
Safihre
35b4aa6b7a Ignore unpack errors in duplicate rarsets
Multipar and par2tbb will detect and log them so we can remove them, but par2cmdline will not.
2017-08-25 16:58:56 +02:00
Safihre
52bb156c08 Ignore unpack errors in duplicate rarsets
Multipar and par2tbb will detect and log them so we can remove them, but par2cmdline will not.
2017-08-25 16:58:38 +02:00
Safihre
4361d82ddd Duplicate files in NZB could result in broken unpack after repair
Because par2 would detect them, but not use them. So ".1" files would later be used for unpack, even though it's not a real set.
2017-08-25 16:57:47 +02:00
Safihre
a7a04d912c Use fileobj to prevent having to chdir, which can crash on macOS
If something is "wrong" with the current directory, for example when SABnzbd is started after downloading in a sandbox by macOS security, this function can error and break the adding of NZB's.
Have to use a fileobj, otherwise GZip will put the whole path inside there.
2017-08-25 10:51:52 +02:00
Safihre
ce558b0850 Original files would be deleted after a MultiPar rename 2017-08-25 10:51:25 +02:00
Safihre
8ab7c294ee Do not fail a job if recursive unpack fails
The user can handle it, we did our part.
2017-08-25 09:19:29 +02:00
Safihre
306228462e Use existing texts for wizard ad translations
Yeah, my fault. I deleted them in a clean-up of the skintext during 1.0.0 development. Very stupid.
2017-08-25 09:19:15 +02:00
Safihre
017cf8f285 Do not fail a job if recursive unpack fails
The user can handle it, we did our part.
2017-08-25 09:15:14 +02:00
Safihre
03cdf6ed5d Sync translatable texts from develop
To avoid conflicts on Launchpad
2017-08-24 23:40:37 +02:00
Safihre
cf347a8e90 Original files would be deleted after a MultiPar rename 2017-08-24 23:36:36 +02:00
SABnzbd Automation
9e7a8468e2 Automatic translation update 2017-08-24 15:24:59 +00:00
Safihre
f06afe43e1 Use fileobj to prevent having to chdir, which can crash on macOS
If something is "wrong" with the current directory, for example when SABnzbd is started after downloading in a sandbox by macOS security, this function can error and break the adding of NZB's.
Have to use a fileobj, otherwise GZip will put the whole path inside there.
2017-08-24 16:36:13 +02:00
SABnzbd Automation
4c2445485a Automatic translation update 2017-08-23 23:13:38 +00:00
Safihre
103c46e2b4 Translation fix for unpack warning 2017-08-23 22:54:40 +02:00
Safihre
b4922d69a2 Pause between unpacks on Windows, otherwise subprocess_fix overloads
Strange but true, but on jobs with many small files to unpack, it would just fail.
2017-08-23 22:50:40 +02:00
Safihre
110a06a3cd Handle '482 Download limt exceeded'
Closes #1009
2017-08-23 22:50:27 +02:00
Safihre
fb301eb5c8 Update text files for 2.2.1RC2 2017-08-23 22:49:59 +02:00
Safihre
6f0f67110f Only auto-disconnect after first run of verification 2017-08-23 22:48:53 +02:00
Safihre
1562c3560b Handle '482 Download limt exceeded'
Closes #1009
2017-08-23 22:48:15 +02:00
Safihre
848721da84 Clean last functions from the real anti-stalling fix 2017-08-23 22:10:06 +02:00
Safihre
9813bc237f Only auto-disconnect after first run of verification 2017-08-23 21:42:56 +02:00
Safihre
b39fe059c6 Pause between unpacks on Windows, otherwise subprocess_fix overloads
Strange but true, but on jobs with many small files to unpack, it would just fail.
2017-08-23 21:42:17 +02:00
Safihre
a56c770a8b The real anti-stalling fix
Woohoo!
For each NZF (file) make sure all articles have tried a server before marking it as tried. Before if articles were still in transit they could be marked as tried on NZF level before the server could get to them,
2017-08-23 16:02:01 +02:00
Safihre
127d7ab40c The real anti-stalling fix
Woohoo!
For each NZF (file) make sure all articles have tried a server before marking it as tried. Before if articles were still in transit they could be marked as tried on NZF level before the server could get to them,
2017-08-23 15:43:54 +02:00
Safihre
4fb7246082 TryList reset at NZO level also nessecary
Timing issue between when a new server is selected and when a job is added to the NZO-level try-list. Locks were tried, but failed.
2017-08-23 09:11:34 +02:00
Safihre
8c42237d51 Correct handeling of TryList when server has timeout 2017-08-23 09:11:29 +02:00
Safihre
6a87f0c4e4 Correctly remove + from INFO label in all languages 2017-08-23 09:11:24 +02:00
Safihre
e3bf0edad8 TryList reset at NZO level also nessecary
Timing issue between when a new server is selected and when a job is added to the NZO-level try-list. Locks were tried, but failed.
2017-08-23 09:11:01 +02:00
Safihre
e35d9e4db3 Correct handeling of TryList when server has timeout 2017-08-23 08:32:47 +02:00
Safihre
c617d4321a Correctly remove + from INFO label in all languages 2017-08-22 16:13:24 +02:00
Safihre
0fd3a2881f Correct redirect after ports change 2017-08-22 10:19:42 +02:00
Safihre
f8630a878c Correct redirect after ports change 2017-08-22 10:11:41 +02:00
Safihre
7f6ef5e204 Only iterate over RSS feeds when there are feeds 2017-08-22 09:52:25 +02:00
Safihre
0c1f7633de Only discard really non-unique hashes from md5of16k 2017-08-22 09:43:33 +02:00
Safihre
b7d5d49c84 Show hover-title that the compress icon is Direct Unpack 2017-08-22 09:43:26 +02:00
Safihre
9911b93ece Add error when NZO creation fails 2017-08-22 09:43:11 +02:00
Safihre
eeaad00968 Also hide email-accounts in logging 2017-08-22 09:43:06 +02:00
Safihre
e1bb8459e3 Take the risk of allowing up to 5 bad articles in jobs without Par2 2017-08-22 09:42:47 +02:00
Safihre
65c3ac0cc0 Warn in case the password file has too many passwords 2017-08-22 09:42:16 +02:00
Safihre
413c02a80f Do not run get_new_id forever in case of problems
#984
2017-08-22 09:41:40 +02:00
Safihre
547d4dbf0a Only discard really non-unique hashes from md5of16k 2017-08-22 09:25:34 +02:00
Safihre
65e70a431c Show hover-title that the compress icon is Direct Unpack 2017-08-22 09:13:40 +02:00
Safihre
f85f4de5ff Error when applying changes to RSS-feeds
Closes #1005
2017-08-21 20:25:34 +02:00
Safihre
97644dea16 Show more clear error message when UnRar of Par2 is missing 2017-08-21 16:27:04 +02:00
SABnzbd Automation
0a6105ebc1 Automatic translation update 2017-08-21 07:18:33 +00:00
Safihre
de3d4f8d14 UnRar is required to read some RAR files 2017-08-21 08:26:12 +02:00
Safihre
80f118f304 UnRar is required to read some RAR files 2017-08-21 08:23:10 +02:00
Safihre
f337053aea Add error when NZO creation fails 2017-08-20 20:45:55 +02:00
Safihre
2a4b49a679 Warning "Invalid par2 files" can also be due to bad Par2-parameters 2017-08-20 16:41:18 +02:00
Safihre
ebe526f8cf Also hide email-accounts in logging 2017-08-20 10:33:24 +02:00
Safihre
926cd7b132 Take the risk of allowing up to 5 bad articles in jobs without Par2 2017-08-20 01:35:06 +02:00
Safihre
99667aa410 Remove obsolete code from RSS 2017-08-20 01:20:56 +02:00
Safihre
67cab3465e Remove extra checks from RSS file-store loading 2017-08-20 00:31:22 +02:00
Safihre
ce68a0654b Scheduler Priority/Category Pause/Resume also affects URL-grabbing
Linked #988
2017-08-19 23:59:14 +02:00
Safihre
dffdc3ae1f Extend Scheduler to Pause/Resume based on category
Closes #549
2017-08-19 23:56:51 +02:00
Safihre
28e5311c6c Change logging line of SSL-protocols
Linked #994
2017-08-19 22:52:33 +02:00
Safihre
ebf0526420 Do not show NZB-age when it is nonsense
For example with a grabbing NZB.
2017-08-19 21:49:03 +02:00
Safihre
a2f73ca1f0 Add feed name to URL-grabbing title
Closes #988
2017-08-19 21:40:43 +02:00
Safihre
8ca150c48d Allow pausing of URL-grabbing
Linked #988
2017-08-19 21:20:28 +02:00
Safihre
d765fa09f1 Change certificate-file location for distributions 2017-08-19 20:33:46 +02:00
Safihre
878d68d343 Warn in case the password file has too many passwords 2017-08-19 16:06:06 +02:00
Safihre
fc7bd78dfa Translation changes 2017-08-19 13:28:21 +02:00
SABnzbd Automation
aca6ed360c Automatic translation update 2017-08-19 09:17:50 +00:00
Safihre
5c0a10e16b Update text files for 2.2.1RC1 2017-08-19 11:06:40 +02:00
Safihre
d9b32261e7 Reset all NZO TryList when doing Prospective Add
I thought in c14b3ed82a that this was enough, but clearly it is not.
2017-08-19 11:03:22 +02:00
Safihre
8d8ce52193 Stall prevention by checking TryList 2017-08-19 11:03:15 +02:00
Safihre
53672d1d73 Reset all NZO TryList when doing Prospective Add
I thought in c14b3ed82a that this was enough, but clearly it is not.
2017-08-18 19:36:20 +02:00
SABnzbd Automation
07d316ed4f Automatic translation update 2017-08-18 15:44:05 +00:00
Safihre
8aa57bf406 Update Config jQuery to 3.2.1 and Peity to 3.2.1 2017-08-17 11:00:47 +02:00
Safihre
d369097573 Update KnockoutJS to 3.4.2 2017-08-17 11:00:47 +02:00
Safihre
f4960715fa Do not run get_new_id forever in case of problems
#984
2017-08-17 11:00:47 +02:00
Safihre
83ba676c43 Correct loading of extra certificate files
Also include logging of number of found certificates
2017-08-17 11:00:47 +02:00
Safihre
12cca9dea1 Provide certificates with macOS and Windows build
We have to bring our own certficates on Homebrew Python 
The certifi package brings the latest certificates on build 
This will cause the create_default_context to load it automatically
We also use this on Windows so users are always up-to-date
2017-08-17 11:00:47 +02:00
Safihre
5f52535c44 Faster look-ups when restoring queue 2017-08-17 11:00:47 +02:00
Safihre
2f95410ab4 Allow for older queue-files 2017-08-17 11:00:47 +02:00
Safihre
5749c0c008 Keep TryList state
Part 1 of #973
2017-08-17 11:00:47 +02:00
Safihre
73c71ef4bf Allow filenames with also 1-char file extension 2017-08-17 11:00:47 +02:00
Safihre
6bc1c51013 Remove server specific categories
Finally. This feature has only caused problems.
2017-08-17 11:00:47 +02:00
Safihre
bcdd3302a6 Stall prevention by checking TryList 2017-08-17 11:00:47 +02:00
Jonathon Saine
0fc3b60054 Add propercheck to allow PROPER/REAL/REPACK releases to bypass the series episode dupe check. 2017-08-17 10:54:57 +02:00
Safihre
e9b0d4d691 On to 2.3.0 we go 2017-08-17 10:53:32 +02:00
Safihre
1cc2e25cda Update to 2.2.0 2017-08-17 10:47:04 +02:00
SABnzbd Automation
0dc2c6687d Automatic translation update 2017-08-17 08:43:38 +00:00
Safihre
b061e582b6 Update text files for 2.2.0 2017-08-16 22:56:10 +02:00
Safihre
690731fd79 Update wizard Ad URL 2017-08-16 13:34:01 +02:00
Safihre
068b7ed7f5 Disk-speed test for Direct Unpack would cause restart 2017-08-15 21:53:24 +02:00
Safihre
aae2fdcd32 Update Unrar to 5.5.0 for Windows and macOS
Right on time.
Closes #935
2017-08-14 20:37:11 +02:00
Safihre
d3628a1eb7 CherryPy 8.1.2 - Catch the [Errno 0] Error
Untill a fix is found.
2017-08-13 16:58:20 +02:00
Safihre
9cc8176d87 Server-tests were broken due to deprecation warning
Linked #996
2017-08-12 14:52:34 +02:00
Safihre
27f83f21be Update text files for 2.2.0RC3 2017-08-12 11:39:28 +02:00
Safihre
5e31a31a21 Make Server charts timezone-proof
Closes #997
2017-08-12 21:23:18 +12:00
Safihre
a077012478 Windows fix for subprocess would break when options were not specified 2017-08-12 09:42:47 +02:00
Safihre
fed0e0f765 Use win32api for power-options on Windows 2017-08-12 09:39:25 +02:00
Safihre
fbdbf7ab22 Improve par2 handeling by always parsing md5of16k and checking new sets
- We postpone only par2-files with actual blocks, in case of duplicate named par2 files that are of different sets we want all base-par2 files.
- The md5of16k is now calculated for every par2 file we get so we can rename everything.
- We also check during assembly if maybe a md5of16k is now available, in case the par2 file came in later.
- If a par2 file comes in, we double check if maybe this pack was not known yet. The setname might not be unique. This way we make sure that everything gets verified at the end.

Still need obfuscation improvements, but that's for later.
Linked #998
2017-08-12 00:33:32 +02:00
SABnzbd Automation
f013d38d00 Automatic translation update 2017-08-10 11:45:54 +00:00
Safihre
93b9c8a6da Correctly escape the values in EN.po 2017-08-10 13:33:11 +02:00
Safihre
4605c3fd30 Set version to 2.1.0 and make identical to develop 2017-06-09 11:35:46 +02:00
Safihre
ed7dc3f827 Merge branch 'develop' 2017-06-09 11:30:43 +02:00
Safihre
e69eeebdd8 Merge branch 'develop' - Update to 2.0.1 2017-05-24 12:14:56 +02:00
Safihre
5da5f1adc1 Set version to 2.0.0 2017-04-09 12:25:05 +02:00
Safihre
f47e92dec0 Merge branch 'develop' 2017-04-09 11:59:13 +02:00
Safihre
a894ca5171 Set version to 1.2.3 2017-03-18 13:05:04 +01:00
Safihre
5abe1140ae Merge branch '1.2.x' 2017-03-18 13:03:36 +01:00
Safihre
d34e14370c Chain certificates not loaded in all situations of extra servers 2017-03-18 11:43:46 +01:00
Safihre
c4f4a3131c Update 1.2.3 text files for extra bugfix 2017-03-18 11:40:57 +01:00
Safihre
dcbd9b57f3 CherryPy would fallback to (non-existing) pyopenssl for extra servers
Causing failed starts
2017-03-18 11:39:40 +01:00
Safihre
aad3b54a17 Update Text Files for 1.2.3
These patches were already tested within 2.0.0Alpha/Beta, so considerd safe.
2017-03-18 11:04:57 +01:00
Safihre
cde142a371 Windows paths can't end in a dot 2017-03-18 11:02:14 +01:00
Safihre
8bfc98ffc6 Glitter server unblock button wasn't working
Closes #864
2017-03-18 11:01:51 +01:00
Jonathon Saine
e46f21d566 Fix -w option as it no longer needs arguments. 2017-03-18 11:00:46 +01:00
Safihre
0e45fdcdfd Fix BPS manager breaking the downloader due to Quota 2017-03-18 10:28:31 +01:00
Safihre
eec7af16d7 Improve log obfuscation
It needs to match any charachters not just alpha-numeric
2017-03-18 10:28:03 +01:00
Safihre
6532425902 Kill the UnRar after a Windows failure
On Windows Server it seems unrar otherwise won't stop: https://forums.sabnzbd.org/viewtopic.php?f=3&t=22492
2017-03-18 10:27:57 +01:00
Safihre
44b896522c Unzip needs clipped paths
(7zip doesn't)
2017-03-18 10:26:32 +01:00
Safihre
1b16ee44cb Set version to 1.2.2 2017-02-28 11:17:24 +01:00
Safihre
d5f608c28c Merged branch 1.2.x into master 2017-02-28 11:16:59 +01:00
Safihre
555d8418e7 Update text files for 1.2.2 2017-02-25 22:12:34 +01:00
Safihre
8c22e35da4 Script paths were not clipped correctly 2017-02-25 22:07:25 +01:00
Safihre
95a7924b31 Set version to 1.2.1 and fix small discrepancies 2017-02-24 11:22:55 +01:00
Safihre
5830bebd95 Merge branch '1.2.x' 2017-02-24 11:16:18 +01:00
shypike
d32cf57c75 Update translations 2017-02-24 10:03:07 +01:00
Safihre
6d9242ebc5 Update text files for 1.2.1 Final 2017-02-23 11:53:56 +01:00
Safihre
cbc4f6a964 When retry of unpack due to Windows bug, send the actual password
We converted the password to "-p<password>" and when we had to retry it due to a Windows long-path fail, it would become "-p-p<password" and would incorrectly report that the password was wrong.
2017-02-21 20:09:07 +01:00
Safihre
2a3b2b9556 Forced diskspace check seperate from cached one
Closes #826. Otherwise the complete/incomplete get out of sync.
2017-02-20 15:43:55 +01:00
Safihre
53a219f12b Tooltip for Download/Incomplete in Status Windows
Closes #827
2017-02-20 09:03:45 +01:00
Safihre
48519dcfa0 Correct mistake in Diskspace calculation for Unix 2017-02-19 16:12:15 +01:00
Safihre
92542c58fe Diskspace for Complete folder was not calculated 2017-02-19 16:12:07 +01:00
Safihre
7eafe730f9 Modify RarFile to properly handle testrar on Windows
Because unrar doesn't support \\?\ notation for the path to the rarfile we used to clip the path. However, the Python functions that RarFile uses then fail on unicode or jobs with '?' in the filename. Now this is handled correctly, at the very last moment before testing the RAR.
2017-02-19 01:47:29 +01:00
Safihre
494e72a996 Update to 1.2.0 and set version 2017-01-13 17:00:51 +01:00
Safihre
84cc86f1d3 Update to 1.1.1 and set version (#731) 2016-11-11 13:58:07 +01:00
shypike
64479e2e5d Correct the merge of release 1.1.0 to the "master" branch. 2016-09-14 08:26:02 +02:00
shypike
13b523d9bd Merge pull request #681 from Safihre/master
Master to 1.1.0
2016-09-13 16:25:05 +02:00
Safihre
181881a21b Merge branch 'develop' 2016-09-11 22:16:42 +02:00
shypike
86d11095ac Merge pull request #592 from sabnzbd/1.0.x
Update master to 1.0.3
2016-06-10 19:01:03 +02:00
shypike
927ba3cd9d Update text files for 1.0.3 2016-06-04 13:34:11 +02:00
Safihre
6296fc1762 #568 Add code 482 to check for too-many-connections 2016-06-03 23:24:07 +02:00
shypike
60fbe44724 Support X-DNZB-PASSWORD header. 2016-06-03 22:18:56 +02:00
shypike
29e45da431 Fix NZB association for Windows.
Make sure that the second SABnzbd instance sends an UTF-8 encoded URL to the first instance.
Otherwise CherryPy will reject the API call.
2016-06-03 22:07:44 +02:00
shypike
d82e69eef4 Handle checksum error reports from unrar. 2016-06-02 23:19:57 +02:00
shypike
8c7d557252 Prevent job from hanging when adding back par2 files.
Sometimes already completed par2 files are being re-added to the queue as extra par2 files.
Because these files are already complete, there will be no attempt to download them
and as a result they will never leave the queue.
2016-06-02 22:11:59 +02:00
shypike
a56d6e5517 Merge pull request #577 from sabnzbd/1.0.x
1.0.x to master
2016-05-23 18:11:23 +02:00
shypike
7548d9e975 Correct base version number for 1.0.x releases. 2016-05-10 14:43:14 +02:00
shypike
b7e2bd9684 Update text files for 1.0.2 2016-05-03 19:39:45 +02:00
shypike
f0a243e3d3 Fix API status issues.
Remove the "ToPP" status, it serves no purpose.
Only truly deleted jobs should get the "Deleted" status,
not jobs moving from Download to PP queue.
2016-05-01 14:42:07 +02:00
shypike
6e108c9ef2 Prevent Completed and Failed jobs from getting status Deleted. 2016-04-30 11:47:03 +02:00
shypike
89edcc1924 Log the preferred character encoding 2016-04-30 11:18:32 +02:00
shypike
8a6aca47a1 Prevent stalling at 100% when QuickCheck is Off and "Download-all-pars" is On.
The repair function sent all extra par2 files back to the queue
even though they were already downloaded.
2016-04-28 22:42:51 +02:00
shypike
d03e5780b8 Fix API compatibility of queue statuses.
The new statuses TO_PP and DELETED should not be returned by the API.
Tools may not be able to handle them and they are only useful for internal purposes.
2016-04-27 12:03:37 +02:00
shypike
209d8f9b40 NNTP error 502 should not aways be interpreted as bad login.
It can also mean "too many connections".
2016-04-27 11:52:56 +02:00
shypike
c257b1be3d Update text files for 1.0.1 2016-04-26 19:57:22 +02:00
Safihre
2c48c8de2e Force MIME types for CSS and JS files
Caused problems on Windows if external programs overwriten it in registery.
See: http://forums.sabnzbd.org/viewtopic.php?f=2&t=20490
And: https://www.reddit.com/r/usenet/comments/4fkmcx/my_sab_interface_is_text_only/
2016-04-26 19:48:47 +02:00
shypike
a767ef6aed Fix API compatibility of queue.
The new statuses TO_PP and DELETED should not be returned by the API.
Tools may not be able to handle them and they are only useful for internal purposes.
2016-04-26 19:47:38 +02:00
shypike
ad61d1dd03 The pre-queue script can now return an accept value of 2, meaning immediate failure.
Supports front-ends which need the signal that an NZB has been
rejected by the pre-queue script.
2016-04-22 21:54:45 +02:00
shypike
33c3d187a0 Add start script for portable Windows installations 2016-04-22 16:44:37 +02:00
shypike
4eb486d4e2 Update text files for 1.0.0RC1 2016-04-16 15:31:48 +02:00
shypike
bfb6c167a4 Another attempt to set the default cache to 450M. 2016-04-16 15:27:35 +02:00
shypike
44abf3bdf6 Update text files for 1.0.1RC1 2016-04-15 23:12:22 +02:00
shypike
c950572592 Set default cache to 450M 2016-04-15 23:11:53 +02:00
shypike
3999cb13fd Update text files for 1.0.1RC1 2016-04-15 21:06:55 +02:00
shypike
af65075f0c Update text files for 1.0.0RC1 2016-04-15 21:05:53 +02:00
shypike
de2a2b465b Update text files for 1.0.1RC1 2016-04-13 22:41:13 +02:00
shypike
cd7a77f02d Revert "Set default cache size to 750MB on Windows and OSX."
This reverts commit 9b420e91c9.
2016-04-13 22:30:05 +02:00
shypike
f4a5394b63 Prevent creating orphan items in "incomplete" when deleting downloading jobs.
Due to previous issues where articles could be lost,
the nzf.deleted and no.deleted flags were not obeyed.
This could lead to creation of orphans when lost articles would be flushed.

Better solution: drop articles only when job is in a final state.
Also prevent NZO files from being saved when job is in "deleted" state.
2016-04-13 18:32:23 +02:00
jdfalk
3fb6a8dedb Update sabnzbd@.service
1. Added requirement for network to be up before sab starts.
2. Explicitly set service type to simple.
3. Enabled sabnzbd restart on service failure via systemd.
2016-04-13 18:22:11 +02:00
Safihre
50c8f84eba #448-#126 Forced item with missing articles caused overflow in paused queue
Closes #448
Closes #126
2016-04-13 18:21:41 +02:00
Safihre
2c7ecdee92 #464 Grabbing items don't always have status=grabbing
But now they do!
2016-04-07 21:45:28 +02:00
Safihre
72390a793a Add Optional label to Retry password 2016-04-07 21:45:17 +02:00
Safihre
04ad4e5d3e Update cache text to more 2016 values 2016-04-07 21:45:05 +02:00
Safihre
5ef9c6a433 #530 do not ignore files in QuickCheck
Par2 wouldn't ignore them either
2016-04-07 21:44:51 +02:00
shypike
e6baffc839 Prevent API crashes when 'mode' or 'name' have double entries. 2016-04-07 21:35:07 +02:00
shypike
e361eb25a5 Fix potential race condition in BPSmeter. 2016-04-01 21:18:19 +02:00
shypike
9b420e91c9 Set default cache size to 750MB on Windows and OSX.
To make handling of posts with large files more efficient.
2016-04-01 21:09:15 +02:00
Safihre
3a4bf971b2 #529 Fix unicode strip in OptionStr 2016-04-01 20:47:11 +02:00
Safihre
1128691c5d #527 Fix "Download all par2 files" behavior 2016-03-29 21:03:48 +02:00
Safihre
15043aef3f DB Strings should be encapsulated in ' not " 2016-03-29 21:03:30 +02:00
savef
2a3b4afa03 Treat ambiguous numeric values as number of minutes for custom pause time.
Currently if you just type "100" into the custom pause field it'll think you want 143015 minutes, that's useless. A lot of people are probably used to the old Plush behaviour of entering the number of minutes you want to pause for, it's also a much saner default. So in the case that the user just enters some numbers and nothing else, this assumes they want to pause for that many minutes.
2016-03-24 21:01:04 +01:00
shypike
00a98efa81 Fix race-condition when deleting an actively downloading job.
Closes #237
2016-03-24 20:57:27 +01:00
shypike
f013dd7f0d Accept MIME records that have only LF line endings.
Some tool developers just ignore the rule requiring CRLF.
2016-03-23 23:29:12 +01:00
shypike
7b91b1c769 Fix race condition when API and postprocessor both want to delete a history item. 2016-03-23 23:03:28 +01:00
shypike
5583cce322 When urlgrabber receives a 404, stop trying. 2016-03-23 23:00:38 +01:00
shypike
b995c5f992 Fix PushOver support.
Adjust priority levels to the current PushOver API.
Re-enable device field now that the PushOver API supports readable device labels.
2016-03-22 21:25:05 +01:00
shypike
214ac4a53d Prevent incompatibility due to missing 'script_log' field.
Fixes commit c0f2f59fc1
2016-03-20 15:24:07 +01:00
shypike
fc7e87f0df Merge branch '1.0.x' 2016-03-19 11:49:11 +01:00
Safihre
c0f2f59fc1 Fix breaking Glitter bug with large script_log 2016-03-18 14:11:54 +01:00
shypike
b90a847a6f Fix omission in README.mkd 2016-03-15 21:42:16 +01:00
shypike
a58bb385f5 Update text files for 1.0.0 2016-03-15 20:12:50 +01:00
shypike
9754baeb1c Fix handling of changed "ignore_samples" option.
Closes #510
2016-03-15 20:08:35 +01:00
shypike
ffcd154966 Update text files for 1.0.0 Final. 2016-03-14 19:12:59 +01:00
shypike
97cfe9488c Update text files for 1.0.0RC5 2016-03-11 19:24:27 +01:00
shypike
374b6f616a Fix crash in CherryPy when it reports problems with some IPv6 addresses.
A bug in Python's traceback logging causes a crash when an IPv6 address with an embedded % is reported.
2016-03-11 19:22:49 +01:00
Sander Jonkers
e2f51595b6 Because of dual IPv4/IPv6 clients, finding the public ipv4 needs special attention 2016-03-10 22:52:22 +01:00
shypike
04091a16aa Fix display of SABnzbd's icon by OSX Notification Center.
El Capitan doesn't accept the -sender parameter, so just omit it.
2016-03-08 16:40:44 +01:00
shypike
9d9d2fd9a2 Revert "Fix Plush dashboard"
This reverts commit 42f1a4926c.
2016-03-08 16:00:24 +01:00
shypike
5746115331 Suppress errors/warnings about bad "Rating" files when the feature is disabled. 2016-03-08 15:53:52 +01:00
Safihre
42f1a4926c Fix Plush dashboard 2016-03-05 11:23:19 +01:00
Safihre
7d87fd461b Fix Glitter display in <1MB/s range 2016-03-05 11:22:57 +01:00
shypike
1ba9976979 Update text files for 1.0.0RC4 2016-03-05 08:52:09 +01:00
shypike
659c199043 Fix --ipv6_hosting option.
Repairs commit 1cbff28
2016-03-05 08:50:13 +01:00
shypike
81a3f53226 Update text files for 1.0.0RC3 2016-03-04 20:39:01 +01:00
shypike
1cbff28f67 Disable listening on IPv6 addresses by the internal web server.
Setting Config->Special->ipv6_hosting to 1 will enable IPv6 listening.
Command line option --ipv6_hosting allows forcing the choice, should SABnzbd not start.
Closes #492
2016-03-04 19:26:50 +01:00
shypike
8e15acbf30 Update translations 2016-03-04 18:55:20 +01:00
Safihre
e07be60db6 #489 wrongly encoded & in the preload 2016-03-01 22:20:51 +01:00
Safihre
539c9662ff 'Default' not translated in Server-category 2016-03-01 22:20:35 +01:00
shypike
b396014f8d Fix IP test at startup.
Correction of problem introduced by commit afff88b "Use self-test.sabnzbd.org for connection tests".
2016-02-24 22:30:02 +01:00
shypike
1db32415b6 Update translations 2016-02-24 21:37:22 +01:00
shypike
b24629db6b Update text files for 1.0.0RC2 2016-02-24 21:11:43 +01:00
Safihre
9b5cdcf8fb Add trailing "/" to href's 2016-02-24 21:05:12 +01:00
shypike
4831415d14 Use self-test.sabnzbd.org for connection tests 2016-02-24 20:34:04 +01:00
Chris Thorn
a4c51f0b20 Parse bandwidth limit as a float instead of an integer so that non-integer values can be used as bandwidth limit 2016-02-24 20:09:02 +01:00
shypike
ec3ba1fb93 Changing server priorities during a download could lead to unexpected results and lockups.
Target priority of articles must be kept at the TryList level so that they
are reset when the try_list is reset.
Closes #378
2016-02-24 20:08:51 +01:00
Safihre
61966f7036 Plush dashboard local IPv4 wouldn't show if external failed
Typo!
For 1.0.0
2016-02-24 20:08:38 +01:00
Safihre
4f69e81841 Add link to information about SSL/yEnc 2016-02-24 20:07:48 +01:00
Safihre
d0d90581df Tweak first Config page 2016-02-24 20:07:35 +01:00
Safihre
8ea5c27633 Improve display of message on blocked server 2016-02-24 20:07:16 +01:00
shypike
517500fdf3 Add link to issue list on support site. 2016-02-19 22:42:30 +01:00
shypike
c4c1c9b6ab Prevent UI errors due to history_db handle not being available. 2016-02-19 22:22:42 +01:00
Safihre
2388889ede Filegrabber did not sanatize filename 2016-02-19 22:21:28 +01:00
Safihre
55cfe878d7 Catch failing Windows Notification
I assumed Windows notifications could not fail, but clearly they can:
http://forums.sabnzbd.org/viewtopic.php?f=11&t=20211&p=104438
When no tray-icon is available, it will fail and in the case of
completed NZB message it will restart the whole of SABnzbd.
2016-02-17 21:25:42 +01:00
Safihre
a2daaee468 Add Pystone score to Glitter status 2016-02-17 21:06:43 +01:00
Safihre
2c360e395e Limit to max 250 items per page (realistic limit) 2016-02-17 21:05:55 +01:00
Jonathon Saine
399cfee594 Add pyOpenSSL info to startup/utility/config base. Add OpenSSL & yEnc to config base as well. 2016-02-17 21:04:13 +01:00
shypike
be646ae6ab Set default for https verification to off. 2016-02-17 20:50:24 +01:00
shypike
b470253d9f Disable https verification when uploading NZB to running instance of SABnzbd. 2016-02-13 16:12:04 +01:00
shypike
b83c493492 Update translations 2016-02-11 01:06:52 +01:00
Safihre
991277bb01 Glitter broke on empty preload strings
See
http://forums.sabnzbd.org/viewtopic.php?f=11&t=20192&p=104368#p104368
In case of UnicodeError
2016-02-10 22:59:11 +01:00
Safihre
5626013b81 Don't allow name change or filesview on grabbing 2016-02-10 22:58:56 +01:00
Safihre
2810d37758 Make disabled servers look more disabled 2016-02-10 22:58:40 +01:00
Safihre
c2f08f01e0 #408 Show red when Add-NZB left empty 2016-02-10 22:57:30 +01:00
Safihre
17ff087e06 Do not confirm clearing warnings 2016-02-05 23:36:47 +01:00
Safihre
77de565b7c Link in message about Orphans was broken 2016-02-05 23:36:36 +01:00
Safihre
54d238aa4d Message labels were not translated
INFO and WARNING
2016-02-05 23:36:23 +01:00
Safihre
379d09f8cc Improve message about no localStorage
It happens more than I expected, so better make a proper message.
2016-02-05 23:35:23 +01:00
shypike
00de72b127 Update text files for 1.0.xRC1 2016-02-03 21:18:42 +01:00
shypike
f9c84fa7dd Fix trouble with disk speed meter (especially on Windows) Part 2.
Improve the benchmark by reducing Python overhead by writing larger blocks.
2016-02-03 21:08:47 +01:00
shypike
c8e46691bb Solve file name encoding issues for OSX.
- Names returned by unrar-commandline need to be Unicoded.
- For yEnc embedded names, only test for UTF-8 and CP1252, but not the local codepage.
- Suppress some bogus warnings
- Log the output of the unrar tool
2016-02-03 20:59:12 +01:00
shypike
df1bb636e5 Fix links in text files to pooit to 1.0.0 entries in the Wiki. 2016-02-03 20:51:19 +01:00
shypike
ff886fad0d Fix all links in the templates to point to 1.0.0 (or 1-0) entries in the Wiki. 2016-02-03 20:50:13 +01:00
shypike
6dbee7a413 Fix trouble with disk speed meter (especially on Windows) Part 2.
Move fix outside of the measurement loop.
Don't remove the test-file within the loop, but only after it's finished,
otherwise we'll still get a "Permission denied".
2016-01-30 10:52:28 +01:00
shypike
3f8fcd7172 Fix trouble with disk speed meter (especially on Windows).
Better handling when folder is not available or writable.
Windows requires some access outside of the Python code to avoid "permission denied".
2016-01-29 23:54:32 +01:00
shypike
d94f7388e6 Add a link on the main Config page, to the "issues" page on the Wiki 2016-01-29 19:55:04 +01:00
Safihre
ad8b49fea8 #408 Firefox-fix: word-wrap instead of word-break 2016-01-29 19:21:59 +01:00
Safihre
ce00270c12 #447 only show arguments-field for speedlimit 2016-01-29 19:21:41 +01:00
Safihre
8c501f8f58 #447 Servers in scheduler more clear 2016-01-29 19:21:30 +01:00
Safihre
ce313ebc65 #445 Reduce statusinfo timeout on startup 2016-01-29 19:21:18 +01:00
Safihre
887ad881a2 #444 HTTPS instead of HTTP for RSS favicon 2016-01-29 19:21:07 +01:00
Safihre
ce40827552 Fix breaking RSS page
Fixes http://forums.sabnzbd.org/viewtopic.php?f=11&t=20114
2016-01-29 19:20:52 +01:00
shypike
2777d89482 Fix typos that prevented notifications about disk full being sent. 2016-01-28 23:19:36 +01:00
shypike
727b300a0e Update translations 2016-01-24 16:34:40 +01:00
shypike
652b021a8e Update text files for 0.8.0Beta6 2016-01-24 16:26:26 +01:00
shypike
fdf33acfbb Allow "None" as selection for secondary skin. 2016-01-24 16:15:02 +01:00
shypike
b001bc9b6f Prevent multiple resume notifications.
Only report "Resume" when coming from Paused mode.
2016-01-24 15:18:24 +01:00
shypike
8802cb1d8c Notifications template contained two instances of "ncenter_enable", leading to problems.
The result was a list instead of a single value.
2016-01-24 15:18:07 +01:00
shypike
e19a2fbae7 Improve handling of an old queue when upgrading to 0.8.0+
Warn only for a non-empty queue.
For Windows, when using a relative "download_dir" based on the user profile,
prepend the path with "Documents".
No action when the -f parameter was used.
This way it will be easier to restore existing jobs.
2016-01-24 15:17:47 +01:00
Safihre
53e38f98f9 Firefox needs more time to process the Server AJAX 2016-01-24 15:16:52 +01:00
Safihre
e783e227f6 #438 Try to stop Firefox from checking checkboxes 2016-01-24 15:16:39 +01:00
shypike
f3dfbe4181 Fix problem where a stray RAR file would cause a failed unpack run.
When a job of which the RAR files are renamed by par2,
needs repair of one more more files, the original damaged files will stay behind.
This will cause SABnzbd to try a doomed attempt at unpacking.
SABnzbd should keep track of such files and delete them after repair.
2016-01-24 15:15:57 +01:00
shypike
bcd8ca8bc4 Fix potential crash when reverting par2 renames.
Can happen when files have been modified outside of SABnzbd's control.
2016-01-24 15:12:06 +01:00
shypike
816d6a63cd For SSL protocol choice, default to auto-negotiation.
The "V23" method is interpreted by OpenSSL as "negotiate the highest available protocol"
and should therefor be a safe choice (best chance of working and best security).
If a user wants to, it is possible to fix the protocol, to prevent interference in the negotiation.
We cannot just assume that we can use our highest fixed protocol, because some Usenet servers
are being slow with implementing TLS1.2
2016-01-24 15:11:30 +01:00
shypike
88d3f25700 Perform IPv6 test on port 443 instead of 80.
Works better with some proxies.
Closes issue #274
2016-01-19 18:13:42 +01:00
shypike
80f69b11db When trying to connect to another SABnzbd instance over HTTPS, don't verify certificates.
Very few SABnzbd installations will have valid certificates.
2016-01-19 18:03:33 +01:00
Safihre
81a11f20c8 Re-order Switches page 2016-01-19 17:30:01 +01:00
Safihre
9e2a839953 Config fixes 2016-01-19 17:30:01 +01:00
Safihre
3cefcde270 #408 Refresh on Config Special save to update the * 2016-01-19 17:30:01 +01:00
Safihre
87a1eacfe7 #408 Also close history-details on history-row click
Before it would only open
2016-01-19 17:30:01 +01:00
Safihre
7cbc1a8419 #408 Browser navbar to black on mobile 2016-01-19 17:30:01 +01:00
Safihre
7b5570eb0b #408 Extra space next to Folder icon 2016-01-19 17:30:00 +01:00
Safihre
1a43a4dcf0 #432 Change filename to name in Add NZB 2016-01-19 17:30:00 +01:00
Safihre
2c2a6592c7 End of queue script was forgotten in Glitter 2016-01-19 17:30:00 +01:00
shypike
f31de6ee4e The compiled OSX build wasn't restarted with original command line arguments.
Rare use case where the App was originally started with parameters.
Essential for correct preservation of the -f parameter.
2016-01-19 17:29:11 +01:00
shypike
8fcd1f6b6c Merge branch 'develop' into R0.8.0 2016-01-16 12:25:38 +01:00
shypike
d7f3a473d7 Merge branch 'develop' into R0.8.0 2016-01-13 21:51:51 +01:00
shypike
ab2eb0c94e Update text files for 0.8.0Beta5 2016-01-13 20:17:32 +01:00
shypike
e51f4fc45a Merge pull request #181 from discordianfish/add-dockerfile
Add Dockerfile
2014-10-08 21:38:15 +02:00
Johannes 'fish' Ziemke
65278120e2 Add Dockerfile
Usage:

        docker build -t sabnzbd .
        docker run -p 127.0.0.1:8080:8080 sabnzbd
2014-09-24 13:46:43 +02:00
shypike
2eed355e9c Revert "newsunpack.py: also handle output of unrar5 with password protected files"
This reverts commit 12fd63c1cf.
2013-11-11 20:24:11 +01:00
shypike
018955f4d5 Merge pull request #122 from sanderjo/patch-4
newsunpack.py: also handle output of unrar5 with password protected file...
2013-11-11 11:19:20 -08:00
sanderjo
12fd63c1cf newsunpack.py: also handle output of unrar5 with password protected files
as discussed http://forums.sabnzbd.org/viewtopic.php?f=3&t=16166&p=89054#p89054
2013-11-07 17:02:24 +01:00
155 changed files with 14786 additions and 13030 deletions

7
.gitignore vendored
View File

@@ -19,6 +19,10 @@ SABnzbd*.dmg
# WingIDE project files
*.wp[ru]
# Testing folders
.cache
.xprocess
# General junk
*.keep
*.bak
@@ -27,3 +31,6 @@ SABnzbd*.dmg
# Some people use Emacs as an editor
\#*
.\#*
.DS_Store
/venv

15
.travis.yml Normal file
View File

@@ -0,0 +1,15 @@
language: python
python:
- "2.7"
before_install:
- sudo add-apt-repository ppa:jcfp -y
- sudo apt-get update -q
- sudo apt-get install sabnzbdplus -y
install:
- pip install --upgrade -r tests/requirements.txt
script:
- pytest
notifications:
email:
on_success: never
on_failure: always

View File

@@ -1,5 +1,5 @@
*******************************************
*** This is SABnzbd 2.2.0 ***
*** This is SABnzbd 2.4.0 ***
*******************************************
SABnzbd is an open-source cross-platform binary newsreader.
It simplifies the process of downloading from Usenet dramatically,

View File

@@ -1,4 +1,4 @@
SABnzbd 2.2.0
SABnzbd 2.3.1
-------------------------------------------------------------------------------
0) LICENSE
@@ -27,58 +27,57 @@ Just run the downloaded EXE file and the installer will start.
It's just a simple standard installer.
After installation, find the SABnzbd program in the Start menu and start it.
Within 5-10 seconds your web browser will start and show the user interface.
Within a few seconds your web browser will start and show the user interface.
Use the "Help" button in the web-interface to be directed to the Help Wiki.
-------------------------------------------------------------------------------
2) INSTALL pre-built Windows binaries
-------------------------------------------------------------------------------
Unzip pre-built version to any folder of your liking.
Start the SABnzbd.exe program.
Within 5-10 seconds your web browser will start and show the user interface.
Within a few seconds your web browser will start and show the user interface.
Use the "Help" button in the web-interface to be directed to the Help Wiki.
-------------------------------------------------------------------------------
3) INSTALL pre-built macOS binaries
-------------------------------------------------------------------------------
Download the DMG file, mount and drag the SABnzbd icon to Programs.
Just like you do with so many apps.
Make sure you pick the right folder, depending on your macOS version.
-------------------------------------------------------------------------------
4) INSTALL with only sources
-------------------------------------------------------------------------------
Specific guides to install from source are available for Windows and macOS:
https://sabnzbd.org/wiki/installation/install-macos
https://sabnzbd.org/wiki/installation/install-from-source-windows
You need to have Python installed plus some non-standard Python modules
and a few tools.
Unix/Linux/macOS
All platforms
Python-2.7.latest http://www.python.org (2.7.9+ recommended)
Windows
Python-2.7.latest http://www.python.org (2.7.9+ recommended)
PyWin32 use "pip install pypiwin32"
subprocessww use "pip install subprocessww"
Essential modules
cheetah-2.0.1+ use "pip install cheetah"
par2cmdline >= 0.4 https://github.com/Parchive/par2cmdline/releases
See also: https://sabnzbd.org/wiki/installation/multicore-par2
unrar >= 5.00+ http://www.rarlab.com/rar_add.htm
openssl >= 1.0.0 http://www.openssl.org/
Optional modules
unzip >= 6.00 http://www.info-zip.org/
7zip >= 9.20 http://www.7zip.org/
sabyenc == 3.0.2 use "pip install sabyenc"
sabyenc == 3.3.1 use "pip install sabyenc"
More information: https://sabnzbd.org/sabyenc
openssl >= 1.0.0 http://www.openssl.org/
v0.9.8 will work, but limits certificate validation
cryptography >= 1.0 use "pip install cryptography"
Enables certificate generation and detection of encrypted RAR-files
Optional modules Unix/Linux/macOS
Optional modules Linux
pynotify Should be part of GTK for Python support on Debian/Ubuntu
If not, you cannot use the NotifyOSD feature.
python-dbus Enable option to Shutdown/Restart/Standby PC on queue finish.
@@ -88,17 +87,17 @@ Embedded modules (preferably use the included version)
Unpack the ZIP-file containing the SABnzbd sources to any folder of your liking.
If you want multiple languages, you need to compile the translations.
Start this from a shell terminal (or command prompt):
python tools/make_mo.py
Start this from a shell terminal (or command prompt):
python SABnzbd.py
python -OO SABnzbd.py
Within 5-10 seconds your web browser will start and show the user interface.
Within a few seconds your web browser will start and show the user interface.
Use the "Help" button in the web-interface to be directed to the Help Wiki.
-------------------------------------------------------------------------------
5) TROUBLESHOOTING
-------------------------------------------------------------------------------
@@ -113,7 +112,7 @@ or
You may of course try other port numbers too.
For troubleshooting you can use the program SABnzbd-console.exe.
For troubleshooting on Windows you can use the program SABnzbd-console.exe.
This will show a black window where logging information will be shown. This
may help you solve problems easier.
@@ -121,14 +120,13 @@ may help you solve problems easier.
6) MORE INFORMATION
-------------------------------------------------------------------------------
Visit the WIKI site:
Visit our wiki:
https://sabnzbd.org/wiki/
-------------------------------------------------------------------------------
7) CREDITS
-------------------------------------------------------------------------------
Several parts of SABnzbd were built by other people, illustrating the
wonderful world of Free Open Source Software.
See the licenses folder of the main program and of the skin folders.
See the licenses folder of the main program and of the skin folders.

View File

@@ -9,28 +9,18 @@
- 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.
Windows-only:
If you keep having trouble with par2 multicore you can disable it
in Config->Switches.
This will force the use of the old and tried, but slower par2cmdline program.
- A bug in Windows 7 may cause severe memory leaks when you use SABnzbd in
combination with some virus scanners and firewalls.
Install this hotfix:
Description: http://support.microsoft.com/kb/979223/en-us
Download location: http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=979223&kbln=en-us
- 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/2.2/special
See: https://sabnzbd.org/wiki/configuration/2.3/special
- Some third-party utilties 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/2.2/special
See: https://sabnzbd.org/wiki/configuration/2.3/special
- On OSX you may encounter downloaded files with foreign characters.
The par2 repair may fail when the files were created on a Windows system.
@@ -41,7 +31,7 @@
You will see this only when downloaded files contain accented characters.
You need to fix it yourself by running the convmv utility (available for most Linux platforms).
Possible the file system override setting 'fsys_type' might be solve things:
See: https://sabnzbd.org/wiki/configuration/2.2/special
See: https://sabnzbd.org/wiki/configuration/2.3/special
- The "Watched Folder" sometimes fails to delete the NZB files it has
processed. This happens when other software still accesses these files.
@@ -51,6 +41,10 @@
- Memory usage can sometimes have high peaks. This makes using SABnzbd on very low
memory systems (e.g. a NAS device or a router) a challenge.
In particular on Synology (SynoCommunity) the device may report that SABnzbd is using
a lot of memory even when idle. In this case the memory is usually not actually used by
SABnzbd and will be available if required by other apps or the system. More information
can be found in the discussion here: https://github.com/SynoCommunity/spksrc/issues/2856
- SABnzbd is not compatible with some software firewall versions.
The Microsoft Windows Firewall works fine, but remember to tell this
@@ -72,13 +66,3 @@
Config->Special->wait_for_dfolder to 1.
SABnzbd will appear to hang until the drive is mounted.
- On some operating systems it looks like there is a problem with one of the standard Python libraries.
It is possible that you get errors about saving admin files and even unexplained crashes.
If so, you can enable the option for the alternative library.
It has the same functionality, but is slower.
We've had reports about this issue on non-mainstream Linux platforms.
- OpenElec
- Squeeze Linux
There is a "special" option that will allow you to select an alternative library.
use_pickle = 1
See: https://sabnzbd.org/wiki/configuration/2.2/special

View File

@@ -1,7 +1,7 @@
Metadata-Version: 1.0
Name: SABnzbd
Version: 2.2.0RC2
Summary: SABnzbd-2.2.0RC2
Version: 2.3.2
Summary: SABnzbd-2.3.2
Home-page: https://sabnzbd.org
Author: The SABnzbd Team
Author-email: team@sabnzbd.org

View File

@@ -13,7 +13,6 @@ SABnzbd has a good deal of dependencies you'll need before you can get running.
- `python` (only 2.7.x and higher, but not 3.x.x)
- `python-cheetah`
- `python-support`
- `par2` (Multi-threaded par2 installation guide can be found [here](https://sabnzbd.org/wiki/installation/multicore-par2))
- `unrar` (Make sure you get the "official" non-free version of unrar)
- `sabyenc` (installation guide can be found [here](https://sabnzbd.org/sabyenc))

View File

@@ -1,90 +1,51 @@
Release Notes - SABnzbd 2.2.0 Release Candidate 2
Release Notes - SABnzbd 2.3.2
=========================================================
NOTE: Due to changes in this release, the queue will be converted when 2.2.0
is started for the first time. Job order, settings and data will be
preserved, but all jobs will be unpaused and URLs that did not finish
fetching before the upgrade will be lost!
## Changes since 2.3.1
- SABYenc updated to 3.3.2 to fix rare crash during downloading
- Minor updates of SABYenc (such as 3.3.2) are no longer mandatory
- Article Cache is automatically set to 25% of system memory, if no
custom value was set. Maximum set by auto-detect is 1GB
- Simplify Config pages by hiding Advanced Settings
- Added option '%dn' to Date Sorting to rename files as job name
- Added 'Job Name as Folder Name' as Sorting Preset for de-obfuscation
- Server usage graphs are now linked to make comparing servers easier
- URLs that fail to fetch due to server errors will only be retried 10x
- Delay between URL retries increases when not specified by server
- First article of each file is downloaded first to identify filenames
- Jobs finished by Direct Unpack will be post-processed first
- If available, 7zip will be used instead of unzip
- Job password entered by user is always shown in History
- Password is also extracted from filename in case of custom job name
- Add per-day download-statistics to 'server_stats' API-call
- Added Hebrew date-time texts
## Changes since 2.2.0 Release Candidate 1
- Not all RAR files were correctly removed for encrypted downloads
- Better indication of verification process before and after repair
- All par2 files are only downloaded when enabled, not on enable_par_cleanup
- Disk-space is now checked before writing files
- Server usage graphs did not always list all available months
- Warning is shown when many files with duplicate filenames are discarded
- Special characters like []!* in filenames could break repair
- In some cases not all RAR-sets were unpacked
- Categories with ' in them could result in SQL errors
- Faulty pynotify could stop shutdown
- Various CSS fixes in Glitter and the Config
- macOS: Really catch "Protocol wrong type for socket" errors
## Bugfixes since 2.3.1
- Dropped connections could result in stalled downloads
- Pre-queue scripts would fail to run
- Pre-queue script output was not always parsed correctly
- Notifications were always sent for 'Default' category
- 'History Retention' also checked on start of program
- macOS: Restore full compatibility with macOS 10.11
- Windows: Unpacking could fail due to paths not being quoted
- Windows: All input parameters to scripts are now quoted
- Windows: Complete folder in root of drive could crash post-processing
- Windows: Automatically correct 'Extra Par2 Parameters' for MultiPar
- Windows: Prevent potential pause/unpause loop after tray icon click
- NOTE: Option to limit Servers to specific Categories is now scheduled
to be removed in the next release.
## Changes since 2.1.0
- Direct Unpack: Jobs will start unpacking during the download, reduces
post-processing time but requires capable hard drive. Only works for jobs that
do not need repair. Will be enabled if your incomplete folder-speed > 40MB/s
- Reduced memory usage, especially with larger queues
- Graphical overview of server-usage on Servers page
- Notifications can now be limited to certain Categories
- Removed 5 second delay between fetching URLs
- Each item in the Queue and File list now has Move to Top/Bottom buttons
- Add option to only tag a duplicate job without pausing or removing it
- New option "History Retention" to automatically purge jobs from History
- Jobs outside server retention are processed faster
- Obfuscated filenames are renamed during downloading, if possible
- Add "Retry All Failed" button to Glitter
- Smoother animations in Firefox (disabled previously due to FF high-CPU usage)
- Show missing articles in MB instead of number of articles
- Correct value in "Speed" Extra History Column
- Remove video and audio rating icons from Queue
- Show vote buttons instead of video and audio rating buttons in History
- If enabled, replace dots in filenames also when there are spaces already
- Update GNTP bindings to 1.0.3
- max_art_opt and replace_illegal moved from Switches to Specials
- Removed Specials par2_multicore and allow_streaming
- Windows: Full unicode support when calling repair and unpack
- Windows: Move enable_MultiPar to Specials
- Windows: MultiPar verification of a job is skipped after blocks are fetched
- Windows & macOS: removed par2cmdline in favor of par2tbb/MultiPar
## Bugfixes since 2.1.0
- Shutdown/suspend did not work on some Linux systems
- Deleting a job could result in write errors
- Display warning if "Extra par2 parameters" turn out to be wrong
- RSS URLs with commas in the URL were broken
- Fixed some "Saving failed" errors
- Fixed crashing URLGrabber
- Jobs with renamed files are now correctly handled when using Retry
- Disk-space readings could be updated incorrectly
- Correct redirect after enabling HTTPS in the Config
- Fix race-condition in Post-processing
- History would not always show latest changes
- Convert HTML in error messages
- Fixed unicode error during Sorting
- Wizard was always accessible, even with username and password set
- Not all texts were shown in the selected Language
- Catch "error 0" when using HTTPS on some Linux platforms
- Improve zeroconf/bonjour by sending HTTPS setting and auto-discover of IP
- Windows: Fix error in MultiPar-code when first par2-file was damaged
- macOS: Catch "Protocol wrong type for socket" errors
## Translations
- Added Hebrew translation by ION IL, many other languages updated.
## Upgrading from 0.7.x and older
## Upgrading from 2.2.x and older
- Finish queue
- Stop SABnzbd
- Install new version
- Start SABnzbd
## Upgrade notices
- When upgrading from 2.2.0 or older the queue will be converted. Job order,
settings and data will be preserved, but all jobs will be unpaused and
URL's that did not finish fetching before the upgrade will be lost.
- The organization of the download queue is different from 0.7.x releases.
This version will not see the old queue, but you restore the jobs by going
to Status page and use Queue Repair.
This version will not see the 0.7.x queue, but you can restore the jobs
by going to Status page and using Queue Repair.
## Known problems and solutions
- Read the file "ISSUES.txt"

View File

@@ -32,11 +32,13 @@ except:
import logging
import logging.handlers
import traceback
import os
import getopt
import signal
import socket
import platform
import ssl
import time
import re
@@ -85,7 +87,7 @@ import sabnzbd.interface
from sabnzbd.constants import *
import sabnzbd.newsunpack
from sabnzbd.misc import real_path, \
check_latest_version, exit_sab, \
check_latest_version, exit_sab, get_from_url, \
split_host, get_ext, create_https_certificates, \
windows_variant, ip_extract, set_serv_parms, get_serv_parms, globber_full
from sabnzbd.panic import panic_tmpl, panic_port, panic_host, \
@@ -97,7 +99,6 @@ import sabnzbd.downloader
from sabnzbd.encoding import unicoder, deunicode
import sabnzbd.notifier as notifier
import sabnzbd.zconfig
import sabnzbd.utils.sslinfo
from threading import Thread
@@ -150,7 +151,11 @@ class guiHandler(logging.Handler):
# Loose the oldest record
self.store.pop(0)
try:
self.store.append(self.format(record))
# Append traceback, if available
warning = {'type': record.levelname, 'text': record.msg % record.args, 'time': int(time.time())}
if record.exc_info:
warning['text'] = '%s\n%s' % (warning['text'], traceback.format_exc())
self.store.append(warning)
except UnicodeDecodeError:
# Catch elusive Unicode conversion problems
pass
@@ -161,12 +166,6 @@ class guiHandler(logging.Handler):
def count(self):
return len(self.store)
def last(self):
if self.store:
return self.store[len(self.store) - 1]
else:
return ""
def content(self):
""" Return an array with last records """
return self.store
@@ -202,11 +201,11 @@ def print_help():
print " --repair-all Try to reconstruct the queue from the incomplete folder"
print " with full data reconstruction"
print " --https <port> Port to use for HTTPS server"
print " --ipv6_hosting <0|1> Listen on IPv6 address [::1] [*]"
print " --no-login Start with username and password reset"
print " --log-all Log all article handling (for developers)"
print " --console Force console logging for OSX app"
print " --new Run a new instance of SABnzbd"
print " --ipv6_hosting <0|1> Listen on IPv6 address [::1]"
def print_version():
@@ -402,7 +401,7 @@ def print_modules():
""" Log all detected optional or external modules """
if sabnzbd.decoder.SABYENC_ENABLED:
# Yes, we have SABYenc, and it's the correct version, so it's enabled
logging.info("SABYenc module (v%s)... found!", sabnzbd.constants.SABYENC_VERSION_REQUIRED)
logging.info("SABYenc module (v%s)... found!", sabnzbd.decoder.SABYENC_VERSION)
else:
# Something wrong with SABYenc, so let's determine and print what:
if sabnzbd.decoder.SABYENC_VERSION:
@@ -426,10 +425,12 @@ def print_modules():
if sabnzbd.newsunpack.PAR2_COMMAND:
logging.info("par2 binary... found (%s)", sabnzbd.newsunpack.PAR2_COMMAND)
else:
logging.error(T('par2 binary... NOT found!'))
logging.error('%s %s' % (T('par2 binary... NOT found!'), T('Verification and repair will not be possible.')))
if sabnzbd.newsunpack.MULTIPAR_COMMAND:
logging.info("MultiPar binary... found (%s)", sabnzbd.newsunpack.MULTIPAR_COMMAND)
elif sabnzbd.WIN32:
logging.error('%s %s' % (T('MultiPar binary... NOT found!'), T('Verification and repair will not be possible.')))
if sabnzbd.newsunpack.RAR_COMMAND:
logging.info("UNRAR binary... found (%s)", sabnzbd.newsunpack.RAR_COMMAND)
@@ -440,9 +441,9 @@ def print_modules():
want_str = '%.2f' % (float(sabnzbd.constants.REC_RAR_VERSION) / 100)
logging.warning(T('Your UNRAR version is %s, we recommend version %s or higher.<br />') % (have_str, want_str))
elif not (sabnzbd.WIN32 or sabnzbd.DARWIN):
logging.debug('UNRAR binary version %.2f', (float(sabnzbd.newsunpack.RAR_VERSION) / 100))
logging.info('UNRAR binary version %.2f', (float(sabnzbd.newsunpack.RAR_VERSION) / 100))
else:
logging.error(T('unrar binary... NOT found'))
logging.error('%s %s' % (T('unrar binary... NOT found'), T('Downloads will not unpacked.')))
if sabnzbd.newsunpack.ZIP_COMMAND:
logging.info("unzip binary... found (%s)", sabnzbd.newsunpack.ZIP_COMMAND)
@@ -656,7 +657,7 @@ def is_sabnzbd_running(url):
url = '%s&mode=version' % (url)
# Do this without certificate verification, few installations will have that
prev = sabnzbd.set_https_verification(False)
ver = sabnzbd.newsunpack.get_from_url(url)
ver = get_from_url(url)
sabnzbd.set_https_verification(prev)
return (ver and (re.search(r'\d+\.\d+\.', ver) or ver.strip() == sabnzbd.__version__))
except:
@@ -820,7 +821,7 @@ def main():
logging_level = None
web_dir = None
vista_plus = False
vista64 = False
win64 = False
repair = 0
api_url = None
no_login = False
@@ -945,8 +946,8 @@ def main():
# Detect Windows variant
if sabnzbd.WIN32:
vista_plus, vista64 = windows_variant()
sabnzbd.WIN64 = vista64
vista_plus, win64 = windows_variant()
sabnzbd.WIN64 = win64
if not SQLITE_DLL:
panic_sqlite(sabnzbd.MY_FULLNAME)
@@ -1025,7 +1026,7 @@ def main():
pass
else:
if not url:
url = 'https://%s:%s/sabnzbd/api?' % (browserhost, port)
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():
@@ -1054,7 +1055,7 @@ def main():
pass
else:
if not url:
url = 'http://%s:%s/sabnzbd/api?' % (browserhost, cherryport)
url = 'http://%s:%s%s/api?' % (browserhost, cherryport, 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():
@@ -1149,14 +1150,12 @@ def main():
logging.info('Full executable path = %s', sabnzbd.MY_FULLNAME)
if sabnzbd.WIN32:
suffix = ''
if vista_plus:
suffix = ' (=Vista+)'
if vista64:
suffix = ' (=Vista+ x64)'
if win64:
suffix = '(win64)'
try:
logging.info('Platform=%s%s Class=%s', platform.platform(), suffix, os.name)
logging.info('Platform = %s %s', platform.platform(), suffix)
except:
logging.info('Platform=%s <unknown> Class=%s', suffix, os.name)
logging.info('Platform = %s <unknown>', suffix)
else:
logging.info('Platform = %s', os.name)
logging.info('Python-version = %s', sys.version)
@@ -1174,7 +1173,24 @@ def main():
if not sabnzbd.WIN32 and not sabnzbd.DARWIN and not ('utf' in preferredencoding.lower() and '8' in preferredencoding.lower()):
logging.warning(T("SABnzbd was started with encoding %s, this should be UTF-8. Expect problems with Unicoded file and directory names in downloads.") % preferredencoding)
# SSL Information
logging.info("SSL version = %s", ssl.OPENSSL_VERSION)
# Load (extra) certificates in the binary distributions
if hasattr(sys, "frozen") and (sabnzbd.WIN32 or sabnzbd.DARWIN):
# The certifi package brings the latest certificates on build
# This will cause the create_default_context to load it automatically
os.environ["SSL_CERT_FILE"] = os.path.join(sabnzbd.DIR_PROG, 'cacert.pem')
logging.info('Loaded additional certificates from %s', os.environ["SSL_CERT_FILE"])
# Extra startup info
if sabnzbd.cfg.log_level() > 1:
# List the number of certificates available (can take up to 1.5 seconds)
if sabnzbd.HAVE_SSL_CONTEXT:
ctx = ssl.create_default_context()
logging.debug('Available certificates: %s', repr(ctx.cert_store_stats()))
# Show IPv4/IPv6 address
from sabnzbd.getipaddress import localipv4, publicipv4, ipv6
mylocalipv4 = localipv4()
@@ -1199,12 +1215,12 @@ def main():
from sabnzbd.utils.getperformance import getpystone, getcpu
pystoneperf = getpystone()
if pystoneperf:
logging.debug('CPU Pystone available performance is %s', pystoneperf)
logging.debug('CPU Pystone available performance = %s', pystoneperf)
else:
logging.debug('CPU Pystone available performance could not be calculated')
cpumodel = getcpu() # Linux only
if cpumodel:
logging.debug('CPU model name is %s', cpumodel)
logging.debug('CPU model = %s', cpumodel)
logging.info('Read INI file %s', inifile)
@@ -1248,12 +1264,9 @@ def main():
# Find external programs
sabnzbd.newsunpack.find_programs(sabnzbd.DIR_PROG)
print_modules()
logging.info("SSL version %s", sabnzbd.utils.sslinfo.ssl_version())
logging.info("SSL supported protocols %s", str(sabnzbd.utils.sslinfo.ssl_protocols_labels()))
# HTTPS certificate generation
https_cert = sabnzbd.cfg.https_cert.get_path()
https_key = sabnzbd.cfg.https_key.get_path()
https_chain = sabnzbd.cfg.https_chain.get_path()
@@ -1269,6 +1282,7 @@ def main():
logging.warning(T('Disabled HTTPS because of missing CERT and KEY files'))
enable_https = False
# Starting of the webserver
# Determine if this system has multiple definitions for 'localhost'
hosts = all_localhosts()
multilocal = len(hosts) > 1 and cherryhost in ('localhost', '0.0.0.0')
@@ -1321,6 +1335,7 @@ def main():
'server.socket_port': cherryport,
'server.shutdown_timeout': 0,
'log.screen': False,
'engine.timeout_monitor.on': False,
'engine.autoreload.on': False,
'tools.encode.on': True,
'tools.gzip.on': True,
@@ -1357,7 +1372,7 @@ def main():
# Make available from both URLs
main_page = sabnzbd.interface.MainPage()
cherrypy.tree.mount(main_page, '/', config=appconfig)
cherrypy.tree.mount(main_page, '/sabnzbd/', config=appconfig)
cherrypy.tree.mount(main_page, sabnzbd.cfg.url_base(), config=appconfig)
# Set authentication for CherryPy
sabnzbd.interface.set_auth(cherrypy.config)
@@ -1375,21 +1390,14 @@ def main():
# Wait for server to become ready
cherrypy.engine.wait(cherrypy.process.wspbus.states.STARTED)
# Bonjour needs a ip. Lets try to find it.
try:
z_host = socket.gethostbyname(socket.gethostname())
except socket.gaierror:
z_host = cherryhost
sabnzbd.zconfig.set_bonjour(z_host, cherryport)
# Window Service support
mail = None
if sabnzbd.WIN32:
if enable_https:
mode = 's'
else:
mode = ''
api_url = 'http%s://%s:%s/sabnzbd/api?apikey=%s' % (mode, browserhost, cherryport, sabnzbd.cfg.api_key())
api_url = 'http%s://%s:%s%s/api?apikey=%s' % (mode, browserhost, cherryport, sabnzbd.cfg.url_base(), sabnzbd.cfg.api_key())
if sabnzbd.WIN_SERVICE:
mail = MailSlot()
@@ -1422,9 +1430,9 @@ def main():
# Set URL for browser
if enable_https:
browser_url = "https://%s:%s/sabnzbd" % (browserhost, cherryport)
browser_url = "https://%s:%s%s" % (browserhost, cherryport, sabnzbd.cfg.url_base())
else:
browser_url = "http://%s:%s/sabnzbd" % (browserhost, cherryport)
browser_url = "http://%s:%s%s" % (browserhost, cherryport, sabnzbd.cfg.url_base())
sabnzbd.BROWSER_URL = browser_url
if not autorestarted:
@@ -1438,6 +1446,13 @@ def main():
check_latest_version()
autorestarted = False
# ZeroConfig/Bonjour needs a ip. Lets try to find it.
try:
z_host = socket.gethostbyname(socket.gethostname())
except socket.gaierror:
z_host = cherryhost
sabnzbd.zconfig.set_bonjour(z_host, cherryport)
# Have to keep this running, otherwise logging will terminate
timer = 0
while not sabnzbd.SABSTOP:
@@ -1686,9 +1701,8 @@ if __name__ == '__main__':
main()
elif getattr(sys, 'frozen', None) == 'macosx_app':
# OSX binary
try:
# OSX binary runner
from PyObjCTools import AppHelper
from sabnzbd.osxmenu import SABnzbdDelegate
@@ -1713,9 +1727,7 @@ if __name__ == '__main__':
sabApp = startApp()
sabApp.start()
AppHelper.runEventLoop()
except:
main()
else:
main()

6
appveyor.yml Normal file
View File

@@ -0,0 +1,6 @@
install:
- pip install --upgrade -r tests/requirements.txt
- pip install pypiwin32 subprocessww
build_script:
- pytest

View File

@@ -596,7 +596,7 @@ class MemcachedSession(Session):
# Wrap all .get and .set operations in a single lock.
mc_lock = threading.RLock()
# This is a seperate set of locks per session id.
# This is a separate set of locks per session id.
locks = {}
servers = ['127.0.0.1:11211']

View File

@@ -98,6 +98,12 @@ class BuiltinSSLAdapter(wsgiserver.SSLAdapter):
# The connection can safely be dropped.
return None, {}
raise
except:
# Temporary fix for https://github.com/cherrypy/cherrypy/issues/1618
e = sys.exc_info()[1]
if e.args == (0, 'Error'):
return None, {}
raise
return s, self.get_environ(s)
# TODO: fill this out more with mod ssl env

View File

@@ -1,16 +0,0 @@
import six
import mock
from cherrypy import wsgiserver
class TestWSGIGateway_u0:
@mock.patch('cherrypy.wsgiserver.WSGIGateway_10.get_environ',
lambda self: {'foo': 'bar'})
def test_decodes_items(self):
req = mock.MagicMock(path=b'/', qs=b'')
gw = wsgiserver.WSGIGateway_u0(req=req)
env = gw.get_environ()
assert env['foo'] == 'bar'
assert isinstance(env['foo'], six.text_type)

View File

@@ -45,6 +45,7 @@
// Information we need
var sabSession = '$session';
var rootURL = '${root}'
var urlBase = '${url_base}'
var folderBrowseUrl = '${root}tapi?mode=browse&output=json&apikey=$session';
var folderSeperator = '#if $os.sep == '\\' then '\\\\' else '/'#'
@@ -61,7 +62,7 @@
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="${root}staticcfg/js/jquery-3.1.1.min.js?v=$version"></script>
<script type="text/javascript" src="${root}staticcfg/js/jquery-3.2.1.min.js?v=$version"></script>
<script type="text/javascript" src="${root}staticcfg/bootstrap/js/bootstrap.min.js?v=$version"></script>
<script type="text/javascript" src="${root}staticcfg/js/script.js?v=$version"></script>
<script type="text/javascript">

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Config"#-->
<!--#set global $help_uri="configuration/2.2/configure"#-->
<!--#set global $help_uri="configuration/2.3/configure"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--#from locale import getpreferredencoding#-->
@@ -30,7 +30,7 @@
<tr>
<th scope="row">OpenSSL:</th>
<td>
$ssl_version &nbsp; [$ssl_protocols]
$ssl_version
</td>
</tr>
<!--#if not $have_ssl_context#-->
@@ -81,7 +81,7 @@
</td>
</tr>
<!--#end if#-->
<!--#if not $have_unzip #-->
<!--#if not $have_unzip and not $have_7zip #-->
<tr>
<th scope="row">$T('opt-enable_unzip'):</th>
<td>

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Categories"#-->
<!--#set global $help_uri="configuration/2.2/categories"#-->
<!--#set global $help_uri="configuration/2.3/categories"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="section">

View File

@@ -1,8 +1,13 @@
<!--#set global $pane="Folders"#-->
<!--#set global $help_uri="configuration/2.2/folders"#-->
<!--#set global $help_uri="configuration/2.3/folders"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="padding alt section">
<label for="advanced-settings-button" class="form-control advanced-button ">
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
</div>
<form action="saveDirectories" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="session" name="session" value="$session" />
<input type="hidden" id="ajax" name="ajax" value="1" />
@@ -21,7 +26,7 @@
<input type="text" name="download_dir" id="download_dir" value="$download_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-download_dir')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="download_free">$T('opt-download_free')</label>
<input type="text" name="download_free" id="download_free" value="$download_free" class="smaller_input" />
<span class="desc">$T('explain-download_free')</span>
@@ -32,7 +37,7 @@
<span class="desc">$T('explain-complete_dir')</span>
</div>
<!--#if not $nt#-->
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="permissions">$T('opt-permissions')</label>
<input type="text" name="permissions" id="permissions" value="$permissions" class="smaller_input" />
<span class="desc">$T('explain-permissions')</span>
@@ -43,7 +48,7 @@
<input type="text" name="dirscan_dir" id="dirscan_dir" value="$dirscan_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-dirscan_dir')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="dirscan_speed">$T('opt-dirscan_speed')</label>
<input type="number" name="dirscan_speed" id="dirscan_speed" value="$dirscan_speed" min="0" max="3600" />
<span class="desc">$T('explain-dirscan_speed')</span>
@@ -53,12 +58,12 @@
<input type="text" name="script_dir" id="script_dir" value="$script_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-script_dir')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="email_dir">$T('opt-email_dir')</label>
<input type="text" name="email_dir" id="email_dir" value="$email_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-email_dir')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="password_file">$T('opt-password_file')</label>
<input type="text" name="password_file" id="password_file" value="$password_file" />
<span class="desc">$T('explain-password_file')</span>
@@ -72,7 +77,7 @@
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="section advanced-settings">
<div class="col2">
<h3>$T('systemFolders') <a href="$helpuri$help_uri#toc1" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
<p>$T('explain-folderConfig')</p>

View File

@@ -1,9 +1,14 @@
<!--#set global $pane="General"#-->
<!--#set global $help_uri="configuration/2.2/general"#-->
<!--#set global $help_uri="configuration/2.3/general"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<form action="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off" novalidate>
<div class="padding alt section">
<label for="advanced-settings-button" class="form-control advanced-button ">
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
</div>
<form action="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="session" name="session" value="$session" />
<input type="hidden" id="ajax" name="ajax" value=1 />
<div class="section">
@@ -28,7 +33,7 @@
<input type="checkbox" name="enable_https" id="enable_https" value="1" <!--#if int($enable_https) > 0 then 'checked="checked" data-original="1"' else ""#-->/>
<span class="desc">$T('explain-enable_https')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="web_dir">$T('opt-web_dir')</label>
<select name="web_dir" id="web_dir">
<!--#for $webline in $web_list#-->
@@ -89,7 +94,6 @@
<div class="field-pair">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default sabnzbd_restart"><span class="glyphicon glyphicon-refresh"></span> $T('button-restart') SABnzbd</button>
<button class="btn btn-default advancedButton enable_https_options"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
</div>
</fieldset>
</div>
@@ -173,7 +177,7 @@
</select>
<span class="desc">$T('explain-check_new_rel')</span>
</div>
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#-->">
<div class="field-pair advanced-settings <!--#if int($have_ssl_context) == 0 then "disabled" else ""#-->">
<label class="config" for="enable_https_verification">$T('opt-enable_https_verification')</label>
<input type="checkbox" name="enable_https_verification" id="enable_https_verification" value="1" <!--#if int($enable_https_verification) > 0 then 'checked="checked"' else ""#--> <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#--> />
<span class="desc">$T('explain-enable_https_verification')</span>
@@ -200,12 +204,12 @@
</select>
<input type="hidden" name="bandwidth_max" id="bandwidth_max" value="$bandwidth_max" />
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="bandwidth_perc">$T('opt-bandwidth_perc')</label>
<input type="number" name="bandwidth_perc" id="bandwidth_perc" value="$bandwidth_perc" step="10" min="0" max="100"/>
<span class="desc">$T('explain-bandwidth_perc')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="cache_limit">$T('opt-cache_limitstr')</label>
<input type="text" name="cache_limit" id="cache_limit" value="$cache_limit" class="smaller_input" />
<span class="desc">$T('explain-cache_limitstr').replace("64M", "256M").replace("128M", "512M")</span>
@@ -253,6 +257,32 @@
})
hideOrShowTranslate()
// Highlight in case user is not safe
// So when exposed to internet and no password, no external limit or no username/password
var safeCheck = \$('#host, #local_ranges, #inet_exposure, #${pid}_wu, #${pid}_wp')
function checkSafety() {
if(\$('#host').val() != 'localhost' && \$('#host').val() != '127.0.0.1') {
// No limitation on local-network
if(!\$('#local_ranges').val() || \$('#inet_exposure').val() > 3) {
// And no username and password?
if(!\$('#${pid}_wu').val() || !\$('#${pid}_wp').val()) {
// Add warning icon if not there already
if(!\$('.host-warning').length) {
safeCheck.after('<span class="glyphicon glyphicon-alert host-warning"></span>')
\$('.host-warning').tooltip({'title': '$T('checkSafety')'})
}
return
}
}
}
// Remove warnings
\$('.host-warning').remove()
safeCheck.removeClass('host-warning-highlight')
}
checkSafety()
safeCheck.on('change', checkSafety)
// Click functions
\$('#apikey, #nzbkey').click(function () { \$(this).select() });
\$('#generate_new_apikey').click(function () {
@@ -330,7 +360,6 @@
}
}
// Update the value
\$('#bandwidth_max_value, #bandwidth_max_dropdown').on('change', function() {
if(\$('#bandwidth_max_value').val()) {

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Email"#-->
<!--#set global $help_uri="configuration/2.2/notifications"#-->
<!--#set global $help_uri="configuration/2.3/notifications"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--#def show_notify_checkboxes($section_label)#-->
@@ -26,7 +26,7 @@
<!--#end def#-->
<div class="colmask">
<form action="saveEmail" method="post" name="fullform" class="fullform" autocomplete="off" novalidate>
<form action="saveEmail" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="session" name="session" value="$session" />
<input type="hidden" id="ajax" name="ajax" value="1" />
<div class="section" id="email">
@@ -91,7 +91,7 @@
<input type="text" name="email_pwd" id="email_pwd" value="$email_pwd" />
<span class="desc">$T('explain-email_pwd')</span>
</div>
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_email" rel="$T('askTestEmail')"><span class="glyphicon glyphicon-envelope"></span> $T('link-testEmail')</button>
</div>
@@ -115,7 +115,7 @@
<div class="col1" <!--#if int($ncenter_enable) > 0 then '' else 'style="display:none"'#-->>
<fieldset>
$show_notify_checkboxes('ncenter')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_notif"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -141,7 +141,7 @@
<div class="col1" <!--#if int($acenter_enable) > 0 then '' else 'style="display:none"'#-->>
<fieldset>
$show_notify_checkboxes('acenter')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_windows"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -167,7 +167,7 @@
<div class="col1" <!--#if int($ntfosd_enable) > 0 then '' else 'style="display:none"'#-->>
<fieldset>
$show_notify_checkboxes('ntfosd')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_osd"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -207,7 +207,7 @@
<span class="desc">$T('Optional') - $T('explain-nscript_parameters')</span>
</div>
$show_notify_checkboxes('nscript')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_nscript"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -241,7 +241,7 @@
<span class="desc">$T('explain-growl_password')</span>
</div>
$show_notify_checkboxes('growl')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_growl"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -286,7 +286,7 @@
</select>
</div>
<!--#end for#-->
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_prowl"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -326,6 +326,16 @@
<input type="text" name="pushover_device" id="pushover_device" value="$pushover_device" />
<span class="desc">$T('explain-pushover_device')</span>
</div>
<div class="field-pair">
<label class="config" for="pushover_emergency_retry">$T('opt-pushover_emergency_retry')</label>
<input type="text" name="pushover_emergency_retry" id="pushover_emergency_retry" value="$pushover_emergency_retry" />
<span class="desc">$T('explain-pushover_emergency_retry')</span>
</div>
<div class="field-pair">
<label class="config" for="pushover_emergency_expire">$T('opt-pushover_emergency_expire')</label>
<input type="text" name="pushover_emergency_expire" id="pushover_emergency_expire" value="$pushover_emergency_expire" />
<span class="desc">$T('explain-pushover_emergency_expire')</span>
</div>
<!--#set $section_label = 'pushover'#-->
<!--#for $type in $notify_keys#-->
<div class="field-pair">
@@ -342,7 +352,7 @@
</select>
</div>
<!--#end for#-->
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_pushover"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -379,7 +389,7 @@
</div>
<!--#end if#-->
$show_notify_checkboxes('pushbullet')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_pushbullet"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -407,6 +417,7 @@
\$(this).parents('.col2').find('.col2-cats').hide()
}
\$('form').submit()
addRowColor()
})
\$('#email_endjob').change(function() {
if(\$(this).val() > 0) {

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="RSS"#-->
<!--#set global $help_uri="configuration/2.2/rss"#-->
<!--#set global $help_uri="configuration/2.3/rss"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<!--#if not $active_feed#-->
@@ -7,7 +7,7 @@
<div class="padTable">
<a class="main-helplink" href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a>
<p>$T('explain-RSS')</p>
<form action="add_rss_feed" method="post" autocomplete="off" novalidate>
<form action="add_rss_feed" method="post" autocomplete="off">
<input type="hidden" name="session" value="$session" />
<table class="catTable">
<tr>
@@ -37,7 +37,7 @@
<!--#if $rss#-->
<div class="section">
<div class="padTable">
<form action="save_rss_feed" method="post" autocomplete="off" novalidate>
<form action="save_rss_feed" method="post" autocomplete="off">
<input type="hidden" name="session" value="$session" />
<table id="subscriptions">
<tbody>
@@ -73,7 +73,7 @@
</form>
<!--#if $feeds#-->
<br/>
<form action="rss_now" method="post" autocomplete="off" novalidate>
<form action="rss_now" method="post" autocomplete="off">
<input type="hidden" name="session" value="$session" />
<button type="submit" class="btn btn-default readAll"><span class="glyphicon glyphicon-sort"></span> $T('button-rssNow')</button>
</form>
@@ -154,7 +154,7 @@
<option value=">"> $T('rss-atleast')</option>
<option value="<"> $T('rss-atmost')</option>
<option value="F"> $T('rss-from')</option>
<option value="F"> $T('rss-from-show')</option>
<option value="F"> $T('rss-from-show') ($T('rss-accept'))</option>
</select>
</td>
<td>
@@ -226,8 +226,8 @@
<option value="C"> $T('rss-mustcat')</option>
<option value=">"> $T('rss-atleast')</option>
<option value="<"> $T('rss-atmost')</option>
<option value="S"> $T('rss-from-show')</option>
<option value="F"> $T('rss-from')</option>
<option value="S"> $T('rss-from-show') ($T('rss-accept'))</option>
</select>
</td>
<td>
@@ -287,7 +287,7 @@
<input type="hidden" name="feed" value="$feed" />
<table class="catTable">
<tbody>
<tr class="<!--#if $odd then " alt " else " "#--> <!--#if $filter[3]!="A" then 'disabled_options_rule' else ""#-->">
<tr class="<!--#if $odd then " alt " else " "#--> <!--#if $filter[3]!="A" and $filter[3]!="S" then 'disabled_options_rule' else ""#-->">
<td>
<input type="checkbox" name="enabled" value="1" <!--#if $filter[6]=='1' then 'checked="checked"' else ""#--> />
</td>
@@ -302,8 +302,8 @@
<option value="C" <!--#if $filter[3]=="C" then 'selected="selected"' else ""#-->> $T('rss-mustcat')</option>
<option value=">" <!--#if $filter[3]==">" then 'selected="selected"' else ""#-->> $T('rss-atleast')</option>
<option value="<" <!--#if $filter[3]=="<" then 'selected="selected"' else ""#-->> $T('rss-atmost')</option>
<option value="S" <!--#if $filter[3]=="S" then 'selected="selected"' else ""#-->> $T('rss-from-show')</option>
<option value="F" <!--#if $filter[3]=="F" then 'selected="selected"' else ""#-->> $T('rss-from')</option>
<option value="S" <!--#if $filter[3]=="S" then 'selected="selected"' else ""#-->> $T('rss-from-show') ($T('rss-accept'))</option>
</select>
</td>
<td>
@@ -568,7 +568,7 @@ function urlencode(str) {
// Only the Accept filter needs all the options
\$('form[action="upd_rss_filter"]').find('select[name="filter_type"]').change(function() {
\$(this).parent().parent().find('select:not([name="filter_type"])').attr('disabled', \$(this).val() != "A")
\$(this).parent().parent().find('select:not([name="filter_type"])').attr('disabled', \$(this).val() != "A" && \$(this).val() != "S")
})
// Trigger on-load for all
\$('.disabled_options_rule').find('td select:not([name="filter_type"])').attr('disabled', true)

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Scheduling"#-->
<!--#set global $help_uri="configuration/2.2/scheduling"#-->
<!--#set global $help_uri="configuration/2.3/scheduling"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<%
@@ -59,6 +59,13 @@ else:
<option value="$server" data-action="0" data-noarg="1">$T('sch-disable_server') "$actions_servers[$server]"</option>
<!--#end for#-->
</optgroup>
<optgroup label="$T('cmenu-cat')">
<!--#for $cat in $categories#-->
<!--#set $cat_text = $T('Default') if $cat == '*' else $cat#-->
<option value="pause_cat" data-action="$cat" data-noarg="1">$T('sch-pause_cat') "$cat_text"</option>
<option value="resume_cat" data-action="$cat" data-noarg="1">$T('sch-resume_cat') "$cat_text"</option>
<!--#end for#-->
</optgroup>
</select>
</div>
<div class="field-pair" id="hidden_arguments" style="display: none">

View File

@@ -1,119 +1,299 @@
<!--#set global $pane="Servers"#-->
<!--#set global $help_uri="configuration/2.2/servers"#-->
<!--#set global $help_uri="configuration/2.3/servers"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--
We need to find how many months we have recorded so far, so we
loop over all the dates to find the lowest value and then use
this to calculate the date-selector and maximum value per month.
-->
<!--#import json#-->
<!--#import datetime#-->
<!--#import sabnzbd.misc#-->
<!--#set month_names = [$T('January'), $T('February'), $T('March'), $T('April'), $T('May'), $T('June'), $T('July'), $T('August'), $T('September'), $T('October'), $T('November'), $T('December')] #-->
<!--#set min_date = datetime.date.today()#-->
<!--#set max_data_all = {}#-->
<!--#for $server in $servers #-->
<!--#if 'amounts' in $server#-->
<!--#set max_data_server = {}#-->
<!--#for date in $server['amounts'][4]#-->
<!--#set split_date = $date.split('-')#-->
<!--#set min_date = min(min_date, datetime.date(int(split_date[0]), int(split_date[1]), 1))#-->
<!--#set month_date = $date[:7]#-->
<!--#if $month_date not in $max_data_server#-->
<!--#set max_data_server[$month_date] = 0#-->
<!--#end if#-->
<!--#set max_data_server[$month_date] = max(max_data_server[$month_date], $server['amounts'][4][$date])#-->
<!--#end for#-->
<!--#for month_date in max_data_server#-->
<!--#if $month_date not in $max_data_all#-->
<!--#set max_data_all[$month_date] = 0#-->
<!--#end if#-->
<!--#set max_data_all[$month_date] = max(max_data_all[$month_date], max_data_server[$month_date])#-->
<!--#end for#-->
<!--#end if#-->
<!--#end for#-->
<!--#set months_recorded = list(sabnzbd.misc.monthrange(min_date, datetime.date.today()))#-->
<!--#$months_recorded.reverse()#-->
<script type="text/javascript">
// Define variable needed for the server-plots
var serverData = {}
</script>
<div class="colmask">
<form action="addServer" method="post" autocomplete="off" onsubmit="removeObfuscation();" novalidate>
<input type="hidden" name="session" value="$session" />
<div id="addServer">
<div class="padding alt">
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
<div class="padding alt section">
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
<label for="advanced-settings-button" class="form-control advanced-button ">
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
<!--#if $months_recorded#-->
<div class="advanced-buttonSeperator"></div>
<div class="chart-selector-container" title="$T('srv-bandwidth')">
<span class="glyphicon glyphicon-signal"></span>
<select name="chart-selector" id="chart-selector">
<!--#for $cur_date in months_recorded#-->
<!--#set month_date = '%d-%02d' % ($cur_date.year, $cur_date.month)#-->
<!--#if $month_date not in $max_data_all#-->
<!--#set max_data_all[$month_date] = 0#-->
<!--#end if#-->
<option value="$month_date" data-max="$max_data_all[$month_date]">$month_names[$cur_date.month-1] $cur_date.year</option>
<!--#end for#-->
</select>
</div>
<!--#end if#-->
</div>
<div class="section" id="addServerContent" style="display: none;">
<div class="col2">
<h3>$T('addServer') <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
</div><!-- /col2 -->
</div>
<div class="col1">
<fieldset>
<div class="field-pair">
<label class="config" for="enable">$T('srv-enable')</label>
<input type="checkbox" name="enable" id="enable" value="1" checked="checked" />
<span class="desc">$T('srv-enable')</span>
<form action="addServer" method="post" autocomplete="off" onsubmit="removeObfuscation();">
<input type="hidden" name="session" value="$session" />
<fieldset>
<div class="field-pair">
<label class="config" for="enable">$T('srv-enable')</label>
<input type="checkbox" name="enable" id="enable" value="1" checked="checked" />
<span class="desc">$T('srv-enable')</span>
</div>
<div class="field-pair">
<label class="config" for="host">$T('srv-host')</label>
<input type="text" name="host" id="host" required />
</div>
<div class="field-pair">
<label class="config" for="port">$T('srv-port')</label>
<input type="number" name="port" id="port" size="8" value="119" min="0" />
</div>
<div class="field-pair">
<label class="config" for="ssl">$T('srv-ssl')</label>
<input type="checkbox" name="ssl" id="ssl" value="1" />
<span class="desc">$T('explain-ssl')</span>
</div>
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
<div class="field-pair">
<label class="config" for="${pid}_00">$T('srv-username')</label>
<input type="text" name="${pid}_00" id="${pid}_00" data-hide="username" />
</div>
<div class="field-pair">
<label class="config" for="${pid}_01">$T('srv-password')</label>
<input type="text" name="${pid}_01" id="${pid}_01" data-hide="password" />
</div>
<div class="field-pair">
<label class="config" for="connections">$T('srv-connections')</label>
<input type="number" name="connections" id="connections" min="1" max="100" value="8" required />
</div>
<div class="field-pair">
<label class="config" for="priority">$T('srv-priority')</label>
<input type="number" name="priority" id="priority" min="0" max="99" /> <i>$T('explain-svrprio')</i>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="retention">$T('srv-retention')</label>
<input type="number" name="retention" id="retention" min="0" /> <i>$T('days')</i>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="timeout">$T('srv-timeout')</label>
<input type="number" name="timeout" id="timeout" min="20" max="240" /> <i>$T('seconds')</i>
</div>
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
<label class="config" for="ssl_verify">$T('opt-ssl_verify')</label>
<select name="ssl_verify" id="ssl_verify" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
<option value="2" selected>$T('ssl_verify-strict')</option>
<option value="1">$T('ssl_verify-normal')</option>
<option value="0">$T('ssl_verify-disabled')</option>
</select>
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="send_group">$T('srv-send_group')</label>
<input type="checkbox" name="send_group" id="send_group" value="1" />
<span class="desc">$T('srv-explain-send_group')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="optional">$T('srv-optional')</label>
<input type="checkbox" name="optional" id="optional" value="1" />
<span class="desc">$T('explain-optional')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="displayname">$T('srv-displayname')</label>
<input type="text" name="displayname" id="displayname" />
</div>
<div class="field-pair advanced-settings">
<label class="config" for="notes">$T('srv-notes')</label>
<textarea name="notes" id="notes" rows="3" cols="50"></textarea>
</div>
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
</div>
<div class="field-pair result-box">
<div class="alert"></div>
</div>
</fieldset>
</form>
</div>
</div>
<!--#set $prio_colors = ["#59cc33", "#3366cc","#7f33cc", "#cc33a6", "#cc3333"] #-->
<!--#set $cur_prio_color = -1 #-->
<!--#set $last_prio = -1 #-->
<!--#for $cur, $server in enumerate($servers) #-->
<form action="saveServer" method="post" class="fullform" autocomplete="off">
<input type="hidden" name="session" value="$session" />
<input type="hidden" name="server" value="$server['name']" />
<div class="section <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
<div class="col2 <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
<h3>$server['displayname'] <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
<!--#if int($server['enable']) != 0 #-->
<!--#if $last_prio != $server['priority'] and $cur_prio_color+1 < len($prio_colors) #-->
<!--#set $cur_prio_color = $cur_prio_color+1 #-->
<!--#set $last_prio = $server['priority'] #-->
<!--#end if#-->
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$server['priority']</span>
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$T('srv-priority'):</span>
<!--#end if#-->
<table>
<tr>
<td><input type="checkbox" class="toggleServerCheckbox" id="enable_$cur" name="$server['name']" value="1" <!--#if int($server['enable']) != 0 then 'checked="checked"' else ""#--> /></td>
<td><label for="enable_$cur">$T('enabled')</label></td>
</tr>
</table>
<button type="button" class="btn btn-default showserver"><span class="glyphicon glyphicon-pencil"></span> $T('showDetails')</button>
<button type="button" class="btn btn-default clrServer"><span class="glyphicon glyphicon-remove"></span> $T('button-clrServer')</button>
</div>
<div class="field-pair">
<label class="config" for="host">$T('srv-host')</label>
<input type="text" name="host" id="host" />
<div class="col1" style="display:none;">
<input type="hidden" name="enable" id="enable$cur" value="$int($server['enable'])" />
<fieldset>
<div class="field-pair">
<label class="config" for="host$cur">$T('srv-host')</label>
<input type="text" name="host" id="host$cur" value="$server['host']" required />
</div>
<div class="field-pair">
<label class="config" for="port$cur">$T('srv-port')</label>
<input type="number" name="port" id="port$cur" value="$server['port']" size="8" min="0" required />
</div>
<div class="field-pair">
<label class="config" for="ssl$cur">$T('srv-ssl')</label>
<input type="checkbox" name="ssl" id="ssl$cur" value="1" <!--#if int($server['ssl']) != 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-ssl')</span>
</div>
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
<div class="field-pair">
<label class="config" for="${pid}_${cur}0">$T('srv-username')</label>
<input type="text" name="${pid}_${cur}0" id="${pid}_${cur}0" value="$server['username']" data-hide="username" />
</div>
<div class="field-pair">
<label class="config" for="${pid}_${cur}1">$T('srv-password')</label>
<input type="text" name="${pid}_${cur}1" id="${pid}_${cur}1" value="$server['password']" data-hide="password" />
</div>
<div class="field-pair">
<label class="config" for="connections$cur">$T('srv-connections')</label>
<input type="number" name="connections" id="connections$cur" value="$server['connections']" min="1" max="100" required />
</div>
<div class="field-pair">
<label class="config" for="priority$cur">$T('srv-priority')</label>
<input type="number" name="priority" id="priority$cur" value="$server['priority']" min="0" max="99" required /> <i>$T('explain-svrprio')</i>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="retention$cur">$T('srv-retention')</label>
<input type="number" name="retention" id="retention$cur" value="$server['retention']" min="0" required /> <i>$T('days')</i>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="timeout$cur">$T('srv-timeout')</label>
<input type="number" name="timeout" id="timeout$cur" value="$server['timeout']" min="20" max="240" required /> <i>$T('seconds')</i>
</div>
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
<label class="config" for="ssl_verify$cur">$T('opt-ssl_verify')</label>
<select name="ssl_verify" id="ssl_verify$cur" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
<option value="2" <!--#if $server['ssl_verify'] == 2 then 'selected="selected"' else ""#--> >$T('ssl_verify-strict')</option>
<option value="1" <!--#if $server['ssl_verify'] == 1 then 'selected="selected"' else ""#--> >$T('ssl_verify-normal')</option>
<option value="0" <!--#if $server['ssl_verify'] == 0 then 'selected="selected"' else ""#--> >$T('ssl_verify-disabled')</option>
</select>
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="optional$cur">$T('srv-optional')</label>
<input type="checkbox" name="optional" id="optional$cur" value="1" <!--#if int($server['optional']) != 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-optional')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="send_group$cur">$T('srv-send_group')</label>
<input type="checkbox" name="send_group" id="send_group$cur" value="1" <!--#if int($server['send_group']) != 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('srv-explain-send_group')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="displayname$cur">$T('srv-displayname')</label>
<input type="text" name="displayname" id="displayname$cur" value="$server['displayname']" />
</div>
<div class="field-pair advanced-settings">
<label class="config" for="notes$cur">$T('srv-notes')</label>
<textarea name="notes" id="notes$cur" rows="3" cols="50">$server['notes']</textarea>
</div>
<div class="field-pair">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
<button class="btn btn-default delServer"><span class="glyphicon glyphicon-trash"></span> $T('button-delServer')</button>
</div>
<div class="field-pair result-box">
<div class="alert"></div>
</div>
</fieldset>
</div>
<div class="field-pair">
<label class="config" for="port">$T('srv-port')</label>
<input type="number" name="port" id="port" size="8" value="119" />
<div class="col1" style="display:block;">
<!--#if 'amounts' in $server#-->
<div class="server-amounts-text">
<b>$T('srv-bandwidth'):</b><br/>
$T('total'): $(server['amounts'][0])B<br/>
$T('today'): $(server['amounts'][3])B<br/>
$T('thisWeek'): $(server['amounts'][2])B<br/>
$T('thisMonth'): $(server['amounts'][1])B<br/>
<span id="server-data-label-${cur}"></span>: <span id="server-data-value-${cur}"></span>
</div>
<div class="server-chart" data-serverid="${cur}"s>
<div id="server-chart-${cur}" class="ct-chart"></div>
</div>
<script type="text/javascript">
// Server data
serverData[${cur}] = <!--#echo json.dumps($server['amounts'][4])#-->
</script>
<!--#end if#-->
</div>
<div class="field-pair">
<label class="config" for="ssl">$T('srv-ssl')</label>
<input type="checkbox" name="ssl" id="ssl" value="1" />
<span class="desc">$T('explain-ssl')</span>
</div>
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
<div class="field-pair">
<label class="config" for="${pid}_00">$T('srv-username')</label>
<input type="text" name="${pid}_00" id="${pid}_00" data-hide="username" />
</div>
<div class="field-pair">
<label class="config" for="${pid}_01">$T('srv-password')</label>
<input type="text" name="${pid}_01" id="${pid}_01" data-hide="password" />
</div>
<div class="field-pair">
<label class="config" for="connections">$T('srv-connections')</label>
<input type="number" name="connections" id="connections" min="0" max="100" value="8" />
</div>
<div class="field-pair">
<label class="config" for="priority">$T('srv-priority')</label>
<input type="number" name="priority" id="priority" min="0" max="100" /> <i>$T('explain-svrprio')</i>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="retention">$T('srv-retention')</label>
<input type="number" name="retention" id="retention" min="0" /> <i>$T('days')</i>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="timeout">$T('srv-timeout')</label>
<input type="number" name="timeout" id="timeout" min="30" /> <i>$T('seconds')</i>
</div>
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
<label class="config" for="ssl_verify">$T('opt-ssl_verify')</label>
<select name="ssl_verify" id="ssl_verify" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
<option value="2" selected>$T('ssl_verify-strict')</option>
<option value="1">$T('ssl_verify-normal')</option>
<option value="0">$T('ssl_verify-disabled')</option>
</select>
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="send_group">$T('srv-send_group')</label>
<input type="checkbox" name="send_group" id="send_group" value="1" />
<span class="desc">$T('srv-explain-send_group')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="optional">$T('srv-optional')</label>
<input type="checkbox" name="optional" id="optional" value="1" />
<span class="desc">$T('explain-optional')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="categories">$T('srv-categories')</label>
<select name="categories" id="categories" multiple>
<!--#for $cat in $cats#-->
<option value="$cat" <!--#if $cat == "Default"#-->selected<!--#end if#-->>
<!--#if $cat == "Default" then $T('Default') else $cat#-->
</option>
<!--#end for#-->
</select>
<span class="desc">$T('srv-explain-categories')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="displayname">$T('srv-displayname')</label>
<input type="text" name="displayname" id="displayname" />
</div>
<div class="field-pair advanced-settings">
<label class="config" for="notes">$T('srv-notes')</label>
<textarea name="notes" id="notes" rows="3" cols="50"></textarea>
</div>
<div class="field-pair">
<button class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
<button class="btn btn-default advancedButton"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
</div>
<div class="field-pair result-box">
<div class="alert"></div>
</div>
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
</form>
</div>
</form>
<!--#end for#-->
</div>
<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">
// Define variables needed for the server-plots
var serverData = {}
// Standardize chart options
var chartOptions = {
fullWidth: true,
showArea: true,
@@ -136,262 +316,76 @@
right: 20
}
}
</script>
<!--
We need to find how many months we have recorded so far, so we
loop over all the dates to find the lowest value and then use
the number of days passed as an estimate of the months we have.
-->
<!--#import json#-->
<!--#import datetime#-->
<!--#def show_date_selector($server, $id)#-->
<!--#set month_names = [$T('January'), $T('February'), $T('March'), $T('April'), $T('May'), $T('June'), $T('July'), $T('August'), $T('September'), $T('October'), $T('November'), $T('December')] #-->
<!--#set min_date = datetime.date.today()#-->
<!--#for date in $server['amounts'][4]#-->
<!--#set split_date = $date.split('-')#-->
<!--#set min_date = min(min_date, datetime.date(int(split_date[0]), int(split_date[1]), 1))#-->
<!--#end for#-->
<!--#set months_recorded = int((datetime.date.today()-min_date).days / (365/12))#-->
<select class="chart-selector" name="chart-selector-${id}" id="chart-selector-${id}" data-id="${id}">
<!--#for $i in range(months_recorded+1)#-->
<!--#set cur_date = (datetime.date.today() - datetime.timedelta($i*365/12))#-->
<option value="<!--#echo '%d-%02d' % ($cur_date.year, $cur_date.month)#-->">$month_names[$cur_date.month-1] $cur_date.year</option>
<!--#end for#-->
</select>
<!--#end def#-->
<!--#set $prio_colors = ["#59cc33", "#3366cc","#7f33cc", "#cc33a6", "#cc3333"] #-->
<!--#set $cur_prio_color = -1 #-->
<!--#set $last_prio = -1 #-->
<!--#for $cur, $server in enumerate($servers) #-->
<form action="saveServer" method="post" class="fullform" autocomplete="off" novalidate>
<input type="hidden" name="session" value="$session" />
<input type="hidden" name="server" value="$server['name']" />
<div class="section <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
<div class="col2 <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
<h3>$server['displayname'] <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
<!--#if int($server['enable']) != 0 #-->
<!--#if $last_prio != $server['priority'] and $cur_prio_color+1 < len($prio_colors) #-->
<!--#set $cur_prio_color = $cur_prio_color+1 #-->
<!--#set $last_prio = $server['priority'] #-->
<!--#end if#-->
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$server['priority']</span>
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$T('srv-priority'):</span>
<!--#end if#-->
<table><tr>
<td><input type="checkbox" class="toggleServerCheckbox" id="enable_$cur" name="$server['name']" value="1" <!--#if int($server['enable']) != 0 then 'checked="checked"' else ""#--> /></td>
<td><label for="enable_$cur">$T('enabled')</label></td>
</tr></table>
<button type="button" class="btn btn-default showserver"><span class="glyphicon glyphicon-pencil"></span> $T('showDetails')</button>
<button type="button" class="btn btn-default clrServer"><span class="glyphicon glyphicon-remove"></span> $T('button-clrServer')</button>
</div><!-- /col2 -->
<div class="col1" style="display:none;">
<input type="hidden" name="enable" id="enable$cur" value="$int($server['enable'])" />
<fieldset>
<div class="field-pair">
<label class="config" for="host$cur">$T('srv-host')</label>
<input type="text" name="host" id="host$cur" value="$server['host']" />
</div>
<div class="field-pair">
<label class="config" for="port$cur">$T('srv-port')</label>
<input type="number" name="port" id="port$cur" value="$server['port']" size="8" />
</div>
<div class="field-pair">
<label class="config" for="ssl$cur">$T('srv-ssl')</label>
<input type="checkbox" name="ssl" id="ssl$cur" value="1" <!--#if int($server['ssl']) != 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-ssl')</span>
</div>
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
<div class="field-pair">
<label class="config" for="${pid}_${cur}0">$T('srv-username')</label>
<input type="text" name="${pid}_${cur}0" id="${pid}_${cur}0" value="$server['username']" data-hide="username" />
</div>
<div class="field-pair">
<label class="config" for="${pid}_${cur}1">$T('srv-password')</label>
<input type="text" name="${pid}_${cur}1" id="${pid}_${cur}1" value="$server['password']" data-hide="password" />
</div>
<div class="field-pair">
<label class="config" for="connections$cur">$T('srv-connections')</label>
<input type="number" name="connections" id="connections$cur" value="$server['connections']" min="0" max="100" />
</div>
<div class="field-pair">
<label class="config" for="priority$cur">$T('srv-priority')</label>
<input type="number" name="priority" id="priority$cur" value="$server['priority']" min="0" max="100" /> <i>$T('explain-svrprio')</i>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="retention$cur">$T('srv-retention')</label>
<input type="number" name="retention" id="retention$cur" value="$server['retention']" min="0" /> <i>$T('days')</i>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="timeout$cur">$T('srv-timeout')</label>
<input type="number" name="timeout" id="timeout$cur" value="$server['timeout']" min="30" /> <i>$T('seconds')</i>
</div>
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
<label class="config" for="ssl_verify$cur">$T('opt-ssl_verify')</label>
<select name="ssl_verify" id="ssl_verify$cur" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
<option value="2" <!--#if $server['ssl_verify'] == 2 then 'selected="selected"' else ""#--> >$T('ssl_verify-strict')</option>
<option value="1" <!--#if $server['ssl_verify'] == 1 then 'selected="selected"' else ""#--> >$T('ssl_verify-normal')</option>
<option value="0" <!--#if $server['ssl_verify'] == 0 then 'selected="selected"' else ""#--> >$T('ssl_verify-disabled')</option>
</select>
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="optional$cur">$T('srv-optional')</label>
<input type="checkbox" name="optional" id="optional$cur" value="1" <!--#if int($server['optional']) != 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-optional')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="send_group$cur">$T('srv-send_group')</label>
<input type="checkbox" name="send_group" id="send_group$cur" value="1" <!--#if int($server['send_group']) != 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('srv-explain-send_group')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="categories$cur">$T('srv-categories')</label>
<select name="categories" id="categories$cur" multiple>
<!--#for $cat in $cats#-->
<option value="$cat" <!--#if $cat in $server['categories'] then 'selected' else ""#-->>
<!--#if $cat == "Default" then $T('Default') else $cat#-->
</option>
<!--#end for#-->
</select>
<span class="desc">$T('srv-explain-categories')<br><span class="label label-warning">$T('warning').upper()</span> <strong>This option is scheduled to be removed in the next release of SABnzbd.</strong></span>
<div class="alert alert-info alert-no-category">
<span class="glyphicon glyphicon-info-sign"></span>
$T('srv-explain-no-categories')
</div>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="displayname$cur">$T('srv-displayname')</label>
<input type="text" name="displayname" id="displayname$cur" value="$server['displayname']" />
</div>
<div class="field-pair advanced-settings">
<label class="config" for="notes$cur">$T('srv-notes')</label>
<textarea name="notes" id="notes$cur" rows="3" cols="50">$server['notes']</textarea>
</div>
<div class="field-pair">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default advancedButton"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</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>
<div class="field-pair result-box">
<div class="alert"></div>
</div>
</fieldset>
</div>
<div class="col1" style="display:block;">
<!--#if 'amounts' in $server#-->
<div class="server-amounts-text">
<b>$T('srv-bandwidth'):</b><br/>
$T('total'): $(server['amounts'][0])B<br/>
$T('today'): $(server['amounts'][3])B<br/>
$T('thisWeek'): $(server['amounts'][2])B<br/>
$T('thisMonth'): $(server['amounts'][1])B
</div>
<div class="server-chart">
$show_date_selector($server, $cur)
<div id="server-chart-${cur}" class="ct-chart"></div>
</div>
<script type="text/javascript">
// Server data
serverData[${cur}] = <!--#echo json.dumps($server['amounts'][4])#-->
\$(document).ready(function() {
showChart(${cur})
})
</script>
<!--#end if#-->
</div>
</div>
</form>
<!--#end for#-->
</div><!-- /colmask -->
<script type="text/javascript">
function showChart(server_id, month) {
function showCharts() {
// This month
var theMonth = \$('#chart-selector').val()
var thisDay = new Date()
// What month are we doing?
if(month) {
var inputDate = new Date(month+'-01')
} else {
var inputDate = new Date()
}
var baseDate = new Date(inputDate.getFullYear(), inputDate.getMonth(), 1)
var maxDaysInMonth = new Date(baseDate.getYear(), baseDate.getMonth()+1, 0).getDate()
var inputDate = new Date(theMonth+'-01')
var baseDate = new Date(inputDate.getUTCFullYear(), inputDate.getUTCMonth(), 1)
var maxDaysInMonth = new Date(baseDate.getFullYear(), baseDate.getMonth()+1, 0).getDate()
// Fill the data array
var data = {
labels: [],
series: [[]]
};
var largestVal = 0
for(var i = 1; i < maxDaysInMonth+1; i++) {
// Add X-label
if(i % 3 == 1) {
data['labels'].push(i)
} else {
data['labels'].push(NaN)
// Set the new maximum
chartOptions.axisY.high = \$('#chart-selector :selected').data('max');
chartOptions.axisY.low = 0
// For each chart
\$('.server-chart').each(function(i, elemn) {
var server_id = \$(elemn).data('serverid')
// Fill the data array
var data = {
labels: [],
series: [[]]
};
var totalThisMonth = 0
for(var i = 1; i < maxDaysInMonth+1; i++) {
// Add X-label
if(i % 3 == 1) {
data['labels'].push(i)
} else {
data['labels'].push(NaN)
}
// Get formatted date
baseDate.setDate(i)
var dateCheck = toFormattedDate(baseDate)
// Add data if we have it
if(dateCheck in serverData[server_id]) {
data['series'][0].push(serverData[server_id][dateCheck])
totalThisMonth += serverData[server_id][dateCheck]
} else if(thisDay.getYear() == baseDate.getYear() && thisDay.getMonth() == baseDate.getMonth() && thisDay.getDate() < i) {
data['series'][0].push(NaN)
} else {
data['series'][0].push(0)
}
}
// Get formatted date
baseDate.setDate(i)
var dateCheck = toFormattedDate(baseDate)
// Update the text value
\$('#server-data-label-' + server_id).text(\$('#chart-selector :selected').text())
\$('#server-data-value-' + server_id).text(filesize(totalThisMonth, {round: 1}))
// Add data if we have it
if(dateCheck in serverData[server_id]) {
data['series'][0].push(serverData[server_id][dateCheck])
largestVal = Math.max(largestVal, serverData[server_id][dateCheck])
} else if(thisDay.getYear() == baseDate.getYear() && thisDay.getMonth() == baseDate.getMonth() && thisDay.getDate() < i) {
data['series'][0].push(NaN)
} else {
data['series'][0].push(0)
}
}
// Check if we should shrink the Y-axis values
var devideBy = 1024
var axisLabel = 'KB'
if(largestVal > 1024*1024) {
devideBy = 1024*1024
axisLabel = 'MB'
}
if(largestVal > 1024*1024*1024) {
devideBy = 1024*1024*1024
axisLabel = 'GB'
}
if(largestVal > 1024*1024*1024*1024) {
devideBy = 1024*1024*1024*1024
axisLabel = 'TB'
}
// Shrink the value
data['series'][0] = data['series'][0].map(function(num) {
return num / devideBy;
// Show the chart
chart = new Chartist.Line('#server-chart-'+server_id, data, chartOptions);
chart.on('created', function(context) {
// Make sure to add this as the first child so it's at the bottom
context.svg.elem('rect', {
x: context.chartRect.x1,
y: context.chartRect.y2-1,
width: context.chartRect.width(),
height: context.chartRect.height()+2,
fill: 'none',
stroke: '#B9B9B9',
'stroke-width': '1px'
}, '', context.svg, true)
\$('#server-chart-'+server_id+' .ct-label.ct-vertical').each(function(index, elmn) {
elmn.innerHTML = filesize(elmn.innerHTML, {round: 1}).replace(' ','')
})
});
})
// Show the chart
chart = new Chartist.Line('#server-chart-'+server_id, data, chartOptions);
chart.on('created', function(context) {
// Make sure to add this as the first child so it's at the bottom
context.svg.elem('rect', {
x: context.chartRect.x1,
y: context.chartRect.y2-1,
width: context.chartRect.width(),
height: context.chartRect.height()+2,
fill: 'none',
stroke: '#B9B9B9',
'stroke-width': '1px'
}, '', context.svg, true)
\$('#server-chart-'+server_id+' .ct-label.ct-vertical').each(function(index, elmn) {
elmn.innerHTML += axisLabel
})
});
}
// Need to mitigate timezone effects!
@@ -416,41 +410,17 @@
/**
Update charts when changed
**/
\$('.chart-selector').on('change', function(elemn) {
showChart(\$(elemn.target).data('id'), \$(elemn.target).val())
\$('#chart-selector').on('change', function(elemn) {
showCharts()
// Lets us leave (needs to be called after the change event)
setTimeout(function() {
formWasSubmitted = true;
formHasChanged = false;
}, 100)
})
/**
Message on no Default category selected
**/
function checkServerCats() {
// Now we check all of them
var hasDefault = false;
// Only check the active servers, not the add-server one
\$('.section:not(#addServerContent) select[name="categories"]').each(function() {
// See if this server is enabled
if(!\$(this).parents('.section').find('.col2').hasClass('server-disabled') ) {
// Is there Default?
if(\$(this).val() && \$(this).val().indexOf('Default') > -1) {
// Hide
\$('.alert-no-category').hide()
hasDefault = true
// All good!
return true
}
}
})
// We found nothing.. Let's show a warning
if(!hasDefault) \$('.alert-no-category').show()
}
\$('select[name="categories"]').on('change', checkServerCats)
checkServerCats()
// And on page-load
showCharts()
/**
Click events
@@ -461,16 +431,19 @@
}
\$(this).parent().next().toggle();
\$(this).parent().next().next().toggle();
if (\$(this).attr("value") == "$T('showDetails')") {
\$(this).attr("value", "$T('hideDetails')");
if (\$(this).text().indexOf("$T('showDetails')") > 0) {
\$(this).html(\$(this).html().replace("$T('showDetails')", "$T('hideDetails')"));
} else {
\$(this).attr("value", "$T('showDetails')");
\$(this).html(\$(this).html().replace("$T('hideDetails')", "$T('showDetails')"));
}
// Add coloring
addRowColor()
});
\$('#addServerButton').click(function(){
\$('#addServer').hide();
\$('#addServerContent').show();
// Add coloring
addRowColor()
});
\$('[name="ssl"]').click(function() {

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Sorting"#-->
<!--#set global $help_uri="configuration/2.2/sorting"#-->
<!--#set global $help_uri="configuration/2.3/sorting"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
@@ -40,6 +40,8 @@
<br/>
<input type="button" class="btn btn-default" onclick="tvSet('%sn/%sx%0e - %en/%sn - %sx%0e - %en.%ext')" value="$T('button-Ep1x05')" />
<input type="button" class="btn btn-default" onclick="tvSet('%sn/S%0sE%0e - %en/%sn - S%0sE%0e - %en.%ext')" value="$T('button-EpS01E05')" />
<br>
<input type="button" class="btn btn-default" onclick="tvSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
</div>
</div>
<div id="previewtv" class="example">
@@ -51,7 +53,7 @@
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewtv-result">&nbsp;</span>
</div>
</div>
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<label class="config">$T('sort-legenda')</label>
<button type="button" class="btn btn-default patternKey" onclick="jQuery(this).hide(); jQuery('#Key1').show();"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')</button>
<table id="Key1" class="Key">
@@ -139,9 +141,9 @@
<td>$T("sort-File")</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgDirname'):</b></td>
<td class="align-right"><b>$T('orgJobname'):</b></td>
<td>%dn</td>
<td>$T("sort-Folder")</td>
<td></td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
@@ -198,7 +200,8 @@
<div class="presets float-left">
<input type="button" class="btn btn-default" onclick="movieSet('%title (%y)/%title (%y).%ext',' CD%1');movieExtraFolder(false)" value="$T('button-inFolders')" />
<input type="button" class="btn btn-default" onclick="movieSet('%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="$T('button-noFolders')" />
<input type="button" class="btn btn-default" onclick="movieSet('%0decade/%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="Decades 1" />
<input type="button" class="btn btn-default" onclick="movieSet('%0decade/%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="$T('decade')" />
<input type="button" class="btn btn-default" onclick="movieSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
</div>
</div>
<div id="previewmovie" class="example">
@@ -210,7 +213,7 @@
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewmovie-result">&nbsp;</span>
</div>
</div>
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<label class="config">$T('sort-legenda')</label>
<button type="button" class="btn btn-default patternKey" onclick="jQuery(this).hide(); jQuery('#Key2').show();"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')</button>
<table id="Key2" class="Key">
@@ -263,9 +266,9 @@
<td>$T('sort-File')</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgDirname'):</b></td>
<td class="align-right"><b>$T('orgJobname'):</b></td>
<td>%dn</td>
<td>$T("sort-Folder")</td>
<td></td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
@@ -328,7 +331,9 @@
<div class="presets float-left">
<input type="button" class="btn btn-default" onclick="dateSet('%t/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-ShowNameF')" />
<input type="button" class="btn btn-default" onclick="dateSet('%y-%0m/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-YMF')" />
<br>
<input type="button" class="btn btn-default" onclick="dateSet('%y-%0m-%0d/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-DailyF')" />
<input type="button" class="btn btn-default" onclick="dateSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
</div>
</div>
<div id="previewdate" class="example">
@@ -340,7 +345,7 @@
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewdate-result">&nbsp;</span>
</div>
</div>
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<label class="config">$T('sort-legenda')</label>
<button type="button" class="btn btn-default patternKey" onclick="jQuery(this).hide(); jQuery('#Key3').show();"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')</button>
<table id="Key3" class="Key">
@@ -407,6 +412,11 @@
<td>%fn</td>
<td>$T('sort-File')</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgJobname'):</b></td>
<td>%dn</td>
<td></td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
<td>{$T('TEXT')}</td>
@@ -487,7 +497,7 @@
\$.ajax({
type: "GET",
url: "../../tapi",
data: {mode:'eval_sort', value: 'generic', name: \$('#moviesamplename').val(), title: \$moviesortstring, movieextra: \$('#movieextra').val(), apikey: '$session', output: 'json' },
data: {mode:'eval_sort', value: 'movie', name: \$('#moviesamplename').val(), title: \$moviesortstring, movieextra: \$('#movieextra').val(), apikey: '$session', output: 'json' },
success: function(data){
\$('#previewmovie-result').removeClass("loading failure").html(data.result);
},

View File

@@ -1,5 +1,5 @@
<!--#set global $pane="Special"#-->
<!--#set global $help_uri="configuration/2.2/special"#-->
<!--#set global $help_uri="configuration/2.3/special"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">

View File

@@ -1,11 +1,16 @@
<!--#set global $pane="Switches"#-->
<!--#set global $help_uri="configuration/2.2/switches"#-->
<!--#set global $help_uri="configuration/2.3/switches"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="padding alt section">
<label for="advanced-settings-button" class="form-control advanced-button ">
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
</div>
<form action="saveSwitches" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="session" name="session" value="$session" />
<div class="section">
<div class="section advanced-settings">
<div class="col2">
<h3>$T('swtag-server') <a href="$helpuri$help_uri#toc1" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
</div><!-- /col2 -->
@@ -67,12 +72,12 @@
<input type="number" name="propagation_delay" id="propagation_delay" value="$propagation_delay" /> <i>$T('minutes')</i>
<span class="desc">$T('explain-propagation_delay')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="top_only">$T('opt-top_only')</label>
<input type="checkbox" name="top_only" id="top_only" value="1" <!--#if int($top_only) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-top_only')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="pre_check">$T('opt-pre_check')</label>
<input type="checkbox" name="pre_check" id="pre_check" value="1" <!--#if int($pre_check) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-pre_check')</span>
@@ -104,6 +109,11 @@
</select>
<span class="desc">$T('explain-no_series_dupes')</span>
</div>
<div class="field-pair advanced-settings">
<label class="config" for="series_propercheck">$T('opt-series_propercheck')</label>
<input type="checkbox" name="series_propercheck" id="series_propercheck" value="1" <!--#if int($series_propercheck) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-series_propercheck')</span>
</div>
<div class="field-pair">
<label class="config" for="pause_on_pwrar">$T('opt-pause_on_pwrar')</label>
<select name="pause_on_pwrar" id="pause_on_pwrar">
@@ -113,6 +123,11 @@
</select>
<span class="desc">$T('explain-pause_on_pwrar')</span>
</div>
<div class="field-pair">
<label class="config" for="unwanted_extensions">$T('opt-unwanted_extensions')</label>
<input type="text" name="unwanted_extensions" id="unwanted_extensions" value="$unwanted_extensions"/>
<span class="desc">$T('explain-unwanted_extensions')</span>
</div>
<div class="field-pair">
<label class="config" for="action_on_unwanted_extensions">$T('opt-action_on_unwanted_extensions')</label>
<select name="action_on_unwanted_extensions" id="action_on_unwanted_extensions">
@@ -122,12 +137,7 @@
</select>
<span class="desc">$T('explain-action_on_unwanted_extensions')</span>
</div>
<div class="field-pair">
<label class="config" for="unwanted_extensions">$T('opt-unwanted_extensions')</label>
<input type="text" name="unwanted_extensions" id="unwanted_extensions" value="$unwanted_extensions"/>
<span class="desc">$T('explain-unwanted_extensions')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="auto_sort">$T('opt-auto_sort')</label>
<input type="checkbox" name="auto_sort" id="auto_sort" value="1" <!--#if int($auto_sort) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-auto_sort')</span>
@@ -155,53 +165,53 @@
<input type="checkbox" name="pause_on_post_processing" id="pause_on_post_processing" value="1" <!--#if int($pause_on_post_processing) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-pause_on_post_processing')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="enable_all_par">$T('opt-enable_all_par')</label>
<input type="checkbox" name="enable_all_par" id="enable_all_par" value="1" <!--#if int($enable_all_par) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_all_par').replace('. ', '.<br/>')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="par_option">$T('opt-par_option')</label>
<input type="text" name="par_option" id="par_option" value="$par_option" />
<span class="desc">$T('explain-par_option')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="sfv_check">$T('opt-sfv_check')</label>
<input type="checkbox" name="sfv_check" id="sfv_check" value="1" <!--#if int($sfv_check) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-sfv_check')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="safe_postproc">$T('opt-safe_postproc')</label>
<input type="checkbox" name="safe_postproc" id="safe_postproc" value="1" <!--#if int($safe_postproc) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-safe_postproc')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="enable_recursive">$T('opt-enable_recursive')</label>
<input type="checkbox" name="enable_recursive" id="enable_recursive" value="1" <!--#if int($enable_recursive) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_recursive')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="flat_unpack">$T('opt-flat_unpack')</label>
<input type="checkbox" name="flat_unpack" id="flat_unpack" value="1" <!--#if int($flat_unpack) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-flat_unpack')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="script_can_fail">$T('opt-script_can_fail')</label>
<input type="checkbox" name="script_can_fail" id="script_can_fail" value="1" <!--#if int($script_can_fail) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-script_can_fail')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="new_nzb_on_failure">$T('opt-new_nzb_on_failure')</label>
<input type="checkbox" name="new_nzb_on_failure" id="new_nzb_on_failure" value="1" <!--#if int($new_nzb_on_failure) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-new_nzb_on_failure')</span>
</div>
<!--#if not $nt#-->
<div class="field-pair <!--#if not $have_nice then "disabled" else "" #-->">
<div class="field-pair advanced-settings <!--#if not $have_nice then "disabled" else "" #-->">
<label class="config" for="nice">$T('opt-nice')</label>
<input type="text" name="nice" id="nice" value="$nice" <!--#if not $have_nice then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-nice')</span>
</div>
<div class="field-pair <!--#if not $have_ionice then "disabled" else "" #-->">
<div class="field-pair advanced-settings <!--#if not $have_ionice then "disabled" else "" #-->">
<label class="config" for="ionice">$T('opt-ionice')</label>
<input type="text" name="ionice" id="ionice" value="$ionice" <!--#if not $have_ionice then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-ionice')</span>
@@ -212,7 +222,7 @@
<input type="checkbox" name="ignore_samples" id="ignore_samples" value="1" <!--#if int($ignore_samples) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-ignore_samples') $T('igsam-del').</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="enable_meta">$T('opt-enable_meta')</label>
<input type="checkbox" name="enable_meta" id="enable_meta" value="1" <!--#if int($enable_meta) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_meta').replace('. ', '.<br/>')</span>
@@ -241,7 +251,7 @@
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="section advanced-settings">
<div class="col2">
<h3>$T('swtag-naming') <a href="$helpuri$help_uri#toc4" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
</div><!-- /col2 -->

View File

@@ -16,7 +16,7 @@
<link rel="stylesheet" type="text/css" href="../staticcfg/bootstrap/css/bootstrap.min.css?v=$version" />
<link rel="stylesheet" type="text/css" href="../staticcfg/css/login.css?v=$version" />
<script type="text/javascript" src="../staticcfg/js/jquery-3.1.1.min.js?v=$version"></script>
<script type="text/javascript" src="../staticcfg/js/jquery-3.2.1.min.js?v=$version"></script>
<script type="text/javascript" src="../staticcfg/bootstrap/js/bootstrap.min.js?v=$version"></script>
</head>
<html>

View File

@@ -23,16 +23,32 @@ body {
overflow: visible;
border: 1px solid #dfdede;
background-color: #FFF;
border: 1px solid rgba(0, 0, 0, 0.2);
width: 100%
}
.section, .Servers form, #addFeed, #addFeedContent {
.advanced-button {
float: right;
width: auto;
margin: 0 4px 0px 0px;
font-size: 13px;
color: inherit;
height: auto;
padding-bottom: 5px;
}
#advanced-settings-button {
float: left;
margin: 2px 7px 0px 0px;
}
.advanced-buttonSeperator {
width: 1px;
height: 34px;
background-color: #dfdede;
float: right;
margin: 0px 10px;
}
.section, #addFeed, #addFeedContent {
border-bottom: 1px solid #dfdede;
overflow: auto;
}
.section:last-child, .Servers form:last-child {
border: 0;
}
.col2 {
z-index: 10;
float: left;
@@ -150,13 +166,13 @@ input[type="checkbox"]+.desc {
overflow: hidden;
min-width: 555px;
}
.field-pair:nth-child(odd),
.Key tr:nth-child(odd),
.tab-pane tr:nth-child(odd),
.even {
background-color: #F8F8F8;
}
.field-pair:last-child {
.field-pair:last-child,
.no-field-pair-bg {
background-color: transparent;
}
.alt,
@@ -298,7 +314,7 @@ tr.separator {
visibility: hidden;
}
.Categories form.sorting-row:nth-child(even) tr {
.Categories form.sorting-row:nth-child(2n-1) tr {
background-color: #F8F8F8;
}
@@ -1023,19 +1039,14 @@ input[type="checkbox"] {
color: black;
}
.Servers .chart-selector {
position: absolute;
display: block;
top: -7px;
left: 50%;
width: 120px;
margin-left: -40px;
min-width: initial;
opacity: 0.8;
.Servers .chart-selector-container {
float: right;
}
.Servers .chart-selector:hover {
opacity: 1;
.Servers .chart-selector-container .glyphicon {
font-size: 1.3em;
padding-right: 4px;
top: 5px;
}
.Servers .ct-grid.ct-vertical:first-of-type {
@@ -1067,7 +1078,6 @@ input[type="checkbox"] {
display: none;
}
.alert-no-category,
.alert-translate {
display: none;
margin: 5px 0px 0px;
@@ -1083,6 +1093,13 @@ input[type="checkbox"] {
color: #666;
}
.host-warning {
color: #F0AD4E;
margin-left: 13px;
top: 5px;
font-size: 1.2em;
}
.fileBrowser .glyphicon {
margin-right: 2px;
top: 1px;
@@ -1220,7 +1237,9 @@ input[type="checkbox"] {
margin-bottom: 0;
}
.Servers .server-chart {
.Servers .server-chart,
.Servers .chart-selector-container,
.Servers .advanced-buttonSeperator {
display: none;
}

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="608.000000pt" height="608.000000pt" viewBox="0 0 608.000000 608.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,608.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1295 5818 c-46 -17 -81 -45 -107 -86 l-23 -37 -5 -1160 -5 -1160
-386 -5 -386 -5 -40 -28 c-80 -56 -113 -173 -70 -257 9 -19 91 -113 182 -209
91 -96 165 -177 165 -180 -1 -3 -18 -18 -39 -32 -21 -15 -48 -46 -60 -71 -21
-43 -21 -54 -21 -514 0 -441 1 -472 19 -507 18 -36 18 -38 0 -74 -17 -33 -19
-61 -19 -236 0 -222 6 -245 74 -305 60 -53 76 -54 851 -50 706 3 710 3 751 25
26 13 45 18 51 12 5 -5 32 -17 60 -27 46 -15 77 -44 336 -317 157 -165 300
-309 319 -320 24 -14 51 -20 98 -20 47 0 74 6 98 20 19 11 162 155 319 320
200 211 295 304 321 315 20 8 46 20 56 26 15 9 26 7 55 -10 36 -21 39 -21 781
-21 l745 0 45 25 c24 14 58 45 75 68 l30 44 3 746 2 746 -25 51 c-14 29 -40
63 -60 77 l-35 25 170 179 c94 98 178 195 188 214 41 84 9 202 -71 257 l-40
28 -386 5 -386 5 -5 1162 -5 1161 -30 43 c-16 23 -48 52 -70 63 l-40 21 -1725
2 c-1202 1 -1734 -2 -1755 -9z m3215 -1488 l0 -1080 -284 0 -284 0 -53 -28
c-39 -20 -62 -41 -84 -77 l-30 -48 -3 -199 -4 -198 -736 0 c-703 0 -739 -1
-779 -19 -41 -19 -42 -19 -79 0 -36 18 -64 19 -510 19 l-472 0 -122 128 -122
127 239 5 c258 5 269 8 325 67 61 64 58 -6 58 1243 l0 1140 1470 0 1470 0 0
-1080z m32 -1562 l3 -273 408 -3 407 -2 0 -690 0 -690 -690 0 -690 0 0 965 0
965 280 0 280 0 2 -272z m558 155 c-19 -21 -75 -80 -125 -130 l-90 -93 -67 0
-68 0 0 130 0 130 192 0 192 0 -34 -37z m-3010 -573 l0 -140 -410 0 -410 0 0
-130 0 -130 408 -2 407 -3 0 -415 0 -415 -692 -3 -693 -2 0 145 0 145 410 0
410 0 0 130 0 130 -410 0 -410 0 0 415 0 415 695 0 695 0 0 -140z m1630 -550
l0 -690 -690 0 -690 0 0 420 0 420 410 0 410 0 0 130 0 130 -410 0 -410 0 0
140 0 140 690 0 690 0 0 -690z m-611 -967 c-35 -38 -66 -68 -69 -68 -3 0 -34
30 -69 68 l-63 67 132 0 132 0 -63 -67z"/>
<path d="M4547 2203 c-4 -3 -7 -186 -7 -405 l0 -398 130 0 130 0 0 405 0 405
-123 0 c-68 0 -127 -3 -130 -7z"/>
<path d="M2902 1533 l3 -128 128 -3 127 -3 0 131 0 130 -130 0 -131 0 3 -127z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,6 @@
/*
2017 Jason Mulligan <jason.mulligan@avoidwork.com>
@version 3.5.11
*/
"use strict";!function(i){function e(i){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],d=0,r=void 0,a=void 0,s=void 0,f=void 0,u=void 0,l=void 0,v=void 0,B=void 0,c=void 0,p=void 0,y=void 0,m=void 0,x=void 0,g=void 0;if(isNaN(i))throw new Error("Invalid arguments");return s=!0===e.bits,y=!0===e.unix,a=e.base||2,p=void 0!==e.round?e.round:y?1:2,m=void 0!==e.spacer?e.spacer:y?"":" ",g=e.symbols||e.suffixes||{},x=2===a?e.standard||"jedec":"jedec",c=e.output||"string",u=!0===e.fullform,l=e.fullforms instanceof Array?e.fullforms:[],r=void 0!==e.exponent?e.exponent:-1,B=Number(i),v=B<0,f=a>2?1e3:1024,v&&(B=-B),(-1===r||isNaN(r))&&(r=Math.floor(Math.log(B)/Math.log(f)))<0&&(r=0),r>8&&(r=8),0===B?(n[0]=0,n[1]=y?"":t[x][s?"bits":"bytes"][r]):(d=B/(2===a?Math.pow(2,10*r):Math.pow(1e3,r)),s&&(d*=8)>=f&&r<8&&(d/=f,r++),n[0]=Number(d.toFixed(r>0?p:0)),n[1]=10===a&&1===r?s?"kb":"kB":t[x][s?"bits":"bytes"][r],y&&(n[1]="jedec"===x?n[1].charAt(0):r>0?n[1].replace(/B$/,""):n[1],o.test(n[1])&&(n[0]=Math.floor(n[0]),n[1]=""))),v&&(n[0]=-n[0]),n[1]=g[n[1]]||n[1],"array"===c?n:"exponent"===c?r:"object"===c?{value:n[0],suffix:n[1],symbol:n[1]}:(u&&(n[1]=l[r]?l[r]:b[x][r]+(s?"bit":"byte")+(1===n[0]?"":"s")),n.join(m))}var o=/^(b|B)$/,t={iec:{bits:["b","Kib","Mib","Gib","Tib","Pib","Eib","Zib","Yib"],bytes:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},jedec:{bits:["b","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"],bytes:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]}},b={iec:["","kibi","mebi","gibi","tebi","pebi","exbi","zebi","yobi"],jedec:["","kilo","mega","giga","tera","peta","exa","zetta","yotta"]};e.partial=function(i){return function(o){return e(o,i)}},"undefined"!=typeof exports?module.exports=e:"function"==typeof define&&define.amd?define(function(){return e}):i.filesize=e}("undefined"!=typeof window?window:global);
//# sourceMappingURL=filesize.min.js.map

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

@@ -170,6 +170,10 @@
<div class="col-sm-2">$T('category')</div>
<div class="col-sm-10" data-bind="text: historyStatus.category() == '*' ? glitterTranslate.defaultText : historyStatus.category"></div>
</div>
<div class="row" data-bind="visible: historyStatus.password">
<div class="col-sm-2">$T('srv-password')</div>
<div class="col-sm-10" data-bind="text: historyStatus.password"></div>
</div>
<div class="row">
<div class="col-sm-2">$T('msg-path')</div>
<div class="col-sm-10" data-bind="text: historyStatus.storage() == '' ? historyStatus.path : historyStatus.storage"></div>

View File

@@ -18,7 +18,7 @@
<tr>
<td class="table-messages-label">
<span class="label" data-bind="css: 'label-' + css, text: type"></span>
<strong data-bind="text: date, attr: { 'data-timestamp': timestamp }"></strong>
<strong data-bind="text: displayDateTime(timestamp, \$parent.dateFormat(), 'X'), attr: { 'data-timestamp': timestamp }"></strong>
<span class="queue-message-text" data-bind="html: text"></span>
</td>
</tr>

View File

@@ -59,15 +59,9 @@
<div id="feedback-slider-inner">
<p><strong>If anything is not working as expected, or could be improved, let us know!</strong></p>
<p><strong>If you encounter an error, please include the log file (click on <span class="glyphicon glyphicon-wrench"></span> ) when contacting us.</strong></p>
<h4>General</h4>
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/" target="_blank">SABnzbd Forum</a><br />
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/viewforum.php?f=11" target="_blank">SABnzbd Forum</a><br />
<span class="glyphicon glyphicon-plane"></span> <a href="https://github.com/sabnzbd/sabnzbd/" target="_blank">SABnzbd on Github</a><br />
<span class="glyphicon glyphicon-globe"></span> <a href="https://translations.launchpad.net/sabnzbd" target="_blank">Translations of SABnzbd</a><br />
<span class="glyphicon glyphicon-envelope"></span> <a href="mailto:bugs@sabnzbd.org?body=Version:%20$version%20Skin:%20Glitter">Email bugs@sabnzbd.org</a>
<h4>Interface (Glitter)</h4>
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/viewtopic.php?f=5&amp;t=18880" target="_blank">Glitter at SABnzbd Forum</a><br />
<span class="glyphicon glyphicon-envelope"></span> <a href="mailto:safihre@sabnzbd.org?body=Version:%20$version">Email safihre@sabnzbd.org</a>
</div>
</div>
@@ -156,7 +150,9 @@
</div>
<div class="row options-function-box">
<div class="col-sm-6">
<a href="./status/showlog?session=$session" target="_blank" class="btn btn-default"><span class="glyphicon glyphicon-file"></span> $T('link-showLog')</a>
<a href="./status/showlog?session=$session" 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')">
@@ -179,7 +175,6 @@
</div>
<div data-bind="foreach: statusInfo.servers">
<div class="options-server-box">
<div class="row">
<div class="col-sm-6">$T('swtag-server')</div>
<div class="col-sm-6">
@@ -656,7 +651,6 @@
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purgeremove-failed"><span class="glyphicon glyphicon-floppy-remove"></span> $T('purgeFailed-Files')</button><hr />
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purge-completed"><span class="glyphicon glyphicon-floppy-saved"></span> $T('purgeCompl')</button><hr />
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purge-page"><span class="glyphicon glyphicon-check"></span> $T('purgePage') <span class="label label-default" data-bind="text: history.historyItems().length"></span></button>
</div>
</div>
</div>

View File

@@ -39,6 +39,11 @@
<span class="glyphicon glyphicon-hdd"></span> <span data-bind="text: diskSpaceLeft2"></span>B $T('Glitter-free')
</div>
<!-- /ko -->
<div class="info-container-box-sorting" style="display: none" data-bind="visible: refreshRate() > 2">
<a href="#" data-bind="click: refresh">
<span class="glyphicon glyphicon-repeat" data-tooltip="true" data-placement="left" title="$T('Glitter-refresh')"></span>
</a>
</div>
<div class="info-container-box-sorting dropdown" data-bind="visible: hasQueue()">
<a href="#" data-toggle="dropdown">
<span class="glyphicon glyphicon-sort-by-alphabet" data-tooltip="true" data-placement="left" title="$T('cmenu-sorting')"></span>
@@ -83,25 +88,25 @@
<tr class="queue-item">
<td>
<a href="#" data-bind="click: pauseToggle, attr: { 'title': pausedStatus() ? '$T('link-resume')' : '$T('link-pause')' }">
<span class="hover-button glyphicon" data-bind="css: { 'glyphicon-play': pausedStatus(), 'glyphicon-pause': !pausedStatus() }"></span>
<span class="hover-button glyphicon" data-bind="css: queueIcon"></span>
</a>
</td>
<td class="name">
<div class="row-wrap-text" data-bind="visible: !editingName()">
<span data-bind="text: name, attr: { 'title': name() }"></span>
<div class="row-wrap-text" data-bind="visible: !editingName(), css: { 'direct-unpack-text': direct_unpack }">
<span data-bind="text: name, attr: { 'title': name_title }"></span>
<!-- ko if: password() -->
<small class="queue-item-password">
<span class="glyphicon glyphicon-lock"></span>
<span data-bind="text: password"></span>
</small>
<!-- /ko -->
<div class="name-icons direct-unpack hover-button" data-bind="visible: direct_unpack">
<span class="glyphicon glyphicon-compressed"></span> <span data-bind="text: direct_unpack"></span>
</div>
</div>
<form data-bind="submit: editingNameSubmit">
<input type="text" data-bind="value: nameForEdit, visible: editingName(), hasfocus: editingName" />
</form>
<div class="name-icons direct-unpack hover-button" data-bind="visible: direct_unpack">
<span class="glyphicon glyphicon-compressed"></span> <span data-bind="text: direct_unpack"></span>
</div>
<div class="name-options" data-bind="visible: !editingName(), css: { disabled: isGrabbing() }">
<a href="#" data-bind="click: \$parent.queue.moveButton" class="hover-button buttonMoveToTop" title="$T('Glitter-top')"><span class="glyphicon glyphicon-chevron-up"></span></a>
<a href="#" data-bind="click: \$parent.queue.moveButton" class="hover-button buttonMoveToBottom" title="$T('Glitter-bottom')"><span class="glyphicon glyphicon-chevron-down"></span></a>
@@ -116,8 +121,8 @@
</td>
<td class="progress-indicator">
<div class="progress">
<div class="progress-bar progress-bar-info" data-bind="attr: { 'style': 'width: ' + percentageRounded() + '; background-color: ' + progressColor() + ';' }">
<strong data-bind="text: percentageRounded"></strong>
<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>
<span data-bind="text: progressText"></span>
@@ -128,8 +133,8 @@
<label data-bind="visible: parent.isMultiEditing()">
<input type="checkbox" name="multiedit" title="$T('Glitter-multiSelect')" data-bind="click: parent.addMultiEdit, attr: { 'id': 'multiedit_' + id } " />
</label>
<!-- ko if: !isGrabbing() -->
<div class="dropdown" data-bind="visible: !isGrabbing() && !parent.isMultiEditing()">
<!-- ko if: !isGrabbing() -->
<div class="dropdown" data-bind="visible: !parent.isMultiEditing()">
<a href="#" data-toggle="dropdown" data-bind="click: toggleDropdown">
<span class="caret"></span>
</a>
@@ -139,7 +144,7 @@
<span class="glyphicon glyphicon-tag"></span>
<select name="Category" class="form-control" data-bind="options: parent.categoriesList, optionsValue: 'catValue', optionsText: 'catText', value: category, event: { change: changeCat }"></select>
</li>
<!-- ko if: (status() != 'Fetching') -->
<!-- ko if: !isFetchingBlocks -->
<li title="$T('priority')" data-tooltip="true" data-placement="left">
<span class="glyphicon glyphicon-sort-by-attributes-alt"></span>
<select name="Priority" class="form-control" data-bind="options: parent.priorityOptions, optionsValue: 'value', optionsText: 'name', value: priority, event: { change: changePriority }"></select>

View File

@@ -30,6 +30,7 @@
<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=$version" data-bind="attr: { 'href': SABIcon }" />
<link rel="stylesheet" type="text/css" href="./static/bootstrap/css/bootstrap.min.css?v=$version" />
@@ -46,7 +47,7 @@
var sabSpeedHistory = [$bytespersec_list];
var newRelease = "$new_release";
var newReleaseUrl = "$new_rel_url";
var glitterIsBeta = ("$version".search(/Alpa|Beta|x/)) > 0;
var glitterIsBeta = ("$version".search(/[develop|Alpha|Beta|RC]/)) > 0;
var glitterPreLoadQueue = $preload_queue;
var glitterPreLoadHistory = $preload_history;
@@ -63,6 +64,7 @@
glitterTranslate.removeDown = "$T('Glitter-confirmClearDownloads')";
glitterTranslate.removeDow1 = "$T('Glitter-confirmClear1Download')";
glitterTranslate.retryAll = "$T('link-retryAll')?";
glitterTranslate.fetch = "$T('Glitter-fetch')";
glitterTranslate.encrypted = "$T('Glitter-encrypted')";
glitterTranslate.duplicate = "$T('Glitter-duplicate')";
glitterTranslate.tooLarge = "$T('Glitter-tooLarge')";
@@ -85,6 +87,7 @@
glitterTranslate.moreText = "$T('Glitter-more')";
glitterTranslate.status = [];
glitterTranslate.status['DirectUnpack'] = "$T('opt-direct_unpack')";
glitterTranslate.status['Completed'] = "$T('post-Completed')";
glitterTranslate.status['Failed'] = "$T('post-Failed')";
glitterTranslate.status['Queued'] = "$T('post-Queued')";
@@ -103,7 +106,7 @@
glitterTranslate.status['Script'] = "$T('stage-script')";
glitterTranslate.status['Source'] = "$T('stage-source')";
glitterTranslate.status['Servers'] = "$T('stage-servers')";
glitterTranslate.status['INFO'] = "$T('log-info')".replace('+ ', '').toUpperCase();
glitterTranslate.status['INFO'] = "$T('log-info')".replace('+', '').toUpperCase();
glitterTranslate.status['WARNING'] = "$T('Glitter-warning')";
glitterTranslate.status['ERROR'] = "$T('Glitter-error')";

View File

@@ -128,13 +128,13 @@ function displayDateTime(inDate, outFormat, inFormat) {
if(inDate == '') {
var theMoment = moment()
} else {
var theMoment = moment(inDate, inFormat)
var theMoment = moment.utc(inDate, inFormat)
}
// Special format or regular format?
if(outFormat == 'fromNow') {
return theMoment.fromNow()
} else {
return theMoment.format(outFormat)
return theMoment.local().format(outFormat)
}
}

View File

@@ -536,6 +536,7 @@ function ViewModel() {
callAPI({
mode: 'warnings'
}).then(function(response) {
// Reset it all
self.allWarnings.removeAll();
if(response) {
@@ -544,20 +545,16 @@ function ViewModel() {
// Go over all warnings and add
$.each(response.warnings, function(index, warning) {
// Split warning into parts
var warningSplit = convertHTMLtoText(warning).split(/\n/);
// Reformat CSS label and date
// Replaces spaces by non-breakable spaces and newlines with br's
var warningData = {
index: index,
type: glitterTranslate.status[warningSplit[1]].slice(0, -1),
text: warningSplit.slice(2).join('<br/>').replace(/ /g, '\u00A0'), // Recombine if multiple lines
date: displayDateTime(warningSplit[0], self.dateFormat(), 'YYYY-MM-DD HH:mm'),
timestamp: moment(warningSplit[0], 'YYYY-MM-DD HH:mm').unix(),
css: (warningSplit[1] == "ERROR" ? "danger" : warningSplit[1] == "WARNING" ? "warning" : "info"),
type: glitterTranslate.status[warning.type].slice(0, -1),
text: convertHTMLtoText(warning.text).replace(/ /g, '\u00A0').replace(/(?:\r\n|\r|\n)/g, '<br />'),
timestamp: warning.time,
css: (warning.type == "ERROR" ? "danger" : warning.type == "WARNING" ? "warning" : "info"),
clear: self.clearWarnings
};
self.allWarnings.push(warningData)
})
}
@@ -788,15 +785,28 @@ function ViewModel() {
}
// Update the servers
if(self.statusInfo.servers().length == 0) {
if(self.statusInfo.servers().length != data.status.servers.length) {
// Only now we can subscribe to the log-level-changes! (only at start)
if(self.statusInfo.servers().length == 0) {
self.statusInfo.loglevel.subscribe(function(newValue) {
// Update log-level
callSpecialAPI('./status/change_loglevel/', {
loglevel: newValue
});
})
}
// Empty them, in case of update
self.statusInfo.servers([])
// Initial add
$.each(data.status.servers, function() {
self.statusInfo.servers.push({
'servername': this.servername,
'serveroptional': this.serveroptional,
'serverpriority': this.serverpriority,
'servertotalconn': this.servertotalconn,
'serverssl': this.serverssl,
'servername': ko.observable(this.servername),
'serveroptional': ko.observable(this.serveroptional),
'serverpriority': ko.observable(this.serverpriority),
'servertotalconn': ko.observable(this.servertotalconn),
'serverssl': ko.observable(this.serverssl),
'serversslinfo': ko.observable(this.serversslinfo),
'serveractiveconn': ko.observable(this.serveractiveconn),
'servererror': ko.observable(this.servererror),
@@ -804,23 +814,20 @@ function ViewModel() {
'serverconnections': ko.observableArray(this.serverconnections)
})
})
// Only now we can subscribe to the log-level-changes!
self.statusInfo.loglevel.subscribe(function(newValue) {
// Update log-level
callSpecialAPI('./status/change_loglevel/', {
loglevel: newValue
});
})
} else {
// Update
$.each(data.status.servers, function(index) {
var activeServer = self.statusInfo.servers()[index];
activeServer.serveractiveconn(this.serveractiveconn)
activeServer.servererror(this.servererror)
activeServer.serveractive(this.serveractive)
activeServer.servername(this.servername),
activeServer.serveroptional(this.serveroptional),
activeServer.serverpriority(this.serverpriority),
activeServer.servertotalconn(this.servertotalconn),
activeServer.serverssl(this.serverssl),
activeServer.serversslinfo(this.serversslinfo),
activeServer.serveractiveconn(this.serveractiveconn),
activeServer.servererror(this.servererror),
activeServer.serveractive(this.serveractive),
activeServer.serverconnections(this.serverconnections)
activeServer.serversslinfo(this.serversslinfo)
})
}

View File

@@ -478,11 +478,13 @@ function QueueModel(parent, data) {
self.password = ko.observable(data.password);
self.index = ko.observable(data.index);
self.status = ko.observable(data.status);
self.isGrabbing = ko.observable(data.status == 'Grabbing')
self.isGrabbing = ko.observable(data.status == 'Grabbing' || data.avg_age == '-')
self.isFetchingBlocks = data.status == 'Fetching' || data.priority == 'Repair' // No need to update
self.totalMB = ko.observable(parseFloat(data.mb));
self.remainingMB = ko.observable(parseFloat(data.mbleft));
self.remainingMB = ko.observable(parseFloat(data.mbleft))
self.missingMB = ko.observable(parseFloat(data.mbmissing))
self.percentage = ko.observable(parseInt(data.percentage))
self.avg_age = ko.observable(data.avg_age)
self.missing = ko.observable(parseFloat(data.mbmissing))
self.direct_unpack = ko.observable(data.direct_unpack)
self.category = ko.observable(data.cat);
self.priority = ko.observable(parent.priorityName[data.priority]);
@@ -502,8 +504,8 @@ function QueueModel(parent, data) {
if(self.status() == 'Checking') {
return '#58A9FA'
}
// Check for missing data, the value is arbitrary! (3%)
if(self.missing()/self.totalMB() > 0.03) {
// Check for missing data, the value is arbitrary! (2%)
if(self.missingMB()/self.totalMB() > 0.02) {
return '#F8A34E'
}
// Set to grey, only when not Force download
@@ -514,22 +516,23 @@ function QueueModel(parent, data) {
return '';
});
// MB's and percentages
self.downloadedMB = ko.computed(function() {
return(self.totalMB() - self.remainingMB()).toFixed(0);
});
self.percentageRounded = ko.pureComputed(function() {
return fixPercentages(((self.downloadedMB() / self.totalMB()) * 100).toFixed(2))
})
// MB's
self.progressText = ko.pureComputed(function() {
return self.downloadedMB() + " MB / " + (self.totalMB() * 1).toFixed(0) + " MB";
return (self.totalMB() - self.remainingMB()).toFixed(0) + " MB / " + (self.totalMB() * 1).toFixed(0) + " MB";
})
// Texts
self.missingText= ko.pureComputed(function() {
// Check for missing data, the value is arbitrary! (3%)
if(self.missing()/self.totalMB() > 0.03) {
return self.missing().toFixed(0) + ' MB ' + glitterTranslate.misingArt
self.name_title = ko.pureComputed(function() {
// When hovering over the job
if(self.direct_unpack()) {
return self.name() + ' - ' + glitterTranslate.status['DirectUnpack'] + ': ' + self.direct_unpack()
}
return self.name()
})
self.missingText = ko.pureComputed(function() {
// Check for missing data, the value is arbitrary! (1%)
if(self.missingMB()/self.totalMB() > 0.01) {
return self.missingMB().toFixed(0) + ' MB ' + glitterTranslate.misingArt
}
return;
})
@@ -538,6 +541,10 @@ function QueueModel(parent, data) {
if(self.status() == 'Checking') {
return glitterTranslate.checking
}
// Grabbing
if(self.status() == 'Grabbing') {
return glitterTranslate.fetch
}
// Pausing status
if((self.parent.parent.downloadsPaused() && self.priority() != 2) || self.pausedStatus()) {
return glitterTranslate.paused;
@@ -546,6 +553,18 @@ function QueueModel(parent, data) {
return rewriteTime(self.timeLeft());
});
// Icon to better show force-priority
self.queueIcon = ko.computed(function() {
// Force comes first
if(self.priority() == 2) {
return 'glyphicon-forward'
}
if(self.pausedStatus()) {
return 'glyphicon-play'
}
return 'glyphicon-pause'
})
// Extra queue column
self.extraText = ko.pureComputed(function() {
// Picked anything?
@@ -578,11 +597,12 @@ function QueueModel(parent, data) {
self.password(data.password);
self.index(data.index);
self.status(data.status)
self.isGrabbing(data.status == 'Grabbing')
self.isGrabbing(data.status == 'Grabbing' || data.avg_age == '-')
self.totalMB(parseFloat(data.mb));
self.remainingMB(parseFloat(data.mbleft));
self.missingMB(parseFloat(data.mbmissing))
self.percentage(parseInt(data.percentage))
self.avg_age(data.avg_age)
self.missing(parseFloat(data.mbmissing))
self.direct_unpack(data.direct_unpack)
self.category(data.cat);
self.priority(parent.priorityName[data.priority]);
@@ -680,7 +700,7 @@ function QueueModel(parent, data) {
}
self.changePriority = function(item, event) {
// Not if we are fetching extra blocks for repair!
if(item.status() == 'Fetching') return
if(item.isFetchingBlocks) return
callAPI({
mode: 'queue',
name: 'priority',

View File

@@ -1,7 +1,13 @@
// Peity jQuery plugin version 3.2.0
// (c) 2015 Ben Pickles
// Peity jQuery plugin version 3.2.1
// (c) 2016 Ben Pickles
//
// http://benpickles.github.io/peity
//
// Released under MIT license.
!function(t,i,e,n){var r=t.fn.peity=function(i,e){return l&&this.each(function(){var n=t(this),s=n.data("_peity");s?(i&&(s.type=i),t.extend(s.opts,e)):(s=new a(n,i,t.extend({},r.defaults[i],n.data("peity"),e)),n.change(function(){s.draw()}).data("_peity",s)),s.draw()}),this},a=function(t,i,e){this.$el=t,this.type=i,this.opts=e},s=a.prototype,h=s.svgElement=function(e,n){return t(i.createElementNS("http://www.w3.org/2000/svg",e)).attr(n)},l="createElementNS"in i&&h("svg",{})[0].createSVGRect;s.draw=function(){var t=this.opts;r.graphers[this.type].call(this,t),t.after&&t.after.call(this,t)},s.fill=function(){var i=this.opts.fill;return t.isFunction(i)?i:function(t,e){return i[e%i.length]}},s.prepare=function(t,i){return this.$svg||this.$el.hide().after(this.$svg=h("svg",{"class":"peity"})),this.$svg.empty().data("peity",this).attr({height:i,width:t})},s.values=function(){if(this.opts.values){var i=this.opts.values;return this.opts.values="",i}return t.map(this.$el.text().split(this.opts.delimiter),function(t){return parseFloat(t)})},r.defaults={},r.graphers={},r.register=function(t,i,e){this.defaults[t]=i,this.graphers[t]=e},r.register("pie",{fill:["#ff9900","#fff4dd","#ffc66e"],radius:8},function(i){if(!i.delimiter){var n=this.$el.text().match(/[^0-9\.]/);i.delimiter=n?n[0]:","}var r=t.map(this.values(),function(t){return t>0?t:0});if("/"==i.delimiter){var a=r[0],s=r[1];r=[a,e.max(0,s-a)]}for(var l=0,p=r.length,o=0;p>l;l++)o+=r[l];o||(p=2,o=1,r=[0,1]);var f=2*i.radius,c=this.prepare(i.width||f,i.height||f),u=c.width(),d=c.height(),g=u/2,v=d/2,m=e.min(g,v),y=i.innerRadius;"donut"!=this.type||y||(y=.5*m);var w=e.PI,x=this.fill(),k=this.scale=function(t,i){var n=t/o*w*2-w/2;return[i*e.cos(n)+g,i*e.sin(n)+v]},$=0;for(l=0;p>l;l++){var j,A=r[l],E=A/o;if(0!=E){if(1==E)if(y){var F=g-.01,M=v-m,S=v-y;j=h("path",{d:["M",g,M,"A",m,m,0,1,1,F,M,"L",F,S,"A",y,y,0,1,0,g,S].join(" ")})}else j=h("circle",{cx:g,cy:v,r:m});else{var L=$+A,N=["M"].concat(k($,m),"A",m,m,0,E>.5?1:0,1,k(L,m),"L");y?N=N.concat(k(L,y),"A",y,y,0,E>.5?1:0,0,k($,y)):N.push(g,v),$+=A,j=h("path",{d:N.join(" ")})}j.attr("fill",x.call(this,A,l,r)),c.append(j)}}}),r.register("donut",t.extend(!0,{},r.defaults.pie),function(t){r.graphers.pie.call(this,t)}),r.register("line",{delimiter:",",fill:"#c6d9fd",height:16,min:0,stroke:"#4d89f9",strokeWidth:1,width:32},function(t){var i=this.values();1==i.length&&i.push(i[0]);for(var r=e.max.apply(e,t.max==n?i:i.concat(t.max)),a=e.min.apply(e,t.min==n?i:i.concat(t.min)),s=this.prepare(t.width,t.height),l=t.strokeWidth,p=s.width(),o=s.height()-l,f=r-a,c=this.x=function(t){return t*(p/(i.length-1))},u=this.y=function(t){var i=o;return f&&(i-=(t-a)/f*o),i+l/2},d=u(e.max(a,0)),g=[0,d],v=0;v<i.length;v++)g.push(c(v),u(i[v]));g.push(p,d),t.fill&&s.append(h("polygon",{fill:t.fill,points:g.join(" ")})),l&&s.append(h("polyline",{fill:"none",points:g.slice(2,g.length-2).join(" "),stroke:t.stroke,"stroke-width":l,"stroke-linecap":"square"}))}),r.register("bar",{delimiter:",",fill:["#4D89F9"],height:16,min:0,padding:.1,width:32},function(t){for(var i=this.values(),r=e.max.apply(e,t.max==n?i:i.concat(t.max)),a=e.min.apply(e,t.min==n?i:i.concat(t.min)),s=this.prepare(t.width,t.height),l=s.width(),p=s.height(),o=r-a,f=t.padding,c=this.fill(),u=this.x=function(t){return t*l/i.length},d=this.y=function(t){return p-(o?(t-a)/o*p:1)},g=0;g<i.length;g++){var v,m=u(g+f),y=u(g+1-f)-m,w=i[g],x=d(w),k=x,$=x;o?0>w?k=d(e.min(r,0)):$=d(e.max(a,0)):v=1,v=$-k,0==v&&(v=1,r>0&&o&&k--),s.append(h("rect",{fill:c.call(this,w,g,i),x:m,y:k,width:y,height:v}))}})}(jQuery,document,Math);
(function(k,w,h,v){var d=k.fn.peity=function(a,b){y&&this.each(function(){var e=k(this),c=e.data("_peity");c?(a&&(c.type=a),k.extend(c.opts,b)):(c=new x(e,a,k.extend({},d.defaults[a],e.data("peity"),b)),e.change(function(){c.draw()}).data("_peity",c));c.draw()});return this},x=function(a,b,e){this.$el=a;this.type=b;this.opts=e},o=x.prototype,q=o.svgElement=function(a,b){return k(w.createElementNS("http://www.w3.org/2000/svg",a)).attr(b)},y="createElementNS"in w&&q("svg",{})[0].createSVGRect;o.draw=
function(){var a=this.opts;d.graphers[this.type].call(this,a);a.after&&a.after.call(this,a)};o.fill=function(){var a=this.opts.fill;return k.isFunction(a)?a:function(b,e){return a[e%a.length]}};o.prepare=function(a,b){this.$svg||this.$el.hide().after(this.$svg=q("svg",{"class":"peity"}));return this.$svg.empty().data("peity",this).attr({height:b,width:a})};o.values=function(){return k.map(this.$el.text().split(this.opts.delimiter),function(a){return parseFloat(a)})};d.defaults={};d.graphers={};d.register=
function(a,b,e){this.defaults[a]=b;this.graphers[a]=e};d.register("pie",{fill:["#ff9900","#fff4dd","#ffc66e"],radius:8},function(a){if(!a.delimiter){var b=this.$el.text().match(/[^0-9\.]/);a.delimiter=b?b[0]:","}b=k.map(this.values(),function(a){return 0<a?a:0});if("/"==a.delimiter)var e=b[0],b=[e,h.max(0,b[1]-e)];for(var c=0,e=b.length,t=0;c<e;c++)t+=b[c];t||(e=2,t=1,b=[0,1]);var l=2*a.radius,l=this.prepare(a.width||l,a.height||l),c=l.width(),f=l.height(),j=c/2,d=f/2,f=h.min(j,d),a=a.innerRadius;
"donut"==this.type&&!a&&(a=0.5*f);for(var r=h.PI,s=this.fill(),g=this.scale=function(a,b){var c=a/t*r*2-r/2;return[b*h.cos(c)+j,b*h.sin(c)+d]},m=0,c=0;c<e;c++){var u=b[c],i=u/t;if(0!=i){if(1==i)if(a)var i=j-0.01,p=d-f,n=d-a,i=q("path",{d:["M",j,p,"A",f,f,0,1,1,i,p,"L",i,n,"A",a,a,0,1,0,j,n].join(" ")});else i=q("circle",{cx:j,cy:d,r:f});else p=m+u,n=["M"].concat(g(m,f),"A",f,f,0,0.5<i?1:0,1,g(p,f),"L"),a?n=n.concat(g(p,a),"A",a,a,0,0.5<i?1:0,0,g(m,a)):n.push(j,d),m+=u,i=q("path",{d:n.join(" ")});
i.attr("fill",s.call(this,u,c,b));l.append(i)}}});d.register("donut",k.extend(!0,{},d.defaults.pie),function(a){d.graphers.pie.call(this,a)});d.register("line",{delimiter:",",fill:"#c6d9fd",height:16,min:0,stroke:"#4d89f9",strokeWidth:1,width:32},function(a){var b=this.values();1==b.length&&b.push(b[0]);for(var e=h.max.apply(h,a.max==v?b:b.concat(a.max)),c=h.min.apply(h,a.min==v?b:b.concat(a.min)),d=this.prepare(a.width,a.height),l=a.strokeWidth,f=d.width(),j=d.height()-l,k=e-c,e=this.x=function(a){return a*
(f/(b.length-1))},r=this.y=function(a){var b=j;k&&(b-=(a-c)/k*j);return b+l/2},s=r(h.max(c,0)),g=[0,s],m=0;m<b.length;m++)g.push(e(m),r(b[m]));g.push(f,s);a.fill&&d.append(q("polygon",{fill:a.fill,points:g.join(" ")}));l&&d.append(q("polyline",{fill:"none",points:g.slice(2,g.length-2).join(" "),stroke:a.stroke,"stroke-width":l,"stroke-linecap":"square"}))});d.register("bar",{delimiter:",",fill:["#4D89F9"],height:16,min:0,padding:0.1,width:32},function(a){for(var b=this.values(),e=h.max.apply(h,a.max==
v?b:b.concat(a.max)),c=h.min.apply(h,a.min==v?b:b.concat(a.min)),d=this.prepare(a.width,a.height),l=d.width(),f=d.height(),j=e-c,a=a.padding,k=this.fill(),r=this.x=function(a){return a*l/b.length},s=this.y=function(a){return f-(j?(a-c)/j*f:1)},g=0;g<b.length;g++){var m=r(g+a),u=r(g+1-a)-m,i=b[g],p=s(i),n=p,o;j?0>i?n=s(h.min(e,0)):p=s(h.max(c,0)):o=1;o=p-n;0==o&&(o=1,0<e&&j&&n--);d.append(q("rect",{fill:k.call(this,i,g,b),x:m,y:n,width:u,height:o}))}})})(jQuery,document,Math);

View File

@@ -1,123 +1,124 @@
/*!
* Knockout JavaScript library v3.4.0
* (c) Steven Sanderson - http://knockoutjs.com/
* Knockout JavaScript library v3.4.2
* (c) The Knockout.js team - http://knockoutjs.com/
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(function() {(function(n){var x=this||(0,eval)("this"),u=x.document,M=x.navigator,v=x.jQuery,F=x.JSON;(function(n){"function"===typeof define&&define.amd?define(["exports","require"],n):"object"===typeof exports&&"object"===typeof module?n(module.exports||exports):n(x.ko={})})(function(N,O){function J(a,c){return null===a||typeof a in T?a===c:!1}function U(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function V(b,c){var d;return function(){clearTimeout(d);d=a.a.setTimeout(b,c)}}function W(a,
c){c&&c!==I?"beforeChange"===c?this.Kb(a):this.Ha(a,c):this.Lb(a)}function X(a,c){null!==c&&c.k&&c.k()}function Y(a,c){var d=this.Hc,e=d[s];e.R||(this.lb&&this.Ma[c]?(d.Pb(c,a,this.Ma[c]),this.Ma[c]=null,--this.lb):e.r[c]||d.Pb(c,a,e.s?{ia:a}:d.uc(a)))}function K(b,c,d,e){a.d[b]={init:function(b,g,k,l,m){var h,r;a.m(function(){var q=a.a.c(g()),p=!d!==!q,A=!r;if(A||c||p!==h)A&&a.va.Aa()&&(r=a.a.ua(a.f.childNodes(b),!0)),p?(A||a.f.da(b,a.a.ua(r)),a.eb(e?e(m,q):m,b)):a.f.xa(b),h=p},null,{i:b});return{controlsDescendantBindings:!0}}};
a.h.ta[b]=!1;a.f.Z[b]=!0}var a="undefined"!==typeof N?N:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.G=function(a,c,d){a[c]=d};a.version="3.4.0";a.b("version",a.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1};a.a=function(){function b(a,b){for(var c in a)a.hasOwnProperty(c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=b;return a}function e(b,c,d,e){var h=b[c].match(r)||
[];a.a.q(d.match(r),function(b){a.a.pa(h,b,e)});b[c]=h.join(" ")}var f={__proto__:[]}instanceof Array,g="function"===typeof Symbol,k={},l={};k[M&&/Firefox\/2/i.test(M.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];k.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");b(k,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)l[b[c]]=a});var m={propertychange:!0},h=u&&function(){for(var a=3,b=u.createElement("div"),c=
b.getElementsByTagName("i");b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e",c[0];);return 4<a?a:n}(),r=/\S+/g;return{cc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],q:function(a,b){for(var c=0,d=a.length;c<d;c++)b(a[c],c)},o:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Sb:function(a,b,c){for(var d=0,e=a.length;d<e;d++)if(b.call(c,a[d],d))return a[d];
return null},La:function(b,c){var d=a.a.o(b,c);0<d?b.splice(d,1):0===d&&b.shift()},Tb:function(b){b=b||[];for(var c=[],d=0,e=b.length;d<e;d++)0>a.a.o(c,b[d])&&c.push(b[d]);return c},fb:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)c.push(b(a[d],d));return c},Ka:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)b(a[d],d)&&c.push(a[d]);return c},ra:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<d;c++)a.push(b[c]);return a},pa:function(b,c,d){var e=
a.a.o(a.a.zb(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},ka:f,extend:c,Xa:d,Ya:f?d:c,D:b,Ca:function(a,b){if(!a)return a;var c={},d;for(d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d],d,a));return c},ob:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},jc:function(b){b=a.a.V(b);for(var c=(b[0]&&b[0].ownerDocument||u).createElement("div"),d=0,e=b.length;d<e;d++)c.appendChild(a.$(b[d]));return c},ua:function(b,c){for(var d=0,e=b.length,h=[];d<e;d++){var m=b[d].cloneNode(!0);h.push(c?a.$(m):m)}return h},
da:function(b,c){a.a.ob(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},qc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],h=e.parentNode,m=0,l=c.length;m<l;m++)h.insertBefore(c[m],e);m=0;for(l=d.length;m<l;m++)a.removeNode(d[m])}},za:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),
c=c.nextSibling;a.push(d)}}return a},sc:function(a,b){7>h?a.setAttribute("selected",b):a.selected=b},$a:function(a){return null===a||a===n?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},nd:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},Mc:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(3===a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=
b;)a=a.parentNode;return!!a},nb:function(b){return a.a.Mc(b,b.ownerDocument.documentElement)},Qb:function(b){return!!a.a.Sb(b,a.a.nb)},A:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},Wb:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Wb(b),c)},$b:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},p:function(b,c,d){var e=a.a.Wb(d);d=h&&m[c];if(a.options.useOnlyNativeEvents||
d||!v)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var l=function(a){e.call(b,a)},f="on"+c;b.attachEvent(f,l);a.a.F.oa(b,function(){b.detachEvent(f,l)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else v(b).bind(c,e)},Da:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===a.a.A(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==
d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!v||d)if("function"==typeof u.createEvent)if("function"==typeof b.dispatchEvent)d=u.createEvent(l[c]||"HTMLEvents"),d.initEvent(c,!0,!0,x,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");else v(b).trigger(c)},c:function(b){return a.H(b)?
b():b},zb:function(b){return a.H(b)?b.t():b},bb:function(b,c,d){var h;c&&("object"===typeof b.classList?(h=b.classList[d?"add":"remove"],a.a.q(c.match(r),function(a){h.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},Za:function(b,c){var d=a.a.c(c);if(null===d||d===n)d="";var e=a.f.firstChild(b);!e||3!=e.nodeType||a.f.nextSibling(e)?a.f.da(b,[b.ownerDocument.createTextNode(d)]):e.data=d;a.a.Rc(b)},rc:function(a,b){a.name=b;if(7>=h)try{a.mergeAttributes(u.createElement("<input name='"+
a.name+"'/>"),!1)}catch(c){}},Rc:function(a){9<=h&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},Nc:function(a){if(h){var b=a.style.width;a.style.width=0;a.style.width=b}},hd:function(b,c){b=a.a.c(b);c=a.a.c(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},V:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},Yb:function(a){return g?Symbol(a):a},rd:6===h,sd:7===h,C:h,ec:function(b,c){for(var d=a.a.V(b.getElementsByTagName("input")).concat(a.a.V(b.getElementsByTagName("textarea"))),
e="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},h=[],m=d.length-1;0<=m;m--)e(d[m])&&h.push(d[m]);return h},ed:function(b){return"string"==typeof b&&(b=a.a.$a(b))?F&&F.parse?F.parse(b):(new Function("return "+b))():null},Eb:function(b,c,d){if(!F||!F.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
return F.stringify(a.a.c(b),c,d)},fd:function(c,d,e){e=e||{};var h=e.params||{},m=e.includeFields||this.cc,l=c;if("object"==typeof c&&"form"===a.a.A(c))for(var l=c.action,f=m.length-1;0<=f;f--)for(var g=a.a.ec(c,m[f]),k=g.length-1;0<=k;k--)h[g[k].name]=g[k].value;d=a.a.c(d);var r=u.createElement("form");r.style.display="none";r.action=l;r.method="post";for(var n in d)c=u.createElement("input"),c.type="hidden",c.name=n,c.value=a.a.Eb(a.a.c(d[n])),r.appendChild(c);b(h,function(a,b){var c=u.createElement("input");
c.type="hidden";c.name=a;c.value=b;r.appendChild(c)});u.body.appendChild(r);e.submitter?e.submitter(r):r.submit();setTimeout(function(){r.parentNode.removeChild(r)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.q);a.b("utils.arrayFirst",a.a.Sb);a.b("utils.arrayFilter",a.a.Ka);a.b("utils.arrayGetDistinctValues",a.a.Tb);a.b("utils.arrayIndexOf",a.a.o);a.b("utils.arrayMap",a.a.fb);a.b("utils.arrayPushAll",a.a.ra);a.b("utils.arrayRemoveItem",a.a.La);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost",
a.a.cc);a.b("utils.getFormFields",a.a.ec);a.b("utils.peekObservable",a.a.zb);a.b("utils.postJson",a.a.fd);a.b("utils.parseJson",a.a.ed);a.b("utils.registerEventHandler",a.a.p);a.b("utils.stringifyJson",a.a.Eb);a.b("utils.range",a.a.hd);a.b("utils.toggleDomNodeCssClass",a.a.bb);a.b("utils.triggerEvent",a.a.Da);a.b("utils.unwrapObservable",a.a.c);a.b("utils.objectForEach",a.a.D);a.b("utils.addOrRemoveItem",a.a.pa);a.b("utils.setTextContent",a.a.Za);a.b("unwrap",a.a.c);Function.prototype.bind||(Function.prototype.bind=
function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.e=new function(){function a(b,g){var k=b[d];if(!k||"null"===k||!e[k]){if(!g)return n;k=b[d]="ko"+c++;e[k]={}}return e[k]}var c=0,d="__ko__"+(new Date).getTime(),e={};return{get:function(c,d){var e=a(c,!1);return e===n?n:e[d]},set:function(c,d,e){if(e!==n||a(c,!1)!==n)a(c,!0)[d]=
e},clear:function(a){var b=a[d];return b?(delete e[b],a[d]=null,!0):!1},I:function(){return c++ +d}}};a.b("utils.domData",a.a.e);a.b("utils.domData.clear",a.a.e.clear);a.a.F=new function(){function b(b,c){var e=a.a.e.get(b,d);e===n&&c&&(e=[],a.a.e.set(b,d,e));return e}function c(d){var e=b(d,!1);if(e)for(var e=e.slice(0),l=0;l<e.length;l++)e[l](d);a.a.e.clear(d);a.a.F.cleanExternalData(d);if(f[d.nodeType])for(e=d.firstChild;d=e;)e=d.nextSibling,8===d.nodeType&&c(d)}var d=a.a.e.I(),e={1:!0,8:!0,9:!0},
f={1:!0,9:!0};return{oa:function(a,c){if("function"!=typeof c)throw Error("Callback must be a function");b(a,!0).push(c)},pc:function(c,e){var l=b(c,!1);l&&(a.a.La(l,e),0==l.length&&a.a.e.set(c,d,n))},$:function(b){if(e[b.nodeType]&&(c(b),f[b.nodeType])){var d=[];a.a.ra(d,b.getElementsByTagName("*"));for(var l=0,m=d.length;l<m;l++)c(d[l])}return b},removeNode:function(b){a.$(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){v&&"function"==typeof v.cleanData&&v.cleanData([a])}}};
a.$=a.a.F.$;a.removeNode=a.a.F.removeNode;a.b("cleanNode",a.$);a.b("removeNode",a.removeNode);a.b("utils.domNodeDisposal",a.a.F);a.b("utils.domNodeDisposal.addDisposeCallback",a.a.F.oa);a.b("utils.domNodeDisposal.removeDisposeCallback",a.a.F.pc);(function(){var b=[0,"",""],c=[1,"<table>","</table>"],d=[3,"<table><tbody><tr>","</tr></tbody></table>"],e=[1,"<select multiple='multiple'>","</select>"],f={thead:c,tbody:c,tfoot:c,tr:[2,"<table><tbody>","</tbody></table>"],td:d,th:d,option:e,optgroup:e},
g=8>=a.a.C;a.a.ma=function(c,d){var e;if(v)if(v.parseHTML)e=v.parseHTML(c,d)||[];else{if((e=v.clean([c],d))&&e[0]){for(var h=e[0];h.parentNode&&11!==h.parentNode.nodeType;)h=h.parentNode;h.parentNode&&h.parentNode.removeChild(h)}}else{(e=d)||(e=u);var h=e.parentWindow||e.defaultView||x,r=a.a.$a(c).toLowerCase(),q=e.createElement("div"),p;p=(r=r.match(/^<([a-z]+)[ >]/))&&f[r[1]]||b;r=p[0];p="ignored<div>"+p[1]+c+p[2]+"</div>";"function"==typeof h.innerShiv?q.appendChild(h.innerShiv(p)):(g&&e.appendChild(q),
q.innerHTML=p,g&&q.parentNode.removeChild(q));for(;r--;)q=q.lastChild;e=a.a.V(q.lastChild.childNodes)}return e};a.a.Cb=function(b,c){a.a.ob(b);c=a.a.c(c);if(null!==c&&c!==n)if("string"!=typeof c&&(c=c.toString()),v)v(b).html(c);else for(var d=a.a.ma(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b("utils.parseHtmlFragment",a.a.ma);a.b("utils.setHtml",a.a.Cb);a.M=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.M.lc(c.nodeValue);null!=f&&e.push({Lc:c,cd:f})}else if(1==c.nodeType)for(var f=
0,g=c.childNodes,k=g.length;f<k;f++)b(g[f],e)}var c={};return{wb:function(a){if("function"!=typeof a)throw Error("You can only pass a function to ko.memoization.memoize()");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},xc:function(a,b){var f=c[a];if(f===n)throw Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.");try{return f.apply(null,b||[]),
!0}finally{delete c[a]}},yc:function(c,e){var f=[];b(c,f);for(var g=0,k=f.length;g<k;g++){var l=f[g].Lc,m=[l];e&&a.a.ra(m,e);a.M.xc(f[g].cd,m);l.nodeValue="";l.parentNode&&l.parentNode.removeChild(l)}},lc:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:null}}}();a.b("memoization",a.M);a.b("memoization.memoize",a.M.wb);a.b("memoization.unmemoize",a.M.xc);a.b("memoization.parseMemoText",a.M.lc);a.b("memoization.unmemoizeDomNodeAndDescendants",a.M.yc);a.Y=function(){function b(){if(e)for(var b=
e,c=0,m;g<e;)if(m=d[g++]){if(g>b){if(5E3<=++c){g=e;a.a.$b(Error("'Too much recursion' after processing "+c+" task groups."));break}b=e}try{m()}catch(h){a.a.$b(h)}}}function c(){b();g=e=d.length=0}var d=[],e=0,f=1,g=0;return{scheduler:x.MutationObserver?function(a){var b=u.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):u&&"onreadystatechange"in u.createElement("script")?function(a){var b=u.createElement("script");b.onreadystatechange=
function(){b.onreadystatechange=null;u.documentElement.removeChild(b);b=null;a()};u.documentElement.appendChild(b)}:function(a){setTimeout(a,0)},Wa:function(b){e||a.Y.scheduler(c);d[e++]=b;return f++},cancel:function(a){a-=f-e;a>=g&&a<e&&(d[a]=null)},resetForTesting:function(){var a=e-g;g=e=d.length=0;return a},md:b}}();a.b("tasks",a.Y);a.b("tasks.schedule",a.Y.Wa);a.b("tasks.runEarly",a.Y.md);a.ya={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.B({read:b,write:function(e){clearTimeout(d);
d=a.a.setTimeout(function(){b(e)},c)}})},rateLimit:function(a,c){var d,e,f;"number"==typeof c?d=c:(d=c.timeout,e=c.method);a.cb=!1;f="notifyWhenChangesStop"==e?V:U;a.Ta(function(a){return f(a,d)})},deferred:function(b,c){if(!0!==c)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.cb||(b.cb=!0,b.Ta(function(c){var e;return function(){a.Y.cancel(e);e=a.Y.Wa(c);b.notifySubscribers(n,"dirty")}}))},notify:function(a,c){a.equalityComparer=
"always"==c?null:J}};var T={undefined:1,"boolean":1,number:1,string:1};a.b("extenders",a.ya);a.vc=function(b,c,d){this.ia=b;this.gb=c;this.Kc=d;this.R=!1;a.G(this,"dispose",this.k)};a.vc.prototype.k=function(){this.R=!0;this.Kc()};a.J=function(){a.a.Ya(this,D);D.rb(this)};var I="change",D={rb:function(a){a.K={};a.Nb=1},X:function(b,c,d){var e=this;d=d||I;var f=new a.vc(e,c?b.bind(c):b,function(){a.a.La(e.K[d],f);e.Ia&&e.Ia(d)});e.sa&&e.sa(d);e.K[d]||(e.K[d]=[]);e.K[d].push(f);return f},notifySubscribers:function(b,
c){c=c||I;c===I&&this.zc();if(this.Pa(c))try{a.l.Ub();for(var d=this.K[c].slice(0),e=0,f;f=d[e];++e)f.R||f.gb(b)}finally{a.l.end()}},Na:function(){return this.Nb},Uc:function(a){return this.Na()!==a},zc:function(){++this.Nb},Ta:function(b){var c=this,d=a.H(c),e,f,g;c.Ha||(c.Ha=c.notifySubscribers,c.notifySubscribers=W);var k=b(function(){c.Mb=!1;d&&g===c&&(g=c());e=!1;c.tb(f,g)&&c.Ha(f=g)});c.Lb=function(a){c.Mb=e=!0;g=a;k()};c.Kb=function(a){e||(f=a,c.Ha(a,"beforeChange"))}},Pa:function(a){return this.K[a]&&
this.K[a].length},Sc:function(b){if(b)return this.K[b]&&this.K[b].length||0;var c=0;a.a.D(this.K,function(a,b){"dirty"!==a&&(c+=b.length)});return c},tb:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},extend:function(b){var c=this;b&&a.a.D(b,function(b,e){var f=a.ya[b];"function"==typeof f&&(c=f(c,e)||c)});return c}};a.G(D,"subscribe",D.X);a.G(D,"extend",D.extend);a.G(D,"getSubscriptionsCount",D.Sc);a.a.ka&&a.a.Xa(D,Function.prototype);a.J.fn=D;a.hc=function(a){return null!=
a&&"function"==typeof a.X&&"function"==typeof a.notifySubscribers};a.b("subscribable",a.J);a.b("isSubscribable",a.hc);a.va=a.l=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{Ub:b,end:c,oc:function(b){if(e){if(!a.hc(b))throw Error("Only subscribable things can act as dependencies");e.gb.call(e.Gc,b,b.Cc||(b.Cc=++f))}},w:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},Aa:function(){if(e)return e.m.Aa()},Sa:function(){if(e)return e.Sa}}}();a.b("computedContext",
a.va);a.b("computedContext.getDependenciesCount",a.va.Aa);a.b("computedContext.isInitial",a.va.Sa);a.b("ignoreDependencies",a.qd=a.l.w);var E=a.a.Yb("_latestValue");a.N=function(b){function c(){if(0<arguments.length)return c.tb(c[E],arguments[0])&&(c.ga(),c[E]=arguments[0],c.fa()),this;a.l.oc(c);return c[E]}c[E]=b;a.a.ka||a.a.extend(c,a.J.fn);a.J.fn.rb(c);a.a.Ya(c,B);a.options.deferUpdates&&a.ya.deferred(c,!0);return c};var B={equalityComparer:J,t:function(){return this[E]},fa:function(){this.notifySubscribers(this[E])},
ga:function(){this.notifySubscribers(this[E],"beforeChange")}};a.a.ka&&a.a.Xa(B,a.J.fn);var H=a.N.gd="__ko_proto__";B[H]=a.N;a.Oa=function(b,c){return null===b||b===n||b[H]===n?!1:b[H]===c?!0:a.Oa(b[H],c)};a.H=function(b){return a.Oa(b,a.N)};a.Ba=function(b){return"function"==typeof b&&b[H]===a.N||"function"==typeof b&&b[H]===a.B&&b.Vc?!0:!1};a.b("observable",a.N);a.b("isObservable",a.H);a.b("isWriteableObservable",a.Ba);a.b("isWritableObservable",a.Ba);a.b("observable.fn",B);a.G(B,"peek",B.t);a.G(B,
"valueHasMutated",B.fa);a.G(B,"valueWillMutate",B.ga);a.la=function(b){b=b||[];if("object"!=typeof b||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");b=a.N(b);a.a.Ya(b,a.la.fn);return b.extend({trackArrayChanges:!0})};a.la.fn={remove:function(b){for(var c=this.t(),d=[],e="function"!=typeof b||a.H(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];e(g)&&(0===d.length&&this.ga(),d.push(g),c.splice(f,1),f--)}d.length&&
this.fa();return d},removeAll:function(b){if(b===n){var c=this.t(),d=c.slice(0);this.ga();c.splice(0,c.length);this.fa();return d}return b?this.remove(function(c){return 0<=a.a.o(b,c)}):[]},destroy:function(b){var c=this.t(),d="function"!=typeof b||a.H(b)?function(a){return a===b}:b;this.ga();for(var e=c.length-1;0<=e;e--)d(c[e])&&(c[e]._destroy=!0);this.fa()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.o(b,c)}):[]},indexOf:function(b){var c=
this();return a.a.o(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ga(),this.t()[d]=c,this.fa())}};a.a.ka&&a.a.Xa(a.la.fn,a.N.fn);a.a.q("pop push reverse shift sort splice unshift".split(" "),function(b){a.la.fn[b]=function(){var a=this.t();this.ga();this.Vb(a,b,arguments);var d=a[b].apply(a,arguments);this.fa();return d===a?this:d}});a.a.q(["slice"],function(b){a.la.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.b("observableArray",a.la);a.ya.trackArrayChanges=function(b,
c){function d(){if(!e){e=!0;var c=b.notifySubscribers;b.notifySubscribers=function(a,b){b&&b!==I||++k;return c.apply(this,arguments)};var d=[].concat(b.t()||[]);f=null;g=b.X(function(c){c=[].concat(c||[]);if(b.Pa("arrayChange")){var e;if(!f||1<k)f=a.a.ib(d,c,b.hb);e=f}d=c;f=null;k=0;e&&e.length&&b.notifySubscribers(e,"arrayChange")})}}b.hb={};c&&"object"==typeof c&&a.a.extend(b.hb,c);b.hb.sparse=!0;if(!b.Vb){var e=!1,f=null,g,k=0,l=b.sa,m=b.Ia;b.sa=function(a){l&&l.call(b,a);"arrayChange"===a&&d()};
b.Ia=function(a){m&&m.call(b,a);"arrayChange"!==a||b.Pa("arrayChange")||(g.k(),e=!1)};b.Vb=function(b,c,d){function m(a,b,c){return l[l.length]={status:a,value:b,index:c}}if(e&&!k){var l=[],g=b.length,t=d.length,G=0;switch(c){case "push":G=g;case "unshift":for(c=0;c<t;c++)m("added",d[c],G+c);break;case "pop":G=g-1;case "shift":g&&m("deleted",b[G],G);break;case "splice":c=Math.min(Math.max(0,0>d[0]?g+d[0]:d[0]),g);for(var g=1===t?g:Math.min(c+(d[1]||0),g),t=c+t-2,G=Math.max(g,t),P=[],n=[],Q=2;c<G;++c,
++Q)c<g&&n.push(m("deleted",b[c],c)),c<t&&P.push(m("added",d[Q],c));a.a.dc(n,P);break;default:return}f=l}}}};var s=a.a.Yb("_state");a.m=a.B=function(b,c,d){function e(){if(0<arguments.length){if("function"===typeof f)f.apply(g.pb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");return this}a.l.oc(e);(g.S||g.s&&e.Qa())&&e.aa();return g.T}"object"===typeof b?d=b:(d=d||{},b&&(d.read=
b));if("function"!=typeof d.read)throw Error("Pass a function that returns the value of the ko.computed");var f=d.write,g={T:n,S:!0,Ra:!1,Fb:!1,R:!1,Va:!1,s:!1,jd:d.read,pb:c||d.owner,i:d.disposeWhenNodeIsRemoved||d.i||null,wa:d.disposeWhen||d.wa,mb:null,r:{},L:0,bc:null};e[s]=g;e.Vc="function"===typeof f;a.a.ka||a.a.extend(e,a.J.fn);a.J.fn.rb(e);a.a.Ya(e,z);d.pure?(g.Va=!0,g.s=!0,a.a.extend(e,$)):d.deferEvaluation&&a.a.extend(e,aa);a.options.deferUpdates&&a.ya.deferred(e,!0);g.i&&(g.Fb=!0,g.i.nodeType||
(g.i=null));g.s||d.deferEvaluation||e.aa();g.i&&e.ba()&&a.a.F.oa(g.i,g.mb=function(){e.k()});return e};var z={equalityComparer:J,Aa:function(){return this[s].L},Pb:function(a,c,d){if(this[s].Va&&c===this)throw Error("A 'pure' computed must not be called recursively");this[s].r[a]=d;d.Ga=this[s].L++;d.na=c.Na()},Qa:function(){var a,c,d=this[s].r;for(a in d)if(d.hasOwnProperty(a)&&(c=d[a],c.ia.Uc(c.na)))return!0},bd:function(){this.Fa&&!this[s].Ra&&this.Fa()},ba:function(){return this[s].S||0<this[s].L},
ld:function(){this.Mb||this.ac()},uc:function(a){if(a.cb&&!this[s].i){var c=a.X(this.bd,this,"dirty"),d=a.X(this.ld,this);return{ia:a,k:function(){c.k();d.k()}}}return a.X(this.ac,this)},ac:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[s].bc),this[s].bc=a.a.setTimeout(function(){b.aa(!0)},c)):b.Fa?b.Fa():b.aa(!0)},aa:function(b){var c=this[s],d=c.wa;if(!c.Ra&&!c.R){if(c.i&&!a.a.nb(c.i)||d&&d()){if(!c.Fb){this.k();return}}else c.Fb=!1;c.Ra=!0;try{this.Qc(b)}finally{c.Ra=!1}c.L||
this.k()}},Qc:function(b){var c=this[s],d=c.Va?n:!c.L,e={Hc:this,Ma:c.r,lb:c.L};a.l.Ub({Gc:e,gb:Y,m:this,Sa:d});c.r={};c.L=0;e=this.Pc(c,e);this.tb(c.T,e)&&(c.s||this.notifySubscribers(c.T,"beforeChange"),c.T=e,c.s?this.zc():b&&this.notifySubscribers(c.T));d&&this.notifySubscribers(c.T,"awake")},Pc:function(b,c){try{var d=b.jd;return b.pb?d.call(b.pb):d()}finally{a.l.end(),c.lb&&!b.s&&a.a.D(c.Ma,X),b.S=!1}},t:function(){var a=this[s];(a.S&&!a.L||a.s&&this.Qa())&&this.aa();return a.T},Ta:function(b){a.J.fn.Ta.call(this,
b);this.Fa=function(){this.Kb(this[s].T);this[s].S=!0;this.Lb(this)}},k:function(){var b=this[s];!b.s&&b.r&&a.a.D(b.r,function(a,b){b.k&&b.k()});b.i&&b.mb&&a.a.F.pc(b.i,b.mb);b.r=null;b.L=0;b.R=!0;b.S=!1;b.s=!1;b.i=null}},$={sa:function(b){var c=this,d=c[s];if(!d.R&&d.s&&"change"==b){d.s=!1;if(d.S||c.Qa())d.r=null,d.L=0,d.S=!0,c.aa();else{var e=[];a.a.D(d.r,function(a,b){e[b.Ga]=a});a.a.q(e,function(a,b){var e=d.r[a],l=c.uc(e.ia);l.Ga=b;l.na=e.na;d.r[a]=l})}d.R||c.notifySubscribers(d.T,"awake")}},
Ia:function(b){var c=this[s];c.R||"change"!=b||this.Pa("change")||(a.a.D(c.r,function(a,b){b.k&&(c.r[a]={ia:b.ia,Ga:b.Ga,na:b.na},b.k())}),c.s=!0,this.notifySubscribers(n,"asleep"))},Na:function(){var b=this[s];b.s&&(b.S||this.Qa())&&this.aa();return a.J.fn.Na.call(this)}},aa={sa:function(a){"change"!=a&&"beforeChange"!=a||this.t()}};a.a.ka&&a.a.Xa(z,a.J.fn);var R=a.N.gd;a.m[R]=a.N;z[R]=a.m;a.Xc=function(b){return a.Oa(b,a.m)};a.Yc=function(b){return a.Oa(b,a.m)&&b[s]&&b[s].Va};a.b("computed",a.m);
a.b("dependentObservable",a.m);a.b("isComputed",a.Xc);a.b("isPureComputed",a.Yc);a.b("computed.fn",z);a.G(z,"peek",z.t);a.G(z,"dispose",z.k);a.G(z,"isActive",z.ba);a.G(z,"getDependenciesCount",z.Aa);a.nc=function(b,c){if("function"===typeof b)return a.m(b,c,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.m(b,c)};a.b("pureComputed",a.nc);(function(){function b(a,f,g){g=g||new d;a=f(a);if("object"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof
Number||a instanceof Boolean)return a;var k=a instanceof Array?[]:{};g.save(a,k);c(a,function(c){var d=f(a[c]);switch(typeof d){case "boolean":case "number":case "string":case "function":k[c]=d;break;case "object":case "undefined":var h=g.get(d);k[c]=h!==n?h:b(d,f,g)}});return k}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);"function"==typeof a.toJSON&&b("toJSON")}else for(c in a)b(c)}function d(){this.keys=[];this.Ib=[]}a.wc=function(c){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");
return b(c,function(b){for(var c=0;a.H(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.wc(b);return a.a.Eb(b,c,d)};d.prototype={save:function(b,c){var d=a.a.o(this.keys,b);0<=d?this.Ib[d]=c:(this.keys.push(b),this.Ib.push(c))},get:function(b){b=a.a.o(this.keys,b);return 0<=b?this.Ib[b]:n}}})();a.b("toJS",a.wc);a.b("toJSON",a.toJSON);(function(){a.j={u:function(b){switch(a.a.A(b)){case "option":return!0===b.__ko__hasDomDataOptionValue__?a.a.e.get(b,a.d.options.xb):7>=a.a.C?b.getAttributeNode("value")&&
b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex]):n;default:return b.value}},ha:function(b,c,d){switch(a.a.A(b)){case "option":switch(typeof c){case "string":a.a.e.set(b,a.d.options.xb,n);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.e.set(b,a.d.options.xb,c),b.__ko__hasDomDataOptionValue__=!0,b.value="number"===typeof c?c:""}break;case "select":if(""===c||
null===c)c=n;for(var e=-1,f=0,g=b.options.length,k;f<g;++f)if(k=a.j.u(b.options[f]),k==c||""==k&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e;break;default:if(null===c||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.j);a.b("selectExtensions.readValue",a.j.u);a.b("selectExtensions.writeValue",a.j.ha);a.h=function(){function b(b){b=a.a.$a(b);123===b.charCodeAt(0)&&(b=b.slice(1,-1));var c=[],d=b.match(e),r,k=[],p=0;if(d){d.push(",");for(var A=0,y;y=d[A];++A){var t=y.charCodeAt(0);
if(44===t){if(0>=p){c.push(r&&k.length?{key:r,value:k.join("")}:{unknown:r||k.join("")});r=p=0;k=[];continue}}else if(58===t){if(!p&&!r&&1===k.length){r=k.pop();continue}}else 47===t&&A&&1<y.length?(t=d[A-1].match(f))&&!g[t[0]]&&(b=b.substr(b.indexOf(y)+1),d=b.match(e),d.push(","),A=-1,y="/"):40===t||123===t||91===t?++p:41===t||125===t||93===t?--p:r||k.length||34!==t&&39!==t||(y=y.slice(1,-1));k.push(y)}}return c}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,
e=RegExp("\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|/(?:[^/\\\\]|\\\\.)*/w*|[^\\s:,/][^,\"'{}()/:[\\]]*[^\\s,\"'{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,g={"in":1,"return":1,"typeof":1},k={};return{ta:[],ea:k,yb:b,Ua:function(e,m){function h(b,e){var m;if(!A){var l=a.getBindingHandler(b);if(l&&l.preprocess&&!(e=l.preprocess(e,b,h)))return;if(l=k[b])m=e,0<=a.a.o(c,m)?m=!1:(l=m.match(d),m=null===l?!1:l[1]?"Object("+l[1]+")"+l[2]:m),l=m;l&&g.push("'"+b+"':function(_z){"+m+"=_z}")}p&&(e=
"function(){return "+e+" }");f.push("'"+b+"':"+e)}m=m||{};var f=[],g=[],p=m.valueAccessors,A=m.bindingParams,y="string"===typeof e?b(e):e;a.a.q(y,function(a){h(a.key||a.unknown,a.value)});g.length&&h("_ko_property_writers","{"+g.join(",")+" }");return f.join(",")},ad:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},Ea:function(b,c,d,e,f){if(b&&a.H(b))!a.Ba(b)||f&&b.t()===e||b(e);else if((b=c.get("_ko_property_writers"))&&b[d])b[d](e)}}}();a.b("expressionRewriting",a.h);a.b("expressionRewriting.bindingRewriteValidators",
a.h.ta);a.b("expressionRewriting.parseObjectLiteral",a.h.yb);a.b("expressionRewriting.preProcessBindings",a.h.Ua);a.b("expressionRewriting._twoWayBindings",a.h.ea);a.b("jsonExpressionRewriting",a.h);a.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",a.h.Ua);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&k.test(f?a.text:a.nodeValue)}function d(a,d){for(var e=a,f=1,l=[];e=e.nextSibling;){if(c(e)&&(f--,0===f))return l;l.push(e);
b(e)&&f++}if(!d)throw Error("Cannot find closing comment tag to match: "+a.nodeValue);return null}function e(a,b){var c=d(a,b);return c?0<c.length?c[c.length-1].nextSibling:a.nextSibling:null}var f=u&&"\x3c!--test--\x3e"===u.createComment("test").text,g=f?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,k=f?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,l={ul:!0,ol:!0};a.f={Z:{},childNodes:function(a){return b(a)?d(a):a.childNodes},xa:function(c){if(b(c)){c=a.f.childNodes(c);for(var d=
0,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.ob(c)},da:function(c,d){if(b(c)){a.f.xa(c);for(var e=c.nextSibling,f=0,l=d.length;f<l;f++)e.parentNode.insertBefore(d[f],e)}else a.a.da(c,d)},mc:function(a,c){b(a)?a.parentNode.insertBefore(c,a.nextSibling):a.firstChild?a.insertBefore(c,a.firstChild):a.appendChild(c)},gc:function(c,d,e){e?b(c)?c.parentNode.insertBefore(d,e.nextSibling):e.nextSibling?c.insertBefore(d,e.nextSibling):c.appendChild(d):a.f.mc(c,d)},firstChild:function(a){return b(a)?!a.nextSibling||
c(a.nextSibling)?null:a.nextSibling:a.firstChild},nextSibling:function(a){b(a)&&(a=e(a));return a.nextSibling&&c(a.nextSibling)?null:a.nextSibling},Tc:b,pd:function(a){return(a=(f?a.text:a.nodeValue).match(g))?a[1]:null},kc:function(d){if(l[a.a.A(d)]){var h=d.firstChild;if(h){do if(1===h.nodeType){var f;f=h.firstChild;var g=null;if(f){do if(g)g.push(f);else if(b(f)){var k=e(f,!0);k?f=k:g=[f]}else c(f)&&(g=[f]);while(f=f.nextSibling)}if(f=g)for(g=h.nextSibling,k=0;k<f.length;k++)g?d.insertBefore(f[k],
g):d.appendChild(f[k])}while(h=h.nextSibling)}}}}})();a.b("virtualElements",a.f);a.b("virtualElements.allowedBindings",a.f.Z);a.b("virtualElements.emptyNode",a.f.xa);a.b("virtualElements.insertAfter",a.f.gc);a.b("virtualElements.prepend",a.f.mc);a.b("virtualElements.setDomNodeChildren",a.f.da);(function(){a.Q=function(){this.Fc={}};a.a.extend(a.Q.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=b.getAttribute("data-bind")||a.g.getComponentNameForNode(b);case 8:return a.f.Tc(b);
default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.g.Ob(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.g.Ob(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return a.f.pd(b);default:return null}},parseBindingsString:function(b,c,d,e){try{var f=this.Fc,g=b+(e&&e.valueAccessors||
""),k;if(!(k=f[g])){var l,m="with($context){with($data||{}){return{"+a.h.Ua(b,e)+"}}}";l=new Function("$context","$element",m);k=f[g]=l}return k(c,d)}catch(h){throw h.message="Unable to parse bindings.\nBindings value: "+b+"\nMessage: "+h.message,h;}}});a.Q.instance=new a.Q})();a.b("bindingProvider",a.Q);(function(){function b(a){return function(){return a}}function c(a){return a()}function d(b){return a.a.Ca(a.l.w(b),function(a,c){return function(){return b()[c]}})}function e(c,e,h){return"function"===
typeof c?d(c.bind(null,e,h)):a.a.Ca(c,b)}function f(a,b){return d(this.getBindings.bind(this,a,b))}function g(b,c,d){var e,h=a.f.firstChild(c),f=a.Q.instance,m=f.preprocessNode;if(m){for(;e=h;)h=a.f.nextSibling(e),m.call(f,e);h=a.f.firstChild(c)}for(;e=h;)h=a.f.nextSibling(e),k(b,e,d)}function k(b,c,d){var e=!0,h=1===c.nodeType;h&&a.f.kc(c);if(h&&d||a.Q.instance.nodeHasBindings(c))e=m(c,null,b,d).shouldBindDescendants;e&&!r[a.a.A(c)]&&g(b,c,!h)}function l(b){var c=[],d={},e=[];a.a.D(b,function Z(h){if(!d[h]){var f=
a.getBindingHandler(h);f&&(f.after&&(e.push(h),a.a.q(f.after,function(c){if(b[c]){if(-1!==a.a.o(e,c))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+e.join(", "));Z(c)}}),e.length--),c.push({key:h,fc:f}));d[h]=!0}});return c}function m(b,d,e,h){var m=a.a.e.get(b,q);if(!d){if(m)throw Error("You cannot apply bindings multiple times to the same element.");a.a.e.set(b,q,!0)}!m&&h&&a.tc(b,e);var g;if(d&&"function"!==typeof d)g=d;else{var k=a.Q.instance,r=k.getBindingAccessors||
f,p=a.B(function(){(g=d?d(e,b):r.call(k,b,e))&&e.P&&e.P();return g},null,{i:b});g&&p.ba()||(p=null)}var u;if(g){var v=p?function(a){return function(){return c(p()[a])}}:function(a){return g[a]},s=function(){return a.a.Ca(p?p():g,c)};s.get=function(a){return g[a]&&c(v(a))};s.has=function(a){return a in g};h=l(g);a.a.q(h,function(c){var d=c.fc.init,h=c.fc.update,f=c.key;if(8===b.nodeType&&!a.f.Z[f])throw Error("The binding '"+f+"' cannot be used with virtual elements");try{"function"==typeof d&&a.l.w(function(){var a=
d(b,v(f),s,e.$data,e);if(a&&a.controlsDescendantBindings){if(u!==n)throw Error("Multiple bindings ("+u+" and "+f+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");u=f}}),"function"==typeof h&&a.B(function(){h(b,v(f),s,e.$data,e)},null,{i:b})}catch(m){throw m.message='Unable to process binding "'+f+": "+g[f]+'"\nMessage: '+m.message,m;}})}return{shouldBindDescendants:u===n}}function h(b){return b&&b instanceof a.U?b:new a.U(b)}
a.d={};var r={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.d[b]};a.U=function(b,c,d,e){var h=this,f="function"==typeof b&&!a.H(b),m,g=a.B(function(){var m=f?b():b,l=a.a.c(m);c?(c.P&&c.P(),a.a.extend(h,c),g&&(h.P=g)):(h.$parents=[],h.$root=l,h.ko=a);h.$rawData=m;h.$data=l;d&&(h[d]=l);e&&e(h,c,l);return h.$data},null,{wa:function(){return m&&!a.a.Qb(m)},i:!0});g.ba()&&(h.P=g,g.equalityComparer=null,m=[],g.Ac=function(b){m.push(b);a.a.F.oa(b,function(b){a.a.La(m,b);m.length||
(g.k(),h.P=g=n)})})};a.U.prototype.createChildContext=function(b,c,d){return new a.U(b,this,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);d&&d(a)})};a.U.prototype.extend=function(b){return new a.U(this.P||this.$data,this,null,function(c,d){c.$rawData=d.$rawData;a.a.extend(c,"function"==typeof b?b():b)})};var q=a.a.e.I(),p=a.a.e.I();a.tc=function(b,c){if(2==arguments.length)a.a.e.set(b,p,c),c.P&&c.P.Ac(b);else return a.a.e.get(b,
p)};a.Ja=function(b,c,d){1===b.nodeType&&a.f.kc(b);return m(b,c,h(d),!0)};a.Dc=function(b,c,d){d=h(d);return a.Ja(b,e(c,d,b),d)};a.eb=function(a,b){1!==b.nodeType&&8!==b.nodeType||g(h(a),b,!0)};a.Rb=function(a,b){!v&&x.jQuery&&(v=x.jQuery);if(b&&1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");b=b||x.document.body;k(h(a),b,!0)};a.kb=function(b){switch(b.nodeType){case 1:case 8:var c=a.tc(b);if(c)return c;
if(b.parentNode)return a.kb(b.parentNode)}return n};a.Jc=function(b){return(b=a.kb(b))?b.$data:n};a.b("bindingHandlers",a.d);a.b("applyBindings",a.Rb);a.b("applyBindingsToDescendants",a.eb);a.b("applyBindingAccessorsToNode",a.Ja);a.b("applyBindingsToNode",a.Dc);a.b("contextFor",a.kb);a.b("dataFor",a.Jc)})();(function(b){function c(c,e){var m=f.hasOwnProperty(c)?f[c]:b,h;m?m.X(e):(m=f[c]=new a.J,m.X(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,Zc:e};delete f[c];h||e?m.notifySubscribers(b):
a.Y.Wa(function(){m.notifySubscribers(b)})}),h=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",[a,c],function(a){b(a,c)}):b(null,null)})}function e(c,d,f,h){h||(h=a.g.loaders.slice(0));var g=h.shift();if(g){var q=g[c];if(q){var p=!1;if(q.apply(g,d.concat(function(a){p?f(null):null!==a?f(a):e(c,d,f,h)}))!==b&&(p=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,h)}else f(null)}
var f={},g={};a.g={get:function(d,e){var f=g.hasOwnProperty(d)?g[d]:b;f?f.Zc?a.l.w(function(){e(f.definition)}):a.Y.Wa(function(){e(f.definition)}):c(d,e)},Xb:function(a){delete g[a]},Jb:e};a.g.loaders=[];a.b("components",a.g);a.b("components.get",a.g.get);a.b("components.clearCachedDefinition",a.g.Xb)})();(function(){function b(b,c,d,e){function g(){0===--y&&e(k)}var k={},y=2,t=d.template;d=d.viewModel;t?f(c,t,function(c){a.g.Jb("loadTemplate",[b,c],function(a){k.template=a;g()})}):g();d?f(c,d,function(c){a.g.Jb("loadViewModel",
[b,c],function(a){k[l]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)});else if("function"===typeof b[l])d(b[l]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.A(b)){case "script":return a.a.ma(b.text);case "textarea":return a.a.ma(b.value);case "template":if(e(b.content))return a.a.ua(b.content.childNodes)}return a.a.ua(b.childNodes)}function e(a){return x.DocumentFragment?
a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require?O||x.require?(O||x.require)([b.require],c):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+a+"': "+b);}}var k={};a.g.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.g.ub(b))throw Error("Component "+b+" is already registered");k[b]=c};a.g.ub=function(a){return k.hasOwnProperty(a)};a.g.od=function(b){delete k[b];
a.g.Xb(b)};a.g.Zb={getConfig:function(a,b){b(k.hasOwnProperty(a)?k[a]:null)},loadComponent:function(a,c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.ma(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.V(c.childNodes));else if(c.element)if(c=c.element,x.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var l=u.getElementById(c);l?f(d(l)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+
c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),b,d)}};var l="createViewModel";a.b("components.register",a.g.register);a.b("components.isRegistered",a.g.ub);a.b("components.unregister",a.g.od);a.b("components.defaultLoader",a.g.Zb);a.g.loaders.push(a.g.Zb);a.g.Bc=k})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ca(f,function(c){return a.m(c,null,{i:b})}),g=a.a.Ca(f,function(c){var e=
c.t();return c.ba()?a.m({read:function(){return a.a.c(c())},write:a.Ba(e)&&function(a){c()(a)},i:b}):e});g.hasOwnProperty("$raw")||(g.$raw=f);return g}return{$raw:{}}}a.g.getComponentNameForNode=function(b){var c=a.a.A(b);if(a.g.ub(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.C&&b.tagName===c))return c};a.g.Ob=function(c,e,f,g){if(1===e.nodeType){var k=a.g.getComponentNameForNode(e);if(k){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component');
var l={name:k,params:b(e,f)};c.component=g?function(){return l}:l}}return c};var c=new a.Q;9>a.a.C&&(a.g.register=function(a){return function(b){u.createElement(b);return a.apply(this,arguments)}}(a.g.register),u.createDocumentFragment=function(b){return function(){var c=b(),f=a.g.Bc,g;for(g in f)f.hasOwnProperty(g)&&c.createElement(g);return c}}(u.createDocumentFragment))})();(function(b){function c(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.ua(c);a.f.da(d,b)}
function d(a,b,c,d){var e=a.createViewModel;return e?e.call(a,d,{element:b,templateNodes:c}):d}var e=0;a.d.component={init:function(f,g,k,l,m){function h(){var a=r&&r.dispose;"function"===typeof a&&a.call(r);q=r=null}var r,q,p=a.a.V(a.f.childNodes(f));a.a.F.oa(f,h);a.m(function(){var l=a.a.c(g()),k,t;"string"===typeof l?k=l:(k=a.a.c(l.name),t=a.a.c(l.params));if(!k)throw Error("No component name specified");var n=q=++e;a.g.get(k,function(e){if(q===n){h();if(!e)throw Error("Unknown component '"+k+
"'");c(k,e,f);var g=d(e,f,p,t);e=m.createChildContext(g,b,function(a){a.$component=g;a.$componentTemplateNodes=p});r=g;a.eb(e,f)}})},null,{i:f});return{controlsDescendantBindings:!0}}};a.f.Z.component=!0})();var S={"class":"className","for":"htmlFor"};a.d.attr={update:function(b,c){var d=a.a.c(c())||{};a.a.D(d,function(c,d){d=a.a.c(d);var g=!1===d||null===d||d===n;g&&b.removeAttribute(c);8>=a.a.C&&c in S?(c=S[c],g?b.removeAttribute(c):b[c]=d):g||b.setAttribute(c,d.toString());"name"===c&&a.a.rc(b,
g?"":d.toString())})}};(function(){a.d.checked={after:["value","attr"],init:function(b,c,d){function e(){var e=b.checked,f=p?g():e;if(!a.va.Sa()&&(!l||e)){var m=a.l.w(c);if(h){var k=r?m.t():m;q!==f?(e&&(a.a.pa(k,f,!0),a.a.pa(k,q,!1)),q=f):a.a.pa(k,f,e);r&&a.Ba(m)&&m(k)}else a.h.Ea(m,d,"checked",f,!0)}}function f(){var d=a.a.c(c());b.checked=h?0<=a.a.o(d,g()):k?d:g()===d}var g=a.nc(function(){return d.has("checkedValue")?a.a.c(d.get("checkedValue")):d.has("value")?a.a.c(d.get("value")):b.value}),k=
"checkbox"==b.type,l="radio"==b.type;if(k||l){var m=c(),h=k&&a.a.c(m)instanceof Array,r=!(h&&m.push&&m.splice),q=h?g():n,p=l||h;l&&!b.name&&a.d.uniqueName.init(b,function(){return!0});a.m(e,null,{i:b});a.a.p(b,"click",e);a.m(f,null,{i:b});m=n}}};a.h.ea.checked=!0;a.d.checkedValue={update:function(b,c){b.value=a.a.c(c())}}})();a.d.css={update:function(b,c){var d=a.a.c(c());null!==d&&"object"==typeof d?a.a.D(d,function(c,d){d=a.a.c(d);a.a.bb(b,c,d)}):(d=a.a.$a(String(d||"")),a.a.bb(b,b.__ko__cssValue,
!1),b.__ko__cssValue=d,a.a.bb(b,d,!0))}};a.d.enable={update:function(b,c){var d=a.a.c(c());d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.d.disable={update:function(b,c){a.d.enable.update(b,function(){return!a.a.c(c())})}};a.d.event={init:function(b,c,d,e,f){var g=c()||{};a.a.D(g,function(g){"string"==typeof g&&a.a.p(b,g,function(b){var m,h=c()[g];if(h){try{var r=a.a.V(arguments);e=f.$data;r.unshift(e);m=h.apply(e,r)}finally{!0!==m&&(b.preventDefault?b.preventDefault():
b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.d.foreach={ic:function(b){return function(){var c=b(),d=a.a.zb(c);if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.W.sb};a.a.c(c);return{foreach:d.data,as:d.as,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.W.sb}}},init:function(b,c){return a.d.template.init(b,
a.d.foreach.ic(c))},update:function(b,c,d,e,f){return a.d.template.update(b,a.d.foreach.ic(c),d,e,f)}};a.h.ta.foreach=!1;a.f.Z.foreach=!0;a.d.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(h){g=f.body}e=g===b}f=c();a.h.Ea(f,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.p(b,"focus",f);a.a.p(b,"focusin",f);a.a.p(b,"blur",g);a.a.p(b,
"focusout",g)},update:function(b,c){var d=!!a.a.c(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.l.w(a.a.Da,null,[b,d?"focusin":"focusout"]))}};a.h.ea.hasfocus=!0;a.d.hasFocus=a.d.hasfocus;a.h.ea.hasFocus=!0;a.d.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Cb(b,c())}};K("if");K("ifnot",!1,!0);K("with",!0,!1,function(a,c){return a.createChildContext(c)});var L={};
a.d.options={init:function(b){if("select"!==a.a.A(b))throw Error("options binding applies only to SELECT elements");for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.Ka(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c}function g(c,e){if(A&&h)a.j.ha(b,a.a.c(d.get("value")),!0);else if(p.length){var f=0<=a.a.o(p,a.j.u(e[0]));a.a.sc(e[0],f);A&&!f&&a.l.w(a.a.Da,null,[b,
"change"])}}var k=b.multiple,l=0!=b.length&&k?b.scrollTop:null,m=a.a.c(c()),h=d.get("valueAllowUnset")&&d.has("value"),r=d.get("optionsIncludeDestroyed");c={};var q,p=[];h||(k?p=a.a.fb(e(),a.j.u):0<=b.selectedIndex&&p.push(a.j.u(b.options[b.selectedIndex])));m&&("undefined"==typeof m.length&&(m=[m]),q=a.a.Ka(m,function(b){return r||b===n||null===b||!a.a.c(b._destroy)}),d.has("optionsCaption")&&(m=a.a.c(d.get("optionsCaption")),null!==m&&m!==n&&q.unshift(L)));var A=!1;c.beforeRemove=function(a){b.removeChild(a)};
m=g;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(m=function(b,c){g(0,c);a.l.w(d.get("optionsAfterRender"),null,[c[0],b!==L?b:n])});a.a.Bb(b,q,function(c,e,g){g.length&&(p=!h&&g[0].selected?[a.j.u(g[0])]:[],A=!0);e=b.ownerDocument.createElement("option");c===L?(a.a.Za(e,d.get("optionsCaption")),a.j.ha(e,n)):(g=f(c,d.get("optionsValue"),c),a.j.ha(e,a.a.c(g)),c=f(c,d.get("optionsText"),g),a.a.Za(e,c));return[e]},c,m);a.l.w(function(){h?a.j.ha(b,a.a.c(d.get("value")),
!0):(k?p.length&&e().length<p.length:p.length&&0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex])!==p[0]:p.length||0<=b.selectedIndex)&&a.a.Da(b,"change")});a.a.Nc(b);l&&20<Math.abs(l-b.scrollTop)&&(b.scrollTop=l)}};a.d.options.xb=a.a.e.I();a.d.selectedOptions={after:["options","foreach"],init:function(b,c,d){a.a.p(b,"change",function(){var e=c(),f=[];a.a.q(b.getElementsByTagName("option"),function(b){b.selected&&f.push(a.j.u(b))});a.h.Ea(e,d,"selectedOptions",f)})},update:function(b,c){if("select"!=
a.a.A(b))throw Error("values binding applies only to SELECT elements");var d=a.a.c(c()),e=b.scrollTop;d&&"number"==typeof d.length&&a.a.q(b.getElementsByTagName("option"),function(b){var c=0<=a.a.o(d,a.j.u(b));b.selected!=c&&a.a.sc(b,c)});b.scrollTop=e}};a.h.ea.selectedOptions=!0;a.d.style={update:function(b,c){var d=a.a.c(c()||{});a.a.D(d,function(c,d){d=a.a.c(d);if(null===d||d===n||!1===d)d="";b.style[c]=d})}};a.d.submit={init:function(b,c,d,e,f){if("function"!=typeof c())throw Error("The value for a submit binding must be a function");
a.a.p(b,"submit",function(a){var d,e=c();try{d=e.call(f.$data,b)}finally{!0!==d&&(a.preventDefault?a.preventDefault():a.returnValue=!1)}})}};a.d.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Za(b,c())}};a.f.Z.text=!0;(function(){if(x&&x.navigator)var b=function(a){if(a)return parseFloat(a[1])},c=x.opera&&x.opera.version&&parseInt(x.opera.version()),d=x.navigator.userAgent,e=b(d.match(/^(?:(?!chrome).)*version\/([^ ]*) safari/i)),f=b(d.match(/Firefox\/([^ ]*)/));
if(10>a.a.C)var g=a.a.e.I(),k=a.a.e.I(),l=function(b){var c=this.activeElement;(c=c&&a.a.e.get(c,k))&&c(b)},m=function(b,c){var d=b.ownerDocument;a.a.e.get(d,g)||(a.a.e.set(d,g,!0),a.a.p(d,"selectionchange",l));a.a.e.set(b,k,c)};a.d.textInput={init:function(b,d,g){function l(c,d){a.a.p(b,c,d)}function k(){var c=a.a.c(d());if(null===c||c===n)c="";v!==n&&c===v?a.a.setTimeout(k,4):b.value!==c&&(u=c,b.value=c)}function y(){s||(v=b.value,s=a.a.setTimeout(t,4))}function t(){clearTimeout(s);v=s=n;var c=
b.value;u!==c&&(u=c,a.h.Ea(d(),g,"textInput",c))}var u=b.value,s,v,x=9==a.a.C?y:t;10>a.a.C?(l("propertychange",function(a){"value"===a.propertyName&&x(a)}),8==a.a.C&&(l("keyup",t),l("keydown",t)),8<=a.a.C&&(m(b,x),l("dragend",y))):(l("input",t),5>e&&"textarea"===a.a.A(b)?(l("keydown",y),l("paste",y),l("cut",y)):11>c?l("keydown",y):4>f&&(l("DOMAutoComplete",t),l("dragdrop",t),l("drop",t)));l("change",t);a.m(k,null,{i:b})}};a.h.ea.textInput=!0;a.d.textinput={preprocess:function(a,b,c){c("textInput",
a)}}})();a.d.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+ ++a.d.uniqueName.Ic;a.a.rc(b,d)}}};a.d.uniqueName.Ic=0;a.d.value={after:["options","foreach"],init:function(b,c,d){if("input"!=b.tagName.toLowerCase()||"checkbox"!=b.type&&"radio"!=b.type){var e=["change"],f=d.get("valueUpdate"),g=!1,k=null;f&&("string"==typeof f&&(f=[f]),a.a.ra(e,f),e=a.a.Tb(e));var l=function(){k=null;g=!1;var e=c(),f=a.j.u(b);a.h.Ea(e,d,"value",f)};!a.a.C||"input"!=b.tagName.toLowerCase()||"text"!=b.type||
"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.o(e,"propertychange")||(a.a.p(b,"propertychange",function(){g=!0}),a.a.p(b,"focus",function(){g=!1}),a.a.p(b,"blur",function(){g&&l()}));a.a.q(e,function(c){var d=l;a.a.nd(c,"after")&&(d=function(){k=a.j.u(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.p(b,c,d)});var m=function(){var e=a.a.c(c()),f=a.j.u(b);if(null!==k&&e===k)a.a.setTimeout(m,0);else if(e!==f)if("select"===a.a.A(b)){var g=d.get("valueAllowUnset"),f=function(){a.j.ha(b,
e,g)};f();g||e===a.j.u(b)?a.a.setTimeout(f,0):a.l.w(a.a.Da,null,[b,"change"])}else a.j.ha(b,e)};a.m(m,null,{i:b})}else a.Ja(b,{checkedValue:c})},update:function(){}};a.h.ea.value=!0;a.d.visible={update:function(b,c){var d=a.a.c(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};(function(b){a.d[b]={init:function(c,d,e,f,g){return a.d.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click");a.O=function(){};a.O.prototype.renderTemplateSource=
function(){throw Error("Override renderTemplateSource");};a.O.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.O.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||u;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.v.n(d)}if(1==b.nodeType||8==b.nodeType)return new a.v.qa(b);throw Error("Unknown template type: "+b);};a.O.prototype.renderTemplate=function(a,c,d,e){a=this.makeTemplateSource(a,
e);return this.renderTemplateSource(a,c,d,e)};a.O.prototype.isTemplateRewritten=function(a,c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.O.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.O);a.Gb=function(){function b(b,c,d,k){b=a.h.yb(b);for(var l=a.h.ta,m=0;m<b.length;m++){var h=b[m].key;if(l.hasOwnProperty(h)){var r=l[h];if("function"===typeof r){if(h=
r(b[m].value))throw Error(h);}else if(!r)throw Error("This template engine does not support the '"+h+"' binding within its templates");}}d="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+a.h.Ua(b,{valueAccessors:!0})+" } })()},'"+d.toLowerCase()+"')";return k.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{Oc:function(b,
c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.Gb.dd(b,c)},d)},dd:function(a,f){return a.replace(c,function(a,c,d,e,h){return b(h,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},Ec:function(b,c){return a.M.wb(function(d,k){var l=d.nextSibling;l&&l.nodeName.toLowerCase()===c&&a.Ja(l,b,k)})}}}();a.b("__tr_ambtns",a.Gb.Ec);(function(){a.v={};a.v.n=function(b){if(this.n=b){var c=a.a.A(b);this.ab="script"===c?1:"textarea"===c?2:"template"==c&&
b.content&&11===b.content.nodeType?3:4}};a.v.n.prototype.text=function(){var b=1===this.ab?"text":2===this.ab?"value":"innerHTML";if(0==arguments.length)return this.n[b];var c=arguments[0];"innerHTML"===b?a.a.Cb(this.n,c):this.n[b]=c};var b=a.a.e.I()+"_";a.v.n.prototype.data=function(c){if(1===arguments.length)return a.a.e.get(this.n,b+c);a.a.e.set(this.n,b+c,arguments[1])};var c=a.a.e.I();a.v.n.prototype.nodes=function(){var b=this.n;if(0==arguments.length)return(a.a.e.get(b,c)||{}).jb||(3===this.ab?
b.content:4===this.ab?b:n);a.a.e.set(b,c,{jb:arguments[0]})};a.v.qa=function(a){this.n=a};a.v.qa.prototype=new a.v.n;a.v.qa.prototype.text=function(){if(0==arguments.length){var b=a.a.e.get(this.n,c)||{};b.Hb===n&&b.jb&&(b.Hb=b.jb.innerHTML);return b.Hb}a.a.e.set(this.n,c,{Hb:arguments[0]})};a.b("templateSources",a.v);a.b("templateSources.domElement",a.v.n);a.b("templateSources.anonymousTemplate",a.v.qa)})();(function(){function b(b,c,d){var e;for(c=a.f.nextSibling(c);b&&(e=b)!==c;)b=a.f.nextSibling(e),
d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,k=a.Q.instance,n=k.preprocessNode;if(n){b(e,f,function(a,b){var c=a.previousSibling,d=n.call(k,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):(c.push(e,f),a.a.za(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.Rb(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.M.yc(b,[d])});a.a.za(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,
e,f,k,q){q=q||{};var p=(b&&d(b)||f||{}).ownerDocument,n=q.templateEngine||g;a.Gb.Oc(f,n,p);f=n.renderTemplate(f,k,q,p);if("number"!=typeof f.length||0<f.length&&"number"!=typeof f[0].nodeType)throw Error("Template engine must return an array of DOM nodes");p=!1;switch(e){case "replaceChildren":a.f.da(b,f);p=!0;break;case "replaceNode":a.a.qc(b,f);p=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+e);}p&&(c(f,k),q.afterRender&&a.l.w(q.afterRender,null,[f,k.$data]));
return f}function f(b,c,d){return a.H(b)?b():"function"===typeof b?b(c,d):b}var g;a.Db=function(b){if(b!=n&&!(b instanceof a.O))throw Error("templateEngine must inherit from ko.templateEngine");g=b};a.Ab=function(b,c,h,k,q){h=h||{};if((h.templateEngine||g)==n)throw Error("Set a template engine before calling renderTemplate");q=q||"replaceChildren";if(k){var p=d(k);return a.B(function(){var g=c&&c instanceof a.U?c:new a.U(a.a.c(c)),n=f(b,g.$data,g),g=e(k,q,n,g,h);"replaceNode"==q&&(k=g,p=d(k))},null,
{wa:function(){return!p||!a.a.nb(p)},i:p&&"replaceNode"==q?p.parentNode:p})}return a.M.wb(function(d){a.Ab(b,c,h,d,"replaceNode")})};a.kd=function(b,d,g,k,q){function p(a,b){c(b,s);g.afterRender&&g.afterRender(b,a);s=null}function u(a,c){s=q.createChildContext(a,g.as,function(a){a.$index=c});var d=f(b,a,s);return e(null,"ignoreTargetNode",d,s,g)}var s;return a.B(function(){var b=a.a.c(d)||[];"undefined"==typeof b.length&&(b=[b]);b=a.a.Ka(b,function(b){return g.includeDestroyed||b===n||null===b||!a.a.c(b._destroy)});
a.l.w(a.a.Bb,null,[k,b,u,g,p])},null,{i:k})};var k=a.a.e.I();a.d.template={init:function(b,c){var d=a.a.c(c());if("string"==typeof d||d.name)a.f.xa(b);else{if("nodes"in d){if(d=d.nodes||[],a.H(d))throw Error('The "nodes" option must be a plain, non-observable array.');}else d=a.f.childNodes(b);d=a.a.jc(d);(new a.v.qa(b)).nodes(d)}return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c(),s;c=a.a.c(g);d=!0;e=null;"string"==typeof c?c={}:(g=c.name,"if"in c&&(d=a.a.c(c["if"])),d&&"ifnot"in
c&&(d=!a.a.c(c.ifnot)),s=a.a.c(c.data));"foreach"in c?e=a.kd(g||b,d&&c.foreach||[],c,b,f):d?(f="data"in c?f.createChildContext(s,c.as):f,e=a.Ab(g||b,f,c,b)):a.f.xa(b);f=e;(s=a.a.e.get(b,k))&&"function"==typeof s.k&&s.k();a.a.e.set(b,k,f&&f.ba()?f:n)}};a.h.ta.template=function(b){b=a.h.yb(b);return 1==b.length&&b[0].unknown||a.h.ad(b,"name")?null:"This template engine does not support anonymous templates nested within its templates"};a.f.Z.template=!0})();a.b("setTemplateEngine",a.Db);a.b("renderTemplate",
a.Ab);a.a.dc=function(a,c,d){if(a.length&&c.length){var e,f,g,k,l;for(e=f=0;(!d||e<d)&&(k=a[f]);++f){for(g=0;l=c[g];++g)if(k.value===l.value){k.moved=l.index;l.moved=k.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.ib=function(){function b(b,d,e,f,g){var k=Math.min,l=Math.max,m=[],h,n=b.length,q,p=d.length,s=p-n||1,u=n+p+1,t,v,x;for(h=0;h<=n;h++)for(v=t,m.push(t=[]),x=k(p,h+s),q=l(0,h-1);q<=x;q++)t[q]=q?h?b[h-1]===d[q-1]?v[q-1]:k(v[q]||u,t[q-1]||u)+1:q+1:h+1;k=[];l=[];s=[];h=n;for(q=p;h||q;)p=m[h][q]-
1,q&&p===m[h][q-1]?l.push(k[k.length]={status:e,value:d[--q],index:q}):h&&p===m[h-1][q]?s.push(k[k.length]={status:f,value:b[--h],index:h}):(--q,--h,g.sparse||k.push({status:"retained",value:d[q]}));a.a.dc(s,l,!g.dontLimitMoves&&10*n);return k.reverse()}return function(a,d,e){e="boolean"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,"added","deleted",e):b(d,a,"deleted","added",e)}}();a.b("utils.compareArrays",a.a.ib);(function(){function b(b,c,d,k,l){var m=[],
h=a.B(function(){var h=c(d,l,a.a.za(m,b))||[];0<m.length&&(a.a.qc(m,h),k&&a.l.w(k,null,[d,h,l]));m.length=0;a.a.ra(m,h)},null,{i:b,wa:function(){return!a.a.Qb(m)}});return{ca:m,B:h.ba()?h:n}}var c=a.a.e.I(),d=a.a.e.I();a.a.Bb=function(e,f,g,k,l){function m(b,c){w=q[c];v!==c&&(D[b]=w);w.qb(v++);a.a.za(w.ca,e);u.push(w);z.push(w)}function h(b,c){if(b)for(var d=0,e=c.length;d<e;d++)c[d]&&a.a.q(c[d].ca,function(a){b(a,d,c[d].ja)})}f=f||[];k=k||{};var r=a.a.e.get(e,c)===n,q=a.a.e.get(e,c)||[],p=a.a.fb(q,
function(a){return a.ja}),s=a.a.ib(p,f,k.dontLimitMoves),u=[],t=0,v=0,x=[],z=[];f=[];for(var D=[],p=[],w,C=0,B,E;B=s[C];C++)switch(E=B.moved,B.status){case "deleted":E===n&&(w=q[t],w.B&&(w.B.k(),w.B=n),a.a.za(w.ca,e).length&&(k.beforeRemove&&(u.push(w),z.push(w),w.ja===d?w=null:f[C]=w),w&&x.push.apply(x,w.ca)));t++;break;case "retained":m(C,t++);break;case "added":E!==n?m(C,E):(w={ja:B.value,qb:a.N(v++)},u.push(w),z.push(w),r||(p[C]=w))}a.a.e.set(e,c,u);h(k.beforeMove,D);a.a.q(x,k.beforeRemove?a.$:
a.removeNode);for(var C=0,r=a.f.firstChild(e),F;w=z[C];C++){w.ca||a.a.extend(w,b(e,g,w.ja,l,w.qb));for(t=0;s=w.ca[t];r=s.nextSibling,F=s,t++)s!==r&&a.f.gc(e,s,F);!w.Wc&&l&&(l(w.ja,w.ca,w.qb),w.Wc=!0)}h(k.beforeRemove,f);for(C=0;C<f.length;++C)f[C]&&(f[C].ja=d);h(k.afterMove,D);h(k.afterAdd,p)}})();a.b("utils.setDomNodeChildrenFromArrayMapping",a.a.Bb);a.W=function(){this.allowTemplateRewriting=!1};a.W.prototype=new a.O;a.W.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.C?0:b.nodes)?
b.nodes():null)return a.a.V(c.cloneNode(!0).childNodes);b=b.text();return a.a.ma(b,e)};a.W.sb=new a.W;a.Db(a.W.sb);a.b("nativeTemplateEngine",a.W);(function(){a.vb=function(){var a=this.$c=function(){if(!v||!v.tmpl)return 0;try{if(0<=v.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,e,f,g){g=g||u;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var k=b.data("precompiled");
k||(k=b.text()||"",k=v.template(null,"{{ko_with $item.koBindingContext}}"+k+"{{/ko_with}}"),b.data("precompiled",k));b=[e.$data];e=v.extend({koBindingContext:e},f.templateOptions);e=v.tmpl(k,b,e);e.appendTo(g.createElement("div"));v.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){u.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(v.tmpl.tag.ko_code={open:"__.push($1 || '');"},
v.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};a.vb.prototype=new a.O;var b=new a.vb;0<b.$c&&a.Db(b);a.b("jqueryTmplTemplateEngine",a.vb)})()})})();})();
(function() {(function(n){var x=this||(0,eval)("this"),t=x.document,M=x.navigator,u=x.jQuery,H=x.JSON;(function(n){"function"===typeof define&&define.amd?define(["exports","require"],n):"object"===typeof exports&&"object"===typeof module?n(module.exports||exports):n(x.ko={})})(function(N,O){function J(a,c){return null===a||typeof a in R?a===c:!1}function S(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function T(b,c){var d;return function(){clearTimeout(d);d=a.a.setTimeout(b,c)}}function U(a,
c){c&&c!==E?"beforeChange"===c?this.Ob(a):this.Ja(a,c):this.Pb(a)}function V(a,c){null!==c&&c.k&&c.k()}function W(a,c){var d=this.Mc,e=d[s];e.T||(this.ob&&this.Oa[c]?(d.Sb(c,a,this.Oa[c]),this.Oa[c]=null,--this.ob):e.s[c]||d.Sb(c,a,e.t?{$:a}:d.yc(a)),a.Ha&&a.Hc())}function K(b,c,d,e){a.d[b]={init:function(b,g,h,l,m){var k,r;a.m(function(){var q=g(),p=a.a.c(q),p=!d!==!p,A=!r;if(A||c||p!==k)A&&a.xa.Ca()&&(r=a.a.wa(a.f.childNodes(b),!0)),p?(A||a.f.fa(b,a.a.wa(r)),a.hb(e?e(m,q):m,b)):a.f.za(b),k=p},null,
{i:b});return{controlsDescendantBindings:!0}}};a.h.va[b]=!1;a.f.aa[b]=!0}var a="undefined"!==typeof N?N:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.H=function(a,c,d){a[c]=d};a.version="3.4.2";a.b("version",a.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1};a.a=function(){function b(a,b){for(var c in a)a.hasOwnProperty(c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=
b;return a}function e(b,c,d,e){var m=b[c].match(r)||[];a.a.r(d.match(r),function(b){a.a.ra(m,b,e)});b[c]=m.join(" ")}var f={__proto__:[]}instanceof Array,g="function"===typeof Symbol,h={},l={};h[M&&/Firefox\/2/i.test(M.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];h.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");b(h,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)l[b[c]]=a});var m={propertychange:!0},k=
t&&function(){for(var a=3,b=t.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e",c[0];);return 4<a?a:n}(),r=/\S+/g;return{gc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],r:function(a,b){for(var c=0,d=a.length;c<d;c++)b(a[c],c)},o:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Vb:function(a,b,c){for(var d=
0,e=a.length;d<e;d++)if(b.call(c,a[d],d))return a[d];return null},Na:function(b,c){var d=a.a.o(b,c);0<d?b.splice(d,1):0===d&&b.shift()},Wb:function(b){b=b||[];for(var c=[],d=0,e=b.length;d<e;d++)0>a.a.o(c,b[d])&&c.push(b[d]);return c},ib:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)c.push(b(a[d],d));return c},Ma:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)b(a[d],d)&&c.push(a[d]);return c},ta:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<
d;c++)a.push(b[c]);return a},ra:function(b,c,d){var e=a.a.o(a.a.Bb(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},la:f,extend:c,$a:d,ab:f?d:c,D:b,Ea:function(a,b){if(!a)return a;var c={},d;for(d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d],d,a));return c},rb:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},nc:function(b){b=a.a.W(b);for(var c=(b[0]&&b[0].ownerDocument||t).createElement("div"),d=0,e=b.length;d<e;d++)c.appendChild(a.ba(b[d]));return c},wa:function(b,c){for(var d=0,e=b.length,m=[];d<e;d++){var k=
b[d].cloneNode(!0);m.push(c?a.ba(k):k)}return m},fa:function(b,c){a.a.rb(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},uc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],m=e.parentNode,k=0,f=c.length;k<f;k++)m.insertBefore(c[k],e);k=0;for(f=d.length;k<f;k++)a.removeNode(d[k])}},Ba:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=
a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),c=c.nextSibling;a.push(d)}}return a},wc:function(a,b){7>k?a.setAttribute("selected",b):a.selected=b},cb:function(a){return null===a||a===n?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},sd:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},Rc:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(3===a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==
(b.compareDocumentPosition(a)&16);for(;a&&a!=b;)a=a.parentNode;return!!a},qb:function(b){return a.a.Rc(b,b.ownerDocument.documentElement)},Tb:function(b){return!!a.a.Vb(b,a.a.qb)},A:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},Zb:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Zb(b),c)},dc:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},q:function(b,
c,d){var e=a.a.Zb(d);d=k&&m[c];if(a.options.useOnlyNativeEvents||d||!u)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var f=function(a){e.call(b,a)},l="on"+c;b.attachEvent(l,f);a.a.G.qa(b,function(){b.detachEvent(l,f)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else u(b).bind(c,e)},Fa:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===
a.a.A(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!u||d)if("function"==typeof t.createEvent)if("function"==typeof b.dispatchEvent)d=t.createEvent(l[c]||"HTMLEvents"),d.initEvent(c,!0,!0,x,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");
else u(b).trigger(c)},c:function(b){return a.I(b)?b():b},Bb:function(b){return a.I(b)?b.p():b},fb:function(b,c,d){var k;c&&("object"===typeof b.classList?(k=b.classList[d?"add":"remove"],a.a.r(c.match(r),function(a){k.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},bb:function(b,c){var d=a.a.c(c);if(null===d||d===n)d="";var e=a.f.firstChild(b);!e||3!=e.nodeType||a.f.nextSibling(e)?a.f.fa(b,[b.ownerDocument.createTextNode(d)]):e.data=
d;a.a.Wc(b)},vc:function(a,b){a.name=b;if(7>=k)try{a.mergeAttributes(t.createElement("<input name='"+a.name+"'/>"),!1)}catch(c){}},Wc:function(a){9<=k&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},Sc:function(a){if(k){var b=a.style.width;a.style.width=0;a.style.width=b}},nd:function(b,c){b=a.a.c(b);c=a.a.c(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},W:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},bc:function(a){return g?Symbol(a):a},xd:6===k,
yd:7===k,C:k,ic:function(b,c){for(var d=a.a.W(b.getElementsByTagName("input")).concat(a.a.W(b.getElementsByTagName("textarea"))),e="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},k=[],m=d.length-1;0<=m;m--)e(d[m])&&k.push(d[m]);return k},kd:function(b){return"string"==typeof b&&(b=a.a.cb(b))?H&&H.parse?H.parse(b):(new Function("return "+b))():null},Gb:function(b,c,d){if(!H||!H.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
return H.stringify(a.a.c(b),c,d)},ld:function(c,d,e){e=e||{};var k=e.params||{},m=e.includeFields||this.gc,f=c;if("object"==typeof c&&"form"===a.a.A(c))for(var f=c.action,l=m.length-1;0<=l;l--)for(var g=a.a.ic(c,m[l]),h=g.length-1;0<=h;h--)k[g[h].name]=g[h].value;d=a.a.c(d);var r=t.createElement("form");r.style.display="none";r.action=f;r.method="post";for(var n in d)c=t.createElement("input"),c.type="hidden",c.name=n,c.value=a.a.Gb(a.a.c(d[n])),r.appendChild(c);b(k,function(a,b){var c=t.createElement("input");
c.type="hidden";c.name=a;c.value=b;r.appendChild(c)});t.body.appendChild(r);e.submitter?e.submitter(r):r.submit();setTimeout(function(){r.parentNode.removeChild(r)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.r);a.b("utils.arrayFirst",a.a.Vb);a.b("utils.arrayFilter",a.a.Ma);a.b("utils.arrayGetDistinctValues",a.a.Wb);a.b("utils.arrayIndexOf",a.a.o);a.b("utils.arrayMap",a.a.ib);a.b("utils.arrayPushAll",a.a.ta);a.b("utils.arrayRemoveItem",a.a.Na);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost",
a.a.gc);a.b("utils.getFormFields",a.a.ic);a.b("utils.peekObservable",a.a.Bb);a.b("utils.postJson",a.a.ld);a.b("utils.parseJson",a.a.kd);a.b("utils.registerEventHandler",a.a.q);a.b("utils.stringifyJson",a.a.Gb);a.b("utils.range",a.a.nd);a.b("utils.toggleDomNodeCssClass",a.a.fb);a.b("utils.triggerEvent",a.a.Fa);a.b("utils.unwrapObservable",a.a.c);a.b("utils.objectForEach",a.a.D);a.b("utils.addOrRemoveItem",a.a.ra);a.b("utils.setTextContent",a.a.bb);a.b("unwrap",a.a.c);Function.prototype.bind||(Function.prototype.bind=
function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.e=new function(){function a(b,g){var h=b[d];if(!h||"null"===h||!e[h]){if(!g)return n;h=b[d]="ko"+c++;e[h]={}}return e[h]}var c=0,d="__ko__"+(new Date).getTime(),e={};return{get:function(c,d){var e=a(c,!1);return e===n?n:e[d]},set:function(c,d,e){if(e!==n||a(c,!1)!==n)a(c,!0)[d]=
e},clear:function(a){var b=a[d];return b?(delete e[b],a[d]=null,!0):!1},J:function(){return c++ +d}}};a.b("utils.domData",a.a.e);a.b("utils.domData.clear",a.a.e.clear);a.a.G=new function(){function b(b,c){var e=a.a.e.get(b,d);e===n&&c&&(e=[],a.a.e.set(b,d,e));return e}function c(d){var e=b(d,!1);if(e)for(var e=e.slice(0),l=0;l<e.length;l++)e[l](d);a.a.e.clear(d);a.a.G.cleanExternalData(d);if(f[d.nodeType])for(e=d.firstChild;d=e;)e=d.nextSibling,8===d.nodeType&&c(d)}var d=a.a.e.J(),e={1:!0,8:!0,9:!0},
f={1:!0,9:!0};return{qa:function(a,c){if("function"!=typeof c)throw Error("Callback must be a function");b(a,!0).push(c)},tc:function(c,e){var f=b(c,!1);f&&(a.a.Na(f,e),0==f.length&&a.a.e.set(c,d,n))},ba:function(b){if(e[b.nodeType]&&(c(b),f[b.nodeType])){var d=[];a.a.ta(d,b.getElementsByTagName("*"));for(var l=0,m=d.length;l<m;l++)c(d[l])}return b},removeNode:function(b){a.ba(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){u&&"function"==typeof u.cleanData&&u.cleanData([a])}}};
a.ba=a.a.G.ba;a.removeNode=a.a.G.removeNode;a.b("cleanNode",a.ba);a.b("removeNode",a.removeNode);a.b("utils.domNodeDisposal",a.a.G);a.b("utils.domNodeDisposal.addDisposeCallback",a.a.G.qa);a.b("utils.domNodeDisposal.removeDisposeCallback",a.a.G.tc);(function(){var b=[0,"",""],c=[1,"<table>","</table>"],d=[3,"<table><tbody><tr>","</tr></tbody></table>"],e=[1,"<select multiple='multiple'>","</select>"],f={thead:c,tbody:c,tfoot:c,tr:[2,"<table><tbody>","</tbody></table>"],td:d,th:d,option:e,optgroup:e},
g=8>=a.a.C;a.a.na=function(c,d){var e;if(u)if(u.parseHTML)e=u.parseHTML(c,d)||[];else{if((e=u.clean([c],d))&&e[0]){for(var k=e[0];k.parentNode&&11!==k.parentNode.nodeType;)k=k.parentNode;k.parentNode&&k.parentNode.removeChild(k)}}else{(e=d)||(e=t);var k=e.parentWindow||e.defaultView||x,r=a.a.cb(c).toLowerCase(),q=e.createElement("div"),p;p=(r=r.match(/^<([a-z]+)[ >]/))&&f[r[1]]||b;r=p[0];p="ignored<div>"+p[1]+c+p[2]+"</div>";"function"==typeof k.innerShiv?q.appendChild(k.innerShiv(p)):(g&&e.appendChild(q),
q.innerHTML=p,g&&q.parentNode.removeChild(q));for(;r--;)q=q.lastChild;e=a.a.W(q.lastChild.childNodes)}return e};a.a.Eb=function(b,c){a.a.rb(b);c=a.a.c(c);if(null!==c&&c!==n)if("string"!=typeof c&&(c=c.toString()),u)u(b).html(c);else for(var d=a.a.na(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b("utils.parseHtmlFragment",a.a.na);a.b("utils.setHtml",a.a.Eb);a.N=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.N.pc(c.nodeValue);null!=f&&e.push({Qc:c,hd:f})}else if(1==c.nodeType)for(var f=
0,g=c.childNodes,h=g.length;f<h;f++)b(g[f],e)}var c={};return{yb:function(a){if("function"!=typeof a)throw Error("You can only pass a function to ko.memoization.memoize()");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},Bc:function(a,b){var f=c[a];if(f===n)throw Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.");try{return f.apply(null,b||[]),
!0}finally{delete c[a]}},Cc:function(c,e){var f=[];b(c,f);for(var g=0,h=f.length;g<h;g++){var l=f[g].Qc,m=[l];e&&a.a.ta(m,e);a.N.Bc(f[g].hd,m);l.nodeValue="";l.parentNode&&l.parentNode.removeChild(l)}},pc:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:null}}}();a.b("memoization",a.N);a.b("memoization.memoize",a.N.yb);a.b("memoization.unmemoize",a.N.Bc);a.b("memoization.parseMemoText",a.N.pc);a.b("memoization.unmemoizeDomNodeAndDescendants",a.N.Cc);a.Z=function(){function b(){if(e)for(var b=
e,c=0,m;g<e;)if(m=d[g++]){if(g>b){if(5E3<=++c){g=e;a.a.dc(Error("'Too much recursion' after processing "+c+" task groups."));break}b=e}try{m()}catch(k){a.a.dc(k)}}}function c(){b();g=e=d.length=0}var d=[],e=0,f=1,g=0;return{scheduler:x.MutationObserver?function(a){var b=t.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):t&&"onreadystatechange"in t.createElement("script")?function(a){var b=t.createElement("script");b.onreadystatechange=
function(){b.onreadystatechange=null;t.documentElement.removeChild(b);b=null;a()};t.documentElement.appendChild(b)}:function(a){setTimeout(a,0)},Za:function(b){e||a.Z.scheduler(c);d[e++]=b;return f++},cancel:function(a){a-=f-e;a>=g&&a<e&&(d[a]=null)},resetForTesting:function(){var a=e-g;g=e=d.length=0;return a},rd:b}}();a.b("tasks",a.Z);a.b("tasks.schedule",a.Z.Za);a.b("tasks.runEarly",a.Z.rd);a.Aa={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.B({read:b,write:function(e){clearTimeout(d);
d=a.a.setTimeout(function(){b(e)},c)}})},rateLimit:function(a,c){var d,e,f;"number"==typeof c?d=c:(d=c.timeout,e=c.method);a.gb=!1;f="notifyWhenChangesStop"==e?T:S;a.Wa(function(a){return f(a,d)})},deferred:function(b,c){if(!0!==c)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.gb||(b.gb=!0,b.Wa(function(c){var e,f=!1;return function(){if(!f){a.Z.cancel(e);e=a.Z.Za(c);try{f=!0,b.notifySubscribers(n,"dirty")}finally{f=
!1}}}}))},notify:function(a,c){a.equalityComparer="always"==c?null:J}};var R={undefined:1,"boolean":1,number:1,string:1};a.b("extenders",a.Aa);a.zc=function(b,c,d){this.$=b;this.jb=c;this.Pc=d;this.T=!1;a.H(this,"dispose",this.k)};a.zc.prototype.k=function(){this.T=!0;this.Pc()};a.K=function(){a.a.ab(this,D);D.ub(this)};var E="change",D={ub:function(a){a.F={change:[]};a.Qb=1},Y:function(b,c,d){var e=this;d=d||E;var f=new a.zc(e,c?b.bind(c):b,function(){a.a.Na(e.F[d],f);e.Ka&&e.Ka(d)});e.ua&&e.ua(d);
e.F[d]||(e.F[d]=[]);e.F[d].push(f);return f},notifySubscribers:function(b,c){c=c||E;c===E&&this.Kb();if(this.Ra(c)){var d=c===E&&this.Fc||this.F[c].slice(0);try{a.l.Xb();for(var e=0,f;f=d[e];++e)f.T||f.jb(b)}finally{a.l.end()}}},Pa:function(){return this.Qb},Zc:function(a){return this.Pa()!==a},Kb:function(){++this.Qb},Wa:function(b){var c=this,d=a.I(c),e,f,g,h;c.Ja||(c.Ja=c.notifySubscribers,c.notifySubscribers=U);var l=b(function(){c.Ha=!1;d&&h===c&&(h=c.Mb?c.Mb():c());var a=f||c.Ua(g,h);f=e=!1;
a&&c.Ja(g=h)});c.Pb=function(a){c.Fc=c.F[E].slice(0);c.Ha=e=!0;h=a;l()};c.Ob=function(a){e||(g=a,c.Ja(a,"beforeChange"))};c.Hc=function(){c.Ua(g,c.p(!0))&&(f=!0)}},Ra:function(a){return this.F[a]&&this.F[a].length},Xc:function(b){if(b)return this.F[b]&&this.F[b].length||0;var c=0;a.a.D(this.F,function(a,b){"dirty"!==a&&(c+=b.length)});return c},Ua:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},extend:function(b){var c=this;b&&a.a.D(b,function(b,e){var f=a.Aa[b];"function"==
typeof f&&(c=f(c,e)||c)});return c}};a.H(D,"subscribe",D.Y);a.H(D,"extend",D.extend);a.H(D,"getSubscriptionsCount",D.Xc);a.a.la&&a.a.$a(D,Function.prototype);a.K.fn=D;a.lc=function(a){return null!=a&&"function"==typeof a.Y&&"function"==typeof a.notifySubscribers};a.b("subscribable",a.K);a.b("isSubscribable",a.lc);a.xa=a.l=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{Xb:b,end:c,sc:function(b){if(e){if(!a.lc(b))throw Error("Only subscribable things can act as dependencies");
e.jb.call(e.Lc,b,b.Gc||(b.Gc=++f))}},w:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},Ca:function(){if(e)return e.m.Ca()},Va:function(){if(e)return e.Va}}}();a.b("computedContext",a.xa);a.b("computedContext.getDependenciesCount",a.xa.Ca);a.b("computedContext.isInitial",a.xa.Va);a.b("ignoreDependencies",a.wd=a.l.w);var F=a.a.bc("_latestValue");a.O=function(b){function c(){if(0<arguments.length)return c.Ua(c[F],arguments[0])&&(c.ia(),c[F]=arguments[0],c.ha()),this;a.l.sc(c);return c[F]}
c[F]=b;a.a.la||a.a.extend(c,a.K.fn);a.K.fn.ub(c);a.a.ab(c,B);a.options.deferUpdates&&a.Aa.deferred(c,!0);return c};var B={equalityComparer:J,p:function(){return this[F]},ha:function(){this.notifySubscribers(this[F])},ia:function(){this.notifySubscribers(this[F],"beforeChange")}};a.a.la&&a.a.$a(B,a.K.fn);var I=a.O.md="__ko_proto__";B[I]=a.O;a.Qa=function(b,c){return null===b||b===n||b[I]===n?!1:b[I]===c?!0:a.Qa(b[I],c)};a.I=function(b){return a.Qa(b,a.O)};a.Da=function(b){return"function"==typeof b&&
b[I]===a.O||"function"==typeof b&&b[I]===a.B&&b.$c?!0:!1};a.b("observable",a.O);a.b("isObservable",a.I);a.b("isWriteableObservable",a.Da);a.b("isWritableObservable",a.Da);a.b("observable.fn",B);a.H(B,"peek",B.p);a.H(B,"valueHasMutated",B.ha);a.H(B,"valueWillMutate",B.ia);a.ma=function(b){b=b||[];if("object"!=typeof b||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");b=a.O(b);a.a.ab(b,a.ma.fn);return b.extend({trackArrayChanges:!0})};
a.ma.fn={remove:function(b){for(var c=this.p(),d=[],e="function"!=typeof b||a.I(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];e(g)&&(0===d.length&&this.ia(),d.push(g),c.splice(f,1),f--)}d.length&&this.ha();return d},removeAll:function(b){if(b===n){var c=this.p(),d=c.slice(0);this.ia();c.splice(0,c.length);this.ha();return d}return b?this.remove(function(c){return 0<=a.a.o(b,c)}):[]},destroy:function(b){var c=this.p(),d="function"!=typeof b||a.I(b)?function(a){return a===b}:b;this.ia();
for(var e=c.length-1;0<=e;e--)d(c[e])&&(c[e]._destroy=!0);this.ha()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.o(b,c)}):[]},indexOf:function(b){var c=this();return a.a.o(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ia(),this.p()[d]=c,this.ha())}};a.a.la&&a.a.$a(a.ma.fn,a.O.fn);a.a.r("pop push reverse shift sort splice unshift".split(" "),function(b){a.ma.fn[b]=function(){var a=this.p();this.ia();this.Yb(a,b,arguments);
var d=a[b].apply(a,arguments);this.ha();return d===a?this:d}});a.a.r(["slice"],function(b){a.ma.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.b("observableArray",a.ma);a.Aa.trackArrayChanges=function(b,c){function d(){if(!e){e=!0;l=b.notifySubscribers;b.notifySubscribers=function(a,b){b&&b!==E||++h;return l.apply(this,arguments)};var c=[].concat(b.p()||[]);f=null;g=b.Y(function(d){d=[].concat(d||[]);if(b.Ra("arrayChange")){var e;if(!f||1<h)f=a.a.lb(c,d,b.kb);e=f}c=d;f=null;h=0;
e&&e.length&&b.notifySubscribers(e,"arrayChange")})}}b.kb={};c&&"object"==typeof c&&a.a.extend(b.kb,c);b.kb.sparse=!0;if(!b.Yb){var e=!1,f=null,g,h=0,l,m=b.ua,k=b.Ka;b.ua=function(a){m&&m.call(b,a);"arrayChange"===a&&d()};b.Ka=function(a){k&&k.call(b,a);"arrayChange"!==a||b.Ra("arrayChange")||(l&&(b.notifySubscribers=l,l=n),g.k(),e=!1)};b.Yb=function(b,c,d){function k(a,b,c){return m[m.length]={status:a,value:b,index:c}}if(e&&!h){var m=[],l=b.length,g=d.length,G=0;switch(c){case "push":G=l;case "unshift":for(c=
0;c<g;c++)k("added",d[c],G+c);break;case "pop":G=l-1;case "shift":l&&k("deleted",b[G],G);break;case "splice":c=Math.min(Math.max(0,0>d[0]?l+d[0]:d[0]),l);for(var l=1===g?l:Math.min(c+(d[1]||0),l),g=c+g-2,G=Math.max(l,g),n=[],s=[],w=2;c<G;++c,++w)c<l&&s.push(k("deleted",b[c],c)),c<g&&n.push(k("added",d[w],c));a.a.hc(s,n);break;default:return}f=m}}}};var s=a.a.bc("_state");a.m=a.B=function(b,c,d){function e(){if(0<arguments.length){if("function"===typeof f)f.apply(g.sb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
return this}a.l.sc(e);(g.V||g.t&&e.Sa())&&e.U();return g.M}"object"===typeof b?d=b:(d=d||{},b&&(d.read=b));if("function"!=typeof d.read)throw Error("Pass a function that returns the value of the ko.computed");var f=d.write,g={M:n,da:!0,V:!0,Ta:!1,Hb:!1,T:!1,Ya:!1,t:!1,od:d.read,sb:c||d.owner,i:d.disposeWhenNodeIsRemoved||d.i||null,ya:d.disposeWhen||d.ya,pb:null,s:{},L:0,fc:null};e[s]=g;e.$c="function"===typeof f;a.a.la||a.a.extend(e,a.K.fn);a.K.fn.ub(e);a.a.ab(e,z);d.pure?(g.Ya=!0,g.t=!0,a.a.extend(e,
Y)):d.deferEvaluation&&a.a.extend(e,Z);a.options.deferUpdates&&a.Aa.deferred(e,!0);g.i&&(g.Hb=!0,g.i.nodeType||(g.i=null));g.t||d.deferEvaluation||e.U();g.i&&e.ca()&&a.a.G.qa(g.i,g.pb=function(){e.k()});return e};var z={equalityComparer:J,Ca:function(){return this[s].L},Sb:function(a,c,d){if(this[s].Ya&&c===this)throw Error("A 'pure' computed must not be called recursively");this[s].s[a]=d;d.Ia=this[s].L++;d.pa=c.Pa()},Sa:function(){var a,c,d=this[s].s;for(a in d)if(d.hasOwnProperty(a)&&(c=d[a],this.oa&&
c.$.Ha||c.$.Zc(c.pa)))return!0},gd:function(){this.oa&&!this[s].Ta&&this.oa(!1)},ca:function(){var a=this[s];return a.V||0<a.L},qd:function(){this.Ha?this[s].V&&(this[s].da=!0):this.ec()},yc:function(a){if(a.gb&&!this[s].i){var c=a.Y(this.gd,this,"dirty"),d=a.Y(this.qd,this);return{$:a,k:function(){c.k();d.k()}}}return a.Y(this.ec,this)},ec:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[s].fc),this[s].fc=a.a.setTimeout(function(){b.U(!0)},c)):b.oa?b.oa(!0):b.U(!0)},U:function(b){var c=
this[s],d=c.ya,e=!1;if(!c.Ta&&!c.T){if(c.i&&!a.a.qb(c.i)||d&&d()){if(!c.Hb){this.k();return}}else c.Hb=!1;c.Ta=!0;try{e=this.Vc(b)}finally{c.Ta=!1}c.L||this.k();return e}},Vc:function(b){var c=this[s],d=!1,e=c.Ya?n:!c.L,f={Mc:this,Oa:c.s,ob:c.L};a.l.Xb({Lc:f,jb:W,m:this,Va:e});c.s={};c.L=0;f=this.Uc(c,f);this.Ua(c.M,f)&&(c.t||this.notifySubscribers(c.M,"beforeChange"),c.M=f,c.t?this.Kb():b&&this.notifySubscribers(c.M),d=!0);e&&this.notifySubscribers(c.M,"awake");return d},Uc:function(b,c){try{var d=
b.od;return b.sb?d.call(b.sb):d()}finally{a.l.end(),c.ob&&!b.t&&a.a.D(c.Oa,V),b.da=b.V=!1}},p:function(a){var c=this[s];(c.V&&(a||!c.L)||c.t&&this.Sa())&&this.U();return c.M},Wa:function(b){a.K.fn.Wa.call(this,b);this.Mb=function(){this[s].da?this.U():this[s].V=!1;return this[s].M};this.oa=function(a){this.Ob(this[s].M);this[s].V=!0;a&&(this[s].da=!0);this.Pb(this)}},k:function(){var b=this[s];!b.t&&b.s&&a.a.D(b.s,function(a,b){b.k&&b.k()});b.i&&b.pb&&a.a.G.tc(b.i,b.pb);b.s=null;b.L=0;b.T=!0;b.da=
!1;b.V=!1;b.t=!1;b.i=null}},Y={ua:function(b){var c=this,d=c[s];if(!d.T&&d.t&&"change"==b){d.t=!1;if(d.da||c.Sa())d.s=null,d.L=0,c.U()&&c.Kb();else{var e=[];a.a.D(d.s,function(a,b){e[b.Ia]=a});a.a.r(e,function(a,b){var e=d.s[a],l=c.yc(e.$);l.Ia=b;l.pa=e.pa;d.s[a]=l})}d.T||c.notifySubscribers(d.M,"awake")}},Ka:function(b){var c=this[s];c.T||"change"!=b||this.Ra("change")||(a.a.D(c.s,function(a,b){b.k&&(c.s[a]={$:b.$,Ia:b.Ia,pa:b.pa},b.k())}),c.t=!0,this.notifySubscribers(n,"asleep"))},Pa:function(){var b=
this[s];b.t&&(b.da||this.Sa())&&this.U();return a.K.fn.Pa.call(this)}},Z={ua:function(a){"change"!=a&&"beforeChange"!=a||this.p()}};a.a.la&&a.a.$a(z,a.K.fn);var P=a.O.md;a.m[P]=a.O;z[P]=a.m;a.bd=function(b){return a.Qa(b,a.m)};a.cd=function(b){return a.Qa(b,a.m)&&b[s]&&b[s].Ya};a.b("computed",a.m);a.b("dependentObservable",a.m);a.b("isComputed",a.bd);a.b("isPureComputed",a.cd);a.b("computed.fn",z);a.H(z,"peek",z.p);a.H(z,"dispose",z.k);a.H(z,"isActive",z.ca);a.H(z,"getDependenciesCount",z.Ca);a.rc=
function(b,c){if("function"===typeof b)return a.m(b,c,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.m(b,c)};a.b("pureComputed",a.rc);(function(){function b(a,f,g){g=g||new d;a=f(a);if("object"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof Number||a instanceof Boolean)return a;var h=a instanceof Array?[]:{};g.save(a,h);c(a,function(c){var d=f(a[c]);switch(typeof d){case "boolean":case "number":case "string":case "function":h[c]=d;break;case "object":case "undefined":var k=
g.get(d);h[c]=k!==n?k:b(d,f,g)}});return h}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);"function"==typeof a.toJSON&&b("toJSON")}else for(c in a)b(c)}function d(){this.keys=[];this.Lb=[]}a.Ac=function(c){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");return b(c,function(b){for(var c=0;a.I(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.Ac(b);return a.a.Gb(b,c,d)};d.prototype={save:function(b,c){var d=a.a.o(this.keys,
b);0<=d?this.Lb[d]=c:(this.keys.push(b),this.Lb.push(c))},get:function(b){b=a.a.o(this.keys,b);return 0<=b?this.Lb[b]:n}}})();a.b("toJS",a.Ac);a.b("toJSON",a.toJSON);(function(){a.j={u:function(b){switch(a.a.A(b)){case "option":return!0===b.__ko__hasDomDataOptionValue__?a.a.e.get(b,a.d.options.zb):7>=a.a.C?b.getAttributeNode("value")&&b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex]):n;default:return b.value}},ja:function(b,
c,d){switch(a.a.A(b)){case "option":switch(typeof c){case "string":a.a.e.set(b,a.d.options.zb,n);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.e.set(b,a.d.options.zb,c),b.__ko__hasDomDataOptionValue__=!0,b.value="number"===typeof c?c:""}break;case "select":if(""===c||null===c)c=n;for(var e=-1,f=0,g=b.options.length,h;f<g;++f)if(h=a.j.u(b.options[f]),h==c||""==h&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e;break;default:if(null===
c||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.j);a.b("selectExtensions.readValue",a.j.u);a.b("selectExtensions.writeValue",a.j.ja);a.h=function(){function b(b){b=a.a.cb(b);123===b.charCodeAt(0)&&(b=b.slice(1,-1));var c=[],d=b.match(e),r,h=[],p=0;if(d){d.push(",");for(var A=0,y;y=d[A];++A){var v=y.charCodeAt(0);if(44===v){if(0>=p){c.push(r&&h.length?{key:r,value:h.join("")}:{unknown:r||h.join("")});r=p=0;h=[];continue}}else if(58===v){if(!p&&!r&&1===h.length){r=h.pop();continue}}else 47===
v&&A&&1<y.length?(v=d[A-1].match(f))&&!g[v[0]]&&(b=b.substr(b.indexOf(y)+1),d=b.match(e),d.push(","),A=-1,y="/"):40===v||123===v||91===v?++p:41===v||125===v||93===v?--p:r||h.length||34!==v&&39!==v||(y=y.slice(1,-1));h.push(y)}}return c}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,e=RegExp("\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|/(?:[^/\\\\]|\\\\.)*/w*|[^\\s:,/][^,\"'{}()/:[\\]]*[^\\s,\"'{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,
g={"in":1,"return":1,"typeof":1},h={};return{va:[],ga:h,Ab:b,Xa:function(e,m){function k(b,e){var m;if(!A){var l=a.getBindingHandler(b);if(l&&l.preprocess&&!(e=l.preprocess(e,b,k)))return;if(l=h[b])m=e,0<=a.a.o(c,m)?m=!1:(l=m.match(d),m=null===l?!1:l[1]?"Object("+l[1]+")"+l[2]:m),l=m;l&&g.push("'"+b+"':function(_z){"+m+"=_z}")}p&&(e="function(){return "+e+" }");f.push("'"+b+"':"+e)}m=m||{};var f=[],g=[],p=m.valueAccessors,A=m.bindingParams,y="string"===typeof e?b(e):e;a.a.r(y,function(a){k(a.key||
a.unknown,a.value)});g.length&&k("_ko_property_writers","{"+g.join(",")+" }");return f.join(",")},fd:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},Ga:function(b,c,d,e,f){if(b&&a.I(b))!a.Da(b)||f&&b.p()===e||b(e);else if((b=c.get("_ko_property_writers"))&&b[d])b[d](e)}}}();a.b("expressionRewriting",a.h);a.b("expressionRewriting.bindingRewriteValidators",a.h.va);a.b("expressionRewriting.parseObjectLiteral",a.h.Ab);a.b("expressionRewriting.preProcessBindings",a.h.Xa);a.b("expressionRewriting._twoWayBindings",
a.h.ga);a.b("jsonExpressionRewriting",a.h);a.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",a.h.Xa);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&h.test(f?a.text:a.nodeValue)}function d(a,d){for(var e=a,f=1,l=[];e=e.nextSibling;){if(c(e)&&(f--,0===f))return l;l.push(e);b(e)&&f++}if(!d)throw Error("Cannot find closing comment tag to match: "+a.nodeValue);return null}function e(a,b){var c=d(a,b);return c?0<c.length?c[c.length-
1].nextSibling:a.nextSibling:null}var f=t&&"\x3c!--test--\x3e"===t.createComment("test").text,g=f?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,h=f?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,l={ul:!0,ol:!0};a.f={aa:{},childNodes:function(a){return b(a)?d(a):a.childNodes},za:function(c){if(b(c)){c=a.f.childNodes(c);for(var d=0,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.rb(c)},fa:function(c,d){if(b(c)){a.f.za(c);for(var e=c.nextSibling,f=0,l=d.length;f<l;f++)e.parentNode.insertBefore(d[f],
e)}else a.a.fa(c,d)},qc:function(a,c){b(a)?a.parentNode.insertBefore(c,a.nextSibling):a.firstChild?a.insertBefore(c,a.firstChild):a.appendChild(c)},kc:function(c,d,e){e?b(c)?c.parentNode.insertBefore(d,e.nextSibling):e.nextSibling?c.insertBefore(d,e.nextSibling):c.appendChild(d):a.f.qc(c,d)},firstChild:function(a){return b(a)?!a.nextSibling||c(a.nextSibling)?null:a.nextSibling:a.firstChild},nextSibling:function(a){b(a)&&(a=e(a));return a.nextSibling&&c(a.nextSibling)?null:a.nextSibling},Yc:b,vd:function(a){return(a=
(f?a.text:a.nodeValue).match(g))?a[1]:null},oc:function(d){if(l[a.a.A(d)]){var k=d.firstChild;if(k){do if(1===k.nodeType){var f;f=k.firstChild;var g=null;if(f){do if(g)g.push(f);else if(b(f)){var h=e(f,!0);h?f=h:g=[f]}else c(f)&&(g=[f]);while(f=f.nextSibling)}if(f=g)for(g=k.nextSibling,h=0;h<f.length;h++)g?d.insertBefore(f[h],g):d.appendChild(f[h])}while(k=k.nextSibling)}}}}})();a.b("virtualElements",a.f);a.b("virtualElements.allowedBindings",a.f.aa);a.b("virtualElements.emptyNode",a.f.za);a.b("virtualElements.insertAfter",
a.f.kc);a.b("virtualElements.prepend",a.f.qc);a.b("virtualElements.setDomNodeChildren",a.f.fa);(function(){a.S=function(){this.Kc={}};a.a.extend(a.S.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=b.getAttribute("data-bind")||a.g.getComponentNameForNode(b);case 8:return a.f.Yc(b);default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.g.Rb(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,
c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.g.Rb(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return a.f.vd(b);default:return null}},parseBindingsString:function(b,c,d,e){try{var f=this.Kc,g=b+(e&&e.valueAccessors||""),h;if(!(h=f[g])){var l,m="with($context){with($data||{}){return{"+a.h.Xa(b,e)+"}}}";l=new Function("$context","$element",m);h=f[g]=l}return h(c,d)}catch(k){throw k.message="Unable to parse bindings.\nBindings value: "+
b+"\nMessage: "+k.message,k;}}});a.S.instance=new a.S})();a.b("bindingProvider",a.S);(function(){function b(a){return function(){return a}}function c(a){return a()}function d(b){return a.a.Ea(a.l.w(b),function(a,c){return function(){return b()[c]}})}function e(c,e,k){return"function"===typeof c?d(c.bind(null,e,k)):a.a.Ea(c,b)}function f(a,b){return d(this.getBindings.bind(this,a,b))}function g(b,c,d){var e,k=a.f.firstChild(c),f=a.S.instance,m=f.preprocessNode;if(m){for(;e=k;)k=a.f.nextSibling(e),
m.call(f,e);k=a.f.firstChild(c)}for(;e=k;)k=a.f.nextSibling(e),h(b,e,d)}function h(b,c,d){var e=!0,k=1===c.nodeType;k&&a.f.oc(c);if(k&&d||a.S.instance.nodeHasBindings(c))e=m(c,null,b,d).shouldBindDescendants;e&&!r[a.a.A(c)]&&g(b,c,!k)}function l(b){var c=[],d={},e=[];a.a.D(b,function X(k){if(!d[k]){var f=a.getBindingHandler(k);f&&(f.after&&(e.push(k),a.a.r(f.after,function(c){if(b[c]){if(-1!==a.a.o(e,c))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+e.join(", "));
X(c)}}),e.length--),c.push({key:k,jc:f}));d[k]=!0}});return c}function m(b,d,e,k){var m=a.a.e.get(b,q);if(!d){if(m)throw Error("You cannot apply bindings multiple times to the same element.");a.a.e.set(b,q,!0)}!m&&k&&a.xc(b,e);var g;if(d&&"function"!==typeof d)g=d;else{var h=a.S.instance,r=h.getBindingAccessors||f,p=a.B(function(){(g=d?d(e,b):r.call(h,b,e))&&e.Q&&e.Q();return g},null,{i:b});g&&p.ca()||(p=null)}var s;if(g){var t=p?function(a){return function(){return c(p()[a])}}:function(a){return g[a]},
u=function(){return a.a.Ea(p?p():g,c)};u.get=function(a){return g[a]&&c(t(a))};u.has=function(a){return a in g};k=l(g);a.a.r(k,function(c){var d=c.jc.init,k=c.jc.update,f=c.key;if(8===b.nodeType&&!a.f.aa[f])throw Error("The binding '"+f+"' cannot be used with virtual elements");try{"function"==typeof d&&a.l.w(function(){var a=d(b,t(f),u,e.$data,e);if(a&&a.controlsDescendantBindings){if(s!==n)throw Error("Multiple bindings ("+s+" and "+f+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");
s=f}}),"function"==typeof k&&a.B(function(){k(b,t(f),u,e.$data,e)},null,{i:b})}catch(m){throw m.message='Unable to process binding "'+f+": "+g[f]+'"\nMessage: '+m.message,m;}})}return{shouldBindDescendants:s===n}}function k(b){return b&&b instanceof a.R?b:new a.R(b)}a.d={};var r={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.d[b]};a.R=function(b,c,d,e,k){function f(){var k=g?b():b,m=a.a.c(k);c?(c.Q&&c.Q(),a.a.extend(l,c),l.Q=r):(l.$parents=[],l.$root=m,l.ko=a);l.$rawData=
k;l.$data=m;d&&(l[d]=m);e&&e(l,c,m);return l.$data}function m(){return h&&!a.a.Tb(h)}var l=this,g="function"==typeof b&&!a.I(b),h,r;k&&k.exportDependencies?f():(r=a.B(f,null,{ya:m,i:!0}),r.ca()&&(l.Q=r,r.equalityComparer=null,h=[],r.Dc=function(b){h.push(b);a.a.G.qa(b,function(b){a.a.Na(h,b);h.length||(r.k(),l.Q=r=n)})}))};a.R.prototype.createChildContext=function(b,c,d,e){return new a.R(b,this,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);
d&&d(a)},e)};a.R.prototype.extend=function(b){return new a.R(this.Q||this.$data,this,null,function(c,d){c.$rawData=d.$rawData;a.a.extend(c,"function"==typeof b?b():b)})};a.R.prototype.ac=function(a,b){return this.createChildContext(a,b,null,{exportDependencies:!0})};var q=a.a.e.J(),p=a.a.e.J();a.xc=function(b,c){if(2==arguments.length)a.a.e.set(b,p,c),c.Q&&c.Q.Dc(b);else return a.a.e.get(b,p)};a.La=function(b,c,d){1===b.nodeType&&a.f.oc(b);return m(b,c,k(d),!0)};a.Ic=function(b,c,d){d=k(d);return a.La(b,
e(c,d,b),d)};a.hb=function(a,b){1!==b.nodeType&&8!==b.nodeType||g(k(a),b,!0)};a.Ub=function(a,b){!u&&x.jQuery&&(u=x.jQuery);if(b&&1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");b=b||x.document.body;h(k(a),b,!0)};a.nb=function(b){switch(b.nodeType){case 1:case 8:var c=a.xc(b);if(c)return c;if(b.parentNode)return a.nb(b.parentNode)}return n};a.Oc=function(b){return(b=a.nb(b))?b.$data:n};a.b("bindingHandlers",
a.d);a.b("applyBindings",a.Ub);a.b("applyBindingsToDescendants",a.hb);a.b("applyBindingAccessorsToNode",a.La);a.b("applyBindingsToNode",a.Ic);a.b("contextFor",a.nb);a.b("dataFor",a.Oc)})();(function(b){function c(c,e){var m=f.hasOwnProperty(c)?f[c]:b,k;m?m.Y(e):(m=f[c]=new a.K,m.Y(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,dd:e};delete f[c];k||e?m.notifySubscribers(b):a.Z.Za(function(){m.notifySubscribers(b)})}),k=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",
[a,c],function(a){b(a,c)}):b(null,null)})}function e(c,d,f,k){k||(k=a.g.loaders.slice(0));var g=k.shift();if(g){var q=g[c];if(q){var p=!1;if(q.apply(g,d.concat(function(a){p?f(null):null!==a?f(a):e(c,d,f,k)}))!==b&&(p=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,k)}else f(null)}var f={},g={};a.g={get:function(d,e){var f=g.hasOwnProperty(d)?g[d]:b;f?f.dd?a.l.w(function(){e(f.definition)}):
a.Z.Za(function(){e(f.definition)}):c(d,e)},$b:function(a){delete g[a]},Nb:e};a.g.loaders=[];a.b("components",a.g);a.b("components.get",a.g.get);a.b("components.clearCachedDefinition",a.g.$b)})();(function(){function b(b,c,d,e){function g(){0===--y&&e(h)}var h={},y=2,v=d.template;d=d.viewModel;v?f(c,v,function(c){a.g.Nb("loadTemplate",[b,c],function(a){h.template=a;g()})}):g();d?f(c,d,function(c){a.g.Nb("loadViewModel",[b,c],function(a){h[l]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)});
else if("function"===typeof b[l])d(b[l]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.A(b)){case "script":return a.a.na(b.text);case "textarea":return a.a.na(b.value);case "template":if(e(b.content))return a.a.wa(b.content.childNodes)}return a.a.wa(b.childNodes)}function e(a){return x.DocumentFragment?a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require?
O||x.require?(O||x.require)([b.require],c):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+a+"': "+b);}}var h={};a.g.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.g.wb(b))throw Error("Component "+b+" is already registered");h[b]=c};a.g.wb=function(a){return h.hasOwnProperty(a)};a.g.ud=function(b){delete h[b];a.g.$b(b)};a.g.cc={getConfig:function(a,b){b(h.hasOwnProperty(a)?h[a]:null)},loadComponent:function(a,
c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.na(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.W(c.childNodes));else if(c.element)if(c=c.element,x.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var l=t.getElementById(c);l?f(d(l)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),
b,d)}};var l="createViewModel";a.b("components.register",a.g.register);a.b("components.isRegistered",a.g.wb);a.b("components.unregister",a.g.ud);a.b("components.defaultLoader",a.g.cc);a.g.loaders.push(a.g.cc);a.g.Ec=h})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ea(f,function(c){return a.m(c,null,{i:b})}),g=a.a.Ea(f,function(c){var e=c.p();return c.ca()?a.m({read:function(){return a.a.c(c())},write:a.Da(e)&&
function(a){c()(a)},i:b}):e});g.hasOwnProperty("$raw")||(g.$raw=f);return g}return{$raw:{}}}a.g.getComponentNameForNode=function(b){var c=a.a.A(b);if(a.g.wb(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.C&&b.tagName===c))return c};a.g.Rb=function(c,e,f,g){if(1===e.nodeType){var h=a.g.getComponentNameForNode(e);if(h){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component');var l={name:h,params:b(e,f)};c.component=g?function(){return l}:
l}}return c};var c=new a.S;9>a.a.C&&(a.g.register=function(a){return function(b){t.createElement(b);return a.apply(this,arguments)}}(a.g.register),t.createDocumentFragment=function(b){return function(){var c=b(),f=a.g.Ec,g;for(g in f)f.hasOwnProperty(g)&&c.createElement(g);return c}}(t.createDocumentFragment))})();(function(b){function c(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.wa(c);a.f.fa(d,b)}function d(a,b,c,d){var e=a.createViewModel;return e?e.call(a,
d,{element:b,templateNodes:c}):d}var e=0;a.d.component={init:function(f,g,h,l,m){function k(){var a=r&&r.dispose;"function"===typeof a&&a.call(r);q=r=null}var r,q,p=a.a.W(a.f.childNodes(f));a.a.G.qa(f,k);a.m(function(){var l=a.a.c(g()),h,v;"string"===typeof l?h=l:(h=a.a.c(l.name),v=a.a.c(l.params));if(!h)throw Error("No component name specified");var n=q=++e;a.g.get(h,function(e){if(q===n){k();if(!e)throw Error("Unknown component '"+h+"'");c(h,e,f);var l=d(e,f,p,v);e=m.createChildContext(l,b,function(a){a.$component=
l;a.$componentTemplateNodes=p});r=l;a.hb(e,f)}})},null,{i:f});return{controlsDescendantBindings:!0}}};a.f.aa.component=!0})();var Q={"class":"className","for":"htmlFor"};a.d.attr={update:function(b,c){var d=a.a.c(c())||{};a.a.D(d,function(c,d){d=a.a.c(d);var g=!1===d||null===d||d===n;g&&b.removeAttribute(c);8>=a.a.C&&c in Q?(c=Q[c],g?b.removeAttribute(c):b[c]=d):g||b.setAttribute(c,d.toString());"name"===c&&a.a.vc(b,g?"":d.toString())})}};(function(){a.d.checked={after:["value","attr"],init:function(b,
c,d){function e(){var e=b.checked,f=p?g():e;if(!a.xa.Va()&&(!l||e)){var h=a.l.w(c);if(k){var m=r?h.p():h;q!==f?(e&&(a.a.ra(m,f,!0),a.a.ra(m,q,!1)),q=f):a.a.ra(m,f,e);r&&a.Da(h)&&h(m)}else a.h.Ga(h,d,"checked",f,!0)}}function f(){var d=a.a.c(c());b.checked=k?0<=a.a.o(d,g()):h?d:g()===d}var g=a.rc(function(){return d.has("checkedValue")?a.a.c(d.get("checkedValue")):d.has("value")?a.a.c(d.get("value")):b.value}),h="checkbox"==b.type,l="radio"==b.type;if(h||l){var m=c(),k=h&&a.a.c(m)instanceof Array,
r=!(k&&m.push&&m.splice),q=k?g():n,p=l||k;l&&!b.name&&a.d.uniqueName.init(b,function(){return!0});a.m(e,null,{i:b});a.a.q(b,"click",e);a.m(f,null,{i:b});m=n}}};a.h.ga.checked=!0;a.d.checkedValue={update:function(b,c){b.value=a.a.c(c())}}})();a.d.css={update:function(b,c){var d=a.a.c(c());null!==d&&"object"==typeof d?a.a.D(d,function(c,d){d=a.a.c(d);a.a.fb(b,c,d)}):(d=a.a.cb(String(d||"")),a.a.fb(b,b.__ko__cssValue,!1),b.__ko__cssValue=d,a.a.fb(b,d,!0))}};a.d.enable={update:function(b,c){var d=a.a.c(c());
d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.d.disable={update:function(b,c){a.d.enable.update(b,function(){return!a.a.c(c())})}};a.d.event={init:function(b,c,d,e,f){var g=c()||{};a.a.D(g,function(g){"string"==typeof g&&a.a.q(b,g,function(b){var m,k=c()[g];if(k){try{var r=a.a.W(arguments);e=f.$data;r.unshift(e);m=k.apply(e,r)}finally{!0!==m&&(b.preventDefault?b.preventDefault():b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};
a.d.foreach={mc:function(b){return function(){var c=b(),d=a.a.Bb(c);if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.X.vb};a.a.c(c);return{foreach:d.data,as:d.as,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.X.vb}}},init:function(b,c){return a.d.template.init(b,a.d.foreach.mc(c))},update:function(b,c,d,e,f){return a.d.template.update(b,a.d.foreach.mc(c),
d,e,f)}};a.h.va.foreach=!1;a.f.aa.foreach=!0;a.d.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(k){g=f.body}e=g===b}f=c();a.h.Ga(f,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.q(b,"focus",f);a.a.q(b,"focusin",f);a.a.q(b,"blur",g);a.a.q(b,"focusout",g)},update:function(b,c){var d=!!a.a.c(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===
d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.l.w(a.a.Fa,null,[b,d?"focusin":"focusout"]))}};a.h.ga.hasfocus=!0;a.d.hasFocus=a.d.hasfocus;a.h.ga.hasFocus=!0;a.d.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Eb(b,c())}};K("if");K("ifnot",!1,!0);K("with",!0,!1,function(a,c){return a.ac(c)});var L={};a.d.options={init:function(b){if("select"!==a.a.A(b))throw Error("options binding applies only to SELECT elements");for(;0<
b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.Ma(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c}function g(c,e){if(A&&k)a.j.ja(b,a.a.c(d.get("value")),!0);else if(p.length){var f=0<=a.a.o(p,a.j.u(e[0]));a.a.wc(e[0],f);A&&!f&&a.l.w(a.a.Fa,null,[b,"change"])}}var h=b.multiple,l=0!=b.length&&h?b.scrollTop:null,m=a.a.c(c()),k=d.get("valueAllowUnset")&&d.has("value"),r=
d.get("optionsIncludeDestroyed");c={};var q,p=[];k||(h?p=a.a.ib(e(),a.j.u):0<=b.selectedIndex&&p.push(a.j.u(b.options[b.selectedIndex])));m&&("undefined"==typeof m.length&&(m=[m]),q=a.a.Ma(m,function(b){return r||b===n||null===b||!a.a.c(b._destroy)}),d.has("optionsCaption")&&(m=a.a.c(d.get("optionsCaption")),null!==m&&m!==n&&q.unshift(L)));var A=!1;c.beforeRemove=function(a){b.removeChild(a)};m=g;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(m=function(b,c){g(0,c);
a.l.w(d.get("optionsAfterRender"),null,[c[0],b!==L?b:n])});a.a.Db(b,q,function(c,e,g){g.length&&(p=!k&&g[0].selected?[a.j.u(g[0])]:[],A=!0);e=b.ownerDocument.createElement("option");c===L?(a.a.bb(e,d.get("optionsCaption")),a.j.ja(e,n)):(g=f(c,d.get("optionsValue"),c),a.j.ja(e,a.a.c(g)),c=f(c,d.get("optionsText"),g),a.a.bb(e,c));return[e]},c,m);a.l.w(function(){k?a.j.ja(b,a.a.c(d.get("value")),!0):(h?p.length&&e().length<p.length:p.length&&0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex])!==p[0]:
p.length||0<=b.selectedIndex)&&a.a.Fa(b,"change")});a.a.Sc(b);l&&20<Math.abs(l-b.scrollTop)&&(b.scrollTop=l)}};a.d.options.zb=a.a.e.J();a.d.selectedOptions={after:["options","foreach"],init:function(b,c,d){a.a.q(b,"change",function(){var e=c(),f=[];a.a.r(b.getElementsByTagName("option"),function(b){b.selected&&f.push(a.j.u(b))});a.h.Ga(e,d,"selectedOptions",f)})},update:function(b,c){if("select"!=a.a.A(b))throw Error("values binding applies only to SELECT elements");var d=a.a.c(c()),e=b.scrollTop;
d&&"number"==typeof d.length&&a.a.r(b.getElementsByTagName("option"),function(b){var c=0<=a.a.o(d,a.j.u(b));b.selected!=c&&a.a.wc(b,c)});b.scrollTop=e}};a.h.ga.selectedOptions=!0;a.d.style={update:function(b,c){var d=a.a.c(c()||{});a.a.D(d,function(c,d){d=a.a.c(d);if(null===d||d===n||!1===d)d="";b.style[c]=d})}};a.d.submit={init:function(b,c,d,e,f){if("function"!=typeof c())throw Error("The value for a submit binding must be a function");a.a.q(b,"submit",function(a){var d,e=c();try{d=e.call(f.$data,
b)}finally{!0!==d&&(a.preventDefault?a.preventDefault():a.returnValue=!1)}})}};a.d.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.bb(b,c())}};a.f.aa.text=!0;(function(){if(x&&x.navigator)var b=function(a){if(a)return parseFloat(a[1])},c=x.opera&&x.opera.version&&parseInt(x.opera.version()),d=x.navigator.userAgent,e=b(d.match(/^(?:(?!chrome).)*version\/([^ ]*) safari/i)),f=b(d.match(/Firefox\/([^ ]*)/));if(10>a.a.C)var g=a.a.e.J(),h=a.a.e.J(),l=function(b){var c=
this.activeElement;(c=c&&a.a.e.get(c,h))&&c(b)},m=function(b,c){var d=b.ownerDocument;a.a.e.get(d,g)||(a.a.e.set(d,g,!0),a.a.q(d,"selectionchange",l));a.a.e.set(b,h,c)};a.d.textInput={init:function(b,d,g){function l(c,d){a.a.q(b,c,d)}function h(){var c=a.a.c(d());if(null===c||c===n)c="";u!==n&&c===u?a.a.setTimeout(h,4):b.value!==c&&(s=c,b.value=c)}function y(){t||(u=b.value,t=a.a.setTimeout(v,4))}function v(){clearTimeout(t);u=t=n;var c=b.value;s!==c&&(s=c,a.h.Ga(d(),g,"textInput",c))}var s=b.value,
t,u,x=9==a.a.C?y:v;10>a.a.C?(l("propertychange",function(a){"value"===a.propertyName&&x(a)}),8==a.a.C&&(l("keyup",v),l("keydown",v)),8<=a.a.C&&(m(b,x),l("dragend",y))):(l("input",v),5>e&&"textarea"===a.a.A(b)?(l("keydown",y),l("paste",y),l("cut",y)):11>c?l("keydown",y):4>f&&(l("DOMAutoComplete",v),l("dragdrop",v),l("drop",v)));l("change",v);a.m(h,null,{i:b})}};a.h.ga.textInput=!0;a.d.textinput={preprocess:function(a,b,c){c("textInput",a)}}})();a.d.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+
++a.d.uniqueName.Nc;a.a.vc(b,d)}}};a.d.uniqueName.Nc=0;a.d.value={after:["options","foreach"],init:function(b,c,d){if("input"!=b.tagName.toLowerCase()||"checkbox"!=b.type&&"radio"!=b.type){var e=["change"],f=d.get("valueUpdate"),g=!1,h=null;f&&("string"==typeof f&&(f=[f]),a.a.ta(e,f),e=a.a.Wb(e));var l=function(){h=null;g=!1;var e=c(),f=a.j.u(b);a.h.Ga(e,d,"value",f)};!a.a.C||"input"!=b.tagName.toLowerCase()||"text"!=b.type||"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.o(e,"propertychange")||
(a.a.q(b,"propertychange",function(){g=!0}),a.a.q(b,"focus",function(){g=!1}),a.a.q(b,"blur",function(){g&&l()}));a.a.r(e,function(c){var d=l;a.a.sd(c,"after")&&(d=function(){h=a.j.u(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.q(b,c,d)});var m=function(){var e=a.a.c(c()),f=a.j.u(b);if(null!==h&&e===h)a.a.setTimeout(m,0);else if(e!==f)if("select"===a.a.A(b)){var g=d.get("valueAllowUnset"),f=function(){a.j.ja(b,e,g)};f();g||e===a.j.u(b)?a.a.setTimeout(f,0):a.l.w(a.a.Fa,null,[b,"change"])}else a.j.ja(b,
e)};a.m(m,null,{i:b})}else a.La(b,{checkedValue:c})},update:function(){}};a.h.ga.value=!0;a.d.visible={update:function(b,c){var d=a.a.c(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};(function(b){a.d[b]={init:function(c,d,e,f,g){return a.d.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click");a.P=function(){};a.P.prototype.renderTemplateSource=function(){throw Error("Override renderTemplateSource");};a.P.prototype.createJavaScriptEvaluatorBlock=
function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.P.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||t;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.v.n(d)}if(1==b.nodeType||8==b.nodeType)return new a.v.sa(b);throw Error("Unknown template type: "+b);};a.P.prototype.renderTemplate=function(a,c,d,e){a=this.makeTemplateSource(a,e);return this.renderTemplateSource(a,c,d,e)};a.P.prototype.isTemplateRewritten=function(a,
c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.P.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.P);a.Ib=function(){function b(b,c,d,h){b=a.h.Ab(b);for(var l=a.h.va,m=0;m<b.length;m++){var k=b[m].key;if(l.hasOwnProperty(k)){var r=l[k];if("function"===typeof r){if(k=r(b[m].value))throw Error(k);}else if(!r)throw Error("This template engine does not support the '"+
k+"' binding within its templates");}}d="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+a.h.Xa(b,{valueAccessors:!0})+" } })()},'"+d.toLowerCase()+"')";return h.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{Tc:function(b,c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.Ib.jd(b,
c)},d)},jd:function(a,f){return a.replace(c,function(a,c,d,e,k){return b(k,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},Jc:function(b,c){return a.N.yb(function(d,h){var l=d.nextSibling;l&&l.nodeName.toLowerCase()===c&&a.La(l,b,h)})}}}();a.b("__tr_ambtns",a.Ib.Jc);(function(){a.v={};a.v.n=function(b){if(this.n=b){var c=a.a.A(b);this.eb="script"===c?1:"textarea"===c?2:"template"==c&&b.content&&11===b.content.nodeType?3:4}};a.v.n.prototype.text=function(){var b=1===
this.eb?"text":2===this.eb?"value":"innerHTML";if(0==arguments.length)return this.n[b];var c=arguments[0];"innerHTML"===b?a.a.Eb(this.n,c):this.n[b]=c};var b=a.a.e.J()+"_";a.v.n.prototype.data=function(c){if(1===arguments.length)return a.a.e.get(this.n,b+c);a.a.e.set(this.n,b+c,arguments[1])};var c=a.a.e.J();a.v.n.prototype.nodes=function(){var b=this.n;if(0==arguments.length)return(a.a.e.get(b,c)||{}).mb||(3===this.eb?b.content:4===this.eb?b:n);a.a.e.set(b,c,{mb:arguments[0]})};a.v.sa=function(a){this.n=
a};a.v.sa.prototype=new a.v.n;a.v.sa.prototype.text=function(){if(0==arguments.length){var b=a.a.e.get(this.n,c)||{};b.Jb===n&&b.mb&&(b.Jb=b.mb.innerHTML);return b.Jb}a.a.e.set(this.n,c,{Jb:arguments[0]})};a.b("templateSources",a.v);a.b("templateSources.domElement",a.v.n);a.b("templateSources.anonymousTemplate",a.v.sa)})();(function(){function b(b,c,d){var e;for(c=a.f.nextSibling(c);b&&(e=b)!==c;)b=a.f.nextSibling(e),d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,h=
a.S.instance,n=h.preprocessNode;if(n){b(e,f,function(a,b){var c=a.previousSibling,d=n.call(h,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):(c.push(e,f),a.a.Ba(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.Ub(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.N.Cc(b,[d])});a.a.Ba(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,e,f,h,q){q=q||{};var p=(b&&d(b)||f||{}).ownerDocument,n=q.templateEngine||g;
a.Ib.Tc(f,n,p);f=n.renderTemplate(f,h,q,p);if("number"!=typeof f.length||0<f.length&&"number"!=typeof f[0].nodeType)throw Error("Template engine must return an array of DOM nodes");p=!1;switch(e){case "replaceChildren":a.f.fa(b,f);p=!0;break;case "replaceNode":a.a.uc(b,f);p=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+e);}p&&(c(f,h),q.afterRender&&a.l.w(q.afterRender,null,[f,h.$data]));return f}function f(b,c,d){return a.I(b)?b():"function"===typeof b?b(c,d):b}
var g;a.Fb=function(b){if(b!=n&&!(b instanceof a.P))throw Error("templateEngine must inherit from ko.templateEngine");g=b};a.Cb=function(b,c,k,h,q){k=k||{};if((k.templateEngine||g)==n)throw Error("Set a template engine before calling renderTemplate");q=q||"replaceChildren";if(h){var p=d(h);return a.B(function(){var g=c&&c instanceof a.R?c:new a.R(c,null,null,null,{exportDependencies:!0}),n=f(b,g.$data,g),g=e(h,q,n,g,k);"replaceNode"==q&&(h=g,p=d(h))},null,{ya:function(){return!p||!a.a.qb(p)},i:p&&
"replaceNode"==q?p.parentNode:p})}return a.N.yb(function(d){a.Cb(b,c,k,d,"replaceNode")})};a.pd=function(b,d,g,h,q){function p(a,b){c(b,t);g.afterRender&&g.afterRender(b,a);t=null}function s(a,c){t=q.createChildContext(a,g.as,function(a){a.$index=c});var d=f(b,a,t);return e(null,"ignoreTargetNode",d,t,g)}var t;return a.B(function(){var b=a.a.c(d)||[];"undefined"==typeof b.length&&(b=[b]);b=a.a.Ma(b,function(b){return g.includeDestroyed||b===n||null===b||!a.a.c(b._destroy)});a.l.w(a.a.Db,null,[h,b,
s,g,p])},null,{i:h})};var h=a.a.e.J();a.d.template={init:function(b,c){var d=a.a.c(c());if("string"==typeof d||d.name)a.f.za(b);else{if("nodes"in d){if(d=d.nodes||[],a.I(d))throw Error('The "nodes" option must be a plain, non-observable array.');}else d=a.f.childNodes(b);d=a.a.nc(d);(new a.v.sa(b)).nodes(d)}return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c();c=a.a.c(g);d=!0;e=null;"string"==typeof c?c={}:(g=c.name,"if"in c&&(d=a.a.c(c["if"])),d&&"ifnot"in c&&(d=!a.a.c(c.ifnot)));
"foreach"in c?e=a.pd(g||b,d&&c.foreach||[],c,b,f):d?(f="data"in c?f.ac(c.data,c.as):f,e=a.Cb(g||b,f,c,b)):a.f.za(b);f=e;(c=a.a.e.get(b,h))&&"function"==typeof c.k&&c.k();a.a.e.set(b,h,f&&f.ca()?f:n)}};a.h.va.template=function(b){b=a.h.Ab(b);return 1==b.length&&b[0].unknown||a.h.fd(b,"name")?null:"This template engine does not support anonymous templates nested within its templates"};a.f.aa.template=!0})();a.b("setTemplateEngine",a.Fb);a.b("renderTemplate",a.Cb);a.a.hc=function(a,c,d){if(a.length&&
c.length){var e,f,g,h,l;for(e=f=0;(!d||e<d)&&(h=a[f]);++f){for(g=0;l=c[g];++g)if(h.value===l.value){h.moved=l.index;l.moved=h.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.lb=function(){function b(b,d,e,f,g){var h=Math.min,l=Math.max,m=[],k,n=b.length,q,p=d.length,s=p-n||1,t=n+p+1,v,u,x;for(k=0;k<=n;k++)for(u=v,m.push(v=[]),x=h(p,k+s),q=l(0,k-1);q<=x;q++)v[q]=q?k?b[k-1]===d[q-1]?u[q-1]:h(u[q]||t,v[q-1]||t)+1:q+1:k+1;h=[];l=[];s=[];k=n;for(q=p;k||q;)p=m[k][q]-1,q&&p===m[k][q-1]?l.push(h[h.length]={status:e,
value:d[--q],index:q}):k&&p===m[k-1][q]?s.push(h[h.length]={status:f,value:b[--k],index:k}):(--q,--k,g.sparse||h.push({status:"retained",value:d[q]}));a.a.hc(s,l,!g.dontLimitMoves&&10*n);return h.reverse()}return function(a,d,e){e="boolean"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,"added","deleted",e):b(d,a,"deleted","added",e)}}();a.b("utils.compareArrays",a.a.lb);(function(){function b(b,c,d,h,l){var m=[],k=a.B(function(){var k=c(d,l,a.a.Ba(m,b))||[];0<
m.length&&(a.a.uc(m,k),h&&a.l.w(h,null,[d,k,l]));m.length=0;a.a.ta(m,k)},null,{i:b,ya:function(){return!a.a.Tb(m)}});return{ea:m,B:k.ca()?k:n}}var c=a.a.e.J(),d=a.a.e.J();a.a.Db=function(e,f,g,h,l){function m(b,c){w=q[c];u!==c&&(D[b]=w);w.tb(u++);a.a.Ba(w.ea,e);t.push(w);z.push(w)}function k(b,c){if(b)for(var d=0,e=c.length;d<e;d++)c[d]&&a.a.r(c[d].ea,function(a){b(a,d,c[d].ka)})}f=f||[];h=h||{};var r=a.a.e.get(e,c)===n,q=a.a.e.get(e,c)||[],p=a.a.ib(q,function(a){return a.ka}),s=a.a.lb(p,f,h.dontLimitMoves),
t=[],v=0,u=0,x=[],z=[];f=[];for(var D=[],p=[],w,C=0,B,E;B=s[C];C++)switch(E=B.moved,B.status){case "deleted":E===n&&(w=q[v],w.B&&(w.B.k(),w.B=n),a.a.Ba(w.ea,e).length&&(h.beforeRemove&&(t.push(w),z.push(w),w.ka===d?w=null:f[C]=w),w&&x.push.apply(x,w.ea)));v++;break;case "retained":m(C,v++);break;case "added":E!==n?m(C,E):(w={ka:B.value,tb:a.O(u++)},t.push(w),z.push(w),r||(p[C]=w))}a.a.e.set(e,c,t);k(h.beforeMove,D);a.a.r(x,h.beforeRemove?a.ba:a.removeNode);for(var C=0,r=a.f.firstChild(e),F;w=z[C];C++){w.ea||
a.a.extend(w,b(e,g,w.ka,l,w.tb));for(v=0;s=w.ea[v];r=s.nextSibling,F=s,v++)s!==r&&a.f.kc(e,s,F);!w.ad&&l&&(l(w.ka,w.ea,w.tb),w.ad=!0)}k(h.beforeRemove,f);for(C=0;C<f.length;++C)f[C]&&(f[C].ka=d);k(h.afterMove,D);k(h.afterAdd,p)}})();a.b("utils.setDomNodeChildrenFromArrayMapping",a.a.Db);a.X=function(){this.allowTemplateRewriting=!1};a.X.prototype=new a.P;a.X.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.C?0:b.nodes)?b.nodes():null)return a.a.W(c.cloneNode(!0).childNodes);b=b.text();
return a.a.na(b,e)};a.X.vb=new a.X;a.Fb(a.X.vb);a.b("nativeTemplateEngine",a.X);(function(){a.xb=function(){var a=this.ed=function(){if(!u||!u.tmpl)return 0;try{if(0<=u.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,e,f,g){g=g||t;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var h=b.data("precompiled");h||(h=b.text()||"",h=u.template(null,"{{ko_with $item.koBindingContext}}"+
h+"{{/ko_with}}"),b.data("precompiled",h));b=[e.$data];e=u.extend({koBindingContext:e},f.templateOptions);e=u.tmpl(h,b,e);e.appendTo(g.createElement("div"));u.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){t.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(u.tmpl.tag.ko_code={open:"__.push($1 || '');"},u.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};a.xb.prototype=
new a.P;var b=new a.xb;0<b.ed&&a.Fb(b);a.b("jqueryTmplTemplateEngine",a.xb)})()})})();})();

8
interfaces/Glitter/templates/static/javascripts/moment.min.js vendored Normal file → Executable file
View File

File diff suppressed because one or more lines are too long

View File

@@ -19,7 +19,7 @@ var da = moment.defineLocale('da', {
longDateFormat : {
LT : 'HH:mm',
LTS : 'HH:mm:ss',
L : 'DD/MM/YYYY',
L : 'DD.MM.YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY HH:mm',
LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm'

View File

@@ -28,7 +28,7 @@ function processRelativeTime(number, withoutSuffix, key, isFuture) {
var de = moment.defineLocale('de', {
months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
monthsParseExact : true,
weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),

View File

@@ -13,6 +13,9 @@
var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_');
var monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i];
var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;
var es = moment.defineLocale('es', {
months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
monthsShort : function (m, format) {
@@ -24,7 +27,13 @@ var es = moment.defineLocale('es', {
return monthsShortDot[m.month()];
}
},
monthsParseExact : true,
monthsRegex : monthsRegex,
monthsShortRegex : monthsRegex,
monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
monthsParse : monthsParse,
longMonthsParse : monthsParse,
shortMonthsParse : monthsParse,
weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),

View File

View File

View File

@@ -0,0 +1,99 @@
//! moment.js locale configuration
//! locale : Hebrew [he]
//! author : Tomer Cohen : https://github.com/tomer
//! author : Moshe Simantov : https://github.com/DevelopmentIL
//! author : Tal Ater : https://github.com/TalAter
;(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined'
&& typeof require === 'function' ? factory(require('../moment')) :
typeof define === 'function' && define.amd ? define(['../moment'], factory) :
factory(global.moment)
}(this, (function (moment) { 'use strict';
var he = moment.defineLocale('he', {
months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יוליוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יוליוג׳_ספט׳וק׳וב׳_דצמ׳'.split('_'),
weekdays : 'ראשון_שני_שלישי_רביעי_חמישיישי_שבת'.split('_'),
weekdaysShort : ׳׳׳׳׳_ו׳׳'.split('_'),
weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
longDateFormat : {
LT : 'HH:mm',
LTS : 'HH:mm:ss',
L : 'DD/MM/YYYY',
LL : 'D [ב]MMMM YYYY',
LLL : 'D [ב]MMMM YYYY HH:mm',
LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',
l : 'D/M/YYYY',
ll : 'D MMM YYYY',
lll : 'D MMM YYYY HH:mm',
llll : 'ddd, D MMM YYYY HH:mm'
},
calendar : {
sameDay : '[היום ב־]LT',
nextDay : '[מחר ב־]LT',
nextWeek : 'dddd [בשעה] LT',
lastDay : '[אתמול ב־]LT',
lastWeek : '[ביום] dddd [האחרון בשעה] LT',
sameElse : 'L'
},
relativeTime : {
future : 'בעוד %s',
past : 'לפני %s',
s : 'מספר שניות',
m : 'דקה',
mm : '%d דקות',
h : 'שעה',
hh : function (number) {
if (number === 2) {
return 'שעתיים';
}
return number + ' שעות';
},
d : 'יום',
dd : function (number) {
if (number === 2) {
return 'יומיים';
}
return number + ' ימים';
},
M : 'חודש',
MM : function (number) {
if (number === 2) {
return 'חודשיים';
}
return number + ' חודשים';
},
y : 'שנה',
yy : function (number) {
if (number === 2) {
return 'שנתיים';
} else if (number % 10 === 0 && number !== 10) {
return number + ' שנה';
}
return number + ' שנים';
}
},
meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
isPM : function (input) {
return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
},
meridiem : function (hour, minute, isLower) {
if (hour < 5) {
return 'לפנות בוקר';
} else if (hour < 10) {
return 'בבוקר';
} else if (hour < 12) {
return isLower ? 'לפנה"צ' : 'לפני הצהריים';
} else if (hour < 18) {
return isLower ? 'אחה"צ' : 'אחרי הצהריים';
} else {
return 'בערב';
}
}
});
return he;
})));

View File

View File

@@ -40,7 +40,7 @@ var nl = moment.defineLocale('nl', {
weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'),
weekdaysParseExact : true,
longDateFormat : {
LT : 'HH:mm',

View File

@@ -63,7 +63,24 @@ var pl = moment.defineLocale('pl', {
calendar : {
sameDay: '[Dziś o] LT',
nextDay: '[Jutro o] LT',
nextWeek: '[W] dddd [o] LT',
nextWeek: function () {
switch (this.day()) {
case 0:
return '[W niedzielę o] LT';
case 2:
return '[We wtorek o] LT';
case 3:
return '[W środę o] LT';
case 6:
return '[W sobotę o] LT';
default:
return '[W] dddd [o] LT';
}
},
lastDay: '[Wczoraj o] LT',
lastWeek: function () {
switch (this.day()) {

View File

@@ -11,8 +11,8 @@
var ptBr = moment.defineLocale('pt-br', {
months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
@@ -41,6 +41,7 @@ var ptBr = moment.defineLocale('pt-br', {
future : 'em %s',
past : '%s atrás',
s : 'poucos segundos',
ss : '%d segundos',
m : 'um minuto',
mm : '%d minutos',
h : 'uma hora',

View File

View File

@@ -174,7 +174,7 @@ var ru = moment.defineLocale('ru', {
},
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});

View File

View File

View File

View File

@@ -184,6 +184,7 @@ td.name .name-icons span,
.navbar-nav .open .dropdown-menu>li>a,
.dropdown-header,
#modal-help small,
.hover-button.glyphicon-forward,
pre {
color: #EBEBEB !important;
opacity: 1 !important;

View File

@@ -360,7 +360,7 @@ li.dropdown {
#feedback-slider:hover {
left: 0px;
height: 340px;
height: 200px;
opacity: 1;
}
@@ -404,7 +404,6 @@ thead {
tr th {
border-bottom: none !important;
visibility: hidden;
padding: 0px !important;
height: 0px;
}
@@ -527,6 +526,7 @@ tbody>tr>td:last-child {
}
.hover-button.glyphicon-play,
.hover-button.glyphicon-forward,
.hover-button.glyphicon-stop {
opacity: 1;
color: #474747;
@@ -633,9 +633,17 @@ td.name .row-wrap-text {
margin-left: 3px;
}
.queue-table td.name .direct-unpack-text {
max-width: calc(100% - 75px);
}
.queue-table td.name:hover .row-wrap-text {
max-width: calc(100% - 125px);
/* Change for each size! */
/* Change for each size! */
}
.queue-table td.name:hover .direct-unpack {
display: none;
}
.queue-table td.name:hover .name-options {
@@ -764,8 +772,8 @@ tr.queue-item>td:first-child>a {
line-height: 24px;
overflow: visible;
margin-bottom: 0;
box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.3);
-webkit-box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.3);
box-shadow: inset 0 0px 2px rgba(0, 0, 0, 0.2);
-webkit-box-shadow: inset 0 0px 2px rgba(0, 0, 0, 0.2);
}
.progress>span,
@@ -1859,7 +1867,6 @@ input[name="nzbURL"] {
td.name .name-icons {
margin-left: 0px;
margin-right: -5px;
display: block;
}
td.name .row-wrap-text {
@@ -1887,7 +1894,6 @@ input[name="nzbURL"] {
.history-queue-swicher .nav-tabs>li>a {
border-bottom: inherit;
}
}
@media screen and (min-width: 768px) {
@@ -1899,7 +1905,6 @@ input[name="nzbURL"] {
min-width: 715px;
}
.queue .sortable-placeholder td {
padding: 9px 0px 8px !important;
}

View File

@@ -141,8 +141,12 @@ tr.queue-item>td:first-child>a {
margin-top: 3px;
}
.queue-table td.name .direct-unpack {
display: none;
}
.queue-table td.name .name-options {
display: block;
display: inline-block;
}
.queue-table td.name .name-options small {

View File

@@ -28,6 +28,7 @@
<link rel="apple-touch-icon" sizes="152x152" href="${path}staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
<link rel="apple-touch-icon" sizes="180x180" href="${path}staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
<link rel="apple-touch-icon" sizes="192x192" href="${path}staticcfg/ico/android-192x192.png" />
<link rel="mask-icon" href="${path}staticcfg/ico/safari-pinned-tab.svg" color="#383F45">
<script type="text/javascript" src="${path}static/javascripts/lib.js?$version"></script>
@@ -99,9 +100,8 @@
#if $loadavg#$T('ft-sysload'):&nbsp;<span id="loadavg">$loadavg</span>#end if#
</div>
<div id="nav_text_left">
<span id="warning_box"><b><a href="${path}status/#tabs-warnings" id="last_warning" title="#echo $last_warning.replace("\n"," ").replace('"',"'") #"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
<span id="warning_box"><b><a href="${path}status/#tabs-warnings" id="last_warning"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
#if $pane=="Main"#
&sdot; <a href="${path}config/general#web_dir">#echo $T('useGlitter').split('.')[0]#.</a>
#if $new_release#&sdot; <a href="$new_rel_url" id="new_release" target="_blank">$T('Plush-updateAvailable').replace(' ','&nbsp;')</a>#end if#
#end if#
</div>

View File

@@ -6,7 +6,7 @@
$.plush.queuenoofslots = $noofslots;
$.plush.SetQueueSpeedLimit('$speedlimit', '$speedlimit_abs');
$.plush.SetQueueFinishAction('$finishaction');
$.plush.SetWarnings($have_warnings,"<!--#echo $last_warning.replace("\n"," ").replace('"',"'").replace('\\','\\\\') #-->");
$.plush.SetWarnings($have_warnings,"");
$.plush.SetQueuePauseInfo(<!--#if $paused#-->true<!--#else#-->false<!--#end if#-->,'$pause_int');
$.plush.SetQueueETAStats("<!--#if float($kbpersec) > 1023 #-->$speed<!--#else#--><!--#echo "%.0f" % float($kbpersec)#--> K<!--#end if#-->",<!--#echo "%.0f" % float($kbpersec)#-->,'$timeleft','$T('eta'): $eta');
@@ -56,7 +56,7 @@
</td>
<td class="download-title" <!--#if $rating_enable#-->style="width:35%"<!--#end if#-->>
<a href="nzb/$slot.nzo_id/" title="$T('status'): $T('post-'+$slot.status)<br/>$T('nzo-age'): $slot.avg_age<br/><!--#if $slot.missing#-->$T('missingArt'): $slot.missing<!--#end if#-->">$slot.filename.replace('.', '.&#8203;').replace('_', '_&#8203;')<!--#if $slot.password#--> / $slot.password<!--#end if#--></a>
<a href="nzb/$slot.nzo_id/" title="$T('status'): $T('post-'+$slot.status)<br/>$T('nzo-age'): $slot.avg_age<br/><!--#if $slot.mbmissing!="0.00"#-->$T('missingArt'): $slot.mbmissing $T('MB')<!--#end if#-->">$slot.filename.replace('.', '.&#8203;').replace('_', '_&#8203;')<!--#if $slot.password#--> / $slot.password<!--#end if#--></a>
</td>
<!--#if $rating_enable#-->

View File

@@ -146,7 +146,7 @@ jQuery(function($){
$("#plush_options").colorbox({ inline:true, href:"#plush_options_modal", title:$("#plush_options").text(),
innerWidth:"375px", innerHeight:"350px", initialWidth:"375px", initialHeight:"350px", speed:0, opacity:0.7
});
// Save the type of speedlimit display
$('#maxSpeed-label').change(function() {
$.plush.speedLimitType = $(this).val();
@@ -159,19 +159,19 @@ jQuery(function($){
$('#maxSpeed-label').val($.plush.speedLimitType)
// Max Speed main menu input -- don't change value on refresh when focused
$("#maxSpeed-option").focus(function(){
$.plush.focusedOnSpeedChanger = true;
}).blur(function(){
$.plush.focusedOnSpeedChanger = false;
$("#maxSpeed-option").focus(function(){
$.plush.focusedOnSpeedChanger = true;
}).blur(function(){
$.plush.focusedOnSpeedChanger = false;
}).keyup(function (e) {
// Catch the enter
if (e.keyCode == 13) {
$("#maxSpeed-enable").click()
}
})
// Submit the new speedlimit
$("#maxSpeed-enable, #maxSpeed-disable").click( function(e) {
$("#maxSpeed-enable, #maxSpeed-disable").click( function(e) {
// Remove
if ($(e.target).attr('id')=="maxSpeed-disable") {
$('#maxSpeed-option').val('');
@@ -496,7 +496,7 @@ jQuery(function($){
};
// static-element tooltips
$('body').delegate('#pausefor_title, #last_warning, #time-left, #multi_delete, #explain-blockRefresh, #pause_resume, #hist_purge, #queueTable td.download-title a, #queueTable td.eta span, #queueTable td.options .icon_nzb_remove, #historyTable td.options .icon_nzb_remove, #historyTable td div.icon_history_verbose', 'mouseover mouseout mousemove', function(event) {
$('body').delegate('#pausefor_title, #time-left, #multi_delete, #explain-blockRefresh, #pause_resume, #hist_purge, #queueTable td.download-title a, #queueTable td.eta span, #queueTable td.options .icon_nzb_remove, #historyTable td.options .icon_nzb_remove, #historyTable td div.icon_history_verbose', 'mouseover mouseout mousemove', function(event) {
var link = this,
$link = $(this);
@@ -1095,7 +1095,7 @@ $("a","#multiops_inputs").click(function(e){
title:function(){return $(this).text().replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");},
innerWidth:"80%", innerHeight:"300px", initialWidth:"80%", initialHeight:"300px", speed:0, opacity:0.7 });
// modal for reporting issues
// modal for reporting issues
$("#historyTable .modal-report").colorbox({ inline:true,
href: function(){return "#report-"+$(this).parent().parent().parent().attr('id');},
title:function(){return $(this).text();},
@@ -1252,7 +1252,7 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
$('#queue-pagination span').removeClass('loading'); // Remove spinner graphic from pagination
$('#manual_refresh_wrapper').removeClass('refreshing'); // Refresh state notification
},
error: function(xhr){
error: function(xhr){
// Only reason for a 404 error could be a login failure -> redirect
if(xhr.status == 404) {
document.location=document.location;
@@ -1320,7 +1320,7 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
$('#history .avg_rate').rateit({readonly: true, resetable: false, step: 0.5});
$('#history .avg_rate').each(function() { $(this).rateit('value', $(this).attr('value') / 2); });
$('#history .user_combo option').filter(function() {
return $(this).attr('value') == $(this).parent().parent().find('input.user_combo').attr('value');
return $(this).attr('value') == $(this).parent().parent().find('input.user_combo').attr('value');
}).attr('selected', true);
$('#history-pagination span').removeClass('loading'); // Remove spinner graphic from pagination
}
@@ -1342,11 +1342,11 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
// For switching using the select
if(!speedLimit) speedLimit = $.plush.speedLimit;
if(speedLimitAbs == undefined) speedLimitAbs = $.plush.speedLimitAbs;
// Save
// Save
$.plush.speedLimit = speedLimit;
$.plush.speedLimitAbs = speedLimitAbs;
// How do we format?
switch($.plush.speedLimitType) {
case '%':
@@ -1360,11 +1360,11 @@ $.plush.histprevslots = $.plush.histnoofslots; // for the next refresh
speedlimitDisplay = speedLimitAbs/1024/1024;
break;
}
// In case nothing and we make the displaying of the float more pretty
speedlimitDisplay = (isNaN(speedlimitDisplay) || speedlimitDisplay == '0') ? '' : speedlimitDisplay;
speedlimitDisplay = Math.round(speedlimitDisplay*10)/10;
// Update
if ($("#maxSpeed-option").val() != speedlimitDisplay && !$.plush.focusedOnSpeedChanger)
$("#maxSpeed-option").val(speedlimitDisplay);

View File

@@ -109,6 +109,11 @@ body {
font-weight: bold;
}
#new_release {
color: green;
font-weight: bold;
}
#livetip {
position: absolute;
background-color: #cfc;
@@ -338,7 +343,6 @@ body {
clear:left;
padding: 0 20px 0 25px;
font-size:90%;
font-weight: bold;
}
#nav_text_left a, #nav_text_right a {
color:#000;
@@ -1079,7 +1083,7 @@ tr:hover .history_added { color: black; }
color: red;
margin-left: 10px;
}
.rating_icon_vision {
width: 16px;
height: 16px;

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 729 B

After

Width:  |  Height:  |  Size: 726 B

View File

@@ -1,7 +1,7 @@
<!--#set global $pane="Status"#-->
<!--#set global $help_uri="GUI+Status-0-7"#-->
<!--#include $webdir + "/_inc_header.tmpl"#-->
<!--#import datetime#-->
<div class="tabs">
<ul>
<li><a href="#tabs-warnings">$T('lastWarnings')</a></li>
@@ -33,7 +33,11 @@
<!--#for $warn in $warnings#-->
<!--#set $odd = not $odd#-->
<tr class="<!--#if $odd then "odd" else "even"#-->">
<td>$warn.replace("\n","</td><td>", 2)</td></tr>
<!--#set when = datetime.datetime.fromtimestamp($warn.time) #-->
<td>$when</td>
<td>$warn.type</td>
<td>$warn.text</td>
</tr>
<!--#end for#-->
</table>
<!--#else#-->

View File

@@ -20,6 +20,7 @@
<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">
<script type="text/javascript" src="static/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="static/PlotKit/PlotKit.js"></script>
@@ -78,7 +79,6 @@
input = input.replace(/%0e/g,'05');
input = input.replace(/%e/g,'5');
input = input.replace(/%fn/g,'$T("sort-File")');
input = input.replace(/%dn/g,'$T("sort-Folder")');
document.getElementById('previewtv').innerHTML = getOutput(input);
}

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,2 +1,2 @@
dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
dojo.hostenv.moduleLoaded("MochiKit.*");
dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
dojo.hostenv.moduleLoaded("MochiKit.*");

View File

@@ -1,3 +1,4 @@
<!--#import datetime#-->
<script type="text/javascript">
window.onload = function() {
location = "../#/status"
@@ -36,7 +37,10 @@ $T('logging'):
<!--#if $warnings#-->
<h2>$T('lastWarnings') (<a class="config" onClick="lr('status/clearwarnings','', '-1', this.parentNode.id);">$T('clearWarnings')</a>)</h2>
<!--#for $warn in $warnings#-->
$warn<br/>
<!--#set when = datetime.datetime.fromtimestamp($warn.time) #-->
$when<br>
$warn.type<br>
$warn.text<br>
<!--#end for#-->
<!--#end if#-->

View File

@@ -6,7 +6,7 @@
<link rel="stylesheet" type="text/css" href="../staticcfg/bootstrap/css/bootstrap.min.css?v=$version"/>
<link rel="stylesheet" type="text/css" href="static/style.css?v=$version"/>
<link rel="shortcut icon" href="../staticcfg/ico/favicon.ico?v=$version" />
<script type="text/javascript" src="../staticcfg/js/jquery-3.1.1.min.js?v=$version"></script>
<script type="text/javascript" src="../staticcfg/js/jquery-3.2.1.min.js?v=$version"></script>
<script type="text/javascript" src="../staticcfg/bootstrap/js/bootstrap.min.js?v=$version"></script>
</head>
<body>

View File

@@ -16,6 +16,10 @@
<input type="radio" name="lang" id="$l" value="$l" <!--#if $lang == $l then 'checked="checked"' else ''#--> />
</label>
<!--#end for#-->
<!--#if not $languages#-->
<hr>
No language files detected. Please run <code>python tools/make_mo.py</code> once and restart SABnzbd, or contact your package provider.
<!--#end if#-->
<div class="spacer"></div>
</div>
</div>

View File

@@ -87,7 +87,7 @@
</div>
<div class="col-md-5">
<div class="clearfix"></div>
<iframe style="float: right; width: 315px; height: 315px;" frameborder="0" src="https://resources.sabnzbd.org/wizard/ad/$language"></iframe>
<iframe style="float: right; width: 325px; height: 325px;" frameborder="0" src="https://sabnzbd.org/wizard#$language"></iframe>
</div>
</div>
<input type="hidden" name="session" value="$session" />

View File

@@ -1,11 +1,11 @@
The original author of SABnzbd based his work on Pynewsleecher by Freddy@madcowdesease.org.
Few parts of Pynewsleecher have survived the generations of SABnzbd in a
recognizable form.
Still, we wish to thank Freddy for his inspiration.
The home of the Pynewsleecher project:
http://www.madcowdisease.org/mcd/pynewsleecher
The software does not carry any license information.
The original author of SABnzbd based his work on Pynewsleecher by Freddy@madcowdesease.org.
Few parts of Pynewsleecher have survived the generations of SABnzbd in a
recognizable form.
Still, we wish to thank Freddy for his inspiration.
The home of the Pynewsleecher project:
http://www.madcowdisease.org/mcd/pynewsleecher
The software does not carry any license information.

View File

@@ -1,8 +1,8 @@
On http://www.brunningonline.net/simon/blog/archives/001835.html,
the author licensed SysTrayIcon.py under a variant of the WTFPL:
> Any road up, help yourself. Consider SysTrayIcon.py to be under an
> "Aleister Crowley" style license - "Do what thou wilt shall be the
> only law".
>
> Err, but don't sue me if it doesn't work. ;-)
On http://www.brunningonline.net/simon/blog/archives/001835.html,
the author licensed SysTrayIcon.py under a variant of the WTFPL:
> Any road up, help yourself. Consider SysTrayIcon.py to be under an
> "Aleister Crowley" style license - "Do what thou wilt shall be the
> only law".
>
> Err, but don't sue me if it doesn't work. ;-)

View File

Binary file not shown.

View File

@@ -5,14 +5,14 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-2.2.0-develop\n"
"Project-Id-Version: SABnzbd-2.4.0-develop\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: shypike@sabnzbd.org\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 7bit\n"
"POT-Creation-Date: 2017-08-02 12:48+W. Europe Daylight Time\n"
"POT-Creation-Date: 2017-12-06 10:56+W. Europe Standard Time\n"
"Generated-By: pygettext.py 1.5\n"
@@ -40,10 +40,22 @@ msgstr ""
msgid "par2 binary... NOT found!"
msgstr ""
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr ""
@@ -178,10 +190,6 @@ msgstr ""
msgid "Trying to set status of non-existing server %s"
msgstr ""
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr ""
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr ""
@@ -204,15 +212,6 @@ msgstr ""
msgid "&nbsp;Resolving address"
msgstr ""
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr ""
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr ""
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr ""
@@ -229,6 +228,10 @@ msgstr ""
msgid "Failed to compile regex for search term: %s"
msgstr ""
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr ""
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr ""
@@ -369,10 +372,6 @@ msgstr ""
msgid "SQL Command Failed, see log"
msgstr ""
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr ""
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr ""
@@ -389,10 +388,6 @@ msgstr ""
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr ""
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr ""
@@ -431,12 +426,17 @@ msgstr ""
msgid "Jobs will start unpacking during the downloading to reduce post-processing time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr ""
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr ""
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr ""
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
@@ -534,6 +534,12 @@ msgstr ""
msgid "Email succeeded"
msgstr ""
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr ""
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr ""
@@ -604,7 +610,7 @@ msgstr ""
msgid "Authentication missing, please enter username/password from Config->General into your 3rd party program:"
msgstr ""
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid "Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin."
msgstr ""
@@ -664,14 +670,22 @@ msgstr ""
msgid "Undefined server!"
msgstr ""
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr ""
#: sabnzbd/interface.py
msgid "Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr ""
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -692,7 +706,7 @@ msgstr ""
msgid "m"
msgstr ""
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr ""
@@ -712,10 +726,18 @@ msgstr ""
msgid "Error creating SSL key and certificate"
msgstr ""
#: sabnzbd/misc.py [Warning message]
msgid "Your password file contains more than 30 passwords, testing all these passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -891,6 +913,7 @@ msgstr ""
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -917,16 +940,7 @@ msgid "[%s] Verified in %s, repair is required"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgid "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
@@ -937,6 +951,10 @@ msgstr ""
msgid "Fetching"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -962,6 +980,10 @@ msgstr ""
msgid "Verifying"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1023,11 +1045,6 @@ msgstr ""
msgid "Not available"
msgstr ""
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr ""
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr ""
@@ -1036,7 +1053,7 @@ msgstr ""
msgid "Bad response from Pushover (%s): %s"
msgstr ""
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr ""
@@ -1124,10 +1141,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr ""
#: sabnzbd/nzbstuff.py [Warning message]
msgid "%d files with duplicate filenames were discared for \"%s\". Enable \"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr ""
@@ -1377,7 +1390,7 @@ 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 # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr ""
@@ -1397,6 +1410,10 @@ msgstr ""
msgid "Completed Download Folder %s is on FAT file system, limiting maximum file size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid "Module subprocessww missing. Expect problems with Unicoded file and directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr ""
@@ -1425,10 +1442,6 @@ msgstr ""
msgid "Failed to move files"
msgstr ""
#: sabnzbd/postproc.py
msgid "Running script"
msgstr ""
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr ""
@@ -1449,7 +1462,7 @@ msgstr ""
msgid "Post Processing Failed for %s (%s)"
msgstr ""
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr ""
@@ -1759,6 +1772,14 @@ msgstr ""
msgid "Disable quota management"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr ""
@@ -2573,6 +2594,10 @@ msgstr ""
msgid "Optional authentication password."
msgstr ""
#: sabnzbd/skintext.py
msgid "If the SABnzbd Host or Port is exposed to the internet, your current settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -2965,6 +2990,14 @@ msgstr ""
msgid "Detect identical episodes in series (based on \"name/season/episode\" of items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid "Bypass series duplicate detection if PROPER, REAL or REPACK is detected in the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr ""
@@ -3213,7 +3246,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr ""
@@ -3669,6 +3702,22 @@ msgstr ""
msgid "Device(s) to which message should be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr ""
@@ -3809,6 +3858,10 @@ msgstr ""
msgid "S01E05 Episode Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr ""
@@ -3878,7 +3931,7 @@ msgid "Original Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
@@ -3897,10 +3950,6 @@ msgstr ""
msgid "file"
msgstr ""
#: sabnzbd/skintext.py
msgid "folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr ""
@@ -4065,6 +4114,14 @@ msgstr ""
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr ""
@@ -4225,6 +4282,14 @@ msgstr ""
msgid "Pause for..."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr ""
#: sabnzbd/skintext.py
msgid "All usernames, passwords and API-keys are automatically removed from the log and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr ""
@@ -4281,10 +4346,6 @@ msgstr ""
msgid "You must enable JavaScript for Plush to function!"
msgstr ""
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr ""
#: sabnzbd/skintext.py
msgid "Options"
msgstr ""
@@ -4373,10 +4434,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr ""
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr ""
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr ""
@@ -4573,16 +4630,24 @@ msgid ""
"It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your option) any later version.\n"
msgstr ""
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid "In order to download from usenet you will require access to a provider. Your ISP may provide you with access, however a premium provider is recommended."
msgstr ""
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr ""
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr ""
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr ""
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr ""

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-10-27 21:53+0000\n"
"Last-Translator: Søren <Unknown>\n"
"Language-Team: Danish <da@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -29,11 +29,14 @@ msgstr "Kan ikke finde webskabeloner: %s, forsøger med standardskabelon"
msgid ""
"SABYenc disabled: no correct version found! (Found v%s, expecting v%s)"
msgstr ""
"SABYenc deaktiveret: Der blev ikke fundet nogen korrekt version (Fandt v%s, "
"forventede v%s)"
#: SABnzbd.py [Warning message]
msgid ""
"SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc"
msgstr ""
"SABYenc modul... IKKE fundet! Forventede v%s - https://sabnzbd.org/sabyenc"
#: SABnzbd.py [Error message]
msgid "_yenc module... NOT found!"
@@ -43,10 +46,22 @@ msgstr "_yenc modul... IKKE fundet!"
msgid "par2 binary... NOT found!"
msgstr "par2 binær... IKKE fundet!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr "Verificering og reperation er ikke muligt."
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr "MultiPar binær... IKKE fundet!"
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr "Din Unrar version er %s, vi anbefaler version %s eller højere.<br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr "Downloads vil ikke blive udpakket."
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "unrar binær... IKKE fundet!"
@@ -192,10 +207,6 @@ msgstr "Kan ikke oprette temp fil for %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Forsøger at sætte status på ikke eksisterende server %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "For lidt diskplads tvinger system i PAUSE"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Fejl i tempfile.mkstemp"
@@ -218,15 +229,6 @@ msgstr "Afprøv notifikation"
msgid "&nbsp;Resolving address"
msgstr "&nbsp; Server løsning"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEJL:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ingen"
@@ -243,6 +245,10 @@ msgstr "Ukendt"
msgid "Failed to compile regex for search term: %s"
msgstr "Det lykkedes ikke at kompilere regex for søgestreng: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "For lidt diskplads tvinger system i PAUSE"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Disken er fuld! Pauser..."
@@ -395,10 +401,6 @@ msgstr "Beskadigede historik database, skabte tom udskiftning"
msgid "SQL Command Failed, see log"
msgstr "SQL Kommando mislykkedes, se logg"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "SQL Commit mislykkedes, se logg"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Det lykkedes ikke at lukke databasen, se logg"
@@ -415,10 +417,6 @@ msgstr "Afkodning af %s mislykkedes"
msgid "Decoder failure: Out of memory"
msgstr "Dekoder fejl: Ikke mere hukommelse"
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "CRC Fejl i %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Forkert udformet yEnc artikel i %s"
@@ -459,14 +457,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Kan ikke læse %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Det lykkedes ikke at tilføje %s, slette"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Fejl ved fjernelse af %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Kan ikke læse %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Kan ikke læse overvåget mappe %s"
@@ -564,6 +567,12 @@ msgstr "Det lykkedes ikke at lukke e-mail tilslutning"
msgid "Email succeeded"
msgstr "E-mail afsendelse mislykkedes"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Kan ikke sende, mangler nødvendige data"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Kan ikke finde e-mail skabeloner i %s"
@@ -656,7 +665,7 @@ msgstr ""
"Brugeroplysninger mangler, indtast brugernavn / password fra Konfiguration-> "
"Generelt i dit tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -727,14 +736,23 @@ msgstr "slået fra"
msgid "Undefined server!"
msgstr "Udefineret server"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Fejl parameter"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Tilbage"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEJL:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -755,7 +773,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Kan ikke oprette mappe %s"
@@ -775,10 +793,20 @@ msgstr "Det lykkedes ikke at flytte %s til %s"
msgid "Error creating SSL key and certificate"
msgstr "Fejl ved oprettelse af SSL-nøgle og certifikat."
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Det lykkedes ikke at ændre rettigheder på %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Køre script"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -954,6 +982,7 @@ msgstr "Starter reparation"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr "Par verificering mislykkedes på %s, mens QuickCheck lykkedes"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -983,17 +1012,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Bekræftelse i %s, kræver reparation"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Hovedarkiv mangler..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Ugyldig PAR2 filer, kan ikke kontrollere eller reparere"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Reparation mislykkedes, ikke nok reparation blokke (%s mangler)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1003,6 +1024,10 @@ msgstr "Henter %s block..."
msgid "Fetching"
msgstr "Henter"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Reparation mislykkedes, ikke nok reparation blokke (%s mangler)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1028,6 +1053,10 @@ msgstr "Disk fuld"
msgid "Verifying"
msgstr "Bekræfter"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1091,11 +1120,6 @@ msgstr "Andre beskeder"
msgid "Not available"
msgstr "Ikke tilgængelig"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Kan ikke sende, mangler nødvendige data"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Kunne ikke sende Prowl besked"
@@ -1104,7 +1128,7 @@ msgstr "Kunne ikke sende Prowl besked"
msgid "Bad response from Pushover (%s): %s"
msgstr "Dårlig respons fra pushover (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Det lykkedes ikke at sende pushover besked"
@@ -1192,12 +1216,6 @@ msgstr "Dublet NZB"
msgid "Pausing duplicate NZB \"%s\""
msgstr "Pause duplikeret NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Afbrudt, kan ikke afsluttes"
@@ -1481,7 +1499,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Alvorlig fejl"
@@ -1503,6 +1521,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr "Overførslen kan mislykkes, kun %s af det krævede %s tilgængelig"
@@ -1531,10 +1555,6 @@ msgstr "Det lykkedes ikke at omdøbe \"%s\" til \"%s\""
msgid "Failed to move files"
msgstr "Kunne ikke flytte filer"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Køre script"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Kør bruger script %s"
@@ -1555,7 +1575,7 @@ msgstr "Mere"
msgid "Post Processing Failed for %s (%s)"
msgstr "Efterbehandling mislykkedes for %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "se logfil"
@@ -1869,6 +1889,14 @@ msgstr "Aktivere kvota styring"
msgid "Disable quota management"
msgstr "Deaktivere kvota styring"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Slået fra"
@@ -2714,6 +2742,12 @@ msgstr "SABnzbd password"
msgid "Optional authentication password."
msgstr "Valgfrit password."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr "Sikkerhed"
@@ -3184,6 +3218,16 @@ msgstr ""
"Fundet identiske episoder i serie (baseret på \"navn /sæson /episode\" af "
"elementer i din historik)"
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Kassér"
@@ -3458,7 +3502,7 @@ msgstr "SSL-chifre"
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr "Øge ydeevnen ved at tvinge en lavere SSL-kryptering styrke."
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Maksimalt antal forsøg"
@@ -3935,6 +3979,22 @@ msgstr "Enhed(er)"
msgid "Device(s) to which message should be sent"
msgstr "Enhed(er) som meddelelse skal sendes til"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4086,6 +4146,10 @@ msgstr "1x05 Episodemappe"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodemappe"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4155,8 +4219,8 @@ msgid "Original Filename"
msgstr "Originalfilnavn"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Orginal Mappenavn"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4174,10 +4238,6 @@ msgstr "tekst"
msgid "file"
msgstr "fil"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "mappe"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteringsstreng"
@@ -4350,6 +4410,14 @@ msgstr "Mistet forbindelsen til SABnzbd.."
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "I tilfælde af SABnzbd genstart vil denne skærm forsvinde automatisk!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Hent"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Opdateringsfrekvens"
@@ -4514,6 +4582,16 @@ msgstr "Vi kunne desværre ikke fortolke denne. Prøv igen."
msgid "Pause for..."
msgstr "Pause i..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Opdatere"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Sortere efter alder <small>Ældst&rarr;Nyeste</small>"
@@ -4570,10 +4648,6 @@ msgstr "Vil du virkelig tømme historiken?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Du skal aktivere JavaScript for at få Plush til virke!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Opdatere"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Muligheder"
@@ -4666,10 +4740,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr "Bloker genopfriskninger ved at hænge over"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Hent"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Upload"
@@ -4878,16 +4948,28 @@ msgstr ""
"Den er licenseret under GNU General Public License version 2 eller (efter "
"eget valg) enhver senere version\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"For at hente fra usenet kræves der adgang fra en udbyder. Din "
"internetudbyder kan give dig adgang, men en præmie udbyder anbefales."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Har du ingen usenet leverandør? Vi anbefaler at prøve %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Det lykkedes ikke at hente TV info (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Det lykkedes ikke at omdøbe: %s til %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Kunne ikke omdøbe lignende fil: %s til %s"
@@ -4922,6 +5004,12 @@ msgstr "URL hentning mislykkedes; %s"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "Mappen \"%s\" findes ikke"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "SQL Commit mislykkedes, se logg"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "CRC Fejl i %s (%s -> %s)"
#~ msgid "Error: No secondary interface defined."
#~ msgstr "Fejl: Ingen sekundær bruger grænseflade defineret."
@@ -4977,12 +5065,12 @@ msgstr "URL hentning mislykkedes; %s"
#~ msgid "Unpacking failed, an expected file was not unpacked"
#~ msgstr "Udpakning mislykkedes, en ventet fil er ikke udpakket"
#~ msgid "Main packet not found..."
#~ msgstr "Hovedarkiv mangler..."
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
#~ msgstr "Mislykkedes med importering af OpenSSL modul. Tilslutter uden SSL"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Det lykkedes ikke at tilføje %s, slette"
#~ msgid "Failed to remove nzo from postproc queue (id)"
#~ msgstr "Det lykkedes ikke at fjerne nzo fra efterbehandlings køen (id)"
@@ -5214,16 +5302,6 @@ msgstr "URL hentning mislykkedes; %s"
#~ "Launch my internet browser with the SABnzbd page when the program starts."
#~ msgstr "Start webbrowseren med SABnzbd's siden når programmet startes."
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "For at hente fra usenet kræves der adgang fra en udbyder. Din "
#~ "internetudbyder kan give dig adgang, men en præmie udbyder anbefales."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "Har du ingen usenet leverandør? Vi anbefaler at prøve %s."
#~ msgid "Please enter a whole number."
#~ msgstr "Angiv et helt tal."
@@ -5336,6 +5414,12 @@ msgstr "URL hentning mislykkedes; %s"
#~ msgid "Show times in AM/PM notation (does not affect scheduler)."
#~ msgstr "Vis tider i AM / PM notation (påvirker ikke skemalægger)."
#~ msgid "folder"
#~ msgstr "mappe"
#~ msgid "Original Foldername"
#~ msgstr "Orginal Mappenavn"
#~ msgid "Groups / Indexer tags"
#~ msgstr "Gruppe / Index tags"
@@ -5395,6 +5479,9 @@ msgstr "URL hentning mislykkedes; %s"
#~ msgid "Apply maximum retries only to optional servers"
#~ msgstr "Påfør maksimalt antal forsøg kun til valgfri servere"
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Ugyldig PAR2 filer, kan ikke kontrollere eller reparere"
#~ msgid "QR Code"
#~ msgstr "QR kode"

View File

@@ -7,15 +7,19 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-06 20:37+0000\n"
"Last-Translator: fox <Unknown>\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-10-10 19:03+0000\n"
"Last-Translator: Robin Munkittrick <Unknown>\n"
"Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr "MultiPar Programmdatei nicht gefunden!"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -48,11 +52,19 @@ msgstr "_yenc-Modul nicht gefunden!"
msgid "par2 binary... NOT found!"
msgstr "par2-Programmdatei nicht gefunden!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr "Überprüfung und Reparatur sind nicht möglich."
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
"Deine UNRAR-Version ist %s, Wir empfehlen Version %s oder höher.<br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr "Downloads werden nicht enpackt."
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "unrar-Programmdatei nicht gefunden!"
@@ -63,7 +75,7 @@ msgstr "unzip-Programmdatei nicht gefunden!"
#: SABnzbd.py
msgid "7za binary... NOT found!"
msgstr "7za-Programm … NICHT gefunden!"
msgstr "7za-Programmdatei nicht gefunden"
#: SABnzbd.py [Warning message]
msgid ""
@@ -203,10 +215,6 @@ msgstr "Temporäre Datei für %s konnte nicht angelegt werden"
msgid "Trying to set status of non-existing server %s"
msgstr "Status für nicht vorhandenen Server wird versucht %s einzustellen"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Angehalten wegen zu wenig freiem Speicherplatz"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Fehler in tempfile.mkstemp"
@@ -229,15 +237,6 @@ msgstr "Benachrichtigungen testen"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Adresse wird aufgelöst …"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEHLER:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "WARNUNG:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Nichts"
@@ -255,6 +254,10 @@ msgid "Failed to compile regex for search term: %s"
msgstr ""
"Kompilieren des regulären Ausdrucks für den Suchbegriff %s fehlgeschlagen."
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Angehalten wegen zu wenig freiem Speicherplatz"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Festplatte voll! Downloads werden angehalten."
@@ -413,10 +416,6 @@ msgstr "Verlaufsdatenbank geschädigt, eine leere neue wurde erstellt"
msgid "SQL Command Failed, see log"
msgstr "SQL-Befehl fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll."
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "SQL-Commit fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll."
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr ""
@@ -434,10 +433,6 @@ msgstr "Fehler beim Dekodieren von %s."
msgid "Decoder failure: Out of memory"
msgstr "Decoder Fehler: Nicht genügend Speicher"
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "CRC-Fehler in %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Ungültiger yEnc-Artikel in %s"
@@ -481,14 +476,19 @@ msgstr ""
"Nachbearbeitungszeit zu verkürzen. Nur für Aufträge, die nicht repariert "
"werden müssen."
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "%s kann nicht gelesen werden"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Fehler beim Hinzufügen von %s. Entferne."
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Fehler beim Entfernen von %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "%s kann nicht gelesen werden"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Überwachter Ordner %s kann nicht gelesen werden"
@@ -586,6 +586,12 @@ msgstr "Schliessen der Mail-Verbindung fehlgeschlagen"
msgid "Email succeeded"
msgstr "E-Mail erfolgreich versendet"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Absenden nicht möglich, benötigte Daten fehlen"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "In %s konnten keine E-Mail-Vorlagen gefunden werden"
@@ -681,7 +687,7 @@ msgstr ""
"Authentifizierung fehlt. Bitte Benutzernamen und Passwort aus Einstellungen-"
">Allgemein in die externe Anwendung eingeben:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -751,14 +757,23 @@ msgstr "Aus"
msgid "Undefined server!"
msgstr "Undefinierter Server!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Fehlerhafter Parameter"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Zurück"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEHLER:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -779,7 +794,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Verzeichnis %s konnte nicht angelegt werden"
@@ -799,10 +814,23 @@ msgstr "Verschieben von %s nach %s fehlgeschlagen"
msgid "Error creating SSL key and certificate"
msgstr "Fehler beim Anlegen des SSL-Schlüssels und -Zertifikats."
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
"Ihre Passwort-Datei enthält mehr als 30 Passwörter, das Testen aller "
"Passwörter dauert sehr lange. Versuchen Sie, nur nützliche Passwörter "
"aufzulisten."
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Rechte von %s konnten nicht geändert werden"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Ausführen des Skripts"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -982,6 +1010,7 @@ msgstr ""
"Par-Verifikation für \"%s\" fehlgeschlagen, obwohl der QuickCheck "
"erfolgreich war"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -1011,19 +1040,11 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Überprüft in %s. Reparatur wird benötigt."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Hauptpaket nicht gefunden …"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Ungültige PAR2-Dateien. Überprüfung oder Reparatur nicht möglich."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
"Reparatur fehlgeschlagen. Nicht genug Reparatur-Blöcke vorhanden (%s zu "
"wenig)"
"Ungültige par2-Dateien oder ungültige PAR2-Parameter, Auftrag konnte nicht "
"überprüft oder repariert werden"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1033,6 +1054,12 @@ msgstr "%s Blöcke werden abgerufen …"
msgid "Fetching"
msgstr "Abrufen"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr ""
"Reparatur fehlgeschlagen. Nicht genug Reparatur-Blöcke vorhanden (%s zu "
"wenig)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1058,6 +1085,10 @@ msgstr "Festplatte voll"
msgid "Verifying"
msgstr "Überprüfen"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr "Überprüfe zusätzliche Dateien"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1065,7 +1096,7 @@ msgstr "Wird überprüft"
#: sabnzbd/newsunpack.py [Error message]
msgid "Python script \"%s\" does not have execute (+x) permission set"
msgstr "Dem Pythonskript \"%s\" fehlen die Ausführenrechte (+x)"
msgstr "Dem Pythonskript \"%s\" fehlen die Ausführungsrechte (+x)"
#: sabnzbd/newswrapper.py
msgid "This server does not allow SSL on this port"
@@ -1124,11 +1155,6 @@ msgstr "Andere Nachrichten"
msgid "Not available"
msgstr "Nicht verfügbar"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Absenden nicht möglich, benötigte Daten fehlen"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Konnte Prowl-Nachricht nicht versenden"
@@ -1137,7 +1163,7 @@ msgstr "Konnte Prowl-Nachricht nicht versenden"
msgid "Bad response from Pushover (%s): %s"
msgstr "Fehlerhafte Antwort von Pushbullet (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Konnte Pushover-Nachricht nicht versenden"
@@ -1230,14 +1256,6 @@ msgstr "Doppelte NZB"
msgid "Pausing duplicate NZB \"%s\""
msgstr "Doppelt vorhandene NZB \"%s\" angehalten"
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
"%s Dateien mit doppelten Dateinamen wurden für \"%s\" verworfen. Aktiviere "
"\"allow_duplicate_files\" um doppelte Dateinamen zu erlauben."
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Abgebrochen, kann nicht fertiggestellt werden"
@@ -1530,7 +1548,7 @@ msgstr ""
"Konnte nicht an Port %s auf %s starten. Eine andere Software nutzt diesen "
"Port oder SABnzbd läuft bereits."
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Schwerwiegender Fehler"
@@ -1557,6 +1575,14 @@ msgstr ""
"Download-Ordner %s für abgeschlossene Downloads auf FAT Dateisystem, ist "
"auf maximale Dateigröße von 4GB begrenzt."
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
"Modul subprocessww fehlt. Fehler mit Unikodierter Datei und Verzeichnisnamen "
"in den Downloads sind zu erwarten."
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr ""
@@ -1586,10 +1612,6 @@ msgstr "Fehler beim Umbenennen von \"%s\" nach \"%s\""
msgid "Failed to move files"
msgstr "Dateien verschieben fehlgeschlagen"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Ausführen des Skripts"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Ausführen des Benutzer-Skripts %s"
@@ -1610,7 +1632,7 @@ msgstr "Mehr"
msgid "Post Processing Failed for %s (%s)"
msgstr "Nachbearbeitung von %s fehlgeschlagen (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "Beachten Sie die Protokolldatei"
@@ -1924,6 +1946,14 @@ msgstr "Quoten-Management einschalten"
msgid "Disable quota management"
msgstr "Quoten-Management ausschalten"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr "Aufträge mit Kategorie pausieren"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr "Aufträge mit Kategorie fortsetzen"
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Nein"
@@ -2772,6 +2802,14 @@ msgstr "SABnzbd-Passwort"
msgid "Optional authentication password."
msgstr "Optionale Anmeldung mit Passwort"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
"Wenn der SABnzbd Host oder Port im Netz freigegeben ist, lassen die "
"gegenwärtigen Einstellung vollen zugriff auf die SABnzbd Oberfläche zu."
#: sabnzbd/skintext.py
msgid "Security"
msgstr "Sicherheit"
@@ -2900,11 +2938,11 @@ msgstr "Alle Aufträge behalten"
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr ""
msgstr "Behalte maximale Anzahl an abgeschlossenen Aufträgen"
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr ""
msgstr "Behalte abgeschlossene Aufträge maximal X Tage"
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
@@ -3258,6 +3296,18 @@ msgstr ""
"Identische Episoden in den Serien entdeckt (basierend auf "
"\"name/season/episode\") der Einträge in der Historie"
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr "Erlaube \"Proper\" Releases"
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
"Umgehe Serien Duplikat-Erkennung, wenn PROPER, REAL oder REPACK im Download-"
"Namen erkannt wird"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Verwerfen"
@@ -3268,7 +3318,7 @@ msgstr "Aufgabe abgebrochen (verschoben in die Historie)"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr ""
msgstr "Markiere Auftrag"
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
@@ -3325,13 +3375,15 @@ msgstr ""
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr ""
msgstr "Übernehme Markierungen vom Indexer"
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
"Beim Sortieren, verwende Tags aus Indexer für Titel, Saison, Episode, usw. "
"Andernfalls wird alle Namensgebung aus dem NZB-Namen abgeleitet."
#: sabnzbd/skintext.py
msgid "Enable folder rename"
@@ -3548,7 +3600,7 @@ msgstr ""
"Die Performanz verbessern, indem eine schwächere SSL-Verschlüsselung "
"erzwungen wird."
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Maximale Wiederholungen"
@@ -3577,6 +3629,9 @@ msgid ""
"Indexers can supply rating information when a job is added and SABnzbd can "
"report to the indexer if a job couldn't be completed."
msgstr ""
"Indexer können Rating Informationen liefern, wenn ein Job hinzugefügt wird "
"und SABnzbd kann dem Indexer melden, wenn ein Job nicht abgeschlossen werden "
"konnte."
#: sabnzbd/skintext.py
msgid "Enable Filtering"
@@ -3826,11 +3881,11 @@ msgstr "Höchstens"
#: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"]
msgid "From SxxEyy"
msgstr "Von SxxExx"
msgstr "Von SxxEyy"
#: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"]
msgid "From Show SxxEyy"
msgstr ""
msgstr "Von Show SxxEyy"
#: sabnzbd/skintext.py [Config->RSS section header]
msgid "Matched"
@@ -4030,6 +4085,22 @@ msgstr "Gerät(e)"
msgid "Device(s) to which message should be sent"
msgstr "Geräte, welche die Nachrichten empfangen sollen"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr "Wie oft die selbe benachrichtigung (in Sekunden) geschickt wird."
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4082,6 +4153,12 @@ msgid ""
"separate terms. Wildcards in the terms are supported. <br>More information "
"can be found on the Wiki."
msgstr ""
"Indexer können eine Kategorie innerhalb des NZB liefern, welche SABnzbd "
"versuchen wird, mit den unten definierten Kategorien entsprechen. Darüber "
"hinaus kannst du Begriffe zu \"Indexer Kategorien / Gruppen\" hinzufügen, um "
"mehreren Kategorien zu entsprechen. Verwende Kommas, um Begriffe zu trennen. "
"Wildcards in den Begriffen werden unterstützt. <br> Weitere Informationen "
"können im Wiki gefunden werden."
#: sabnzbd/skintext.py
msgid ""
@@ -4177,6 +4254,10 @@ msgstr "1x05 Episoden-Ordner"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episoden-Ordner"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4246,8 +4327,8 @@ msgid "Original Filename"
msgstr "Ursprünglicher Dateiname"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Ursprünglicher Ordnername"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4265,10 +4346,6 @@ msgstr "text"
msgid "file"
msgstr "Datei"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "Ordner"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sortieranweisung"
@@ -4442,6 +4519,14 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"Wenn SABnzbd neustartet, wird diese Anzeige automatisch verschwinden!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "WARNUNG:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Abrufen"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Aktualisierungsrate"
@@ -4606,6 +4691,16 @@ msgstr "Sorry, damit konnten wir nichts anfangen. Versuchs nochmal."
msgid "Pause for..."
msgstr "Anhalten für …"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Neu laden"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Sortieren nach Alter <small>Älteste&rarr;Neuste</small>"
@@ -4662,10 +4757,6 @@ msgstr "Verlauf wirklich leeren?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Sie müssen JavaScript aktivieren, damit Plush funktioniert!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Neu laden"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Optionen"
@@ -4758,10 +4849,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr "Aktualisierung durch Mauszeiger verhindern"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Abrufen"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Hochladen"
@@ -4972,16 +5059,29 @@ msgstr ""
"Sie steht unter der GNU GENERAL PUBLIC LICENSE Version 2 oder (nach Ihrer "
"Option) jeder späteren Version.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"Um aus dem Usenet herunterladen zu können, benötigen Sie Zugriff auf einen "
"Usenet-Provider. Ihr ISP bieten dies möglicherweise an, jedoch werden "
"kostenpflichtige Provider empfohlen."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Wenn Sie noch keinen Usenet-Provider haben, empfehlen wir Ihnen %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Fehler beim Abrufen der TV-Informationen: %s"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Umbenennen von %s nach %s fehlgeschlagen."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Umbenennen der gleichen Datei von %s nach %s fehlgeschlagen."
@@ -5019,6 +5119,12 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "Ordner \"%s\" existiert nicht"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "SQL-Commit fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll."
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "CRC-Fehler in %s (%s -> %s)"
#~ msgid "Error: No secondary interface defined."
#~ msgstr "Fehler: Keine sekundäre Oberfläche angegeben."
@@ -5081,9 +5187,6 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
#~ msgstr ""
#~ "Fehler beim Importieren des OpenSSL-Moduls. Stelle Verbindung ohne SSL her."
#~ msgid "Error while adding %s, removing"
#~ msgstr "Fehler beim Hinzufügen von %s. Entferne."
#~ msgid "Failed to remove nzo from postproc queue (id)"
#~ msgstr ""
#~ "Fehler beim Entfernen der NZB-Datei von der Nachbearbeitungs-Warteschlange "
@@ -5379,17 +5482,6 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
#~ "Launch my internet browser with the SABnzbd page when the program starts."
#~ msgstr "SABnzbd in meinem Webbrowser öffnen, wenn es gestartet wird."
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "Um aus dem Usenet herunterladen zu können, benötigen Sie Zugriff auf einen "
#~ "Usenet-Provider. Ihr ISP bieten dies möglicherweise an, jedoch werden "
#~ "kostenpflichtige Provider empfohlen."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "Wenn Sie noch keinen Usenet-Provider haben, empfehlen wir Ihnen %s."
#~ msgid "This field is required."
#~ msgstr "Dieses Feld wird benötigt."
@@ -5473,6 +5565,12 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
#~ msgid "Show times in AM/PM notation (does not affect scheduler)."
#~ msgstr "Zeiten in der AM/PM-Notation anzeigen (betrifft die Regeln nicht)."
#~ msgid "folder"
#~ msgstr "Ordner"
#~ msgid "Original Foldername"
#~ msgstr "Ursprünglicher Ordnername"
#~ msgid "Groups / Indexer tags"
#~ msgstr "Gruppen/Indexer-Tags"
@@ -5511,6 +5609,9 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
#~ msgid "E.g. 119 or 563 for SSL"
#~ msgstr "Z.B. 119 oder 563 für SSL"
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Ungültige PAR2-Dateien. Überprüfung oder Reparatur nicht möglich."
#~ msgid "Filters"
#~ msgstr "Filter"
@@ -5555,6 +5656,9 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
#~ "Benachrichtigung für Nachrichtengruppen aktivieren (keine, eine oder "
#~ "mehrere)"
#~ msgid "Main packet not found..."
#~ msgstr "Hauptpaket nicht gefunden …"
#~ msgid "Initiating restart...<br />"
#~ msgstr "Neustart wird durchgeführt …<br />"

View File

@@ -69,9 +69,6 @@ msgstr "Replace spaces in folder name"
msgid "Replace dots in Foldername"
msgstr "Replace dots in folder name"
msgid "Original Foldername"
msgstr "Original folder name"
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "How long or until when do you want to pause? (in English!)"
@@ -105,11 +102,21 @@ msgstr "Posts will be paused until they are at least this age. Setting job prior
msgid "Support the project, Donate!"
msgstr "Support the project, donate!"
msgid "%d files with duplicate filenames were discared for "%s". Enable "allow_duplicate_files" to allow duplicate filenames."
msgstr "%d files with duplicate filenames were discarded for "%s". Enable "allow_duplicate_files" to allow duplicate filenames."
msgid "User script can flag job as failed"
msgstr "Post-processing script can flag job as failed"
msgid "When the user script returns a non-zero exit code, the job will be flagged as failed."
msgstr "When the post-processing script returns a non-zero exit code, the job will be flagged as failed."
msgid "unrar binary... NOT found"
msgstr "unrar binary... NOT found!"
msgid "Downloads will not unpacked."
msgstr "Downloads will not be unpacked."
msgid "Seperate multiple URLs by a comma"
msgstr "Separate multiple URLs with a comma"
msgid "Advanced"
msgstr "Advanced Settings"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -45,11 +45,23 @@ msgstr "módulo _yenc... NO encontrado!"
msgid "par2 binary... NOT found!"
msgstr "par2 binario... NO encontrado!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
"Su versión UnRAR es %s, recomendamos la versión %s o superior. <br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "unrar binario... NO encontrado"
@@ -192,10 +204,6 @@ msgstr "No se puede crear el archivo temporal para %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Intentando cambiar el estado de servidor inexistente %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Muy poco espacio en disco forzando PAUSA"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Fallo en tempfile.mkstemp"
@@ -218,15 +226,6 @@ msgstr "Notificación de prueba"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Resolviendo sitio"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERROR:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ninguno"
@@ -243,6 +242,10 @@ msgstr "desconocido"
msgid "Failed to compile regex for search term: %s"
msgstr "Compilación de regex para término fallo: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Muy poco espacio en disco forzando PAUSA"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Disco lleno! Pausando la cola"
@@ -396,10 +399,6 @@ msgstr ""
msgid "SQL Command Failed, see log"
msgstr "Comando SQL ha fallado, vea el registro"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "Compromiso SQL ha fallado, vea el registro"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "No se pudo cerrar el base de datos, vea el registro"
@@ -416,10 +415,6 @@ msgstr "Descodificación %s fallo"
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "Error CRC en %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Articulo yEnc corrupto en %s"
@@ -460,14 +455,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "No se puede leer %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Error al añadir %s, eliminando"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Error al quitar %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "No se puede leer %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Directorio Watched %s no se puede leer"
@@ -566,6 +566,12 @@ msgstr "No se pudo cerrar la conexión de correo"
msgid "Email succeeded"
msgstr "Email exitoso"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "No se ha podido enviar, faltan datos"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "No se pudo encontrar plantillas de email en %s"
@@ -658,7 +664,7 @@ msgstr ""
"Faltaron datos de cuenta, favor ingresar usuario/contraseña desde Config-"
">General en tu aplicacion externa:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -729,14 +735,23 @@ msgstr "desactivado"
msgid "Undefined server!"
msgstr "¡Servidor no definido!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Parámetro incorrecto"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Atrás"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERROR:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -757,7 +772,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "No se pudo crear el directorio %s"
@@ -777,10 +792,20 @@ msgstr "Error al mover %s a %s"
msgid "Error creating SSL key and certificate"
msgstr "Error al crear la llave SSL y el certificado"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "No se puede cambiar los permisos de %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Ejecutando script"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -960,6 +985,7 @@ msgstr ""
"La verificación PAR ha fallado en %s, ¡aunque el QuickCheck ha sido "
"satisfactorio!"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -989,19 +1015,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verificado en %s, se necesita reparar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Paquete principal no encontrado..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Ficheros par2 inválidos, no se puede verificar o reparar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
"Ha fallado la reparación, no existen bloques de reparación suficientes (%s "
"short)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1011,6 +1027,12 @@ msgstr "Recuperando %s bloques..."
msgid "Fetching"
msgstr "Recuperando"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr ""
"Ha fallado la reparación, no existen bloques de reparación suficientes (%s "
"short)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1036,6 +1058,10 @@ msgstr "Disco lleno"
msgid "Verifying"
msgstr "Verificando"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1099,11 +1125,6 @@ msgstr "Otros mensajes"
msgid "Not available"
msgstr "No disponible"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "No se ha podido enviar, faltan datos"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "No se pudo enviar el mensaje de Prowl"
@@ -1112,7 +1133,7 @@ msgstr "No se pudo enviar el mensaje de Prowl"
msgid "Bad response from Pushover (%s): %s"
msgstr "Mala respuesta de Pushover (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "No se pudo enviar el mensaje de Pushover"
@@ -1203,12 +1224,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Pausando NZB duplicados \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Abortado, No puede ser completado"
@@ -1497,7 +1512,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Error grave"
@@ -1520,6 +1535,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr "La descarga fallo, solo %s de los %s requeridos estan disponibles"
@@ -1548,10 +1569,6 @@ msgstr "Error al renombrar \"%s\" a \"%s\""
msgid "Failed to move files"
msgstr "Error al mover ficheros"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Ejecutando script"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Ejecutando script de usuario %s"
@@ -1572,7 +1589,7 @@ msgstr "Más"
msgid "Post Processing Failed for %s (%s)"
msgstr "Error al post-procesar %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "ver fichero de log"
@@ -1888,6 +1905,14 @@ msgstr "Habilitar la administración de cuota"
msgid "Disable quota management"
msgstr "Gestión de cuotas Desactivar"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Apagado"
@@ -2728,6 +2753,12 @@ msgstr "Contraseña de SABnzbd"
msgid "Optional authentication password."
msgstr "Contraseña opcional"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -3198,6 +3229,16 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Descartar"
@@ -3480,7 +3521,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Reintentos máximos"
@@ -3962,6 +4003,22 @@ msgstr "Dispositivo(s)"
msgid "Device(s) to which message should be sent"
msgstr "Dispositivo(s) a los que enviar el mensaje"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4109,6 +4166,10 @@ msgstr "1x05 Episodio Directorio"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodio Directorio"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Título"
@@ -4178,8 +4239,8 @@ msgid "Original Filename"
msgstr "Nombre fichero original"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Nombre directorio original"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4197,10 +4258,6 @@ msgstr "texto"
msgid "file"
msgstr "archivo"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "carpeta"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Ordenar cadena"
@@ -4374,6 +4431,14 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"Esta ventana desaparecerá automáticamente una vez SABnzbd se haya reiniciado."
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Obtener"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Frecuencia de actualización"
@@ -4539,6 +4604,16 @@ msgstr ""
msgid "Pause for..."
msgstr "Pausar durante..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Actualizar"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Ordenar por Fecha <small>Más viejo&rarr;Más nuevo</small>"
@@ -4595,10 +4670,6 @@ msgstr "¿Vaciar el historial?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Debes activar JavaScript para que pueda funcionar Plush!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Actualizar"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Opciones"
@@ -4691,10 +4762,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr "Bloquear actualizaciones al pasar por encima"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Obtener"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Subir"
@@ -4903,16 +4970,29 @@ msgstr ""
"Está licenciado bajo la versión 2 ó posterior de GNU GENERAL PUBLIC "
"LICENSE.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"Para poder descargar de Usenet, necesitas acceso con un proveedor. Tu "
"proveedor de acceso a internet te lo puede dar, aunque recomendamos "
"proveedores premium."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "¿No tienes proveedor de Usenet? Nosotros recomendamos probar %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Error al recuperar info de la serie (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Error al renombrar: %s a %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Error al renombrar ficheros similares: %s a %s"
@@ -4960,9 +5040,15 @@ msgstr "Error al recuperar la URL; %s"
#~ msgid "Try again"
#~ msgstr "Inténtelo de nuevo"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "Compromiso SQL ha fallado, vea el registro"
#~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file"
#~ msgstr "NOTICIA: Transferencia \"%s\" pausado por archivo cifrado"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "Error CRC en %s (%s -> %s)"
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
#~ msgstr ""
#~ "Programa Unrar no encontrado, descomprimir de archivos RAR no posible<br />"
@@ -5009,12 +5095,15 @@ msgstr "Error al recuperar la URL; %s"
#~ msgid "Missing expected file: %s => unrar error?"
#~ msgstr "Falta el siguiente archivo: %s => ¿Error al descomprimir?"
#~ msgid "Main packet not found..."
#~ msgstr "Paquete principal no encontrado..."
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Ficheros par2 inválidos, no se puede verificar o reparar"
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
#~ msgstr "Error al importar módulo OpenSSL. Conectando sin SSL"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Error al añadir %s, eliminando"
#~ msgid ""
#~ "\n"
#~ " SABnzbd is not compatible with some software firewalls.<br>\n"
@@ -5202,6 +5291,9 @@ msgstr "Error al recuperar la URL; %s"
#~ msgid "Email Options"
#~ msgstr "Opciones de e-mail"
#~ msgid "folder"
#~ msgstr "carpeta"
#~ msgid "Are you sure you want to delete"
#~ msgstr "¿Está seguro de querer borrar?"
@@ -5377,6 +5469,9 @@ msgstr "Error al recuperar la URL; %s"
#~ msgid "Enable if downloads are not put in their own folders."
#~ msgstr "Habilitar si las descargas no quedan en sus propios directorios."
#~ msgid "Original Foldername"
#~ msgstr "Nombre directorio original"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Habilitar ordenación y renombrado de nombres de ficheros con fechas."
@@ -5427,17 +5522,6 @@ msgstr "Error al recuperar la URL; %s"
#~ "Lanzar mi navegador de interner con la página de SABnzbd al arrancar el "
#~ "programa."
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "Para poder descargar de Usenet, necesitas acceso con un proveedor. Tu "
#~ "proveedor de acceso a internet te lo puede dar, aunque recomendamos "
#~ "proveedores premium."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "¿No tienes proveedor de Usenet? Nosotros recomendamos probar %s."
#~ msgid "Please enter a whole number."
#~ msgstr "Por favor introduzca un número completo."

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Finnish <fi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,12 +43,24 @@ msgstr "_yenc moduulia... EI löydy!"
msgid "par2 binary... NOT found!"
msgstr "par2 ohjelmaa... EI löydy!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
"UNRAR versiosi on %s, suosittelemme käyttämään versiota %s tai uudempaa.<br "
"/>"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "unrar ohjelmaa... EI löydy!"
@@ -195,10 +207,6 @@ msgstr "Väliaikaistiedostoa ei voida luoda kohteelle %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Yritettiin asettaa tila ei olemassa olevalle palvelimelle %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Levytilaa ei ole tarpeeksi, pakotetaan KESKEYTYS"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Virhe tiedostossa tempfile.mkstemp"
@@ -221,15 +229,6 @@ msgstr "Testaa ilmoitusta"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Selvitetään osoitetta"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "VIRHE:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "VAROITUS:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ei mitään"
@@ -246,6 +245,10 @@ msgstr "tuntematon"
msgid "Failed to compile regex for search term: %s"
msgstr "Regex käännös epäonnistui hakutermille: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Levytilaa ei ole tarpeeksi, pakotetaan KESKEYTYS"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Levy täynnä! Pakotetaan keskeytys"
@@ -395,10 +398,6 @@ msgstr ""
msgid "SQL Command Failed, see log"
msgstr "SQL komento epäonnistui, katso loki"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "SQL muutos epäonnistui, katso loki"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Tietokannan sulkeminen epäonnistui, katso loki"
@@ -415,10 +414,6 @@ msgstr "Kohteen %s dekoodaus epäonnistui"
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "CRC virhe tiedostossa %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Huonosti muotoiltu yEnc artikkeli %s"
@@ -459,14 +454,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Ei voida lukea %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Virhe lisättäessä %s, poistetaan"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Virhe poistettaessa %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Ei voida lukea %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Vahdittua kansiota %s ei voida lukea"
@@ -563,6 +563,12 @@ msgstr "Sähköpostiyhteyden sulkeminen epäonnistui"
msgid "Email succeeded"
msgstr "Sähköpostitus onnistui"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Ei voida lähettää, vaaditut tiedot ovat puutteelliset"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Sähköpostipohjia ei löydy hakemistosta %s"
@@ -655,7 +661,7 @@ msgstr ""
"Authentikointi puuttuu, ole hyvä ja syötä käyttäjänimi/salasana Asetukset-"
">Yleiset kolmannen osapuolen ohjelmaasi:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -725,14 +731,23 @@ msgstr "ei käytössä"
msgid "Undefined server!"
msgstr "Määrittämätön palvelin!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Virheellinen parametri"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Takaisin"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "VIRHE:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -753,7 +768,7 @@ msgstr "t"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Ei voi luoda kansiota %s"
@@ -773,10 +788,20 @@ msgstr "Kohteen %s siirtäminen kohteeseen %s epäonnistui"
msgid "Error creating SSL key and certificate"
msgstr "Virhe luotaessa SSL avainta ja sertifikaattia"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Käyttöoikeuksien muuttaminen epäonnistui kohteelle %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Ajetaan skripti"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -953,6 +978,7 @@ msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr ""
"Par varmennus epäonnistui kohteessa %s, mutta Pikatarkistus onnistui!"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -981,17 +1007,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Varmennetiin ajassa %s, vaatii korjauksen"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Pääpakettia ei löydy..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Virheelliset par2 arkistot, varmennus ja korjaus ei mahdollista"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Korjaaminen epäonnistui, ei tarpeeksi korjauslohkoja (%s puuttuu)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1001,6 +1019,10 @@ msgstr "Noudetaan %s lohkoa..."
msgid "Fetching"
msgstr "Noudetaan"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Korjaaminen epäonnistui, ei tarpeeksi korjauslohkoja (%s puuttuu)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1026,6 +1048,10 @@ msgstr "Levy täynnä"
msgid "Verifying"
msgstr "Varmennetaan"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1089,11 +1115,6 @@ msgstr "Muut viestit"
msgid "Not available"
msgstr "Ei saatavilla"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Ei voida lähettää, vaaditut tiedot ovat puutteelliset"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Prowl viestin lähetys epäonnistui"
@@ -1102,7 +1123,7 @@ msgstr "Prowl viestin lähetys epäonnistui"
msgid "Bad response from Pushover (%s): %s"
msgstr "Virheellinen vastaus Pushoverilta (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Pushover viestin lähetys epäonnistui"
@@ -1192,12 +1213,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Keskeytetään kaksoiskappale NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Peruutettu, ei voi valmistua"
@@ -1485,7 +1500,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Vakava virhe"
@@ -1507,6 +1522,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr "Lataaminen saattaa epäonnistua, vain %s osaa %s osasta saatavilla"
@@ -1535,10 +1556,6 @@ msgstr "Virhe uudelleennimettäessä \"%s\" nimelle \"%s\""
msgid "Failed to move files"
msgstr "Tiedostojen siirto epäonnistui"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Ajetaan skripti"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Ajetaan käyttäjän skripti %s"
@@ -1559,7 +1576,7 @@ msgstr "Lisää"
msgid "Post Processing Failed for %s (%s)"
msgstr "Jälkikäsittely epäonnistui kohteelle %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "katso lokitiedosto"
@@ -1871,6 +1888,14 @@ msgstr "Ota latausrajoituksen hallinta käyttöön"
msgid "Disable quota management"
msgstr "Ota latausrajoituksen hallinta pois käytöstä"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Ei käytössä"
@@ -2716,6 +2741,12 @@ msgstr "SABnzbd salasana"
msgid "Optional authentication password."
msgstr "Vaihtoehtoinen salasana todennukseen."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -3191,6 +3222,16 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Hylkää"
@@ -3469,7 +3510,7 @@ msgstr "SSL-salaus"
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr "Lisää suorituskykyä pakottamalla alhaisempi SSL-suojaustaso."
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Enimmäismäärä uudelleenyrityksille"
@@ -3947,6 +3988,22 @@ msgstr "Laitteet"
msgid "Device(s) to which message should be sent"
msgstr "Laitteet joihin viesti lähetetään"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4099,6 +4156,10 @@ msgstr "1x05 Jakso kansio"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Jakso kansio"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Nimi"
@@ -4168,8 +4229,8 @@ msgid "Original Filename"
msgstr "Alkuperäinen tiedostonimi"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Alkuperäinen kansionimi"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4187,10 +4248,6 @@ msgstr "teksti"
msgid "file"
msgstr "tiedosto"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "kansio"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Lajittelumerkkijono"
@@ -4365,6 +4422,14 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"Mikäli SABnzbd käynnistetään uudelleen, tämä ruutu häviää automaattisesti!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "VAROITUS:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Nouda"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Päivitysväli"
@@ -4530,6 +4595,16 @@ msgstr "Valitettavasti emme ymmärtäneet tuota. Yritä uudelleen."
msgid "Pause for..."
msgstr "Keskeytä ajaksi..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Päivitä"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Järjestä iän mukaan <small>Vanhin&rarr;Uusin</small>"
@@ -4586,10 +4661,6 @@ msgstr "Puhdistetaanko historia?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Ota JavaScript käyttöön, jotta Plush toimii oikein!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Päivitä"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Asetukset"
@@ -4681,10 +4752,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr "Estä päivitykset kun hiiri on päällä"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Nouda"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Lähetä"
@@ -4894,16 +4961,28 @@ msgstr ""
"Se on lisensoitu GNU GENERAL PUBLIC LICENSE Versio 2 alaiseksi ja (oman "
"valinnan mukaan) myös myöhempien versioiden.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"Jotta voit ladata usenetistä tarvitset tarjoajan. Palveluntarjoajasi saattaa "
"tarjota sinulle sellaisen, mutta on suositeltavaa hankkia premium-tarjoaja."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Eikö sinulla ole usenet tarjoajaa? Suosittelemme kokeilemaan %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Virhe noudettaessa TV tietoja (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Virhe uudelleennimettäessä: %s %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Samankaltaisen tiedoston uudelleennimeäminen epäonnistui: %s %s"
@@ -4935,6 +5014,9 @@ msgstr "NZB tiedostoa ei voida käyttää"
msgid "URL Fetching failed; %s"
msgstr "Osoitteen nouto epäonnistui; %s"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "CRC virhe tiedostossa %s (%s -> %s)"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "Kansiota \"%s\" ei ole olemassa"
@@ -4992,6 +5074,9 @@ msgstr "Osoitteen nouto epäonnistui; %s"
#~ "Käyttämäsi UNRAR versio ei ole suositeltu, nouda oikea osoitteesta "
#~ "http://www.rarlab.com/rar_add.htm<br />"
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Virheelliset par2 arkistot, varmennus ja korjaus ei mahdollista"
#~ msgid "It is likely that you are using ZoneAlarm on Vista.<br>"
#~ msgstr ""
#~ "On todennäköistä, että käytössäsi on ZoneAlarm ja käyttöjärjestelmäsi on "
@@ -5012,9 +5097,6 @@ msgstr "Osoitteen nouto epäonnistui; %s"
#~ msgid "Queued"
#~ msgstr "Jonossa"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Virhe lisättäessä %s, poistetaan"
#~ msgid "Complete Dir"
#~ msgstr "Valmistuneet-kansio"
@@ -5048,6 +5130,12 @@ msgstr "Osoitteen nouto epäonnistui; %s"
#~ msgid "Remain/Total"
#~ msgstr "Jäljellä/Yhteensä"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "SQL muutos epäonnistui, katso loki"
#~ msgid "Main packet not found..."
#~ msgstr "Pääpakettia ei löydy..."
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
#~ msgstr ""
#~ "UNRAR ohjelmaa ei löydy, RAR-tiedostojen purkaminen ei ole mahdollista<br />"
@@ -5191,9 +5279,6 @@ msgstr "Osoitteen nouto epäonnistui; %s"
#~ msgid "Processing Switches"
#~ msgstr "Käsittelyparametrit"
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "Eikö sinulla ole usenet tarjoajaa? Suosittelemme kokeilemaan %s."
#~ msgid "Password protect access to SABnzbd (recommended)"
#~ msgstr "Suojaa SABnzbd käyttö salasanalla (suositeltavaa)"
@@ -5316,6 +5401,12 @@ msgstr "Osoitteen nouto epäonnistui; %s"
#~ msgstr ""
#~ "Kansio jossa ovat käyttäjän skriptit joita käytetään jälkikäsittelyssä."
#~ msgid "Original Foldername"
#~ msgstr "Alkuperäinen kansionimi"
#~ msgid "folder"
#~ msgstr "kansio"
#~ msgid "Hour:Min"
#~ msgstr "Tunti:Min"
@@ -5358,13 +5449,6 @@ msgstr "Osoitteen nouto epäonnistui; %s"
#~ msgid "Pause Interval"
#~ msgstr "Keskeytysväli"
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "Jotta voit ladata usenetistä tarvitset tarjoajan. Palveluntarjoajasi saattaa "
#~ "tarjota sinulle sellaisen, mutta on suositeltavaa hankkia premium-tarjoaja."
#~ msgid ""
#~ "After SABnzbd has finished restarting you will be able to access it at the "
#~ "following location: %s"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-07 18:53+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-12-06 19:46+0000\n"
"Last-Translator: Fred <88com88@gmail.com>\n"
"Language-Team: French <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-08 05:33+0000\n"
"X-Generator: Launchpad (build 18446)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -38,7 +38,7 @@ msgstr ""
msgid ""
"SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc"
msgstr ""
"Module SABYenc... NON trouvé! v%s attendue - https://sabnzbd.org/sabyenc"
"Module SABYenc... NON trouvé ! v%s attendue - https://sabnzbd.org/sabyenc"
#: SABnzbd.py [Error message]
msgid "_yenc module... NOT found!"
@@ -48,11 +48,23 @@ msgstr "module _yenc... Introuvable!"
msgid "par2 binary... NOT found!"
msgstr "binaire par2... Introuvable!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr "La vérification et la réparation ne seront pas possibles."
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr "Fichier binaire MultiPar... NON trouvé !"
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
"Votre version de UNRAR est %s, nous recommandons la version %s ou plus.<br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr "Les téléchargements ne seront pas décompressés."
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "binaire unrar... Introuvable!"
@@ -204,10 +216,6 @@ msgstr "Impossible de créer le fichier temporaire pour %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Test de l'état du serveur inexistant %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Espace disque faible, PAUSE forcée"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Échec dans tempfile.mkstemp"
@@ -230,15 +238,6 @@ msgstr "Test de Notification"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Résolution de l'adresse"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERREUR:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVERTISSEMENT :"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Aucun"
@@ -255,6 +254,10 @@ msgstr "inconnu"
msgid "Failed to compile regex for search term: %s"
msgstr "Echec de la compilation de regex pour la recherche du terme : %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Espace disque faible, PAUSE forcée"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Disque plein ! Pause forcée"
@@ -416,10 +419,6 @@ msgstr ""
msgid "SQL Command Failed, see log"
msgstr "Echec de la commande SQL, voir le journal"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "Echec du commit SQL, voir le journal"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Impossible de fermer la base de données, voir le journal"
@@ -436,10 +435,6 @@ msgstr "Échec du décodage de %s"
msgid "Decoder failure: Out of memory"
msgstr "Échec du décodeur : mémoire insuffisante"
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "Erreur CRC dans %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Article yEnc mal construit dans %s"
@@ -483,14 +478,19 @@ msgstr ""
"temps de post-traitement. Fonctionne uniquement pour les tâches qui ne "
"nécessitent aucune réparation."
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Impossible de lire %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Erreur lors de l'ajout de %s, suppression"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Erreur lors de la suppression de %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Impossible de lire %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Impossible de lire le dossier surveillé %s"
@@ -590,6 +590,12 @@ msgstr "Échec de la fermeture de la connexion à la messagerie"
msgid "Email succeeded"
msgstr "L'envoi de l'e-mail a réussi"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Impossible d'envoyer, données requises manquantes"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Impossible de trouver les modèles d'email dans %s"
@@ -684,7 +690,7 @@ msgstr ""
"Authentification manquante, entrez vos identifiant/mot de passe de la "
"configuration générale dans votre application tierce :"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -755,14 +761,25 @@ msgstr "non"
msgid "Undefined server!"
msgstr "Serveur non défini !"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Paramètre incorrect"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
"Le dossier de catégorie ne peut pas être un sous-dossier du dossier de "
"téléchargement temporaire."
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Retour"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERREUR:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -783,7 +800,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Impossible de créer le dossier %s"
@@ -803,10 +820,23 @@ msgstr "Échec lors du déplacement de %s vers %s"
msgid "Error creating SSL key and certificate"
msgstr "Erreur lors de la création de la clé et du certificat SSL"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
"Votre fichier de mot de passe contient plus de 30 mots de passe. Tester tous "
"ces mots de passe prend beaucoup de temps. Essayez de n'y lister que les "
"mots de passe utiles."
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Impossible de changer les permissions pour %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Exécution du script"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -989,6 +1019,7 @@ msgstr ""
"Echec de la vérification Par sur %s, mais QuickCheck (vérification rapide) "
"réussi !"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -1019,17 +1050,10 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Vérifié dans %s, réparation nécessaire"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Paquet principal introuvable..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Fichiers par2 non valides, impossible de vérifier ou réparer"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Échec de la réparation, pas assez de blocs de réparation (manque %s)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
"Paramètres ou fichiers PAR2 non valides, impossible de vérifier ou réparer."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1039,6 +1063,10 @@ msgstr "Récupération de %s blocs..."
msgid "Fetching"
msgstr "Récupération en cours"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Échec de la réparation, pas assez de blocs de réparation (manque %s)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1064,6 +1092,10 @@ msgstr "Disque plein"
msgid "Verifying"
msgstr "Vérification en cours"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr "Vérification des fichiers supplémentaires"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1132,11 +1164,6 @@ msgstr "Autres messages"
msgid "Not available"
msgstr "Non disponible"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Impossible d'envoyer, données requises manquantes"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Echec d'envoi du message Prowl"
@@ -1145,7 +1172,7 @@ msgstr "Echec d'envoi du message Prowl"
msgid "Bad response from Pushover (%s): %s"
msgstr "Mauvaise réponse de Pushover (%s) : %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Échec de l'envoi du message Pushover"
@@ -1235,14 +1262,6 @@ msgstr "Dupliquer NZB"
msgid "Pausing duplicate NZB \"%s\""
msgstr "Mise en pause du doublon NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
"%d fichiers avec des noms en double ont été rejetés pour \"%s\". Cochez "
"\"allow_duplicate_files\" pour autoriser les noms de fichiers en double."
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Interrompu, ne peut être achevé"
@@ -1536,7 +1555,7 @@ 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 # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Erreur fatale"
@@ -1561,6 +1580,14 @@ msgstr ""
"Le système de fichiers du dossier de téléchargements terminés %s est au "
"format FAT, limitant la taille maximale d'un fichier à 4 Go"
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
"Le module subprocessww est manquant. Attendez-vous à des problèmes avec les "
"noms de fichiers et de répertoires Unicode dans les téléchargements."
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr ""
@@ -1591,10 +1618,6 @@ msgstr "Erreur lors du renommage de \"%s\" en \"%s\""
msgid "Failed to move files"
msgstr "Impossible de déplacer les fichiers"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Exécution du script"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Exécution du script utilisateur %s"
@@ -1615,7 +1638,7 @@ msgstr "Plus"
msgid "Post Processing Failed for %s (%s)"
msgstr "Échec du post-traitement pour %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "voir le journal"
@@ -1931,6 +1954,14 @@ msgstr "Activer la gestion de quota"
msgid "Disable quota management"
msgstr "Désactiver la gestion de quota"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr "Mettre en pause les tâches ayant une catégorie"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr "Reprendre les tâches ayant une catégorie"
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Désactivé"
@@ -2781,6 +2812,14 @@ msgstr "Mot de passe SABnzbd"
msgid "Optional authentication password."
msgstr "Mot de passe pour l'authentification (facultatif)."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
"Vos paramètres actuels permettent un accès externe complet à l'interface "
"SABnzbd si l'hôte ou le port SABnzbd est ouvert vers l'internet."
#: sabnzbd/skintext.py
msgid "Security"
msgstr "Sécurité"
@@ -3268,6 +3307,18 @@ msgstr ""
"Détecter les épisodes de série identiques (en fonction du modèle "
"\"nom/saison/épisode\" des éléments de votre historique)"
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr "Autoriser les versions corrigées (proper)"
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
"Contourner la détection des doublons si PROPER, REAL ou REPACK est détecté "
"dans l'intitulé du téléchargement"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Rejeter"
@@ -3558,7 +3609,7 @@ msgstr "Chiffrements SSL"
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr "Augmenter les performances en forçant un cryptage SSL plus faible."
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Nombre de tentatives maximum"
@@ -4047,6 +4098,23 @@ msgstr "Appareil(s)"
msgid "Device(s) to which message should be sent"
msgstr "Appareil(s) auxquels doivent être envoyés les messages"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr "Nouvelle tentative d'urgence"
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr "À quelle fréquence la même notification sera envoyée (en secondes)"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr "Expiration d'urgence"
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
"Tenter à nouveau votre notification pendant combien de temps (en secondes)"
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4202,6 +4270,10 @@ msgstr "1x05 Dossier Épisode"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Dossier Épisode"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Nom de la tâche en tant que nom de fichier"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titre"
@@ -4271,8 +4343,8 @@ msgid "Original Filename"
msgstr "Nom de fichier originel"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Nom du dossier originel"
msgid "Original Job Name"
msgstr "Nom d'origine de la tâche"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4290,10 +4362,6 @@ msgstr "texte"
msgid "file"
msgstr "fichier"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "dossier"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Chaîne de caractères de tri"
@@ -4467,6 +4535,14 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"En cas de redémarrage de SABnzbd cet écran disparaîtra automatiquement!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVERTISSEMENT :"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Charger"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Taux de rafraîchissement"
@@ -4633,6 +4709,18 @@ msgstr "Désolé, nous n'avons pas pu interpréter ça. Essayez encore."
msgid "Pause for..."
msgstr "Mettre en pause pour…"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Rafraîchir"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
"Tous les noms d'utilisateur, mots de passe et clés API sont automatiquement "
"supprimés du journal et de la copie de vos réglages."
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Trier par Age <small>Moins récent&rarr;Plus récent</small>"
@@ -4689,10 +4777,6 @@ msgstr "Vider l'historique ?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Vous devez activer JavaScript pour que Plush puisse fonctionner !"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Rafraîchir"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Options"
@@ -4785,10 +4869,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr "Bloquer rafraîchissements au survol"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Charger"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Envoyer"
@@ -4999,16 +5079,30 @@ msgstr ""
"Il est distribué sous licence GNU GENERAL PUBLIC LICENSE Version 2 ou toute "
"autre version ultérieure.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"Pour pouvoir télécharger sur les newsgroups, il est nécessaire d'avoir un "
"fournisseur usenet. Votre FAI peut vous fournir un accès, cependant un "
"fournisseur usenet premium est recommandé."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr ""
"Vous n'avez pas de fournisseur usenet? Nous vous recommendons d'essayer %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Erreur lors de l'obtention des information TV (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Échec du renommage : %s en %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Impossible de renommer le fichier similaire : %s en %s"
@@ -5040,6 +5134,9 @@ msgstr "Fichier NZB inutilisable"
msgid "URL Fetching failed; %s"
msgstr "Échec de récupération de l'URL ; %s"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "Erreur CRC dans %s (%s -> %s)"
#~ msgid "Error: No secondary interface defined."
#~ msgstr "Erreur : Pas d'interface secondaire définie."
@@ -5340,6 +5437,9 @@ msgstr "Échec de récupération de l'URL ; %s"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Active le tri et le renommage des fichiers par date."
#~ msgid "folder"
#~ msgstr "dossier"
#~ msgid "Set Pause Interval"
#~ msgstr "Intervalle de pause"
@@ -5357,18 +5457,6 @@ msgstr "Échec de récupération de l'URL ; %s"
#~ "<strong>Forcer téléchargements</strong> pour télécharger de suite tous les "
#~ "NZB correspondants."
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "Pour pouvoir télécharger sur les newsgroups, il est nécessaire d'avoir un "
#~ "fournisseur usenet. Votre FAI peut vous fournir un accès, cependant un "
#~ "fournisseur usenet premium est recommandé."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr ""
#~ "Vous n'avez pas de fournisseur usenet? Nous vous recommendons d'essayer %s."
#~ msgid "Enable HTTPS access to SABnzbd."
#~ msgstr "Activer l'accès à SABnzbd via HTTPS."
@@ -5410,12 +5498,18 @@ msgstr "Échec de récupération de l'URL ; %s"
#~ msgid "Show files"
#~ msgstr "Afficher les fichiers"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "Echec du commit SQL, voir le journal"
#~ msgid "Downloaded so far"
#~ msgstr "Téléchargé jusqu'à présent"
#~ msgid "Try again"
#~ msgstr "Réessayer"
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Fichiers par2 non valides, impossible de vérifier ou réparer"
#~ msgid "KB/s"
#~ msgstr "kbit/s"
@@ -5522,8 +5616,8 @@ msgstr "Échec de récupération de l'URL ; %s"
#~ msgid "pyopenssl module missing, please install for https access"
#~ msgstr "module pyopenssl manquant, veuillez l'installer pour l'accès HTTPS"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Erreur lors de l'ajout de %s, suppression"
#~ msgid "Main packet not found..."
#~ msgstr "Paquet principal introuvable..."
#~ msgid ""
#~ "\n"
@@ -5611,6 +5705,9 @@ msgstr "Échec de récupération de l'URL ; %s"
#~ msgid "Groups / Indexer tags"
#~ msgstr "balises Groupes / Indexeur"
#~ msgid "Original Foldername"
#~ msgstr "Nom du dossier originel"
#~ msgid ""
#~ "After SABnzbd has finished restarting you will be able to access it at the "
#~ "following location: %s"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-06 21:05+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-12-06 19:50+0000\n"
"Last-Translator: ION IL <Unknown>\n"
"Language-Team: Hebrew <he@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -41,23 +41,35 @@ msgstr "!לא נמצא ..._yenc פירקן"
#: SABnzbd.py [Error message]
msgid "par2 binary... NOT found!"
msgstr "!לא נמצא ...par2 בינארי"
msgstr "!בינארי... לא נמצא par2"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ".וידוא ותיקון לא יהיו אפשריים"
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr "!בינארי... לא נמצא MultiPar"
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ".שלך היא %s אנו ממליצים על גרסה %s או גבוהה יותר UNRAR גרסת<br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ".הורדות לא ייפרקו"
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "לא נמצא ...unrar בינארי"
msgstr "בינארי... לא נמצא unrar"
#: SABnzbd.py
msgid "unzip binary... NOT found!"
msgstr "!לא נמצא ...unzip בינארי"
msgstr "!בינארי... לא נמצא unzip"
#: SABnzbd.py
msgid "7za binary... NOT found!"
msgstr "!לא נמצא ...za7 בינארי"
msgstr "!בינארי... לא נמצא za7"
#: SABnzbd.py [Warning message]
msgid ""
@@ -188,10 +200,6 @@ msgstr "%s לא ניתן ליצור קובץ זמני עבור"
msgid "Trying to set status of non-existing server %s"
msgstr "%s מנסה לקבוע מצב של שרת בלתי-קיים"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "שטח דיסק קטן מדי, מאלץ השהיה"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "tempfile.mkstemp-כישלון ב"
@@ -214,15 +222,6 @@ msgstr "בחן התראה"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;פותר כתובת"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "שגיאה:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "אזהרה:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "ללא"
@@ -239,6 +238,10 @@ msgstr "בלתי ידוע"
msgid "Failed to compile regex for search term: %s"
msgstr "%s :עבור מונח חיפוש regex נכשל בליקוט"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "שטח דיסק קטן מדי, מאלץ השהיה"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "דיסק מלא! מאלץ השהיה"
@@ -389,10 +392,6 @@ msgstr "מסד-נתונים היסטוריה פגום, נוצר תחליף רי
msgid "SQL Command Failed, see log"
msgstr "נכשלה, ראה יומן SQL פקודת"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "נכשל, ראה יומן SQL חיוב"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "נכשל בסגירת מסד-נתונים, ראה יומן"
@@ -409,10 +408,6 @@ msgstr "נכשל %s פענוח"
msgid "Decoder failure: Out of memory"
msgstr "כישלון מפענח: אין זיכרון"
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "%s (%s -> %s)-ב CRC שגיאת"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "%s-נוצר באופן גרוע ב yEnc מאמר"
@@ -441,7 +436,7 @@ msgstr "הושלם"
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
msgid "Unpacked %s files/folders in %s"
msgstr "%s-פורקו %s קבצים/תיקיות ב"
msgstr "פורקו %s קבצים/תיקיות תוך %s"
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
@@ -452,17 +447,22 @@ msgid ""
"Jobs will start unpacking during the downloading to reduce post-processing "
"time. Only works for jobs that do not need repair."
msgstr ""
".עבודות יתחילו להיפרק במהלך ההורדה כדי להפחית זמן לאחר-עיבוד. עובד רק עבור "
".עבודות יתחילו להיפרק במהלך ההורדה כדי להפחית זמן בתר-עיבוד. עובד רק עבור "
"עבודות שאינן צריכות תיקון"
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "לא יכול לקרוא את %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "מסיר ,%s שגיאה בזמן הוספת"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "%s שגיאה בהסרת"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "לא יכול לקרוא את %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "%s לא ניתן לקרוא את התיקייה המושגחת"
@@ -558,6 +558,12 @@ msgstr "נכשל בסגירת חיבור דוא\"ל"
msgid "Email succeeded"
msgstr "דוא\"ל הצליח"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "לא ניתן לשלוח, נתונים דרושים חסרים"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "%s-לא ניתן למצוא תבניות דוא\"ל"
@@ -648,7 +654,7 @@ msgstr ""
":אימות חסר, אנא הכנס שם משתמש/סיסמה מתוך תצורה->כללי לתוך תכנית הצד השלישי "
"שלך"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -717,14 +723,23 @@ msgstr "כבוי"
msgid "Undefined server!"
msgstr "!שרת בלתי מוגדר"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "משתנה לא נכון"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ".תיקיית מדור אינה יכולה להיות תת-תיקייה של תיקיית ההורדות הזמניות"
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "הקודם"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "שגיאה:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -745,7 +760,7 @@ msgstr "ש"
msgid "m"
msgstr "ד"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "%s לא יכול ליצור את הספרייה"
@@ -765,15 +780,27 @@ msgstr "%s אל %s נכשל בהעברת"
msgid "Error creating SSL key and certificate"
msgstr "SSL נכשל ביצירה של מפתח ואישור של"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
".קובץ הסיסמאות שלך מכיל יותר מ-30 סיסמאות, בחינת כל הסיסמאות האלו תיקח זמן "
"רב. נסה לכתוב ברשימה רק סיסמאות שימושיות"
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "%s לא יכול לשנות הרשאות של"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "מריץ תסריט"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
msgid "PostProcessing was aborted (%s)"
msgstr "(%s) לאחר-עיבוד בוטל"
msgstr "(%s) בתר-עיבוד בוטל"
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py
#: sabnzbd/skintext.py [Notification Script settings]
@@ -944,6 +971,7 @@ msgstr "מתחיל תיקון"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr "!בעוד שבדיקה זריזה הצליחה ,%s-נכשל ב Par וידוא"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -971,17 +999,10 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "תיקון דרוש ,%s-[%s] וודאו ב"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "...חפיסה ראשית לא נמצאה"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "בלתי תקפים, לא יכול לוודא או לתקן par2 קבצי"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "(קצר %s) תיקון נכשל, אין מספיק גושי תיקון"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
"בלתי תקפים, לא יכול לוודא או לתקן PAR2 בלתי תקפים או פרמטרי par2 קבצי"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -991,6 +1012,10 @@ msgstr "...מושך %s גושים"
msgid "Fetching"
msgstr "מושך"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "(קצר %s) תיקון נכשל, אין מספיק גושי תיקון"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1016,6 +1041,10 @@ msgstr "דיסק מלא"
msgid "Verifying"
msgstr "מוודא"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr "בודק קבצי תוספת"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1059,7 +1088,7 @@ msgstr "התווסף NZB"
#: sabnzbd/notifier.py
msgid "Post-processing started"
msgstr "לאחר-עיבוד התחיל"
msgstr "בתר-עיבוד התחיל"
#: sabnzbd/notifier.py [Notification]
msgid "Job finished"
@@ -1081,11 +1110,6 @@ msgstr "הודעות אחרות"
msgid "Not available"
msgstr "לא זמין"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "לא ניתן לשלוח, נתונים דרושים חסרים"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Prowl נכשל בשליחת הודעת"
@@ -1094,7 +1118,7 @@ msgstr "Prowl נכשל בשליחת הודעת"
msgid "Bad response from Pushover (%s): %s"
msgstr "Pushover (%s): %s-תגובה רעה מ"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "pushover נכשל בשליחת הודעת"
@@ -1182,14 +1206,6 @@ msgstr "NZB שכפל"
msgid "Pausing duplicate NZB \"%s\""
msgstr "\"%s\" NZB משהה שכפול"
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
".כדי להתיר שמות כפולים של קבצים \"allow_duplicate_files\" אפשר את .\"%s\" "
"הושלכו %d קבצים עם שמות כפולים עבור"
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "בוטל, לא יכול להיות שלם"
@@ -1474,7 +1490,7 @@ msgstr ""
".כבר רץ SABnzbd איזשהי תוכנה אחרת משתמשת בפתחה או %s לא היה ניתן לקשר את "
"פתחה %s על"
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "שגיאה חמורה"
@@ -1498,6 +1514,13 @@ msgstr ""
"המגבילה גודל מרבי של קובץ אל 4 ג\"ב ,FAT היא במערכת קבצים %s תיקיית ההורדות "
"השלמות"
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
".של קבצים וספריות בהורדות Unicode חסר. צפה לבעיות עם שמות subprocessww פירקן"
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr "הורדה עשויה להיכשל, רק %s מתוך %s דרושים זמינים"
@@ -1508,7 +1531,7 @@ msgstr "הורדה נכשלה - לא בשרת(ים) שלך"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "אין לאחר-עיבוד בגלל וידוא כושל"
msgstr "אין בתר-עיבוד בגלל וידוא כושל"
#: sabnzbd/postproc.py
msgid "Moving"
@@ -1526,10 +1549,6 @@ msgstr "\"%s\" אל \"%s\" שגיאה בשינוי שם"
msgid "Failed to move files"
msgstr "נכשל בהעברת קבצים"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "מריץ תסריט"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "%s מריץ תסריט משתמש"
@@ -1548,9 +1567,9 @@ msgstr "עוד"
#: sabnzbd/postproc.py [Error message]
msgid "Post Processing Failed for %s (%s)"
msgstr "%s (%s) לאחר-עיבוד נכשל עבור"
msgstr "%s (%s) בתר-עיבוד נכשל עבור"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "ראה קובץ יומן"
@@ -1576,7 +1595,7 @@ msgstr "%s לא יכול ליצור תיקייה סופית"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "לאחר-עיבוד"
msgstr "בתר-עיבוד"
#: sabnzbd/postproc.py
msgid "[%s] No par2 sets"
@@ -1812,11 +1831,11 @@ msgstr "השהה הכל"
#: sabnzbd/skintext.py [#: Config->Scheduler]
msgid "Pause post-processing"
msgstr "השהה לאחר-עיבוד"
msgstr "השהה בתר-עיבוד"
#: sabnzbd/skintext.py [#: Config->Scheduler]
msgid "Resume post-processing"
msgstr "המשך לאחר-עיבוד"
msgstr "המשך בתר-עיבוד"
#: sabnzbd/skintext.py [#: Config->Scheduler]
msgid "Read RSS feeds"
@@ -1862,6 +1881,14 @@ msgstr "אפשר ניהול מיכסה"
msgid "Disable quota management"
msgstr "השבת ניהול מיכסה"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr "השהה עבודות עם מדור"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr "המשך עבודות עם מדור"
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "כבוי"
@@ -2129,7 +2156,7 @@ msgstr "סוגיות"
#: sabnzbd/skintext.py [Main menu item]
msgid "Support the project, Donate!"
msgstr "תמוך במיזם, תרום!"
msgstr "!תמוך במיזם, תרום"
#: sabnzbd/skintext.py [Main menu item]
msgid "General"
@@ -2565,12 +2592,12 @@ msgid ""
"stability problem.<br />Downloading will be paused before the restart and "
"resume afterwards."
msgstr ""
"SABnzbd זה יפעיל מחדש את.<br />השתמש בזה כשאתה חושב שלתכנית יש בעית "
".SABnzbd זה יפעיל מחדש את<br />השתמש בזה כשאתה חושב שלתכנית יש בעית "
"יציבות.<br />הורדה תושהה לפני ההפעלה מחדש ותומשך לאחר מכן."
#: sabnzbd/skintext.py
msgid "<br />If authentication is enabled, you will need to login again."
msgstr "<br />.אם אימות מאופשר, תצטרך להיכנס שוב"
msgstr "<br />אם אימות מאופשר, תצטרך להיכנס שוב."
#: sabnzbd/skintext.py
msgid "Advanced"
@@ -2701,6 +2728,14 @@ msgstr "SABnzbd סיסמת"
msgid "Optional authentication password."
msgstr "סיסמת אימות רשותית"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
".SABnzbd חשופים לאינטרנט, ההגדרות הנוכחיות שלך מאפשרות גישה חיצונית מלאה אל "
"ממשק SABnzbd אם המארח או הפתחה של"
#: sabnzbd/skintext.py
msgid "Security"
msgstr "אבטחה"
@@ -2934,7 +2969,7 @@ msgid ""
"<em>NOTE:</em> Folders will be created automatically when Saving. You may "
"use absolute paths to save outside of the default folders."
msgstr ""
"<em>הערה:</em> .תיקיות יווצרו באופן אוטומטי בעת שמירה. אתה יכול להשתמש "
"<em>הערה:</em> תיקיות יווצרו באופן אוטומטי בעת שמירה. אתה יכול להשתמש "
"בנתיבים מוחלטים כדי לשמור מחוץ לתיקיות ברירת המחדל"
#: sabnzbd/skintext.py
@@ -3120,11 +3155,11 @@ msgstr ""
#: sabnzbd/skintext.py
msgid "Post-Process Only Verified Jobs"
msgstr "בצע לאחר-עיבוד רק על עבודות שוודאו"
msgstr "בצע בתר-עיבוד רק על עבודות שוודאו"
#: sabnzbd/skintext.py
msgid "Only perform post-processing on jobs that passed all PAR2 checks."
msgstr ".PAR2-בצע לאחר-עיבוד רק בעבודות שעברו את כל בדיקות ה"
msgstr ".PAR2-בצע בתר-עיבוד רק בעבודות שעברו את כל בדיקות ה"
#: sabnzbd/skintext.py
msgid "Action when encrypted RAR is downloaded"
@@ -3158,6 +3193,17 @@ msgid ""
msgstr ""
"(גלה פרקים זהים בסדרות (על סמך \"שם/עונה/פרק\" של פריטים בהיסטוריה שלך"
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr "התר שחרורים תקינים"
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
".מתגלים בשם ההורדה REPACK או PROPER, REAL עקוף גילוי כפילויות סדרה אם"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "השלך"
@@ -3217,7 +3263,7 @@ msgstr "חלופי NZB בכישלון, נסה"
#: sabnzbd/skintext.py
msgid "Some servers provide an alternative NZB when a download fails."
msgstr ".חלופי כאשר הורדת נכשלת NZB מספר שרתים מספקים"
msgstr ".חלופי כאשר הורדה נכשלת NZB מספר שרתים מספקים"
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
@@ -3228,8 +3274,8 @@ msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
".NZB-בעת מיון, השתמש בתגים ממדדן עבור כותרת, עונה, פרק וכדומה. אחרת כל מתן "
"השמות נגזר משם ה"
".בעת מיון, השתמש בתגים ממדדן עבור כותרת, עונה, פרק וכדומה\r\n"
".NZB-אחרת כל מתן השמות נגזר משם ה"
#: sabnzbd/skintext.py
msgid "Enable folder rename"
@@ -3240,8 +3286,8 @@ msgid ""
"Use temporary names during post processing. Disable when your system doesn't "
"handle that properly."
msgstr ""
".השתמש בשמות זמניים במהלך לאחר-עיבוד. השבת כאשר המערכת שלך אינה מתמודדת עם "
"זה כראוי"
".השתמש בשמות זמניים במהלך בתר-עיבוד. השבת כאשר המערכת שלך אינה מתמודדת עם זה "
"כראוי"
#: sabnzbd/skintext.py
msgid "Pre-queue user script"
@@ -3333,12 +3379,12 @@ msgstr ".SABnzbd הפעל את דפדפן ברירת המחדל בעת התחל
#: sabnzbd/skintext.py
msgid "Pause Downloading During Post-Processing"
msgstr "השהה הורדה במהלך לאחר-עיבוד"
msgstr "השהה הורדה במהלך בתר-עיבוד"
#: sabnzbd/skintext.py
msgid ""
"Pauses downloading at the start of post processing and resumes when finished."
msgstr ".משהה הורדה בתחילת לאחר-עיבוד וממשיך בסיום"
msgstr ".משהה הורדה בתחילת בתר-עיבוד וממשיך בסיום"
#: sabnzbd/skintext.py
msgid "Ignore Samples"
@@ -3367,7 +3413,7 @@ msgstr "שרת"
#: sabnzbd/skintext.py
msgid "Post processing"
msgstr "לאחר-עיבוד"
msgstr "בתר-עיבוד"
#: sabnzbd/skintext.py
msgid "Naming"
@@ -3429,7 +3475,7 @@ msgstr "SSL צפני"
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ".חלש יותר SSL הגבר ביצועים ע\"י אילוץ חוזק הצפנת"
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "ניסיונות חוזרים מרביים"
@@ -3465,7 +3511,7 @@ msgstr "אפשר סינון"
#: sabnzbd/skintext.py
msgid "Action downloads according to filtering rules."
msgstr ".הורדות פעולה בהתאם לחוקי הסינון"
msgstr ".הורדה בהתאם לכללי הסינון"
#: sabnzbd/skintext.py
msgid "Abort If"
@@ -3907,6 +3953,22 @@ msgstr "התקן(ים)"
msgid "Device(s) to which message should be sent"
msgstr "התקנים אליהם הודעה תישלח"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr "ניסיון חוזר חרום"
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr "באיזו תדירות (בשניות) אותה ההתראה תישלח"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr "תפוגת חרום"
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr "כמה שניות ההתראה שלך תמשיך להיות מנוסה שוב"
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4057,6 +4119,10 @@ msgstr "1x05 תיקיית פרק"
msgid "S01E05 Episode Folder"
msgstr "S01E05 תיקיית פרק"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "שם עבודה בתור שם קובץ"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "כותר"
@@ -4126,8 +4192,8 @@ msgid "Original Filename"
msgstr "שם מקורי של קובץ"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "שם קובץ מקורי"
msgid "Original Job Name"
msgstr "שם עבודה מקורי"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4145,10 +4211,6 @@ msgstr "text"
msgid "file"
msgstr "קובץ"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "תיקייה"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "מיין מחרוזת"
@@ -4210,7 +4272,7 @@ msgstr "ערכים"
#: sabnzbd/skintext.py [Job details page]
msgid "Edit NZB Details"
msgstr "ערוך פרטי NZB"
msgstr "NZB ערוך פרטי"
#: sabnzbd/skintext.py [Job details page, delete button]
msgid "Delete"
@@ -4320,6 +4382,14 @@ msgstr "..SABnzbd אבד חיבור אל"
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "!המסך יעלם באופן אוטומטי SABnzbd במקרה של הפעלה מחדש של"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "אזהרה:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "משוך"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "קצב רענון"
@@ -4484,6 +4554,18 @@ msgstr ".סליחה, לא יכולנו לפרש את זה. נסה שוב"
msgid "Pause for..."
msgstr "...השהה למשך"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "רענן"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
".מוסרים באופן אוטומטי מהיומן ומהעותק הכלול של ההגדרות שלך API-כל שמות "
"המשתמש, הסיסמאות ומפתחות ה"
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "מיין לפי גיל <small>החדש ביותר&rarr;הישן ביותר</small>"
@@ -4540,10 +4622,6 @@ msgstr "?לטהר את ההיסטוריה"
msgid "You must enable JavaScript for Plush to function!"
msgstr "!יתפקד Plush-כדי ש JavaScript אתה חייב לאפשר"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "רענן"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "אפשרויות"
@@ -4634,10 +4712,6 @@ msgstr "זה ימנע רענון תוכן כשסמן העכבר שלך מרחף
msgid "Block Refreshes on Hover"
msgstr "חסום רענונים בריחוף"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "משוך"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "העלה"
@@ -4844,16 +4918,28 @@ msgstr ""
"תוכנה חינמית, ואתה מוזמן להפיצה מחדש תחת תנאים מסוימים. היא ברשיון תחת רשיון "
"ציבורי כללי של SABnzbd\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
".תידרש לך גישה אל ספק. ספק שירותי האינטרנט שלך עשוי לספק לך גישה, אולם מומלץ "
"ספק פרימיום usenet-על מנת להוריד מ"
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr ".%s אנו ממליצים לנסות את ?usenet אין לך ספק"
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "(%s) שגיאה בהשגת מידע טלוויזיה"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "%s אל %s:נכשל בשינוי שם"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "%s אל %s :נכשל בשינוי שם של קובץ דומה"
@@ -4897,6 +4983,9 @@ msgstr "%s ;משיכת כתובת נכשלה"
#~ msgid "Skip"
#~ msgstr "דלג"
#~ msgid "folder"
#~ msgstr "תיקייה"
#~ msgid "OK"
#~ msgstr "אישור"
@@ -4925,11 +5014,23 @@ msgstr "%s ;משיכת כתובת נכשלה"
#~ "Replace illegal characters in folder names by equivalents (otherwise remove)."
#~ msgstr ".(החלף תווים בלתי חוקיים בשמות תיקיות בשווי ערך (אחרת יימחקו"
#~ msgid "Original Foldername"
#~ msgstr "שם קובץ מקורי"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "אינה קיימת \"%s\" התיקייה"
#~ msgid "Error while adding %s, removing"
#~ msgstr "מסיר ,%s שגיאה בזמן הוספת"
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "בלתי תקפים, לא יכול לוודא או לתקן par2 קבצי"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "%s (%s -> %s)-ב CRC שגיאת"
#~ msgid "Main packet not found..."
#~ msgstr "...חפיסה ראשית לא נמצאה"
#~ msgid "It is likely that you are using ZoneAlarm on Vista.<br>"
#~ msgstr ".Vista על ZoneAlarm-סביר להניח שאתה משתמש ב<br>"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "נכשל, ראה יומן SQL חיוב"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-05-23 11:46+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-09-03 14:07+0000\n"
"Last-Translator: Steffen Bærø <steffen.baro@gmail.com>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -45,11 +45,23 @@ msgstr "_yenc-modul... IKKE funnet!"
msgid "par2 binary... NOT found!"
msgstr "par2-binærfil... IKKE funnet!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr "Verifikasjon og reparasjon vil ikke være mulig."
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr "MultiPar-binærfil... IKKE funnet!"
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
"Din Unrar-versjon er %s, vi anbefaler versjon %s eller høyere. <br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr "Nedlastinger vil ikke blir pakket ut."
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "unrar-binærfil... IKKE funnet!"
@@ -194,10 +206,6 @@ msgstr "Kan ikke lage midlertidig fil for %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Forsøker å sette status på ikke-eksisterende server %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "For lite diskplass, nedlasting satt på pause"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Feil i tempfil.mkstemp"
@@ -220,15 +228,6 @@ msgstr "Test varslingen"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Løs adresse"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEIL:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ingen"
@@ -245,6 +244,10 @@ msgstr "ukjent"
msgid "Failed to compile regex for search term: %s"
msgstr "Kunne ikke lage regex for søkestreng: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "For lite diskplass, nedlasting satt på pause"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Disken er full! Pauser..."
@@ -391,10 +394,6 @@ msgstr "Skadet historikkdatabase, opprettet ny database"
msgid "SQL Command Failed, see log"
msgstr "SQL-kommando mislyktes, se logg"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "SQL Innsetting mislyktes, se logg"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Kunne ikke stenge databasen, se logg"
@@ -411,10 +410,6 @@ msgstr "Dekoding av %s mislyktes"
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "CRC-feil i %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Feilaktigt utformet yEnc artikkel i %s"
@@ -455,14 +450,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Kan ikke lese %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Kunne ikke legge til %s, tar bort"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Feil ved fjerning av %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Kan ikke lese %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Kan ikke lese den overvåkede mappen %s"
@@ -559,6 +559,12 @@ msgstr "Kunne ikke stenge e-post-tilkobling"
msgid "Email succeeded"
msgstr "E-post sendning lykkes"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Kan ikke sendes, mangler nødvendig data"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Kan ikke finne e-post-maler i %s"
@@ -651,7 +657,7 @@ msgstr ""
"Autentisering mangler, angi brukernavn/passord fra Konfigurasjon->Generelt i "
"ditt tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -721,14 +727,23 @@ msgstr "av"
msgid "Undefined server!"
msgstr "Udefinert server!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Feil parameter"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Tilbake"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEIL:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -749,7 +764,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Kan ikke opprette mappe %s"
@@ -769,10 +784,20 @@ msgstr "Kunne ikke flytte %s til %s"
msgid "Error creating SSL key and certificate"
msgstr "Kunne ikke lage SSL-nøkkel eller sertifikat."
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Kunne ikke endre rettigheter på %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Kjører skript"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -948,6 +973,7 @@ msgstr "Starter reparasjon"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr "Par verifisering feilet på %s, mens hurtigsjekk var vellykket!"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -976,18 +1002,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verifisering tok %s, krever reparasjon"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Hovedarkiv mangler..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Ugyldige par2-filer, kan ikke kontrollere eller reparere"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
"Mislykket reparasjon, finner ikke nødvendige reparasjonsblokker (%s mangler)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -997,6 +1014,11 @@ msgstr "Henter %s blokker..."
msgid "Fetching"
msgstr "Henter"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr ""
"Mislykket reparasjon, finner ikke nødvendige reparasjonsblokker (%s mangler)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1022,6 +1044,10 @@ msgstr "Harddisken er full"
msgid "Verifying"
msgstr "Verifiserer"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1085,11 +1111,6 @@ msgstr "Andre meldinger"
msgid "Not available"
msgstr "Ikke tilgjengelig"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Kan ikke sendes, mangler nødvendig data"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Klarte ikke å sende Prowl melding"
@@ -1098,7 +1119,7 @@ msgstr "Klarte ikke å sende Prowl melding"
msgid "Bad response from Pushover (%s): %s"
msgstr "Ukorrekt svar fra Pushover (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Klarte ikke å sende pushover-melding"
@@ -1186,12 +1207,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Stanser duplikatfil \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Avbrutt, kan ikke fullføres"
@@ -1477,7 +1492,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Kritisk feil"
@@ -1499,6 +1514,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr "Nedlasting kan feile, kun %s av kravet på %s tilgjengelig"
@@ -1527,10 +1548,6 @@ msgstr "Kunne ikke endre navn fra \"%s\" til \"%s\""
msgid "Failed to move files"
msgstr "Klarte ikke å flytte filer"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Kjører skript"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Kjør brukerskript %s"
@@ -1551,7 +1568,7 @@ msgstr "Mer"
msgid "Post Processing Failed for %s (%s)"
msgstr "Etterbehandling mislyktes for %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "se loggfil"
@@ -1863,6 +1880,14 @@ msgstr "Aktiver kvotebegrensninger"
msgid "Disable quota management"
msgstr "Deaktiver kvotebegrensninger"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Av"
@@ -2702,6 +2727,12 @@ msgstr "SABnzbd Passord"
msgid "Optional authentication password."
msgstr "Kan velge autentiserings passord."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -3161,6 +3192,16 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Forkast"
@@ -3433,7 +3474,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Maksimum antall forsøk"
@@ -3907,6 +3948,22 @@ msgstr "Enhet(er)"
msgid "Device(s) to which message should be sent"
msgstr "Enhet(er) som meldingen skal sendes til"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4055,6 +4112,10 @@ msgstr "1x05 Episodemappe"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodemappe"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Tittel"
@@ -4124,8 +4185,8 @@ msgid "Original Filename"
msgstr "Originalfilnavn"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Originalt mappenavn"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4143,10 +4204,6 @@ msgstr "tekst"
msgid "file"
msgstr "fil"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "mappe"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteringsstreng"
@@ -4320,6 +4377,14 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"Hvis SABnzbd skulle starte på nytt vil denne skjermen forsvinne automatisk!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ADVARSEL:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Hent"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Oppdateringsfrekvens"
@@ -4482,6 +4547,16 @@ msgstr "Beklager, vi kunne ikke finne ut av det. Prøv igjen."
msgid "Pause for..."
msgstr "Pause i..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Oppdatere"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Sorter etter alder <small>Eldst&rarr;Ny</small>"
@@ -4538,10 +4613,6 @@ msgstr "Vil du virkelig slette historikken?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Du må aktivere Javaskript for at Plush skal fungere!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Oppdatere"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Alternativer"
@@ -4632,10 +4703,6 @@ msgstr "Dette vil hindre oppfrisking av innhold når muspekeren er over køen"
msgid "Block Refreshes on Hover"
msgstr "Blokker oppfrisking når musen svever over"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Hent"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Last Opp"
@@ -4845,16 +4912,29 @@ msgstr ""
"Det er lisensier under GNU GENERAL PUBLIC LICENSE Versjon 2 eller senere "
"versjoner.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"For å laste ned fra usenet trenger du tilgang til en leverandør. Din "
"internettleverandør kan gi deg tilgang, men en \"proff\" leverandør "
"anbefales."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Har du ikke noen usenet leverandør? Vi anbefaler å prøve %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Kunne ikke hente TV info (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Kunne ikke endre navn fra: %s til %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Kunne ikke endre navn på lik fil: %s til %s"
@@ -4889,6 +4969,9 @@ msgstr "URL henting mislyktes; %s"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "Mappen \"%s\" finnes ikke"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "SQL Innsetting mislyktes, se logg"
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
#~ msgstr "Kunne ikke finne noen UNRAR program, utpakking er ikke mulig<br />"
@@ -4934,12 +5017,12 @@ msgstr "URL henting mislyktes; %s"
#~ msgid "Unpacking failed, an expected file was not unpacked"
#~ msgstr "Utpakking mislyktes, en forventet fil er ikke utpakket"
#~ msgid "Main packet not found..."
#~ msgstr "Hovedarkiv mangler..."
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
#~ msgstr "Mislyktes med importering av OpenSSL modul. Kobler til uten SSL"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Kunne ikke legge til %s, tar bort"
#~ msgid "Failed to remove nzo from postproc queue (id)"
#~ msgstr "Kunne ikke fjerne nzo fra etterbehandlings køen (id)"
@@ -5211,17 +5294,6 @@ msgstr "URL henting mislyktes; %s"
#~ "Launch my internet browser with the SABnzbd page when the program starts."
#~ msgstr "Start webleseren med SABnzbd's side når programmet startes."
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "For å laste ned fra usenet trenger du tilgang til en leverandør. Din "
#~ "internettleverandør kan gi deg tilgang, men en \"proff\" leverandør "
#~ "anbefales."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "Har du ikke noen usenet leverandør? Vi anbefaler å prøve %s."
#~ msgid "This field is required."
#~ msgstr "Detta feltet kreves."
@@ -5243,6 +5315,9 @@ msgstr "URL henting mislyktes; %s"
#~ msgid "Step Five"
#~ msgstr "Steg fem"
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Ugyldige par2-filer, kan ikke kontrollere eller reparere"
#~ msgid "Unpacking failed, these file(s) are missing:"
#~ msgstr "Utpakking feilet, fil(er) mangler:"
@@ -5276,6 +5351,9 @@ msgstr "URL henting mislyktes; %s"
#~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file"
#~ msgstr "ADVARSEL: Jobb \"%s\" satt på pause pga. kryptert RAR-fil"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "CRC-feil i %s (%s -> %s)"
#~ msgid ""
#~ "Your UNRAR version is not recommended, get it from "
#~ "http://www.rarlab.com/rar_add.htm<br />"
@@ -5371,6 +5449,9 @@ msgstr "URL henting mislyktes; %s"
#~ msgid "Open Source URL"
#~ msgstr "Åpen kildekode URL"
#~ msgid "Original Foldername"
#~ msgstr "Originalt mappenavn"
#~ msgid "Groups / Indexer tags"
#~ msgstr "Grupper / Indeks etiketter"
@@ -5436,3 +5517,6 @@ msgstr "URL henting mislyktes; %s"
#~ msgstr ""
#~ "Send automatisk beregnet valideringsresultater for nedlastinger til "
#~ "indekserer."
#~ msgid "folder"
#~ msgstr "mappe"

View File

File diff suppressed because it is too large Load Diff

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2015-12-28 10:22+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Polish <pl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,10 +43,22 @@ msgstr "Moduł _yenc... NIE znaleziono!"
msgid "par2 binary... NOT found!"
msgstr "Program par2 ... NIE znaleziono!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr "Twoja wersja unrar to %s, zalecana jest wersja %s lub wyższa.<br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "Program unrar ... NIE znaleziono!"
@@ -192,10 +204,6 @@ msgstr "Nie można utworzyć tymczasowego pliku dla %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Próba ustawienia statusu nieistniejącego serwera %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Zbyt mało miejsca na dysku, wymuszanie WSTRZYMANIA"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Błąd w tempfile.mkstemp"
@@ -218,15 +226,6 @@ msgstr "Powiadomienie testowe"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Rozwiązywanie adresu"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "BŁĄD:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "UWAGA:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Brak"
@@ -243,6 +242,10 @@ msgstr "nieznany"
msgid "Failed to compile regex for search term: %s"
msgstr "Błąd kompilacji wyrażenia regularnego dla wyszukiwania: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Zbyt mało miejsca na dysku, wymuszanie WSTRZYMANIA"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Dysk pełny! Wstrzymuję pobieranie"
@@ -391,10 +394,6 @@ msgstr "Uszkodzona baza danych historii, utworzono w jej miejscu nową, pustą"
msgid "SQL Command Failed, see log"
msgstr "Błąd polecenia SQL, sprawdź logi"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "Błąd wykonania polecenia SQL, sprawdź logi"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Błąd zamykania bazy danych, sprawdź logi"
@@ -411,10 +410,6 @@ msgstr "Błąd dekodowania %s"
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "Błąd CRC w %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Źle zbudowany artykuł yEnc w %s"
@@ -455,14 +450,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Nie można odczytać %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Błąd podczas dodawania %s, usuwanie"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Błąd podczas usuwania %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Nie można odczytać %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Nie można odczytać obserwowanego katalogu %s"
@@ -561,6 +561,12 @@ msgstr "Nie udało się zamknąć połączenia z serwerem pocztowym"
msgid "Email succeeded"
msgstr "Wiadomość wysłana"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Nie można wysłać wiadomości, brak wymaganych danych"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Brak szablonów wiadomości email w %s"
@@ -653,7 +659,7 @@ msgstr ""
"Brak danych uwierzytelniających, wprowadź nazwę użytkownika/hasło z sekcji "
"Konfiguracja->Ogólne do zewnętrznego programu:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -724,14 +730,23 @@ msgstr "wyłączone"
msgid "Undefined server!"
msgstr "Niezdefiniowany serwer!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Błędny parametr"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Powrót"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "BŁĄD:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -752,7 +767,7 @@ msgstr "g"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Nie można utworzyć katalogu %s"
@@ -772,10 +787,20 @@ msgstr "Nie udało się przenieść %s do %s"
msgid "Error creating SSL key and certificate"
msgstr "Błąd tworzenia klucza i certyfikatu SSL"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Nie można zmienić uprawnień %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Uruchamianie skryptu"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -951,6 +976,7 @@ msgstr "Rozpoczynanie naprawy"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr "Weryfikacja %s nieudana, choć szybkie sprawdzenie powiodło się!"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -980,19 +1006,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Zweryfikowano w %s, wymagana naprawa"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Główny pakiet nieznaleziony..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Nieprawidłowe pliki par2, nie można zweryfikować lub naprawić"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
"Naprawa nie powiodła się, brak wystarczającej ilości bloków naprawczych "
"(brakuje %s)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1002,6 +1018,12 @@ msgstr "Pobieranie %s bloków..."
msgid "Fetching"
msgstr "Pobieranie"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr ""
"Naprawa nie powiodła się, brak wystarczającej ilości bloków naprawczych "
"(brakuje %s)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1027,6 +1049,10 @@ msgstr "Dysk pełny"
msgid "Verifying"
msgstr "Weryfikowanie"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1090,11 +1116,6 @@ msgstr "Inne komunikaty"
msgid "Not available"
msgstr "Niedostępne"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Nie można wysłać wiadomości, brak wymaganych danych"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Błąd wysyłania wiadomości Prowl"
@@ -1103,7 +1124,7 @@ msgstr "Błąd wysyłania wiadomości Prowl"
msgid "Bad response from Pushover (%s): %s"
msgstr "Zła odpowiedź od Pushover (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Nie udało się wysłać wiadomości Pushover"
@@ -1193,12 +1214,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Wstrzymuję zduplikowany NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Przerwano, nie można ukończyć"
@@ -1483,7 +1498,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Błąd krytyczny"
@@ -1506,6 +1521,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr "Pobieranie może się nie udać, dostępne jedynie %s z wymaganych %s"
@@ -1535,10 +1556,6 @@ msgstr "Błąd zmiany nazwy \"%s\" na \"%s\""
msgid "Failed to move files"
msgstr "Nie udało się przenieść plików"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Uruchamianie skryptu"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Uruchamianie skryptu użytkownika %s"
@@ -1559,7 +1576,7 @@ msgstr "Więcej"
msgid "Post Processing Failed for %s (%s)"
msgstr "Przetwarzanie końcowe nie powiodło się dla %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "sprawdź logi"
@@ -1871,6 +1888,14 @@ msgstr "Włącz zarządzanie limitem"
msgid "Disable quota management"
msgstr "Wyłącz zarządzanie limitem"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Brak"
@@ -2708,6 +2733,12 @@ msgstr "Hasło SABnzbd"
msgid "Optional authentication password."
msgstr "Opcjonalne hasło"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -3173,6 +3204,16 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Odrzuć"
@@ -3450,7 +3491,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Maksymalna ilość prób"
@@ -3925,6 +3966,22 @@ msgstr "Urządzenie(-a)"
msgid "Device(s) to which message should be sent"
msgstr "Urządzenie(-a), do którego(-ych) mają być wysyłane powiadomienia"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4073,6 +4130,10 @@ msgstr "Katalog odcinka 1x05"
msgid "S01E05 Episode Folder"
msgstr "Katalog odcinka S01E05"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Tytuł"
@@ -4142,8 +4203,8 @@ msgid "Original Filename"
msgstr "Oryginalna nazwa pliku"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Oryginalna nazwa katalogu"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4161,10 +4222,6 @@ msgstr "tekst"
msgid "file"
msgstr "plik"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "katalog"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Wzorzec sortowania"
@@ -4338,6 +4395,14 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"W razie ponownego uruchomienia SABnzbd ten ekran zniknie automatycznie!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "UWAGA:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Pobierz"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Częstotliwość odświeżania"
@@ -4500,6 +4565,16 @@ msgstr "Przykro mi, nie rozumiem. Spróbuj ponownie."
msgid "Pause for..."
msgstr "Wstrzymaj na..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Odśwież"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Sortuj według wieku <small>Najstarsze&rarr;Najnowsze</small>"
@@ -4556,10 +4631,6 @@ msgstr "Wyczyścić historię?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Plush wymaga włączenia obsługi JavaScript!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Odśwież"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Opcje"
@@ -4650,10 +4721,6 @@ msgstr "Blokuje odświeżanie zawartości po najechaniu kursorem na kolejkę"
msgid "Block Refreshes on Hover"
msgstr "Zablokuj odświeżanie podczas wskazywania"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Pobierz"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Wczytaj"
@@ -4862,16 +4929,28 @@ msgstr ""
"Program jest wydawany na licencji GNU GENERAL PUBLIC LICENSE w wersji 2 lub "
"(według twojego wyboru) którejś z późniejszych wersji.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"Pobieranie z Usenetu wymaga dostępu do dostawcy. Twój ISP może umożliwiać "
"dostęp, aczkolwiek zalecany jest dostawca klasy premium."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Nie masz dostawcy Usenet? Polecamy spróbować %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Błąd pobierania informacji TV (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Nie udało się zmienić nazwy %s na %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Nie udało się zmienić nazwy podobnego pliku %s na %s"
@@ -4903,6 +4982,9 @@ msgstr "Bezużyteczny plik NZB"
msgid "URL Fetching failed; %s"
msgstr "Pobieranie URL nie powiodło się; %s"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "Błąd CRC w %s (%s -> %s)"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "Folder \"%s\" nie istnieje"
@@ -4919,6 +5001,9 @@ msgstr "Pobieranie URL nie powiodło się; %s"
#~ msgid "Downloaded so far"
#~ msgstr "Dotychczas pobrano"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "Błąd wykonania polecenia SQL, sprawdź logi"
#~ msgid "Not matched"
#~ msgstr "Nie dopasowano"
@@ -5022,6 +5107,9 @@ msgstr "Pobieranie URL nie powiodło się; %s"
#~ msgid "E.g. 119 or 563 for SSL"
#~ msgstr "Np. 119 lub 563 dla SSL"
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Nieprawidłowe pliki par2, nie można zweryfikować lub naprawić"
#~ msgid "Folder configuration"
#~ msgstr "Konfiguracja katalogów"
@@ -5115,6 +5203,12 @@ msgstr "Pobieranie URL nie powiodło się; %s"
#~ msgid "Generic Sorting"
#~ msgstr "Sortowanie standardowe"
#~ msgid "folder"
#~ msgstr "katalog"
#~ msgid "Original Foldername"
#~ msgstr "Oryginalna nazwa katalogu"
#~ msgid "Are you sure you want to delete"
#~ msgstr "Czy na pewno usunąć?"
@@ -5195,12 +5289,12 @@ msgstr "Pobieranie URL nie powiodło się; %s"
#~ msgid "Missing expected file: %s => unrar error?"
#~ msgstr "Brak oczekiwanego pliku: %s => błąd rozpakowywania archiwum RAR?"
#~ msgid "Main packet not found..."
#~ msgstr "Główny pakiet nieznaleziony..."
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
#~ msgstr "Błąd importu modułu OpenSSL. Łączenie bez SSL"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Błąd podczas dodawania %s, usuwanie"
#~ msgid ""
#~ "\n"
#~ " SABnzbd is not compatible with some software firewalls.<br>\n"
@@ -5423,16 +5517,6 @@ msgstr "Pobieranie URL nie powiodło się; %s"
#~ "Launch my internet browser with the SABnzbd page when the program starts."
#~ msgstr "Uruchom stronę SABnzbd w przeglądarce podczas uruchamiania programu"
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "Pobieranie z Usenetu wymaga dostępu do dostawcy. Twój ISP może umożliwiać "
#~ "dostęp, aczkolwiek zalecany jest dostawca klasy premium."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "Nie masz dostawcy Usenet? Polecamy spróbować %s."
#~ msgid "This field is required."
#~ msgstr "To pole jest wymagane"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2016-01-01 22:58+0000\n"
"Last-Translator: lrrosa <Unknown>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -44,11 +44,23 @@ msgstr "módulo _yenc... NÃO encontrado!"
msgid "par2 binary... NOT found!"
msgstr "aplicativo par2... NÃO encontrado!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
"Sua versão UNRAR é %s, nós recomendamos a versão %s ou superior.<br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "aplicativo unrar... NÃO encontrado!"
@@ -192,10 +204,6 @@ msgstr "Não é possível criar um arquivo temporário para %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Tentando definir o status do servidor inexistente %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Muito pouco espaço em disco. Forçando PAUSE"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Falha em tempfile.mkstemp"
@@ -218,15 +226,6 @@ msgstr "Notificação de teste"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Resolvendo endereço"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERRO:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Nenhum"
@@ -243,6 +242,10 @@ msgstr "desconhecido"
msgid "Failed to compile regex for search term: %s"
msgstr "Falha ao compilar a expressão para o termo pesquisado: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Muito pouco espaço em disco. Forçando PAUSE"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Disco cheio! Forçando Pausa"
@@ -393,10 +396,6 @@ msgstr "Dados de histórico danificados, criado um substituto vazio"
msgid "SQL Command Failed, see log"
msgstr "O comando SQL falhou. Consulte o log"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "O commit do SQL falhou. Consulte o log"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Falha ao fechar o banco de dados. Consulte o log"
@@ -413,10 +412,6 @@ msgstr "Falha ao decodificar %s"
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "Erro de CRC em %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Artigo yEnc mal formado em %s"
@@ -457,14 +452,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Não é possível ler %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Erro ao adicionar %s. Removendo"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Erro ao remover %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Não é possível ler %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Não é possível ler a Pasta de Assistidos %s"
@@ -562,6 +562,12 @@ msgstr "Falha ao fechar a conexão de e-mail"
msgid "Email succeeded"
msgstr "E-mail enviado com sucesso"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Não foi possível enviar, faltam dados obrigatórios"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Não é possível encontrar modelos de e-mail em %s"
@@ -654,7 +660,7 @@ msgstr ""
"Autenticação faltando. Por favor insira usuário/senha de Configuração->Geral "
"em seu programa de terceiros:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -724,14 +730,23 @@ msgstr "desligado"
msgid "Undefined server!"
msgstr "Servidor não definido!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Parâmetro incorreto"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Voltar"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ERRO:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -752,7 +767,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Não é possível criar a pasta %s"
@@ -772,10 +787,20 @@ msgstr "Falha ao mover %s para %s"
msgid "Error creating SSL key and certificate"
msgstr "Erro ao criar chave SSL e certificado"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Não é possível alterar permissões de %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Executando script"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -951,6 +976,7 @@ msgstr "Iniciando reparação"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr "Validação de par falhou em %s, enquanto QuickCheck foi completo!"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -979,17 +1005,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verificado em %s. É necessário reparar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Pacote principal não encontrado..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Arquivos PAR2 inválidos. Não é possível verificar ou reparar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Reparação falhou. Blocos de reparação insuficientes (faltam %s)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -999,6 +1017,10 @@ msgstr "Obtendo %s blocos..."
msgid "Fetching"
msgstr "Obtendo"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Reparação falhou. Blocos de reparação insuficientes (faltam %s)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1024,6 +1046,10 @@ msgstr "Disco cheio"
msgid "Verifying"
msgstr "Verificando"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1087,11 +1113,6 @@ msgstr "Outras Mensagens"
msgid "Not available"
msgstr "Não disponível"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Não foi possível enviar, faltam dados obrigatórios"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Falha ao enviar mensagem Prowl"
@@ -1100,7 +1121,7 @@ msgstr "Falha ao enviar mensagem Prowl"
msgid "Bad response from Pushover (%s): %s"
msgstr "Resposta incorreta do Pushover (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Falha ao enviar mensagem pushover"
@@ -1190,12 +1211,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Pausando NZB duplicado \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Cancelado, não é possível concluir"
@@ -1482,7 +1497,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Erro fatal"
@@ -1504,6 +1519,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr ""
@@ -1533,10 +1554,6 @@ msgstr "Erro ao renomear \"%s\" para \"%s\""
msgid "Failed to move files"
msgstr "Falha ao mover arquivos"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Executando script"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Executando script de usuário %s"
@@ -1557,7 +1574,7 @@ msgstr "Mais"
msgid "Post Processing Failed for %s (%s)"
msgstr "O pós-processamento falhou para %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "veja o arquivo de log"
@@ -1870,6 +1887,14 @@ msgstr "Ativar gerenciamento de cota"
msgid "Disable quota management"
msgstr "Desativar gerenciamento de cota"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Desligado"
@@ -2708,6 +2733,12 @@ msgstr "Senha do SABnzbd"
msgid "Optional authentication password."
msgstr "Senha de autenticação opcional."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -3173,6 +3204,16 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Descartar"
@@ -3447,7 +3488,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Máximo de tentativas"
@@ -3923,6 +3964,22 @@ msgstr "Dispositivo(s)"
msgid "Device(s) to which message should be sent"
msgstr "Dispositivo(s) para qual a mensagem deve ser enviada"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4071,6 +4128,10 @@ msgstr "1x05 Pasta Do Episódio"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Pasta Do Episódio"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Tí­tulo"
@@ -4140,8 +4201,8 @@ msgid "Original Filename"
msgstr "Nome do arquivo original"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Nome da pasta original"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4159,10 +4220,6 @@ msgstr "texto"
msgid "file"
msgstr "arquivo"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "pasta"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "String de ordenação"
@@ -4336,6 +4393,14 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"No caso de reinício do SABnzbd, esta janela irá desaparecer automaticamente!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "AVISO:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Obter"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Taxa de atualização"
@@ -4498,6 +4563,16 @@ msgstr "Perdão, não conseguimos interpretar isso. Tente novamente."
msgid "Pause for..."
msgstr "Pausar por..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Atualizar"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Ordenar por Idade <small>Mais antigo&rarr;Mais novo</small>"
@@ -4554,10 +4629,6 @@ msgstr "Limpar o Histórico?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Você deve habilitar o JavaScript para Plush funcionar!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Atualizar"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Opções"
@@ -4650,10 +4721,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr "Impedir Atualizações no Foco"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Obter"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Enviar"
@@ -4862,16 +4929,29 @@ msgstr ""
"Está licenciado sob a LICENÇA PÚBLICA GERAL GNU Versão 2 ou (a seu critério) "
"qualquer versão posterior.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"Para baixar a partir da usenet você precisa ter acesso a um provedor. Seu "
"provedor de Internet pode fornecer-lhe acesso, no entanto, um provedor "
"exclusivo é recomendado."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Não tem um provedor usenet? Recomendamos testar %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Erro ao obter informações de TV (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Falha ao renomear: %s para %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Falha ao renomear arquivo similar: %s para %s"
@@ -4907,9 +4987,15 @@ msgstr "A busca da URL falhou; %s"
#~ msgstr ""
#~ "ATENÇÃO: Tarefa \"%s\" em pausa por causa de arquivo RAR criptografado"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "Erro de CRC em %s (%s -> %s)"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "A pasta \"%s\" não existe"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "O commit do SQL falhou. Consulte o log"
#~ msgid ""
#~ "Your UNRAR version is not recommended, get it from "
#~ "http://www.rarlab.com/rar_add.htm<br />"
@@ -4962,6 +5048,12 @@ msgstr "A busca da URL falhou; %s"
#~ msgid "Missing expected file: %s => unrar error?"
#~ msgstr "Faltando arquivo esperado: %s => erro no unrar?"
#~ msgid "Main packet not found..."
#~ msgstr "Pacote principal não encontrado..."
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Arquivos PAR2 inválidos. Não é possível verificar ou reparar"
#~ msgid "Unpacking failed, these file(s) are missing:"
#~ msgstr "A descompactação falhou. Este(s) arquivo(s) estão faltando:"
@@ -4971,9 +5063,6 @@ msgstr "A busca da URL falhou; %s"
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
#~ msgstr "Erro ao importar o módulo OpenSSL. Conectando-se sem SSL"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Erro ao adicionar %s. Removendo"
#~ msgid ""
#~ "\n"
#~ " SABnzbd needs a free tcp/ip port for its internal web server.<br>\n"
@@ -5285,6 +5374,12 @@ msgstr "A busca da URL falhou; %s"
#~ msgid "Generic Sorting"
#~ msgstr "Ordenação genérica"
#~ msgid "Original Foldername"
#~ msgstr "Nome da pasta original"
#~ msgid "folder"
#~ msgstr "pasta"
#~ msgid "Enable sorting and renaming of episodes."
#~ msgstr "Ativa a ordenação e renomeação de episódios."
@@ -5352,17 +5447,6 @@ msgstr "A busca da URL falhou; %s"
#~ msgid "Misc"
#~ msgstr "Diversos"
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "Para baixar a partir da usenet você precisa ter acesso a um provedor. Seu "
#~ "provedor de Internet pode fornecer-lhe acesso, no entanto, um provedor "
#~ "exclusivo é recomendado."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "Não tem um provedor usenet? Recomendamos testar %s."
#~ msgid "This field is required."
#~ msgstr "Este campo é necessário."

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2016-07-29 16:20+0000\n"
"Last-Translator: nicusor <Unknown>\n"
"Language-Team: Romanian <ro@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,12 +43,24 @@ msgstr "modulul _yenc ... Negăsit!"
msgid "par2 binary... NOT found!"
msgstr "binar par2 ... Negăsit!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
"Versiunea ta de UNRAR este %s, noi recomandăm versiunea %s sau mai mare.<br "
"/>"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "binar unrar... Negăsit!"
@@ -195,10 +207,6 @@ msgstr "Nu pot crea fişier temporar pentru %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Încerc să setez starea unui server nexistent %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Prea puţin spaţiu disc forţez PAUZĂ"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Eroare în tempfile.mkstemp"
@@ -221,15 +229,6 @@ msgstr "Notificări Test"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Reolvare adresă"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "EROARE:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ATENŢIE:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Niciunul"
@@ -246,6 +245,10 @@ msgstr "necunoscut"
msgid "Failed to compile regex for search term: %s"
msgstr "Compilarea unei căutări regex nereuşită: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Prea puţin spaţiu disc forţez PAUZĂ"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Disc plin! Pauză Forţată"
@@ -395,10 +398,6 @@ msgstr "Bază de date Istoric coruptă, creat un nou fişier gol"
msgid "SQL Command Failed, see log"
msgstr "Comandă SQL Nereuşită, vedeţi jurnal"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "Modificare SQL Nereuşită, vedeţi jurnal"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Închidere bază de date nereuşită, vedeţi jurnal"
@@ -415,10 +414,6 @@ msgstr "Decodarea %s nereuşită"
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "Eroare CRC în %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Articoul yEnc invalid în %s"
@@ -459,14 +454,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Nu pot citi %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Eroare adăugare %s, ştergem"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Eroare ştergere %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Nu pot citi %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Nu pot citi Dosar Urnărire %s"
@@ -564,6 +564,12 @@ msgstr "Închidere conexiune mail nereuşită"
msgid "Email succeeded"
msgstr "Email reuşit"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Nu pot trimite, informații necesare lipsă"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Nu pot gasi şabloane email în %s"
@@ -656,7 +662,7 @@ msgstr ""
"Autentificare lipsă, vă rugăm să introduceţi numele de utilizator/parola de "
"la Configurare->General în programul dumneavoastră terţ:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -727,14 +733,23 @@ msgstr "dezactivat"
msgid "Undefined server!"
msgstr "Server nedefinit!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Parametru Incorect"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Înapoi"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "EROARE:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -755,7 +770,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Nu pot crea dosarul %s"
@@ -775,10 +790,20 @@ msgstr "Mutare %s în %s nereuşită"
msgid "Error creating SSL key and certificate"
msgstr "Eroare la crearea cheiei şi certificatlui SSL"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Nu pot schimba permisiunile lui %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Rulare script"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -954,6 +979,7 @@ msgstr "Pornire Reparare"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr "Verificarea Par eșuată pentru %s, dar VerificareaRapidă reușită!"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -983,17 +1009,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verificat în %s, reparare necesară"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Pachet principal negăsit..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Fișier par2 invalid, nu pot verifica sau repara"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Reparare nereuşită, blocuri reparare insuficiente (%s mai puţin)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1003,6 +1021,10 @@ msgstr "Descărcare %s blocuri..."
msgid "Fetching"
msgstr "Descărcare"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Reparare nereuşită, blocuri reparare insuficiente (%s mai puţin)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1028,6 +1050,10 @@ msgstr "Disc plin"
msgid "Verifying"
msgstr "Se verifică"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1091,11 +1117,6 @@ msgstr "Alte Mesaje"
msgid "Not available"
msgstr "Indisponibil"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Nu pot trimite, informații necesare lipsă"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Nu am putu trimite mesajul Prowl"
@@ -1104,7 +1125,7 @@ msgstr "Nu am putu trimite mesajul Prowl"
msgid "Bad response from Pushover (%s): %s"
msgstr "Răspuns greșit de la Pushover (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Nu am putut trimite mesajul de pushover"
@@ -1195,12 +1216,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Întrerupem duplicat NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Anulat nu poate fi finalizat"
@@ -1489,7 +1504,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Eroare fatală"
@@ -1511,6 +1526,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr "Descărcarea ar putea eşua, doar %s din %s disponibil"
@@ -1539,10 +1560,6 @@ msgstr "Eroare redenumire \"%s\" în \"%s\""
msgid "Failed to move files"
msgstr "Nu am putu muta fişier"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Rulare script"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Rulare script utilizator %s"
@@ -1563,7 +1580,7 @@ msgstr "Mai mult"
msgid "Post Processing Failed for %s (%s)"
msgstr "Post Procesare Nereuşită pentru %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "vezi fişier jurnal"
@@ -1875,6 +1892,14 @@ msgstr "Activează gestionarea cotelor"
msgid "Disable quota management"
msgstr "Dezactivează gestionarea cotelor"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Oprit"
@@ -2715,6 +2740,12 @@ msgstr "Parolă SABnzbd"
msgid "Optional authentication password."
msgstr "Parolă autentificare opţională"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -3174,6 +3205,16 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Ignoră"
@@ -3449,7 +3490,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Număr Maxim reîncercări"
@@ -3928,6 +3969,22 @@ msgstr "Dispozitiv(e)"
msgid "Device(s) to which message should be sent"
msgstr "Dispozitiv(e) la care să se trimită mesajul"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4075,6 +4132,10 @@ msgstr "1x05 Dosar Episod"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Dosar Episod"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titlu"
@@ -4144,8 +4205,8 @@ msgid "Original Filename"
msgstr "Nume de Fişier Original"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Nume de Dosar Original"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4163,10 +4224,6 @@ msgstr "text"
msgid "file"
msgstr "fișier"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "dosar"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Şir Caractere Sortare"
@@ -4339,6 +4396,14 @@ msgstr "Am pierdut conexiunea cu SABnzbd.."
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "În cazul repornirii SABnzbd acest ecran va dispărea în mod automat!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ATENŢIE:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Descarcă"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Rată actualizare"
@@ -4503,6 +4568,16 @@ msgstr "Ne pare rău, nu am putut interpreta informațiile. Încearcă din nou."
msgid "Pause for..."
msgstr "Pauză timp de..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Reîmprospătează"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Sortează după Vârstă <small>Cel mai Vechi&rarr;Cel mai Nou</small>"
@@ -4559,10 +4634,6 @@ msgstr "Goliţi Istoricul?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Trebuie să activaţi JavaScript pentru ca Plush să funcţioneze!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Reîmprospătează"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Opțiuni"
@@ -4655,10 +4726,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr "Blochează Reîmprospătarea Hover"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Descarcă"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Încarcă"
@@ -4868,16 +4935,28 @@ msgstr ""
"Este licenţiat sub GNU General Public License versiunea 2 sau (la opţiunea "
"dumneavoastră) orice versiune ulterioară.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"Pentru a descărca de pe usenet veţi avea nevoie de un furnizor. ISP-ul dvs. "
"vă poate oferi acces, totuşi un furnizor premium e recomandat."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Nu aveţi un furnizor usenet? Vă recomandăm să încercaţi %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Eroare obţinere info TV (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Redenumire:%s în %s nereuşită"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Redenumire fişiere similare : %s în %s nereuşită"
@@ -4913,9 +4992,15 @@ msgstr "Descărcare URL nereuşită; %s"
#~ msgstr ""
#~ "ATENŢIE: Sarcina \"%s\" întreruptă din cauza fişierelor RAR encriptate"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "Eroare CRC în %s (%s -> %s)"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "Dosarul \"%s\" nu există"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "Modificare SQL Nereuşită, vedeţi jurnal"
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
#~ msgstr ""
#~ "Nici un program UNRAR găsit, dezarhivarea fişierelor RAR imposibilă<br />"
@@ -4997,12 +5082,12 @@ msgstr "Descărcare URL nereuşită; %s"
#~ msgid "Missing expected file: %s => unrar error?"
#~ msgstr "Fişiere aşteptate lipsă: %s => eroare unrar?"
#~ msgid "Main packet not found..."
#~ msgstr "Pachet principal negăsit..."
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
#~ msgstr "Eroare importare modul OpenSSL . Se conectează folosind NON-SSL"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Eroare adăugare %s, ştergem"
#~ msgid "Failed to remove nzo from postproc queue (id)"
#~ msgstr "Ştergere nzo din coadă post-procesare nereuşită (id)"
@@ -5266,6 +5351,12 @@ msgstr "Descărcare URL nereuşită; %s"
#~ msgid "Enable if downloads are not put in their own folders."
#~ msgstr "Activează dacă descărcările nu sunt puse în dosarele lor."
#~ msgid "Original Foldername"
#~ msgstr "Nume de Dosar Original"
#~ msgid "folder"
#~ msgstr "dosar"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Activează sortarea şi redenumirea fişierelor denumite după dată."
@@ -5342,13 +5433,6 @@ msgstr "Descărcare URL nereuşită; %s"
#~ msgid "Please enter a whole number."
#~ msgstr "Vă rugăm să introduceţi un număr întreg."
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "Pentru a descărca de pe usenet veţi avea nevoie de un furnizor. ISP-ul dvs. "
#~ "vă poate oferi acces, totuşi un furnizor premium e recomandat."
#~ msgid "This field is required."
#~ msgstr "Acest câmp este obligatoriu."
@@ -5401,9 +5485,6 @@ msgstr "Descărcare URL nereuşită; %s"
#~ msgid "Email Account Settings"
#~ msgstr "Setări Cont Email"
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "Nu aveţi un furnizor usenet? Vă recomandăm să încercaţi %s."
#~ msgid "Skip par2 checking when files are 100% valid."
#~ msgstr "Ignoră verificarea par2 când fişierele sunt complete 100%%."
@@ -5421,6 +5502,9 @@ msgstr "Descărcare URL nereuşită; %s"
#~ "Verifică rezultatul dezarhivării ( trebuie să fie dezactivat pentru unele "
#~ "sisteme de fișiere )"
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Fișier par2 invalid, nu pot verifica sau repara"
#~ msgid "Only for optional servers"
#~ msgstr "Doar pentru servere opționale"

View File

@@ -2,15 +2,15 @@ msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-0.7.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Pavel Maryanov <Unknown>\n"
"Language-Team: Russian <gmu@mx.ru>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"Generated-By: pygettext.py 1.5\n"
#: SABnzbd.py [Error message]
@@ -41,10 +41,22 @@ msgstr "Модуль _yenc... НЕ найден"
msgid "par2 binary... NOT found!"
msgstr "Исполняемый файл par2... НЕ найден"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "Исполняемый файл unrar... НЕ найден"
@@ -187,10 +199,6 @@ msgstr "Не удаётся создать временный файл для %s
msgid "Trying to set status of non-existing server %s"
msgstr "Попытка установить статус для несуществующего сервера %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Приостановка из-за нехватки места на диске"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Ошибка в tempfile.mkstemp"
@@ -213,15 +221,6 @@ msgstr "Тестовое уведомление"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Разрешение адреса"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ОШИБКА"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ПРЕДУПРЕЖДЕНИЕ"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ничего"
@@ -238,6 +237,10 @@ msgstr "неизвестно"
msgid "Failed to compile regex for search term: %s"
msgstr "Не удалось составить регулярное выражение поиска: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Приостановка из-за нехватки места на диске"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "На диске нет места Принудительная приостановка"
@@ -384,10 +387,6 @@ msgstr ""
msgid "SQL Command Failed, see log"
msgstr "Ошибка команды SQL (см. журнал)"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "Ошибка фиксации SQL (см. журнал)"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Не удалось закрыть базу данных (см. журнал)"
@@ -404,10 +403,6 @@ msgstr "Ошибка декодирования %s"
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "Ошибка CRC в %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Неверно сформированная статья yEnc в %s"
@@ -448,14 +443,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Не удаётся прочитать %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Не удалось добавить %s: удалён"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Ошибка удаления %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Не удаётся прочитать %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Не удаётся прочитать наблюдаемую папку %s"
@@ -551,6 +551,12 @@ msgstr "Не удалось разорвать соединение с почт
msgid "Email succeeded"
msgstr "Электронное письмо успешно отправлено"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr ""
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Не удаётся найти шаблонны электронных писем в %s"
@@ -646,7 +652,7 @@ msgstr ""
"Отсутствуют учётные данные. Введите в сторонней программе имя пользователя и "
"пароль из раздела «Настройка -> Общие»:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -714,14 +720,23 @@ msgstr "выкл."
msgid "Undefined server!"
msgstr ""
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Неправильный параметр"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Назад"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ОШИБКА"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -742,7 +757,7 @@ msgstr "ч"
msgid "m"
msgstr "м"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Не удаётся создать каталог %s"
@@ -762,10 +777,20 @@ msgstr "Не удалось переместить %s в %s"
msgid "Error creating SSL key and certificate"
msgstr "Не удалось создать ключ SSL и сертификат"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Не удаётся изменить права доступа %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Запуск сценария"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -941,6 +966,7 @@ msgstr "запуск исправления"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -970,18 +996,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Проверено за %s. Требуется исправление"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Главный пакет не найден..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Недопустимые PAR2-файлы. Нельзя выполнить проверку или исправление"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
"Ошибка исправления: недостаточно блоков восстановления (не хватает %s)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -991,6 +1008,11 @@ msgstr "загрузка %s блоков..."
msgid "Fetching"
msgstr "Загрузка"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr ""
"Ошибка исправления: недостаточно блоков восстановления (не хватает %s)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1016,6 +1038,10 @@ msgstr ""
msgid "Verifying"
msgstr "Проверка"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1079,11 +1105,6 @@ msgstr "Другие сообщения"
msgid "Not available"
msgstr ""
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr ""
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr ""
@@ -1092,7 +1113,7 @@ msgstr ""
msgid "Bad response from Pushover (%s): %s"
msgstr ""
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr ""
@@ -1180,12 +1201,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Приостановлен повторяющийся NZB-файл «%s»"
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr ""
@@ -1475,7 +1490,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Критическая ошибка"
@@ -1497,6 +1512,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr ""
@@ -1525,10 +1546,6 @@ msgstr "Ошибка переименования «%s» и «%s»"
msgid "Failed to move files"
msgstr "Не удалось переместить файлы"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Запуск сценария"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Запуск пользовательского сценария %s"
@@ -1549,7 +1566,7 @@ msgstr "Подробнее"
msgid "Post Processing Failed for %s (%s)"
msgstr "Ошибка пост-обработки для %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "см. журнал"
@@ -1861,6 +1878,14 @@ msgstr ""
msgid "Disable quota management"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Выкл."
@@ -2698,6 +2723,12 @@ msgstr "Пароль SABnzbd"
msgid "Optional authentication password."
msgstr "Необязательный пароль для входа."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -3156,6 +3187,16 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Отменить"
@@ -3426,7 +3467,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Число попыток"
@@ -3906,6 +3947,22 @@ msgstr ""
msgid "Device(s) to which message should be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr ""
@@ -4053,6 +4110,10 @@ msgstr "1x05 Эпизод Папка"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Эпизод Папка"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Название"
@@ -4122,8 +4183,8 @@ msgid "Original Filename"
msgstr "Исходное название файла"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Исходное название папки"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4141,10 +4202,6 @@ msgstr "текст"
msgid "file"
msgstr "файл"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "папка"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Строка сортировки"
@@ -4317,6 +4374,14 @@ msgstr ""
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ПРЕДУПРЕЖДЕНИЕ"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Загрузить"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Частота обновления"
@@ -4479,6 +4544,16 @@ msgstr ""
msgid "Pause for..."
msgstr "Приостановить на..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Обновить"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Сортировать по возрасту <small>от старых к новым</small>"
@@ -4535,10 +4610,6 @@ msgstr "Удалить историю?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Для работы Plush необходимо включить JavaScript"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Обновить"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Параметры"
@@ -4631,10 +4702,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr "Блокировать обновление при наведении мыши"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Загрузить"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Отправить"
@@ -4845,16 +4912,30 @@ msgstr ""
"Она распространяется по лицензии GNU GENERAL PUBLIC LICENSE версии 2 или (по "
"вашему выбору) любой более поздней версии.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"Для загрузки из сети Usenet требуется доступ к этой сети через "
"соответствующего поставщика услуг. Ваш поставщик услуг Интернета может "
"предоставить вам такой доступ, однако рекомендуется использовать usenet-"
"провайдеров класса Premium."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "У вас ещё нет поставщика услуг Usenet? Рекомендуем попробовать %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Не удалось получить сведения о ТВ (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Не удалось переименовать: %s в %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Не удалось переименовать похожий файл: %s в %s"
@@ -4892,6 +4973,12 @@ msgstr "Не удалось загрузить URL: %s"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "Папка «%s» не существует"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "Ошибка фиксации SQL (см. журнал)"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "Ошибка CRC в %s (%s -> %s)"
#~ msgid "Error: No secondary interface defined."
#~ msgstr "Ошибка: дополнительный интерфейс не определён."
@@ -4949,12 +5036,15 @@ msgstr "Не удалось загрузить URL: %s"
#~ msgid "Unpacking failed, these file(s) are missing:"
#~ msgstr "Ошибка распаковки: отсутствуют следующие файлы:"
#~ msgid "Main packet not found..."
#~ msgstr "Главный пакет не найден..."
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Недопустимые PAR2-файлы. Нельзя выполнить проверку или исправление"
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
#~ msgstr "Ошибка импорта модуля OpenSSL. Подключение НЕ ЧЕРЕЗ SSL"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Не удалось добавить %s: удалён"
#~ msgid ""
#~ "\n"
#~ " SABnzbd is not compatible with some software firewalls.<br>\n"
@@ -5294,6 +5384,12 @@ msgstr "Не удалось загрузить URL: %s"
#~ msgid "Enable if downloads are not put in their own folders."
#~ msgstr "Включите, если загрузки не размещаются в собственных папках."
#~ msgid "Original Foldername"
#~ msgstr "Исходное название папки"
#~ msgid "folder"
#~ msgstr "папка"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Позволяет сортировать и переименовывать файлы с датой в названии."
@@ -5366,18 +5462,6 @@ msgstr "Не удалось загрузить URL: %s"
#~ "Launch my internet browser with the SABnzbd page when the program starts."
#~ msgstr "Открывать веб-браузер со страницей SABnzbd при запуске программы."
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "Для загрузки из сети Usenet требуется доступ к этой сети через "
#~ "соответствующего поставщика услуг. Ваш поставщик услуг Интернета может "
#~ "предоставить вам такой доступ, однако рекомендуется использовать usenet-"
#~ "провайдеров класса Premium."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "У вас ещё нет поставщика услуг Usenet? Рекомендуем попробовать %s."
#~ msgid "This field is required."
#~ msgstr "Это поле обязательно для заполнения."

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: ОZZII <ozzii.translate@gmail.com>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2015-12-28 10:25+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,11 +43,23 @@ msgstr "_yenc modul... NIJE pronađen!"
msgid "par2 binary... NOT found!"
msgstr "par2 program...NIJE pronađen!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
"Verzija vašeg UNRAR-a je %s, mi preporučujemo verziju %s ili noviju.<br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "unrar program...NIJE pronađen!"
@@ -189,10 +201,6 @@ msgstr "Nemoguće kreiranje privremene datoteke za %s"
msgid "Trying to set status of non-existing server %s"
msgstr "Покушај постављања статуса за непостојећи сервер %s"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Premalo prostora na disku, prisiljena PAUZA"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Грешка у tempfile.mkstemp"
@@ -215,15 +223,6 @@ msgstr "Probno obaveštenje"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Решавање адресе"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ГРЕШКА:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ПАЖЊА:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ниједно"
@@ -240,6 +239,10 @@ msgstr "непознато"
msgid "Failed to compile regex for search term: %s"
msgstr "Neuspešna kompilacija regularne ekspresije za termin pretrage: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "Premalo prostora na disku, prisiljena PAUZA"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Disk je pun! Tera Pause"
@@ -388,10 +391,6 @@ msgstr "Baza dnevnika je oštećena, kreirana prazna zamena"
msgid "SQL Command Failed, see log"
msgstr "Neuspešna SQL komanda, videti izveštaj"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "Погрешно SQL извршавање, видети извештај"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Неуспешно затварање базе, видети извештај"
@@ -408,10 +407,6 @@ msgstr "Dešifrovanje %s neuspešno"
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "CRC грешка у %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Лоше формиран yEnc артикал у %s"
@@ -452,14 +447,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Неуспешно читање %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Грешка додавања %s, уклањање"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Greška pri uklanjanju %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Неуспешно читање %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Неуспешно читање надгледане фасцикле %s"
@@ -556,6 +556,12 @@ msgstr "Неуспешно затварање везе е-поште"
msgid "Email succeeded"
msgstr "Упешно слање е-поште"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Nemoguće poslati, nedostaju obavezni podaci"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Немогуће наћи модел е-поруке у %s"
@@ -646,7 +652,7 @@ msgstr ""
"Недостаје аутентификација, унети у спољни програм име/лозинку из Подешавања-"
">Опште:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -716,14 +722,23 @@ msgstr "искљ."
msgid "Undefined server!"
msgstr "Server nije definisan!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Погрешан параметар"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Назад"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "ГРЕШКА:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -744,7 +759,7 @@ msgstr "с"
msgid "m"
msgstr "м"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Немогуће креирати фасциклу %s"
@@ -764,10 +779,20 @@ msgstr "Neuspešno premeštanje %s u %s"
msgid "Error creating SSL key and certificate"
msgstr "Грешка креације SSL кључа и сертификата"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Не може да се промене дозволе од %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Покретање скрипта"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -943,6 +968,7 @@ msgstr "Покретање пооправљања"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr "Par provera neuspešna na %s, dok je QuickCheck uspešan!"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -972,17 +998,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Проверено за %s, потребна је поправка"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Главни пакет није нађен..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Погрешне par2 дат., не може да се провери/поправи"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Погрешна поправка, нема довољно блокова за поправку (фали %s)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -992,6 +1010,10 @@ msgstr "Учитавање %s блокова..."
msgid "Fetching"
msgstr "Добављам"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "Погрешна поправка, нема довољно блокова за поправку (фали %s)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1017,6 +1039,10 @@ msgstr "Диск је пун"
msgid "Verifying"
msgstr "Проверавање"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1080,11 +1106,6 @@ msgstr "Остале поруке"
msgid "Not available"
msgstr "Недоступно"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Nemoguće poslati, nedostaju obavezni podaci"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Неуспешно слање Prowl поруке"
@@ -1093,7 +1114,7 @@ msgstr "Неуспешно слање Prowl поруке"
msgid "Bad response from Pushover (%s): %s"
msgstr "Neodgovarajući odgovor od strane Pushover (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Neuspešno slanje Pushover poruke"
@@ -1181,12 +1202,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Паузирам због дуплог NZB-а \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Поништено, не може да се заврши"
@@ -1469,7 +1484,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Фатална грешка"
@@ -1491,6 +1506,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr "Преузимање је можда погрешно. има %s од потребних %s"
@@ -1519,10 +1540,6 @@ msgstr "Грешка преименовања \"%s\" у \"%s\""
msgid "Failed to move files"
msgstr "Неуспешно премештање датотека"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Покретање скрипта"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Покретање скрипта %s"
@@ -1543,7 +1560,7 @@ msgstr "Више"
msgid "Post Processing Failed for %s (%s)"
msgstr "Грешка пост-процесирања за %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "видети извештај"
@@ -1855,6 +1872,14 @@ msgstr "Омогући управљање квота"
msgid "Disable quota management"
msgstr "Онемогући управљање квота"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Искључено"
@@ -2690,6 +2715,12 @@ msgstr "Лозинка SABnzbd-а"
msgid "Optional authentication password."
msgstr "Лозинка за аутентификацију (опционо)"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -3149,6 +3180,16 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Одбаци"
@@ -3418,7 +3459,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Макс покушаја"
@@ -3892,6 +3933,22 @@ msgstr "Uređaj(i)"
msgid "Device(s) to which message should be sent"
msgstr "Uređaj(i) na koje bi poruke trebale biti poslate"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4039,6 +4096,10 @@ msgstr "1x05 Фасцикла епизоде"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Фасцикла епизоде"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Наслов"
@@ -4108,8 +4169,8 @@ msgid "Original Filename"
msgstr "Оригинално име датотеке"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Оригинално име фасцикле"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4127,10 +4188,6 @@ msgstr "текст"
msgid "file"
msgstr "датотека"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "фасцикла"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Уреди низ"
@@ -4304,6 +4361,14 @@ msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr ""
"U slučaju ponovnog pokretanja SABnzbd-a ovaj prozor će nestati automatski!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "ПАЖЊА:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Преузми"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Брзина освежавања"
@@ -4466,6 +4531,16 @@ msgstr "Žao nam je, nismo mogli to da interpretiramo. Pokušajte ponovo."
msgid "Pause for..."
msgstr "Паузирај за..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Освежи"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Среди по старост <small>Старије&rarr;Новије</small>"
@@ -4522,10 +4597,6 @@ msgstr "Очисти хронологију?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "За функционисање Plush-а упалите JavaScript!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Освежи"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Опције"
@@ -4616,10 +4687,6 @@ msgstr "При прелазу миша преко рада, зауставља
msgid "Block Refreshes on Hover"
msgstr "Блокирати обнове на прелаз миша"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Преузми"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Слање"
@@ -4828,16 +4895,28 @@ msgstr ""
"Лиценциран је под GNU GENERAL PUBLIC LICENSE верзија 2 или (по вашем избору) "
"касније верзије.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"За преузимање са 'usenet' треба Вам приступ привајдеру. Можда Вам Ваш ISP "
"пружа приступ, било како премијум провајдер је препоручен."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Немате 'usenet' провајдер? Препоручујемо Вам %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Грешка преузимању ТВ инфо (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Неуспешно преименовање : %s у %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Неуспешно преименовање сличне датотеке: %s у %s"
@@ -4890,9 +4969,6 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgid "This field is required."
#~ msgstr "Ово поље је обавезно."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "Немате 'usenet' провајдер? Препоручујемо Вам %s."
#~ msgid "Access"
#~ msgstr "Приступ"
@@ -4944,6 +5020,12 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Упали сређивање и преименовање датотеке са датумом"
#~ msgid "folder"
#~ msgstr "фасцикла"
#~ msgid "Original Foldername"
#~ msgstr "Оригинално име фасцикле"
#~ msgid "Enable generic sorting and renaming of files."
#~ msgstr "Упали генерално сортирање/преименовање датотеке."
@@ -5145,6 +5227,12 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "фасцикла \"%s\" не постоји"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "Погрешно SQL извршавање, видети извештај"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "CRC грешка у %s (%s -> %s)"
#~ msgid "Not matched"
#~ msgstr "Не одговара"
@@ -5157,9 +5245,6 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgid "You have no permisson to use port %s"
#~ msgstr "Није Вам дозвољено да користите порт %s"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Грешка додавања %s, уклањање"
#~ msgid "Initiating restart...<br />"
#~ msgstr "Иницирање поновног покретања...<br />"
@@ -5197,6 +5282,9 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgid "Unpacking failed, these file(s) are missing:"
#~ msgstr "Неуспешан издвој, ове датотеке недостају:"
#~ msgid "Main packet not found..."
#~ msgstr "Главни пакет није нађен..."
#~ msgid "KB/s"
#~ msgstr "КБ/с"
@@ -5231,6 +5319,9 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgstr ""
#~ "Провери резултат издвоја (треба да се угаси за неке системе датотеке)."
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Погрешне par2 дат., не може да се провери/поправи"
#~ msgid "Only for optional servers"
#~ msgstr "Само за опционе сервере"
@@ -5339,13 +5430,6 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ "Launch my internet browser with the SABnzbd page when the program starts."
#~ msgstr "Покрени мој претраживач са SABnzbd листом при покретању."
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "За преузимање са 'usenet' треба Вам приступ привајдеру. Можда Вам Ваш ISP "
#~ "пружа приступ, било како премијум провајдер је препоручен."
#~ msgid ""
#~ "After SABnzbd has finished restarting you will be able to access it at the "
#~ "following location: %s"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2016-02-20 20:34+0000\n"
"Last-Translator: shypike <Unknown>\n"
"Language-Team: Swedish <sv@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,11 +43,23 @@ msgstr "_yenc modul... EJ funnen!"
msgid "par2 binary... NOT found!"
msgstr "par2 binär... EJ funnen!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr ""
"Din UNRAR version är %s, vi rekommenderar version %s eller högre.<br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "unrar binär... EJ funnen!"
@@ -190,10 +202,6 @@ msgstr "Kan inte skapa temp -fil för %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/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "För lite diskutrymme pausar systemet"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "Fel i tempfile.mkstemp"
@@ -216,15 +224,6 @@ msgstr "Testa notifikation"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;Lösa adress"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEL:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "VARNING:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "Ingen"
@@ -241,6 +240,10 @@ msgstr "okänd"
msgid "Failed to compile regex for search term: %s"
msgstr "Det gick inte att kompilera regex för sök-sträng: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "För lite diskutrymme pausar systemet"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "Disken är full! Pausar..."
@@ -389,10 +392,6 @@ msgstr "Skadad hitsotrikdatabas, skapade en tom ersättare"
msgid "SQL Command Failed, see log"
msgstr "SQL Kommando misslyckades, se logg"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "SQL Commit misslyckades, se logg"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "Det gick inte att stänga databasen, se logg"
@@ -409,10 +408,6 @@ msgstr "Avkodning av %s misslyckades"
msgid "Decoder failure: Out of memory"
msgstr ""
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "CRC Fel i %s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "Felaktigt utformad yEnc artikel i %s"
@@ -453,14 +448,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "Kan ej läsa %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "Det gick inte att lägga till %s, tar bort"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "Fel vid borttagning av %s"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "Kan ej läsa %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "Kan ej läsa övervakad mapp %s"
@@ -556,6 +556,12 @@ msgstr "Det gick inte att stänga e-mail anslutning"
msgid "Email succeeded"
msgstr "E-mail sändning lyckades"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Kunde inte skicka, saknar nödvändig data"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "Kan ej finna e-mail mallar i %s"
@@ -649,7 +655,7 @@ msgstr ""
"Autentisering saknas, ange användarnamn / lösenord från Konfiguration-> "
"Allmänt i ditt tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -720,14 +726,23 @@ msgstr "av"
msgid "Undefined server!"
msgstr "Odefinerad server!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "Fel parameter"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "Bakåt"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "FEL:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -748,7 +763,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Kan ej skapa mapp %s"
@@ -768,10 +783,20 @@ msgstr "Det gick inte att flyta %s till %s"
msgid "Error creating SSL key and certificate"
msgstr "Det gick inte att skapa SSL-nyckel eller certifikat."
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "Det gick inte att ändra rättigheter på %s"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "Kör skript"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -947,6 +972,7 @@ msgstr "Startar reparation"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr "Par verifiering misslyckades på %s, medans QuickCheck lyckades!"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -976,18 +1002,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verifiering i %s, kräver reparation"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "Huvudarkiv saknas..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "Korrupta par2 filer, kan inte verifiera eller reparera"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
"Misslyckad reparation, finns ej tillräckligt med reparationsblock (%s saknas)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -997,6 +1014,11 @@ msgstr "Hämtar %s block..."
msgid "Fetching"
msgstr "Hämtar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr ""
"Misslyckad reparation, finns ej tillräckligt med reparationsblock (%s saknas)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1022,6 +1044,10 @@ msgstr "Disken är full"
msgid "Verifying"
msgstr "Verifierar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1085,11 +1111,6 @@ msgstr "Andra meddelanden"
msgid "Not available"
msgstr "Ej tillgänglig"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "Kunde inte skicka, saknar nödvändig data"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "Misslyckades att skicka Prowlmeddelande"
@@ -1098,7 +1119,7 @@ msgstr "Misslyckades att skicka Prowlmeddelande"
msgid "Bad response from Pushover (%s): %s"
msgstr "Dålig respons från Pushover (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Misslyckades att skicka pushovermeddelande"
@@ -1186,12 +1207,6 @@ msgstr ""
msgid "Pausing duplicate NZB \"%s\""
msgstr "Pausar dubblett för NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "Avbrutet, kan inte slutföras"
@@ -1479,7 +1494,7 @@ msgid ""
"SABnzbd is already running."
msgstr ""
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "Allvarligt fel"
@@ -1501,6 +1516,12 @@ msgid ""
"size to 4GB"
msgstr ""
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr ""
@@ -1530,10 +1551,6 @@ msgstr "Det gick inte att döpa om \"%s\" till \"%s\""
msgid "Failed to move files"
msgstr "Misslyckades med att flytta filer"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "Kör skript"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "Kör användarskript %s"
@@ -1554,7 +1571,7 @@ msgstr "Mer"
msgid "Post Processing Failed for %s (%s)"
msgstr "Efterbehandling misslyckades för %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "se loggfil"
@@ -1866,6 +1883,14 @@ msgstr "Aktivera kvothantering"
msgid "Disable quota management"
msgstr "Avaktivera kvothantering"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "Av"
@@ -2703,6 +2728,12 @@ msgstr "SABnzbd Lösenord"
msgid "Optional authentication password."
msgstr "Väljbart autentiserings lösenord."
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr ""
@@ -3161,6 +3192,16 @@ msgid ""
"items in your History)"
msgstr ""
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "Kasta"
@@ -3433,7 +3474,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Max antal omförsök"
@@ -3907,6 +3948,22 @@ msgstr "Enhet(er)"
msgid "Device(s) to which message should be sent"
msgstr "Enhet(er) där medellandet skall skickas"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -4054,6 +4111,10 @@ msgstr "1x05 Episodmapp"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodmapp"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4123,8 +4184,8 @@ msgid "Original Filename"
msgstr "Originalfilnamn"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Ursprungliga mappnamnet"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4142,10 +4203,6 @@ msgstr "text"
msgid "file"
msgstr "fil"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "mapp"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteringssträng"
@@ -4318,6 +4375,14 @@ msgstr "Förlorade förbindelse till SABnzbd.."
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "Om SABnzbd startar om kommer denna skärm att försvinna automatiskt!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "VARNING:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Hämta"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "Uppdateringsfrekvens"
@@ -4480,6 +4545,16 @@ msgstr "Tyvärr, vi kunde inte tolka det. Försök igen."
msgid "Pause for..."
msgstr "Pausa i..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "Uppdatera"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Sortera efter ålder <small>Äldst&rarr;Nyast</small>"
@@ -4536,10 +4611,6 @@ msgstr "Vill du verkligen tömma historiken?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "Du måste aktivera JavaScript för Plush ska fungera!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "Uppdatera"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "Alternativ"
@@ -4632,10 +4703,6 @@ msgstr ""
msgid "Block Refreshes on Hover"
msgstr "Block uppdaterar vid svävande"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "Hämta"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "Ladda upp"
@@ -4846,16 +4913,29 @@ msgstr ""
"Det är licensierat under GNU GENERAL PUBLIC LICENSE Version 2 eller (ditt "
"val) en senare version.\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr ""
"För att ladda ner från usenet du behöver tillgång till en leverantör. Din "
"internetleverantör kan ge dig tillgång, men en premie leverantör "
"rekommenderas."
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Har du inte någon usenet leverantör? Vi rekommenderar att prova %s."
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Det gick inte att hämta TV info (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Det gick inte att döpa om: %s till %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Det gick inte att döpa om liknande fil: %s till %s"
@@ -4890,6 +4970,12 @@ msgstr "URL hämtning misslyckades; %s"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "Mappen \"%s\" finns inte"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "SQL Commit misslyckades, se logg"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "CRC Fel i %s (%s -> %s)"
#~ msgid "Error: No secondary interface defined."
#~ msgstr "Fel: Inget andrainterface definierat."
@@ -4945,12 +5031,12 @@ msgstr "URL hämtning misslyckades; %s"
#~ msgid "Unpacking failed, an expected file was not unpacked"
#~ msgstr "Uppackning misslyckades, en väntad fil är inte uppackad"
#~ msgid "Main packet not found..."
#~ msgstr "Huvudarkiv saknas..."
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
#~ msgstr "Misslyckades med importering av OpenSSL modul. Ansluter utan SSL"
#~ msgid "Error while adding %s, removing"
#~ msgstr "Det gick inte att lägga till %s, tar bort"
#~ msgid "Failed to remove nzo from postproc queue (id)"
#~ msgstr "Det gick inte att ta bort nzo från efterbehandlings kön (id)"
@@ -5241,17 +5327,6 @@ msgstr "URL hämtning misslyckades; %s"
#~ "Launch my internet browser with the SABnzbd page when the program starts."
#~ msgstr "Starta webbläsaren med SABnzbd's sida när programet startas."
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr ""
#~ "För att ladda ner från usenet du behöver tillgång till en leverantör. Din "
#~ "internetleverantör kan ge dig tillgång, men en premie leverantör "
#~ "rekommenderas."
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "Har du inte någon usenet leverantör? Vi rekommenderar att prova %s."
#~ msgid "This field is required."
#~ msgstr "Detta fält krävs."
@@ -5273,6 +5348,9 @@ msgstr "URL hämtning misslyckades; %s"
#~ msgid "Step Five"
#~ msgstr "Steg fem"
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Korrupta par2 filer, kan inte verifiera eller reparera"
#~ msgid "Unpacking failed, these file(s) are missing:"
#~ msgstr "Uppackning misslyckades, dessa filer saknas:"
@@ -5390,6 +5468,12 @@ msgstr "URL hämtning misslyckades; %s"
#~ msgid "Groups / Indexer tags"
#~ msgstr "Grupper/Indexering-tagg"
#~ msgid "folder"
#~ msgstr "mapp"
#~ msgid "Original Foldername"
#~ msgstr "Ursprungliga mappnamnet"
#~ msgid "E.g. 119 or 563 for SSL"
#~ msgstr "T.ex. 119 eller 563 för SSL"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-06-22 07:06+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,10 +43,22 @@ msgstr "_yenc 模块... *未* 找到!"
msgid "par2 binary... NOT found!"
msgstr "par2 可执行程序... *未* 找到!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
msgstr "您的 UNRAR 程序版本为 %s我们建议使用 %s 或更高版本。<br />"
#: SABnzbd.py [Error message]
msgid "Downloads will not unpacked."
msgstr ""
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
msgstr "unrar 可执行程序... *未* 找到"
@@ -186,10 +198,6 @@ msgstr "无法为 %s 创建临时文件"
msgid "Trying to set status of non-existing server %s"
msgstr "正在尝试设置不存在的服务器 %s 的状态"
#: sabnzbd/__init__.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "磁盘空间过低,强制 *暂停*"
#: sabnzbd/__init__.py [Error message]
msgid "Failure in tempfile.mkstemp"
msgstr "tempfile.mkstemp 出错"
@@ -212,15 +220,6 @@ msgstr "测试通知"
msgid "&nbsp;Resolving address"
msgstr "&nbsp;正在解析地址"
#: sabnzbd/api.py # sabnzbd/api.py # sabnzbd/interface.py
#: sabnzbd/skintext.py
msgid "ERROR:"
msgstr "错误:"
#: sabnzbd/api.py # sabnzbd/skintext.py
msgid "WARNING:"
msgstr "警告:"
#: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files]
msgid "None"
msgstr "无"
@@ -237,6 +236,10 @@ msgstr "未知"
msgid "Failed to compile regex for search term: %s"
msgstr "为搜索关键词编译正则表达式失败: %s"
#: sabnzbd/assembler.py [Warning message]
msgid "Too little diskspace forcing PAUSE"
msgstr "磁盘空间过低,强制 *暂停*"
#: sabnzbd/assembler.py [Error message]
msgid "Disk full! Forcing Pause"
msgstr "磁盘已满! 强制暂停"
@@ -383,10 +386,6 @@ msgstr "“历史记录”数据库已损坏,已创建空数据库代替"
msgid "SQL Command Failed, see log"
msgstr "SQL 命令执行失败,参见日志"
#: sabnzbd/database.py [Error message]
msgid "SQL Commit Failed, see log"
msgstr "SQL 保存失败,参见日志"
#: sabnzbd/database.py [Error message]
msgid "Failed to close database, see log"
msgstr "无法关闭数据库,参见日志"
@@ -403,10 +402,6 @@ msgstr "%s 解码失败"
msgid "Decoder failure: Out of memory"
msgstr "解码器失败:内存不足"
#: sabnzbd/decoder.py
msgid "CRC Error in %s (%s -> %s)"
msgstr "CRC 错误:%s (%s -> %s)"
#: sabnzbd/decoder.py
msgid "Badly formed yEnc article in %s"
msgstr "yEnc 文章格式错误:%s"
@@ -447,14 +442,19 @@ msgid ""
"time. Only works for jobs that do not need repair."
msgstr ""
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message]
msgid "Cannot read %s"
msgstr "无法读取 %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error while adding %s, removing"
msgstr "加载 %s 出错,正在移除"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Error removing %s"
msgstr "移除 %s 时出错"
#: sabnzbd/dirscanner.py [Warning message]
msgid "Cannot read %s"
msgstr "无法读取 %s"
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr "无法读取监视文件夹 %s"
@@ -550,6 +550,12 @@ msgstr "无法关闭邮件连接"
msgid "Email succeeded"
msgstr "成功发送电子邮件"
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
#: sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "无法发送,缺少必要的数据"
#: sabnzbd/emailer.py [Error message]
msgid "Cannot find email templates in %s"
msgstr "无法找到 email 模板:%s"
@@ -636,7 +642,7 @@ msgid ""
"into your 3rd party program:"
msgstr "缺身份认证信息,请在第三方程序中输入“配置”->“常规”中的用户名/密码:"
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
#: sabnzbd/interface.py [Warning message]
msgid ""
"Try our new skin Glitter! Fresh new design that is optimized for desktop and "
"mobile devices. Go to Config -> General to change your skin."
@@ -703,14 +709,23 @@ msgstr "关"
msgid "Undefined server!"
msgstr "未定义服务器!"
#: sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Incorrect parameter"
msgstr "参数不正确"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
msgstr "返回"
#: sabnzbd/interface.py # sabnzbd/skintext.py
msgid "ERROR:"
msgstr "错误:"
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
#: sabnzbd/interface.py # sabnzbd/interface.py
@@ -731,7 +746,7 @@ msgstr "小时"
msgid "m"
msgstr "分钟"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "无法创建目录 %s"
@@ -751,10 +766,20 @@ msgstr "将 %s 移动到 %s 失败"
msgid "Error creating SSL key and certificate"
msgstr "创建 SSL key 及证书出错"
#: sabnzbd/misc.py [Warning message]
msgid ""
"Your password file contains more than 30 passwords, testing all these "
"passwords takes a lot of time. Try to only list useful passwords."
msgstr ""
#: sabnzbd/misc.py [Error message]
msgid "Cannot change permissions of %s"
msgstr "无法更改 %s 的权限"
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
msgid "Running script"
msgstr "正在执行脚本"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/postproc.py
@@ -930,6 +955,7 @@ msgstr "正在开始修复"
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr "Par 验证失败:%s但快速检查成功!"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
@@ -957,17 +983,9 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] 验证耗时 %s需要修复"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Main packet not found..."
msgstr "主数据包未找到..."
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files, cannot verify or repair"
msgstr "par2 文件无效,无法验证或修复"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "修复失败,修复块不足 (缺 %s 块)"
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -977,6 +995,10 @@ msgstr "正在装取 %s 块..."
msgid "Fetching"
msgstr "正在装取"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repair failed, not enough repair blocks (%s short)"
msgstr "修复失败,修复块不足 (缺 %s 块)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Repairing"
@@ -1002,6 +1024,10 @@ msgstr "磁盘空间已满"
msgid "Verifying"
msgstr "正在验证"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Checking extra files"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
msgid "Checking"
@@ -1065,11 +1091,6 @@ msgstr "其他信息"
msgid "Not available"
msgstr "不可用"
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
msgid "Cannot send, missing required data"
msgstr "无法发送,缺少必要的数据"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send Prowl message"
msgstr "无法发送 Prowl 消息"
@@ -1078,7 +1099,7 @@ msgstr "无法发送 Prowl 消息"
msgid "Bad response from Pushover (%s): %s"
msgstr "Pushover 响应异常 (%s): %s"
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "无法发送 pushover 信息"
@@ -1166,12 +1187,6 @@ msgstr "重复的 NZB 文件"
msgid "Pausing duplicate NZB \"%s\""
msgstr "正在暂停重复 NZB \"%s\""
#: sabnzbd/nzbstuff.py [Warning message]
msgid ""
"%d files with duplicate filenames were discared for \"%s\". Enable "
"\"allow_duplicate_files\" to allow duplicate filenames."
msgstr ""
#: sabnzbd/nzbstuff.py
msgid "Aborted, cannot be completed"
msgstr "已中止,无法完成"
@@ -1453,7 +1468,7 @@ msgid ""
"SABnzbd is already running."
msgstr "绑定端口 %s 在 %s 上失败。其它的程序正在使用此端口或者说 SABnzbd 正在运行。"
#: sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "致命错误"
@@ -1475,6 +1490,12 @@ msgid ""
"size to 4GB"
msgstr "已完成文件夹 %s 位于 FAT 文件系统上,这样会有最大文件为 4GB 的限制。"
#: sabnzbd/postproc.py [Warning message]
msgid ""
"Module subprocessww missing. Expect problems with Unicoded file and "
"directory names in downloads."
msgstr ""
#: sabnzbd/postproc.py
msgid "Download might fail, only %s of required %s available"
msgstr "下载可能会失败,只有 %s 块 (需要 %s) 可用"
@@ -1503,10 +1524,6 @@ msgstr "将 \"%s\" 重命名为 \"%s\" 出错"
msgid "Failed to move files"
msgstr "移动文件失败"
#: sabnzbd/postproc.py
msgid "Running script"
msgstr "正在执行脚本"
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr "正在执行用户脚本 %s"
@@ -1527,7 +1544,7 @@ msgstr "更多"
msgid "Post Processing Failed for %s (%s)"
msgstr "后期处理失败:%s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "查看日志文件"
@@ -1839,6 +1856,14 @@ msgstr "启用配额管理"
msgid "Disable quota management"
msgstr "禁用配额管理"
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Pause jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Config->Scheduler]
msgid "Resume jobs with category"
msgstr ""
#: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates]
msgid "Off"
msgstr "关"
@@ -2670,6 +2695,12 @@ msgstr "SABnzbd 密码"
msgid "Optional authentication password."
msgstr "可选身份验证密码。"
#: sabnzbd/skintext.py
msgid ""
"If the SABnzbd Host or Port is exposed to the internet, your current "
"settings allow full external access to the SABnzbd interface."
msgstr ""
#: sabnzbd/skintext.py
msgid "Security"
msgstr "安全"
@@ -3102,6 +3133,16 @@ msgid ""
"items in your History)"
msgstr "在剧目中检测相同的剧集 (基于您的历史项目,参照 \"name/season/episode\" 的规则)"
#: sabnzbd/skintext.py
msgid "Allow proper releases"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"Bypass series duplicate detection if PROPER, REAL or REPACK is detected in "
"the download name"
msgstr ""
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Discard"
msgstr "舍弃"
@@ -3363,7 +3404,7 @@ msgstr "SSL 加密算法"
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr "降低 SSL 的加密难度以便获得更高的性能。"
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "最多重试次数"
@@ -3834,6 +3875,22 @@ msgstr "设备"
msgid "Device(s) to which message should be sent"
msgstr "信息发送的目标设备"
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency retry"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How often (in seconds) the same notification will be sent"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "Emergency expire"
msgstr ""
#: sabnzbd/skintext.py [Pushover settings]
msgid "How many seconds your notification will continue to be retried"
msgstr ""
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
msgid "Pushbullet"
msgstr "Pushbullet"
@@ -3982,6 +4039,10 @@ msgstr "1x05 剧集文件夹"
msgid "S01E05 Episode Folder"
msgstr "S01E05 剧集文件夹"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "标题"
@@ -4051,8 +4112,8 @@ msgid "Original Filename"
msgstr "原始文件名"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "原始文件夹名"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4070,10 +4131,6 @@ msgstr "text"
msgid "file"
msgstr "文件"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "文件夹"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "排序字串"
@@ -4244,6 +4301,14 @@ msgstr "失去与 SABnzbd 的连接.."
msgid "In case of SABnzbd restart this screen will disappear automatically!"
msgstr "SABnzbd 重启后本画面将自动消失!"
#: sabnzbd/skintext.py
msgid "WARNING:"
msgstr "警告:"
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "装取"
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh rate"
msgstr "刷新频率"
@@ -4406,6 +4471,16 @@ msgstr "抱歉,无法理解您的输入。请重试。"
msgid "Pause for..."
msgstr "暂停..."
#: sabnzbd/skintext.py # sabnzbd/skintext.py
msgid "Refresh"
msgstr "刷新"
#: sabnzbd/skintext.py
msgid ""
"All usernames, passwords and API-keys are automatically removed from the log "
"and the included copy of your settings."
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "按发布时间排序 <small>最早&rarr;最新</small>"
@@ -4462,10 +4537,6 @@ msgstr "清空历史?"
msgid "You must enable JavaScript for Plush to function!"
msgstr "您必须启用 JavaScript 才能使用 Plush 模板!"
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr "刷新"
#: sabnzbd/skintext.py
msgid "Options"
msgstr "选项"
@@ -4556,10 +4627,6 @@ msgstr "这将在您的鼠标指针处于队列上方时阻止内容刷新。"
msgid "Block Refreshes on Hover"
msgstr "指向时停止刷新"
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
msgid "Fetch"
msgstr "装取"
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
msgid "Upload"
msgstr "上传"
@@ -4764,16 +4831,26 @@ msgstr ""
"这是一款自由软件,欢迎您在约定的条件下传播。\n"
"本软件依 GNU GENERAL PUBLIC LICENSE 第 2 版或 (若您愿意) 任意较新版本授权。\n"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/skintext.py
msgid ""
"In order to download from usenet you will require access to a provider. Your "
"ISP may provide you with access, however a premium provider is recommended."
msgstr "要从 usenet 下载您需要有一家提供商的访问权限。您的 ISP 可能会为您提供权限,但推荐您选用付费的高级提供商。"
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "还没有 usenet 提供商r? 我们推荐试试 %s。"
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "获取 TV 信息出错 (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "重命名失败: %s 为 %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "重命名相似文件失败: %s 为 %s"
@@ -4811,6 +4888,12 @@ msgstr "URL 装取失败; %s"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "文件夹 \"%s\" 不存在"
#~ msgid "SQL Commit Failed, see log"
#~ msgstr "SQL 保存失败,参见日志"
#~ msgid "CRC Error in %s (%s -> %s)"
#~ msgstr "CRC 错误:%s (%s -> %s)"
#~ msgid "Error: No secondary interface defined."
#~ msgstr "错误: 未定义第二界面。"
@@ -4864,12 +4947,15 @@ msgstr "URL 装取失败; %s"
#~ msgid "Unpacking failed, these file(s) are missing:"
#~ msgstr "解压失败,缺这些文件:"
#~ msgid "Main packet not found..."
#~ msgstr "主数据包未找到..."
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "par2 文件无效,无法验证或修复"
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
#~ msgstr "导入 OpenSSL 模块出错。正在通过非 SSL 连接"
#~ msgid "Error while adding %s, removing"
#~ msgstr "加载 %s 出错,正在移除"
#~ msgid ""
#~ "\n"
#~ " SABnzbd is not compatible with some software firewalls.<br>\n"
@@ -5193,6 +5279,12 @@ msgstr "URL 装取失败; %s"
#~ msgid "Enable if downloads are not put in their own folders."
#~ msgstr "启用可将下载内容存放在各自的文件夹。"
#~ msgid "Original Foldername"
#~ msgstr "原始文件夹名"
#~ msgid "folder"
#~ msgstr "文件夹"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "启用按日期命名的文件的排序与重命名。"
@@ -5263,14 +5355,6 @@ msgstr "URL 装取失败; %s"
#~ "Launch my internet browser with the SABnzbd page when the program starts."
#~ msgstr "程序启动时启动互联网浏览器打开 SABnzbd 页面。"
#~ msgid ""
#~ "In order to download from usenet you will require access to a provider. Your "
#~ "ISP may provide you with access, however a premium provider is recommended."
#~ msgstr "要从 usenet 下载您需要有一家提供商的访问权限。您的 ISP 可能会为您提供权限,但推荐您选用付费的高级提供商。"
#~ msgid "Don't have a usenet provider? We recommend trying %s."
#~ msgstr "还没有 usenet 提供商r? 我们推荐试试 %s。"
#~ msgid "This field is required."
#~ msgstr "该字段必填。"

View File

@@ -105,9 +105,10 @@ from sabnzbd.bpsmeter import BPSMeter
import sabnzbd.cfg as cfg
import sabnzbd.database
import sabnzbd.lang as lang
import sabnzbd.par2file as par2file
import sabnzbd.api
import sabnzbd.directunpacker as directunpacker
from sabnzbd.decorators import synchronized, notify_downloader
from sabnzbd.decorators import synchronized
from sabnzbd.constants import NORMAL_PRIORITY, VALID_ARCHIVES, \
REPAIR_REQUEST, QUEUE_FILE_NAME, QUEUE_VERSION, QUEUE_FILE_TMPL
import sabnzbd.getipaddress as getipaddress
@@ -277,7 +278,7 @@ def initialize(pause_downloader=False, clean_up=False, evalSched=False, repair=0
sabnzbd.encoding.change_fsys(cfg.fsys_type())
# Set cache limit
if not cfg.cache_limit() or (cfg.cache_limit() == '200M' and (sabnzbd.WIN32 or sabnzbd.DARWIN)):
if not cfg.cache_limit() or (cfg.cache_limit() in ('200M', '450M') and (sabnzbd.WIN32 or sabnzbd.DARWIN)):
cfg.cache_limit.set(misc.get_cache_limit())
ArticleCache.do.new_limit(cfg.cache_limit.get_int())
@@ -319,15 +320,16 @@ def initialize(pause_downloader=False, clean_up=False, evalSched=False, repair=0
paused = BPSMeter.do.read()
PostProcessor()
NzbQueue()
Downloader(pause_downloader or paused)
Assembler()
NzbQueue.do.read_queue(repair)
PostProcessor()
Downloader(pause_downloader or paused)
NzbQueue.do.read_queue(repair)
DirScanner()
@@ -546,7 +548,13 @@ def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None):
if cat and cat.lower() == 'default':
cat = None
logging.info('Fetching %s', url)
# Add feed name if it came from RSS
msg = T('Trying to fetch NZB from %s') % url
if nzbname:
msg = '%s - %s' % (nzbname, msg)
# Generate the placeholder
future_nzo = NzbQueue.do.generate_future(msg, pp, script, cat, url=url, priority=priority, nzbname=nzbname)
URLGrabber.do.add(url, future_nzo)
return future_nzo.nzo_id
@@ -598,27 +606,22 @@ def backup_nzb(filename, data):
def save_compressed(folder, filename, data):
""" Save compressed NZB file in folder """
# Need to go to the save folder to
# prevent the pathname being embedded in the GZ file
here = os.getcwd()
os.chdir(folder)
if filename.endswith('.nzb'):
filename += '.gz'
else:
filename += '.nzb.gz'
logging.info("Backing up %s", os.path.join(folder, filename))
try:
f = gzip.GzipFile(filename, 'wb')
f.write(data)
f.flush()
f.close()
# Have to get around the path being put inside the tgz
with open(os.path.join(folder, filename), 'wb') as tgz_file:
f = gzip.GzipFile(filename, fileobj=tgz_file)
f.write(data)
f.flush()
f.close()
except:
logging.error(T('Saving %s failed'), os.path.join(folder, filename))
logging.info("Traceback: ", exc_info=True)
os.chdir(here)
##############################################################################
# Unsynchronized methods
@@ -863,6 +866,7 @@ def get_new_id(prefix, folder, check_list=None):
except:
logging.error(T('Failure in tempfile.mkstemp'))
logging.info("Traceback: ", exc_info=True)
break
# Cannot create unique id, crash the process
raise IOError
@@ -870,7 +874,7 @@ def get_new_id(prefix, folder, check_list=None):
def save_data(data, _id, path, do_pickle=True, silent=False):
""" Save data to a diskfile """
if not silent:
logging.debug("Saving data for %s in %s", _id, path)
logging.debug('[%s] Saving data for %s in %s', misc.caller_name(), _id, path)
path = os.path.join(path, _id)
# We try 3 times, to avoid any dict or access problems
@@ -902,11 +906,11 @@ def load_data(_id, path, remove=True, do_pickle=True, silent=False):
path = os.path.join(path, _id)
if not os.path.exists(path):
logging.info("%s missing", path)
logging.info("[%s] %s missing", misc.caller_name(), path)
return None
if not silent:
logging.debug("Loading data for %s from %s", _id, path)
logging.debug("[%s] Loading data for %s from %s", misc.caller_name(), _id, path)
try:
with open(path, 'rb') as data_file:
@@ -919,7 +923,7 @@ def load_data(_id, path, remove=True, do_pickle=True, silent=False):
data = data_file.read()
if remove:
os.remove(path)
misc.remove_file(path)
except:
logging.error(T('Loading %s failed'), path)
logging.info("Traceback: ", exc_info=True)
@@ -933,8 +937,7 @@ def remove_data(_id, path):
path = os.path.join(path, _id)
try:
if os.path.exists(path):
os.remove(path)
logging.info("%s removed", path)
misc.remove_file(path)
except:
logging.debug("Failed to remove %s", path)
@@ -942,7 +945,7 @@ def remove_data(_id, path):
def save_admin(data, _id):
""" Save data in admin folder in specified format """
path = os.path.join(cfg.admin_dir.get_path(), _id)
logging.info("Saving data for %s in %s", _id, path)
logging.debug("[%s] Saving data for %s in %s", misc.caller_name(), _id, path)
# We try 3 times, to avoid any dict or access problems
for t in xrange(3):
@@ -965,10 +968,10 @@ def save_admin(data, _id):
def load_admin(_id, remove=False, silent=False):
""" Read data in admin folder in specified format """
path = os.path.join(cfg.admin_dir.get_path(), _id)
logging.info("Loading data for %s from %s", _id, path)
logging.debug("[%s] Loading data for %s from %s", misc.caller_name(), _id, path)
if not os.path.exists(path):
logging.info("%s missing", path)
logging.info("[%s] %s missing", misc.caller_name(), path)
return None
try:
@@ -978,7 +981,7 @@ def load_admin(_id, remove=False, silent=False):
else:
data = cPickle.load(data_file)
if remove:
os.remove(path)
misc.remove_file(path)
except:
if not silent:
excepterror = str(sys.exc_info()[0])
@@ -1032,7 +1035,7 @@ def check_repair_request():
path = os.path.join(cfg.admin_dir.get_path(), REPAIR_REQUEST)
if os.path.exists(path):
try:
os.remove(path)
misc.remove_file(path)
except:
pass
return True
@@ -1103,7 +1106,7 @@ def pid_file(pid_path=None, pid_file=None, port=0):
f.write('%d\n' % os.getpid())
f.close()
else:
os.remove(DIR_PID)
misc.remove_file(DIR_PID)
except:
logging.warning('Cannot access PID file %s', DIR_PID)

View File

@@ -105,9 +105,6 @@ def api_handler(kwargs):
name = kwargs.get('name', '')
callback = kwargs.get('callback', '')
# Extend the timeout of API calls to 10minutes
cherrypy.response.timeout = 600
if isinstance(mode, list):
mode = mode[0]
if isinstance(output, list):
@@ -684,12 +681,11 @@ def _api_rescan(name, output, kwargs):
def _api_eval_sort(name, output, kwargs):
""" API: evaluate sorting expression """
import sabnzbd.tvsort
name = kwargs.get('name', '')
value = kwargs.get('value', '')
title = kwargs.get('title')
multipart = kwargs.get('movieextra', '')
path = sabnzbd.tvsort.eval_sort(value, title, name, multipart)
path = sabnzbd.sorting.eval_sort(value, title, name, multipart)
if path is None:
return report(output, _MSG_NOT_IMPLEMENTED)
else:
@@ -906,8 +902,8 @@ def _api_server_stats(name, output, kwargs):
stats['servers'] = {}
for svr in config.get_servers():
t, m, w, d, _ = BPSMeter.do.amounts(svr)
stats['servers'][svr] = {'total': t or 0, 'month': m or 0, 'week': w or 0, 'day': d or 0}
t, m, w, d, daily = BPSMeter.do.amounts(svr)
stats['servers'][svr] = {'total': t or 0, 'month': m or 0, 'week': w or 0, 'day': d or 0, 'daily': daily or {} }
return report(output, keyword='', data=stats)
@@ -1280,11 +1276,7 @@ def build_status(skip_dashboard=False, output=None):
info['servers'].append((server.displayname, '', connected, serverconnections, server.ssl,
server.active, server.errormsg, server.priority, server.optional))
wlist = []
for w in sabnzbd.GUIHANDLER.content():
w = w.replace('WARNING', T('WARNING:')).replace('ERROR', T('ERROR:'))
wlist.insert(0, unicoder(w))
info['warnings'] = wlist
info['warnings'] = sabnzbd.GUIHANDLER.content()
return info
@@ -1345,7 +1337,6 @@ def build_queue(start=0, limit=0, trans=False, output=None, search=None):
slot['size'] = format_bytes(bytes)
slot['sizeleft'] = format_bytes(bytesleft)
slot['percentage'] = "%s" % (int(((mb - mbleft) / mb) * 100)) if mb != mbleft else '0'
slot['missing'] = pnfo.missing
slot['mbmissing'] = "%.2f" % (pnfo.bytes_missing / MEBI)
slot['direct_unpack'] = pnfo.direct_unpack
if not output:
@@ -1360,13 +1351,13 @@ def build_queue(start=0, limit=0, trans=False, output=None, search=None):
else:
slot['status'] = Status.DOWNLOADING
else:
# ensure compatibility of API status
if status in (Status.DELETED, ):
# Ensure compatibility of API status
if status == Status.DELETED or priority == TOP_PRIORITY:
status = Status.DOWNLOADING
slot['status'] = "%s" % (status)
if (Downloader.do.paused or Downloader.do.postproc or is_propagating or \
status not in (Status.DOWNLOADING, Status.QUEUED)) and priority != TOP_PRIORITY:
status not in (Status.DOWNLOADING, Status.FETCHING, Status.QUEUED)) and priority != TOP_PRIORITY:
slot['timeleft'] = '0:00:00'
slot['eta'] = 'unknown'
else:
@@ -1380,8 +1371,9 @@ def build_queue(start=0, limit=0, trans=False, output=None, search=None):
datestart = datetime.datetime.now()
slot['eta'] = 'unknown'
if status == Status.GRABBING:
slot['avg_age'] = '---'
# Do not show age when it's not known
if average_date.year < 2000:
slot['avg_age'] = '-'
else:
slot['avg_age'] = calc_age(average_date, bool(trans))
@@ -1462,8 +1454,7 @@ def rss_qstatus():
rss = RSS()
rss.channel.title = "SABnzbd Queue"
rss.channel.description = "Overview of current downloads"
rss.channel.link = "http://%s:%s/sabnzbd/queue" % (
cfg.cherryhost(), cfg.cherryport())
rss.channel.link = "http://%s:%s%s/queue" % (cfg.cherryhost(), cfg.cherryport(), cfg.url_base())
rss.channel.language = "en"
item = Item()
@@ -1494,7 +1485,7 @@ def rss_qstatus():
item = Item()
item.title = name
item.link = "http://%s:%s/sabnzbd/history" % (cfg.cherryhost(), cfg.cherryport())
item.link = "http://%s:%s%s/history" % (cfg.cherryhost(), cfg.cherryport(), cfg.url_base())
item.guid = nzo_id
status_line = []
status_line.append('<tr>')
@@ -1637,13 +1628,12 @@ def build_header(webdir='', output=None):
header['restart_req'] = sabnzbd.RESTART_REQ
header['pid'] = os.getpid()
header['last_warning'] = sabnzbd.GUIHANDLER.last().replace('WARNING', ('WARNING:')).replace('ERROR', T('ERROR:'))
header['active_lang'] = cfg.language()
header['my_lcldata'] = sabnzbd.DIR_LCLDATA
header['my_home'] = sabnzbd.DIR_HOME
header['webdir'] = webdir or sabnzbd.WEB_DIR
header['url_base'] = cfg.url_base()
header['nt'] = sabnzbd.WIN32
header['darwin'] = sabnzbd.DARWIN
@@ -1696,7 +1686,7 @@ def build_queue_header(search=None, start=0, limit=0, output=None):
bytes = qnfo.bytes
header['kbpersec'] = "%.2f" % (bytespersec / KIBI)
header['speed'] = to_units(bytespersec, spaces=1, dec_limit=1)
header['speed'] = to_units(bytespersec, spaces=1)
header['mbleft'] = "%.2f" % (bytesleft / MEBI)
header['mb'] = "%.2f" % (bytes / MEBI)
header['sizeleft'] = format_bytes(bytesleft)

View File

@@ -22,6 +22,7 @@ sabnzbd.articlecache - Article cache handling
import sys
import logging
import threading
import struct
import sabnzbd
from sabnzbd.decorators import synchronized
@@ -30,13 +31,8 @@ from sabnzbd.constants import GIGI, ANFO
ARTICLE_LOCK = threading.Lock()
class ArticleCache(object):
""" Operations on lists/dicts are atomic enough that we
do not have to put locks. Only the cache-size needs
a lock since the integer needs to stay synced.
With less locking, the decoder and assembler do not
have to wait on each other.
"""
do = None
def __init__(self):
@@ -45,55 +41,61 @@ class ArticleCache(object):
self.__cache_size = 0
self.__article_list = [] # List of buffered articles
self.__article_table = {} # Dict of buffered articles
# On 32 bit we only allow the user to set 1GB
# For 64 bit we allow up to 4GB, in case somebody wants that
self.__cache_upper_limit = GIGI
if sabnzbd.DARWIN or sabnzbd.WIN64 or (struct.calcsize("P") * 8) == 64:
self.__cache_upper_limit = 4*GIGI
ArticleCache.do = self
@synchronized(ARTICLE_LOCK)
def cache_info(self):
return ANFO(len(self.__article_list), abs(self.__cache_size), self.__cache_limit_org)
@synchronized(ARTICLE_LOCK)
def new_limit(self, limit):
""" Called when cache limit changes """
self.__cache_limit_org = limit
if limit < 0:
self.__cache_limit = GIGI
self.__cache_limit = self.__cache_upper_limit
else:
self.__cache_limit = min(limit, GIGI)
self.__cache_limit = min(limit, self.__cache_upper_limit)
@synchronized(ARTICLE_LOCK)
def increase_cache_size(self, value):
self.__cache_size += value
@synchronized(ARTICLE_LOCK)
def decrease_cache_size(self, value):
self.__cache_size -= value
def reserve_space(self, data):
""" Is there space left in the set limit? """
data_size = sys.getsizeof(data) * 64
self.increase_cache_size(data_size)
self.__cache_size += data_size
if self.__cache_size + data_size > self.__cache_limit:
return False
else:
return True
@synchronized(ARTICLE_LOCK)
def free_reserve_space(self, data):
""" Remove previously reserved space """
data_size = sys.getsizeof(data) * 64
self.decrease_cache_size(data_size)
self.__cache_size -= data_size
return self.__cache_size + data_size < self.__cache_limit
@synchronized(ARTICLE_LOCK)
def save_article(self, article, data):
nzf = article.nzf
nzo = nzf.nzo
if nzo.is_gone():
if article.nzf.nzo.is_gone():
# Do not discard this article because the
# file might still be processed at this moment!!
return
saved_articles = article.nzf.nzo.saved_articles
# Register article
if article not in article.nzf.nzo.saved_articles:
article.nzf.nzo.saved_articles.append(article)
if article not in saved_articles:
saved_articles.append(article)
if article.lowest_partnum and not article.nzf.import_finished:
# Write the first-fetched articles to disk
# Otherwise the cache could overflow
self.__flush_article(article, data)
return
if self.__cache_limit:
if self.__cache_limit < 0:
@@ -106,7 +108,7 @@ class ArticleCache(object):
# Flush oldest article in cache
old_article = self.__article_list.pop(0)
old_data = self.__article_table.pop(old_article)
self.decrease_cache_size(len(old_data))
self.__cache_size -= len(old_data)
# No need to flush if this is a refreshment article
if old_article != article:
self.__flush_article(old_article, old_data)
@@ -120,6 +122,7 @@ class ArticleCache(object):
else:
self.__flush_article(article, data)
@synchronized(ARTICLE_LOCK)
def load_article(self, article):
data = None
nzo = article.nzf.nzo
@@ -127,7 +130,7 @@ class ArticleCache(object):
if article in self.__article_list:
data = self.__article_table.pop(article)
self.__article_list.remove(article)
self.decrease_cache_size(len(data))
self.__cache_size -= len(data)
elif article.art_id:
data = sabnzbd.load_data(article.art_id, nzo.workpath, remove=True,
do_pickle=False, silent=True)
@@ -137,19 +140,21 @@ class ArticleCache(object):
return data
@synchronized(ARTICLE_LOCK)
def flush_articles(self):
self.__cache_size = 0
while self.__article_list:
article = self.__article_list.pop(0)
data = self.__article_table.pop(article)
self.__flush_article(article, data)
self.__cache_size = 0
@synchronized(ARTICLE_LOCK)
def purge_articles(self, articles):
for article in articles:
if article in self.__article_list:
self.__article_list.remove(article)
data = self.__article_table.pop(article)
self.decrease_cache_size(len(data))
self.__cache_size -= len(data)
if article.art_id:
sabnzbd.remove_data(article.art_id, article.nzf.nzo.workpath)
@@ -172,12 +177,11 @@ class ArticleCache(object):
def __add_to_cache(self, article, data):
if article in self.__article_table:
self.decrease_cache_size(len(self.__article_table[article]))
self.__cache_size -= len(self.__article_table[article])
else:
self.__article_list.append(article)
self.__article_table[article] = data
self.increase_cache_size(len(data))
self.__cache_size += len(data)
# Create the instance

View File

@@ -22,7 +22,6 @@ sabnzbd.assembler - threaded assembly/decoding of files
import os
import Queue
import logging
import struct
import re
from threading import Thread
from time import sleep
@@ -30,14 +29,16 @@ import hashlib
import sabnzbd
from sabnzbd.misc import get_filepath, sanitize_filename, get_unique_filename, renamer, \
set_permissions, long_path, clip_path, has_win_device, get_all_passwords, diskspace
set_permissions, long_path, clip_path, has_win_device, get_all_passwords, diskspace, \
get_filename, get_ext
from sabnzbd.constants import Status, GIGI
import sabnzbd.cfg as cfg
from sabnzbd.articlecache import ArticleCache
from sabnzbd.postproc import PostProcessor
import sabnzbd.downloader
import sabnzbd.par2file as par2file
import sabnzbd.utils.rarfile as rarfile
from sabnzbd.encoding import unicoder, is_utf8
from sabnzbd.encoding import unicoder
from sabnzbd.rating import Rating
@@ -75,7 +76,7 @@ class Assembler(Thread):
if not sabnzbd.downloader.Downloader.do.paused:
logging.warning(T('Too little diskspace forcing PAUSE'))
# Pause downloader, but don't save, since the disk is almost full!
sabnzbd.downloader.Downloader.do.pause(save=False)
sabnzbd.downloader.Downloader.do.pause()
sabnzbd.emailer.diskfull()
# Abort all direct unpackers, just to be sure
sabnzbd.directunpacker.abort_all()
@@ -86,64 +87,66 @@ class Assembler(Thread):
continue
# Prepare filename
filename = sanitize_filename(nzf.filename)
nzf.filename = filename
dupe = nzo.check_for_dupe(nzf)
filepath = get_filepath(long_path(cfg.download_dir.get_path()), nzo, filename)
nzo.verify_nzf_filename(nzf)
nzf.filename = sanitize_filename(nzf.filename)
filepath = get_filepath(long_path(cfg.download_dir.get_path()), nzo, nzf.filename)
nzf.filename = get_filename(filepath)
if filepath:
logging.info('Decoding %s %s', filepath, nzf.type)
try:
filepath = self.assemble(nzf, filepath, dupe)
filepath = self.assemble(nzf, filepath)
except IOError, (errno, strerror):
# If job was deleted, ignore error
if not nzo.is_gone():
# If job was deleted or in active post-processing, ignore error
if not nzo.deleted and not nzo.is_gone() and not nzo.pp_active:
# 28 == disk full => pause downloader
if errno == 28:
logging.error(T('Disk full! Forcing Pause'))
else:
logging.error(T('Disk error on creating file %s'), clip_path(filepath))
# Log traceback
logging.info('Traceback: ', exc_info=True)
# Pause without saving
sabnzbd.downloader.Downloader.do.pause(save=False)
sabnzbd.downloader.Downloader.do.pause()
continue
except:
logging.error(T('Fatal error in Assembler'), exc_info=True)
break
# Clean-up admin data
nzf.remove_admin()
setname = nzf.setname
if nzf.is_par2 and (nzo.md5packs.get(setname) is None):
pack = self.parse_par2_file(filepath, nzo.md5of16k)
if pack:
nzo.md5packs[setname] = pack
logging.debug('Got md5pack for set %s', setname)
# Valid md5pack, so use this par2-file as main par2 file for the set
if setname in nzo.partable:
# First copy the set of extrapars, we need them later
nzf.extrapars = nzo.partable[setname].extrapars
nzo.partable[setname] = nzf
rar_encrypted, unwanted_file = check_encrypted_and_unwanted_files(nzo, filepath)
if rar_encrypted:
if cfg.pause_on_pwrar() == 1:
logging.warning(remove_warning_label(T('WARNING: Paused job "%s" because of encrypted RAR file (if supplied, all passwords were tried)')), nzo.final_name)
nzo.pause()
else:
logging.warning(remove_warning_label(T('WARNING: Aborted job "%s" because of encrypted RAR file (if supplied, all passwords were tried)')), nzo.final_name)
nzo.fail_msg = T('Aborted, encryption detected')
sabnzbd.nzbqueue.NzbQueue.do.end_job(nzo)
# Do rar-related processing
if rarfile.is_rarfile(filepath):
# Encryption and unwanted extension detection
rar_encrypted, unwanted_file = check_encrypted_and_unwanted_files(nzo, filepath)
if rar_encrypted:
if cfg.pause_on_pwrar() == 1:
logging.warning(remove_warning_label(T('WARNING: Paused job "%s" because of encrypted RAR file (if supplied, all passwords were tried)')), nzo.final_name)
nzo.pause()
else:
logging.warning(remove_warning_label(T('WARNING: Aborted job "%s" because of encrypted RAR file (if supplied, all passwords were tried)')), nzo.final_name)
nzo.fail_msg = T('Aborted, encryption detected')
sabnzbd.nzbqueue.NzbQueue.do.end_job(nzo)
if unwanted_file:
logging.warning(remove_warning_label(T('WARNING: In "%s" unwanted extension in RAR file. Unwanted file is %s ')), nzo.final_name, unwanted_file)
logging.debug(T('Unwanted extension is in rar file %s'), filepath)
if cfg.action_on_unwanted_extensions() == 1 and nzo.unwanted_ext == 0:
logging.debug('Unwanted extension ... pausing')
nzo.unwanted_ext = 1
nzo.pause()
if cfg.action_on_unwanted_extensions() == 2:
logging.debug('Unwanted extension ... aborting')
nzo.fail_msg = T('Aborted, unwanted extension detected')
sabnzbd.nzbqueue.NzbQueue.do.end_job(nzo)
if unwanted_file:
logging.warning(remove_warning_label(T('WARNING: In "%s" unwanted extension in RAR file. Unwanted file is %s ')), nzo.final_name, unwanted_file)
logging.debug(T('Unwanted extension is in rar file %s'), filepath)
if cfg.action_on_unwanted_extensions() == 1 and nzo.unwanted_ext == 0:
logging.debug('Unwanted extension ... pausing')
nzo.unwanted_ext = 1
nzo.pause()
if cfg.action_on_unwanted_extensions() == 2:
logging.debug('Unwanted extension ... aborting')
nzo.fail_msg = T('Aborted, unwanted extension detected')
sabnzbd.nzbqueue.NzbQueue.do.end_job(nzo)
# Add to direct unpack
nzo.add_to_direct_unpacker(nzf)
elif par2file.is_parfile(filepath):
# Parse par2 files, cloaked or not
nzo.handle_par2(nzf, filepath)
filter, reason = nzo_filtered_by_rating(nzo)
if filter == 1:
@@ -154,22 +157,12 @@ class Assembler(Thread):
nzo.fail_msg = T('Aborted, rating filter matched (%s)') % reason
sabnzbd.nzbqueue.NzbQueue.do.end_job(nzo)
if rarfile.is_rarfile(filepath):
nzo.add_to_direct_unpacker(nzf)
else:
sabnzbd.nzbqueue.NzbQueue.do.remove(nzo.nzo_id, add_to_history=False, cleanup=False)
PostProcessor.do.process(nzo)
def assemble(self, nzf, path, dupe):
def assemble(self, nzf, path):
""" Assemble a NZF from its table of articles """
if os.path.exists(path):
unique_path = get_unique_filename(path)
if dupe:
path = unique_path
else:
renamer(path, unique_path)
md5 = hashlib.md5()
fout = open(path, 'ab')
decodetable = nzf.decodetable
@@ -200,52 +193,6 @@ class Assembler(Thread):
return path
def parse_par2_file(self, fname, table16k):
""" Get the hash table and the first-16k hash table from a PAR2 file
Return as dictionary, indexed on names or hashes for the first-16 table
For a full description of the par2 specification, visit:
http://parchive.sourceforge.net/docs/specifications/parity-volume-spec/article-spec.html
"""
table = {}
duplicates16k = []
try:
f = open(fname, 'rb')
except:
return table
try:
header = f.read(8)
while header:
name, hash, hash16k = parse_par2_file_packet(f, header)
if name:
table[name] = hash
if hash16k not in table16k:
table16k[hash16k] = name
else:
# Not unique, remove to avoid false-renames
duplicates16k.append(hash16k)
header = f.read(8)
except (struct.error, IndexError):
logging.info('Cannot use corrupt par2 file for QuickCheck, "%s"', fname)
table = {}
except:
logging.debug('QuickCheck parser crashed in file %s', fname)
logging.info('Traceback: ', exc_info=True)
table = {}
f.close()
# Have to remove duplicates at the end to make sure
# no trace is left in case of multi-duplicates
for hash16k in duplicates16k:
if hash16k in table16k:
old_name = table16k.pop(hash16k)
logging.debug('Par2-16k signature of %s not unique, discarding', old_name)
return table
def file_has_articles(nzf):
""" Do a quick check to see if any articles are present for this file.
@@ -262,55 +209,13 @@ def file_has_articles(nzf):
return has
def parse_par2_file_packet(f, header):
""" Look up and analyze a FileDesc package """
nothing = None, None, None
if header != 'PAR2\0PKT':
return nothing
# Length must be multiple of 4 and at least 20
len = struct.unpack('<Q', f.read(8))[0]
if int(len / 4) * 4 != len or len < 20:
return nothing
# Next 16 bytes is md5sum of this packet
md5sum = f.read(16)
# Read and check the data
data = f.read(len - 32)
md5 = hashlib.md5()
md5.update(data)
if md5sum != md5.digest():
return nothing
# The FileDesc packet looks like:
# 16 : "PAR 2.0\0FileDesc"
# 16 : FileId
# 16 : Hash for full file **
# 16 : Hash for first 16K
# 8 : File length
# xx : Name (multiple of 4, padded with \0 if needed) **
# See if it's the right packet and get name + hash
for offset in range(0, len, 8):
if data[offset:offset + 16] == "PAR 2.0\0FileDesc":
hash = data[offset + 32:offset + 48]
hash16k = data[offset + 48:offset + 64]
filename = data[offset + 72:].strip('\0')
return filename, hash, hash16k
return nothing
RE_SUBS = re.compile(r'\W+sub|subs|subpack|subtitle|subtitles(?![a-z])', re.I)
def is_cloaked(nzo, path, names):
""" Return True if this is likely to be a cloaked encrypted post """
fname = unicoder(os.path.split(path)[1]).lower()
fname = unicoder(get_filename(path)).lower()
fname = os.path.splitext(fname)[0]
for name in names:
name = os.path.split(name.lower())[1]
name = get_filename(name.lower())
name, ext = os.path.splitext(unicoder(name))
if ext == u'.rar' and fname.startswith(name) and (len(fname) - len(name)) < 8 and len(names) < 3 and not RE_SUBS.search(fname):
# Only warn once
@@ -389,6 +294,9 @@ def check_encrypted_and_unwanted_files(nzo, filepath):
# Did any work?
if password_hit:
# We always trust the user's input
if not nzo.password:
nzo.password = password_hit
# Don't check other files
logging.info('Password "%s" matches for job "%s"', password_hit, nzo.final_name)
nzo.encrypted = -1
@@ -406,13 +314,14 @@ def check_encrypted_and_unwanted_files(nzo, filepath):
if cfg.unwanted_extensions() and cfg.action_on_unwanted_extensions():
for somefile in zf.namelist():
logging.debug('File contains: %s', somefile)
if os.path.splitext(somefile)[1].replace('.', '').lower() in cfg.unwanted_extensions():
if get_ext(somefile).replace('.', '').lower() in cfg.unwanted_extensions():
logging.debug('Unwanted file %s', somefile)
unwanted = somefile
zf.close()
del zf
except:
logging.info('Error during inspection of RAR-file %s', filepath, exc_info=True)
logging.info('Error during inspection of RAR-file %s', filepath)
logging.debug('Traceback: ', exc_info=True)
return encrypted, unwanted
@@ -462,5 +371,5 @@ def remove_warning_label(msg):
""" Standardize errors by removing obsolete
"WARNING:" part in all languages """
if ':' in msg:
return msg.split(':')[1]
return msg.split(':')[1].strip()
return msg

View File

@@ -148,6 +148,7 @@ fail_hopeless_jobs = OptionBool('misc', 'fail_hopeless_jobs', True)
autodisconnect = OptionBool('misc', 'auto_disconnect', True)
no_dupes = OptionNumber('misc', 'no_dupes', 0)
no_series_dupes = OptionNumber('misc', 'no_series_dupes', 0)
series_propercheck = OptionBool('misc', 'series_propercheck', True)
pause_on_pwrar = OptionNumber('misc', 'pause_on_pwrar', 1)
ignore_samples = OptionBool('misc', 'ignore_samples', False)
auto_sort = OptionBool('misc', 'auto_sort', False)
@@ -252,7 +253,7 @@ keep_awake = OptionBool('misc', 'keep_awake', True)
win_menu = OptionBool('misc', 'win_menu', True)
allow_incomplete_nzb = OptionBool('misc', 'allow_incomplete_nzb', False)
enable_bonjour = OptionBool('misc', 'enable_bonjour', True)
allow_duplicate_files = OptionBool('misc', 'allow_duplicate_files', False)
reject_duplicate_files = OptionBool('misc', 'reject_duplicate_files', False)
max_art_opt = OptionBool('misc', 'max_art_opt', False)
use_pickle = OptionBool('misc', 'use_pickle', False)
ipv6_hosting = OptionBool('misc', 'ipv6_hosting', False)
@@ -260,6 +261,7 @@ fixed_ports = OptionBool('misc', 'fixed_ports', False)
api_warnings = OptionBool('misc', 'api_warnings', True, protect=True)
disable_key = OptionBool('misc', 'disable_api_key', False, protect=True)
no_penalties = OptionBool('misc', 'no_penalties', False)
debug_log_decoding = OptionBool('misc', 'debug_log_decoding', False)
# Text values
rss_odd_titles = OptionList('misc', 'rss_odd_titles', ['nzbindex.nl/', 'nzbindex.com/', 'nzbclub.com/'])
@@ -274,7 +276,7 @@ history_limit = OptionNumber('misc', 'history_limit', 10, 0)
wait_ext_drive = OptionNumber('misc', 'wait_ext_drive', 5, 1, 60)
marker_file = OptionStr('misc', 'nomedia_marker', '')
ipv6_servers = OptionNumber('misc', 'ipv6_servers', 1, 0, 2)
url_base = OptionStr('misc', 'url_base', '/sabnzbd')
##############################################################################
# Config - Notifications
@@ -373,6 +375,8 @@ prowl_prio_other = OptionNumber('prowl', 'prowl_prio_other', -3)
pushover_token = OptionStr('pushover', 'pushover_token')
pushover_userkey = OptionStr('pushover', 'pushover_userkey')
pushover_device = OptionStr('pushover', 'pushover_device')
pushover_emergency_expire = OptionNumber('pushover', 'pushover_emergency_expire', 3600)
pushover_emergency_retry = OptionNumber('pushover', 'pushover_emergency_retry', 60)
pushover_enable = OptionBool('pushover', 'pushover_enable')
pushover_cats = OptionList('pushover', 'pushover_cats', ['*'])
pushover_prio_startup = OptionNumber('pushover', 'pushover_prio_startup', -3)

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