Compare commits

..

182 Commits

Author SHA1 Message Date
Safihre
1cc2e25cda Update to 2.2.0 2017-08-17 10:47:04 +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
149 changed files with 12924 additions and 14669 deletions

7
.gitignore vendored
View File

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

View File

@@ -1,15 +0,0 @@
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.4.0 ***
*** This is SABnzbd 2.2.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.3.1
SABnzbd 2.2.0
-------------------------------------------------------------------------------
0) LICENSE
@@ -27,57 +27,58 @@ 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 a few seconds your web browser will start and show the user interface.
Within 5-10 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 a few seconds your web browser will start and show the user interface.
Within 5-10 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.
All platforms
Unix/Linux/macOS
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.3.1 use "pip install sabyenc"
sabyenc == 3.0.2 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 Linux
Optional modules Unix/Linux/macOS
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.
@@ -87,17 +88,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 -OO SABnzbd.py
python SABnzbd.py
Within a few seconds your web browser will start and show the user interface.
Within 5-10 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
-------------------------------------------------------------------------------
@@ -112,7 +113,7 @@ or
You may of course try other port numbers too.
For troubleshooting on Windows you can use the program SABnzbd-console.exe.
For troubleshooting 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.
@@ -120,13 +121,14 @@ may help you solve problems easier.
6) MORE INFORMATION
-------------------------------------------------------------------------------
Visit our wiki:
Visit the WIKI site:
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,18 +9,28 @@
- 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.3/special
See: https://sabnzbd.org/wiki/configuration/2.2/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.3/special
See: https://sabnzbd.org/wiki/configuration/2.2/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.
@@ -31,7 +41,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.3/special
See: https://sabnzbd.org/wiki/configuration/2.2/special
- The "Watched Folder" sometimes fails to delete the NZB files it has
processed. This happens when other software still accesses these files.
@@ -41,10 +51,6 @@
- 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
@@ -66,3 +72,13 @@
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.3.2RC2
Summary: SABnzbd-2.3.2RC2
Version: 2.2.0
Summary: SABnzbd-2.2.0
Home-page: https://sabnzbd.org
Author: The SABnzbd Team
Author-email: team@sabnzbd.org

View File

@@ -13,6 +13,7 @@ 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,51 +1,89 @@
Release Notes - SABnzbd 2.3.2 RC 2
Release Notes - SABnzbd 2.2.0
=========================================================
## Changes since 2.3.2 RC 1
- Simplify Config pages by hiding Advanced Settings
- Automatically set Article Cache to 25% of system memory (max. 2GB)
- Added Hebrew date-time texts
- Added option '%dn' to Date Sorting to rename files as job name
- Added 'Job Name as Folder Name' as Sorting Preset for de-obfuscation
- Add per-day download-statistics to 'server_stats' API-call
- Having 'Download all par2' enabled would result in disappearing jobs
- Pre-queue scripts would fail to run
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
- Server usage graphs are now linked to make comparing servers easier
- First article of each file is downloaded first to identify filenames
- Jobs finished by Direct Unpack will be post-processed first
- URLs that fail to fetch due to server errors will only be retried 10x
- Delay between URL retries increases when not specified by server
- Job password entered by user is always shown in History
- If available, 7zip will be used instead of unzip
## 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
- Disk-space is now checked before writing files
- 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
- Better indication of verification process before and after repair
- 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
- Handling of par2 files made more robust
- All par2 files are only downloaded when enabled, not on enable_par_cleanup
- 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
- Windows & macOS: Updated WinRAR to 5.5.0
## Bugfixes since 2.3.1
- Dropped connections could result in stalled downloads
- Pre-queue script output was not always parsed correctly
- Notifications were always send for 'Default' category
- 'History Retention' also checked on start of program
- macOS: Restore compatibility with macOS 10.11.6 on some systems
- Windows: Unpacking could fail due to paths not being 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
## Bugfixes since 2.1.0
- Shutdown/suspend did not work on some Linux systems
- Standby/Hibernate was not working on Windows
- 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
- In some cases not all RAR-sets were unpacked
- Fixed unicode error during Sorting
- Faulty pynotify could stop shutdown
- Categories with ' in them could result in SQL errors
- Special characters like []!* in filenames could break repair
- Wizard was always accessible, even with username and password set
- Correct value in "Speed" Extra History Column
- Not all texts were shown in the selected Language
- Various CSS fixes in Glitter and the Config
- Catch "error 0" when using HTTPS on some Linux platforms
- Warning is shown when many files with duplicate filenames are discarded
- 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
## Upgrading from 2.2.x and older
## Translations
- Added Hebrew translation by ION IL, many other languages updated.
## Depreciation notices
- Option to limit Servers to specific Categories is now scheduled
to be removed in the next release.
## Upgrading from 2.1.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 0.7.x queue, but you can restore the jobs
by going to Status page and using Queue Repair.
This version will not see the old queue, but you restore the jobs by going
to Status page and use Queue Repair.
## Known problems and solutions
- Read the file "ISSUES.txt"

View File

@@ -32,13 +32,11 @@ except:
import logging
import logging.handlers
import traceback
import os
import getopt
import signal
import socket
import platform
import ssl
import time
import re
@@ -87,7 +85,7 @@ import sabnzbd.interface
from sabnzbd.constants import *
import sabnzbd.newsunpack
from sabnzbd.misc import real_path, \
check_latest_version, exit_sab, get_from_url, \
check_latest_version, exit_sab, \
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, \
@@ -99,6 +97,7 @@ 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
@@ -151,11 +150,7 @@ class guiHandler(logging.Handler):
# Loose the oldest record
self.store.pop(0)
try:
# 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)
self.store.append(self.format(record))
except UnicodeDecodeError:
# Catch elusive Unicode conversion problems
pass
@@ -166,6 +161,12 @@ 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
@@ -201,11 +202,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():
@@ -401,7 +402,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.decoder.SABYENC_VERSION)
logging.info("SABYenc module (v%s)... found!", sabnzbd.constants.SABYENC_VERSION_REQUIRED)
else:
# Something wrong with SABYenc, so let's determine and print what:
if sabnzbd.decoder.SABYENC_VERSION:
@@ -425,12 +426,10 @@ def print_modules():
if sabnzbd.newsunpack.PAR2_COMMAND:
logging.info("par2 binary... found (%s)", sabnzbd.newsunpack.PAR2_COMMAND)
else:
logging.error('%s %s' % (T('par2 binary... NOT found!'), T('Verification and repair will not be possible.')))
logging.error(T('par2 binary... NOT found!'))
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)
@@ -441,9 +440,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.info('UNRAR binary version %.2f', (float(sabnzbd.newsunpack.RAR_VERSION) / 100))
logging.debug('UNRAR binary version %.2f', (float(sabnzbd.newsunpack.RAR_VERSION) / 100))
else:
logging.error('%s %s' % (T('unrar binary... NOT found'), T('Downloads will not unpacked.')))
logging.error(T('unrar binary... NOT found'))
if sabnzbd.newsunpack.ZIP_COMMAND:
logging.info("unzip binary... found (%s)", sabnzbd.newsunpack.ZIP_COMMAND)
@@ -657,7 +656,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 = get_from_url(url)
ver = sabnzbd.newsunpack.get_from_url(url)
sabnzbd.set_https_verification(prev)
return (ver and (re.search(r'\d+\.\d+\.', ver) or ver.strip() == sabnzbd.__version__))
except:
@@ -821,7 +820,7 @@ def main():
logging_level = None
web_dir = None
vista_plus = False
win64 = False
vista64 = False
repair = 0
api_url = None
no_login = False
@@ -946,8 +945,8 @@ def main():
# Detect Windows variant
if sabnzbd.WIN32:
vista_plus, win64 = windows_variant()
sabnzbd.WIN64 = win64
vista_plus, vista64 = windows_variant()
sabnzbd.WIN64 = vista64
if not SQLITE_DLL:
panic_sqlite(sabnzbd.MY_FULLNAME)
@@ -1026,7 +1025,7 @@ def main():
pass
else:
if not url:
url = 'https://%s:%s%s/api?' % (browserhost, port, sabnzbd.cfg.url_base())
url = 'https://%s:%s/sabnzbd/api?' % (browserhost, port)
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():
@@ -1055,7 +1054,7 @@ def main():
pass
else:
if not url:
url = 'http://%s:%s%s/api?' % (browserhost, cherryport, sabnzbd.cfg.url_base())
url = 'http://%s:%s/sabnzbd/api?' % (browserhost, cherryport)
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():
@@ -1150,12 +1149,14 @@ def main():
logging.info('Full executable path = %s', sabnzbd.MY_FULLNAME)
if sabnzbd.WIN32:
suffix = ''
if win64:
suffix = '(win64)'
if vista_plus:
suffix = ' (=Vista+)'
if vista64:
suffix = ' (=Vista+ x64)'
try:
logging.info('Platform = %s %s', platform.platform(), suffix)
logging.info('Platform=%s%s Class=%s', platform.platform(), suffix, os.name)
except:
logging.info('Platform = %s <unknown>', suffix)
logging.info('Platform=%s <unknown> Class=%s', suffix, os.name)
else:
logging.info('Platform = %s', os.name)
logging.info('Python-version = %s', sys.version)
@@ -1173,24 +1174,7 @@ 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()
@@ -1215,12 +1199,12 @@ def main():
from sabnzbd.utils.getperformance import getpystone, getcpu
pystoneperf = getpystone()
if pystoneperf:
logging.debug('CPU Pystone available performance = %s', pystoneperf)
logging.debug('CPU Pystone available performance is %s', pystoneperf)
else:
logging.debug('CPU Pystone available performance could not be calculated')
cpumodel = getcpu() # Linux only
if cpumodel:
logging.debug('CPU model = %s', cpumodel)
logging.debug('CPU model name is %s', cpumodel)
logging.info('Read INI file %s', inifile)
@@ -1264,9 +1248,12 @@ def main():
# Find external programs
sabnzbd.newsunpack.find_programs(sabnzbd.DIR_PROG)
print_modules()
# HTTPS certificate generation
logging.info("SSL version %s", sabnzbd.utils.sslinfo.ssl_version())
logging.info("SSL supported protocols %s", str(sabnzbd.utils.sslinfo.ssl_protocols_labels()))
https_cert = sabnzbd.cfg.https_cert.get_path()
https_key = sabnzbd.cfg.https_key.get_path()
https_chain = sabnzbd.cfg.https_chain.get_path()
@@ -1282,7 +1269,6 @@ 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')
@@ -1335,7 +1321,6 @@ 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,
@@ -1372,7 +1357,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.cfg.url_base(), config=appconfig)
cherrypy.tree.mount(main_page, '/sabnzbd/', config=appconfig)
# Set authentication for CherryPy
sabnzbd.interface.set_auth(cherrypy.config)
@@ -1390,14 +1375,21 @@ def main():
# Wait for server to become ready
cherrypy.engine.wait(cherrypy.process.wspbus.states.STARTED)
# Window Service support
# 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)
mail = None
if sabnzbd.WIN32:
if enable_https:
mode = 's'
else:
mode = ''
api_url = 'http%s://%s:%s%s/api?apikey=%s' % (mode, browserhost, cherryport, sabnzbd.cfg.url_base(), sabnzbd.cfg.api_key())
api_url = 'http%s://%s:%s/sabnzbd/api?apikey=%s' % (mode, browserhost, cherryport, sabnzbd.cfg.api_key())
if sabnzbd.WIN_SERVICE:
mail = MailSlot()
@@ -1430,9 +1422,9 @@ def main():
# Set URL for browser
if enable_https:
browser_url = "https://%s:%s%s" % (browserhost, cherryport, sabnzbd.cfg.url_base())
browser_url = "https://%s:%s/sabnzbd" % (browserhost, cherryport)
else:
browser_url = "http://%s:%s%s" % (browserhost, cherryport, sabnzbd.cfg.url_base())
browser_url = "http://%s:%s/sabnzbd" % (browserhost, cherryport)
sabnzbd.BROWSER_URL = browser_url
if not autorestarted:
@@ -1446,13 +1438,6 @@ 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:
@@ -1701,8 +1686,9 @@ 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
@@ -1727,7 +1713,9 @@ if __name__ == '__main__':
sabApp = startApp()
sabApp.start()
AppHelper.runEventLoop()
except:
main()
else:
main()

View File

@@ -1,6 +0,0 @@
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 separate set of locks per session id.
# This is a seperate set of locks per session id.
locks = {}
servers = ['127.0.0.1:11211']

View File

@@ -0,0 +1,16 @@
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,7 +45,6 @@
// 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 '/'#'
@@ -62,7 +61,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.2.1.min.js?v=$version"></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/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.3/configure"#-->
<!--#set global $help_uri="configuration/2.2/configure"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<!--#from locale import getpreferredencoding#-->
@@ -30,7 +30,7 @@
<tr>
<th scope="row">OpenSSL:</th>
<td>
$ssl_version
$ssl_version &nbsp; [$ssl_protocols]
</td>
</tr>
<!--#if not $have_ssl_context#-->
@@ -81,7 +81,7 @@
</td>
</tr>
<!--#end if#-->
<!--#if not $have_unzip and not $have_7zip #-->
<!--#if not $have_unzip #-->
<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.3/categories"#-->
<!--#set global $help_uri="configuration/2.2/categories"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="section">

View File

@@ -1,13 +1,8 @@
<!--#set global $pane="Folders"#-->
<!--#set global $help_uri="configuration/2.3/folders"#-->
<!--#set global $help_uri="configuration/2.2/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" />
@@ -26,7 +21,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 advanced-settings">
<div class="field-pair">
<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>
@@ -37,7 +32,7 @@
<span class="desc">$T('explain-complete_dir')</span>
</div>
<!--#if not $nt#-->
<div class="field-pair advanced-settings">
<div class="field-pair">
<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>
@@ -48,7 +43,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 advanced-settings">
<div class="field-pair">
<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>
@@ -58,12 +53,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 advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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>
@@ -77,7 +72,7 @@
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section advanced-settings">
<div class="section">
<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,14 +1,9 @@
<!--#set global $pane="General"#-->
<!--#set global $help_uri="configuration/2.3/general"#-->
<!--#set global $help_uri="configuration/2.2/general"#-->
<!--#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="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off">
<form action="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off" novalidate>
<input type="hidden" id="session" name="session" value="$session" />
<input type="hidden" id="ajax" name="ajax" value=1 />
<div class="section">
@@ -33,7 +28,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 advanced-settings">
<div class="field-pair">
<label class="config" for="web_dir">$T('opt-web_dir')</label>
<select name="web_dir" id="web_dir">
<!--#for $webline in $web_list#-->
@@ -94,6 +89,7 @@
<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>
@@ -177,7 +173,7 @@
</select>
<span class="desc">$T('explain-check_new_rel')</span>
</div>
<div class="field-pair advanced-settings <!--#if int($have_ssl_context) == 0 then "disabled" else ""#-->">
<div class="field-pair <!--#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>
@@ -204,12 +200,12 @@
</select>
<input type="hidden" name="bandwidth_max" id="bandwidth_max" value="$bandwidth_max" />
</div>
<div class="field-pair advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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>
@@ -257,32 +253,6 @@
})
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 () {
@@ -360,6 +330,7 @@
}
}
// 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.3/notifications"#-->
<!--#set global $help_uri="configuration/2.2/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">
<form action="saveEmail" method="post" name="fullform" class="fullform" autocomplete="off" novalidate>
<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 no-field-pair-bg">
<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" 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 no-field-pair-bg">
<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" 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 no-field-pair-bg">
<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" 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 no-field-pair-bg">
<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" 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 no-field-pair-bg">
<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" 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 no-field-pair-bg">
<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" 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 no-field-pair-bg">
<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" type="button" id="test_prowl"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -326,16 +326,6 @@
<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">
@@ -352,7 +342,7 @@
</select>
</div>
<!--#end for#-->
<div class="field-pair no-field-pair-bg">
<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" type="button" id="test_pushover"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -389,7 +379,7 @@
</div>
<!--#end if#-->
$show_notify_checkboxes('pushbullet')
<div class="field-pair no-field-pair-bg">
<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" type="button" id="test_pushbullet"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -417,7 +407,6 @@
\$(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.3/rss"#-->
<!--#set global $help_uri="configuration/2.2/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">
<form action="add_rss_feed" method="post" autocomplete="off" novalidate>
<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">
<form action="save_rss_feed" method="post" autocomplete="off" novalidate>
<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">
<form action="rss_now" method="post" autocomplete="off" novalidate>
<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') ($T('rss-accept'))</option>
<option value="F"> $T('rss-from-show')</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" and $filter[3]!="S" then 'disabled_options_rule' else ""#-->">
<tr class="<!--#if $odd then " alt " else " "#--> <!--#if $filter[3]!="A" 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).val() != "S")
\$(this).parent().parent().find('select:not([name="filter_type"])').attr('disabled', \$(this).val() != "A")
})
// 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.3/scheduling"#-->
<!--#set global $help_uri="configuration/2.2/scheduling"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<%
@@ -59,13 +59,6 @@ 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,299 +1,119 @@
<!--#set global $pane="Servers"#-->
<!--#set global $help_uri="configuration/2.3/servers"#-->
<!--#set global $help_uri="configuration/2.2/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">
<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>
<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>
<!--#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>
</div><!-- /col2 -->
<div class="col1">
<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>
<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="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 class="field-pair">
<label class="config" for="host">$T('srv-host')</label>
<input type="text" name="host" id="host" />
</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<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 class="field-pair">
<label class="config" for="port">$T('srv-port')</label>
<input type="number" name="port" id="port" size="8" value="119" />
</div>
</div>
</form>
<!--#end for#-->
</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>
<script type="text/javascript" src="${root}staticcfg/js/chartist.min.js"></script>
<script type="text/javascript" src="${root}staticcfg/js/filesize.min.js"></script>
<script type="text/javascript">
// Standardize chart options
// Define variables needed for the server-plots
var serverData = {}
var chartOptions = {
fullWidth: true,
showArea: true,
@@ -316,76 +136,261 @@
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
this to calculate the date-selector
-->
function showCharts() {
<!--#import json#-->
<!--#import datetime#-->
<!--#import sabnzbd.misc#-->
<!--#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 = list(sabnzbd.misc.monthrange(min_date, datetime.date.today()))#-->
<!--#$months_recorded.reverse()#-->
<select class="chart-selector" name="chart-selector-${id}" id="chart-selector-${id}" data-id="${id}">
<!--#for $cur_date in months_recorded#-->
<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}, \$('#chart-selector-${cur}').val())
})
</script>
<!--#end if#-->
</div>
</div>
</form>
<!--#end for#-->
</div><!-- /colmask -->
<script type="text/javascript">
function showChart(server_id, month) {
// This month
var theMonth = \$('#chart-selector').val()
var thisDay = new Date()
// What month are we doing?
var inputDate = new Date(theMonth+'-01')
var inputDate = new Date(month+'-01')
var baseDate = new Date(inputDate.getUTCFullYear(), inputDate.getUTCMonth(), 1)
var maxDaysInMonth = new Date(baseDate.getFullYear(), baseDate.getMonth()+1, 0).getDate()
// 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)
}
// 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)
}
// Update the text value
\$('#server-data-label-' + server_id).text(\$('#chart-selector :selected').text())
\$('#server-data-value-' + server_id).text(filesize(totalThisMonth, {round: 1}))
// Get formatted date
baseDate.setDate(i)
var dateCheck = toFormattedDate(baseDate)
// 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(' ','')
})
});
// 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 += axisLabel
})
});
}
// Need to mitigate timezone effects!
@@ -410,17 +415,41 @@
/**
Update charts when changed
**/
\$('#chart-selector').on('change', function(elemn) {
showCharts()
\$('.chart-selector').on('change', function(elemn) {
showChart(\$(elemn.target).data('id'), \$(elemn.target).val())
// Lets us leave (needs to be called after the change event)
setTimeout(function() {
formWasSubmitted = true;
formHasChanged = false;
}, 100)
})
// And on page-load
showCharts()
/**
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()
/**
Click events
@@ -431,19 +460,16 @@
}
\$(this).parent().next().toggle();
\$(this).parent().next().next().toggle();
if (\$(this).text().indexOf("$T('showDetails')") > 0) {
\$(this).html(\$(this).html().replace("$T('showDetails')", "$T('hideDetails')"));
if (\$(this).attr("value") == "$T('showDetails')") {
\$(this).attr("value", "$T('hideDetails')");
} else {
\$(this).html(\$(this).html().replace("$T('hideDetails')", "$T('showDetails')"));
\$(this).attr("value", "$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.3/sorting"#-->
<!--#set global $help_uri="configuration/2.2/sorting"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
@@ -40,8 +40,6 @@
<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">
@@ -53,7 +51,7 @@
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewtv-result">&nbsp;</span>
</div>
</div>
<div class="field-pair no-field-pair-bg">
<div class="field-pair">
<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">
@@ -141,9 +139,9 @@
<td>$T("sort-File")</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgJobname'):</b></td>
<td class="align-right"><b>$T('orgDirname'):</b></td>
<td>%dn</td>
<td></td>
<td>$T("sort-Folder")</td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
@@ -200,8 +198,7 @@
<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="$T('decade')" />
<input type="button" class="btn btn-default" onclick="movieSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
<input type="button" class="btn btn-default" onclick="movieSet('%0decade/%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="Decades 1" />
</div>
</div>
<div id="previewmovie" class="example">
@@ -213,7 +210,7 @@
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewmovie-result">&nbsp;</span>
</div>
</div>
<div class="field-pair no-field-pair-bg">
<div class="field-pair">
<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">
@@ -266,9 +263,9 @@
<td>$T('sort-File')</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgJobname'):</b></td>
<td class="align-right"><b>$T('orgDirname'):</b></td>
<td>%dn</td>
<td></td>
<td>$T("sort-Folder")</td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
@@ -331,9 +328,7 @@
<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">
@@ -345,7 +340,7 @@
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewdate-result">&nbsp;</span>
</div>
</div>
<div class="field-pair no-field-pair-bg">
<div class="field-pair">
<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">
@@ -412,11 +407,6 @@
<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>
@@ -497,7 +487,7 @@
\$.ajax({
type: "GET",
url: "../../tapi",
data: {mode:'eval_sort', value: 'movie', name: \$('#moviesamplename').val(), title: \$moviesortstring, movieextra: \$('#movieextra').val(), apikey: '$session', output: 'json' },
data: {mode:'eval_sort', value: 'generic', 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.3/special"#-->
<!--#set global $help_uri="configuration/2.2/special"#-->
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">

View File

@@ -1,16 +1,11 @@
<!--#set global $pane="Switches"#-->
<!--#set global $help_uri="configuration/2.3/switches"#-->
<!--#set global $help_uri="configuration/2.2/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 advanced-settings">
<div class="section">
<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 -->
@@ -72,12 +67,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 advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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>
@@ -109,11 +104,6 @@
</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">
@@ -123,11 +113,6 @@
</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">
@@ -137,7 +122,12 @@
</select>
<span class="desc">$T('explain-action_on_unwanted_extensions')</span>
</div>
<div class="field-pair advanced-settings">
<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="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>
@@ -165,53 +155,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 advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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 advanced-settings">
<div class="field-pair">
<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 advanced-settings <!--#if not $have_nice then "disabled" else "" #-->">
<div class="field-pair <!--#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 advanced-settings <!--#if not $have_ionice then "disabled" else "" #-->">
<div class="field-pair <!--#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>
@@ -222,7 +212,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 advanced-settings">
<div class="field-pair">
<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>
@@ -251,7 +241,7 @@
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section advanced-settings">
<div class="section">
<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.2.1.min.js?v=$version"></script>
<script type="text/javascript" src="../staticcfg/js/jquery-3.1.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,32 +23,16 @@ body {
overflow: visible;
border: 1px solid #dfdede;
background-color: #FFF;
border: 1px solid rgba(0, 0, 0, 0.2);
width: 100%
}
.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 {
.section, .Servers form, #addFeed, #addFeedContent {
border-bottom: 1px solid #dfdede;
overflow: auto;
}
.section:last-child, .Servers form:last-child {
border: 0;
}
.col2 {
z-index: 10;
float: left;
@@ -166,13 +150,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,
.no-field-pair-bg {
.field-pair:last-child {
background-color: transparent;
}
.alt,
@@ -1039,14 +1023,19 @@ input[type="checkbox"] {
color: black;
}
.Servers .chart-selector-container {
float: right;
.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 .glyphicon {
font-size: 1.3em;
padding-right: 4px;
top: 5px;
.Servers .chart-selector:hover {
opacity: 1;
}
.Servers .ct-grid.ct-vertical:first-of-type {
@@ -1078,6 +1067,7 @@ input[type="checkbox"] {
display: none;
}
.alert-no-category,
.alert-translate {
display: none;
margin: 5px 0px 0px;
@@ -1093,13 +1083,6 @@ 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;
@@ -1237,9 +1220,7 @@ input[type="checkbox"] {
margin-bottom: 0;
}
.Servers .server-chart,
.Servers .chart-selector-container,
.Servers .advanced-buttonSeperator {
.Servers .server-chart {
display: none;
}

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,36 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,6 +0,0 @@
/*
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,10 +170,6 @@
<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: displayDateTime(timestamp, \$parent.dateFormat(), 'X'), attr: { 'data-timestamp': timestamp }"></strong>
<strong data-bind="text: date, attr: { 'data-timestamp': timestamp }"></strong>
<span class="queue-message-text" data-bind="html: text"></span>
</td>
</tr>

View File

@@ -59,9 +59,15 @@
<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>
<span class="glyphicon glyphicon-home"></span> <a href="https://forums.sabnzbd.org/viewforum.php?f=11" target="_blank">SABnzbd Forum</a><br />
<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-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>
@@ -150,9 +156,7 @@
</div>
<div class="row options-function-box">
<div class="col-sm-6">
<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>
<a href="./status/showlog?session=$session" target="_blank" class="btn btn-default"><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')">
@@ -175,6 +179,7 @@
</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">
@@ -651,6 +656,7 @@
<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,11 +39,6 @@
<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>
@@ -88,25 +83,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: queueIcon"></span>
<span class="hover-button glyphicon" data-bind="css: { 'glyphicon-play': pausedStatus(), 'glyphicon-pause': !pausedStatus() }"></span>
</a>
</td>
<td class="name">
<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>
<div class="row-wrap-text" data-bind="visible: !editingName()">
<span data-bind="text: name, attr: { 'title': name() }"></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>
@@ -121,8 +116,8 @@
</td>
<td class="progress-indicator">
<div class="progress">
<div class="progress-bar progress-bar-info" data-bind="attr: { 'style': 'width: ' + percentage() + '%; background-color: ' + progressColor() + ';' }">
<strong data-bind="text: percentage() + '%'"></strong>
<div class="progress-bar progress-bar-info" data-bind="attr: { 'style': 'width: ' + percentageRounded() + '; background-color: ' + progressColor() + ';' }">
<strong data-bind="text: percentageRounded"></strong>
<i data-bind="text: missingText"></i>
</div>
<span data-bind="text: progressText"></span>
@@ -133,8 +128,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: !parent.isMultiEditing()">
<!-- ko if: !isGrabbing() -->
<div class="dropdown" data-bind="visible: !isGrabbing() && !parent.isMultiEditing()">
<a href="#" data-toggle="dropdown" data-bind="click: toggleDropdown">
<span class="caret"></span>
</a>
@@ -144,7 +139,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: !isFetchingBlocks -->
<!-- ko if: (status() != 'Fetching') -->
<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,7 +30,6 @@
<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" />
@@ -47,7 +46,7 @@
var sabSpeedHistory = [$bytespersec_list];
var newRelease = "$new_release";
var newReleaseUrl = "$new_rel_url";
var glitterIsBeta = ("$version".search(/[develop|Alpha|Beta|RC]/)) > 0;
var glitterIsBeta = ("$version".search(/Alpa|Beta|x/)) > 0;
var glitterPreLoadQueue = $preload_queue;
var glitterPreLoadHistory = $preload_history;
@@ -64,7 +63,6 @@
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')";
@@ -87,7 +85,6 @@
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')";
@@ -106,7 +103,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.utc(inDate, inFormat)
var theMoment = moment(inDate, inFormat)
}
// Special format or regular format?
if(outFormat == 'fromNow') {
return theMoment.fromNow()
} else {
return theMoment.local().format(outFormat)
return theMoment.format(outFormat)
}
}

View File

@@ -536,7 +536,6 @@ function ViewModel() {
callAPI({
mode: 'warnings'
}).then(function(response) {
// Reset it all
self.allWarnings.removeAll();
if(response) {
@@ -545,16 +544,20 @@ 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[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"),
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"),
clear: self.clearWarnings
};
self.allWarnings.push(warningData)
})
}
@@ -785,28 +788,15 @@ function ViewModel() {
}
// Update the servers
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([])
if(self.statusInfo.servers().length == 0) {
// Initial add
$.each(data.status.servers, function() {
self.statusInfo.servers.push({
'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),
'servername': this.servername,
'serveroptional': this.serveroptional,
'serverpriority': this.serverpriority,
'servertotalconn': this.servertotalconn,
'serverssl': this.serverssl,
'serversslinfo': ko.observable(this.serversslinfo),
'serveractiveconn': ko.observable(this.serveractiveconn),
'servererror': ko.observable(this.servererror),
@@ -814,20 +804,23 @@ 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.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.serveractiveconn(this.serveractiveconn)
activeServer.servererror(this.servererror)
activeServer.serveractive(this.serveractive)
activeServer.serverconnections(this.serverconnections)
activeServer.serversslinfo(this.serversslinfo)
})
}

View File

@@ -478,13 +478,11 @@ 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' || data.avg_age == '-')
self.isFetchingBlocks = data.status == 'Fetching' || data.priority == 'Repair' // No need to update
self.isGrabbing = ko.observable(data.status == 'Grabbing')
self.totalMB = ko.observable(parseFloat(data.mb));
self.remainingMB = ko.observable(parseFloat(data.mbleft))
self.missingMB = ko.observable(parseFloat(data.mbmissing))
self.percentage = ko.observable(parseInt(data.percentage))
self.remainingMB = ko.observable(parseFloat(data.mbleft));
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]);
@@ -504,8 +502,8 @@ function QueueModel(parent, data) {
if(self.status() == 'Checking') {
return '#58A9FA'
}
// Check for missing data, the value is arbitrary! (2%)
if(self.missingMB()/self.totalMB() > 0.02) {
// Check for missing data, the value is arbitrary! (3%)
if(self.missing()/self.totalMB() > 0.03) {
return '#F8A34E'
}
// Set to grey, only when not Force download
@@ -516,23 +514,22 @@ function QueueModel(parent, data) {
return '';
});
// MB's
// 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))
})
self.progressText = ko.pureComputed(function() {
return (self.totalMB() - self.remainingMB()).toFixed(0) + " MB / " + (self.totalMB() * 1).toFixed(0) + " MB";
return self.downloadedMB() + " MB / " + (self.totalMB() * 1).toFixed(0) + " MB";
})
// Texts
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
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
}
return;
})
@@ -541,10 +538,6 @@ 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;
@@ -553,18 +546,6 @@ 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?
@@ -597,12 +578,11 @@ function QueueModel(parent, data) {
self.password(data.password);
self.index(data.index);
self.status(data.status)
self.isGrabbing(data.status == 'Grabbing' || data.avg_age == '-')
self.isGrabbing(data.status == 'Grabbing')
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]);
@@ -700,7 +680,7 @@ function QueueModel(parent, data) {
}
self.changePriority = function(item, event) {
// Not if we are fetching extra blocks for repair!
if(item.isFetchingBlocks) return
if(item.status() == 'Fetching') return
callAPI({
mode: 'queue',
name: 'priority',

View File

@@ -1,13 +1,7 @@
// Peity jQuery plugin version 3.2.1
// (c) 2016 Ben Pickles
// Peity jQuery plugin version 3.2.0
// (c) 2015 Ben Pickles
//
// http://benpickles.github.io/peity
//
// Released under MIT license.
(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);
!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);

View File

@@ -1,124 +1,123 @@
/*!
* Knockout JavaScript library v3.4.2
* (c) The Knockout.js team - http://knockoutjs.com/
* Knockout JavaScript library v3.4.0
* (c) Steven Sanderson - http://knockoutjs.com/
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(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)})()})})();})();
(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)})()})})();})();

8
interfaces/Glitter/templates/static/javascripts/moment.min.js vendored Executable file → Normal 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._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._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,9 +13,6 @@
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) {
@@ -27,13 +24,7 @@ var es = moment.defineLocale('es', {
return monthsShortDot[m.month()];
}
},
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,
monthsParseExact : true,
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

@@ -1,99 +0,0 @@
//! 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,24 +63,7 @@ var pl = moment.defineLocale('pl', {
calendar : {
sameDay: '[Dziś o] LT',
nextDay: '[Jutro 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';
}
},
nextWeek: '[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,7 +41,6 @@ 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 : 4 // The week that contains Jan 4th is the first week of the year.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});

View File

View File

View File

View File

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

View File

@@ -141,12 +141,8 @@ 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: inline-block;
display: block;
}
.queue-table td.name .name-options small {

View File

@@ -28,7 +28,6 @@
<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>
@@ -100,8 +99,9 @@
#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"><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" title="#echo $last_warning.replace("\n"," ").replace('"',"'") #"><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,"");
$.plush.SetWarnings($have_warnings,"<!--#echo $last_warning.replace("\n"," ").replace('"',"'").replace('\\','\\\\') #-->");
$.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.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>
<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>
</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, #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, #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) {
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,11 +109,6 @@ body {
font-weight: bold;
}
#new_release {
color: green;
font-weight: bold;
}
#livetip {
position: absolute;
background-color: #cfc;
@@ -343,6 +338,7 @@ body {
clear:left;
padding: 0 20px 0 25px;
font-size:90%;
font-weight: bold;
}
#nav_text_left a, #nav_text_right a {
color:#000;
@@ -1083,7 +1079,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: 726 B

After

Width:  |  Height:  |  Size: 729 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,11 +33,7 @@
<!--#for $warn in $warnings#-->
<!--#set $odd = not $odd#-->
<tr class="<!--#if $odd then "odd" else "even"#-->">
<!--#set when = datetime.datetime.fromtimestamp($warn.time) #-->
<td>$when</td>
<td>$warn.type</td>
<td>$warn.text</td>
</tr>
<td>$warn.replace("\n","</td><td>", 2)</td></tr>
<!--#end for#-->
</table>
<!--#else#-->

View File

@@ -20,7 +20,6 @@
<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>
@@ -79,6 +78,7 @@
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,4 +1,3 @@
<!--#import datetime#-->
<script type="text/javascript">
window.onload = function() {
location = "../#/status"
@@ -37,10 +36,7 @@ $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#-->
<!--#set when = datetime.datetime.fromtimestamp($warn.time) #-->
$when<br>
$warn.type<br>
$warn.text<br>
$warn<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.2.1.min.js?v=$version"></script>
<script type="text/javascript" src="../staticcfg/js/jquery-3.1.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,10 +16,6 @@
<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

@@ -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

@@ -5,14 +5,14 @@
#
msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-2.4.0-develop\n"
"Project-Id-Version: SABnzbd-2.2.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-12-06 10:56+W. Europe Standard Time\n"
"POT-Creation-Date: 2017-08-16 13:33+W. Europe Daylight Time\n"
"Generated-By: pygettext.py 1.5\n"
@@ -40,22 +40,10 @@ 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 ""
@@ -212,6 +200,15 @@ 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 ""
@@ -372,6 +369,10 @@ 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 ""
@@ -388,6 +389,10 @@ 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 ""
@@ -426,19 +431,14 @@ 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 # 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 [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 [Warning message]
msgid "Cannot read %s"
msgstr ""
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
msgid "Cannot read Watched Folder %s"
msgstr ""
@@ -534,12 +534,6 @@ 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 ""
@@ -610,7 +604,7 @@ msgstr ""
msgid "Authentication missing, please enter username/password from Config->General into your 3rd party program:"
msgstr ""
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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 ""
@@ -670,22 +664,14 @@ msgstr ""
msgid "Undefined server!"
msgstr ""
#: 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."
msgid "Incorrect parameter"
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
@@ -706,7 +692,7 @@ msgstr ""
msgid "m"
msgstr ""
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr ""
@@ -726,18 +712,10 @@ 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
@@ -913,7 +891,6 @@ 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"
@@ -940,7 +917,16 @@ msgid "[%s] Verified in %s, repair is required"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
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)"
msgstr ""
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
@@ -951,10 +937,6 @@ 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"
@@ -980,10 +962,6 @@ 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"
@@ -1045,6 +1023,11 @@ 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 ""
@@ -1053,7 +1036,7 @@ msgstr ""
msgid "Bad response from Pushover (%s): %s"
msgstr ""
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr ""
@@ -1141,6 +1124,10 @@ 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 ""
@@ -1390,7 +1377,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 ""
@@ -1410,10 +1397,6 @@ 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 ""
@@ -1442,6 +1425,10 @@ msgstr ""
msgid "Failed to move files"
msgstr ""
#: sabnzbd/postproc.py
msgid "Running script"
msgstr ""
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr ""
@@ -1462,7 +1449,7 @@ msgstr ""
msgid "Post Processing Failed for %s (%s)"
msgstr ""
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr ""
@@ -1772,14 +1759,6 @@ 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 ""
@@ -2594,10 +2573,6 @@ 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 ""
@@ -2990,14 +2965,6 @@ 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 ""
@@ -3246,7 +3213,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr ""
@@ -3702,22 +3669,6 @@ 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 ""
@@ -3858,10 +3809,6 @@ msgstr ""
msgid "S01E05 Episode Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr ""
@@ -3931,7 +3878,7 @@ msgid "Original Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgid "Original Foldername"
msgstr ""
#: sabnzbd/skintext.py
@@ -3950,6 +3897,10 @@ msgstr ""
msgid "file"
msgstr ""
#: sabnzbd/skintext.py
msgid "folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr ""
@@ -4114,14 +4065,6 @@ 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 ""
@@ -4282,14 +4225,6 @@ 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 ""
@@ -4346,6 +4281,10 @@ msgstr ""
msgid "You must enable JavaScript for Plush to function!"
msgstr ""
#: sabnzbd/skintext.py
msgid "Refresh"
msgstr ""
#: sabnzbd/skintext.py
msgid "Options"
msgstr ""
@@ -4434,6 +4373,10 @@ 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 ""
@@ -4631,23 +4574,19 @@ msgid ""
msgstr ""
#: 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."
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. Don't have a Usenet provider? We recommend trying %s."
msgstr ""
#: sabnzbd/skintext.py
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr ""
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr ""
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr ""
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.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-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-10-27 21:53+0000\n"
"Last-Translator: Søren <Unknown>\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"
"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-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -29,14 +29,11 @@ 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!"
@@ -46,22 +43,10 @@ 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!"
@@ -207,6 +192,10 @@ 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"
@@ -229,6 +218,15 @@ 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"
@@ -245,10 +243,6 @@ 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..."
@@ -401,6 +395,10 @@ 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"
@@ -417,6 +415,10 @@ 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"
@@ -457,19 +459,14 @@ 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"
@@ -567,12 +564,6 @@ 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"
@@ -665,7 +656,7 @@ msgstr ""
"Brugeroplysninger mangler, indtast brugernavn / password fra Konfiguration-> "
"Generelt i dit tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -736,23 +727,14 @@ 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
@@ -773,7 +755,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Kan ikke oprette mappe %s"
@@ -793,20 +775,10 @@ 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
@@ -982,7 +954,6 @@ 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"
@@ -1012,9 +983,17 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Bekræftelse i %s, kræver reparation"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
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)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1024,10 +1003,6 @@ 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"
@@ -1053,10 +1028,6 @@ 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"
@@ -1120,6 +1091,11 @@ 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"
@@ -1128,7 +1104,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 # sabnzbd/notifier.py [Warning message] # 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"
@@ -1216,6 +1192,12 @@ 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"
@@ -1499,7 +1481,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"
@@ -1521,12 +1503,6 @@ 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"
@@ -1555,6 +1531,10 @@ 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"
@@ -1575,7 +1555,7 @@ msgstr "Mere"
msgid "Post Processing Failed for %s (%s)"
msgstr "Efterbehandling mislykkedes for %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "se logfil"
@@ -1889,14 +1869,6 @@ 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"
@@ -2742,12 +2714,6 @@ 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"
@@ -3218,16 +3184,6 @@ 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"
@@ -3502,7 +3458,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/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Maksimalt antal forsøg"
@@ -3979,22 +3935,6 @@ 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"
@@ -4146,10 +4086,6 @@ 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"
@@ -4219,8 +4155,8 @@ msgid "Original Filename"
msgstr "Originalfilnavn"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Orginal Mappenavn"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4238,6 +4174,10 @@ msgstr "tekst"
msgid "file"
msgstr "fil"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "mappe"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteringsstreng"
@@ -4410,14 +4350,6 @@ 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"
@@ -4582,16 +4514,6 @@ 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>"
@@ -4648,6 +4570,10 @@ 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"
@@ -4740,6 +4666,10 @@ 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"
@@ -4948,28 +4878,16 @@ msgstr ""
"Den er licenseret under GNU General Public License version 2 eller (efter "
"eget valg) enhver senere version\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Det lykkedes ikke at hente TV info (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Det lykkedes ikke at omdøbe: %s til %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Kunne ikke omdøbe lignende fil: %s til %s"
@@ -5004,12 +4922,6 @@ 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."
@@ -5065,12 +4977,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)"
@@ -5302,6 +5214,16 @@ 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."
@@ -5414,12 +5336,6 @@ 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"
@@ -5479,9 +5395,6 @@ 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,19 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-09 21:46+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\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-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!"
"X-Launchpad-Export-Date: 2017-08-10 06:03+0000\n"
"X-Generator: Launchpad (build 18446)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -52,19 +48,11 @@ 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!"
@@ -75,7 +63,7 @@ msgstr "unzip-Programmdatei nicht gefunden!"
#: SABnzbd.py
msgid "7za binary... NOT found!"
msgstr "7za-Programmdatei nicht gefunden"
msgstr "7za-Programm … NICHT gefunden!"
#: SABnzbd.py [Warning message]
msgid ""
@@ -215,6 +203,10 @@ 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"
@@ -237,6 +229,15 @@ 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"
@@ -254,10 +255,6 @@ 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."
@@ -416,6 +413,10 @@ 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 ""
@@ -433,6 +434,10 @@ 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"
@@ -476,19 +481,14 @@ 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,12 +586,6 @@ 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"
@@ -687,7 +681,7 @@ msgstr ""
"Authentifizierung fehlt. Bitte Benutzernamen und Passwort aus Einstellungen-"
">Allgemein in die externe Anwendung eingeben:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -757,23 +751,14 @@ 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
@@ -794,7 +779,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Verzeichnis %s konnte nicht angelegt werden"
@@ -814,23 +799,10 @@ 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
@@ -1010,7 +982,6 @@ 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"
@@ -1040,11 +1011,19 @@ 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 ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
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)"
msgstr ""
"Ungültige par2-Dateien oder ungültige PAR2-Parameter, Auftrag konnte nicht "
"überprüft oder repariert werden"
"Reparatur fehlgeschlagen. Nicht genug Reparatur-Blöcke vorhanden (%s zu "
"wenig)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1054,12 +1033,6 @@ 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"
@@ -1085,10 +1058,6 @@ 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"
@@ -1096,7 +1065,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ührungsrechte (+x)"
msgstr "Dem Pythonskript \"%s\" fehlen die Ausführenrechte (+x)"
#: sabnzbd/newswrapper.py
msgid "This server does not allow SSL on this port"
@@ -1155,6 +1124,11 @@ 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"
@@ -1163,7 +1137,7 @@ msgstr "Konnte Prowl-Nachricht nicht versenden"
msgid "Bad response from Pushover (%s): %s"
msgstr "Fehlerhafte Antwort von Pushbullet (%s): %s"
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Konnte Pushover-Nachricht nicht versenden"
@@ -1256,6 +1230,14 @@ 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 ""
"%d 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"
@@ -1548,7 +1530,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"
@@ -1575,14 +1557,6 @@ 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 ""
@@ -1612,6 +1586,10 @@ 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"
@@ -1632,7 +1610,7 @@ msgstr "Mehr"
msgid "Post Processing Failed for %s (%s)"
msgstr "Nachbearbeitung von %s fehlgeschlagen (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "Beachten Sie die Protokolldatei"
@@ -1946,14 +1924,6 @@ 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"
@@ -2802,14 +2772,6 @@ 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"
@@ -2938,11 +2900,11 @@ msgstr "Alle Aufträge behalten"
#: sabnzbd/skintext.py
msgid "Keep maximum number of completed jobs"
msgstr "Behalte maximale Anzahl an abgeschlossenen Aufträgen"
msgstr ""
#: sabnzbd/skintext.py
msgid "Keep completed jobs maximum number of days"
msgstr "Behalte abgeschlossene Aufträge maximal X Tage"
msgstr ""
#: sabnzbd/skintext.py
msgid "Do not keep any completed jobs"
@@ -3296,18 +3258,6 @@ 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"
@@ -3318,7 +3268,7 @@ msgstr "Aufgabe abgebrochen (verschoben in die Historie)"
#: sabnzbd/skintext.py [Four way switch for duplicates]
msgid "Tag job"
msgstr "Markiere Auftrag"
msgstr ""
#: sabnzbd/skintext.py [Three way switch for encrypted posts]
msgid "Abort"
@@ -3375,15 +3325,13 @@ msgstr ""
#: sabnzbd/skintext.py
msgid "Use tags from indexer"
msgstr "Übernehme Markierungen vom Indexer"
msgstr ""
#: sabnzbd/skintext.py
msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
"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"
@@ -3600,7 +3548,7 @@ msgstr ""
"Die Performanz verbessern, indem eine schwächere SSL-Verschlüsselung "
"erzwungen wird."
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Maximale Wiederholungen"
@@ -3629,9 +3577,6 @@ 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"
@@ -3881,11 +3826,11 @@ msgstr "Höchstens"
#: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"]
msgid "From SxxEyy"
msgstr "Von SxxEyy"
msgstr "Von SxxExx"
#: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"]
msgid "From Show SxxEyy"
msgstr "Von Show SxxEyy"
msgstr ""
#: sabnzbd/skintext.py [Config->RSS section header]
msgid "Matched"
@@ -4085,22 +4030,6 @@ 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"
@@ -4153,12 +4082,6 @@ 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 ""
@@ -4254,10 +4177,6 @@ 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"
@@ -4327,8 +4246,8 @@ msgid "Original Filename"
msgstr "Ursprünglicher Dateiname"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Ursprünglicher Ordnername"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4346,6 +4265,10 @@ msgstr "text"
msgid "file"
msgstr "Datei"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "Ordner"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sortieranweisung"
@@ -4519,14 +4442,6 @@ 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"
@@ -4691,16 +4606,6 @@ 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>"
@@ -4757,6 +4662,10 @@ 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"
@@ -4849,6 +4758,10 @@ 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"
@@ -5059,29 +4972,16 @@ msgstr ""
"Sie steht unter der GNU GENERAL PUBLIC LICENSE Version 2 oder (nach Ihrer "
"Option) jeder späteren Version.\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Fehler beim Abrufen der TV-Informationen: %s"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Umbenennen von %s nach %s fehlgeschlagen."
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Umbenennen der gleichen Datei von %s nach %s fehlgeschlagen."
@@ -5119,12 +5019,6 @@ 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."
@@ -5187,6 +5081,9 @@ 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 "
@@ -5482,6 +5379,17 @@ 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."
@@ -5565,12 +5473,6 @@ 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"
@@ -5609,9 +5511,6 @@ 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"
@@ -5656,9 +5555,6 @@ 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,6 +69,9 @@ 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!)"
@@ -102,21 +105,11 @@ 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-12-06 10:30+0000\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"
"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-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -45,23 +45,11 @@ 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"
@@ -204,6 +192,10 @@ 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"
@@ -226,6 +218,15 @@ 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"
@@ -242,10 +243,6 @@ 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"
@@ -399,6 +396,10 @@ 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"
@@ -415,6 +416,10 @@ 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"
@@ -455,19 +460,14 @@ 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,12 +566,6 @@ 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"
@@ -664,7 +658,7 @@ msgstr ""
"Faltaron datos de cuenta, favor ingresar usuario/contraseña desde Config-"
">General en tu aplicacion externa:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -735,23 +729,14 @@ 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
@@ -772,7 +757,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "No se pudo crear el directorio %s"
@@ -792,20 +777,10 @@ 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
@@ -985,7 +960,6 @@ 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"
@@ -1015,9 +989,19 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verificado en %s, se necesita reparar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
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)"
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..."
@@ -1027,12 +1011,6 @@ 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"
@@ -1058,10 +1036,6 @@ 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"
@@ -1125,6 +1099,11 @@ 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"
@@ -1133,7 +1112,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 # sabnzbd/notifier.py [Warning message] # 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"
@@ -1224,6 +1203,12 @@ 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"
@@ -1512,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 "Error grave"
@@ -1535,12 +1520,6 @@ 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"
@@ -1569,6 +1548,10 @@ 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"
@@ -1589,7 +1572,7 @@ msgstr "Más"
msgid "Post Processing Failed for %s (%s)"
msgstr "Error al post-procesar %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "ver fichero de log"
@@ -1905,14 +1888,6 @@ 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"
@@ -2753,12 +2728,6 @@ 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 ""
@@ -3229,16 +3198,6 @@ 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"
@@ -3521,7 +3480,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Reintentos máximos"
@@ -4003,22 +3962,6 @@ 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"
@@ -4166,10 +4109,6 @@ 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"
@@ -4239,8 +4178,8 @@ msgid "Original Filename"
msgstr "Nombre fichero original"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Nombre directorio original"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4258,6 +4197,10 @@ msgstr "texto"
msgid "file"
msgstr "archivo"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "carpeta"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Ordenar cadena"
@@ -4431,14 +4374,6 @@ 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"
@@ -4604,16 +4539,6 @@ 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>"
@@ -4670,6 +4595,10 @@ 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"
@@ -4762,6 +4691,10 @@ 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"
@@ -4970,29 +4903,16 @@ msgstr ""
"Está licenciado bajo la versión 2 ó posterior de GNU GENERAL PUBLIC "
"LICENSE.\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Error al recuperar info de la serie (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Error al renombrar: %s a %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Error al renombrar ficheros similares: %s a %s"
@@ -5040,15 +4960,9 @@ 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 />"
@@ -5095,15 +5009,12 @@ 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"
@@ -5291,9 +5202,6 @@ 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?"
@@ -5469,9 +5377,6 @@ 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."
@@ -5522,6 +5427,17 @@ 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-12-06 10:30+0000\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"
"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-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,24 +43,12 @@ 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!"
@@ -207,6 +195,10 @@ 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"
@@ -229,6 +221,15 @@ 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"
@@ -245,10 +246,6 @@ 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"
@@ -398,6 +395,10 @@ 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"
@@ -414,6 +415,10 @@ 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"
@@ -454,19 +459,14 @@ 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,12 +563,6 @@ 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"
@@ -661,7 +655,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/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -731,23 +725,14 @@ 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
@@ -768,7 +753,7 @@ msgstr "t"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Ei voi luoda kansiota %s"
@@ -788,20 +773,10 @@ 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
@@ -978,7 +953,6 @@ 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"
@@ -1007,9 +981,17 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Varmennetiin ajassa %s, vaatii korjauksen"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
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)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1019,10 +1001,6 @@ 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"
@@ -1048,10 +1026,6 @@ 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"
@@ -1115,6 +1089,11 @@ 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"
@@ -1123,7 +1102,7 @@ msgstr "Prowl viestin lähetys epäonnistui"
msgid "Bad response from Pushover (%s): %s"
msgstr "Virheellinen vastaus Pushoverilta (%s): %s"
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Pushover viestin lähetys epäonnistui"
@@ -1213,6 +1192,12 @@ 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"
@@ -1500,7 +1485,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"
@@ -1522,12 +1507,6 @@ 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"
@@ -1556,6 +1535,10 @@ 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"
@@ -1576,7 +1559,7 @@ msgstr "Lisää"
msgid "Post Processing Failed for %s (%s)"
msgstr "Jälkikäsittely epäonnistui kohteelle %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "katso lokitiedosto"
@@ -1888,14 +1871,6 @@ 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ä"
@@ -2741,12 +2716,6 @@ 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 ""
@@ -3222,16 +3191,6 @@ 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ää"
@@ -3510,7 +3469,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/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Enimmäismäärä uudelleenyrityksille"
@@ -3988,22 +3947,6 @@ 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"
@@ -4156,10 +4099,6 @@ 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"
@@ -4229,8 +4168,8 @@ msgid "Original Filename"
msgstr "Alkuperäinen tiedostonimi"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Alkuperäinen kansionimi"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4248,6 +4187,10 @@ msgstr "teksti"
msgid "file"
msgstr "tiedosto"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "kansio"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Lajittelumerkkijono"
@@ -4422,14 +4365,6 @@ 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"
@@ -4595,16 +4530,6 @@ 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>"
@@ -4661,6 +4586,10 @@ 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"
@@ -4752,6 +4681,10 @@ 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ä"
@@ -4961,28 +4894,16 @@ msgstr ""
"Se on lisensoitu GNU GENERAL PUBLIC LICENSE Versio 2 alaiseksi ja (oman "
"valinnan mukaan) myös myöhempien versioiden.\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Virhe noudettaessa TV tietoja (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Virhe uudelleennimettäessä: %s %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Samankaltaisen tiedoston uudelleennimeäminen epäonnistui: %s %s"
@@ -5014,9 +4935,6 @@ 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"
@@ -5074,9 +4992,6 @@ 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 "
@@ -5097,6 +5012,9 @@ 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"
@@ -5130,12 +5048,6 @@ 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 />"
@@ -5279,6 +5191,9 @@ 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)"
@@ -5401,12 +5316,6 @@ 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"
@@ -5449,6 +5358,13 @@ 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-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-12-06 19:46+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-07 18:53+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-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-08 05:33+0000\n"
"X-Generator: Launchpad (build 18446)\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,23 +48,11 @@ 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!"
@@ -216,6 +204,10 @@ 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"
@@ -238,6 +230,15 @@ 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"
@@ -254,10 +255,6 @@ 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"
@@ -419,6 +416,10 @@ 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"
@@ -435,6 +436,10 @@ 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"
@@ -478,19 +483,14 @@ 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,12 +590,6 @@ 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"
@@ -690,7 +684,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/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -761,25 +755,14 @@ 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
@@ -800,7 +783,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Impossible de créer le dossier %s"
@@ -820,23 +803,10 @@ 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
@@ -1019,7 +989,6 @@ 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"
@@ -1050,10 +1019,17 @@ 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 ""
"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."
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)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1063,10 +1039,6 @@ 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"
@@ -1092,10 +1064,6 @@ 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"
@@ -1164,6 +1132,11 @@ 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"
@@ -1172,7 +1145,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 # sabnzbd/notifier.py [Warning message] # 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"
@@ -1262,6 +1235,14 @@ 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é"
@@ -1555,7 +1536,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"
@@ -1580,14 +1561,6 @@ 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 ""
@@ -1618,6 +1591,10 @@ 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"
@@ -1638,7 +1615,7 @@ msgstr "Plus"
msgid "Post Processing Failed for %s (%s)"
msgstr "Échec du post-traitement pour %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "voir le journal"
@@ -1954,14 +1931,6 @@ 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é"
@@ -2812,14 +2781,6 @@ 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é"
@@ -3307,18 +3268,6 @@ 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"
@@ -3609,7 +3558,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/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Nombre de tentatives maximum"
@@ -4098,23 +4047,6 @@ 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"
@@ -4270,10 +4202,6 @@ 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"
@@ -4343,8 +4271,8 @@ msgid "Original Filename"
msgstr "Nom de fichier originel"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr "Nom d'origine de la tâche"
msgid "Original Foldername"
msgstr "Nom du dossier originel"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4362,6 +4290,10 @@ 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"
@@ -4535,14 +4467,6 @@ 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"
@@ -4709,18 +4633,6 @@ 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>"
@@ -4777,6 +4689,10 @@ 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"
@@ -4869,6 +4785,10 @@ 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"
@@ -5079,30 +4999,16 @@ msgstr ""
"Il est distribué sous licence GNU GENERAL PUBLIC LICENSE Version 2 ou toute "
"autre version ultérieure.\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Erreur lors de l'obtention des information TV (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Échec du renommage : %s en %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Impossible de renommer le fichier similaire : %s en %s"
@@ -5134,9 +5040,6 @@ 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."
@@ -5437,9 +5340,6 @@ 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"
@@ -5457,6 +5357,18 @@ 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."
@@ -5498,18 +5410,12 @@ 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"
@@ -5616,8 +5522,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 "Main packet not found..."
#~ msgstr "Paquet principal introuvable..."
#~ msgid "Error while adding %s, removing"
#~ msgstr "Erreur lors de l'ajout de %s, suppression"
#~ msgid ""
#~ "\n"
@@ -5705,9 +5611,6 @@ 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-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-12-06 19:50+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+0000\n"
"PO-Revision-Date: 2017-08-15 20:47+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-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-16 05:16+0000\n"
"X-Generator: Launchpad (build 18446)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -41,35 +41,23 @@ msgstr "!לא נמצא ..._yenc פירקן"
#: SABnzbd.py [Error message]
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 "!בינארי... לא נמצא MultiPar"
msgstr "!לא נמצא ...par2 בינארי"
#: 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 ""
@@ -200,6 +188,10 @@ 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-כישלון ב"
@@ -222,6 +214,15 @@ 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,10 +239,6 @@ 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 "דיסק מלא! מאלץ השהיה"
@@ -392,6 +389,10 @@ 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 "נכשל בסגירת מסד-נתונים, ראה יומן"
@@ -408,6 +409,10 @@ 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 מאמר"
@@ -436,7 +441,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."
@@ -447,22 +452,17 @@ 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,12 +558,6 @@ 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-לא ניתן למצוא תבניות דוא\"ל"
@@ -654,7 +648,7 @@ msgstr ""
":אימות חסר, אנא הכנס שם משתמש/סיסמה מתוך תצורה->כללי לתוך תכנית הצד השלישי "
"שלך"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -723,23 +717,14 @@ 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
@@ -760,7 +745,7 @@ msgstr "ש"
msgid "m"
msgstr "ד"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "%s לא יכול ליצור את הספרייה"
@@ -780,27 +765,15 @@ 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]
@@ -971,7 +944,6 @@ 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"
@@ -999,10 +971,17 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "תיקון דרוש ,%s-[%s] וודאו ב"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
"בלתי תקפים, לא יכול לוודא או לתקן PAR2 בלתי תקפים או פרמטרי par2 קבצי"
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) תיקון נכשל, אין מספיק גושי תיקון"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1012,10 +991,6 @@ 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"
@@ -1041,10 +1016,6 @@ 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"
@@ -1088,7 +1059,7 @@ msgstr "התווסף NZB"
#: sabnzbd/notifier.py
msgid "Post-processing started"
msgstr "בתר-עיבוד התחיל"
msgstr "לאחר-עיבוד התחיל"
#: sabnzbd/notifier.py [Notification]
msgid "Job finished"
@@ -1110,6 +1081,11 @@ 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 נכשל בשליחת הודעת"
@@ -1118,7 +1094,7 @@ msgstr "Prowl נכשל בשליחת הודעת"
msgid "Bad response from Pushover (%s): %s"
msgstr "Pushover (%s): %s-תגובה רעה מ"
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "pushover נכשל בשליחת הודעת"
@@ -1206,6 +1182,14 @@ 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 "בוטל, לא יכול להיות שלם"
@@ -1490,7 +1474,7 @@ msgstr ""
".כבר רץ SABnzbd איזשהי תוכנה אחרת משתמשת בפתחה או %s לא היה ניתן לקשר את "
"פתחה %s על"
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
#: sabnzbd/panic.py # sabnzbd/panic.py
msgid "Fatal error"
msgstr "שגיאה חמורה"
@@ -1514,13 +1498,6 @@ 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 דרושים זמינים"
@@ -1531,7 +1508,7 @@ msgstr "הורדה נכשלה - לא בשרת(ים) שלך"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "אין בתר-עיבוד בגלל וידוא כושל"
msgstr "אין לאחר-עיבוד בגלל וידוא כושל"
#: sabnzbd/postproc.py
msgid "Moving"
@@ -1549,6 +1526,10 @@ 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 מריץ תסריט משתמש"
@@ -1567,9 +1548,9 @@ msgstr "עוד"
#: sabnzbd/postproc.py [Error message]
msgid "Post Processing Failed for %s (%s)"
msgstr "%s (%s) בתר-עיבוד נכשל עבור"
msgstr "%s (%s) לאחר-עיבוד נכשל עבור"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "ראה קובץ יומן"
@@ -1595,7 +1576,7 @@ msgstr "%s לא יכול ליצור תיקייה סופית"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "בתר-עיבוד"
msgstr "לאחר-עיבוד"
#: sabnzbd/postproc.py
msgid "[%s] No par2 sets"
@@ -1831,11 +1812,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"
@@ -1881,14 +1862,6 @@ 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 "כבוי"
@@ -2156,7 +2129,7 @@ msgstr "סוגיות"
#: sabnzbd/skintext.py [Main menu item]
msgid "Support the project, Donate!"
msgstr "!תמוך במיזם, תרום"
msgstr "תמוך במיזם, תרום!"
#: sabnzbd/skintext.py [Main menu item]
msgid "General"
@@ -2592,12 +2565,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"
@@ -2728,14 +2701,6 @@ 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 "אבטחה"
@@ -2969,7 +2934,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
@@ -3155,11 +3120,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"
@@ -3193,17 +3158,6 @@ 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 "השלך"
@@ -3263,7 +3217,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"
@@ -3274,8 +3228,8 @@ msgid ""
"When sorting, use tags from indexer for title, season, episode, etc. "
"Otherwise all naming is derived from the NZB name."
msgstr ""
".בעת מיון, השתמש בתגים ממדדן עבור כותרת, עונה, פרק וכדומה\r\n"
".NZB-אחרת כל מתן השמות נגזר משם ה"
".NZB-בעת מיון, השתמש בתגים ממדדן עבור כותרת, עונה, פרק וכדומה. אחרת כל מתן "
"השמות נגזר משם ה"
#: sabnzbd/skintext.py
msgid "Enable folder rename"
@@ -3286,8 +3240,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"
@@ -3379,12 +3333,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"
@@ -3413,7 +3367,7 @@ msgstr "שרת"
#: sabnzbd/skintext.py
msgid "Post processing"
msgstr "בתר-עיבוד"
msgstr "לאחר-עיבוד"
#: sabnzbd/skintext.py
msgid "Naming"
@@ -3475,7 +3429,7 @@ msgstr "SSL צפני"
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ".חלש יותר SSL הגבר ביצועים ע\"י אילוץ חוזק הצפנת"
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "ניסיונות חוזרים מרביים"
@@ -3511,7 +3465,7 @@ msgstr "אפשר סינון"
#: sabnzbd/skintext.py
msgid "Action downloads according to filtering rules."
msgstr ".הורדה בהתאם לכללי הסינון"
msgstr ".הורדות פעולה בהתאם לחוקי הסינון"
#: sabnzbd/skintext.py
msgid "Abort If"
@@ -3953,22 +3907,6 @@ 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"
@@ -4119,10 +4057,6 @@ msgstr "1x05 תיקיית פרק"
msgid "S01E05 Episode Folder"
msgstr "S01E05 תיקיית פרק"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "שם עבודה בתור שם קובץ"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "כותר"
@@ -4192,8 +4126,8 @@ msgid "Original Filename"
msgstr "שם מקורי של קובץ"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr "שם עבודה מקורי"
msgid "Original Foldername"
msgstr "שם קובץ מקורי"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4211,6 +4145,10 @@ msgstr "text"
msgid "file"
msgstr "קובץ"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "תיקייה"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "מיין מחרוזת"
@@ -4382,14 +4320,6 @@ 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 "קצב רענון"
@@ -4554,18 +4484,6 @@ 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>"
@@ -4622,6 +4540,10 @@ 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 "אפשרויות"
@@ -4712,6 +4634,10 @@ 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 "העלה"
@@ -4918,28 +4844,16 @@ msgstr ""
"תוכנה חינמית, ואתה מוזמן להפיצה מחדש תחת תנאים מסוימים. היא ברשיון תחת רשיון "
"ציבורי כללי של SABnzbd\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "(%s) שגיאה בהשגת מידע טלוויזיה"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "%s אל %s:נכשל בשינוי שם"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "%s אל %s :נכשל בשינוי שם של קובץ דומה"
@@ -4983,9 +4897,6 @@ msgstr "%s ;משיכת כתובת נכשלה"
#~ msgid "Skip"
#~ msgstr "דלג"
#~ msgid "folder"
#~ msgstr "תיקייה"
#~ msgid "OK"
#~ msgstr "אישור"
@@ -5014,23 +4925,11 @@ 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 "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 "Error while adding %s, removing"
#~ msgstr "מסיר ,%s שגיאה בזמן הוספת"
#~ 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-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"
"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"
"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-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -45,23 +45,11 @@ 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!"
@@ -206,6 +194,10 @@ 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"
@@ -228,6 +220,15 @@ 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"
@@ -244,10 +245,6 @@ 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..."
@@ -394,6 +391,10 @@ 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"
@@ -410,6 +411,10 @@ 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"
@@ -450,19 +455,14 @@ 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,12 +559,6 @@ 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"
@@ -657,7 +651,7 @@ msgstr ""
"Autentisering mangler, angi brukernavn/passord fra Konfigurasjon->Generelt i "
"ditt tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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,23 +721,14 @@ 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
@@ -764,7 +749,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Kan ikke opprette mappe %s"
@@ -784,20 +769,10 @@ 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
@@ -973,7 +948,6 @@ 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"
@@ -1002,9 +976,18 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verifisering tok %s, krever reparasjon"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
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)"
msgstr ""
"Mislykket reparasjon, finner ikke nødvendige reparasjonsblokker (%s mangler)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1014,11 +997,6 @@ 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"
@@ -1044,10 +1022,6 @@ 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"
@@ -1111,6 +1085,11 @@ 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"
@@ -1119,7 +1098,7 @@ msgstr "Klarte ikke å sende Prowl melding"
msgid "Bad response from Pushover (%s): %s"
msgstr "Ukorrekt svar fra Pushover (%s): %s"
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Klarte ikke å sende pushover-melding"
@@ -1207,6 +1186,12 @@ 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"
@@ -1492,7 +1477,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"
@@ -1514,12 +1499,6 @@ 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"
@@ -1548,6 +1527,10 @@ 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"
@@ -1568,7 +1551,7 @@ msgstr "Mer"
msgid "Post Processing Failed for %s (%s)"
msgstr "Etterbehandling mislyktes for %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "se loggfil"
@@ -1880,14 +1863,6 @@ 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"
@@ -2727,12 +2702,6 @@ 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 ""
@@ -3192,16 +3161,6 @@ 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"
@@ -3474,7 +3433,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Maksimum antall forsøk"
@@ -3948,22 +3907,6 @@ 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"
@@ -4112,10 +4055,6 @@ 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"
@@ -4185,8 +4124,8 @@ msgid "Original Filename"
msgstr "Originalfilnavn"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Originalt mappenavn"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4204,6 +4143,10 @@ msgstr "tekst"
msgid "file"
msgstr "fil"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "mappe"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteringsstreng"
@@ -4377,14 +4320,6 @@ 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"
@@ -4547,16 +4482,6 @@ 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>"
@@ -4613,6 +4538,10 @@ 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"
@@ -4703,6 +4632,10 @@ 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"
@@ -4912,29 +4845,16 @@ msgstr ""
"Det er lisensier under GNU GENERAL PUBLIC LICENSE Versjon 2 eller senere "
"versjoner.\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Kunne ikke hente TV info (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Kunne ikke endre navn fra: %s til %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Kunne ikke endre navn på lik fil: %s til %s"
@@ -4969,9 +4889,6 @@ 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 />"
@@ -5017,12 +4934,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)"
@@ -5294,6 +5211,17 @@ 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."
@@ -5315,9 +5243,6 @@ 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:"
@@ -5351,9 +5276,6 @@ 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 />"
@@ -5449,9 +5371,6 @@ 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"
@@ -5517,6 +5436,3 @@ 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-12-06 10:30+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,22 +43,10 @@ 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!"
@@ -204,6 +192,10 @@ 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"
@@ -226,6 +218,15 @@ 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"
@@ -242,10 +243,6 @@ 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"
@@ -394,6 +391,10 @@ 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"
@@ -410,6 +411,10 @@ 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"
@@ -450,19 +455,14 @@ 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,12 +561,6 @@ 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"
@@ -659,7 +653,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/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -730,23 +724,14 @@ 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
@@ -767,7 +752,7 @@ msgstr "g"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Nie można utworzyć katalogu %s"
@@ -787,20 +772,10 @@ 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
@@ -976,7 +951,6 @@ 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"
@@ -1006,9 +980,19 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Zweryfikowano w %s, wymagana naprawa"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
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)"
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..."
@@ -1018,12 +1002,6 @@ 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"
@@ -1049,10 +1027,6 @@ 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"
@@ -1116,6 +1090,11 @@ 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"
@@ -1124,7 +1103,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 # sabnzbd/notifier.py [Warning message] # 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"
@@ -1214,6 +1193,12 @@ 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ć"
@@ -1498,7 +1483,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"
@@ -1521,12 +1506,6 @@ 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"
@@ -1556,6 +1535,10 @@ 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"
@@ -1576,7 +1559,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 [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "sprawdź logi"
@@ -1888,14 +1871,6 @@ 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"
@@ -2733,12 +2708,6 @@ 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 ""
@@ -3204,16 +3173,6 @@ 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ć"
@@ -3491,7 +3450,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Maksymalna ilość prób"
@@ -3966,22 +3925,6 @@ 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"
@@ -4130,10 +4073,6 @@ 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ł"
@@ -4203,8 +4142,8 @@ msgid "Original Filename"
msgstr "Oryginalna nazwa pliku"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Oryginalna nazwa katalogu"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4222,6 +4161,10 @@ msgstr "tekst"
msgid "file"
msgstr "plik"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "katalog"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Wzorzec sortowania"
@@ -4395,14 +4338,6 @@ 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"
@@ -4565,16 +4500,6 @@ 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>"
@@ -4631,6 +4556,10 @@ 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"
@@ -4721,6 +4650,10 @@ 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"
@@ -4929,28 +4862,16 @@ 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/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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Błąd pobierania informacji TV (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Nie udało się zmienić nazwy %s na %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Nie udało się zmienić nazwy podobnego pliku %s na %s"
@@ -4982,9 +4903,6 @@ 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"
@@ -5001,9 +4919,6 @@ 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"
@@ -5107,9 +5022,6 @@ 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"
@@ -5203,12 +5115,6 @@ 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ąć?"
@@ -5289,12 +5195,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"
@@ -5517,6 +5423,16 @@ 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-12-06 10:30+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -44,23 +44,11 @@ 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!"
@@ -204,6 +192,10 @@ 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"
@@ -226,6 +218,15 @@ 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"
@@ -242,10 +243,6 @@ 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"
@@ -396,6 +393,10 @@ 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"
@@ -412,6 +413,10 @@ 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"
@@ -452,19 +457,14 @@ 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,12 +562,6 @@ 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"
@@ -660,7 +654,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/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -730,23 +724,14 @@ 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
@@ -767,7 +752,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Não é possível criar a pasta %s"
@@ -787,20 +772,10 @@ 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
@@ -976,7 +951,6 @@ 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"
@@ -1005,9 +979,17 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verificado em %s. É necessário reparar"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
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)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1017,10 +999,6 @@ 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"
@@ -1046,10 +1024,6 @@ 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"
@@ -1113,6 +1087,11 @@ 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"
@@ -1121,7 +1100,7 @@ msgstr "Falha ao enviar mensagem Prowl"
msgid "Bad response from Pushover (%s): %s"
msgstr "Resposta incorreta do Pushover (%s): %s"
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Falha ao enviar mensagem pushover"
@@ -1211,6 +1190,12 @@ 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"
@@ -1497,7 +1482,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"
@@ -1519,12 +1504,6 @@ 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 ""
@@ -1554,6 +1533,10 @@ 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"
@@ -1574,7 +1557,7 @@ msgstr "Mais"
msgid "Post Processing Failed for %s (%s)"
msgstr "O pós-processamento falhou para %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "veja o arquivo de log"
@@ -1887,14 +1870,6 @@ 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"
@@ -2733,12 +2708,6 @@ 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 ""
@@ -3204,16 +3173,6 @@ 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"
@@ -3488,7 +3447,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Máximo de tentativas"
@@ -3964,22 +3923,6 @@ 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"
@@ -4128,10 +4071,6 @@ 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"
@@ -4201,8 +4140,8 @@ msgid "Original Filename"
msgstr "Nome do arquivo original"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Nome da pasta original"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4220,6 +4159,10 @@ msgstr "texto"
msgid "file"
msgstr "arquivo"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "pasta"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "String de ordenação"
@@ -4393,14 +4336,6 @@ 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"
@@ -4563,16 +4498,6 @@ 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>"
@@ -4629,6 +4554,10 @@ 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"
@@ -4721,6 +4650,10 @@ 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"
@@ -4929,29 +4862,16 @@ 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/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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Erro ao obter informações de TV (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Falha ao renomear: %s para %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Falha ao renomear arquivo similar: %s para %s"
@@ -4987,15 +4907,9 @@ 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 />"
@@ -5048,12 +4962,6 @@ 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:"
@@ -5063,6 +4971,9 @@ 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"
@@ -5374,12 +5285,6 @@ 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."
@@ -5447,6 +5352,17 @@ 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-12-06 10:30+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:53+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,24 +43,12 @@ 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!"
@@ -207,6 +195,10 @@ 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"
@@ -229,6 +221,15 @@ 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"
@@ -245,10 +246,6 @@ 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ă"
@@ -398,6 +395,10 @@ 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"
@@ -414,6 +415,10 @@ 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"
@@ -454,19 +459,14 @@ 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,12 +564,6 @@ 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"
@@ -662,7 +656,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/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -733,23 +727,14 @@ 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
@@ -770,7 +755,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Nu pot crea dosarul %s"
@@ -790,20 +775,10 @@ 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
@@ -979,7 +954,6 @@ 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"
@@ -1009,9 +983,17 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verificat în %s, reparare necesară"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
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)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1021,10 +1003,6 @@ 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"
@@ -1050,10 +1028,6 @@ 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"
@@ -1117,6 +1091,11 @@ 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"
@@ -1125,7 +1104,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 # sabnzbd/notifier.py [Warning message] # 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"
@@ -1216,6 +1195,12 @@ 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"
@@ -1504,7 +1489,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ă"
@@ -1526,12 +1511,6 @@ 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"
@@ -1560,6 +1539,10 @@ 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"
@@ -1580,7 +1563,7 @@ msgstr "Mai mult"
msgid "Post Processing Failed for %s (%s)"
msgstr "Post Procesare Nereuşită pentru %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "vezi fişier jurnal"
@@ -1892,14 +1875,6 @@ 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"
@@ -2740,12 +2715,6 @@ 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 ""
@@ -3205,16 +3174,6 @@ 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ă"
@@ -3490,7 +3449,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Număr Maxim reîncercări"
@@ -3969,22 +3928,6 @@ 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"
@@ -4132,10 +4075,6 @@ 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"
@@ -4205,8 +4144,8 @@ msgid "Original Filename"
msgstr "Nume de Fişier Original"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Nume de Dosar Original"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4224,6 +4163,10 @@ msgstr "text"
msgid "file"
msgstr "fișier"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "dosar"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Şir Caractere Sortare"
@@ -4396,14 +4339,6 @@ 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"
@@ -4568,16 +4503,6 @@ 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>"
@@ -4634,6 +4559,10 @@ 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"
@@ -4726,6 +4655,10 @@ 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ă"
@@ -4935,28 +4868,16 @@ msgstr ""
"Este licenţiat sub GNU General Public License versiunea 2 sau (la opţiunea "
"dumneavoastră) orice versiune ulterioară.\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Eroare obţinere info TV (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Redenumire:%s în %s nereuşită"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Redenumire fişiere similare : %s în %s nereuşită"
@@ -4992,15 +4913,9 @@ 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 />"
@@ -5082,12 +4997,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)"
@@ -5351,12 +5266,6 @@ 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ă."
@@ -5433,6 +5342,13 @@ 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."
@@ -5485,6 +5401,9 @@ 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%%."
@@ -5502,9 +5421,6 @@ 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-12-06 10:30+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
"Generated-By: pygettext.py 1.5\n"
#: SABnzbd.py [Error message]
@@ -41,22 +41,10 @@ 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... НЕ найден"
@@ -199,6 +187,10 @@ 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"
@@ -221,6 +213,15 @@ 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,10 +238,6 @@ 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 "На диске нет места Принудительная приостановка"
@@ -387,6 +384,10 @@ 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,6 +404,10 @@ 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"
@@ -443,19 +448,14 @@ 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,12 +551,6 @@ 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"
@@ -652,7 +646,7 @@ msgstr ""
"Отсутствуют учётные данные. Введите в сторонней программе имя пользователя и "
"пароль из раздела «Настройка -> Общие»:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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,23 +714,14 @@ 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
@@ -757,7 +742,7 @@ msgstr "ч"
msgid "m"
msgstr "м"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Не удаётся создать каталог %s"
@@ -777,20 +762,10 @@ 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
@@ -966,7 +941,6 @@ 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"
@@ -996,9 +970,18 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Проверено за %s. Требуется исправление"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
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)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1008,11 +991,6 @@ 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"
@@ -1038,10 +1016,6 @@ 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"
@@ -1105,6 +1079,11 @@ 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 ""
@@ -1113,7 +1092,7 @@ msgstr ""
msgid "Bad response from Pushover (%s): %s"
msgstr ""
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr ""
@@ -1201,6 +1180,12 @@ 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 ""
@@ -1490,7 +1475,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 "Критическая ошибка"
@@ -1512,12 +1497,6 @@ 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 ""
@@ -1546,6 +1525,10 @@ 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"
@@ -1566,7 +1549,7 @@ msgstr "Подробнее"
msgid "Post Processing Failed for %s (%s)"
msgstr "Ошибка пост-обработки для %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "см. журнал"
@@ -1878,14 +1861,6 @@ 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 "Выкл."
@@ -2723,12 +2698,6 @@ 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 ""
@@ -3187,16 +3156,6 @@ 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 "Отменить"
@@ -3467,7 +3426,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Число попыток"
@@ -3947,22 +3906,6 @@ 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 ""
@@ -4110,10 +4053,6 @@ msgstr "1x05 Эпизод Папка"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Эпизод Папка"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Название"
@@ -4183,8 +4122,8 @@ msgid "Original Filename"
msgstr "Исходное название файла"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Исходное название папки"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4202,6 +4141,10 @@ msgstr "текст"
msgid "file"
msgstr "файл"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "папка"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Строка сортировки"
@@ -4374,14 +4317,6 @@ 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 "Частота обновления"
@@ -4544,16 +4479,6 @@ 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>"
@@ -4610,6 +4535,10 @@ 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 "Параметры"
@@ -4702,6 +4631,10 @@ 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 "Отправить"
@@ -4912,30 +4845,16 @@ msgstr ""
"Она распространяется по лицензии GNU GENERAL PUBLIC LICENSE версии 2 или (по "
"вашему выбору) любой более поздней версии.\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Не удалось получить сведения о ТВ (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Не удалось переименовать: %s в %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Не удалось переименовать похожий файл: %s в %s"
@@ -4973,12 +4892,6 @@ 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 "Ошибка: дополнительный интерфейс не определён."
@@ -5036,15 +4949,12 @@ 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"
@@ -5384,12 +5294,6 @@ 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 "Позволяет сортировать и переименовывать файлы с датой в названии."
@@ -5462,6 +5366,18 @@ 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-12-06 10:30+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,23 +43,11 @@ 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!"
@@ -201,6 +189,10 @@ 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"
@@ -223,6 +215,15 @@ 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 "Ниједно"
@@ -239,10 +240,6 @@ 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"
@@ -391,6 +388,10 @@ 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 "Неуспешно затварање базе, видети извештај"
@@ -407,6 +408,10 @@ 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"
@@ -447,19 +452,14 @@ 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,12 +556,6 @@ 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"
@@ -652,7 +646,7 @@ msgstr ""
"Недостаје аутентификација, унети у спољни програм име/лозинку из Подешавања-"
">Опште:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -722,23 +716,14 @@ 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
@@ -759,7 +744,7 @@ msgstr "с"
msgid "m"
msgstr "м"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Немогуће креирати фасциклу %s"
@@ -779,20 +764,10 @@ 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
@@ -968,7 +943,6 @@ 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"
@@ -998,9 +972,17 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Проверено за %s, потребна је поправка"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
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)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1010,10 +992,6 @@ 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"
@@ -1039,10 +1017,6 @@ 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"
@@ -1106,6 +1080,11 @@ 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 поруке"
@@ -1114,7 +1093,7 @@ msgstr "Неуспешно слање Prowl поруке"
msgid "Bad response from Pushover (%s): %s"
msgstr "Neodgovarajući odgovor od strane Pushover (%s): %s"
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Neuspešno slanje Pushover poruke"
@@ -1202,6 +1181,12 @@ 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 "Поништено, не може да се заврши"
@@ -1484,7 +1469,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 "Фатална грешка"
@@ -1506,12 +1491,6 @@ 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"
@@ -1540,6 +1519,10 @@ 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"
@@ -1560,7 +1543,7 @@ msgstr "Више"
msgid "Post Processing Failed for %s (%s)"
msgstr "Грешка пост-процесирања за %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "видети извештај"
@@ -1872,14 +1855,6 @@ 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 "Искључено"
@@ -2715,12 +2690,6 @@ 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 ""
@@ -3180,16 +3149,6 @@ 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 "Одбаци"
@@ -3459,7 +3418,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Макс покушаја"
@@ -3933,22 +3892,6 @@ 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"
@@ -4096,10 +4039,6 @@ msgstr "1x05 Фасцикла епизоде"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Фасцикла епизоде"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Наслов"
@@ -4169,8 +4108,8 @@ msgid "Original Filename"
msgstr "Оригинално име датотеке"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Оригинално име фасцикле"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4188,6 +4127,10 @@ msgstr "текст"
msgid "file"
msgstr "датотека"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "фасцикла"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Уреди низ"
@@ -4361,14 +4304,6 @@ 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 "Брзина освежавања"
@@ -4531,16 +4466,6 @@ 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>"
@@ -4597,6 +4522,10 @@ 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 "Опције"
@@ -4687,6 +4616,10 @@ 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 "Слање"
@@ -4895,28 +4828,16 @@ msgstr ""
"Лиценциран је под GNU GENERAL PUBLIC LICENSE верзија 2 или (по вашем избору) "
"касније верзије.\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Грешка преузимању ТВ инфо (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Неуспешно преименовање : %s у %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Неуспешно преименовање сличне датотеке: %s у %s"
@@ -4969,6 +4890,9 @@ 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 "Приступ"
@@ -5020,12 +4944,6 @@ 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 "Упали генерално сортирање/преименовање датотеке."
@@ -5227,12 +5145,6 @@ 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 "Не одговара"
@@ -5245,6 +5157,9 @@ 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 />"
@@ -5282,9 +5197,6 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgid "Unpacking failed, these file(s) are missing:"
#~ msgstr "Неуспешан издвој, ове датотеке недостају:"
#~ msgid "Main packet not found..."
#~ msgstr "Главни пакет није нађен..."
#~ msgid "KB/s"
#~ msgstr "КБ/с"
@@ -5319,9 +5231,6 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgstr ""
#~ "Провери резултат издвоја (треба да се угаси за неке системе датотеке)."
#~ msgid "Invalid par2 files, cannot verify or repair"
#~ msgstr "Погрешне par2 дат., не може да се провери/поправи"
#~ msgid "Only for optional servers"
#~ msgstr "Само за опционе сервере"
@@ -5430,6 +5339,13 @@ 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-12-06 10:30+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,23 +43,11 @@ 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!"
@@ -202,6 +190,10 @@ 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"
@@ -224,6 +216,15 @@ 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"
@@ -240,10 +241,6 @@ 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..."
@@ -392,6 +389,10 @@ 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"
@@ -408,6 +409,10 @@ 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"
@@ -448,19 +453,14 @@ 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,12 +556,6 @@ 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"
@@ -655,7 +649,7 @@ msgstr ""
"Autentisering saknas, ange användarnamn / lösenord från Konfiguration-> "
"Allmänt i ditt tredjepartsprogram:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -726,23 +720,14 @@ 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
@@ -763,7 +748,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "Kan ej skapa mapp %s"
@@ -783,20 +768,10 @@ 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
@@ -972,7 +947,6 @@ 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"
@@ -1002,9 +976,18 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] Verifiering i %s, kräver reparation"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
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)"
msgstr ""
"Misslyckad reparation, finns ej tillräckligt med reparationsblock (%s saknas)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -1014,11 +997,6 @@ 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"
@@ -1044,10 +1022,6 @@ 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"
@@ -1111,6 +1085,11 @@ 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"
@@ -1119,7 +1098,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 # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "Misslyckades att skicka pushovermeddelande"
@@ -1207,6 +1186,12 @@ 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"
@@ -1494,7 +1479,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"
@@ -1516,12 +1501,6 @@ 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 ""
@@ -1551,6 +1530,10 @@ 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"
@@ -1571,7 +1554,7 @@ msgstr "Mer"
msgid "Post Processing Failed for %s (%s)"
msgstr "Efterbehandling misslyckades för %s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "se loggfil"
@@ -1883,14 +1866,6 @@ 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"
@@ -2728,12 +2703,6 @@ 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 ""
@@ -3192,16 +3161,6 @@ 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"
@@ -3474,7 +3433,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "Max antal omförsök"
@@ -3948,22 +3907,6 @@ 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"
@@ -4111,10 +4054,6 @@ 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"
@@ -4184,8 +4123,8 @@ msgid "Original Filename"
msgstr "Originalfilnamn"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "Ursprungliga mappnamnet"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4203,6 +4142,10 @@ msgstr "text"
msgid "file"
msgstr "fil"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "mapp"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteringssträng"
@@ -4375,14 +4318,6 @@ 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"
@@ -4545,16 +4480,6 @@ 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>"
@@ -4611,6 +4536,10 @@ 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"
@@ -4703,6 +4632,10 @@ 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"
@@ -4913,29 +4846,16 @@ msgstr ""
"Det är licensierat under GNU GENERAL PUBLIC LICENSE Version 2 eller (ditt "
"val) en senare version.\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Det gick inte att hämta TV info (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Det gick inte att döpa om: %s till %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.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"
@@ -4970,12 +4890,6 @@ 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."
@@ -5031,12 +4945,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)"
@@ -5327,6 +5241,17 @@ 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."
@@ -5348,9 +5273,6 @@ 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:"
@@ -5468,12 +5390,6 @@ 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-12-06 10:30+0000\n"
"POT-Creation-Date: 2017-08-06 09:51+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-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"X-Launchpad-Export-Date: 2017-08-07 05:54+0000\n"
"X-Generator: Launchpad (build 18441)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -43,22 +43,10 @@ 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 可执行程序... *未* 找到"
@@ -198,6 +186,10 @@ 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 出错"
@@ -220,6 +212,15 @@ 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 "无"
@@ -236,10 +237,6 @@ 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 "磁盘已满! 强制暂停"
@@ -386,6 +383,10 @@ 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 "无法关闭数据库,参见日志"
@@ -402,6 +403,10 @@ 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"
@@ -442,19 +447,14 @@ 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,12 +550,6 @@ 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"
@@ -642,7 +636,7 @@ msgid ""
"into your 3rd party program:"
msgstr "缺身份认证信息,请在第三方程序中输入“配置”->“常规”中的用户名/密码:"
#: sabnzbd/interface.py [Warning message]
#: sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py
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."
@@ -709,23 +703,14 @@ 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
@@ -746,7 +731,7 @@ msgstr "小时"
msgid "m"
msgstr "分钟"
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
msgid "Cannot create directory %s"
msgstr "无法创建目录 %s"
@@ -766,20 +751,10 @@ 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
@@ -955,7 +930,6 @@ 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"
@@ -983,9 +957,17 @@ msgid "[%s] Verified in %s, repair is required"
msgstr "[%s] 验证耗时 %s需要修复"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid ""
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
msgstr ""
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 块)"
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
msgid "Fetching %s blocks..."
@@ -995,10 +977,6 @@ 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"
@@ -1024,10 +1002,6 @@ 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"
@@ -1091,6 +1065,11 @@ 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 消息"
@@ -1099,7 +1078,7 @@ msgstr "无法发送 Prowl 消息"
msgid "Bad response from Pushover (%s): %s"
msgstr "Pushover 响应异常 (%s): %s"
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
msgid "Failed to send pushover message"
msgstr "无法发送 pushover 信息"
@@ -1187,6 +1166,12 @@ 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 "已中止,无法完成"
@@ -1468,7 +1453,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 "致命错误"
@@ -1490,12 +1475,6 @@ 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) 可用"
@@ -1524,6 +1503,10 @@ 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"
@@ -1544,7 +1527,7 @@ msgstr "更多"
msgid "Post Processing Failed for %s (%s)"
msgstr "后期处理失败:%s (%s)"
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
#: sabnzbd/postproc.py
msgid "see logfile"
msgstr "查看日志文件"
@@ -1856,14 +1839,6 @@ 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 "关"
@@ -2695,12 +2670,6 @@ 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 "安全"
@@ -3133,16 +3102,6 @@ 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 "舍弃"
@@ -3404,7 +3363,7 @@ msgstr "SSL 加密算法"
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr "降低 SSL 的加密难度以便获得更高的性能。"
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
#: sabnzbd/skintext.py
msgid "Maximum retries"
msgstr "最多重试次数"
@@ -3875,22 +3834,6 @@ 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"
@@ -4039,10 +3982,6 @@ msgstr "1x05 剧集文件夹"
msgid "S01E05 Episode Folder"
msgstr "S01E05 剧集文件夹"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "标题"
@@ -4112,8 +4051,8 @@ msgid "Original Filename"
msgstr "原始文件名"
#: sabnzbd/skintext.py
msgid "Original Job Name"
msgstr ""
msgid "Original Foldername"
msgstr "原始文件夹名"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4131,6 +4070,10 @@ msgstr "text"
msgid "file"
msgstr "文件"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "文件夹"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "排序字串"
@@ -4301,14 +4244,6 @@ 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 "刷新频率"
@@ -4471,16 +4406,6 @@ 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>"
@@ -4537,6 +4462,10 @@ 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 "选项"
@@ -4627,6 +4556,10 @@ 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 "上传"
@@ -4831,26 +4764,16 @@ msgstr ""
"这是一款自由软件,欢迎您在约定的条件下传播。\n"
"本软件依 GNU GENERAL PUBLIC LICENSE 第 2 版或 (若您愿意) 任意较新版本授权。\n"
#: 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]
#: sabnzbd/tvsort.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "获取 TV 信息出错 (%s)"
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "重命名失败: %s 为 %s"
#: sabnzbd/sorting.py [Error message]
#: sabnzbd/tvsort.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "重命名相似文件失败: %s 为 %s"
@@ -4888,12 +4811,6 @@ 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 "错误: 未定义第二界面。"
@@ -4947,15 +4864,12 @@ 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"
@@ -5279,12 +5193,6 @@ 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 "启用按日期命名的文件的排序与重命名。"
@@ -5355,6 +5263,14 @@ 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,10 +105,9 @@ 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
from sabnzbd.decorators import synchronized, notify_downloader
from sabnzbd.constants import NORMAL_PRIORITY, VALID_ARCHIVES, \
REPAIR_REQUEST, QUEUE_FILE_NAME, QUEUE_VERSION, QUEUE_FILE_TMPL
import sabnzbd.getipaddress as getipaddress
@@ -278,7 +277,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() in ('200M', '450M') and (sabnzbd.WIN32 or sabnzbd.DARWIN)):
if not cfg.cache_limit() or (cfg.cache_limit() == '200M' and (sabnzbd.WIN32 or sabnzbd.DARWIN)):
cfg.cache_limit.set(misc.get_cache_limit())
ArticleCache.do.new_limit(cfg.cache_limit.get_int())
@@ -320,17 +319,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()
PostProcessor()
NzbQueue.do.read_queue(repair)
Downloader(pause_downloader or paused)
DirScanner()
Rating()
@@ -548,13 +546,7 @@ 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
@@ -606,22 +598,27 @@ 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:
# 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()
f = gzip.GzipFile(filename, 'wb')
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
@@ -866,7 +863,6 @@ 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
@@ -874,7 +870,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('[%s] Saving data for %s in %s', misc.caller_name(), _id, path)
logging.debug("Saving data for %s in %s", _id, path)
path = os.path.join(path, _id)
# We try 3 times, to avoid any dict or access problems
@@ -906,11 +902,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] %s missing", misc.caller_name(), path)
logging.info("%s missing", path)
return None
if not silent:
logging.debug("[%s] Loading data for %s from %s", misc.caller_name(), _id, path)
logging.debug("Loading data for %s from %s", _id, path)
try:
with open(path, 'rb') as data_file:
@@ -923,7 +919,7 @@ def load_data(_id, path, remove=True, do_pickle=True, silent=False):
data = data_file.read()
if remove:
misc.remove_file(path)
os.remove(path)
except:
logging.error(T('Loading %s failed'), path)
logging.info("Traceback: ", exc_info=True)
@@ -937,7 +933,8 @@ def remove_data(_id, path):
path = os.path.join(path, _id)
try:
if os.path.exists(path):
misc.remove_file(path)
os.remove(path)
logging.info("%s removed", path)
except:
logging.debug("Failed to remove %s", path)
@@ -945,7 +942,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.debug("[%s] Saving data for %s in %s", misc.caller_name(), _id, path)
logging.info("Saving data for %s in %s", _id, path)
# We try 3 times, to avoid any dict or access problems
for t in xrange(3):
@@ -968,10 +965,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.debug("[%s] Loading data for %s from %s", misc.caller_name(), _id, path)
logging.info("Loading data for %s from %s", _id, path)
if not os.path.exists(path):
logging.info("[%s] %s missing", misc.caller_name(), path)
logging.info("%s missing", path)
return None
try:
@@ -981,7 +978,7 @@ def load_admin(_id, remove=False, silent=False):
else:
data = cPickle.load(data_file)
if remove:
misc.remove_file(path)
os.remove(path)
except:
if not silent:
excepterror = str(sys.exc_info()[0])
@@ -1035,7 +1032,7 @@ def check_repair_request():
path = os.path.join(cfg.admin_dir.get_path(), REPAIR_REQUEST)
if os.path.exists(path):
try:
misc.remove_file(path)
os.remove(path)
except:
pass
return True
@@ -1106,7 +1103,7 @@ def pid_file(pid_path=None, pid_file=None, port=0):
f.write('%d\n' % os.getpid())
f.close()
else:
misc.remove_file(DIR_PID)
os.remove(DIR_PID)
except:
logging.warning('Cannot access PID file %s', DIR_PID)

View File

@@ -105,6 +105,9 @@ 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):
@@ -681,11 +684,12 @@ 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.sorting.eval_sort(value, title, name, multipart)
path = sabnzbd.tvsort.eval_sort(value, title, name, multipart)
if path is None:
return report(output, _MSG_NOT_IMPLEMENTED)
else:
@@ -902,8 +906,8 @@ def _api_server_stats(name, output, kwargs):
stats['servers'] = {}
for svr in config.get_servers():
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 {} }
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}
return report(output, keyword='', data=stats)
@@ -1276,7 +1280,11 @@ 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))
info['warnings'] = sabnzbd.GUIHANDLER.content()
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
return info
@@ -1337,6 +1345,7 @@ 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:
@@ -1351,13 +1360,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 == Status.DELETED or priority == TOP_PRIORITY:
# ensure compatibility of API status
if status in (Status.DELETED, ):
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.FETCHING, Status.QUEUED)) and priority != TOP_PRIORITY:
status not in (Status.DOWNLOADING, Status.QUEUED)) and priority != TOP_PRIORITY:
slot['timeleft'] = '0:00:00'
slot['eta'] = 'unknown'
else:
@@ -1371,9 +1380,8 @@ def build_queue(start=0, limit=0, trans=False, output=None, search=None):
datestart = datetime.datetime.now()
slot['eta'] = 'unknown'
# Do not show age when it's not known
if average_date.year < 2000:
slot['avg_age'] = '-'
if status == Status.GRABBING:
slot['avg_age'] = '---'
else:
slot['avg_age'] = calc_age(average_date, bool(trans))
@@ -1454,7 +1462,8 @@ def rss_qstatus():
rss = RSS()
rss.channel.title = "SABnzbd Queue"
rss.channel.description = "Overview of current downloads"
rss.channel.link = "http://%s:%s%s/queue" % (cfg.cherryhost(), cfg.cherryport(), cfg.url_base())
rss.channel.link = "http://%s:%s/sabnzbd/queue" % (
cfg.cherryhost(), cfg.cherryport())
rss.channel.language = "en"
item = Item()
@@ -1485,7 +1494,7 @@ def rss_qstatus():
item = Item()
item.title = name
item.link = "http://%s:%s%s/history" % (cfg.cherryhost(), cfg.cherryport(), cfg.url_base())
item.link = "http://%s:%s/sabnzbd/history" % (cfg.cherryhost(), cfg.cherryport())
item.guid = nzo_id
status_line = []
status_line.append('<tr>')
@@ -1628,12 +1637,13 @@ 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
@@ -1686,7 +1696,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)
header['speed'] = to_units(bytespersec, spaces=1, dec_limit=1)
header['mbleft'] = "%.2f" % (bytesleft / MEBI)
header['mb'] = "%.2f" % (bytes / MEBI)
header['sizeleft'] = format_bytes(bytesleft)

View File

@@ -22,7 +22,6 @@ sabnzbd.articlecache - Article cache handling
import sys
import logging
import threading
import struct
import sabnzbd
from sabnzbd.decorators import synchronized
@@ -31,8 +30,13 @@ 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):
@@ -41,61 +45,55 @@ 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 = self.__cache_upper_limit
self.__cache_limit = GIGI
else:
self.__cache_limit = min(limit, self.__cache_upper_limit)
self.__cache_limit = min(limit, GIGI)
@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.__cache_size += data_size
self.increase_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.__cache_size -= data_size
self.decrease_cache_size(data_size)
return self.__cache_size + data_size < self.__cache_limit
@synchronized(ARTICLE_LOCK)
def save_article(self, article, data):
if article.nzf.nzo.is_gone():
nzf = article.nzf
nzo = nzf.nzo
if nzo.is_gone():
# Do not discard this article because the
# file might still be processed at this moment!!
return
# Register article
if article not in article.nzf.nzo.saved_articles:
article.nzf.nzo.saved_articles.append(article)
saved_articles = article.nzf.nzo.saved_articles
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 article not in saved_articles:
saved_articles.append(article)
if self.__cache_limit:
if self.__cache_limit < 0:
@@ -108,7 +106,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.__cache_size -= len(old_data)
self.decrease_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)
@@ -122,7 +120,6 @@ class ArticleCache(object):
else:
self.__flush_article(article, data)
@synchronized(ARTICLE_LOCK)
def load_article(self, article):
data = None
nzo = article.nzf.nzo
@@ -130,7 +127,7 @@ class ArticleCache(object):
if article in self.__article_list:
data = self.__article_table.pop(article)
self.__article_list.remove(article)
self.__cache_size -= len(data)
self.decrease_cache_size(len(data))
elif article.art_id:
data = sabnzbd.load_data(article.art_id, nzo.workpath, remove=True,
do_pickle=False, silent=True)
@@ -140,21 +137,19 @@ 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.__cache_size -= len(data)
self.decrease_cache_size(len(data))
if article.art_id:
sabnzbd.remove_data(article.art_id, article.nzf.nzo.workpath)
@@ -177,11 +172,12 @@ class ArticleCache(object):
def __add_to_cache(self, article, data):
if article in self.__article_table:
self.__cache_size -= len(self.__article_table[article])
self.decrease_cache_size(len(self.__article_table[article]))
else:
self.__article_list.append(article)
self.__article_table[article] = data
self.__cache_size += len(data)
self.increase_cache_size(len(data))
# Create the instance

View File

@@ -22,6 +22,7 @@ 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
@@ -29,16 +30,14 @@ 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, \
get_filename, get_ext
set_permissions, long_path, clip_path, has_win_device, get_all_passwords, diskspace
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
from sabnzbd.encoding import unicoder, is_utf8
from sabnzbd.rating import Rating
@@ -76,7 +75,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()
sabnzbd.downloader.Downloader.do.pause(save=False)
sabnzbd.emailer.diskfull()
# Abort all direct unpackers, just to be sure
sabnzbd.directunpacker.abort_all()
@@ -90,24 +89,21 @@ class Assembler(Thread):
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)
except IOError, (errno, strerror):
# 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:
# If job was deleted, ignore error
if not nzo.is_gone():
# 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()
sabnzbd.downloader.Downloader.do.pause(save=False)
continue
except:
logging.error(T('Fatal error in Assembler'), exc_info=True)
@@ -116,37 +112,41 @@ class Assembler(Thread):
# Clean-up admin data
nzf.remove_admin()
# 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)
# Parse par2 files
if nzf.is_par2:
# Always parse par2 files to get new md5of16k info
pack = self.parse_par2_file(nzf, filepath)
if pack and (nzo.md5packs.get(nzf.setname) is None):
nzo.md5packs[nzf.setname] = pack
logging.debug('Got md5pack for set %s', nzf.setname)
# Valid md5pack, so use this par2-file as main par2 file for the set
if nzf.setname in nzo.partable:
# First copy the set of extrapars, we need them later
nzf.extrapars = nzo.partable[nzf.setname].extrapars
nzo.partable[nzf.setname] = nzf
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)
# 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)
# 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)
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)
filter, reason = nzo_filtered_by_rating(nzo)
if filter == 1:
@@ -157,6 +157,9 @@ 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)
@@ -193,6 +196,60 @@ class Assembler(Thread):
return path
def parse_par2_file(self, nzf, fname):
""" 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 nzf.nzo.md5of16k:
nzf.nzo.md5of16k[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 nzf.nzo.md5of16k:
old_name = nzf.nzo.md5of16k.pop(hash16k)
logging.debug('Par2-16k signature of %s not unique, discarding', old_name)
# If the filename was changed (duplicate filename) check if we already have the set
base_fname = os.path.split(fname)[1]
if table and base_fname != nzf.filename and table not in nzf.nzo.md5packs.values():
# Re-parse this par2 file to create new set
nzf.filename = base_fname
nzf.is_par2 = False
nzf.nzo.handle_par2(nzf, True)
return table
def file_has_articles(nzf):
""" Do a quick check to see if any articles are present for this file.
@@ -209,13 +266,55 @@ 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(get_filename(path)).lower()
fname = unicoder(os.path.split(path)[1]).lower()
fname = os.path.splitext(fname)[0]
for name in names:
name = get_filename(name.lower())
name = os.path.split(name.lower())[1]
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
@@ -294,9 +393,6 @@ 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
@@ -314,14 +410,13 @@ 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 get_ext(somefile).replace('.', '').lower() in cfg.unwanted_extensions():
if os.path.splitext(somefile)[1].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)
logging.debug('Traceback: ', exc_info=True)
logging.info('Error during inspection of RAR-file %s', filepath, exc_info=True)
return encrypted, unwanted
@@ -371,5 +466,5 @@ def remove_warning_label(msg):
""" Standardize errors by removing obsolete
"WARNING:" part in all languages """
if ':' in msg:
return msg.split(':')[1].strip()
return msg.split(':')[1]
return msg

View File

@@ -148,7 +148,6 @@ 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)
@@ -253,7 +252,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)
reject_duplicate_files = OptionBool('misc', 'reject_duplicate_files', False)
allow_duplicate_files = OptionBool('misc', 'allow_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)
@@ -261,7 +260,6 @@ 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/'])
@@ -276,7 +274,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
@@ -375,8 +373,6 @@ 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)

View File

@@ -385,7 +385,7 @@ class ConfigServer(object):
self.displayname = OptionStr(name, 'displayname', '', add=False)
self.host = OptionStr(name, 'host', '', add=False)
self.port = OptionNumber(name, 'port', 119, 0, 2 ** 16 - 1, add=False)
self.timeout = OptionNumber(name, 'timeout', 60, 20, 240, add=False)
self.timeout = OptionNumber(name, 'timeout', 120, 30, 240, add=False)
self.username = OptionStr(name, 'username', '', add=False)
self.password = OptionPassword(name, 'password', '', add=False)
self.connections = OptionNumber(name, 'connections', 1, 0, 100, add=False)
@@ -395,9 +395,10 @@ class ConfigServer(object):
self.optional = OptionBool(name, 'optional', False, add=False)
self.retention = OptionNumber(name, 'retention', add=False)
self.send_group = OptionBool(name, 'send_group', False, add=False)
self.priority = OptionNumber(name, 'priority', 0, 0, 99, add=False)
self.priority = OptionNumber(name, 'priority', 0, 0, 100, add=False)
# 'fillserver' field only here in order to set a proper priority when converting
self.fillserver = OptionBool(name, 'fillserver', False, add=False)
self.categories = OptionList(name, 'categories', default_val=['Default'], add=False)
self.notes = OptionStr(name, 'notes', '', add=False)
self.set_dict(values)
@@ -406,7 +407,7 @@ class ConfigServer(object):
def set_dict(self, values):
""" Set one or more fields, passed as dictionary """
for kw in ('displayname', 'host', 'port', 'timeout', 'username', 'password', 'connections', 'fillserver',
'ssl', 'ssl_verify', 'send_group', 'enable', 'optional', 'retention', 'priority', 'notes'):
'ssl', 'ssl_verify', 'send_group', 'enable', 'optional', 'retention', 'priority', 'categories', 'notes'):
try:
value = values[kw]
except KeyError:
@@ -437,6 +438,7 @@ class ConfigServer(object):
dict['retention'] = self.retention()
dict['send_group'] = self.send_group()
dict['priority'] = self.priority()
dict['categories'] = self.categories()
dict['notes'] = self.notes()
return dict
@@ -859,7 +861,7 @@ def save_config(force=False):
logging.error(T('Cannot write to INI file %s'), filename)
logging.info("Traceback: ", exc_info=True)
try:
sabnzbd.misc.remove_file(filename)
os.remove(filename)
except:
pass
# Restore INI file from backup

View File

@@ -27,7 +27,7 @@ REC_RAR_VERSION = 500
PNFO = namedtuple('PNFO', 'repair unpack delete script nzo_id filename password unpackstrht '
'msgid category url bytes_left bytes avg_stamp avg_date finished_files '
'active_files queued_files status priority bytes_missing direct_unpack')
'active_files queued_files status priority missing bytes_missing direct_unpack')
QNFO = namedtuple('QNFO', 'bytes bytes_left bytes_left_previous_page list q_size_list q_fullsize')
@@ -51,7 +51,7 @@ RENAMES_FILE = '__renames__'
ATTRIB_FILE = 'SABnzbd_attrib'
REPAIR_REQUEST = 'repair-all.sab'
SABYENC_VERSION_REQUIRED = '3.3.2'
SABYENC_VERSION_REQUIRED = '3.0.2'
DB_HISTORY_VERSION = 1
DB_HISTORY_NAME = 'history%s.db' % DB_HISTORY_VERSION
@@ -74,16 +74,13 @@ DEF_WORKDIR = 'sabnzbd'
DEF_LOG_FILE = 'sabnzbd.log'
DEF_LOG_ERRFILE = 'sabnzbd.error.log'
DEF_LOG_CHERRY = 'cherrypy.log'
DEF_ARTICLE_CACHE_DEFAULT = '500M'
DEF_ARTICLE_CACHE_MAX = '1G'
DEF_CACHE_LIMIT = '450M'
DEF_TIMEOUT = 60
DEF_SCANRATE = 5
MAX_URL_RETRIES = 10
MAX_DECODE_QUEUE = 10
LIMIT_DECODE_QUEUE = 100
MAX_WARNINGS = 20
MAX_WIN_DFOLDER = 60
MAX_BAD_ARTICLES = 5
REPAIR_PRIORITY = 3
TOP_PRIORITY = 2

View File

@@ -40,7 +40,7 @@ from sabnzbd.constants import DB_HISTORY_NAME, STAGES
from sabnzbd.encoding import unicoder
from sabnzbd.bpsmeter import this_week, this_month
from sabnzbd.decorators import synchronized
from sabnzbd.misc import get_all_passwords, int_conv, remove_file, caller_name
from sabnzbd.misc import get_all_passwords, int_conv
DB_LOCK = threading.RLock()
@@ -74,8 +74,8 @@ class HistoryDB(object):
"""
# These class attributes will be accessed directly because
# they need to be shared by all instances
db_path = None # Will contain full path to history database
done_cleaning = False # Ensure we only do one Vacuum per session
db_path = None # Will contain full path to history database
done_cleaning = False # Ensure we only do one Vacuum per session
@synchronized(DB_LOCK)
def __init__(self):
@@ -85,6 +85,7 @@ class HistoryDB(object):
HistoryDB.db_path = os.path.join(sabnzbd.cfg.admin_dir.get_path(), DB_HISTORY_NAME)
self.connect()
def connect(self):
""" Create a connection to the database """
create_table = not os.path.exists(HistoryDB.db_path)
@@ -117,6 +118,7 @@ class HistoryDB(object):
_ = self.execute('PRAGMA user_version = 2;') and \
self.execute('ALTER TABLE "history" ADD COLUMN password TEXT;')
def execute(self, command, args=(), save=False):
''' Wrapper for executing SQL commands '''
for tries in xrange(5, 0, -1):
@@ -126,7 +128,7 @@ class HistoryDB(object):
else:
self.c.execute(command)
if save:
self.con.commit()
self.save()
return True
except:
error = str(sys.exc_value)
@@ -143,7 +145,7 @@ class HistoryDB(object):
logging.info("Traceback: ", exc_info=True)
self.close()
try:
remove_file(HistoryDB.db_path)
os.remove(HistoryDB.db_path)
except:
pass
self.connect()
@@ -196,6 +198,14 @@ class HistoryDB(object):
""")
self.execute('PRAGMA user_version = 2;')
def save(self):
""" Save database to disk """
try:
self.con.commit()
except:
logging.error(T('SQL Commit Failed, see log'))
logging.info("Traceback: ", exc_info=True)
def close(self):
""" Close database connection """
try:
@@ -235,8 +245,10 @@ class HistoryDB(object):
jobs = [jobs]
for job in jobs:
self.execute("""DELETE FROM history WHERE nzo_id=?""", (job,), save=True)
logging.info('[%s] Removing job %s from history', caller_name(), job)
self.execute("""DELETE FROM history WHERE nzo_id=?""", (job,))
logging.info('Removing job %s from history', job)
self.save()
def auto_history_purge(self):
""" Remove history items based on the configured history-retention """
@@ -250,7 +262,7 @@ class HistoryDB(object):
if "d" in sabnzbd.cfg.history_retention():
# How many days to keep?
days_to_keep = int_conv(sabnzbd.cfg.history_retention().strip()[:-1])
seconds_to_keep = int(time.time()) - days_to_keep * 86400
seconds_to_keep = int(time.time()) - days_to_keep*3600*24
if days_to_keep > 0:
logging.info('Removing completed jobs older than %s days from history', days_to_keep)
return self.execute("""DELETE FROM history WHERE status = 'Completed' AND completed < ?""", (seconds_to_keep,), save=True)
@@ -261,14 +273,16 @@ class HistoryDB(object):
logging.info('Removing all but last %s completed jobs from history', to_keep)
return self.execute("""DELETE FROM history WHERE id NOT IN ( SELECT id FROM history WHERE status = 'Completed' ORDER BY completed DESC LIMIT ? )""", (to_keep,), save=True)
def add_history_db(self, nzo, storage, path, postproc_time, script_output, script_line):
""" Add a new job entry to the database """
t = build_history_info(nzo, storage, path, postproc_time, script_output, script_line)
self.execute("""INSERT INTO history (completed, name, nzb_name, category, pp, script, report,
url, status, nzo_id, storage, path, script_log, script_line, download_time, postproc_time, stage_log,
downloaded, completeness, fail_message, url_info, bytes, series, md5sum, password)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", t, save=True)
if self.execute("""INSERT INTO history (completed, name, nzb_name, category, pp, script, report,
url, status, nzo_id, storage, path, script_log, script_line, download_time, postproc_time, stage_log,
downloaded, completeness, fail_message, url_info, bytes, series, md5sum, password)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", t):
self.save()
logging.info('Added job %s to history', nzo.final_name)
def fetch_history(self, start=None, limit=None, search=None, failed_only=0, categories=None):
@@ -279,7 +293,7 @@ class HistoryDB(object):
if categories:
categories = ['*' if c == 'Default' else c for c in categories]
post = " AND (CATEGORY = ?"
post += " OR CATEGORY = ? " * (len(categories) - 1)
post += " OR CATEGORY = ? " * (len(categories)-1)
post += ")"
command_args.extend(categories)
if failed_only:
@@ -493,9 +507,16 @@ def build_history_info(nzo, storage='', downpath='', postproc_time=0, script_out
if seriesname and season and episode:
series = u'%s/%s/%s' % (seriesname.lower(), season, episode)
# See whatever the first password was, for the Retry
password = ''
passwords = get_all_passwords(nzo)
if passwords:
password = passwords[0]
return (completed, name, nzb_name, category, pp, script, report, url, status, nzo_id, storage, path,
script_log, script_line, download_time, postproc_time, stage_log, downloaded, completeness,
fail_message, url_info, bytes, series, nzo.md5sum, nzo.password)
fail_message, url_info, bytes, series, nzo.md5sum, password)
def unpack_history_info(item):

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