sabnzbd-develop/0000700000175000017500000000000013643314645011740 5ustar jpjpsabnzbd-develop/email/0000700000175000017500000000000013642116632013022 5ustar jpjpsabnzbd-develop/email/badfetch-en.tmpl0000600000175000017500000000072213642116632016063 0ustar jpjp## ## Bad URL Fetch Email template for SABnzbd ## This a Cheetah template ## Documentation: http://sabnzbd.wikidot.com/email-templates ## ## Newlines and whitespace are significant! ## ## These are the email headers To: $to From: $from Date: $date Subject: SABnzbd failed to fetch an NZB X-priority: 5 X-MS-priority: 5 ## After this comes the body, the empty line is required! Hi, SABnzbd has failed to retrieve the NZB from $url. The error message was: $msg Bye sabnzbd-develop/email/email-en.tmpl0000600000175000017500000000205713642116632015415 0ustar jpjp## ## Default Email template for SABnzbd ## This a Cheetah template ## Documentation: http://sabnzbd.wikidot.com/email-templates ## ## Newlines and whitespace are significant! ## ## These are the email headers To: $to From: $from Date: $date Subject: SABnzbd has job $name X-priority: 5 X-MS-priority: 5 ## After this comes the body, the empty line is required! Hi, SABnzbd has downloaded "$name" SABnzbd has failed to download "$name" Finished at $end_time Downloaded $size Results of the job: Stage $stage $result Output from user script "$script" (Exit code = $script_ret): $script_output Enjoy! Sorry! sabnzbd-develop/email/rss-en.tmpl0000600000175000017500000000103213642116632015125 0ustar jpjp## ## RSS Email template for SABnzbd ## This a Cheetah template ## Documentation: http://sabnzbd.wikidot.com/email-templates ## ## Newlines and whitespace are significant! ## ## These are the email headers To: $to From: $from Date: $date Subject: SABnzbd has added $amount jobs to the queue X-priority: 5 X-MS-priority: 5 ## After this comes the body, the empty line is required! Hi, SABnzbd has added $amount job(s) to the queue. They are from RSS feed "$feed". $job Bye sabnzbd-develop/README.mkd0000600000175000017500000000302013642116632013362 0ustar jpjpRelease Notes - SABnzbd 2.3.8 ========================================================= ## Improvements and bug fixes since 2.3.7 - Changes to newsserver configuration could be delayed - Filenames would not be sanitized when using "Make Windows compatible" - Sorting could fail on root-folders - 7z-files were not listed as supported NZB archives - SSL cipher settings were ignored during server test - Windows: update 7zip to 19.00 - Windows: update MultiPar to v1.3.0.4 - Windows and macOS: update Python to 2.7.16 - Windows and macOS: update UnRar to 5.70 ## Upgrading from 2.2.x and older - Finish queue - Stop SABnzbd - Install new version - Start SABnzbd ## Upgrade notices - When upgrading from 2.2.0 or older the queue will be converted. Job order, settings and data will be preserved, but all jobs will be unpaused and URL's that did not finish fetching before the upgrade will be lost. - The organization of the download queue is different from 0.7.x releases. This version will not see the 0.7.x queue, but you can restore the jobs by going to Status page and using Queue Repair. ## Known problems and solutions - Read the file "ISSUES.txt" ## About SABnzbd is an open-source cross-platform binary newsreader. It simplifies the process of downloading from Usenet dramatically, thanks to its web-based user interface and advanced built-in post-processing options that automatically verify, repair, extract and clean up posts downloaded from Usenet. (c) Copyright 2007-2019 by "The SABnzbd-team" \ sabnzbd-develop/GPL3.txt0000600000175000017500000010451313642116632013207 0ustar jpjp GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . sabnzbd-develop/ISSUES.txt0000600000175000017500000000704213642116632013514 0ustar jpjp******************************************* *** Known issues *** ******************************************* - To prevent unexpectedly large NZBs from eating your download quota you can set the option 'size_limit' on the Config->Special page. Any NZB larger than this size will be set to paused and get a low priority. - When par2 or unrar hang up, never just stop SABnzbd. Instead use your operating system's task manager to stop the par2 or unrar program. Forcing SABnzbd to quit may damage your queues. - Some Usenet servers have intermittent login (or other) problems. For these the server blocking method is not very favourable. There is an INI-only option that will limit blocks to 1 minute. no_penalties = 1 See: https://sabnzbd.org/wiki/configuration/2.3/special - Some third-party utilties try to probe SABnzbd API in such a way that you will often see warnings about unauthenticated access. If you are sure these probes are harmless, you can suppress the warnings by setting the option "api_warnings" to 0. See: https://sabnzbd.org/wiki/configuration/2.3/special - On OSX you may encounter downloaded files with foreign characters. The par2 repair may fail when the files were created on a Windows system. The problem is caused by the PAR2 utility and we cannot fix this now. This does not apply to files inside RAR files. - The "Watched Folder" sometimes fails to delete the NZB files it has processed. This happens when other software still accesses these files. Some third-party utilities supporting SABnzbd are known to do this. We cannot solve this problem, because the Operating System (read Windows) prevents the removal. - 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 firewall that SABnzbd is allowed to talk to other computers. - When SABnzbd cannot send notification emails, check your virus scanner, firewall or security suite. It may be blocking outgoing email. - When you are using external drives or network shares on OSX or Linux make sure that the drives are mounted. The operating system will simply redirect your files to alternative locations. You may have trouble finding the files when mounting the drive later. On OSX, SABnzbd will not create new folders in /Volumes. The result will be a failed job that can be retried once the volume has been mounted. - If you use a mounted drive as "temporary download folder", it must be present when SABnzbd starts up. If not, SABnzbd will use the default location. You can make SABnzbd wait for a mount of the "temporary download folder" by setting Config->Special->wait_for_dfolder to 1. SABnzbd will appear to hang until the drive is mounted. - If you experience speed-drops to KB/s when using a VPN, try setting the number of connections to your servers to a total of 7. There is a CPU-usage reduction feature in SABnzbd that gets confused by the way some VPN's handle the state of a connection. Below 8 connections this feature is not active. sabnzbd-develop/licenses/0000700000175000017500000000000013642116632013540 5ustar jpjpsabnzbd-develop/licenses/License-feedparser.txt0000600000175000017500000000321113642116632020000 0ustar jpjpThe module feedparser.py-5.1 is (c) Mark Pilgrim and Kurt McKee We use only the feedparser itself, all additional material was removed. Home of the feedparser module: https://code.google.com/p/feedparser It is covered by the following license. ----- begin license block ----- Copyright (c) 2010-2011 Kurt McKee Copyright (c) 2002-2008 Mark Pilgrim All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.""" ----- end license block ----- sabnzbd-develop/licenses/License-pynewsleecher.txt0000600000175000017500000000057313642116632020545 0ustar jpjpThe 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. sabnzbd-develop/licenses/License-six.txt0000600000175000017500000000211213642116632016462 0ustar jpjpThe module six, version 1.10.0 Copyright (c) 2010-2015 Benjamin Peterson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sabnzbd-develop/licenses/License-configobj.txt0000600000175000017500000000363313642116632017630 0ustar jpjpThe module configobj.py is written by Michael Foord and Nicola Larosa. Home of the module: http://www.voidspace.org.uk/python/configobj-api/pythonutils.configobj-pysrc.html It is covered by the following license. ------------------------------------------------------------------------- Copyright (c) 2003-2007, Michael Foord and Nicola Larosa All rights reserved. E-mail : fuzzyman AT voidspace DOT org DOT uk Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Michael Foord nor the name of Voidspace may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------- sabnzbd-develop/licenses/License-PythonParts.txt0000600000175000017500000000027113642116632020156 0ustar jpjppystone.py and msgfmt.py have been copied from the Python sourcecode. They are covered by the same license as Python itself, that license is contained in the file "License_Python.txt". sabnzbd-develop/licenses/License-systrayicon.txt0000600000175000017500000000051613642116632020254 0ustar jpjpOn 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. ;-) sabnzbd-develop/licenses/License-rarfile.txt0000600000175000017500000000171013642116632017306 0ustar jpjpThe module rarfile.py is written by Marko Kreen. Home of the module: http://grue.l-t.ee/~marko/src/rarfile/ It is covered by the following license. ------------------------------------------------------------------------- Copyright (c) 2005 Marko Kreen Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. sabnzbd-develop/licenses/License-rsslib.txt0000600000175000017500000000060513642116632017162 0ustar jpjpThe module rsslib.py is written by C. Mallory. cmallory /a t/ berserk /dot/ o r g Home of the module: http://berserk.org/rsslib/ It is covered by the following license. ----------------------------------------------------------------------------- You may freely use this code in any way you can think of. ----------------------------------------------------------------------------- sabnzbd-develop/licenses/License-kronos.txt0000600000175000017500000000350313642116632017177 0ustar jpjpKronos.py is written by Irmen de Jong. Retreived from: http://www.razorvine.net/download/kronos.py Quote from the module: """ This version has been extracted from the Turbogears source repository and slightly changed to be completely stand-alone again. Also some fixes have been made to make it work on Python 2.6 (sched module changes). The version in Turbogears is based on the original stand-alone Kronos. """ It is covered by the following license. http://www.opensource.org/licenses/mit-license.php -------------------------------------------------------------------------------------------- The MIT License Kronos.py is Copyright (c) Irmen de Jong. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------------------------------------------sabnzbd-develop/licenses/License-CherryPy.txt0000600000175000017500000000400713642116632017431 0ustar jpjpThe module CherryPy is (c) CherryPy team. The module has been stripped of its Tutorial and Test directories. We embed CherryPy in SABnzbd, because CherryPy releases lack backward compatibility and cannot be installed as parallel versions into the system's Python installation. Home of the module: http://www.cherrypy.org It is covered by the following license. ------------------------------------------------------------------------- Copyright (c) 2004-2016, CherryPy Team (team@cherrypy.org) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the CherryPy Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------- sabnzbd-develop/licenses/License-Python.txt0000600000175000017500000003244713642116632017156 0ustar jpjpA. HISTORY OF THE SOFTWARE ========================== Python was created in the early 1990s by Guido van Rossum at Stichting Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands as a successor of a language called ABC. Guido remains Python's principal author, although it includes many contributions from others. In 1995, Guido continued his work on Python at the Corporation for National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) in Reston, Virginia where he released several versions of the software. In May 2000, Guido and the Python core development team moved to BeOpen.com to form the BeOpen PythonLabs team. In October of the same year, the PythonLabs team moved to Digital Creations (now Zope Corporation, see http://www.zope.com). In 2001, the Python Software Foundation (PSF, see http://www.python.org/psf/) was formed, a non-profit organization created specifically to own Python-related Intellectual Property. Zope Corporation is a sponsoring member of the PSF. All Python releases are Open Source (see http://www.opensource.org for the Open Source Definition). Historically, most, but not all, Python releases have also been GPL-compatible; the table below summarizes the various releases. Release Derived Year Owner GPL- from compatible? (1) 0.9.0 thru 1.2 1991-1995 CWI yes 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes 1.6 1.5.2 2000 CNRI no 2.0 1.6 2000 BeOpen.com no 1.6.1 1.6 2001 CNRI yes (2) 2.1 2.0+1.6.1 2001 PSF no 2.0.1 2.0+1.6.1 2001 PSF yes 2.1.1 2.1+2.0.1 2001 PSF yes 2.2 2.1.1 2001 PSF yes 2.1.2 2.1.1 2002 PSF yes 2.1.3 2.1.2 2002 PSF yes 2.2.1 2.2 2002 PSF yes 2.2.2 2.2.1 2002 PSF yes 2.2.3 2.2.2 2003 PSF yes 2.3 2.2.2 2002-2003 PSF yes 2.3.1 2.3 2002-2003 PSF yes 2.3.2 2.3.1 2002-2003 PSF yes 2.3.3 2.3.2 2002-2003 PSF yes 2.3.4 2.3.3 2004 PSF yes 2.3.5 2.3.4 2005 PSF yes 2.4 2.3 2004 PSF yes 2.4.1 2.4 2005 PSF yes 2.4.2 2.4.1 2005 PSF yes 2.4.3 2.4.2 2006 PSF yes 2.5 2.4 2006 PSF yes 2.7 2.6 2010 PSF yes Footnotes: (1) GPL-compatible doesn't mean that we're distributing Python under the GPL. All Python licenses, unlike the GPL, let you distribute a modified version without making your changes open source. The GPL-compatible licenses make it possible to combine Python with other software that is released under the GPL; the others don't. (2) According to Richard Stallman, 1.6.1 is not GPL-compatible, because its license has a choice of law clause. According to CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 is "not incompatible" with the GPL. Thanks to the many outside volunteers who have worked under Guido's direction to make these releases possible. B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON =============================================================== PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 -------------------------------------------- 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation. 2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python. 4. PSF is making Python available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. 7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between PSF and Licensee. This License Agreement does not grant permission to use PSF trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. 8. By copying, installing or otherwise using Python, Licensee agrees to be bound by the terms and conditions of this License Agreement. BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 ------------------------------------------- BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization ("Licensee") accessing and otherwise using this software in source or binary form and its associated documentation ("the Software"). 2. Subject to the terms and conditions of this BeOpen Python License Agreement, BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use the Software alone or in any derivative version, provided, however, that the BeOpen Python License is retained in the Software, alone or in any derivative version prepared by Licensee. 3. BeOpen is making the Software available to Licensee on an "AS IS" basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. 4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 5. This License Agreement will automatically terminate upon a material breach of its terms and conditions. 6. This License Agreement shall be governed by and interpreted in all respects by the law of the State of California, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between BeOpen and Licensee. This License Agreement does not grant permission to use BeOpen trademarks or trade names in a trademark sense to endorse or promote products or services of Licensee, or any third party. As an exception, the "BeOpen Python" logos available at http://www.pythonlabs.com/logos.html may be used according to the permissions granted on that web page. 7. By copying, installing or otherwise using the software, Licensee agrees to be bound by the terms and conditions of this License Agreement. CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 --------------------------------------- 1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 1.6.1 software in source or binary form and its associated documentation. 2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6.1 alone or in any derivative version, provided, however, that CNRI's License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) 1995-2001 Corporation for National Research Initiatives; All Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with Python 1.6.1 may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This Agreement may also be obtained from a proxy server on the Internet using the following URL: http://hdl.handle.net/1895.22/1013". 3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 1.6.1. 4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. 5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. 7. This License Agreement shall be governed by the federal intellectual property law of the United States, including without limitation the federal copyright law, and, to the extent such U.S. federal law does not apply, by the law of the Commonwealth of Virginia, excluding Virginia's conflict of law provisions. Notwithstanding the foregoing, with regard to derivative works based on Python 1.6.1 that incorporate non-separable material that was previously distributed under the GNU General Public License (GPL), the law of the Commonwealth of Virginia shall govern this License Agreement only as to issues arising under or with respect to Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between CNRI and Licensee. This License Agreement does not grant permission to use CNRI trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. 8. By clicking on the "ACCEPT" button where indicated, or by copying, installing or otherwise using Python 1.6.1, Licensee agrees to be bound by the terms and conditions of this License Agreement. ACCEPT CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 -------------------------------------------------- Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands. All rights reserved. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Stichting Mathematisch Centrum or CWI not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. sabnzbd-develop/licenses/License-pybonjour.txt0000600000175000017500000000040613642116632017712 0ustar jpjpThe module pybonjour is (C) Christopher Stawarz Version: 1.1.1 May 8, 2008 Home of the module: http://pseudogreen.org/bzr/pybonjour/ It is covered by the following license: "pybonjour is free software, distributed under the MIT license." sabnzbd-develop/sabnzbd/0000700000175000017500000000000013642116632013356 5ustar jpjpsabnzbd-develop/sabnzbd/sorting.py0000600000175000017500000013004013642116632015415 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.sorting - Sorting Functions Series Sorting - Sorting downloads into seasons & episodes Date Sorting - Sorting downloads by a custom date matching Generic Sorting - Sorting large files by a custom matching """ import os import logging import re import sabnzbd from sabnzbd.filesystem import move_to_path, cleanup_empty_directories, get_unique_path, \ get_unique_filename, get_ext, renamer, sanitize_foldername, clip_path from sabnzbd.constants import series_match, date_match, year_match, sample_match import sabnzbd.cfg as cfg RE_SAMPLE = re.compile(sample_match, re.I) # Do not rename .vob files as they are usually DVD's EXCLUDED_FILE_EXTS = ('.vob', '.bin') LOWERCASE = ('the', 'of', 'and', 'at', 'vs', 'a', 'an', 'but', 'nor', 'for', 'on', 'so', 'yet', 'with') UPPERCASE = ('III', 'II', 'IV') REPLACE_AFTER = { '()': '', '..': '.', '__': '_', ' ': ' ', ' .%ext': '.%ext' } # Title() function messes up country names, so need to replace them instead COUNTRY_REP = ('(US)', '(UK)', '(EU)', '(CA)', '(YU)', '(VE)', '(TR)', '(CH)', '(SE)', '(ES)', '(KR)', '(ZA)', '(SK)', '(SG)', '(RU)', '(RO)', '(PR)', '(PT)', '(PL)', '(PH)', '(PK)', '(NO)', '(NG)', '(NZ)', '(NL)', '(MX)', '(MY)', '(MK)', '(KZ)', '(JP)', '(JM)', '(IT)', '(IL)', '(IE)', '(IN)', '(IS)', '(HU)', '(HK)', '(HN)', '(GR)', '(GH)', '(DE)', '(FR)', '(FI)', '(DK)', '(CZ)', '(HR)', '(CR)', '(CO)', '(CN)', '(CL)', '(BG)', '(BR)', '(BE)', '(AT)', '(AU)', '(AW)', '(AR)', '(AL)', '(AF)') def ends_in_file(path): """ Return True when path ends with '.%ext' or '%fn' """ _RE_ENDEXT = re.compile(r'\.%ext[{}]*$', re.I) _RE_ENDFN = re.compile(r'%fn[{}]*$', re.I) return bool(_RE_ENDEXT.search(path) or _RE_ENDFN.search(path)) def move_to_parent_folder(workdir): """ Move all in 'workdir' into 'workdir/..' """ # Determine 'folder'/.. workdir = os.path.abspath(os.path.normpath(workdir)) dest = os.path.abspath(os.path.normpath(os.path.join(workdir, '..'))) # Check for DVD folders and stop if found for item in os.listdir(workdir): if item.lower() in ('video_ts', 'audio_ts', 'bdmv'): return workdir, True for root, dirs, files in os.walk(workdir): for _file in files: path = os.path.join(root, _file) new_path = path.replace(workdir, dest) ok, new_path = move_to_path(path, new_path) if not ok: return dest, False cleanup_empty_directories(workdir) return dest, True class Sorter: """ Generic Sorter class """ def __init__(self, nzo, cat): self.sorter = None self.type = None self.sort_file = False self.nzo = nzo self.cat = cat self.ext = '' def detect(self, job_name, complete_dir): """ Detect which kind of sort applies """ self.sorter = SeriesSorter(self.nzo, job_name, complete_dir, self.cat) if self.sorter.matched: complete_dir = self.sorter.get_final_path() self.type = 'tv' self.sort_file = True return complete_dir self.sorter = DateSorter(self.nzo, job_name, complete_dir, self.cat) if self.sorter.matched: complete_dir = self.sorter.get_final_path() self.type = 'date' self.sort_file = True return complete_dir self.sorter = MovieSorter(self.nzo, job_name, complete_dir, self.cat) if self.sorter.matched: complete_dir = self.sorter.get_final_path() self.type = 'movie' self.sort_file = True return complete_dir self.sort_file = False return complete_dir def rename(self, newfiles, workdir_complete): """ Rename files of the job """ if self.sorter.rename_or_not: self.sorter.rename(newfiles, workdir_complete) def rename_with_ext(self, workdir_complete): """ Special renamer for %ext """ if self.sorter.rename_or_not and '%ext' in workdir_complete and self.ext: # Replace %ext with extension newpath = workdir_complete.replace('%ext', self.ext) try: renamer(workdir_complete, newpath) except: return newpath, False return newpath, True else: return workdir_complete, True def move(self, workdir_complete): ok = True if self.type == 'movie': move_to_parent = True # check if we should leave the files inside an extra folder if cfg.movie_extra_folders(): # if there is a folder in the download, leave it in an extra folder move_to_parent = not check_for_folder(workdir_complete) if move_to_parent: workdir_complete, ok = move_to_parent_folder(workdir_complete) else: workdir_complete, ok = move_to_parent_folder(workdir_complete) if not ok: return workdir_complete, False path, part = os.path.split(workdir_complete) if '%fn' in part and self.sorter.fname: old = workdir_complete workdir_complete = os.path.join(path, part.replace('%fn', self.sorter.fname)) workdir_complete = get_unique_path(workdir_complete, create_dir=False) try: renamer(old, workdir_complete) except: logging.error(T('Cannot create directory %s'), clip_path(workdir_complete)) workdir_complete = old ok = False return workdir_complete, ok class SeriesSorter: """ Methods for Series Sorting """ def __init__(self, nzo, job_name, path, cat): self.matched = False self.original_job_name = job_name self.original_path = path self.nzo = nzo self.cat = cat self.sort_string = cfg.tv_sort_string() self.cats = cfg.tv_categories() self.filename_set = '' self.fname = '' # Value for %fn substitution in folders self.final_path = '' self.match_obj = None self.extras = None self.rename_or_not = False self.show_info = {} # Check if it is a TV show on init() self.match() def match(self, force=False): """ Checks the regex for a match, if so set self.match to true """ if force or (cfg.enable_tv_sorting() and cfg.tv_sort_string()): if force or (not self.cats) or (self.cat and self.cat.lower() in self.cats) or (not self.cat and 'None' in self.cats): # First check if the show matches TV episode regular expressions. Returns regex match object self.match_obj, self.extras = check_regexs(self.original_job_name, series_match) if self.match_obj: logging.debug("Found TV Show (%s)", self.original_job_name) self.matched = True def is_match(self): """ Returns whether there was a match or not """ return self.matched def get_final_path(self): """ Collect and construct all the variables such as episode name, show names """ if self.get_values(): # Get the final path path = self.construct_path() self.final_path = os.path.join(self.original_path, path) return self.final_path else: # Error Sorting return os.path.join(self.original_path, self.original_job_name) def get_multi_ep_naming(self, one, two, extras): """ Returns a list of unique values joined into a string and separated by - (ex:01-02-03-04) """ extra_list = [one] extra2_list = [two] for extra in extras: if extra not in (extra_list, extra2_list): ep_no2 = extra.rjust(2, '0') extra_list.append(extra) extra2_list.append(ep_no2) one = '-'.join(extra_list) two = '-'.join(extra2_list) return one, two def get_shownames(self): """ Get the show name from the match object and format it """ # Get the formatted title and alternate title formats self.show_info['show_tname'], self.show_info['show_tname_two'], self.show_info['show_tname_three'] = get_titles(self.nzo, self.match_obj, self.original_job_name, True) self.show_info['show_name'], self.show_info['show_name_two'], self.show_info['show_name_three'] = get_titles(self.nzo, self.match_obj, self.original_job_name) def get_seasons(self): """ Get the season number from the match object and format it """ try: season = self.match_obj.group(1).strip('_') # season number except AttributeError: season = '1' # Provide alternative formatting (0 padding) if season.lower() == 's': season2 = season else: try: season = str(int(season)) except: pass season2 = season.rjust(2, '0') self.show_info['season_num'] = season self.show_info['season_num_alt'] = season2 def get_episodes(self): """ Get the episode numbers from the match object, format and join them """ try: ep_no = self.match_obj.group(2) # episode number except AttributeError: ep_no = '1' # Store the original episode number # Provide alternative formatting (0 padding) ep_no2 = ep_no.rjust(2, '0') try: ep_no = str(int(ep_no)) except: pass # Dual episode support if self.extras: ep_no, ep_no2 = self.get_multi_ep_naming(ep_no, ep_no2, self.extras) self.show_info['episode_num'] = ep_no self.show_info['episode_num_alt'] = ep_no2 def get_showdescriptions(self): """ Get the show descriptions from the match object and format them """ self.show_info['ep_name'], self.show_info['ep_name_two'], self.show_info['ep_name_three'] = get_descriptions(self.nzo, self.match_obj, self.original_job_name) def get_values(self): """ Collect and construct all the values needed for path replacement """ try: # - Show Name self.get_shownames() # - Season self.get_seasons() # - Episode Number self.get_episodes() # - Episode Name self.get_showdescriptions() return True except: logging.error(T('Error getting TV info (%s)'), clip_path(self.original_job_name)) logging.info("Traceback: ", exc_info=True) return False def construct_path(self): """ Replaces the sort string with real values such as Show Name and Episode Number """ sorter = self.sort_string.replace('\\', '/') mapping = [] if ends_in_file(sorter): extension = True sorter = sorter.replace('.%ext', '') else: extension = False # Replace Show name mapping.append(('%sn', self.show_info['show_tname'])) mapping.append(('%s.n', self.show_info['show_tname_two'])) mapping.append(('%s_n', self.show_info['show_tname_three'])) mapping.append(('%sN', self.show_info['show_name'])) mapping.append(('%s.N', self.show_info['show_name_two'])) mapping.append(('%s_N', self.show_info['show_name_three'])) # Replace season number mapping.append(('%s', self.show_info['season_num'])) mapping.append(('%0s', self.show_info['season_num_alt'])) # Original dir name mapping.append(('%dn', self.original_job_name)) # Replace episode names if self.show_info['ep_name']: mapping.append(('%en', self.show_info['ep_name'])) mapping.append(('%e.n', self.show_info['ep_name_two'])) mapping.append(('%e_n', self.show_info['ep_name_three'])) else: mapping.append(('%en', '')) mapping.append(('%e.n', '')) mapping.append(('%e_n', '')) # Replace episode number mapping.append(('%e', self.show_info['episode_num'])) mapping.append(('%0e', self.show_info['episode_num_alt'])) # Make sure unsupported %desc is removed mapping.append(('%desc', '')) # Replace elements path = path_subst(sorter, mapping) for key, name in REPLACE_AFTER.items(): path = path.replace(key, name) # Lowercase all characters wrapped in {} path = to_lowercase(path) # Strip any extra ' ' '.' or '_' around foldernames path = strip_folders(path) # Split the last part of the path up for the renamer if extension: head, tail = os.path.split(path) self.filename_set = tail self.rename_or_not = True else: head = path if head: return os.path.normpath(head) else: # The normpath function translates "" to "." # which results in wrong path.join later on return head def rename(self, files, current_path): """ Rename for Series """ logging.debug("Renaming Series") largest = (None, None, 0) def to_filepath(f, current_path): if is_full_path(f): filepath = os.path.normpath(f) else: filepath = os.path.normpath(os.path.join(current_path, f)) return filepath # Create a generator of filepaths, ignore sample files and excluded files (vobs ect) filepaths = ((file, to_filepath(file, current_path)) for file in files if not RE_SAMPLE.search(file) and get_ext(file) not in EXCLUDED_FILE_EXTS) # Find the largest existing file for file, fp in filepaths: # If for some reason the file no longer exists, skip if not os.path.exists(fp): continue size = os.stat(fp).st_size f_file, f_fp, f_size = largest if size > f_size: largest = (file, fp, size) file, filepath, size = largest # >20MB if filepath and size > 20971520: self.fname, self.ext = os.path.splitext(os.path.split(file)[1]) newname = "%s%s" % (self.filename_set, self.ext) # Replace %fn with the original filename newname = newname.replace('%fn', self.fname) newpath = os.path.join(current_path, newname) # Replace %ext with extension newpath = newpath.replace('%ext', self.ext) try: logging.debug("Rename: %s to %s", filepath, newpath) renamer(filepath, newpath) except: logging.error(T('Failed to rename: %s to %s'), clip_path(current_path), clip_path(newpath)) logging.info("Traceback: ", exc_info=True) rename_similar(current_path, self.ext, self.filename_set, ()) else: logging.debug('Nothing to rename, %s', files) _RE_MULTIPLE = ( re.compile(r'cd\W?(\d+)\W?', re.I), # .cd1.mkv re.compile(r'\w\W?([\w\d])[{}]*$', re.I), # blah1.mkv blaha.mkv re.compile(r'\w\W([\w\d])\W', re.I) # blah-1-ok.mkv blah-a-ok.mkv ) def check_for_multiple(files): """ Return list of files that looks like a multi-part post """ for regex in _RE_MULTIPLE: matched_files = check_for_sequence(regex, files) if matched_files: return matched_files return '' def check_for_sequence(regex, files): """ Return list of files that looks like a sequence, using 'regex' """ matches = {} prefix = None # Build up a dictionary of matches # The key is based off the match, ie {1:'blah-part1.mkv'} for _file in files: name, ext = os.path.splitext(_file) match1 = regex.search(name) if match1: if not prefix or prefix == name[:match1.start()]: matches[match1.group(1)] = name + ext prefix = name[:match1.start()] # Don't do anything if only one or no files matched if len(list(matches.keys())) < 2: return {} key_prev = 0 passed = True alphabet = 'abcdefghijklmnopqrstuvwxyz' # Check the dictionary to see if the keys are in a numeric or alphabetic sequence for akey in sorted(matches.keys()): if akey.isdigit(): key = int(akey) elif akey in alphabet: key = alphabet.find(akey) + 1 else: passed = False if passed: if not key_prev: key_prev = key else: if key_prev + 1 == key: key_prev = key else: passed = False if passed: # convert {'b':'filename-b.mkv'} to {'2', 'filename-b.mkv'} item = matches.pop(akey) matches[str(key)] = item if passed: return matches else: return {} class MovieSorter: """ Methods for Generic Sorting """ def __init__(self, nzo, job_name, path, cat): self.matched = False self.original_job_name = job_name self.original_path = path self.sort_string = cfg.movie_sort_string() self.extra = cfg.movie_sort_extra() self.cats = cfg.movie_categories() self.cat = cat self.nzo = nzo self.filename_set = '' self.fname = '' # Value for %fn substitution in folders self.final_path = '' self.match_obj = None self.rename_or_not = False self.movie_info = {} # Check if we match the category in init() self.match() def match(self, force=False): """ Checks the category for a match, if so set self.match to true """ if force or (cfg.enable_movie_sorting() and self.sort_string): # First check if the show matches TV episode regular expressions. Returns regex match object if force or (self.cat and self.cat.lower() in self.cats) or (not self.cat and 'None' in self.cats): logging.debug("Found Movie (%s)", self.original_job_name) self.matched = True def get_final_path(self): """ Collect and construct all the variables such as episode name, show names """ if self.get_values(): # Get the final path path = self.construct_path() self.final_path = os.path.join(self.original_path, path) return self.final_path else: # Error Sorting return os.path.join(self.original_path, self.original_job_name) def get_values(self): """ Collect and construct all the values needed for path replacement """ # - Get Year if self.nzo: year = self.nzo.nzo_info.get('year') else: year = '' if year: year_m = None else: job_name = self.original_job_name.replace('_', ' ') RE_YEAR = re.compile(year_match, re.I) year_m = RE_YEAR.search(job_name) if year_m: # Find the last matched date # Keep year_m to use in get_titles year = RE_YEAR.findall(job_name)[-1][0] else: year = '' self.movie_info['year'] = year # - Get Decades self.movie_info['decade'], self.movie_info['decade_two'] = get_decades(year) # - Get Title self.movie_info['ttitle'], self.movie_info['ttitle_two'], self.movie_info['ttitle_three'] = get_titles(self.nzo, year_m, self.original_job_name, True) self.movie_info['title'], self.movie_info['title_two'], self.movie_info['title_three'] = get_titles(self.nzo, year_m, self.original_job_name) return True def construct_path(self): """ Return path reconstructed from original and sort expression """ sorter = self.sort_string.replace('\\', '/') mapping = [] if ends_in_file(sorter): extension = True sorter = sorter.replace(".%ext", '') else: extension = False # Replace title mapping.append(('%title', self.movie_info['title'])) mapping.append(('%.title', self.movie_info['title_two'])) mapping.append(('%_title', self.movie_info['title_three'])) # Replace title (short forms) mapping.append(('%t', self.movie_info['title'])) mapping.append(('%.t', self.movie_info['title_two'])) mapping.append(('%_t', self.movie_info['title_three'])) mapping.append(('%sn', self.movie_info['title'])) mapping.append(('%s.n', self.movie_info['title_two'])) mapping.append(('%s_n', self.movie_info['title_three'])) mapping.append(('%sN', self.movie_info['ttitle'])) mapping.append(('%s.N', self.movie_info['ttitle_two'])) mapping.append(('%s_N', self.movie_info['ttitle_three'])) # Replace year mapping.append(('%y', self.movie_info['year'])) # Replace decades mapping.append(('%decade', self.movie_info['decade'])) mapping.append(('%0decade', self.movie_info['decade_two'])) # Original dir name mapping.append(('%dn', self.original_job_name)) path = path_subst(sorter, mapping) for key, name in REPLACE_AFTER.items(): path = path.replace(key, name) # Lowercase all characters wrapped in {} path = to_lowercase(path) # Strip any extra ' ' '.' or '_' around foldernames path = strip_folders(path) # Split the last part of the path up for the renamer if extension: head, tail = os.path.split(path) self.filename_set = tail self.rename_or_not = True else: head = path if head: return os.path.normpath(head) else: # The normpath function translates "" to "." # which results in wrong path.join later on return head def rename(self, _files, current_path): """ Rename for Generic files """ logging.debug("Renaming Generic file") def filter_files(_file, current_path): if is_full_path(_file): filepath = os.path.normpath(_file) else: filepath = os.path.normpath(os.path.join(current_path, _file)) if os.path.exists(filepath): size = os.stat(filepath).st_size if size >= cfg.movie_rename_limit.get_int() and not RE_SAMPLE.search(_file) \ and get_ext(_file) not in EXCLUDED_FILE_EXTS: return True return False # remove any files below the limit from this list files = [_file for _file in _files if filter_files(_file, current_path)] length = len(files) # Single File Handling if length == 1: file = files[0] if is_full_path(file): filepath = os.path.normpath(file) else: filepath = os.path.normpath(os.path.join(current_path, file)) if os.path.exists(filepath): self.fname, ext = os.path.splitext(os.path.split(file)[1]) newname = "%s%s" % (self.filename_set, ext) newname = newname.replace('%fn', self.fname) newpath = os.path.join(current_path, newname) try: logging.debug("Rename: %s to %s", filepath, newpath) renamer(filepath, newpath) except: logging.error(T('Failed to rename: %s to %s'), clip_path(filepath), clip_path(newpath)) logging.info("Traceback: ", exc_info=True) rename_similar(current_path, ext, self.filename_set, ()) # Sequence File Handling # if there is more than one extracted file check for CD1/1/A in the title elif self.extra: matched_files = check_for_multiple(files) # rename files marked as in a set if matched_files: logging.debug("Renaming a series of generic files (%s)", matched_files) renamed = list(matched_files.values()) for index, file in matched_files.items(): filepath = os.path.join(current_path, file) renamed.append(filepath) self.fname, ext = os.path.splitext(os.path.split(file)[1]) name = '%s%s' % (self.filename_set, self.extra) name = name.replace('%1', str(index)).replace('%fn', self.fname) name = name + ext newpath = os.path.join(current_path, name) try: logging.debug("Rename: %s to %s", filepath, newpath) renamer(filepath, newpath) except: logging.error(T('Failed to rename: %s to %s'), clip_path(filepath), clip_path(newpath)) logging.info("Traceback: ", exc_info=True) rename_similar(current_path, ext, self.filename_set, renamed) else: logging.debug("Movie files not in sequence %s", _files) class DateSorter: """ Methods for Date Sorting """ def __init__(self, nzo, job_name, path, cat): self.matched = False self.original_job_name = job_name self.original_path = path self.sort_string = cfg.date_sort_string() self.cats = cfg.date_categories() self.cat = cat self.nzo = nzo self.filename_set = '' self.fname = '' # Value for %fn substitution in folders self.match_obj = None self.rename_or_not = False self.date_type = None self.date_info = {} self.final_path = '' # Check if we match the category in init() self.match() def match(self, force=False): """ Checks the category for a match, if so set self.matched to true """ if force or (cfg.enable_date_sorting() and self.sort_string): # First check if the show matches TV episode regular expressions. Returns regex match object if force or (self.cat and self.cat.lower() in self.cats) or (not self.cat and 'None' in self.cats): self.match_obj, self.date_type = check_for_date(self.original_job_name, date_match) if self.match_obj: logging.debug("Found date for sorting (%s)", self.original_job_name) self.matched = True def is_match(self): """ Returns whether there was a match or not """ return self.matched def get_final_path(self): """ Collect and construct all the variables such as episode name, show names """ if self.get_values(): # Get the final path path = self.construct_path() self.final_path = os.path.join(self.original_path, path) return self.final_path else: # Error Sorting return os.path.join(self.original_path, self.original_job_name) def get_values(self): """ Collect and construct all the values needed for path replacement """ # 2008-10-16 if self.date_type == 1: self.date_info['year'] = self.match_obj.group(1) self.date_info['month'] = self.match_obj.group(2) self.date_info['date'] = self.match_obj.group(3) # 10.16.2008 else: self.date_info['year'] = self.match_obj.group(3) self.date_info['month'] = self.match_obj.group(1) self.date_info['date'] = self.match_obj.group(2) self.date_info['month_two'] = self.date_info['month'].rjust(2, '0') self.date_info['date_two'] = self.date_info['date'].rjust(2, '0') # - Get Decades self.date_info['decade'], self.date_info['decade_two'] = get_decades(self.date_info['year']) # - Get Title self.date_info['ttitle'], self.date_info['ttitle_two'], self.date_info['ttitle_three'] = get_titles(self.nzo, self.match_obj, self.original_job_name, True) self.date_info['title'], self.date_info['title_two'], self.date_info['title_three'] = get_titles(self.nzo, self.match_obj, self.original_job_name) self.date_info['ep_name'], self.date_info['ep_name_two'], self.date_info['ep_name_three'] = get_descriptions(self.nzo, self.match_obj, self.original_job_name) return True def construct_path(self): """ Return path reconstructed from original and sort expression """ sorter = self.sort_string.replace('\\', '/') mapping = [] if ends_in_file(sorter): extension = True sorter = sorter.replace(".%ext", '') else: extension = False # Replace title mapping.append(('%title', self.date_info['title'])) mapping.append(('%.title', self.date_info['title_two'])) mapping.append(('%_title', self.date_info['title_three'])) mapping.append(('%t', self.date_info['title'])) mapping.append(('%.t', self.date_info['title_two'])) mapping.append(('%_t', self.date_info['title_three'])) mapping.append(('%sn', self.date_info['ttitle'])) mapping.append(('%s.n', self.date_info['ttitle_two'])) mapping.append(('%s_n', self.date_info['ttitle_three'])) mapping.append(('%sN', self.date_info['title'])) mapping.append(('%s.N', self.date_info['title_two'])) mapping.append(('%s_N', self.date_info['title_three'])) # Replace year mapping.append(('%year', self.date_info['year'])) mapping.append(('%y', self.date_info['year'])) if self.date_info['ep_name']: mapping.append(('%desc', self.date_info['ep_name'])) mapping.append(('%.desc', self.date_info['ep_name_two'])) mapping.append(('%_desc', self.date_info['ep_name_three'])) else: mapping.append(('%desc', '')) mapping.append(('%.desc', '')) mapping.append(('%_desc', '')) # Replace dir-name before replacing %d for month mapping.append(('%dn', self.original_job_name)) # Replace decades mapping.append(('%decade', self.date_info['decade'])) mapping.append(('%0decade', self.date_info['decade_two'])) # Replace month mapping.append(('%m', self.date_info['month'])) mapping.append(('%0m', self.date_info['month_two'])) # Replace date mapping.append(('%d', self.date_info['date'])) mapping.append(('%0d', self.date_info['date_two'])) path = path_subst(sorter, mapping) for key, name in REPLACE_AFTER.items(): path = path.replace(key, name) # Lowercase all characters wrapped in {} path = to_lowercase(path) # Strip any extra ' ' '.' or '_' around foldernames path = strip_folders(path) # Split the last part of the path up for the renamer if extension: head, tail = os.path.split(path) self.filename_set = tail self.rename_or_not = True else: head = path if head: return os.path.normpath(head) else: # The normpath function translates "" to "." # which results in wrong path.join later on return head def rename(self, files, current_path): """ Renaming Date file """ logging.debug("Renaming Date file") # find the master file to rename for file in files: if is_full_path(file): filepath = os.path.normpath(file) else: filepath = os.path.normpath(os.path.join(current_path, file)) if os.path.exists(filepath): size = os.stat(filepath).st_size if size > cfg.movie_rename_limit.get_int(): if 'sample' not in file: self.fname, ext = os.path.splitext(os.path.split(file)[1]) newname = "%s%s" % (self.filename_set, ext) newname = newname.replace('%fn', self.fname) newpath = os.path.join(current_path, newname) if not os.path.exists(newpath): try: logging.debug("Rename: %s to %s", filepath, newpath) renamer(filepath, newpath) except: logging.error(T('Failed to rename: %s to %s'), clip_path(current_path), clip_path(newpath)) logging.info("Traceback: ", exc_info=True) rename_similar(current_path, ext, self.filename_set, ()) break def path_subst(path, mapping): """ Replace the sort sting elements by real values. Non-elements are copied literally. path = the sort string mapping = array of tuples that maps all elements to their values """ # Added ugly hack to prevent %ext from being masked by %e newpath = [] plen = len(path) n = 0 while n < plen: result = path[n] if result == '%': for key, value in mapping: if path.startswith(key, n) and not path.startswith('%ext', n): n += len(key) - 1 result = value break newpath.append(result) n += 1 return ''.join(newpath) def get_titles(nzo, match, name, titleing=False): """ The title will be the part before the match Clean it up and title() it ''.title() isn't very good under python so this contains a lot of little hacks to make it better and for more control """ if nzo: title = nzo.nzo_info.get('propername') else: title = '' if not title: if match: name = name[:match.start()] # Replace .US. with (US) if cfg.tv_sort_countries() == 1: for rep in COUNTRY_REP: # (us) > (US) name = replace_word(name, rep.lower(), rep) # (Us) > (US) name = replace_word(name, rep.title(), rep) # .US. > (US) dotted_country = '.%s.' % (rep.strip('()')) name = replace_word(name, dotted_country, rep) # Remove .US. and (US) elif cfg.tv_sort_countries() == 2: for rep in COUNTRY_REP: # Remove (US) name = replace_word(name, rep, '') dotted_country = '.%s.' % (rep.strip('()')) # Remove .US. name = replace_word(name, dotted_country, '.') title = name.replace('.', ' ').replace('_', ' ') title = title.strip().strip('(').strip('_').strip('-').strip().strip('_') if titleing: title = title.title() # title the show name so it is in a consistent letter case # title applied uppercase to 's Python bug? title = title.replace("'S", "'s") # Replace titled country names, (Us) with (US) and so on if cfg.tv_sort_countries() == 1: for rep in COUNTRY_REP: title = title.replace(rep.title(), rep) # Remove country names, ie (Us) elif cfg.tv_sort_countries() == 2: for rep in COUNTRY_REP: title = title.replace(rep.title(), '').strip() # Make sure some words such as 'and' or 'of' stay lowercased. for x in LOWERCASE: xtitled = x.title() title = replace_word(title, xtitled, x) # Make sure some words such as 'III' or 'IV' stay uppercased. for x in UPPERCASE: xtitled = x.title() title = replace_word(title, xtitled, x) # Make sure the first letter of the title is always uppercase if title: title = title[0].title() + title[1:] # The title with spaces replaced by dots dots = title.replace(" - ", "-").replace(' ', '.').replace('_', '.') dots = dots.replace('(', '.').replace(')', '.').replace('..', '.').rstrip('.') # The title with spaces replaced by underscores underscores = title.replace(' ', '_').replace('.', '_').replace('__', '_').rstrip('_') return title, dots, underscores def replace_word(word_input, one, two): """ Regex replace on just words """ regex = re.compile(r'\W(%s)(\W|$)' % one, re.I) matches = regex.findall(word_input) if matches: for unused in matches: word_input = word_input.replace(one, two) return word_input def get_descriptions(nzo, match, name): """ If present, get a description from the nzb name. A description has to be after the matched item, separated either like ' - Description' or '_-_Description' """ if nzo: ep_name = nzo.nzo_info.get('episodename') else: ep_name = '' if not ep_name: if match: ep_name = name[match.end():] # Need to improve for multi-ep support else: ep_name = name ep_name = ep_name.strip(' _.') if ep_name.startswith('-'): ep_name = ep_name.strip('- _.') if '.' in ep_name and ' ' not in ep_name: ep_name = ep_name.replace('.', ' ') ep_name = ep_name.replace('_', ' ') ep_name2 = ep_name.replace(" - ", "-").replace(" ", ".") ep_name3 = ep_name.replace(" ", "_") return ep_name, ep_name2, ep_name3 def get_decades(year): """ Return 4 digit and 2 digit decades given 'year' """ if year: try: decade = year[2:3] + '0' decade2 = year[:3] + '0' except: decade = '' decade2 = '' else: decade = '' decade2 = '' return decade, decade2 def check_for_folder(path): """ Return True if any folder is found in the tree at 'path' """ for _root, dirs, _files in os.walk(path): if dirs: return True return False def to_lowercase(path): """ Lowercases any characters enclosed in {} """ _RE_LOWERCASE = re.compile(r'{([^{]*)}') while True: m = _RE_LOWERCASE.search(path) if not m: break path = path[:m.start()] + m.group(1).lower() + path[m.end():] # just in case path = path.replace('{', '') path = path.replace('}', '') return path def strip_folders(path): """ Return 'path' without leading and trailing spaces and underscores in each element For Windows, also remove leading and trailing dots """ unc = sabnzbd.WIN32 and (path.startswith('//') or path.startswith('\\\\')) f = path.strip('/').split('/') # For path beginning with a slash, insert empty element to prevent loss if path.strip()[0] in '/\\': f.insert(0, '') def strip_all(x): """ Strip all leading/trailing underscores also dots for Windows """ x = x.strip().strip('_') if sabnzbd.WIN32: # OSX and Linux should keep dots, because leading dots are significant # while Windows cannot handle trailing dots x = x.strip('.') x = x.strip() return x path = os.path.normpath('/'.join([strip_all(x) for x in f])) if unc: return '\\' + path else: return path def rename_similar(folder, skip_ext, name, skipped_files): """ Rename all other files in the 'folder' hierarchy after 'name' and move them to the root of 'folder'. Files having extension 'skip_ext' will be moved, but not renamed. Don't touch files in list `skipped_files` """ logging.debug('Give files in set "%s" matching names.', name) folder = os.path.normpath(folder) skip_ext = skip_ext.lower() for root, dirs, files in os.walk(folder): for f in files: path = os.path.join(root, f) if path in skipped_files: continue org, ext = os.path.splitext(f) if ext.lower() == skip_ext: # Move file, but do not rename newpath = os.path.join(folder, f) else: # Move file and rename newname = "%s%s" % (name, ext) newname = newname.replace('%fn', org) newpath = os.path.join(folder, newname) if path != newpath: newpath = get_unique_filename(newpath) try: logging.debug("Rename: %s to %s", path, newpath) renamer(path, newpath) except: logging.error(T('Failed to rename similar file: %s to %s'), clip_path(path), clip_path(newpath)) logging.info("Traceback: ", exc_info=True) cleanup_empty_directories(folder) def check_regexs(filename, matchers): """ Regular Expression match for a list of regexes Returns the MatchObject if a match is made This version checks for an additional match """ extras = [] for expressions in matchers: expression, extramatchers = expressions match1 = expression.search(filename) if match1: for m in extramatchers: match2 = m.findall(filename, match1.end()) if match2: for match in match2: if type(match) == type(()) and len(match) > 1: extras.append(match[1]) else: extras.append(match) break return match1, extras return None, None def check_for_date(filename, matcher): """ Regular Expression match for date based files Returns the MatchObject if a match is made """ x = 0 if matcher: for expression in matcher: regex = re.compile(expression) match1 = regex.search(filename) x += 1 if match1: return match1, x return None, 0 def is_full_path(file): """ Return True if path is absolute """ if file.startswith('\\') or file.startswith('/'): return True try: if file[1:3] == ':\\': return True except: pass return False def eval_sort(sorttype, expression, name=None, multipart=''): """ Preview a sort expression, to be used by API """ from sabnzbd.api import Ttemplate path = '' name = sanitize_foldername(name) if sorttype == 'series': name = name or ('%s S01E05 - %s [DTS]' % (Ttemplate('show-name'), Ttemplate('ep-name'))) sorter = SeriesSorter(None, name, path, 'tv') elif sorttype == 'movie': name = name or (Ttemplate('movie-sp-name') + ' (2009)') sorter = MovieSorter(None, name, path, 'tv') elif sorttype == 'date': name = name or (Ttemplate('show-name') + ' 2009-01-02') sorter = DateSorter(None, name, path, 'tv') else: return None sorter.sort_string = expression sorter.match(force=True) path = sorter.get_final_path() path = os.path.normpath(os.path.join(path, sorter.filename_set)) fname = Ttemplate('orgFilename') fpath = path if sorttype == 'movie' and '%1' in multipart: fname = fname + multipart.replace('%1', '1') fpath = fpath + multipart.replace('%1', '1') if '%fn' in path: path = path.replace('%fn', fname + '.mkv') else: if sorter.rename_or_not: path = fpath + '.mkv' else: if sabnzbd.WIN32: path += '\\' else: path += '/' return path sabnzbd-develop/sabnzbd/articlecache.py0000600000175000017500000001471513642116632016351 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.articlecache - Article cache handling """ import sys import logging import threading import struct import sabnzbd from sabnzbd.decorators import synchronized from sabnzbd.constants import GIGI, ANFO ARTICLE_LOCK = threading.Lock() class ArticleCache: do = None def __init__(self): self.__cache_limit_org = 0 self.__cache_limit = 0 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 else: self.__cache_limit = min(limit, self.__cache_upper_limit) @synchronized(ARTICLE_LOCK) def reserve_space(self, data_size): """ Is there space left in the set limit? """ self.__cache_size += data_size if self.__cache_size + data_size > self.__cache_limit: return False else: return True @synchronized(ARTICLE_LOCK) def free_reserve_space(self, data_size): """ Remove previously reserved space """ self.__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(): # 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) if article.lowest_partnum and not article.nzf.import_finished: # Write the first-fetched articles to disk # Otherwise the cache could overflow self.__flush_article(article, data) return if self.__cache_limit: if self.__cache_limit < 0: self.__add_to_cache(article, data) else: data_size = len(data) while (self.__cache_size > (self.__cache_limit - data_size)) \ and self.__article_list: # 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) # No need to flush if this is a refreshment article if old_article != article: self.__flush_article(old_article, old_data) # Does our article fit into our limit now? if (self.__cache_size + data_size) <= self.__cache_limit: self.__add_to_cache(article, data) else: self.__flush_article(article, data) else: self.__flush_article(article, data) @synchronized(ARTICLE_LOCK) def load_article(self, article): data = None nzo = article.nzf.nzo if article in self.__article_list: data = self.__article_table.pop(article) self.__article_list.remove(article) self.__cache_size -= len(data) elif article.art_id: data = sabnzbd.load_data(article.art_id, nzo.workpath, remove=True, do_pickle=False, silent=True) if article in nzo.saved_articles: nzo.remove_saved_article(article) 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) @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) if article.art_id: sabnzbd.remove_data(article.art_id, article.nzf.nzo.workpath) def __flush_article(self, article, data): 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 art_id = article.get_art_id() if art_id: # Save data, but don't complain when destination folder is missing # because this flush may come after completion of the NZO. sabnzbd.save_data(data, art_id, nzo.workpath, do_pickle=False, silent=True) else: logging.warning("Flushing %s failed -> no art_id", article) def __add_to_cache(self, article, data): if article in self.__article_table: self.__cache_size -= len(self.__article_table[article]) else: self.__article_list.append(article) self.__article_table[article] = data self.__cache_size += len(data) # Create the instance ArticleCache() sabnzbd-develop/sabnzbd/filesystem.py0000600000175000017500000006554113642116632016131 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2008-2017 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.misc - filesystem operations """ import os import sys import logging import re import shutil import threading import time import fnmatch import stat import sabnzbd from sabnzbd.decorators import synchronized from sabnzbd.constants import FUTURE_Q_FOLDER, JOB_ADMIN, GIGI from sabnzbd.encoding import correct_unknown_encoding def get_ext(filename): """ Return lowercased file extension """ try: return os.path.splitext(filename)[1].lower() except: return "" def get_filename(path): """ Return path without the file extension """ try: return os.path.split(path)[1] except: return "" def setname_from_path(path): """ Get the setname from a path """ return os.path.splitext(os.path.basename(path))[0] def is_writable(path): """ Return True is file is writable (also when non-existent) """ if os.path.isfile(path): return bool(os.stat(path).st_mode & stat.S_IWUSR) else: return True _DEVICES = ( "con", "prn", "aux", "nul", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", ) def replace_win_devices(name): """ Remove reserved Windows device names from a name. aux.txt ==> _aux.txt txt.aux ==> txt.aux """ if name: lname = name.lower() for dev in _DEVICES: if lname == dev or lname.startswith(dev + "."): name = "_" + name break # Remove special NTFS filename if lname.startswith("$mft"): name = name.replace("$", "S", 1) return name def has_win_device(p): """ Return True if filename part contains forbidden name Before and after sanitizing """ p = os.path.split(p)[1].lower() for dev in _DEVICES: if p == dev or p.startswith(dev + ".") or p.startswith("_" + dev + "."): return True return False CH_ILLEGAL = "/" CH_LEGAL = "+" CH_ILLEGAL_WIN = '\/<>?*|"\t:' CH_LEGAL_WIN = "++{}!@#'+-" def sanitize_filename(name): """ Return filename with illegal chars converted to legal ones and with the par2 extension always in lowercase """ if not name: return name illegal = CH_ILLEGAL legal = CH_LEGAL if sabnzbd.WIN32 or sabnzbd.cfg.sanitize_safe(): # Remove all bad Windows chars too illegal += CH_ILLEGAL_WIN legal += CH_LEGAL_WIN if ":" in name and sabnzbd.DARWIN: # Compensate for the foolish way par2 on OSX handles a colon character name = name[name.rfind(":") + 1 :] lst = [] for ch in name.strip(): if ch in illegal: ch = legal[illegal.find(ch)] lst.append(ch) name = "".join(lst) if sabnzbd.WIN32 or sabnzbd.cfg.sanitize_safe(): name = replace_win_devices(name) if not name: name = "unknown" name, ext = os.path.splitext(name) lowext = ext.lower() if lowext == ".par2" and lowext != ext: ext = lowext return name + ext def sanitize_foldername(name): """ Return foldername with dodgy chars converted to safe ones Remove any leading and trailing dot and space characters """ if not name: return name illegal = CH_ILLEGAL + ':"' legal = CH_LEGAL + "-'" if sabnzbd.WIN32 or sabnzbd.cfg.sanitize_safe(): # Remove all bad Windows chars too illegal += CH_ILLEGAL_WIN legal += CH_LEGAL_WIN repl = sabnzbd.cfg.replace_illegal() lst = [] for ch in name.strip(): if ch in illegal: if repl: ch = legal[illegal.find(ch)] lst.append(ch) else: lst.append(ch) name = "".join(lst) name = name.strip() if sabnzbd.WIN32 or sabnzbd.cfg.sanitize_safe(): name = replace_win_devices(name) # And finally, make sure it doesn't end in a dot if name != "." and name != "..": name = name.rstrip(".") if not name: name = "unknown" return name def sanitize_and_trim_path(path): """ Remove illegal characters and trim element size """ path = path.strip() new_path = "" if sabnzbd.WIN32: if path.startswith("\\\\?\\UNC\\"): new_path = "\\\\?\\UNC\\" path = path[8:] elif path.startswith("\\\\?\\"): new_path = "\\\\?\\" path = path[4:] path = path.replace("\\", "/") parts = path.split("/") if sabnzbd.WIN32 and len(parts[0]) == 2 and ":" in parts[0]: new_path += parts[0] + "/" parts.pop(0) elif path.startswith("//"): new_path = "//" elif path.startswith("/"): new_path = "/" for part in parts: new_path = os.path.join(new_path, sanitize_foldername(part)) return os.path.abspath(os.path.normpath(new_path)) def sanitize_files_in_folder(folder): """ Sanitize each file in the folder, return list of new names """ lst = [] for root, _, files in os.walk(folder): for file_ in files: path = os.path.join(root, file_) new_path = os.path.join(root, sanitize_filename(file_)) if path != new_path: try: os.rename(path, new_path) path = new_path except: logging.debug("Cannot rename %s to %s", path, new_path) lst.append(path) return lst def is_obfuscated_filename(filename): """ Check if this file has an extension, if not, it's probably obfuscated and we don't use it """ return os.path.splitext(filename)[1] == "" def real_path(loc, path): """ When 'path' is relative, return normalized join of 'loc' and 'path' When 'path' is absolute, return normalized path A path starting with ~ will be located in the user's Home folder """ # The Windows part is a bit convoluted because # C: and C:\ are 2 different things if path: path = path.strip() else: path = "" if path: if not sabnzbd.WIN32 and path.startswith("~/"): path = path.replace("~", os.environ.get("HOME", sabnzbd.DIR_HOME), 1) if sabnzbd.WIN32: path = path.replace("/", "\\") if len(path) > 1 and path[0].isalpha() and path[1] == ":": if len(path) == 2 or path[2] != "\\": path = path.replace(":", ":\\", 1) elif path.startswith("\\\\"): pass elif path.startswith("\\"): if len(loc) > 1 and loc[0].isalpha() and loc[1] == ":": path = loc[:2] + path else: path = os.path.join(loc, path) elif path[0] != "/": path = os.path.join(loc, path) else: path = loc return long_path(os.path.normpath(os.path.abspath(path))) def create_real_path(name, loc, path, umask=False, writable=True): """ When 'path' is relative, create join of 'loc' and 'path' When 'path' is absolute, create normalized path 'name' is used for logging. Optional 'umask' will be applied. 'writable' means that an existing folder should be writable Returns ('success', 'full path', 'error_msg') """ if path: my_dir = real_path(loc, path) if not os.path.exists(my_dir): logging.info("%s directory: %s does not exist, try to create it", name, my_dir) if not create_all_dirs(my_dir, umask): msg = T("Cannot create directory %s") % clip_path(my_dir) logging.error(msg) return False, my_dir, msg checks = (os.W_OK + os.R_OK) if writable else os.R_OK if os.access(my_dir, checks): return True, my_dir, None else: msg = T("%s directory: %s error accessing") % (name, clip_path(my_dir)) logging.error(msg) return False, my_dir, msg else: return False, path, None def same_file(a, b): """ Return 0 if A and B have nothing in common return 1 if A and B are actually the same path return 2 if B is a subfolder of A """ if sabnzbd.WIN32 or sabnzbd.DARWIN: a = clip_path(a.lower()) b = clip_path(b.lower()) a = os.path.normpath(os.path.abspath(a)) b = os.path.normpath(os.path.abspath(b)) # If it's the same file, it's also a sub-folder is_subfolder = 0 if b.startswith(a): is_subfolder = 2 try: # Only available on Linux if os.path.samefile(a, b) is True: return 1 return is_subfolder except: if int(a == b): return 1 else: return is_subfolder def check_mount(path): """ Return False if volume isn't mounted on Linux or OSX Retry 6 times with an interval of 1 sec. """ if sabnzbd.DARWIN: m = re.search(r"^(/Volumes/[^/]+)/", path, re.I) elif sabnzbd.WIN32: m = re.search(r"^([a-z]:\\)", path, re.I) else: m = re.search(r"^(/(?:mnt|media)/[^/]+)/", path) if m: for n in range(sabnzbd.cfg.wait_ext_drive() or 1): if os.path.exists(m.group(1)): return True logging.debug("Waiting for %s to come online", m.group(1)) time.sleep(1) return not m def safe_fnmatch(f, pattern): """ fnmatch will fail if the pattern contains any of it's key characters, like [, ] or !. """ try: return fnmatch.fnmatch(f, pattern) except re.error: return False def globber(path, pattern="*"): """ Return matching base file/folder names in folder `path` """ # Cannot use glob.glob() because it doesn't support Windows long name notation if os.path.exists(path): return [f for f in os.listdir(path) if safe_fnmatch(f, pattern)] return [] def globber_full(path, pattern="*"): """ Return matching full file/folder names in folder `path` """ # Cannot use glob.glob() because it doesn't support Windows long name notation if os.path.exists(path): return [os.path.join(path, f) for f in os.listdir(path) if safe_fnmatch(f, pattern)] return [] def trim_win_path(path): """ Make sure Windows path stays below 70 by trimming last part """ if sabnzbd.WIN32 and len(path) > 69: path, folder = os.path.split(path) maxlen = 69 - len(path) if len(folder) > maxlen: folder = folder[:maxlen] path = os.path.join(path, folder).rstrip(". ") return path def fix_unix_encoding(folder): """ Fix bad name encoding for Unix systems This happens for example when files are created on Windows but unpacked/repaired on linux """ if not sabnzbd.WIN32 and not sabnzbd.DARWIN: for root, dirs, files in os.walk(folder): for name in files: new_name = correct_unknown_encoding(name) if name != new_name: try: renamer(os.path.join(root, name), os.path.join(root, new_name)) except: logging.info("Cannot correct name of %s", os.path.join(root, name)) def make_script_path(script): """ Return full script path, if any valid script exists, else None """ s_path = None path = sabnzbd.cfg.script_dir.get_path() if path and script: if script.lower() not in ("none", "default"): s_path = os.path.join(path, script) if not os.path.exists(s_path): s_path = None else: # Paths to scripts should not be long-path notation s_path = clip_path(s_path) return s_path def get_admin_path(name, future): """ Return news-style full path to job-admin folder of names job or else the old cache path """ if future: return os.path.join(sabnzbd.cfg.admin_dir.get_path(), FUTURE_Q_FOLDER) else: return os.path.join(os.path.join(sabnzbd.cfg.download_dir.get_path(), name), JOB_ADMIN) def set_chmod(path, permissions, report): """ Set 'permissions' on 'path', report any errors when 'report' is True """ try: logging.debug("Applying permissions %s (octal) to %s", oct(permissions), path) os.chmod(path, permissions) except: lpath = path.lower() if report and ".appledouble" not in lpath and ".ds_store" not in lpath: logging.error(T("Cannot change permissions of %s"), clip_path(path)) logging.info("Traceback: ", exc_info=True) def set_permissions(path, recursive=True): """ Give folder tree and its files their proper permissions """ if not sabnzbd.WIN32: umask = sabnzbd.cfg.umask() try: # Make sure that user R+W+X is on umask = int(umask, 8) | int("0700", 8) report = True except ValueError: # No or no valid permissions # Use the effective permissions of the session # Don't report errors (because the system might not support it) umask = int("0777", 8) & (sabnzbd.ORG_UMASK ^ int("0777", 8)) report = False # Remove X bits for files umask_file = umask & int("7666", 8) if os.path.isdir(path): if recursive: # Parse the dir/file tree and set permissions for root, _dirs, files in os.walk(path): set_chmod(root, umask, report) for name in files: set_chmod(os.path.join(root, name), umask_file, report) else: set_chmod(path, umask, report) else: set_chmod(path, umask_file, report) def clip_path(path): r""" Remove \\?\ or \\?\UNC\ prefix from Windows path """ if sabnzbd.WIN32 and path and "?" in path: path = path.replace("\\\\?\\UNC\\", "\\\\", 1).replace("\\\\?\\", "", 1) return path def long_path(path): """ For Windows, convert to long style path; others, return same path """ if sabnzbd.WIN32 and path and not path.startswith("\\\\?\\"): if path.startswith("\\\\"): # Special form for UNC paths path = path.replace("\\\\", "\\\\?\\UNC\\", 1) else: # Normal form for local paths path = "\\\\?\\" + path return path ############################################################################## # Locked directory operations to avoid problems with simultaneous add/remove ############################################################################## DIR_LOCK = threading.RLock() @synchronized(DIR_LOCK) def create_all_dirs(path, umask=False): """ Create all required path elements and set umask on all The umask argument is ignored on Windows Return path if elements could be made or exists """ try: # Use custom mask if desired mask = 0o700 if umask and sabnzbd.cfg.umask(): mask = int(sabnzbd.cfg.umask(), 8) # Use python functions to create the directory logging.info("Creating directories: %s (mask=%s)", (path, mask)) os.makedirs(path, mode=mask, exist_ok=True) return path except OSError: logging.error(T("Failed making (%s)"), clip_path(path), exc_info=True) return False @synchronized(DIR_LOCK) def get_unique_path(dirpath, n=0, create_dir=True): """ Determine a unique folder or filename """ if not check_mount(dirpath): return dirpath path = dirpath if n: path = "%s.%s" % (dirpath, n) if not os.path.exists(path): if create_dir: return create_all_dirs(path, umask=True) else: return path else: return get_unique_path(dirpath, n=n + 1, create_dir=create_dir) @synchronized(DIR_LOCK) def get_unique_filename(path): """ Check if path is unique. If not, add number like: "/path/name.NUM.ext". """ num = 1 new_path, fname = os.path.split(path) name, ext = os.path.splitext(fname) while os.path.exists(path): fname = "%s.%d%s" % (name, num, ext) num += 1 path = os.path.join(new_path, fname) return path @synchronized(DIR_LOCK) def recursive_listdir(dir): """ List all files in dirs and sub-dirs """ filelist = [] for root, dirs, files in os.walk(dir): for file in files: if ".AppleDouble" not in root and ".DS_Store" not in root: p = os.path.join(root, file) filelist.append(p) return filelist @synchronized(DIR_LOCK) def move_to_path(path, new_path): """ Move a file to a new path, optionally give unique filename Return (ok, new_path) """ ok = True overwrite = sabnzbd.cfg.overwrite_files() new_path = os.path.abspath(new_path) if overwrite and os.path.exists(new_path): try: os.remove(new_path) except: overwrite = False if not overwrite: new_path = get_unique_filename(new_path) if new_path: logging.debug("Moving (overwrite: %s) %s => %s", overwrite, path, new_path) try: # First try cheap rename renamer(path, new_path) except: # Cannot rename, try copying logging.debug("File could not be renamed, trying copying: %s", path) try: create_all_dirs(os.path.dirname(new_path), umask=True) shutil.copyfile(path, new_path) os.remove(path) except: # Check if the old-file actually exists (possible delete-delays) if not os.path.exists(path): logging.debug("File not moved, original path gone: %s", path) return True, None if not (sabnzbd.cfg.marker_file() and sabnzbd.cfg.marker_file() in path): logging.error(T("Failed moving %s to %s"), clip_path(path), clip_path(new_path)) logging.info("Traceback: ", exc_info=True) ok = False return ok, new_path @synchronized(DIR_LOCK) def cleanup_empty_directories(path): """ Remove all empty folders inside (and including) 'path' """ path = os.path.normpath(path) while 1: repeat = False for root, dirs, files in os.walk(path, topdown=False): if not dirs and not files and root != path: try: remove_dir(root) repeat = True except: pass if not repeat: break try: remove_dir(path) except: pass @synchronized(DIR_LOCK) def get_filepath(path, nzo, filename): """ Create unique filepath """ # This procedure is only used by the Assembler thread # It does no umask setting # It uses the dir_lock for the (rare) case that the # download_dir is equal to the complete_dir. new_dirname = dirname = nzo.work_name if not nzo.created: for n in range(200): new_dirname = dirname if n: new_dirname += "." + str(n) try: os.mkdir(os.path.join(path, new_dirname)) break except: pass nzo.work_name = new_dirname nzo.created = True filepath = os.path.join(os.path.join(path, new_dirname), filename) filepath, ext = os.path.splitext(filepath) n = 0 while True: if n: fullpath = "%s.%d%s" % (filepath, n, ext) else: fullpath = filepath + ext if os.path.exists(fullpath): n = n + 1 else: break return fullpath @synchronized(DIR_LOCK) def renamer(old, new): """ Rename file/folder with retries for Win32 """ # Sanitize last part of new name path, name = os.path.split(new) new = os.path.join(path, sanitize_filename(name)) # Skip if nothing changes if old == new: return logging.debug('Renaming "%s" to "%s"', old, new) if sabnzbd.WIN32: retries = 15 while retries > 0: try: # First we try 3 times with os.rename if retries > 12: os.rename(old, new) else: # Now we try the back-up method logging.debug("Could not rename, trying move for %s to %s", old, new) shutil.move(old, new) return except WindowsError as err: logging.debug('Error renaming "%s" to "%s" <%s>', old, new, err) if err.errno == 17: # Error 17 - Rename can't move to different disk # Jump to moving with shutil.move retries -= 3 elif err.errno == 32: # Error 32 - Used by another process logging.debug("File busy, retrying rename %s to %s", old, new) retries -= 1 # Wait for the other process to finish time.sleep(2) else: raise raise WindowsError("Failed to rename") else: shutil.move(old, new) def remove_file(path): """ Wrapper function so any file removal is logged """ logging.debug("[%s] Deleting file %s", sabnzbd.misc.caller_name(), path) os.remove(path) @synchronized(DIR_LOCK) def remove_dir(path): """ Remove directory with retries for Win32 """ logging.debug("[%s] Removing dir %s", sabnzbd.misc.caller_name(), path) if sabnzbd.WIN32: retries = 15 while retries > 0: try: os.rmdir(path) return except WindowsError as err: # In use by another process if err.errno == 32: logging.debug("Retry delete %s", path) retries -= 1 else: raise time.sleep(3) raise WindowsError("Failed to remove") else: os.rmdir(path) @synchronized(DIR_LOCK) def remove_all(path, pattern="*", keep_folder=False, recursive=False): """ Remove folder and all its content (optionally recursive) """ if path and os.path.exists(path): # Fast-remove the whole tree if recursive if pattern == "*" and not keep_folder and recursive: logging.debug("Removing dir recursively %s", path) try: shutil.rmtree(path) except: logging.info("Cannot remove folder %s", path, exc_info=True) else: # Get files based on pattern files = globber_full(path, pattern) if pattern == "*" and not sabnzbd.WIN32: files.extend(globber_full(path, ".*")) for f in files: if os.path.isfile(f): try: remove_file(f) except: logging.info("Cannot remove file %s", f, exc_info=True) elif recursive: remove_all(f, pattern, False, True) if not keep_folder: try: remove_dir(path) except: logging.info("Cannot remove folder %s", path, exc_info=True) ############################################################################## # Diskfree ############################################################################## def find_dir(p): """ Return first folder level that exists in this path """ x = "x" while x and not os.path.exists(p): p, x = os.path.split(p) return p if sabnzbd.WIN32: # windows diskfree try: # Careful here, because win32api test hasn't been done yet! import win32api except: pass def diskspace_base(_dir): """ Return amount of free and used diskspace in GBytes """ _dir = find_dir(_dir) try: available, disk_size, total_free = win32api.GetDiskFreeSpaceEx(_dir) return disk_size / GIGI, available / GIGI except: return 0.0, 0.0 else: try: os.statvfs # posix diskfree def diskspace_base(_dir): """ Return amount of free and used diskspace in GBytes """ _dir = find_dir(_dir) try: s = os.statvfs(_dir) if s.f_blocks < 0: disk_size = float(sys.maxsize) * float(s.f_frsize) else: disk_size = float(s.f_blocks) * float(s.f_frsize) if s.f_bavail < 0: available = float(sys.maxsize) * float(s.f_frsize) else: available = float(s.f_bavail) * float(s.f_frsize) return disk_size / GIGI, available / GIGI except: return 0.0, 0.0 except ImportError: def diskspace_base(_dir): return 20.0, 10.0 # Store all results to speed things up __DIRS_CHECKED = [] __DISKS_SAME = None __LAST_DISK_RESULT = {"download_dir": [], "complete_dir": []} __LAST_DISK_CALL = 0 def diskspace(force=False): """ Wrapper to cache results """ global __DIRS_CHECKED, __DISKS_SAME, __LAST_DISK_RESULT, __LAST_DISK_CALL # Reset everything when folders changed dirs_to_check = [sabnzbd.cfg.download_dir.get_path(), sabnzbd.cfg.complete_dir.get_path()] if __DIRS_CHECKED != dirs_to_check: __DIRS_CHECKED = dirs_to_check __DISKS_SAME = None __LAST_DISK_RESULT = {"download_dir": [], "complete_dir": []} __LAST_DISK_CALL = 0 # When forced, ignore any cache to avoid problems in UI if force: __LAST_DISK_CALL = 0 # Check against cache if time.time() > __LAST_DISK_CALL + 10.0: # Same disk? Then copy-paste __LAST_DISK_RESULT["download_dir"] = diskspace_base(sabnzbd.cfg.download_dir.get_path()) __LAST_DISK_RESULT["complete_dir"] = ( __LAST_DISK_RESULT["download_dir"] if __DISKS_SAME else diskspace_base(sabnzbd.cfg.complete_dir.get_path()) ) __LAST_DISK_CALL = time.time() # Do we know if it's same disk? if __DISKS_SAME is None: __DISKS_SAME = __LAST_DISK_RESULT["download_dir"] == __LAST_DISK_RESULT["complete_dir"] return __LAST_DISK_RESULT sabnzbd-develop/sabnzbd/bpsmeter.py0000600000175000017500000004002013642116632015547 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.bpsmeter - bpsmeter """ import time import logging import re import sabnzbd from sabnzbd.constants import BYTES_FILE_NAME, KIBI import sabnzbd.cfg as cfg DAY = float(24 * 60 * 60) WEEK = DAY * 7 def tomorrow(t): """ Return timestamp for tomorrow (midnight) """ now = time.localtime(t) ntime = (now[0], now[1], now[2], 0, 0, 0, now[6], now[7], now[8]) return time.mktime(ntime) + DAY def this_week(t): """ Return timestamp for start of this week (monday) """ while 1: tm = time.localtime(t) if tm.tm_wday == 0: break t -= DAY monday = (tm.tm_year, tm.tm_mon, tm.tm_mday, 0, 0, 0, 0, 0, tm.tm_isdst) return time.mktime(monday) def next_week(t): """ Return timestamp for start of next week (monday) """ return this_week(t) + WEEK def this_month(t): """ Return timestamp for start of next month """ now = time.localtime(t) ntime = (now[0], now[1], 1, 0, 0, 0, 0, 0, now[8]) return time.mktime(ntime) _DAYS = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) def last_month_day(tm): """ Return last day of this month """ year, month = tm[:2] day = _DAYS[month] # This simple formula for leap years is good enough if day == 28 and (year % 4) == 0: day = 29 return day def next_month(t): """ Return timestamp for start of next month """ now = time.localtime(t) month = now.tm_mon + 1 year = now.tm_year if month > 12: month = 1 year += 1 ntime = (year, month, 1, 0, 0, 0, 0, 0, now[8]) return time.mktime(ntime) class BPSMeter: do = None def __init__(self): t = time.time() self.start_time = t self.log_time = t self.speed_log_time = t self.last_update = t self.bps = 0.0 self.bps_list = [] self.bps_list_max = 275 self.day_total = {} self.week_total = {} self.month_total = {} self.grand_total = {} self.timeline_total = {} self.day_label = time.strftime("%Y-%m-%d") self.end_of_day = tomorrow(t) # Time that current day will end self.end_of_week = next_week(t) # Time that current day will end self.end_of_month = next_month(t) # Time that current month will end self.q_day = 1 # Day of quota reset self.q_period = 'm' # Daily/Weekly/Monthly quota = d/w/m self.quota = self.left = 0.0 # Quota and remaining quota self.have_quota = False # Flag for quota active self.q_time = 0 # Next reset time for quota self.q_hour = 0 # Quota reset hour self.q_minute = 0 # Quota reset minute self.quota_enabled = True # Scheduled quota enable/disable BPSMeter.do = self def save(self): """ Save admin to disk """ data = (self.last_update, self.grand_total, self.day_total, self.week_total, self.month_total, self.end_of_day, self.end_of_week, self.end_of_month, self.quota, self.left, self.q_time, self.timeline_total ) sabnzbd.save_admin(data, BYTES_FILE_NAME) def defaults(self): """ Get the latest data from the database and assign to a fake server """ logging.debug('Setting default BPS meter values') history_db = sabnzbd.database.HistoryDB() grand, month, week = history_db.get_history_size() history_db.close() self.grand_total = {} self.month_total = {} self.week_total = {} self.day_total = {} if grand: self.grand_total['x'] = grand if month: self.month_total['x'] = month if week: self.week_total['x'] = week self.quota = self.left = cfg.quota_size.get_float() def read(self): """ Read admin from disk, return True when pause is needed """ res = False quota = self.left = cfg.quota_size.get_float() # Quota for this period self.have_quota = bool(cfg.quota_size()) data = sabnzbd.load_admin(BYTES_FILE_NAME) try: self.last_update, self.grand_total, \ self.day_total, self.week_total, self.month_total, \ self.end_of_day, self.end_of_week, self.end_of_month, \ self.quota, self.left, self.q_time, self.timeline_total = data if abs(quota - self.quota) > 0.5: self.change_quota() res = self.reset_quota() except: self.defaults() # Force update of counters and validate data try: for server in self.grand_total.keys(): self.update(server) except TypeError: self.defaults() self.update() return res def update(self, server=None, amount=0, testtime=None): """ Update counters for "server" with "amount" bytes """ if testtime: t = testtime else: t = time.time() if t > self.end_of_day: # current day passed. get new end of day self.day_label = time.strftime("%Y-%m-%d") self.day_total = {} self.end_of_day = tomorrow(t) - 1.0 if t > self.end_of_week: self.week_total = {} self.end_of_week = next_week(t) - 1.0 if t > self.end_of_month: self.month_total = {} self.end_of_month = next_month(t) - 1.0 if server: if server not in self.day_total: self.day_total[server] = 0 self.day_total[server] += amount if server not in self.week_total: self.week_total[server] = 0 self.week_total[server] += amount if server not in self.month_total: self.month_total[server] = 0 self.month_total[server] += amount if server not in self.grand_total: self.grand_total[server] = 0 self.grand_total[server] += amount if server not in self.timeline_total: self.timeline_total[server] = {} if self.day_label not in self.timeline_total[server]: self.timeline_total[server][self.day_label]= 0 self.timeline_total[server][self.day_label] += amount # Quota check if self.have_quota and self.quota_enabled: self.left -= amount if self.left <= 0.0: if sabnzbd.downloader.Downloader.do and not sabnzbd.downloader.Downloader.do.paused: sabnzbd.downloader.Downloader.do.pause() logging.warning(T('Quota spent, pausing downloading')) # Speedometer try: self.bps = (self.bps * (self.last_update - self.start_time) + amount) / (t - self.start_time) except: self.bps = 0.0 self.last_update = t check_time = t - 5.0 if self.start_time < check_time: self.start_time = check_time if self.bps < 0.01: self.reset() elif self.log_time < check_time: logging.debug("bps: %s", self.bps) self.log_time = t if self.speed_log_time < (t - 1.0): self.add_empty_time() self.bps_list.append(int(self.bps / KIBI)) self.speed_log_time = t def reset(self): t = time.time() self.start_time = t self.log_time = t self.last_update = t self.bps = 0.0 def add_empty_time(self): # Extra zeros, but never more than the maximum! nr_diffs = min(int(time.time() - self.speed_log_time), self.bps_list_max) if nr_diffs > 1: self.bps_list.extend([0] * nr_diffs) # Always trim the list to the max-length if len(self.bps_list) > self.bps_list_max: self.bps_list = self.bps_list[len(self.bps_list) - self.bps_list_max:] def get_sums(self): """ return tuple of grand, month, week, day totals """ return (sum([v for v in self.grand_total.values()]), sum([v for v in self.month_total.values()]), sum([v for v in self.week_total.values()]), sum([v for v in self.day_total.values()])) def amounts(self, server): """ Return grand, month, week, day totals for specified server """ return self.grand_total.get(server, 0), \ self.month_total.get(server, 0), \ self.week_total.get(server, 0), \ self.day_total.get(server, 0), \ self.timeline_total.get(server, {}) def clear_server(self, server): """ Clean counters for specified server """ if server in self.day_total: del self.day_total[server] if server in self.week_total: del self.week_total[server] if server in self.month_total: del self.month_total[server] if server in self.grand_total: del self.grand_total[server] if server in self.timeline_total: del self.timeline_total[server] self.save() def get_bps_list(self): refresh_rate = int(cfg.refresh_rate()) if cfg.refresh_rate() else 1 self.add_empty_time() # We record every second, but display at the user's refresh-rate return self.bps_list[::refresh_rate] def get_stable_speed(self, timespan=10): """ See if there is a stable speed the last seconds None: indicates it can't determine yet False: the speed was not stable during """ if len(self.bps_list) < timespan: return None # Calculate the variance in the speed avg = sum(self.bps_list[-timespan:]) / timespan vari = 0 for bps in self.bps_list[-timespan:]: vari += abs(bps - avg) vari = vari / timespan try: # See if the variance is less than 5% if (vari / (self.bps / KIBI)) < 0.05: return avg else: return False except: # Probably one of the values was 0 pass return None def reset_quota(self, force=False): """ Check if it's time to reset the quota, optionally resuming Return True, when still paused """ if force or (self.have_quota and time.time() > (self.q_time - 50)): self.quota = self.left = cfg.quota_size.get_float() logging.info('Quota was reset to %s', self.quota) if cfg.quota_resume(): logging.info('Auto-resume due to quota reset') if sabnzbd.downloader.Downloader.do: sabnzbd.downloader.Downloader.do.resume() self.next_reset() return False else: return True def next_reset(self, t=None): """ Determine next reset time """ t = t or time.time() tm = time.localtime(t) if self.q_period == 'd': nx = (tm[0], tm[1], tm[2], self.q_hour, self.q_minute, 0, 0, 0, tm[8]) if (tm.tm_hour * 60 + tm.tm_min) >= (self.q_hour * 60 + self.q_minute): # If today's moment has passed, it will happen tomorrow t = time.mktime(nx) + 24 * 3600 tm = time.localtime(t) elif self.q_period == 'w': if self.q_day < tm.tm_wday + 1 or (self.q_day == tm.tm_wday + 1 and (tm.tm_hour * 60 + tm.tm_min) >= (self.q_hour * 60 + self.q_minute)): tm = time.localtime(next_week(t)) dif = abs(self.q_day - tm.tm_wday - 1) t = time.mktime(tm) + dif * 24 * 3600 tm = time.localtime(t) elif self.q_period == 'm': if self.q_day < tm.tm_mday or (self.q_day == tm.tm_mday and (tm.tm_hour * 60 + tm.tm_min) >= (self.q_hour * 60 + self.q_minute)): tm = time.localtime(next_month(t)) day = min(last_month_day(tm), self.q_day) tm = (tm[0], tm[1], day, self.q_hour, self.q_minute, 0, 0, 0, tm[8]) else: return tm = (tm[0], tm[1], tm[2], self.q_hour, self.q_minute, 0, 0, 0, tm[8]) self.q_time = time.mktime(tm) logging.debug('Will reset quota at %s', tm) def change_quota(self, allow_resume=True): """ Update quota, potentially pausing downloader """ if not self.have_quota and self.quota < 0.5: # Never set, use last period's size per = cfg.quota_period() sums = self.get_sums() if per == 'd': self.left = sums[3] elif per == 'w': self.left = sums[2] elif per == 'm': self.left = sums[1] self.have_quota = bool(cfg.quota_size()) if self.have_quota: quota = cfg.quota_size.get_float() if self.quota: # Quota change, recalculate amount left self.left = quota - (self.quota - self.left) else: # If previously no quota, self.left holds this period's usage self.left = quota - self.left self.quota = quota else: self.quota = self.left = 0 self.update(0) self.next_reset() if self.left > 0.5 and allow_resume: self.resume() # Pattern = # The and part can both be optional __re_day = re.compile(r'^\s*(\d+)[^:]*') __re_hm = re.compile(r'(\d+):(\d+)\s*$') def get_quota(self): """ If quota active, return check-function, hour, minute """ if self.have_quota: self.q_period = cfg.quota_period()[0].lower() self.q_day = 1 self.q_hour = self.q_minute = 0 txt = cfg.quota_day().lower() m = self.__re_day.search(txt) if m: self.q_day = int(m.group(1)) m = self.__re_hm.search(txt) if m: self.q_hour = int(m.group(1)) self.q_minute = int(m.group(2)) if self.q_period == 'w': self.q_day = max(1, self.q_day) self.q_day = min(7, self.q_day) elif self.q_period == 'm': self.q_day = max(1, self.q_day) self.q_day = min(31, self.q_day) else: self.q_day = 1 self.change_quota(allow_resume=False) return quota_handler, self.q_hour, self.q_minute else: return None, 0, 0 def set_status(self, status, action=True): """ Disable/enable quota management """ self.quota_enabled = status if action and not status: self.resume() def resume(self): """ Resume downloading """ if cfg.quota_resume() and sabnzbd.downloader.Downloader.do and sabnzbd.downloader.Downloader.do.paused: sabnzbd.downloader.Downloader.do.resume() def midnight(self): """ Midnight action: dummy update for all servers """ for server in self.day_total.keys(): self.update(server) def quota_handler(): """ To be called from scheduler """ logging.debug('Checking quota') BPSMeter.do.reset_quota() def midnight_action(): if BPSMeter.do: BPSMeter.do.midnight() BPSMeter() sabnzbd-develop/sabnzbd/encoding.py0000600000175000017500000000530613642116632015524 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.encoding - Unicode/byte translation functions """ import locale import chardet from xml.sax.saxutils import escape CODEPAGE = locale.getpreferredencoding() def utob(str_in): """ Shorthand for converting UTF-8 to bytes """ if isinstance(str_in, bytes): return str_in return str_in.encode('utf-8') def ubtou(str_in): """ Shorthand for converting unicode bytes to UTF-8 """ if not isinstance(str_in, bytes): return str_in return str_in.decode('utf-8') def platform_btou(str_in): """ Return Unicode, if not already Unicode, decode with locale encoding. NOTE: Used for POpen because universal_newlines/text parameter doesn't always work! We cannot use encoding-parameter because it's Python 3.7+ """ if isinstance(str_in, bytes): try: return ubtou(str_in) except UnicodeDecodeError: return str_in.decode(CODEPAGE, errors='replace').replace('?', '!') else: return str_in def correct_unknown_encoding(str_or_bytes_in): """ Files created on Windows but unpacked/repaired on linux can result in invalid filenames. Try to fix this encoding by going to bytes and then back to unicode again. Last resort we use chardet package """ # If already string, back to bytes if not isinstance(str_or_bytes_in, bytes): str_or_bytes_in = str_or_bytes_in.encode('utf-8', 'surrogateescape') # Try simple bytes-to-string try: return ubtou(str_or_bytes_in) except UnicodeDecodeError: try: # Try using 8-bit ASCII, if came from Windows return str_or_bytes_in.decode('ISO-8859-1') except ValueError: # Last resort we use the slow chardet package return str_or_bytes_in.decode(chardet.detect(str_or_bytes_in)['encoding']) def xml_name(p): """ Prepare name for use in HTML/XML contect """ return escape(str(p)) sabnzbd-develop/sabnzbd/config.py0000600000175000017500000010500213642116632015175 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.config - Configuration Support """ import os import re import logging import threading import shutil import uuid from urllib.parse import urlparse import sabnzbd.misc from sabnzbd.filesystem import clip_path, real_path, create_real_path, renamer, remove_file, is_writable from sabnzbd.constants import CONFIG_VERSION, NORMAL_PRIORITY, DEFAULT_PRIORITY, MAX_WIN_DFOLDER import configobj from sabnzbd.decorators import synchronized CONFIG_LOCK = threading.Lock() SAVE_CONFIG_LOCK = threading.Lock() CFG = {} # Holds INI structure # during re-write this variable is global # to allow direct access to INI structure database = {} # Holds the option dictionary modified = False # Signals a change in option dictionary # Should be reset after saving to settings file paramfinder = re.compile(r"""(?:'.*?')|(?:".*?")|(?:[^'",\s][^,]*)""") class Option: """ Basic option class, basic fields """ def __init__(self, section, keyword, default_val=None, add=True, protect=False): """ Basic option `section` : single section or comma-separated list of sections a list will be a hierarchy: "foo, bar" --> [foo][[bar]] `keyword` : keyword in the (last) section `default_val` : value returned when no value has been set `callback` : procedure to call when value is successfully changed `protect` : Do not allow setting via the API (specifically set_dict) """ self.__sections = section.split(",") self.__keyword = keyword self.__default_val = default_val self.__value = None self.__callback = None self.__protect = protect # Add myself to the config dictionary if add: global database anchor = database for section in self.__sections: if section not in anchor: anchor[section] = {} anchor = anchor[section] anchor[keyword] = self def __call__(self): """ get() replacement """ return self.get() def get(self): """ Retrieve value field """ if self.__value is not None: return self.__value else: return self.__default_val def get_string(self): return str(self.get()) def get_dict(self, safe=False): """ Return value a dictionary """ return {self.__keyword: self.get()} def set_dict(self, input_dict): """ Set value based on dictionary """ if self.__protect: return False try: return self.set(input_dict["value"]) except KeyError: return False def __set(self, value): """ Set new value, no validation """ global modified if value is not None: if isinstance(value, list) or isinstance(value, dict) or value != self.__value: self.__value = value modified = True if self.__callback: self.__callback() return None def set(self, value): return self.__set(value) def default(self): return self.__default_val def callback(self, callback): """ Set callback function """ self.__callback = callback def ident(self): """ Return section-list and keyword """ return self.__sections, self.__keyword class OptionNumber(Option): """ Numeric option class, int/float is determined from default value """ def __init__( self, section, keyword, default_val=0, minval=None, maxval=None, validation=None, add=True, protect=False ): self.__minval = minval self.__maxval = maxval self.__validation = validation self.__int = isinstance(default_val, int) super().__init__(section, keyword, default_val, add=add, protect=protect) def set(self, value): """ set new value, limited by range """ if value is not None: try: if self.__int: value = int(value) else: value = float(value) except ValueError: value = super().default() if self.__validation: error, val = self.__validation(value) super().set(val) else: if self.__maxval is not None and value > self.__maxval: value = self.__maxval elif self.__minval is not None and value < self.__minval: value = self.__minval super().set(value) return None class OptionBool(Option): """ Boolean option class """ def __init__(self, section, keyword, default_val=False, add=True, protect=False): super().__init__(section, keyword, int(default_val), add=add, protect=protect) def set(self, value): if value is None: value = 0 try: super().set(int(value)) except ValueError: super().set(0) return None class OptionDir(Option): """ Directory option class """ def __init__( self, section, keyword, default_val="", apply_umask=False, create=True, validation=None, writable=True, add=True ): self.__validation = validation self.__root = "" # Base directory for relative paths self.__apply_umask = apply_umask self.__create = create self.__writable = writable super().__init__(section, keyword, default_val, add=add) def get(self): """ Return value, corrected for platform """ p = super().get() if sabnzbd.WIN32: return p.replace("/", "\\") if "/" in p else p else: return p.replace("\\", "/") if "\\" in p else p def get_path(self): """ Return full absolute path """ value = self.get() path = "" if value: path = real_path(self.__root, value) if self.__create and not os.path.exists(path): _, path, _ = create_real_path(self.ident()[1], self.__root, value, self.__apply_umask, self.__writable) return path def get_clipped_path(self): """ Return clipped full absolute path """ return clip_path(self.get_path()) def test_path(self): """ Return True if path exists """ value = self.get() if value: return os.path.exists(real_path(self.__root, value)) else: return False def set_root(self, root): """ Set new root, is assumed to be valid """ self.__root = root def set(self, value, create=False): """ Set new dir value, validate and create if needed Return None when directory is accepted Return error-string when not accepted, value will not be changed 'create' means try to create (but don't set permanent create flag) """ error = None if value and (value != self.get() or create): value = value.strip() if self.__validation: error, value = self.__validation(self.__root, value, super().default()) if not error: if value and (self.__create or create): res, path, error = create_real_path( self.ident()[1], self.__root, value, self.__apply_umask, self.__writable ) if not error: super().set(value) return error def set_create(self, value): """ Set auto-creation value """ self.__create = value class OptionList(Option): """ List option class """ def __init__(self, section, keyword, default_val=None, validation=None, add=True, protect=False): self.__validation = validation if default_val is None: default_val = [] super().__init__(section, keyword, default_val, add=add, protect=protect) def set(self, value): """ Set the list given a comma-separated string or a list """ error = None if value is not None: if not isinstance(value, list): if '"' not in value and "," not in value: value = value.split() else: value = paramfinder.findall(value) if self.__validation: error, value = self.__validation(value) if not error: super().set(value) return error def get_string(self): """ Return the list as a comma-separated string """ lst = self.get() if isinstance(lst, str): return lst else: return ", ".join(lst) def default_string(self): """ Return the default list as a comma-separated string """ lst = self.default() if isinstance(lst, str): return lst else: return ", ".join(lst) class OptionStr(Option): """ String class """ def __init__(self, section, keyword, default_val="", validation=None, add=True, strip=True, protect=False): self.__validation = validation self.__strip = strip super().__init__(section, keyword, default_val, add=add, protect=protect) def get_float(self): """ Return value converted to a float, allowing KMGT notation """ return sabnzbd.misc.from_units(self.get()) def get_int(self): """ Return value converted to an int, allowing KMGT notation """ return int(self.get_float()) def set(self, value): """ Set stripped value """ error = None if isinstance(value, str) and self.__strip: value = value.strip() if self.__validation: error, val = self.__validation(value) super().set(val) else: super().set(value) return error class OptionPassword(Option): """ Password class """ def __init__(self, section, keyword, default_val="", add=True): self.get_string = self.get_stars super().__init__(section, keyword, default_val, add=add) def get(self): """ Return decoded password """ return decode_password(super().get(), self.ident()) def get_stars(self): """ Return decoded password as asterisk string """ return "*" * len(self.get()) def get_dict(self, safe=False): """ Return value a dictionary """ if safe: return {self.ident()[1]: self.get_stars()} else: return {self.ident()[1]: self.get()} def set(self, pw): """ Set password, encode it """ if (pw is not None and pw == "") or (pw and pw.strip("*")): super().set(encode_password(pw)) return None @synchronized(CONFIG_LOCK) def add_to_database(section, keyword, obj): """ add object as section/keyword to INI database """ global database if section not in database: database[section] = {} database[section][keyword] = obj @synchronized(CONFIG_LOCK) def delete_from_database(section, keyword): """ Remove section/keyword from INI database """ global database, CFG, modified del database[section][keyword] if section == "servers" and "[" in keyword: keyword = keyword.replace("[", "{").replace("]", "}") try: del CFG[section][keyword] except KeyError: pass modified = True class ConfigServer: """ Class defining a single server """ def __init__(self, name, values): self.__name = name name = "servers," + self.__name 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.username = OptionStr(name, "username", "", add=False) self.password = OptionPassword(name, "password", "", add=False) self.connections = OptionNumber(name, "connections", 1, 0, 100, add=False) self.ssl = OptionBool(name, "ssl", False, add=False) # 0=No, 1=Normal, 2=Strict (hostname verification) self.ssl_verify = OptionNumber(name, "ssl_verify", 2, add=False) self.ssl_ciphers = OptionStr(name, "ssl_ciphers", "", add=False) self.enable = OptionBool(name, "enable", True, add=False) 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.notes = OptionStr(name, "notes", "", add=False) self.set_dict(values) add_to_database("servers", self.__name, self) def set_dict(self, values): """ Set one or more fields, passed as dictionary """ for kw in ( "displayname", "host", "port", "timeout", "username", "password", "connections", "ssl", "ssl_verify", "ssl_ciphers", "send_group", "enable", "optional", "retention", "priority", "notes", ): try: value = values[kw] except KeyError: continue exec("self.%s.set(value)" % kw) if not self.displayname(): self.displayname.set(self.__name) return True def get_dict(self, safe=False): """ Return a dictionary with all attributes """ output_dict = {} output_dict["name"] = self.__name output_dict["displayname"] = self.displayname() output_dict["host"] = self.host() output_dict["port"] = self.port() output_dict["timeout"] = self.timeout() output_dict["username"] = self.username() if safe: output_dict["password"] = self.password.get_stars() else: output_dict["password"] = self.password() output_dict["connections"] = self.connections() output_dict["ssl"] = self.ssl() output_dict["ssl_verify"] = self.ssl_verify() output_dict["ssl_ciphers"] = self.ssl_ciphers() output_dict["enable"] = self.enable() output_dict["optional"] = self.optional() output_dict["retention"] = self.retention() output_dict["send_group"] = self.send_group() output_dict["priority"] = self.priority() output_dict["notes"] = self.notes() return output_dict def delete(self): """ Remove from database """ delete_from_database("servers", self.__name) def rename(self, name): """ Give server new display name """ self.displayname.set(name) def ident(self): return "servers", self.__name class ConfigCat: """ Class defining a single category """ def __init__(self, name, values): self.__name = name name = "categories," + name self.order = OptionNumber(name, "order", 0, 0, 100, add=False) self.pp = OptionStr(name, "pp", "", add=False) self.script = OptionStr(name, "script", "Default", add=False) self.dir = OptionDir(name, "dir", add=False, create=False) self.newzbin = OptionList(name, "newzbin", add=False, validation=validate_single_tag) self.priority = OptionNumber(name, "priority", DEFAULT_PRIORITY, add=False) self.set_dict(values) add_to_database("categories", self.__name, self) def set_dict(self, values): """ Set one or more fields, passed as dictionary """ for kw in ("order", "pp", "script", "dir", "newzbin", "priority"): try: value = values[kw] except KeyError: continue exec("self.%s.set(value)" % kw) return True def get_dict(self, safe=False): """ Return a dictionary with all attributes """ output_dict = {} output_dict["name"] = self.__name output_dict["order"] = self.order() output_dict["pp"] = self.pp() output_dict["script"] = self.script() output_dict["dir"] = self.dir() output_dict["newzbin"] = self.newzbin.get_string() output_dict["priority"] = self.priority() return output_dict def delete(self): """ Remove from database """ delete_from_database("categories", self.__name) class OptionFilters(Option): """ Filter list class """ def __init__(self, section, keyword, add=True): super().__init__(section, keyword, add=add) self.set([]) def move(self, current, new): """ Move filter from position 'current' to 'new' """ lst = self.get() try: item = lst.pop(current) lst.insert(new, item) except IndexError: return self.set(lst) def update(self, pos, value): """ Update filter 'pos' definition, value is a list Append if 'pos' outside list """ lst = self.get() try: lst[pos] = value except IndexError: lst.append(value) self.set(lst) def delete(self, pos): """ Remove filter 'pos' """ lst = self.get() try: lst.pop(pos) except IndexError: return self.set(lst) def get_dict(self, safe=False): """ Return filter list as a dictionary with keys 'filter[0-9]+' """ output_dict = {} n = 0 for filter_name in self.get(): output_dict["filter" + str(n)] = filter_name n = n + 1 return output_dict def set_dict(self, values): """ Create filter list from dictionary with keys 'filter[0-9]+' """ filters = [] for n in range(len(values)): kw = "filter%d" % n val = values.get(kw) if val is not None: val = values[kw] if isinstance(val, list): filters.append(val) else: filters.append(paramfinder.findall(val)) while len(filters[-1]) < 7: filters[-1].append("1") if not filters[-1][6]: filters[-1][6] = "1" if filters: self.set(filters) return True class ConfigRSS: """ Class defining a single Feed definition """ def __init__(self, name, values): self.__name = name name = "rss," + name self.uri = OptionList(name, "uri", add=False) self.cat = OptionStr(name, "cat", add=False) self.pp = OptionStr(name, "pp", "", add=False) self.script = OptionStr(name, "script", add=False) self.enable = OptionBool(name, "enable", add=False) self.priority = OptionNumber(name, "priority", DEFAULT_PRIORITY, DEFAULT_PRIORITY, 2, add=False) self.filters = OptionFilters(name, "filters", add=False) self.filters.set([["", "", "", "A", "*", DEFAULT_PRIORITY, "1"]]) self.set_dict(values) add_to_database("rss", self.__name, self) def set_dict(self, values): """ Set one or more fields, passed as dictionary """ for kw in ("uri", "cat", "pp", "script", "priority", "enable"): try: value = values[kw] except KeyError: continue exec("self.%s.set(value)" % kw) self.filters.set_dict(values) return True def get_dict(self, safe=False): """ Return a dictionary with all attributes """ output_dict = {} output_dict["name"] = self.__name output_dict["uri"] = self.uri() output_dict["cat"] = self.cat() output_dict["pp"] = self.pp() output_dict["script"] = self.script() output_dict["enable"] = self.enable() output_dict["priority"] = self.priority() filters = self.filters.get_dict() for kw in filters: output_dict[kw] = filters[kw] return output_dict def delete(self): """ Remove from database """ delete_from_database("rss", self.__name) def ident(self): return "rss", self.__name def get_dconfig(section, keyword, nested=False): """ Return a config values dictionary, Single item or slices based on 'section', 'keyword' """ data = {} if not section: for section in database.keys(): res, conf = get_dconfig(section, None, True) data.update(conf) elif not keyword: try: sect = database[section] except KeyError: return False, {} if section in ("servers", "categories", "rss"): data[section] = [] for keyword in sect.keys(): res, conf = get_dconfig(section, keyword, True) data[section].append(conf) else: data[section] = {} for keyword in sect.keys(): res, conf = get_dconfig(section, keyword, True) data[section].update(conf) else: try: item = database[section][keyword] except KeyError: return False, {} data = item.get_dict(safe=True) if not nested: if section in ("servers", "categories", "rss"): data = {section: [data]} else: data = {section: data} return True, data def get_config(section, keyword): """ Return a config object, based on 'section', 'keyword' """ try: return database[section][keyword] except KeyError: logging.debug("Missing configuration item %s,%s", section, keyword) return None def set_config(kwargs): """ Set a config item, using values in dictionary """ try: item = database[kwargs.get("section")][kwargs.get("keyword")] except KeyError: return False item.set_dict(kwargs) return True def delete(section, keyword): """ Delete specific config item """ try: database[section][keyword].delete() except KeyError: return ############################################################################## # INI file support # # This does input and output of configuration to an INI file. # It translates this data structure to the config database. ############################################################################## @synchronized(SAVE_CONFIG_LOCK) def read_config(path): """ Read the complete INI file and check its version number if OK, pass values to config-database """ return _read_config(path) def _read_config(path, try_backup=False): """ Read the complete INI file and check its version number if OK, pass values to config-database """ global CFG, database, modified if try_backup or not os.path.exists(path): # Not found, try backup try: shutil.copyfile(path + ".bak", path) try_backup = True except IOError: pass if not os.path.exists(path): # No file found, create default INI file try: if not sabnzbd.WIN32: prev = os.umask(0o77) fp = open(path, "w") fp.write("__version__=%s\n[misc]\n[logging]\n" % CONFIG_VERSION) fp.close() if not sabnzbd.WIN32: os.umask(prev) except IOError: return False, "Cannot create INI file %s" % path try: # Let configobj open the file CFG = configobj.ConfigObj(infile=path, default_encoding="utf-8", encoding="utf-8") except (IOError, configobj.ConfigObjError, UnicodeEncodeError) as strerror: if try_backup: # No luck! return False, '"%s" is not a valid configuration file
Error message: %s' % (path, strerror) else: # Try backup file return _read_config(path, True) try: version = sabnzbd.misc.int_conv(CFG["__version__"]) if version > int(CONFIG_VERSION): return False, "Incorrect version number %s in %s" % (version, path) except (KeyError, ValueError): pass CFG.filename = path CFG.encoding = "utf-8" CFG["__encoding__"] = "utf-8" CFG["__version__"] = str(CONFIG_VERSION) # Use CFG data to set values for all static options for section in database: if section not in ("servers", "categories", "rss"): for option in database[section]: sec, kw = database[section][option].ident() sec = sec[-1] try: database[section][option].set(CFG[sec][kw]) except KeyError: pass define_categories() define_rss() define_servers() modified = False return True, "" @synchronized(SAVE_CONFIG_LOCK) def save_config(force=False): """ Update Setup file with current option values """ global CFG, database, modified if not (modified or force): return True for section in database: if section in ("servers", "categories", "rss"): try: CFG[section] except KeyError: CFG[section] = {} for subsec in database[section]: if section == "servers": subsec_mod = subsec.replace("[", "{").replace("]", "}") else: subsec_mod = subsec try: CFG[section][subsec_mod] except KeyError: CFG[section][subsec_mod] = {} items = database[section][subsec].get_dict() CFG[section][subsec_mod] = items else: for option in database[section]: sec, kw = database[section][option].ident() sec = sec[-1] try: CFG[sec] except KeyError: CFG[sec] = {} value = database[section][option]() # bool is a subclass of int, check first if isinstance(value, bool): # convert bool to int when saving so we store 0 or 1 CFG[sec][kw] = str(int(value)) elif isinstance(value, int): CFG[sec][kw] = str(value) else: CFG[sec][kw] = value res = False filename = CFG.filename bakname = filename + ".bak" # Check if file is writable if not is_writable(filename): logging.error(T("Cannot write to INI file %s"), filename) return res # copy current file to backup try: shutil.copyfile(filename, bakname) shutil.copymode(filename, bakname) except: # Something wrong with the backup, logging.error(T("Cannot create backup file for %s"), bakname) logging.info("Traceback: ", exc_info=True) return res # Write new config file try: logging.info("Writing settings to INI file %s", filename) CFG.write() shutil.copymode(bakname, filename) modified = False res = True except: logging.error(T("Cannot write to INI file %s"), filename) logging.info("Traceback: ", exc_info=True) try: remove_file(filename) except: pass # Restore INI file from backup renamer(bakname, filename) return res def define_servers(): """ Define servers listed in the Setup file return a list of ConfigServer instances """ global CFG try: for server in CFG["servers"]: svr = CFG["servers"][server] s = ConfigServer(server.replace("{", "[").replace("}", "]"), svr) # Conversion of global SSL-Ciphers to server ones if sabnzbd.cfg.ssl_ciphers(): s.ssl_ciphers.set(sabnzbd.cfg.ssl_ciphers()) except KeyError: pass # No longer needed sabnzbd.cfg.ssl_ciphers.set("") def get_servers(): global database try: return database["servers"] except KeyError: return {} def define_categories(): """ Define categories listed in the Setup file return a list of ConfigCat instances """ global CFG, categories try: for cat in CFG["categories"]: ConfigCat(cat, CFG["categories"][cat]) except KeyError: pass def get_categories(cat=0): """ Return link to categories section. This section will always contain special category '*' When 'cat' is given, a link to that category or to '*' is returned """ global database if "categories" not in database: database["categories"] = {} cats = database["categories"] # Add Default categories if "*" not in cats: ConfigCat("*", {"pp": "3", "script": "None", "priority": NORMAL_PRIORITY}) # Add some category suggestions ConfigCat("movies", {}) ConfigCat("tv", {}) ConfigCat("audio", {}) ConfigCat("software", {}) # Save config for future use save_config(True) if not isinstance(cat, int): try: cats = cats[cat] except KeyError: cats = cats["*"] return cats def get_ordered_categories(): """ Return list-copy of categories section that's ordered by user's ordering including Default-category """ database_cats = get_categories() # Transform to list and sort categories = [] for cat in database_cats.keys(): if cat != "*": categories.append(database_cats[cat].get_dict()) # Sort and add default * category categories.sort(key=lambda cat: cat["order"]) categories.insert(0, database_cats["*"].get_dict()) return categories def define_rss(): """ Define rss-feeds listed in the Setup file return a list of ConfigRSS instances """ global CFG try: for r in CFG["rss"]: ConfigRSS(r, CFG["rss"][r]) except KeyError: pass def get_rss(): global database try: # We have to remove non-seperator commas by detecting if they are valid URL's for feed_key in database["rss"]: feed = database["rss"][feed_key] # Only modify if we have to, to prevent repeated config-saving have_new_uri = False # Create a new corrected list new_feed_uris = [] for feed_uri in feed.uri(): if new_feed_uris and not urlparse(feed_uri).scheme and urlparse(new_feed_uris[-1]).scheme: # Current one has no scheme but previous one does, append to previous new_feed_uris[-1] += "," + feed_uri have_new_uri = True continue # Add full working URL new_feed_uris.append(feed_uri) # Set new list if have_new_uri: feed.uri.set(new_feed_uris) return database["rss"] except KeyError: return {} def get_filename(): global CFG return CFG.filename ############################################################################## # Default Validation handlers ############################################################################## __PW_PREFIX = "!!!encoded!!!" def encode_password(pw): """ Encode password in hexadecimal if needed """ enc = False if pw: encPW = __PW_PREFIX for c in pw: cnum = ord(c) if c == "#" or cnum < 33 or cnum > 126: enc = True encPW += "%2x" % cnum if enc: return encPW return pw def decode_password(pw, name): """ Decode hexadecimal encoded password but only decode when prefixed """ decPW = "" if pw and pw.startswith(__PW_PREFIX): for n in range(len(__PW_PREFIX), len(pw), 2): try: ch = chr(int(pw[n] + pw[n + 1], 16)) except ValueError: logging.error(T("Incorrectly encoded password %s"), name) return "" decPW += ch return decPW else: return pw def no_nonsense(value): """ Strip and Filter out None and 'None' from strings """ value = str(value).strip() if value.lower() == "none": value = "" return None, value def all_lowercase(value): """ Lowercase everything! """ if isinstance(value, list): # If list, for each item return None, [item.lower() for item in value] return None, value.lower() def validate_octal(value): """ Check if string is valid octal number """ if not value: return None, value try: int(value, 8) return None, value except: return T("%s is not a correct octal value") % value, None def validate_no_unc(root, value, default): """ Check if path isn't a UNC path """ # Only need to check the 'value' part if value and not value.startswith(r"\\"): return validate_notempty(root, value, default) else: return T('UNC path "%s" not allowed here') % value, None def validate_safedir(root, value, default): """ Allow only when queues are empty and no UNC On Windows path should be small """ if sabnzbd.WIN32 and value and len(real_path(root, value)) >= MAX_WIN_DFOLDER: return T("Error: Path length should be below %s.") % MAX_WIN_DFOLDER, None if sabnzbd.empty_queues(): return validate_no_unc(root, value, default) else: return T("Error: Queue not empty, cannot change folder."), None def validate_notempty(root, value, default): """ If value is empty, return default """ if value: return None, value else: return None, default def validate_single_tag(value): """ Don't split single indexer tags like "TV > HD" into ['TV', '>', 'HD'] """ if len(value) == 3: if value[1] == ">": return None, " ".join(value) return None, value def create_api_key(): """ Return a new randomized API_KEY """ return uuid.uuid4().hex sabnzbd-develop/sabnzbd/api.py0000600000175000017500000017710013642116632014511 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.api - api """ import os import logging import re import datetime import time import json import cherrypy import locale from threading import Thread try: import win32api import win32file except ImportError: pass import sabnzbd from sabnzbd.constants import VALID_ARCHIVES, VALID_NZB_FILES, Status, \ TOP_PRIORITY, REPAIR_PRIORITY, HIGH_PRIORITY, NORMAL_PRIORITY, LOW_PRIORITY, \ KIBI, MEBI, GIGI, JOB_ADMIN import sabnzbd.config as config import sabnzbd.cfg as cfg from sabnzbd.downloader import Downloader from sabnzbd.nzbqueue import NzbQueue import sabnzbd.scheduler as scheduler from sabnzbd.skintext import SKIN_TEXT from sabnzbd.utils.pathbrowser import folders_at_path from sabnzbd.utils.getperformance import getcpu from sabnzbd.misc import loadavg, to_units, int_conv, time_format, \ cat_convert, create_https_certificates, calc_age from sabnzbd.filesystem import diskspace, get_ext, get_filename, globber, \ globber_full, clip_path, remove_all from sabnzbd.filesystem import same_file from sabnzbd.encoding import xml_name from sabnzbd.postproc import PostProcessor from sabnzbd.articlecache import ArticleCache from sabnzbd.utils.servertests import test_nntp_server_dict from sabnzbd.bpsmeter import BPSMeter from sabnzbd.rating import Rating from sabnzbd.getipaddress import localipv4, publicipv4, ipv6, addresslookup from sabnzbd.newsunpack import userxbit from sabnzbd.database import build_history_info, unpack_history_info, HistoryDB import sabnzbd.notifier import sabnzbd.rss import sabnzbd.emailer ############################################################################## # API error messages ############################################################################## _MSG_NO_VALUE = 'expect one parameter' _MSG_NO_VALUE2 = 'expect two parameters' _MSG_INT_VALUE = 'expect integer value' _MSG_NO_ITEM = 'item does not exist' _MSG_NOT_IMPLEMENTED = 'not implemented' _MSG_NO_FILE = 'no file given' _MSG_NO_PATH = 'file does not exist' _MSG_OUTPUT_FORMAT = 'Format not supported' _MSG_NO_SUCH_CONFIG = 'Config item does not exist' _MSG_BAD_SERVER_PARMS = 'Incorrect server settings' # For Windows: determine executable extensions if os.name == 'nt': PATHEXT = os.environ.get('PATHEXT', '').lower().split(';') else: PATHEXT = [] def api_handler(kwargs): """ API Dispatcher """ mode = kwargs.get('mode', '') output = kwargs.get('output') name = kwargs.get('name', '') if isinstance(mode, list): mode = mode[0] if isinstance(output, list): output = output[0] response = _api_table.get(mode, (_api_undefined, 2))[0](name, output, kwargs) return response def _api_get_config(name, output, kwargs): """ API: accepts output, keyword, section """ _, data = config.get_dconfig(kwargs.get('section'), kwargs.get('keyword')) return report(output, keyword='config', data=data) def _api_set_config(name, output, kwargs): """ API: accepts output, keyword, section """ if kwargs.get('section') == 'servers': kwargs['keyword'] = handle_server_api(output, kwargs) elif kwargs.get('section') == 'rss': kwargs['keyword'] = handle_rss_api(output, kwargs) elif kwargs.get('section') == 'categories': kwargs['keyword'] = handle_cat_api(output, kwargs) else: res = config.set_config(kwargs) if not res: return report(output, _MSG_NO_SUCH_CONFIG) config.save_config() res, data = config.get_dconfig(kwargs.get('section'), kwargs.get('keyword')) return report(output, keyword='config', data=data) def _api_set_config_default(name, output, kwargs): """ API: Reset requested config variables back to defaults. Currently only for misc-section """ keywords = kwargs.get('keyword', []) if not isinstance(keywords, list): keywords = [keywords] for keyword in keywords: item = config.get_config('misc', keyword) if item: item.set(item.default()) config.save_config() return report(output) def _api_del_config(name, output, kwargs): """ API: accepts output, keyword, section """ if del_from_section(kwargs): return report(output) else: return report(output, _MSG_NOT_IMPLEMENTED) def _api_qstatus(name, output, kwargs): """ API: accepts output """ info, pnfo_list, bytespersec = build_queue() return report(output, data=info) def _api_queue(name, output, kwargs): """ API: Dispatcher for mode=queue """ value = kwargs.get('value', '') return _api_queue_table.get(name, (_api_queue_default, 2))[0](output, value, kwargs) def _api_queue_delete(output, value, kwargs): """ API: accepts output, value """ if value.lower() == 'all': removed = NzbQueue.do.remove_all(kwargs.get('search')) return report(output, keyword='', data={'status': bool(removed), 'nzo_ids': removed}) elif value: items = value.split(',') delete_all_data = int_conv(kwargs.get('del_files')) removed = NzbQueue.do.remove_multiple(items, delete_all_data=delete_all_data) return report(output, keyword='', data={'status': bool(removed), 'nzo_ids': removed}) else: return report(output, _MSG_NO_VALUE) def _api_queue_delete_nzf(output, value, kwargs): """ API: accepts value(=nzo_id), value2(=nzf_id) """ value2 = kwargs.get('value2') if value and value2: removed = NzbQueue.do.remove_nzf(value, value2, force_delete=True) return report(output, keyword='', data={'status': bool(removed), 'nzf_ids': removed}) else: return report(output, _MSG_NO_VALUE2) def _api_queue_rename(output, value, kwargs): """ API: accepts output, value(=old name), value2(=new name), value3(=password) """ value2 = kwargs.get('value2') value3 = kwargs.get('value3') if value and value2: ret = NzbQueue.do.change_name(value, value2, value3) return report(output, keyword='', data={'status': ret}) else: return report(output, _MSG_NO_VALUE2) def _api_queue_change_complete_action(output, value, kwargs): """ API: accepts output, value(=action) """ sabnzbd.change_queue_complete_action(value) return report(output) def _api_queue_purge(output, value, kwargs): """ API: accepts output """ removed = NzbQueue.do.remove_all(kwargs.get('search')) return report(output, keyword='', data={'status': bool(removed), 'nzo_ids': removed}) def _api_queue_pause(output, value, kwargs): """ API: accepts output, value(=list of nzo_id) """ if value: items = value.split(',') handled = NzbQueue.do.pause_multiple_nzo(items) else: handled = False return report(output, keyword='', data={'status': bool(handled), 'nzo_ids': handled}) def _api_queue_resume(output, value, kwargs): """ API: accepts output, value(=list of nzo_id) """ if value: items = value.split(',') handled = NzbQueue.do.resume_multiple_nzo(items) else: handled = False return report(output, keyword='', data={'status': bool(handled), 'nzo_ids': handled}) def _api_queue_priority(output, value, kwargs): """ API: accepts output, value(=nzo_id), value2(=priority) """ value2 = kwargs.get('value2') if value and value2: try: try: priority = int(value2) except: return report(output, _MSG_INT_VALUE) pos = NzbQueue.do.set_priority(value, priority) # Returns the position in the queue, -1 is incorrect job-id return report(output, keyword='position', data=pos) except: return report(output, _MSG_NO_VALUE2) else: return report(output, _MSG_NO_VALUE2) def _api_queue_sort(output, value, kwargs): """ API: accepts output, sort, dir """ sort = kwargs.get('sort') direction = kwargs.get('dir', '') if sort: NzbQueue.do.sort_queue(sort, direction) return report(output) else: return report(output, _MSG_NO_VALUE2) def _api_queue_default(output, value, kwargs): """ API: accepts output, sort, dir, start, limit """ start = int_conv(kwargs.get('start')) limit = int_conv(kwargs.get('limit')) search = kwargs.get('search') info, pnfo_list, bytespersec = build_queue(start=start, limit=limit, output=output, search=search) return report(output, keyword='queue', data=info) def _api_queue_rating(output, value, kwargs): """ API: accepts output, value(=nzo_id), type, setting, detail """ vote_map = {'up': Rating.VOTE_UP, 'down': Rating.VOTE_DOWN} flag_map = {'spam': Rating.FLAG_SPAM, 'encrypted': Rating.FLAG_ENCRYPTED, 'expired': Rating.FLAG_EXPIRED, 'other': Rating.FLAG_OTHER, 'comment': Rating.FLAG_COMMENT} content_type = kwargs.get('type') setting = kwargs.get('setting') if value: try: video = audio = vote = flag = None if content_type == 'video' and setting != "-": video = setting if content_type == 'audio' and setting != "-": audio = setting if content_type == 'vote': vote = vote_map[setting] if content_type == 'flag': flag = flag_map[setting] if cfg.rating_enable(): Rating.do.update_user_rating(value, video, audio, vote, flag, kwargs.get('detail')) return report(output) except: return report(output, _MSG_BAD_SERVER_PARMS) else: return report(output, _MSG_NO_VALUE) def _api_options(name, output, kwargs): """ API: accepts output """ return options_list(output) def _api_translate(name, output, kwargs): """ API: accepts output, value(=acronym) """ return report(output, keyword='value', data=T(kwargs.get('value', ''))) def _api_addfile(name, output, kwargs): """ API: accepts name, output, pp, script, cat, priority, nzbname """ # Normal upload will send the nzb in a kw arg called nzbfile if name is None or isinstance(name, str): name = kwargs.get('nzbfile') if hasattr(name, 'getvalue'): # Side effect of next line is that attribute .value is created # which is needed to make add_nzbfile() work size = name.length elif hasattr(name, 'file') and hasattr(name, 'filename') and name.filename: # CherryPy 3.2.2 object if hasattr(name.file, 'file'): name.value = name.file.file.read() else: name.value = name.file.read() size = len(name.value) elif hasattr(name, 'value'): size = len(name.value) else: size = 0 if name is not None and size and name.filename: cat = kwargs.get('cat') xcat = kwargs.get('xcat') if not cat and xcat: # Indexer category, so do mapping cat = cat_convert(xcat) res = sabnzbd.add_nzbfile(name, kwargs.get('pp'), kwargs.get('script'), cat, kwargs.get('priority'), kwargs.get('nzbname')) return report(output, keyword='', data={'status': res[0] == 0, 'nzo_ids': res[1]}, compat=True) else: return report(output, _MSG_NO_VALUE) def _api_retry(name, output, kwargs): """ API: accepts name, output, value(=nzo_id), nzbfile(=optional NZB), password (optional) """ value = kwargs.get('value') # Normal upload will send the nzb in a kw arg called nzbfile if name is None or isinstance(name, str): name = kwargs.get('nzbfile') password = kwargs.get('password') password = password[0] if isinstance(password, list) else password nzo_id = retry_job(value, name, password) if nzo_id: if isinstance(nzo_id, list): nzo_id = nzo_id[0] return report(output, keyword='', data={'status': True, 'nzo_id': nzo_id}) else: return report(output, _MSG_NO_ITEM) def _api_cancel_pp(name, output, kwargs): """ API: accepts name, output, value(=nzo_id) """ nzo_id = kwargs.get('value') if PostProcessor.do.cancel_pp(nzo_id): return report(output, keyword='', data={'status': True, 'nzo_id': nzo_id}) else: return report(output, _MSG_NO_ITEM) def _api_addlocalfile(name, output, kwargs): """ API: accepts name, output, pp, script, cat, priority, nzbname """ if name and isinstance(name, list): name = name[0] if name: if os.path.exists(name): fn = get_filename(name) if fn: pp = kwargs.get('pp') script = kwargs.get('script') cat = kwargs.get('cat') xcat = kwargs.get('xcat') if not cat and xcat: # Indexer category, so do mapping cat = cat_convert(xcat) priority = kwargs.get('priority') nzbname = kwargs.get('nzbname') if get_ext(name) in VALID_ARCHIVES: res = sabnzbd.dirscanner.process_nzb_archive_file( fn, name, pp=pp, script=script, cat=cat, priority=priority, keep=True, nzbname=nzbname) elif get_ext(name) in VALID_NZB_FILES: res = sabnzbd.dirscanner.process_single_nzb( fn, name, pp=pp, script=script, cat=cat, priority=priority, keep=True, nzbname=nzbname) else: logging.info('API-call addlocalfile: "%s" not a proper file name', name) return report(output, _MSG_NO_FILE) else: logging.info('API-call addlocalfile: file "%s" not found', name) return report(output, _MSG_NO_PATH) return report(output, keyword='', data={'status': res[0] == 0, 'nzo_ids': res[1]}, compat=True) else: logging.info('API-call addlocalfile: no file name given') return report(output, _MSG_NO_VALUE) def _api_switch(name, output, kwargs): """ API: accepts output, value(=first id), value2(=second id) """ value = kwargs.get('value') value2 = kwargs.get('value2') if value and value2: pos, prio = NzbQueue.do.switch(value, value2) # Returns the new position and new priority (if different) return report(output, keyword='result', data={'position': pos, 'priority': prio}) else: return report(output, _MSG_NO_VALUE2) def _api_change_cat(name, output, kwargs): """ API: accepts output, value(=nzo_id), value2(=category) """ value = kwargs.get('value') value2 = kwargs.get('value2') if value and value2: nzo_id = value cat = value2 if cat == 'None': cat = None result = NzbQueue.do.change_cat(nzo_id, cat) return report(output, keyword='status', data=bool(result > 0)) else: return report(output, _MSG_NO_VALUE) def _api_change_script(name, output, kwargs): """ API: accepts output, value(=nzo_id), value2(=script) """ value = kwargs.get('value') value2 = kwargs.get('value2') if value and value2: nzo_id = value script = value2 if script.lower() == 'none': script = None result = NzbQueue.do.change_script(nzo_id, script) return report(output, keyword='status', data=bool(result > 0)) else: return report(output, _MSG_NO_VALUE) def _api_change_opts(name, output, kwargs): """ API: accepts output, value(=nzo_id), value2(=pp) """ value = kwargs.get('value') value2 = kwargs.get('value2') result = 0 if value and value2 and value2.isdigit(): result = NzbQueue.do.change_opts(value, int(value2)) return report(output, keyword='status', data=bool(result > 0)) def _api_fullstatus(name, output, kwargs): """ API: full history status""" status = build_status(skip_dashboard=kwargs.get('skip_dashboard', 1), output=output) return report(output, keyword='status', data=status) def _api_history(name, output, kwargs): """ API: accepts output, value(=nzo_id), start, limit, search """ value = kwargs.get('value', '') start = int_conv(kwargs.get('start')) limit = int_conv(kwargs.get('limit')) last_history_update = int_conv(kwargs.get('last_history_update', 0)) search = kwargs.get('search') failed_only = kwargs.get('failed_only') categories = kwargs.get('category') # Do we need to send anything? if last_history_update == sabnzbd.LAST_HISTORY_UPDATE: return report(output, keyword='history', data=False) if categories and not isinstance(categories, list): categories = [categories] if not limit: limit = cfg.history_limit() if name == 'delete': special = value.lower() del_files = bool(int_conv(kwargs.get('del_files'))) if special in ('all', 'failed', 'completed'): history_db = sabnzbd.get_db_connection() if special in ('all', 'failed'): if del_files: del_job_files(history_db.get_failed_paths(search)) history_db.remove_failed(search) if special in ('all', 'completed'): history_db.remove_completed(search) sabnzbd.history_updated() return report(output) elif value: jobs = value.split(',') for job in jobs: del_hist_job(job, del_files) sabnzbd.history_updated() return report(output) else: return report(output, _MSG_NO_VALUE) elif not name: history = {} grand, month, week, day = BPSMeter.do.get_sums() history['total_size'], history['month_size'], history['week_size'], history['day_size'] = \ to_units(grand), to_units(month), to_units(week), to_units(day) history['slots'], fetched_items, history['noofslots'] = build_history(start=start, limit=limit, search=search, failed_only=failed_only, categories=categories, output=output) history['last_history_update'] = sabnzbd.LAST_HISTORY_UPDATE history['version'] = sabnzbd.__version__ return report(output, keyword='history', data=history) else: return report(output, _MSG_NOT_IMPLEMENTED) def _api_get_files(name, output, kwargs): """ API: accepts output, value(=nzo_id) """ value = kwargs.get('value') if value: return report(output, keyword='files', data=build_file_list(value)) else: return report(output, _MSG_NO_VALUE) def _api_addurl(names, output, kwargs): """ API: accepts name, output, pp, script, cat, priority, nzbname """ pp = kwargs.get('pp') script = kwargs.get('script') cat = kwargs.get('cat') priority = kwargs.get('priority') nzbnames = kwargs.get('nzbname') if not isinstance(names, list): names = [names] if not isinstance(nzbnames, list): nzbnames = [nzbnames] nzo_ids = [] for n in range(len(names)): name = names[n] if n < len(nzbnames): nzbname = nzbnames[n] else: nzbname = '' if name: name = name.strip() if name: nzo_ids.append(sabnzbd.add_url(name, pp, script, cat, priority, nzbname)) if len(names) > 0: return report(output, keyword='', data={'status': True, 'nzo_ids': nzo_ids}, compat=True) else: logging.info('API-call addurl: no files retrieved from %s', names) return report(output, _MSG_NO_VALUE) def _api_pause(name, output, kwargs): """ API: accepts output """ scheduler.plan_resume(0) Downloader.do.pause() return report(output) def _api_resume(name, output, kwargs): """ API: accepts output """ scheduler.plan_resume(0) sabnzbd.unpause_all() return report(output) def _api_shutdown(name, output, kwargs): """ API: accepts output """ sabnzbd.shutdown_program() return report(output) def _api_warnings(name, output, kwargs): """ API: accepts name, output """ if name == 'clear': return report(output, keyword="warnings", data=sabnzbd.GUIHANDLER.clear()) elif name == 'show': return report(output, keyword="warnings", data=sabnzbd.GUIHANDLER.content()) elif name: return report(output, _MSG_NOT_IMPLEMENTED) return report(output, keyword="warnings", data=sabnzbd.GUIHANDLER.content()) def _api_get_cats(name, output, kwargs): """ API: accepts output """ return report(output, keyword="categories", data=list_cats(False)) def _api_get_scripts(name, output, kwargs): """ API: accepts output """ return report(output, keyword="scripts", data=list_scripts()) def _api_version(name, output, kwargs): """ API: accepts output """ return report(output, keyword='version', data=sabnzbd.__version__) def _api_auth(name, output, kwargs): """ API: accepts output """ auth = 'None' if not cfg.disable_key(): auth = 'badkey' key = kwargs.get('key', '') if not key: auth = 'apikey' else: if key == cfg.nzb_key(): auth = 'nzbkey' if key == cfg.api_key(): auth = 'apikey' elif cfg.username() and cfg.password(): auth = 'login' return report(output, keyword='auth', data=auth) def _api_restart(name, output, kwargs): """ API: accepts output """ logging.info('Restart requested by API') # Do the shutdown async to still send goodbye to browser Thread(target=sabnzbd.trigger_restart, kwargs={'timeout': 1}).start() return report(output) def _api_restart_repair(name, output, kwargs): """ API: accepts output """ logging.info('Queue repair requested by API') sabnzbd.request_repair() sabnzbd.trigger_restart() return report(output) def _api_disconnect(name, output, kwargs): """ API: accepts output """ Downloader.do.disconnect() return report(output) def _api_osx_icon(name, output, kwargs): """ API: accepts output, value """ value = kwargs.get('value', '1').strip() cfg.osx_menu.set(value != '0') return report(output) def _api_rescan(name, output, kwargs): """ API: accepts output """ NzbQueue.do.scan_jobs(all=False, action=True) return report(output) def _api_eval_sort(name, output, kwargs): """ API: evaluate sorting expression """ 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) if path is None: return report(output, _MSG_NOT_IMPLEMENTED) else: return report(output, keyword='result', data=path) def _api_watched_now(name, output, kwargs): """ API: accepts output """ sabnzbd.dirscanner.dirscan() return report(output) def _api_resume_pp(name, output, kwargs): """ API: accepts output """ PostProcessor.do.paused = False return report(output) def _api_pause_pp(name, output, kwargs): """ API: accepts output """ PostProcessor.do.paused = True return report(output) def _api_rss_now(name, output, kwargs): """ API: accepts output """ # Run RSS scan async, because it can take a long time scheduler.force_rss() return report(output) def _api_retry_all(name, output, kwargs): """ API: Retry all failed items in History """ return report(output, keyword='status', data=retry_all_jobs()) def _api_reset_quota(name, output, kwargs): """ Reset quota left """ BPSMeter.do.reset_quota(force=True) def _api_test_email(name, output, kwargs): """ API: send a test email, return result """ logging.info("Sending test email") pack = {'download': ['action 1', 'action 2'], 'unpack': ['action 1', 'action 2']} res = sabnzbd.emailer.endjob('I had a d\xe8ja vu', 'unknown', True, os.path.normpath(os.path.join(cfg.complete_dir.get_path(), '/unknown/I had a d\xe8ja vu')), 123 * MEBI, None, pack, 'my_script', 'Line 1\nLine 2\nLine 3\nd\xe8ja vu\n', 0, test=kwargs) if res == T('Email succeeded'): res = None return report(output, error=res) def _api_test_windows(name, output, kwargs): """ API: send a test to Windows, return result """ logging.info("Sending test notification") res = sabnzbd.notifier.send_windows('SABnzbd', T('Test Notification'), 'other') return report(output, error=res) def _api_test_notif(name, output, kwargs): """ API: send a test to Notification Center, return result """ logging.info("Sending test notification") res = sabnzbd.notifier.send_notification_center('SABnzbd', T('Test Notification'), 'other') return report(output, error=res) def _api_test_osd(name, output, kwargs): """ API: send a test OSD notification, return result """ logging.info("Sending OSD notification") res = sabnzbd.notifier.send_notify_osd('SABnzbd', T('Test Notification')) return report(output, error=res) def _api_test_prowl(name, output, kwargs): """ API: send a test Prowl notification, return result """ logging.info("Sending Prowl notification") res = sabnzbd.notifier.send_prowl('SABnzbd', T('Test Notification'), 'other', force=True, test=kwargs) return report(output, error=res) def _api_test_pushover(name, output, kwargs): """ API: send a test Pushover notification, return result """ logging.info("Sending Pushover notification") res = sabnzbd.notifier.send_pushover('SABnzbd', T('Test Notification'), 'other', force=True, test=kwargs) return report(output, error=res) def _api_test_pushbullet(name, output, kwargs): """ API: send a test Pushbullet notification, return result """ logging.info("Sending Pushbullet notification") res = sabnzbd.notifier.send_pushbullet('SABnzbd', T('Test Notification'), 'other', force=True, test=kwargs) return report(output, error=res) def _api_test_nscript(name, output, kwargs): """ API: execute a test notification script, return result """ logging.info("Executing notification script") res = sabnzbd.notifier.send_nscript('SABnzbd', T('Test Notification'), 'other', force=True, test=kwargs) return report(output, error=res) def _api_undefined(name, output, kwargs): """ API: accepts output """ return report(output, _MSG_NOT_IMPLEMENTED) def _api_browse(name, output, kwargs): """ Return tree of local path """ compact = kwargs.get('compact') if compact and compact == '1': name = kwargs.get('term', '') paths = [entry['path'] for entry in folders_at_path(os.path.dirname(name)) if 'path' in entry] return report(output, keyword='', data=paths) else: show_hidden = kwargs.get('show_hidden_folders') paths = folders_at_path(name, True, show_hidden) return report(output, keyword='paths', data=paths) def _api_config(name, output, kwargs): """ API: Dispatcher for "config" """ return _api_config_table.get(name, (_api_config_undefined, 2))[0](output, kwargs) def _api_config_speedlimit(output, kwargs): """ API: accepts output, value(=speed) """ value = kwargs.get('value') if not value: value = '0' Downloader.do.limit_speed(value) return report(output) def _api_config_get_speedlimit(output, kwargs): """ API: accepts output """ return report(output, keyword='speedlimit', data=Downloader.do.get_limit()) def _api_config_set_colorscheme(output, kwargs): """ API: accepts output""" value = kwargs.get('value') if value: cfg.web_color.set(value) return report(output) else: return report(output, _MSG_NO_VALUE) def _api_config_set_pause(output, kwargs): """ API: accepts output, value(=pause interval) """ value = kwargs.get('value') scheduler.plan_resume(int_conv(value)) return report(output) def _api_config_set_apikey(output, kwargs): """ API: accepts output """ cfg.api_key.set(config.create_api_key()) config.save_config() return report(output, keyword='apikey', data=cfg.api_key()) def _api_config_set_nzbkey(output, kwargs): """ API: accepts output """ cfg.nzb_key.set(config.create_api_key()) config.save_config() return report(output, keyword='nzbkey', data=cfg.nzb_key()) def _api_config_regenerate_certs(output, kwargs): # Make sure we only over-write default locations result = False if sabnzbd.cfg.https_cert() is sabnzbd.cfg.https_cert.default() and sabnzbd.cfg.https_key() is sabnzbd.cfg.https_key.default(): https_cert = sabnzbd.cfg.https_cert.get_path() https_key = sabnzbd.cfg.https_key.get_path() result = create_https_certificates(https_cert, https_key) sabnzbd.RESTART_REQ = True return report(output, data=result) def _api_config_test_server(output, kwargs): """ API: accepts output, server-params """ result, msg = test_nntp_server_dict(kwargs) response = {'result': result, 'message': msg} if output: return report(output, data=response) else: return msg def _api_config_undefined(output, kwargs): """ API: accepts output """ return report(output, _MSG_NOT_IMPLEMENTED) def _api_server_stats(name, output, kwargs): """ API: accepts output """ sum_t, sum_m, sum_w, sum_d = BPSMeter.do.get_sums() stats = {'total': sum_t, 'month': sum_m, 'week': sum_w, 'day': sum_d, '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 {}} return report(output, keyword='', data=stats) ############################################################################## _api_table = { 'server_stats': (_api_server_stats, 2), 'get_config': (_api_get_config, 3), 'set_config': (_api_set_config, 3), 'set_config_default': (_api_set_config_default, 3), 'del_config': (_api_del_config, 3), 'qstatus': (_api_qstatus, 2), 'queue': (_api_queue, 2), 'options': (_api_options, 2), 'translate': (_api_translate, 2), 'addfile': (_api_addfile, 1), 'retry': (_api_retry, 2), 'cancel_pp': (_api_cancel_pp, 2), 'addlocalfile': (_api_addlocalfile, 1), 'switch': (_api_switch, 2), 'change_cat': (_api_change_cat, 2), 'change_script': (_api_change_script, 2), 'change_opts': (_api_change_opts, 2), 'fullstatus': (_api_fullstatus, 2), 'history': (_api_history, 2), 'get_files': (_api_get_files, 2), 'addurl': (_api_addurl, 1), 'addid': (_api_addurl, 1), 'pause': (_api_pause, 2), 'resume': (_api_resume, 2), 'shutdown': (_api_shutdown, 3), 'warnings': (_api_warnings, 2), 'config': (_api_config, 2), 'get_cats': (_api_get_cats, 2), 'get_scripts': (_api_get_scripts, 2), 'version': (_api_version, 1), 'auth': (_api_auth, 1), 'restart': (_api_restart, 3), 'restart_repair': (_api_restart_repair, 2), 'disconnect': (_api_disconnect, 2), 'osx_icon': (_api_osx_icon, 3), 'rescan': (_api_rescan, 2), 'eval_sort': (_api_eval_sort, 2), 'watched_now': (_api_watched_now, 2), 'resume_pp': (_api_resume_pp, 2), 'pause_pp': (_api_pause_pp, 2), 'rss_now': (_api_rss_now, 2), 'browse': (_api_browse, 2), 'retry_all': (_api_retry_all, 2), 'reset_quota': (_api_reset_quota, 2), 'test_email': (_api_test_email, 2), 'test_windows': (_api_test_windows, 2), 'test_notif': (_api_test_notif, 2), 'test_osd': (_api_test_osd, 2), 'test_pushover': (_api_test_pushover, 2), 'test_pushbullet': (_api_test_pushbullet, 2), 'test_prowl': (_api_test_prowl, 2), 'test_nscript': (_api_test_nscript, 2), } _api_queue_table = { 'delete': (_api_queue_delete, 2), 'delete_nzf': (_api_queue_delete_nzf, 2), 'rename': (_api_queue_rename, 2), 'change_complete_action': (_api_queue_change_complete_action, 2), 'purge': (_api_queue_purge, 2), 'pause': (_api_queue_pause, 2), 'resume': (_api_queue_resume, 2), 'priority': (_api_queue_priority, 2), 'sort': (_api_queue_sort, 2), 'rating': (_api_queue_rating, 2) } _api_config_table = { 'speedlimit': (_api_config_speedlimit, 2), 'set_speedlimit': (_api_config_speedlimit, 2), 'get_speedlimit': (_api_config_get_speedlimit, 2), 'set_colorscheme': (_api_config_set_colorscheme, 2), 'set_pause': (_api_config_set_pause, 2), 'set_apikey': (_api_config_set_apikey, 3), 'set_nzbkey': (_api_config_set_nzbkey, 3), 'regenerate_certs': (_api_config_regenerate_certs, 3), 'test_server': (_api_config_test_server, 2) } def api_level(cmd, name): """ Return access level required for this API call """ if cmd in _api_table: return _api_table[cmd][1] if name == 'queue' and cmd in _api_queue_table: return _api_queue_table[cmd][1] if name == 'config' and cmd in _api_config_table: return _api_config_table[cmd][1] return 4 def report(output, error=None, keyword='value', data=None, compat=False): """ Report message in json, xml or plain text If error is set, only an status/error report is made. If no error and no data, only a status report is made. Else, a data report is made (optional 'keyword' for outer XML section). 'compat' is a special case for compatibility for ascii ouput """ if output == 'json': content = "application/json;charset=UTF-8" if error: info = {'status': False, 'error': error} elif data is None: info = {'status': True} else: if hasattr(data, '__iter__') and not keyword: info = data else: info = {keyword: data} response = json.dumps(info).encode('utf-8') elif output == 'xml': if not keyword: # xml always needs an outer keyword, even when json doesn't keyword = 'result' content = "text/xml" xmlmaker = xml_factory() if error: status_str = xmlmaker.run('result', {'status': False, 'error': error}) elif data is None: status_str = xmlmaker.run('result', {'status': True}) else: status_str = xmlmaker.run(keyword, data) response = '\n%s\n' % status_str else: content = "text/plain" if error: response = "error: %s\n" % error elif compat or data is None: response = 'ok\n' else: response = '%s\n' % str(data) cherrypy.response.headers['Content-Type'] = content cherrypy.response.headers['Pragma'] = 'no-cache' return response class xml_factory: """ Recursive xml string maker. Feed it a mixed tuple/dict/item object and will output into an xml string Current limitations: In Two tiered lists hard-coded name of "item": In Three tiered lists hard-coded name of "slot": """ def __init__(self): self.__text = '' def _tuple(self, keyw, lst): text = [] for item in lst: text.append(self.run(keyw, item)) return ''.join(text) def _dict(self, keyw, lst): text = [] for key in lst.keys(): text.append(self.run(key, lst[key])) if keyw: return '<%s>%s\n' % (keyw, ''.join(text), keyw) else: return '' def _list(self, keyw, lst): text = [] for cat in lst: if isinstance(cat, dict): text.append(self._dict(plural_to_single(keyw, 'slot'), cat)) elif isinstance(cat, list): text.append(self._list(plural_to_single(keyw, 'list'), cat)) elif isinstance(cat, tuple): text.append(self._tuple(plural_to_single(keyw, 'tuple'), cat)) else: if not isinstance(cat, str): cat = str(cat) name = plural_to_single(keyw, 'item') text.append('<%s>%s\n' % (name, xml_name(cat), name)) if keyw: return '<%s>%s\n' % (keyw, ''.join(text), keyw) else: return '' def run(self, keyw, lst): if isinstance(lst, dict): text = self._dict(keyw, lst) elif isinstance(lst, list): text = self._list(keyw, lst) elif isinstance(lst, tuple): text = self._tuple(keyw, lst) elif keyw: text = '<%s>%s\n' % (keyw, xml_name(lst), keyw) else: text = '' return text def handle_server_api(output, kwargs): """ Special handler for API-call 'set_config' [servers] """ name = kwargs.get('keyword') if not name: name = kwargs.get('name') if name: server = config.get_config('servers', name) if server: server.set_dict(kwargs) old_name = name else: config.ConfigServer(name, kwargs) old_name = None Downloader.do.update_server(old_name, name) return name def handle_rss_api(output, kwargs): """ Special handler for API-call 'set_config' [rss] """ name = kwargs.get('keyword') if not name: name = kwargs.get('name') if not name: return None feed = config.get_config('rss', name) if feed: feed.set_dict(kwargs) else: config.ConfigRSS(name, kwargs) action = kwargs.get('filter_action') if action in ('add', 'update'): # Use the general function, but catch the redirect-raise try: kwargs['feed'] = name sabnzbd.interface.ConfigRss('/').internal_upd_rss_filter(**kwargs) except cherrypy.HTTPRedirect: pass elif action == 'delete': # Use the general function, but catch the redirect-raise try: kwargs['feed'] = name sabnzbd.interface.ConfigRss('/').internal_del_rss_filter(**kwargs) except cherrypy.HTTPRedirect: pass return name def handle_cat_api(output, kwargs): """ Special handler for API-call 'set_config' [categories] """ name = kwargs.get('keyword') if not name: name = kwargs.get('name') if not name: return None feed = config.get_config('categories', name) if feed: feed.set_dict(kwargs) else: config.ConfigCat(name, kwargs) return name def build_status(skip_dashboard=False, output=None): # build up header full of basic information info = build_header(trans_functions=not output) info['logfile'] = sabnzbd.LOGFILE info['weblogfile'] = sabnzbd.WEBLOGFILE info['loglevel'] = str(cfg.log_level()) info['folders'] = NzbQueue.do.scan_jobs(all=False, action=False) info['configfn'] = config.get_filename() # Dashboard: Speed of System info['cpumodel'] = getcpu() info['pystone'] = sabnzbd.PYSTONE_SCORE # Dashboard: Speed of Download directory: info['downloaddir'] = cfg.download_dir.get_clipped_path() info['downloaddirspeed'] = sabnzbd.DOWNLOAD_DIR_SPEED # Dashboard: Speed of Complete directory: info['completedir'] = cfg.complete_dir.get_clipped_path() info['completedirspeed'] = sabnzbd.COMPLETE_DIR_SPEED # Dashboard: Measured download-speed info['internetbandwidth'] = sabnzbd.INTERNET_BANDWIDTH # Dashboard: Connection information if not int_conv(skip_dashboard): info['localipv4'] = localipv4() info['publicipv4'] = publicipv4() info['ipv6'] = ipv6() # Dashboard: DNS-check try: addresslookup(cfg.selftest_host()) info['dnslookup'] = "OK" except: info['dnslookup'] = None info['servers'] = [] servers = sorted(Downloader.do.servers[:], key=lambda svr: '%02d%s' % (svr.priority, svr.displayname.lower())) for server in servers: serverconnections = [] connected = 0 for nw in server.idle_threads[:]: if nw.connected: connected += 1 for nw in server.busy_threads[:]: article = nw.article art_name = "" nzf_name = "" nzo_name = "" if article: nzf = article.nzf nzo = nzf.nzo art_name = article.article # filename field is not always present try: nzf_name = nzf.filename except: # attribute error nzf_name = nzf.subject nzo_name = nzo.final_name # For the templates or for JSON if output: thread_info = {'thrdnum': nw.thrdnum, 'art_name': art_name, 'nzf_name': nzf_name, 'nzo_name': nzo_name} serverconnections.append(thread_info) else: serverconnections.append((nw.thrdnum, art_name, nzf_name, nzo_name)) if nw.connected: connected += 1 if server.warning and not (connected or server.errormsg): connected = server.warning if server.request and not server.info: connected = T(' Resolving address').replace(' ', '') # For the templates or for JSON if output: server_info = {'servername': server.displayname, 'serveractiveconn': connected, 'servertotalconn': server.threads, 'serverconnections': serverconnections, 'serverssl': server.ssl, 'serversslinfo': server.ssl_info, 'serveractive': server.active, 'servererror': server.errormsg, 'serverpriority': server.priority, 'serveroptional': server.optional} info['servers'].append(server_info) else: info['servers'].append((server.displayname, '', connected, serverconnections, server.ssl, server.active, server.errormsg, server.priority, server.optional)) info['warnings'] = sabnzbd.GUIHANDLER.content() return info def build_queue(start=0, limit=0, trans=False, output=None, search=None): # build up header full of basic information info, pnfo_list, bytespersec, q_size, bytes_left_previous_page = build_queue_header(search=search, start=start, limit=limit, output=output) datestart = datetime.datetime.now() priorities = {TOP_PRIORITY: 'Force', REPAIR_PRIORITY: 'Repair', HIGH_PRIORITY: 'High', NORMAL_PRIORITY: 'Normal', LOW_PRIORITY: 'Low'} limit = int_conv(limit) start = int_conv(start) info['refresh_rate'] = str(cfg.refresh_rate()) if cfg.refresh_rate() > 0 else '' info['scripts'] = list_scripts() info['categories'] = list_cats(output is None) info['rating_enable'] = bool(cfg.rating_enable()) info['noofslots'] = q_size info['start'] = start info['limit'] = limit info['finish'] = info['start'] + info['limit'] n = start running_bytes = bytes_left_previous_page slotinfo = [] for pnfo in pnfo_list: nzo_id = pnfo.nzo_id bytesleft = pnfo.bytes_left bytes = pnfo.bytes average_date = pnfo.avg_date is_propagating = (pnfo.avg_stamp + float(cfg.propagation_delay() * 60)) > time.time() status = pnfo.status priority = pnfo.priority mbleft = (bytesleft / MEBI) mb = (bytes / MEBI) slot = {'index': n, 'nzo_id': str(nzo_id)} slot['unpackopts'] = str(sabnzbd.opts_to_pp(pnfo.repair, pnfo.unpack, pnfo.delete)) slot['priority'] = priorities[priority] if priority >= LOW_PRIORITY else priorities[NORMAL_PRIORITY] slot['script'] = pnfo.script if pnfo.script else 'None' slot['filename'] = pnfo.filename slot['password'] = pnfo.password if pnfo.password else '' slot['cat'] = pnfo.category if pnfo.category else 'None' slot['mbleft'] = "%.2f" % mbleft slot['mb'] = "%.2f" % mb slot['size'] = format_bytes(bytes) slot['sizeleft'] = format_bytes(bytesleft) slot['percentage'] = "%s" % (int(((mb - mbleft) / mb) * 100)) if mb != mbleft else '0' slot['mbmissing'] = "%.2f" % (pnfo.bytes_missing / MEBI) slot['direct_unpack'] = pnfo.direct_unpack if not output: slot['mb_fmt'] = locale.format_string('%d', int(mb), True) slot['mbdone_fmt'] = locale.format_string('%d', int(mb - mbleft), True) if not Downloader.do.paused and status not in (Status.PAUSED, Status.FETCHING, Status.GRABBING): if is_propagating: slot['status'] = Status.PROP elif status == Status.CHECKING: slot['status'] = Status.CHECKING else: slot['status'] = Status.DOWNLOADING else: # Ensure compatibility of API status if status == Status.DELETED or priority == TOP_PRIORITY: status = Status.DOWNLOADING slot['status'] = "%s" % status if (Downloader.do.paused or Downloader.do.postproc or is_propagating or status not in (Status.DOWNLOADING, Status.FETCHING, Status.QUEUED)) and priority != TOP_PRIORITY: slot['timeleft'] = '0:00:00' slot['eta'] = 'unknown' else: running_bytes += bytesleft slot['timeleft'] = calc_timeleft(running_bytes, bytespersec) try: datestart = datestart + datetime.timedelta(seconds=bytesleft / bytespersec) # new eta format: 16:00 Fri 07 Feb slot['eta'] = datestart.strftime(time_format('%H:%M %a %d %b')) except: datestart = datetime.datetime.now() slot['eta'] = 'unknown' # Do not show age when it's not known if average_date.year < 2000: slot['avg_age'] = '-' else: slot['avg_age'] = calc_age(average_date, bool(trans)) rating = Rating.do.get_rating_by_nzo(nzo_id) slot['has_rating'] = rating is not None if rating: slot['rating_avg_video'] = rating.avg_video slot['rating_avg_audio'] = rating.avg_audio slotinfo.append(slot) n += 1 if slotinfo: info['slots'] = slotinfo else: info['slots'] = [] return info, pnfo_list, bytespersec def fast_queue(): """ Return paused, bytes_left, bpsnow, time_left """ bytes_left = NzbQueue.do.remaining() paused = Downloader.do.paused bpsnow = BPSMeter.do.bps time_left = calc_timeleft(bytes_left, bpsnow) return paused, bytes_left, bpsnow, time_left def build_file_list(nzo_id): """ Build file lists for specified job """ jobs = [] nzo = NzbQueue.do.get_nzo(nzo_id) if nzo: pnfo = nzo.gather_info(full=True) finished_files = pnfo.finished_files active_files = pnfo.active_files queued_files = pnfo.queued_files for nzf in finished_files: jobs.append({'filename': nzf.filename if nzf.filename else nzf.subject, 'mbleft': "%.2f" % (nzf.bytes_left / MEBI), 'mb': "%.2f" % (nzf.bytes / MEBI), 'bytes': "%.2f" % nzf.bytes, 'age': calc_age(nzf.date), 'nzf_id': nzf.nzf_id, 'status': 'finished'}) for nzf in active_files: jobs.append({'filename': nzf.filename if nzf.filename else nzf.subject, 'mbleft': "%.2f" % (nzf.bytes_left / MEBI), 'mb': "%.2f" % (nzf.bytes / MEBI), 'bytes': "%.2f" % nzf.bytes, 'age': calc_age(nzf.date), 'nzf_id': nzf.nzf_id, 'status': 'active'}) for nzf in queued_files: jobs.append({'filename': nzf.filename if nzf.filename else nzf.subject, 'set': nzf.setname, 'mbleft': "%.2f" % (nzf.bytes_left / MEBI), 'mb': "%.2f" % (nzf.bytes / MEBI), 'bytes': "%.2f" % nzf.bytes, 'age': calc_age(nzf.date), 'nzf_id': nzf.nzf_id, 'status': 'queued'}) return jobs def options_list(output): return report(output, keyword='options', data={ 'sabyenc': sabnzbd.decoder.SABYENC_ENABLED, 'par2': sabnzbd.newsunpack.PAR2_COMMAND, 'multipar': sabnzbd.newsunpack.MULTIPAR_COMMAND, 'rar': sabnzbd.newsunpack.RAR_COMMAND, 'zip': sabnzbd.newsunpack.ZIP_COMMAND, '7zip': sabnzbd.newsunpack.SEVEN_COMMAND, 'nice': sabnzbd.newsunpack.NICE_COMMAND, 'ionice': sabnzbd.newsunpack.IONICE_COMMAND }) def retry_job(job, new_nzb=None, password=None): """ Re enter failed job in the download queue """ if job: history_db = sabnzbd.get_db_connection() futuretype, url, pp, script, cat = history_db.get_other(job) if futuretype: nzo_id = sabnzbd.add_url(url, pp, script, cat) else: path = history_db.get_path(job) nzo_id = NzbQueue.do.repair_job(path, new_nzb, password) if nzo_id: # Only remove from history if we repaired something history_db.remove_history(job) return nzo_id return None def retry_all_jobs(): """ Re enter all failed jobs in the download queue """ # Fetch all retryable folders from History items = sabnzbd.api.build_history()[0] nzo_ids = [] for item in items: if item['retry']: nzo_ids.append(retry_job(item['nzo_id'])) return nzo_ids def del_job_files(job_paths): """ Remove files of each path in the list """ for path in job_paths: if path and clip_path(path).lower().startswith(cfg.download_dir.get_clipped_path().lower()): remove_all(path, recursive=True) def del_hist_job(job, del_files): """ Remove history element """ if job: path = PostProcessor.do.get_path(job) if path: PostProcessor.do.delete(job, del_files=del_files) else: history_db = sabnzbd.get_db_connection() remove_all(history_db.get_path(job), recursive=True) history_db.remove_history(job) def Tspec(txt): """ Translate special terms """ if txt == 'None': return T('None') elif txt in ('Default', '*'): return T('Default') else: return txt _SKIN_CACHE = {} # Stores pre-translated acronyms def Ttemplate(txt): """ Translation function for Skin texts This special is to be used in interface.py for template processing to be passed for the $T function: so { ..., 'T' : Ttemplate, ...} """ global _SKIN_CACHE if txt in _SKIN_CACHE: return _SKIN_CACHE[txt] else: # We need to remove the " and ' to be JS/JSON-string-safe # Saving it in dictionary is 20x faster on next look-up tra = T(SKIN_TEXT.get(txt, txt)).replace('"', '"').replace("'", ''') _SKIN_CACHE[txt] = tra return tra def clear_trans_cache(): """ Clean cache for skin translations """ global _SKIN_CACHE _SKIN_CACHE = {} sabnzbd.WEBUI_READY = True def build_header(webdir='', output=None, trans_functions=True): """ Build the basic header """ try: uptime = calc_age(sabnzbd.START) except: uptime = "-" speed_limit = Downloader.do.get_limit() if speed_limit <= 0: speed_limit = 100 speed_limit_abs = Downloader.do.get_limit_abs() if speed_limit_abs <= 0: speed_limit_abs = '' diskspace_info = diskspace() header = {} # We don't output everything for API if not output: # These are functions, and cause problems for JSON if trans_functions: header['T'] = Ttemplate header['Tspec'] = Tspec header['uptime'] = uptime header['color_scheme'] = sabnzbd.WEB_COLOR or '' header['helpuri'] = 'https://sabnzbd.org/wiki/' header['restart_req'] = sabnzbd.RESTART_REQ header['pid'] = os.getpid() header['active_lang'] = cfg.language() header['my_lcldata'] = clip_path(sabnzbd.DIR_LCLDATA) header['my_home'] = clip_path(sabnzbd.DIR_HOME) header['webdir'] = webdir or sabnzbd.WEB_DIR header['url_base'] = cfg.url_base() header['nt'] = sabnzbd.WIN32 header['darwin'] = sabnzbd.DARWIN header['power_options'] = sabnzbd.WIN32 or sabnzbd.DARWIN or sabnzbd.LINUX_POWER header['pp_pause_event'] = sabnzbd.scheduler.pp_pause_event() header['session'] = cfg.api_key() header['new_release'], header['new_rel_url'] = sabnzbd.NEW_VERSION header['version'] = sabnzbd.__version__ header['paused'] = Downloader.do.paused or Downloader.do.postproc header['pause_int'] = scheduler.pause_int() header['paused_all'] = sabnzbd.PAUSED_ALL header['diskspace1'] = "%.2f" % diskspace_info['download_dir'][1] header['diskspace2'] = "%.2f" % diskspace_info['complete_dir'][1] header['diskspace1_norm'] = to_units(diskspace_info['download_dir'][1] * GIGI) header['diskspace2_norm'] = to_units(diskspace_info['complete_dir'][1] * GIGI) header['diskspacetotal1'] = "%.2f" % diskspace_info['download_dir'][0] header['diskspacetotal2'] = "%.2f" % diskspace_info['complete_dir'][0] header['loadavg'] = loadavg() header['speedlimit'] = "{1:0.{0}f}".format(int(speed_limit % 1 > 0), speed_limit) header['speedlimit_abs'] = "%s" % speed_limit_abs header['have_warnings'] = str(sabnzbd.GUIHANDLER.count()) header['finishaction'] = sabnzbd.QUEUECOMPLETE header['quota'] = to_units(BPSMeter.do.quota) header['have_quota'] = bool(BPSMeter.do.quota > 0.0) header['left_quota'] = to_units(BPSMeter.do.left) anfo = ArticleCache.do.cache_info() header['cache_art'] = str(anfo.article_sum) header['cache_size'] = format_bytes(anfo.cache_size) header['cache_max'] = str(anfo.cache_limit) return header def build_queue_header(search=None, start=0, limit=0, output=None): """ Build full queue header """ header = build_header(output=output) bytespersec = BPSMeter.do.bps qnfo = NzbQueue.do.queue_info(search=search, start=start, limit=limit) bytesleft = qnfo.bytes_left bytes = qnfo.bytes header['kbpersec'] = "%.2f" % (bytespersec / KIBI) header['speed'] = to_units(bytespersec) header['mbleft'] = "%.2f" % (bytesleft / MEBI) header['mb'] = "%.2f" % (bytes / MEBI) header['sizeleft'] = format_bytes(bytesleft) header['size'] = format_bytes(bytes) header['noofslots_total'] = qnfo.q_fullsize if Downloader.do.paused or Downloader.do.postproc: status = Status.PAUSED elif bytespersec > 0: status = Status.DOWNLOADING else: status = 'Idle' header['status'] = status header['timeleft'] = calc_timeleft(bytesleft, bytespersec) try: datestart = datetime.datetime.now() + datetime.timedelta(seconds=bytesleft / bytespersec) # new eta format: 16:00 Fri 07 Feb header['eta'] = datestart.strftime(time_format('%H:%M %a %d %b')) except: header['eta'] = T('unknown') return header, qnfo.list, bytespersec, qnfo.q_fullsize, qnfo.bytes_left_previous_page def build_history(start=None, limit=None,search=None, failed_only=0, categories=None, output=None): limit = int_conv(limit) if not limit: limit = 1000000 start = int_conv(start) failed_only = int_conv(failed_only) def matches_search(text, search_text): # Replace * with .* and ' ' with . search_text = search_text.strip().replace('*', '.*').replace(' ', '.*') + '.*?' try: re_search = re.compile(search_text, re.I) except: logging.error(T('Failed to compile regex for search term: %s'), search_text) return False return re_search.search(text) # Grab any items that are active or queued in postproc queue = PostProcessor.do.get_queue() # Filter out any items that don't match the search if search: queue = [nzo for nzo in queue if matches_search(nzo.final_name, search)] # Multi-page support for postproc items full_queue_size = len(queue) if start > full_queue_size: # On a page where we shouldn't show postproc items queue = [] h_limit = limit else: try: if limit: queue = queue[start:start + limit] else: queue = queue[start:] except: pass # Remove the amount of postproc items from the db request for history items h_limit = max(limit - len(queue), 0) h_start = max(start - full_queue_size, 0) # Aquire the db instance try: history_db = sabnzbd.get_db_connection() close_db = False except: # Required for repairs at startup because Cherrypy isn't active yet history_db = HistoryDB() close_db = True # Fetch history items if not h_limit: items, fetched_items, total_items = history_db.fetch_history(h_start, 1, search, failed_only, categories) items = [] else: items, fetched_items, total_items = history_db.fetch_history(h_start, h_limit, search, failed_only, categories) # Reverse the queue to add items to the top (faster than insert) items.reverse() # Add the postproc items to the top of the history items = get_active_history(queue, items) # Unreverse the queue items.reverse() for item in items: item['size'] = format_bytes(item['bytes']) if 'loaded' not in item: item['loaded'] = False path = item.get('path', '') item['retry'] = int_conv(item.get('status') == Status.FAILED and path and os.path.exists(path)) # Retry of failed URL-fetch if item['report'] == 'future': item['retry'] = True if Rating.do: rating = Rating.do.get_rating_by_nzo(item['nzo_id']) else: rating = None item['has_rating'] = rating is not None if rating: item['rating_avg_video'] = rating.avg_video item['rating_avg_audio'] = rating.avg_audio item['rating_avg_vote_up'] = rating.avg_vote_up item['rating_avg_vote_down'] = rating.avg_vote_down item['rating_user_video'] = rating.user_video item['rating_user_audio'] = rating.user_audio item['rating_user_vote'] = rating.user_vote total_items += full_queue_size fetched_items = len(items) if close_db: history_db.close() return items, fetched_items, total_items def get_active_history(queue=None, items=None): """ Get the currently in progress and active history queue. """ if items is None: items = [] if queue is None: queue = PostProcessor.do.get_queue() for nzo in queue: history = build_history_info(nzo) item = {} item['completed'], item['name'], item['nzb_name'], item['category'], item['pp'], item['script'], item['report'], \ item['url'], item['status'], item['nzo_id'], item['storage'], item['path'], item['script_log'], \ item['script_line'], item['download_time'], item['postproc_time'], item['stage_log'], \ item['downloaded'], item['completeness'], item['fail_message'], item['url_info'], item['bytes'], \ _, _, item['password'] = history item['action_line'] = nzo.action_line item = unpack_history_info(item) item['loaded'] = nzo.pp_active if item['bytes']: item['size'] = format_bytes(item['bytes']) else: item['size'] = '' items.append(item) return items def format_bytes(bytes_string): b = to_units(bytes_string) if b == '': return b else: return b + 'B' def calc_timeleft(bytesleft, bps): """ Calculate the time left in the format HH:MM:SS """ try: if bytesleft <= 0: return '0:00:00' totalseconds = int(bytesleft / bps) minutes, seconds = divmod(totalseconds, 60) hours, minutes = divmod(minutes, 60) days, hours = divmod(hours, 24) if minutes < 10: minutes = '0%s' % minutes if seconds < 10: seconds = '0%s' % seconds if days > 0: if hours < 10: hours = '0%s' % hours return '%s:%s:%s:%s' % (days, hours, minutes, seconds) else: return '%s:%s:%s' % (hours, minutes, seconds) except: return '0:00:00' def list_scripts(default=False, none=True): """ Return a list of script names, optionally with 'Default' added """ lst = [] path = cfg.script_dir.get_path() if path and os.access(path, os.R_OK): for script in globber_full(path): if os.path.isfile(script): if (sabnzbd.WIN32 and os.path.splitext(script)[1].lower() in PATHEXT and not win32api.GetFileAttributes(script) & win32file.FILE_ATTRIBUTE_HIDDEN) or \ script.endswith('.py') or \ (not sabnzbd.WIN32 and userxbit(script) and not os.path.basename(script).startswith('.')): lst.append(os.path.basename(script)) if none: lst.insert(0, 'None') if default: lst.insert(0, 'Default') return lst def list_cats(default=True): """ Return list of (ordered) categories, when default==False use '*' for Default category """ lst = [cat['name'] for cat in config.get_ordered_categories()] if default: lst.remove('*') lst.insert(0, 'Default') return lst _PLURAL_TO_SINGLE = { 'categories': 'category', 'servers': 'server', 'rss': 'feed', 'scripts': 'script', 'warnings': 'warning', 'files': 'file', 'jobs': 'job' } def plural_to_single(kw, def_kw=''): try: return _PLURAL_TO_SINGLE[kw] except KeyError: return def_kw def del_from_section(kwargs): """ Remove keyword in section """ section = kwargs.get('section', '') if section in ('servers', 'rss', 'categories'): keyword = kwargs.get('keyword') if keyword: item = config.get_config(section, keyword) if item: item.delete() del item config.save_config() if section == 'servers': Downloader.do.update_server(keyword, None) return True else: return False def history_remove_failed(): """ Remove all failed jobs from history, including files """ logging.info('Scheduled removal of all failed jobs') history_db = HistoryDB() del_job_files(history_db.get_failed_paths()) history_db.remove_failed() history_db.close() def history_remove_completed(): """ Remove all completed jobs from history """ logging.info('Scheduled removal of all completed jobs') history_db = HistoryDB() history_db.remove_completed() history_db.close() sabnzbd-develop/sabnzbd/rss.py0000600000175000017500000007114713642116632014553 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.rss - rss client functionality """ import re import logging import time import datetime import threading import sabnzbd from sabnzbd.constants import RSS_FILE_NAME, DEFAULT_PRIORITY, NORMAL_PRIORITY, DUP_PRIORITY from sabnzbd.decorators import synchronized import sabnzbd.config as config import sabnzbd.cfg as cfg from sabnzbd.misc import cat_convert, wildcard_to_re, cat_to_opts, match_str, from_units, int_conv, get_base_url import sabnzbd.emailer as emailer import feedparser __RSS = None # Global pointer to RSS-scanner instance ############################################################################## # Wrapper functions ############################################################################## def init(): global __RSS __RSS = RSSQueue() def stop(): global __RSS if __RSS: __RSS.stop() try: __RSS.join() except: pass def run_feed(feed, download, ignoreFirst=False, force=False, readout=True): global __RSS if __RSS: return __RSS.run_feed(feed, download, ignoreFirst, force=force, readout=readout) def show_result(feed): global __RSS if __RSS: return __RSS.show_result(feed) def flag_downloaded(feed, fid): global __RSS if __RSS: __RSS.flag_downloaded(feed, fid) def lookup_url(feed, fid): global __RSS if __RSS: return __RSS.lookup_url(feed, fid) def run_method(): global __RSS if __RSS: return __RSS.run() else: return None def next_run(t=None): global __RSS if __RSS: if t: __RSS.next_run = t else: return __RSS.next_run else: return time.time() def save(): global __RSS if __RSS: __RSS.save() def clear_feed(feed): global __RSS if __RSS: __RSS.clear_feed(feed) def clear_downloaded(feed): global __RSS if __RSS: __RSS.clear_downloaded(feed) ############################################################################## def notdefault(item): """ Return True if not 'Default|''|*' """ return bool(item) and str(item).lower() not in ("default", "*", "", str(DEFAULT_PRIORITY)) def convert_filter(text): """ Return compiled regex. If string starts with re: it's a real regex else quote all regex specials, replace '*' by '.*' """ text = text.strip().lower() if text.startswith("re:"): txt = text[3:].strip() else: txt = wildcard_to_re(text) try: return re.compile(txt, re.I) except: logging.debug("Could not compile regex: %s", text) return None def remove_obsolete(jobs, new_jobs): """ Expire G/B links that are not in new_jobs (mark them 'X') Expired links older than 3 days are removed from 'jobs' """ now = time.time() limit = now - 259200 # 3days (3x24x3600) olds = list(jobs.keys()) for old in olds: tm = jobs[old]["time"] if old not in new_jobs: if jobs[old].get("status", " ")[0] in ("G", "B"): jobs[old]["status"] = "X" if jobs[old]["status"] == "X" and tm < limit: logging.debug("Purging link %s", old) del jobs[old] LOCK = threading.RLock() _RE_SP = re.compile(r"s*(\d+)[ex](\d+)", re.I) _RE_SIZE1 = re.compile(r"Size:\s*(\d+\.\d+\s*[KMG]{0,1})B\W*", re.I) _RE_SIZE2 = re.compile(r"\W*(\d+\.\d+\s*[KMG]{0,1})B\W*", re.I) class RSSQueue: def __init__(self): self.jobs = {} self.next_run = time.time() self.shutdown = False try: self.jobs = sabnzbd.load_admin(RSS_FILE_NAME) if self.jobs: for feed in self.jobs: remove_obsolete(self.jobs[feed], list(self.jobs[feed].keys())) except: logging.warning(T("Cannot read %s"), RSS_FILE_NAME) logging.info("Traceback: ", exc_info=True) # Storage needs to be dict if not self.jobs: self.jobs = {} # jobs is a NAME-indexed dictionary # Each element is link-indexed dictionary # Each element is another dictionary: # status : 'D', 'G', 'B', 'X' (downloaded, good-match, bad-match, obsolete) # '*' added means: from the initial batch # '-' added to 'D' means downloaded, but not displayed anymore # title : Title # url : URL # cat : category # orgcat : category as read from feed # pp : pp # script : script # prio : priority # time : timestamp (used for time-based clean-up) # size : size in bytes # age : age in datetime format as specified by feed # season : season number (if applicable) # episode : episode number (if applicable) # Patch feedparser patch_feedparser() def stop(self): self.shutdown = True @synchronized(LOCK) def run_feed(self, feed=None, download=False, ignoreFirst=False, force=False, readout=True): """ Run the query for one URI and apply filters """ self.shutdown = False if not feed: return "No such feed" newlinks = [] new_downloads = [] # Preparations, get options try: feeds = config.get_rss()[feed] except KeyError: logging.error(T('Incorrect RSS feed description "%s"'), feed) logging.info("Traceback: ", exc_info=True) return T('Incorrect RSS feed description "%s"') % feed uris = feeds.uri() defCat = feeds.cat() import sabnzbd.api if not notdefault(defCat) or defCat not in sabnzbd.api.list_cats(default=False): defCat = None defPP = feeds.pp() if not notdefault(defPP): defPP = None defScript = feeds.script() if not notdefault(defScript): defScript = None defPrio = feeds.priority() if not notdefault(defPrio): defPrio = None # Preparations, convert filters to regex's regexes = [] reTypes = [] reCats = [] rePPs = [] rePrios = [] reScripts = [] reEnabled = [] for filter in feeds.filters(): reCat = filter[0] if defCat in ("", "*"): reCat = None reCats.append(reCat) rePPs.append(filter[1]) reScripts.append(filter[2]) reTypes.append(filter[3]) if filter[3] in ("<", ">", "F", "S"): regexes.append(filter[4]) else: regexes.append(convert_filter(filter[4])) rePrios.append(filter[5]) reEnabled.append(filter[6] != "0") regcount = len(regexes) # Set first if this is the very first scan of this URI first = (feed not in self.jobs) and ignoreFirst # Add SABnzbd's custom User Agent feedparser.USER_AGENT = "SABnzbd+/%s" % sabnzbd.version.__version__ # Read the RSS feed msg = None entries = None if readout: all_entries = [] for uri in uris: uri = uri.replace(" ", "%20") logging.debug("Running feedparser on %s", uri) feed_parsed = feedparser.parse(uri.replace("feed://", "http://")) logging.debug("Done parsing %s", uri) if not feed_parsed: msg = T("Failed to retrieve RSS from %s: %s") % (uri, "?") logging.info(msg) status = feed_parsed.get("status", 999) if status in (401, 402, 403): msg = T("Do not have valid authentication for feed %s") % uri logging.info(msg) if 500 <= status <= 599: msg = T("Server side error (server code %s); could not get %s on %s") % (status, feed, uri) logging.info(msg) entries = feed_parsed.get("entries") if "bozo_exception" in feed_parsed and not entries: msg = str(feed_parsed["bozo_exception"]) if "CERTIFICATE_VERIFY_FAILED" in msg: msg = T("Server %s uses an untrusted HTTPS certificate") % get_base_url(uri) msg += " - https://sabnzbd.org/certificate-errors" logging.error(msg) elif "href" in feed_parsed and feed_parsed["href"] != uri and "login" in feed_parsed["href"]: # Redirect to login page! msg = T("Do not have valid authentication for feed %s") % uri else: msg = T("Failed to retrieve RSS from %s: %s") % (uri, msg) logging.info(msg) if not entries and not msg: msg = T("RSS Feed %s was empty") % uri logging.info(msg) all_entries.extend(entries) entries = all_entries # In case of a new feed if feed not in self.jobs: self.jobs[feed] = {} jobs = self.jobs[feed] # Error in readout or now new readout if readout: if not entries: return msg else: entries = list(jobs.keys()) # Filter out valid new links for entry in entries: if self.shutdown: return if readout: try: link, infourl, category, size, age, season, episode = _get_link(entry) except (AttributeError, IndexError): logging.info(T("Incompatible feed") + " " + uri) logging.info("Traceback: ", exc_info=True) return T("Incompatible feed") title = entry.title # If there's multiple feeds, remove the duplicates based on title and size if len(uris) > 1: skip_job = False for job_link, job in jobs.items(): # Allow 5% size deviation because indexers might have small differences for same release if ( job.get("title") == title and link != job_link and (job.get("size") * 0.95) < size < (job.get("size") * 1.05) ): logging.info("Ignoring job %s from other feed", title) skip_job = True break if skip_job: continue else: link = entry infourl = jobs[link].get("infourl", "") category = jobs[link].get("orgcat", "") if category in ("", "*"): category = None title = jobs[link].get("title", "") size = jobs[link].get("size", 0) age = jobs[link].get("age") season = jobs[link].get("season", 0) episode = jobs[link].get("episode", 0) if link: # Make sure spaces are quoted in the URL link = link.strip().replace(" ", "%20") newlinks.append(link) if link in jobs: jobstat = jobs[link].get("status", " ")[0] else: jobstat = "N" if jobstat in "NGB" or (jobstat == "X" and readout): # Match this title against all filters logging.debug("Trying title %s", title) result = False myCat = defCat myPP = defPP myScript = defScript myPrio = defPrio n = 0 if ("F" in reTypes or "S" in reTypes) and (not season or not episode): season, episode = sabnzbd.newsunpack.analyse_show(title)[1:3] # Match against all filters until an positive or negative match logging.debug("Size %s", size) for n in range(regcount): if reEnabled[n]: if category and reTypes[n] == "C": found = re.search(regexes[n], category) if not found: logging.debug("Filter rejected on rule %d", n) result = False break elif reTypes[n] == "<" and size and from_units(regexes[n]) < size: # "Size at most" : too large logging.debug("Filter rejected on rule %d", n) result = False break elif reTypes[n] == ">" and size and from_units(regexes[n]) > size: # "Size at least" : too small logging.debug("Filter rejected on rule %d", n) result = False break elif reTypes[n] == "F" and not ep_match(season, episode, regexes[n]): # "Starting from SxxEyy", too early episode logging.debug("Filter requirement match on rule %d", n) result = False break elif ( reTypes[n] == "S" and season and episode and ep_match(season, episode, regexes[n], title) ): logging.debug("Filter matched on rule %d", n) result = True break else: if regexes[n]: found = re.search(regexes[n], title) else: found = False if reTypes[n] == "M" and not found: logging.debug("Filter rejected on rule %d", n) result = False break if found and reTypes[n] == "A": logging.debug("Filter matched on rule %d", n) result = True break if found and reTypes[n] == "R": logging.debug("Filter rejected on rule %d", n) result = False break if len(reCats): if not result and defCat: # Apply Feed-category on non-matched items myCat = defCat elif result and notdefault(reCats[n]): # Use the matched info myCat = reCats[n] elif category and not defCat: # No result and no Feed-category myCat = cat_convert(category) if myCat: myCat, catPP, catScript, catPrio = cat_to_opts(myCat) else: myCat = catPP = catScript = catPrio = None if notdefault(rePPs[n]): myPP = rePPs[n] elif not (reCats[n] or category): myPP = catPP if notdefault(reScripts[n]): myScript = reScripts[n] elif not (notdefault(reCats[n]) or category): myScript = catScript if rePrios[n] not in (str(DEFAULT_PRIORITY), ""): myPrio = rePrios[n] elif not ((rePrios[n] != str(DEFAULT_PRIORITY)) or category): myPrio = catPrio if cfg.no_dupes() and self.check_duplicate(title): if cfg.no_dupes() == 1: # Dupe-detection: Discard logging.info("Ignoring duplicate job %s", title) continue elif cfg.no_dupes() == 3: # Dupe-detection: Fail # We accept it so the Queue can send it to the History logging.info("Found duplicate job %s", title) else: # Dupe-detection: Pause myPrio = DUP_PRIORITY act = download and not first if link in jobs: act = act and not jobs[link].get("status", "").endswith("*") act = act or force star = first or jobs[link].get("status", "").endswith("*") else: star = first if result: _HandleLink( jobs, link, infourl, title, size, age, season, episode, "G", category, myCat, myPP, myScript, act, star, priority=myPrio, rule=n, ) if act: new_downloads.append(title) else: _HandleLink( jobs, link, infourl, title, size, age, season, episode, "B", category, myCat, myPP, myScript, False, star, priority=myPrio, rule=n, ) # Send email if wanted and not "forced" if new_downloads and cfg.email_rss() and not force: emailer.rss_mail(feed, new_downloads) remove_obsolete(jobs, newlinks) return msg def run(self): """ Run all the URI's and filters """ if not sabnzbd.PAUSED_ALL: active = False if self.next_run < time.time(): self.next_run = time.time() + cfg.rss_rate.get() * 60 feeds = config.get_rss() for feed in feeds.keys(): try: if feeds[feed].enable.get(): logging.info('Starting scheduled RSS read-out for "%s"', feed) active = True self.run_feed(feed, download=True, ignoreFirst=True) # Wait 15 seconds, else sites may get irritated for unused in range(15): if self.shutdown: return else: time.sleep(1.0) except KeyError: # Feed must have been deleted pass if active: self.save() logging.info("Finished scheduled RSS read-outs") @synchronized(LOCK) def show_result(self, feed): if feed in self.jobs: try: return self.jobs[feed] except: return {} else: return {} @synchronized(LOCK) def save(self): sabnzbd.save_admin(self.jobs, RSS_FILE_NAME) @synchronized(LOCK) def delete(self, feed): if feed in self.jobs: del self.jobs[feed] @synchronized(LOCK) def flag_downloaded(self, feed, fid): if feed in self.jobs: lst = self.jobs[feed] for link in lst: if lst[link].get("url", "") == fid: lst[link]["status"] = "D" lst[link]["time_downloaded"] = time.localtime() @synchronized(LOCK) def lookup_url(self, feed, url): if url and feed in self.jobs: lst = self.jobs[feed] for link in lst: if lst[link].get("url") == url: return lst[link] return None @synchronized(LOCK) def clear_feed(self, feed): # Remove any previous references to this feed name, and start fresh if feed in self.jobs: del self.jobs[feed] @synchronized(LOCK) def clear_downloaded(self, feed): # Mark downloaded jobs, so that they won't be displayed any more. if feed in self.jobs: for item in self.jobs[feed]: if self.jobs[feed][item]["status"] == "D": self.jobs[feed][item]["status"] = "D-" def check_duplicate(self, title): """ Check if this title was in this or other feeds Return matching feed name """ title = title.lower() for fd in self.jobs: for lk in self.jobs[fd]: item = self.jobs[fd][lk] if item.get("status", " ")[0] == "D" and item.get("title", "").lower() == title: return fd return "" def patch_feedparser(): """ Apply options that work for SABnzbd Add additional parsing of attributes """ feedparser.SANITIZE_HTML = 0 feedparser.PARSE_MICROFORMATS = 0 # Add our own namespace feedparser._FeedParserMixin.namespaces["http://www.newznab.com/DTD/2010/feeds/attributes/"] = "newznab" # Add parsers for the namespace def _start_newznab_attr(self, attrsD): context = self._getContext() # Add the dict if "newznab" not in context: context["newznab"] = {} # Don't crash when it fails try: # Add keys context["newznab"][attrsD["name"]] = attrsD["value"] # Try to get date-object if attrsD["name"] == "usenetdate": context["newznab"][attrsD["name"] + "_parsed"] = feedparser._parse_date(attrsD["value"]) except KeyError: pass feedparser._FeedParserMixin._start_newznab_attr = _start_newznab_attr feedparser._FeedParserMixin._start_nZEDb_attr = _start_newznab_attr feedparser._FeedParserMixin._start_nzedb_attr = _start_newznab_attr feedparser._FeedParserMixin._start_nntmux_attr = _start_newznab_attr def _HandleLink( jobs, link, infourl, title, size, age, season, episode, flag, orgcat, cat, pp, script, download, star, priority=NORMAL_PRIORITY, rule=0, ): """ Process one link """ if script == "": script = None if pp == "": pp = None jobs[link] = {} jobs[link]["title"] = title jobs[link]["url"] = link jobs[link]["infourl"] = infourl jobs[link]["cat"] = cat jobs[link]["pp"] = pp jobs[link]["script"] = script jobs[link]["prio"] = str(priority) jobs[link]["orgcat"] = orgcat jobs[link]["size"] = size jobs[link]["age"] = age jobs[link]["time"] = time.time() jobs[link]["rule"] = str(rule) jobs[link]["season"] = season jobs[link]["episode"] = episode if special_rss_site(link): nzbname = None else: nzbname = title if download: jobs[link]["status"] = "D" jobs[link]["time_downloaded"] = time.localtime() logging.info("Adding %s (%s) to queue", link, title) sabnzbd.add_url(link, pp=pp, script=script, cat=cat, priority=priority, nzbname=nzbname) else: if star: jobs[link]["status"] = flag + "*" else: jobs[link]["status"] = flag def _get_link(entry): """ Retrieve the post link from this entry Returns (link, category, size) """ size = 0 age = datetime.datetime.now() # Try standard link and enclosures first link = entry.link if not link: link = entry.links[0].href if "enclosures" in entry: try: link = entry.enclosures[0]["href"] size = int(entry.enclosures[0]["length"]) except: pass # GUID usually has URL to result on page infourl = None if entry.get("id") and entry.id != link and entry.id.startswith("http"): infourl = entry.id if size == 0: # Try to find size in Description try: desc = entry.description.replace("\n", " ").replace(" ", " ") m = _RE_SIZE1.search(desc) or _RE_SIZE2.search(desc) if m: size = from_units(m.group(1)) except: pass # Try newznab attribute first, this is the correct one try: # Convert it to format that calc_age understands age = datetime.datetime(*entry["newznab"]["usenetdate_parsed"][:6]) except: # Date from feed (usually lags behind) try: # Convert it to format that calc_age understands age = datetime.datetime(*entry.published_parsed[:6]) except: pass finally: # We need to convert it to local timezone, feedparser always returns UTC age = age - datetime.timedelta(seconds=time.timezone) # Maybe the newznab also provided SxxExx info try: season = re.findall("\d+", entry["newznab"]["season"])[0] episode = re.findall("\d+", entry["newznab"]["episode"])[0] except (KeyError, IndexError): season = episode = 0 if link and "http" in link.lower(): try: category = entry.cattext except AttributeError: try: category = entry.category except AttributeError: try: # nzb.su category = entry.tags[0]["term"] except (AttributeError, KeyError): try: category = entry.description except AttributeError: category = "" return link, infourl, category, size, age, season, episode else: logging.warning(T("Empty RSS entry found (%s)"), link) return None, None, "", 0, None, 0, 0 def special_rss_site(url): """ Return True if url describes an RSS site with odd titles """ return cfg.rss_filenames() or match_str(url, cfg.rss_odd_titles()) def ep_match(season, episode, expr, title=None): """ Return True if season, episode is at or above expected Optionally `title` can be matched """ m = _RE_SP.search(expr) if m: # Make sure they are all integers for comparison req_season = int(m.group(1)) req_episode = int(m.group(2)) season = int_conv(season) episode = int_conv(episode) if season > req_season or (season == req_season and episode >= req_episode): if title: show = expr[: m.start()].replace(".", " ").replace("_", " ").strip() show = show.replace(" ", "[._ ]+") return bool(re.search(show, title, re.I)) else: return True else: return False else: return True sabnzbd-develop/sabnzbd/powersup.py0000600000175000017500000002175013642116632015623 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.powersup - System power management support """ import os import subprocess import logging import time ############################################################################## # Power management for Windows ############################################################################## try: import win32security import win32api import ntsecuritycon except ImportError: pass def win_power_privileges(): """ To do any power-options, the process needs higher privileges """ flags = ntsecuritycon.TOKEN_ADJUST_PRIVILEGES | ntsecuritycon.TOKEN_QUERY htoken = win32security.OpenProcessToken(win32api.GetCurrentProcess(), flags) id_ = win32security.LookupPrivilegeValue(None, ntsecuritycon.SE_SHUTDOWN_NAME) newPrivileges = [(id_, ntsecuritycon.SE_PRIVILEGE_ENABLED)] win32security.AdjustTokenPrivileges(htoken, 0, newPrivileges) def win_hibernate(): """ Hibernate Windows system, returns after wakeup """ try: win_power_privileges() win32api.SetSystemPowerState(False, True) except: logging.error(T('Failed to hibernate system')) logging.info("Traceback: ", exc_info=True) def win_standby(): """ Standby Windows system, returns after wakeup """ try: win_power_privileges() win32api.SetSystemPowerState(True, True) except: logging.error(T('Failed to standby system')) logging.info("Traceback: ", exc_info=True) def win_shutdown(): """ Shutdown Windows system, never returns """ try: win_power_privileges() win32api.InitiateSystemShutdown("", "", 30, 1, 0) finally: os._exit(0) ############################################################################## # Power management for OSX ############################################################################## def osx_shutdown(): """ Shutdown OSX system, never returns """ try: subprocess.call(['osascript', '-e', 'tell app "System Events" to shut down']) except: logging.error(T('Error while shutting down system')) logging.info("Traceback: ", exc_info=True) os._exit(0) def osx_standby(): """ Make OSX system sleep, returns after wakeup """ try: subprocess.call(['osascript', '-e', 'tell app "System Events" to sleep']) time.sleep(10) except: logging.error(T('Failed to standby system')) logging.info("Traceback: ", exc_info=True) def osx_hibernate(): """ Make OSX system sleep, returns after wakeup """ osx_standby() ############################################################################## # Power management for Linux ############################################################################## # Requires DBus plus either HAL [1] or the more modern ConsoleKit [2] and # DeviceKit(-power) [3]. HAL will eventually be deprecated but older systems # might still use it. # [1] http://people.freedesktop.org/~hughsient/temp/dbus-interface.html # [2] http://www.freedesktop.org/software/ConsoleKit/doc/ConsoleKit.html # [3] http://hal.freedesktop.org/docs/DeviceKit-power/ # # Original code was contributed by Marcel de Vries # try: import dbus HAVE_DBUS = True except ImportError: HAVE_DBUS = False _IS_NOT_INTERACTIVE = False _LOGIND_SUCCESSFUL_RESULT = 'yes' def _get_sessionproxy(): """ Return (proxy-object, interface), (None, None) if not available """ name = 'org.freedesktop.PowerManagement' path = '/org/freedesktop/PowerManagement' interface = 'org.freedesktop.PowerManagement' try: bus = dbus.SessionBus() return bus.get_object(name, path), interface except dbus.exceptions.DBusException: return None, None def _get_systemproxy(method): """ Return (proxy-object, interface, pinterface), (None, None, None) if not available """ if method == 'ConsoleKit': name = 'org.freedesktop.ConsoleKit' path = '/org/freedesktop/ConsoleKit/Manager' interface = 'org.freedesktop.ConsoleKit.Manager' pinterface = None elif method == 'DeviceKit': name = 'org.freedesktop.DeviceKit.Power' path = '/org/freedesktop/DeviceKit/Power' interface = 'org.freedesktop.DeviceKit.Power' pinterface = 'org.freedesktop.DBus.Properties' elif method == 'UPower': name = 'org.freedesktop.UPower' path = '/org/freedesktop/UPower' interface = 'org.freedesktop.UPower' pinterface = 'org.freedesktop.DBus.Properties' elif method == 'Logind': name = 'org.freedesktop.login1' path = '/org/freedesktop/login1' interface = 'org.freedesktop.login1.Manager' pinterface = None try: bus = dbus.SystemBus() return bus.get_object(name, path), interface, pinterface except dbus.exceptions.DBusException as msg: logging.info('DBus not reachable (%s)', msg) return None, None, None def linux_shutdown(): """ Make Linux system shutdown, never returns """ if not HAVE_DBUS: os._exit(0) try: proxy, interface = _get_sessionproxy() if proxy: if proxy.CanShutdown(): proxy.Shutdown(dbus_interface=interface) else: proxy, interface, pinterface = _get_systemproxy('Logind') if proxy: if proxy.CanPowerOff(dbus_interface=interface) == _LOGIND_SUCCESSFUL_RESULT: proxy.PowerOff(_IS_NOT_INTERACTIVE, dbus_interface=interface) else: proxy, interface, _pinterface = _get_systemproxy('ConsoleKit') if proxy: if proxy.CanStop(dbus_interface=interface): proxy.Stop(dbus_interface=interface) else: logging.info('DBus does not support Stop (shutdown)') except dbus.exceptions.DBusException as msg: logging.error('Received a DBus exception %s', msg) os._exit(0) def linux_hibernate(): """ Make Linux system go into hibernate, returns after wakeup """ if not HAVE_DBUS: return try: proxy, interface = _get_sessionproxy() if proxy: if proxy.CanHibernate(): proxy.Hibernate(dbus_interface=interface) else: proxy, interface, pinterface = _get_systemproxy('Logind') if proxy: if proxy.CanHibernate(dbus_interface=interface) == _LOGIND_SUCCESSFUL_RESULT: proxy.Hibernate(_IS_NOT_INTERACTIVE, dbus_interface=interface) else: proxy, interface, pinterface = _get_systemproxy('UPower') if not proxy: proxy, interface, pinterface = _get_systemproxy('DeviceKit') if proxy: if proxy.Get(interface, 'can-hibernate', dbus_interface=pinterface): proxy.Hibernate(dbus_interface=interface) else: logging.info('DBus does not support Hibernate') time.sleep(10) except dbus.exceptions.DBusException as msg: logging.error('Received a DBus exception %s', msg) def linux_standby(): """ Make Linux system go into standby, returns after wakeup """ if not HAVE_DBUS: return try: proxy, interface = _get_sessionproxy() if proxy: if proxy.CanSuspend(): proxy.Suspend(dbus_interface=interface) else: proxy, interface, pinterface = _get_systemproxy('Logind') if proxy: if proxy.CanSuspend(dbus_interface=interface) == _LOGIND_SUCCESSFUL_RESULT: proxy.Suspend(_IS_NOT_INTERACTIVE, dbus_interface=interface) else: proxy, interface, pinterface = _get_systemproxy('UPower') if not proxy: proxy, interface, pinterface = _get_systemproxy('DeviceKit') if proxy: if proxy.Get(interface, 'can-suspend', dbus_interface=pinterface): proxy.Suspend(dbus_interface=interface) else: logging.info('DBus does not support Suspend (standby)') time.sleep(10) except dbus.exceptions.DBusException as msg: logging.error('Received a DBus exception %s', msg) sabnzbd-develop/sabnzbd/scheduler.py0000600000175000017500000004063613642116632015721 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.scheduler - Event Scheduler """ import random import logging import time import sabnzbd.utils.kronos as kronos import sabnzbd.rss as rss import sabnzbd.downloader import sabnzbd.dirscanner import sabnzbd.misc import sabnzbd.config as config import sabnzbd.cfg as cfg from sabnzbd.postproc import PostProcessor from sabnzbd.constants import LOW_PRIORITY, NORMAL_PRIORITY, HIGH_PRIORITY __SCHED = None # Global pointer to Scheduler instance SCHEDULE_GUARD_FLAG = False PP_PAUSE_EVENT = False def schedule_guard(): """ Set flag for scheduler restart """ global SCHEDULE_GUARD_FLAG SCHEDULE_GUARD_FLAG = True def pp_pause(): PostProcessor.do.paused = True def pp_resume(): PostProcessor.do.paused = False def pp_pause_event(): return PP_PAUSE_EVENT def init(): """ Create the scheduler and set all required events """ global __SCHED reset_guardian() __SCHED = kronos.ThreadedScheduler() rss_planned = False for schedule in cfg.schedules(): arguments = [] argument_list = None try: enabled, m, h, d, action_name = schedule.split() except: try: enabled, m, h, d, action_name, argument_list = schedule.split(None, 5) except: continue # Bad schedule, ignore if argument_list: arguments = argument_list.split() action_name = action_name.lower() try: m = int(m) h = int(h) except: logging.warning(T('Bad schedule %s at %s:%s'), action_name, m, h) continue if d.isdigit(): d = [int(i) for i in d] else: d = list(range(1, 8)) if action_name == 'resume': action = scheduled_resume arguments = [] elif action_name == 'pause': action = sabnzbd.downloader.Downloader.do.pause arguments = [] elif action_name == 'pause_all': action = sabnzbd.pause_all arguments = [] elif action_name == 'shutdown': action = sabnzbd.shutdown_program arguments = [] elif action_name == 'restart': action = sabnzbd.restart_program arguments = [] elif action_name == 'pause_post': action = pp_pause elif action_name == 'resume_post': action = pp_resume elif action_name == 'speedlimit' and arguments != []: action = sabnzbd.downloader.Downloader.do.limit_speed elif action_name == 'enable_server' and arguments != []: action = sabnzbd.enable_server elif action_name == 'disable_server' and arguments != []: action = sabnzbd.disable_server elif action_name == 'scan_folder': action = sabnzbd.dirscanner.dirscan elif action_name == 'rss_scan': action = rss.run_method rss_planned = True elif action_name == 'remove_failed': action = sabnzbd.api.history_remove_failed elif action_name == 'remove_completed': action = sabnzbd.api.history_remove_completed elif action_name == 'enable_quota': action = sabnzbd.bpsmeter.BPSMeter.do.set_status arguments = [True] elif action_name == 'disable_quota': action = sabnzbd.bpsmeter.BPSMeter.do.set_status arguments = [False] elif action_name == 'pause_all_low': action = sabnzbd.nzbqueue.NzbQueue.do.pause_on_prio arguments = [LOW_PRIORITY] elif action_name == 'pause_all_normal': action = sabnzbd.nzbqueue.NzbQueue.do.pause_on_prio arguments = [NORMAL_PRIORITY] elif action_name == 'pause_all_high': action = sabnzbd.nzbqueue.NzbQueue.do.pause_on_prio arguments = [HIGH_PRIORITY] elif action_name == 'resume_all_low': action = sabnzbd.nzbqueue.NzbQueue.do.resume_on_prio arguments = [LOW_PRIORITY] elif action_name == 'resume_all_normal': action = sabnzbd.nzbqueue.NzbQueue.do.resume_on_prio arguments = [NORMAL_PRIORITY] elif action_name == 'resume_all_high': action = sabnzbd.nzbqueue.NzbQueue.do.resume_on_prio arguments = [HIGH_PRIORITY] elif action_name == 'pause_cat': action = sabnzbd.nzbqueue.NzbQueue.do.pause_on_cat arguments = [argument_list] elif action_name == 'resume_cat': action = sabnzbd.nzbqueue.NzbQueue.do.resume_on_cat arguments = [argument_list] else: logging.warning(T('Unknown action: %s'), action_name) continue if enabled == '1': logging.debug("Scheduling %s(%s) on days %s at %02d:%02d", action_name, arguments, d, h, m) __SCHED.add_daytime_task(action, action_name, d, None, (h, m), kronos.method.sequential, arguments, None) else: logging.debug("Skipping %s(%s) on days %s at %02d:%02d", action_name, arguments, d, h, m) # Set Guardian interval to 30 seconds __SCHED.add_interval_task(sched_guardian, "Guardian", 15, 30, kronos.method.sequential, None, None) # Set RSS check interval if not rss_planned: interval = cfg.rss_rate() delay = random.randint(0, interval - 1) logging.debug("Scheduling RSS interval task every %s min (delay=%s)", interval, delay) sabnzbd.rss.next_run(time.time() + delay * 60) __SCHED.add_interval_task(rss.run_method, "RSS", delay * 60, interval * 60, kronos.method.sequential, None, None) __SCHED.add_single_task(rss.run_method, 'RSS', 15, kronos.method.sequential, None, None) if cfg.version_check(): # Check for new release, once per week on random time m = random.randint(0, 59) h = random.randint(0, 23) d = (random.randint(1, 7), ) logging.debug("Scheduling VersionCheck on day %s at %s:%s", d[0], h, m) __SCHED.add_daytime_task(sabnzbd.misc.check_latest_version, 'VerCheck', d, None, (h, m), kronos.method.sequential, [], None) action, hour, minute = sabnzbd.bpsmeter.BPSMeter.do.get_quota() if action: logging.info('Setting schedule for quota check daily at %s:%s', hour, minute) __SCHED.add_daytime_task(action, 'quota_reset', list(range(1, 8)), None, (hour, minute), kronos.method.sequential, [], None) if sabnzbd.misc.int_conv(cfg.history_retention()) > 0: logging.info('Setting schedule for midnight auto history-purge') __SCHED.add_daytime_task(sabnzbd.database.midnight_history_purge, 'midnight_history_purge', list(range(1, 8)), None, (0, 0), kronos.method.sequential, [], None) logging.info('Setting schedule for midnight BPS reset') __SCHED.add_daytime_task(sabnzbd.bpsmeter.midnight_action, 'midnight_bps', list(range(1, 8)), None, (0, 0), kronos.method.sequential, [], None) # Subscribe to special schedule changes cfg.rss_rate.callback(schedule_guard) def start(): """ Start the scheduler """ global __SCHED if __SCHED: logging.debug('Starting scheduler') __SCHED.start() def restart(force=False): """ Stop and start scheduler """ global __PARMS, SCHEDULE_GUARD_FLAG if force: SCHEDULE_GUARD_FLAG = True else: if SCHEDULE_GUARD_FLAG: SCHEDULE_GUARD_FLAG = False stop() analyse(sabnzbd.downloader.Downloader.do.paused) init() start() def stop(): """ Stop the scheduler, destroy instance """ global __SCHED if __SCHED: logging.debug('Stopping scheduler') try: __SCHED.stop() except IndexError: pass del __SCHED __SCHED = None def abort(): """ Emergency stop, just set the running attribute false """ global __SCHED if __SCHED: logging.debug('Terminating scheduler') __SCHED.running = False def sort_schedules(all_events, now=None): """ Sort the schedules, based on order of happening from now `all_events=True`: Return an event for each active day `all_events=False`: Return only first occurring event of the week `now` : for testing: simulated localtime() """ day_min = 24 * 60 week_min = 7 * day_min events = [] now = now or time.localtime() now_hm = now[3] * 60 + now[4] now = now[6] * day_min + now_hm for schedule in cfg.schedules(): parms = None try: # Note: the last parameter can have spaces (category name)! enabled, m, h, dd, action, parms = schedule.split(None, 5) except: try: enabled, m, h, dd, action = schedule.split(None, 4) except: continue # Bad schedule, ignore action = action.strip() if dd == '*': dd = '1234567' if not dd.isdigit(): continue # Bad schedule, ignore for d in dd: then = (int(d) - 1) * day_min + int(h) * 60 + int(m) dif = then - now if all_events and dif < 0: # Expired event will occur again after a week dif = dif + week_min events.append((dif, action, parms, schedule, enabled)) if not all_events: break events.sort(key=lambda x: x[0]) return events def analyse(was_paused=False, priority=None): """ Determine what pause/resume state we would have now. 'priority': evaluate only effect for given priority, return True for paused """ global PP_PAUSE_EVENT PP_PAUSE_EVENT = False paused = None paused_all = False pause_post = False pause_low = pause_normal = pause_high = False speedlimit = None quota = True servers = {} for ev in sort_schedules(all_events=True): if priority is None: logging.debug('Schedule check result = %s', ev) # Skip if disabled if ev[4] == '0': continue action = ev[1] try: value = ev[2] except: value = None if action == 'pause': paused = True elif action == 'pause_all': paused_all = True PP_PAUSE_EVENT = True elif action == 'resume': paused = False paused_all = False elif action == 'pause_post': pause_post = True PP_PAUSE_EVENT = True elif action == 'resume_post': pause_post = False PP_PAUSE_EVENT = True elif action == 'speedlimit' and value is not None: speedlimit = ev[2] elif action == 'pause_all_low': pause_low = True elif action == 'pause_all_normal': pause_normal = True elif action == 'pause_all_high': pause_high = True elif action == 'resume_all_low': pause_low = False elif action == 'resume_all_normal': pause_normal = False elif action == 'resume_all_high': pause_high = False elif action == 'enable_quota': quota = True elif action == 'disable_quota': quota = False elif action == 'enable_server': try: servers[value] = 1 except: logging.warning(T('Schedule for non-existing server %s'), value) elif action == 'disable_server': try: servers[value] = 0 except: logging.warning(T('Schedule for non-existing server %s'), value) # Special case, a priority was passed, so evaluate only that and return state if priority == LOW_PRIORITY: return pause_low if priority == NORMAL_PRIORITY: return pause_normal if priority == HIGH_PRIORITY: return pause_high if priority is not None: return False # Normal analysis if not was_paused: if paused_all: sabnzbd.pause_all() else: sabnzbd.unpause_all() sabnzbd.downloader.Downloader.do.set_paused_state(paused or paused_all) PostProcessor.do.paused = pause_post if speedlimit is not None: sabnzbd.downloader.Downloader.do.limit_speed(speedlimit) sabnzbd.bpsmeter.BPSMeter.do.set_status(quota, action=False) for serv in servers: try: item = config.get_config('servers', serv) value = servers[serv] if bool(item.enable()) != bool(value): item.enable.set(value) sabnzbd.downloader.Downloader.do.init_server(serv, serv) except: pass config.save_config() # Support for single shot pause (=delayed resume) __PAUSE_END = None # Moment when pause will end def scheduled_resume(): """ Scheduled resume, only when no oneshot resume is active """ global __PAUSE_END if __PAUSE_END is None: sabnzbd.unpause_all() def __oneshot_resume(when): """ Called by delayed resume schedule Only resumes if call comes at the planned time """ global __PAUSE_END if __PAUSE_END is not None and (when > __PAUSE_END - 5) and (when < __PAUSE_END + 55): __PAUSE_END = None logging.debug('Resume after pause-interval') sabnzbd.unpause_all() else: logging.debug('Ignoring cancelled resume') def plan_resume(interval): """ Set a scheduled resume after the interval """ global __SCHED, __PAUSE_END if interval > 0: __PAUSE_END = time.time() + (interval * 60) logging.debug('Schedule resume at %s', __PAUSE_END) __SCHED.add_single_task(__oneshot_resume, '', interval * 60, kronos.method.sequential, [__PAUSE_END], None) sabnzbd.downloader.Downloader.do.pause() else: __PAUSE_END = None sabnzbd.unpause_all() def pause_int(): """ Return minutes:seconds until pause ends """ global __PAUSE_END if __PAUSE_END is None: return "0" else: val = __PAUSE_END - time.time() if val < 0: sign = '-' val = abs(val) else: sign = '' min = int(val / 60) sec = int(val - min * 60) return "%s%d:%02d" % (sign, min, sec) def pause_check(): """ Unpause when time left is negative, compensate for missed schedule """ global __PAUSE_END if __PAUSE_END is not None and (__PAUSE_END - time.time()) < 0: __PAUSE_END = None logging.debug('Force resume, negative timer') sabnzbd.unpause_all() def plan_server(action, parms, interval): """ Plan to re-activate server after 'interval' minutes """ __SCHED.add_single_task(action, '', interval * 60, kronos.method.sequential, parms, None) def force_rss(): """ Add a one-time RSS scan, one second from now """ __SCHED.add_single_task(rss.run_method, 'RSS', 1, kronos.method.sequential, None, None) # Scheduler Guarding system # Each check sets the guardian flag False # Each successful scheduled check sets the flag # If 4 consecutive checks fail, the scheduler is assumed to have crashed __SCHED_GUARDIAN = False __SCHED_GUARDIAN_CNT = 0 def reset_guardian(): global __SCHED_GUARDIAN, __SCHED_GUARDIAN_CNT __SCHED_GUARDIAN = False __SCHED_GUARDIAN_CNT = 0 def sched_guardian(): global __SCHED_GUARDIAN, __SCHED_GUARDIAN_CNT __SCHED_GUARDIAN = True def sched_check(): global __SCHED_GUARDIAN, __SCHED_GUARDIAN_CNT if not __SCHED_GUARDIAN: __SCHED_GUARDIAN_CNT += 1 return __SCHED_GUARDIAN_CNT < 4 reset_guardian() return True sabnzbd-develop/sabnzbd/sabtray.py0000600000175000017500000001451213642116632015402 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabtray.py - Systray icon for SABnzbd on Windows, contributed by Jan Schejbal """ import os import logging from time import sleep import sabnzbd from sabnzbd.panic import launch_a_browser import sabnzbd.api as api import sabnzbd.scheduler as scheduler from sabnzbd.downloader import Downloader import sabnzbd.cfg as cfg from sabnzbd.misc import to_units # contains the tray icon, which demands its own thread from sabnzbd.utils.systrayiconthread import SysTrayIconThread class SABTrayThread(SysTrayIconThread): sabicons = { 'default': 'icons/sabnzbd16_32.ico', 'green': 'icons/sabnzbd16_32green.ico', 'pause': 'icons/sabnzbd16_32paused.ico' } def __init__(self): # Wait for translated texts to be loaded while not sabnzbd.WEBUI_READY: sleep(0.2) logging.debug('language file not loaded, waiting') self.sabpaused = False self.counter = 0 self.set_texts() menu_options = ( (T('Show interface'), None, self.browse), (T('Open complete folder'), None, self.opencomplete), ('SEPARATOR', None, None), (T('Pause') + '/' + T('Resume'), None, self.pauseresume), (T('Pause for'), None, ((T('Pause for 5 minutes'), None, self.pausefor5min), (T('Pause for 15 minutes'), None, self.pausefor15min), (T('Pause for 30 minutes'), None, self.pausefor30min), (T('Pause for 1 hour'), None, self.pausefor1hour), (T('Pause for 3 hours'), None, self.pausefor3hour), (T('Pause for 6 hours'), None, self.pausefor6hour))), ('SEPARATOR', None, None), (T('Read all RSS feeds'), None, self.rss), ('SEPARATOR', None, None), (T('Troubleshoot'), None, ((T('Restart'), None, self.restart_sab), (T('Restart without login'), None, self.nologin), (T('Restart') + ' - 127.0.0.1:8080', None, self.defhost))), (T('Shutdown'), None, self.shutdown), ) SysTrayIconThread.__init__(self, self.sabicons['default'], "SABnzbd", menu_options, None, 0, "SabTrayIcon") def set_texts(self): """ Cache texts for performance, doUpdates is called often """ self.txt_idle = T('Idle') self.txt_paused = T('Paused') self.txt_remaining = T('Remaining') # called every few ms by SysTrayIconThread def doUpdates(self): """ Update menu info, once every 10 calls """ self.counter += 1 if self.counter > 10: self.sabpaused, bytes_left, bpsnow, time_left = api.fast_queue() mb_left = to_units(bytes_left) speed = to_units(bpsnow) if self.sabpaused: if bytes_left > 0: self.hover_text = "%s - %s: %sB" % (self.txt_paused, self.txt_remaining, mb_left) else: self.hover_text = self.txt_paused self.icon = self.sabicons['pause'] elif bytes_left > 0: self.hover_text = "%sB/s - %s: %sB (%s)" % (speed, self.txt_remaining, mb_left, time_left) self.icon = self.sabicons['green'] else: self.hover_text = self.txt_idle self.icon = self.sabicons['default'] self.refresh_icon() self.counter = 0 # left-click handler def click(self, *args): # Make sure to stop the timer self.stop_click_timer() # Pause/resume and force update of icon/text self.pauseresume(None) self.counter = 11 # menu handler def opencomplete(self, icon): try: os.startfile(cfg.complete_dir.get_path()) except WindowsError: pass # menu handler def browse(self, icon): launch_a_browser(sabnzbd.BROWSER_URL, True) # menu handler def pauseresume(self, icon): if self.sabpaused: self.resume() else: self.pause() def pausefor(self, minutes): """ Need function for each pause-timer """ scheduler.plan_resume(minutes) def pausefor5min(self, icon): self.pausefor(5) def pausefor15min(self, icon): self.pausefor(15) def pausefor30min(self, icon): self.pausefor(30) def pausefor1hour(self, icon): self.pausefor(60) def pausefor3hour(self, icon): self.pausefor(3*60) def pausefor6hour(self, icon): self.pausefor(6*60) def restart_sab(self, icon): self.hover_text = T('Restart') logging.info('Restart requested by tray') sabnzbd.trigger_restart() def rss(self, icon): self.hover_text = T('Read all RSS feeds') scheduler.force_rss() def nologin(self, icon): sabnzbd.cfg.username.set('') sabnzbd.cfg.password.set('') sabnzbd.config.save_config() self.hover_text = T('Restart') sabnzbd.trigger_restart() def defhost(self, icon): sabnzbd.cfg.cherryhost.set('127.0.0.1') sabnzbd.cfg.enable_https.set(False) sabnzbd.config.save_config() self.hover_text = T('Restart') sabnzbd.trigger_restart() def shutdown(self, icon): self.hover_text = T('Shutdown') sabnzbd.shutdown_program() def pause(self): scheduler.plan_resume(0) Downloader.do.pause() def resume(self): scheduler.plan_resume(0) sabnzbd.unpause_all() sabnzbd-develop/sabnzbd/constants.py0000600000175000017500000001225713642116632015755 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os from collections import namedtuple from re import compile CONFIG_VERSION = 19 QUEUE_VERSION = 10 POSTPROC_QUEUE_VERSION = 2 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", ) QNFO = namedtuple("QNFO", "bytes bytes_left bytes_left_previous_page list q_size_list q_fullsize") ANFO = namedtuple("ANFO", "article_sum cache_size cache_limit") GIGI = float(2 ** 30) MEBI = float(2 ** 20) KIBI = float(2 ** 10) BYTES_FILE_NAME_OLD = "totals9.sab" BYTES_FILE_NAME = "totals10.sab" QUEUE_FILE_TMPL = "queue%s.sab" QUEUE_FILE_NAME = QUEUE_FILE_TMPL % QUEUE_VERSION POSTPROC_QUEUE_FILE_NAME = "postproc%s.sab" % POSTPROC_QUEUE_VERSION RSS_FILE_NAME = "rss_data.sab" SCAN_FILE_NAME = "watched_data2.sab" FUTURE_Q_FOLDER = "future" JOB_ADMIN = "__ADMIN__" VERIFIED_FILE = "__verified__" RENAMES_FILE = "__renames__" ATTRIB_FILE = "SABnzbd_attrib" REPAIR_REQUEST = "repair-all.sab" SABYENC_VERSION_REQUIRED = "4.0.0" DB_HISTORY_VERSION = 1 DB_HISTORY_NAME = "history%s.db" % DB_HISTORY_VERSION DEF_DOWNLOAD_DIR = os.path.normpath("Downloads/incomplete") DEF_COMPLETE_DIR = os.path.normpath("Downloads/complete") DEF_ADMIN_DIR = "admin" DEF_NZBBACK_DIR = "" DEF_LANGUAGE = "locale" DEF_INTERFACES = "interfaces" DEF_EMAIL_TMPL = "email" DEF_STDCONFIG = "Config" DEF_STDINTF = "Glitter" DEF_SKIN_COLORS = {"Glitter": "Default", "plush": "gold"} DEF_MAIN_TMPL = os.path.normpath("templates/main.tmpl") DEF_INI_FILE = "sabnzbd.ini" DEF_HOST = "127.0.0.1" DEF_PORT = 8080 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_TIMEOUT = 60 DEF_SCANRATE = 5 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 HIGH_PRIORITY = 1 NORMAL_PRIORITY = 0 LOW_PRIORITY = -1 DEFAULT_PRIORITY = -100 PAUSED_PRIORITY = -2 DUP_PRIORITY = -3 STOP_PRIORITY = -4 STAGES = {"Source": 0, "Download": 1, "Servers": 2, "Repair": 3, "Filejoin": 4, "Unpack": 5, "Script": 6} VALID_ARCHIVES = (".zip", ".rar", ".7z") VALID_NZB_FILES = (".nzb", ".gz", ".bz2") CHEETAH_DIRECTIVES = {"directiveStartToken": "", "prioritizeSearchListOverSelf": True} IGNORED_FOLDERS = ("@eaDir", ".appleDouble") # (MATCHER, [EXTRA, MATCHERS]) series_match = [ (compile(r"( [sS]|[\d]+)x(\d+)"), [compile(r"^[-\.]+([sS]|[\d])+x(\d+)"), compile(r"^[-\.](\d+)")]), # 1x01 ( compile(r"[Ss](\d+)[\.\-]?[Ee](\d+)"), # S01E01 [compile(r"^[-\.]+[Ss](\d+)[\.\-]?[Ee](\d+)"), compile(r"^[-\.](\d+)")], ), (compile(r"[ \-_\.](\d)(\d{2,2})[ \-_\.]"), []), # .101. / _101_ / etc. (compile(r"[ \-_\.](\d)(\d{2,2})$"), []), # .101 at end of title ] date_match = [r"(\d{4})\W(\d{1,2})\W(\d{1,2})", r"(\d{1,2})\W(\d{1,2})\W(\d{4})"] # 2008-10-16 # 10.16.2008 year_match = r"[\W]([1|2]\d{3})([^\w]|$)" # Something '(YYYY)' or '.YYYY.' or ' YYYY ' sample_match = r"((^|[\W_])(sample|proof))" # something-sample or something-proof class Status: COMPLETED = "Completed" # PP: Job is finished CHECKING = "Checking" # Q: Pre-check is running DOWNLOADING = "Downloading" # Q: Normal downloading EXTRACTING = "Extracting" # PP: Archives are being extracted FAILED = "Failed" # PP: Job has failed, now in History FETCHING = "Fetching" # Q: Job is downloading extra par2 files GRABBING = "Grabbing" # Q: Getting an NZB from an external site MOVING = "Moving" # PP: Files are being moved PAUSED = "Paused" # Q: Job is paused QUEUED = "Queued" # Q: Job is waiting for its turn to download QUICK_CHECK = "QuickCheck" # PP: QuickCheck verification is running REPAIRING = "Repairing" # PP: Job is being repaired (by par2) RUNNING = "Running" # PP: User's post processing script is running VERIFYING = "Verifying" # PP: Job is being verified (by par2) DELETED = "Deleted" # Q: Job has been deleted (and is almost gone) PROP = "Propagating" # Q: Delayed download NOTIFY_KEYS = ( "startup", "download", "pp", "complete", "failed", "queue_done", "disk_full", "new_login", "warning", "error", "other", ) sabnzbd-develop/sabnzbd/postproc.py0000600000175000017500000012564513642116632015620 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.postproc - threaded post-processing of jobs """ import os import logging import sabnzbd import xml.sax.saxutils import functools import time import re import queue from sabnzbd.newsunpack import unpack_magic, par2_repair, external_processing, sfv_check, build_filelists, rar_sort from threading import Thread from sabnzbd.misc import on_cleanup_list from sabnzbd.filesystem import ( real_path, get_unique_path, move_to_path, make_script_path, long_path, clip_path, renamer, remove_dir, globber, globber_full, set_permissions, cleanup_empty_directories, fix_unix_encoding, sanitize_and_trim_path, sanitize_files_in_folder, remove_file, recursive_listdir, setname_from_path, create_all_dirs, get_unique_filename, ) from sabnzbd.sorting import Sorter from sabnzbd.constants import ( REPAIR_PRIORITY, TOP_PRIORITY, POSTPROC_QUEUE_FILE_NAME, POSTPROC_QUEUE_VERSION, sample_match, JOB_ADMIN, Status, VERIFIED_FILE, ) from sabnzbd.rating import Rating import sabnzbd.emailer as emailer import sabnzbd.dirscanner as dirscanner import sabnzbd.downloader import sabnzbd.config as config import sabnzbd.cfg as cfg import sabnzbd.encoding as encoding import sabnzbd.nzbqueue import sabnzbd.database as database import sabnzbd.notifier as notifier import sabnzbd.utils.rarfile as rarfile import sabnzbd.utils.rarvolinfo as rarvolinfo import sabnzbd.utils.checkdir MAX_FAST_JOB_COUNT = 3 # Match samples RE_SAMPLE = re.compile(sample_match, re.I) class PostProcessor(Thread): """ PostProcessor thread, designed as Singleton """ do = None # Link to instance of the thread def __init__(self): """ Initialize PostProcessor thread """ Thread.__init__(self) # This history queue is simply used to log what active items to display in the web_ui self.load() if self.history_queue is None: self.history_queue = [] # Fast-queue for jobs already finished by DirectUnpack self.fast_queue = queue.Queue() # Regular queue for jobs that might need more attention self.slow_queue = queue.Queue() # Load all old jobs for nzo in self.history_queue: self.process(nzo) # Counter to not only process fast-jobs self.__fast_job_count = 0 # State variables self.__stop = False self.__busy = False self.paused = False PostProcessor.do = self def save(self): """ Save postproc queue """ logging.info("Saving postproc queue") sabnzbd.save_admin((POSTPROC_QUEUE_VERSION, self.history_queue), POSTPROC_QUEUE_FILE_NAME) def load(self): """ Save postproc queue """ self.history_queue = [] logging.info("Loading postproc queue") data = sabnzbd.load_admin(POSTPROC_QUEUE_FILE_NAME) if data is None: return try: version, history_queue = data if POSTPROC_QUEUE_VERSION != version: logging.warning(T("Old queue detected, use Status->Repair to convert the queue")) elif isinstance(history_queue, list): self.history_queue = [nzo for nzo in history_queue if os.path.exists(nzo.downpath)] except: logging.info("Corrupt %s file, discarding", POSTPROC_QUEUE_FILE_NAME) logging.info("Traceback: ", exc_info=True) def delete(self, nzo_id, del_files=False): """ Remove a job from the post processor queue """ for nzo in self.history_queue: if nzo.nzo_id == nzo_id: if nzo.status in (Status.FAILED, Status.COMPLETED): nzo.to_be_removed = True elif nzo.status in (Status.DOWNLOADING, Status.QUEUED): self.remove(nzo) nzo.purge_data(delete_all_data=del_files) logging.info("Removed job %s from postproc queue", nzo.final_name) nzo.work_name = "" # Mark as deleted job break def process(self, nzo): """ Push on finished job in the queue """ if nzo not in self.history_queue: self.history_queue.append(nzo) # Fast-track if it has DirectUnpacked jobs or if it's still going if nzo.direct_unpacker and (nzo.direct_unpacker.success_sets or not nzo.direct_unpacker.killed): self.fast_queue.put(nzo) else: self.slow_queue.put(nzo) self.save() sabnzbd.history_updated() def remove(self, nzo): """ Remove given nzo from the queue """ try: self.history_queue.remove(nzo) except: pass self.save() sabnzbd.history_updated() def stop(self): """ Stop thread after finishing running job """ self.__stop = True self.slow_queue.put(None) self.fast_queue.put(None) def cancel_pp(self, nzo_id): """ Change the status, so that the PP is canceled """ for nzo in self.history_queue: if nzo.nzo_id == nzo_id: nzo.abort_direct_unpacker() if nzo.pp_active: nzo.pp_active = False return True return None def empty(self): """ Return True if pp queue is empty """ return self.slow_queue.empty() and self.fast_queue.empty() and not self.__busy def get_queue(self): """ Return list of NZOs that still need to be processed """ return [nzo for nzo in self.history_queue if nzo.work_name] def get_path(self, nzo_id): """ Return download path for given nzo_id or None when not found """ for nzo in self.history_queue: if nzo.nzo_id == nzo_id: return nzo.downpath return None def run(self): """ Postprocessor loop """ # First we do a dircheck complete_dir = sabnzbd.cfg.complete_dir.get_path() if sabnzbd.utils.checkdir.isFAT(complete_dir): logging.warning( T("Completed Download Folder %s is on FAT file system, limiting maximum file size to 4GB") % complete_dir ) else: logging.info("Completed Download Folder %s is not on FAT", complete_dir) # Start looping check_eoq = False while not self.__stop: self.__busy = False if self.paused: time.sleep(5) continue # Something in the fast queue? try: # Every few fast-jobs we should check allow a # slow job so that they don't wait forever if self.__fast_job_count >= MAX_FAST_JOB_COUNT and self.slow_queue.qsize(): raise queue.Empty nzo = self.fast_queue.get(timeout=2) self.__fast_job_count += 1 except queue.Empty: # Try the slow queue try: nzo = self.slow_queue.get(timeout=2) # Reset fast-counter self.__fast_job_count = 0 except queue.Empty: # Check for empty queue if check_eoq: check_eoq = False handle_empty_queue() # No fast or slow jobs, better luck next loop! continue # Stop job if not nzo: continue # Job was already deleted. if not nzo.work_name: check_eoq = True continue # Flag NZO as being processed nzo.pp_active = True # Pause downloader, if users wants that if cfg.pause_on_post_processing(): sabnzbd.downloader.Downloader.do.wait_for_postproc() self.__busy = True process_job(nzo) if nzo.to_be_removed: history_db = database.HistoryDB() history_db.remove_history(nzo.nzo_id) history_db.close() nzo.purge_data() # Processing done nzo.pp_active = False self.remove(nzo) check_eoq = True # Allow download to proceed sabnzbd.downloader.Downloader.do.resume_from_postproc() def process_job(nzo): """ Process one job """ start = time.time() # keep track of whether we can continue all_ok = True # keep track of par problems par_error = False # keep track of any unpacking errors unpack_error = False # Signal empty download, for when 'empty_postproc' is enabled empty = False nzb_list = [] # These need to be initialized in case of a crash workdir_complete = "" script_log = "" script_line = "" # Get the job flags nzo.save_attribs() flag_repair, flag_unpack, flag_delete = nzo.repair_opts # Normalize PP if flag_delete: flag_unpack = True if flag_unpack: flag_repair = True # Get the NZB name filename = nzo.final_name if nzo.fail_msg: # Special case: aborted due to too many missing data nzo.status = Status.FAILED nzo.save_attribs() all_ok = False par_error = True unpack_error = 1 try: # Get the folder containing the download result workdir = nzo.downpath tmp_workdir_complete = None # if no files are present (except __admin__), fail the job if all_ok and len(globber(workdir)) < 2: if nzo.precheck: _enough, ratio = nzo.check_availability_ratio() req_ratio = float(cfg.req_completion_rate()) / 100.0 # Make sure that rounded ratio doesn't equal required ratio # when it is actually below required if (ratio < req_ratio) and (req_ratio - ratio) < 0.001: ratio = req_ratio - 0.001 emsg = "%.1f%%" % (ratio * 100.0) emsg2 = "%.1f%%" % float(cfg.req_completion_rate()) emsg = T("Download might fail, only %s of required %s available") % (emsg, emsg2) else: emsg = T("Download failed - Not on your server(s)") empty = True emsg += " - https://sabnzbd.org/not-complete" nzo.fail_msg = emsg nzo.set_unpack_info("Fail", emsg) nzo.status = Status.FAILED # do not run unpacking or parity verification flag_repair = flag_unpack = False all_ok = cfg.empty_postproc() and empty if not all_ok: par_error = True unpack_error = 1 script = nzo.script logging.info( "Starting Post-Processing on %s => Repair:%s, Unpack:%s, Delete:%s, Script:%s, Cat:%s", filename, flag_repair, flag_unpack, flag_delete, script, nzo.cat, ) # Set complete dir to workdir in case we need to abort workdir_complete = workdir # Par processing, if enabled if all_ok and flag_repair: par_error, re_add = parring(nzo, workdir) if re_add: # Try to get more par files return False # If we don't need extra par2, we can disconnect if sabnzbd.nzbqueue.NzbQueue.do.actives(grabs=False) == 0 and cfg.autodisconnect(): # This was the last job, close server connections sabnzbd.downloader.Downloader.do.disconnect() # Sanitize the resulting files if sabnzbd.WIN32: sanitize_files_in_folder(workdir) # Check if user allows unsafe post-processing if flag_repair and cfg.safe_postproc(): all_ok = all_ok and not par_error if all_ok: # Fix encodings fix_unix_encoding(workdir) # Use dirs generated by direct-unpacker if nzo.direct_unpacker and nzo.direct_unpacker.unpack_dir_info: ( tmp_workdir_complete, workdir_complete, file_sorter, one_folder, marker_file, ) = nzo.direct_unpacker.unpack_dir_info else: # Generate extraction path tmp_workdir_complete, workdir_complete, file_sorter, one_folder, marker_file = prepare_extraction_path( nzo ) newfiles = [] # Run Stage 2: Unpack if flag_unpack: # Set the current nzo status to "Extracting...". Used in History nzo.status = Status.EXTRACTING logging.info("Running unpack_magic on %s", filename) unpack_error, newfiles = unpack_magic( nzo, workdir, tmp_workdir_complete, flag_delete, one_folder, (), (), (), (), () ) logging.info("Unpacked files %s", newfiles) if sabnzbd.WIN32: # Sanitize the resulting files newfiles = sanitize_files_in_folder(tmp_workdir_complete) logging.info("Finished unpack_magic on %s", filename) if cfg.safe_postproc(): all_ok = all_ok and not unpack_error if all_ok: # Move any (left-over) files to destination nzo.status = Status.MOVING nzo.set_action_line(T("Moving"), "...") for root, _dirs, files in os.walk(workdir): if not root.endswith(JOB_ADMIN): for file_ in files: path = os.path.join(root, file_) new_path = path.replace(workdir, tmp_workdir_complete) ok, new_path = move_to_path(path, new_path) if new_path: newfiles.append(new_path) if not ok: nzo.set_unpack_info("Unpack", T("Failed moving %s to %s") % (path, new_path)) all_ok = False break # Set permissions right set_permissions(tmp_workdir_complete) if all_ok and marker_file: del_marker(os.path.join(tmp_workdir_complete, marker_file)) remove_from_list(marker_file, newfiles) if all_ok: # Remove files matching the cleanup list cleanup_list(tmp_workdir_complete, True) # Check if this is an NZB-only download, if so redirect to queue # except when PP was Download-only if flag_repair: nzb_list = nzb_redirect( tmp_workdir_complete, nzo.final_name, nzo.pp, script, nzo.cat, priority=nzo.priority ) else: nzb_list = None if nzb_list: nzo.set_unpack_info("Download", T("Sent %s to queue") % nzb_list) cleanup_empty_directories(tmp_workdir_complete) else: cleanup_list(tmp_workdir_complete, False) script_output = "" script_ret = 0 if not nzb_list: # Give destination its final name if cfg.folder_rename() and tmp_workdir_complete and not one_folder: if all_ok: try: newfiles = rename_and_collapse_folder(tmp_workdir_complete, workdir_complete, newfiles) except: logging.error( T('Error renaming "%s" to "%s"'), clip_path(tmp_workdir_complete), clip_path(workdir_complete), ) logging.info("Traceback: ", exc_info=True) # Better disable sorting because filenames are all off now file_sorter.sort_file = None else: workdir_complete = tmp_workdir_complete.replace("_UNPACK_", "_FAILED_") workdir_complete = get_unique_path(workdir_complete, n=0, create_dir=False) if empty: job_result = -1 else: job_result = int(par_error) + int(bool(unpack_error)) * 2 if cfg.ignore_samples(): remove_samples(workdir_complete) # TV/Movie/Date Renaming code part 2 - rename and move files to parent folder if all_ok and file_sorter.sort_file: if newfiles: file_sorter.rename(newfiles, workdir_complete) workdir_complete, ok = file_sorter.move(workdir_complete) else: workdir_complete, ok = file_sorter.rename_with_ext(workdir_complete) if not ok: nzo.set_unpack_info("Unpack", T("Failed to move files")) all_ok = False # Run the user script script_path = make_script_path(script) if (all_ok or not cfg.safe_postproc()) and (not nzb_list) and script_path: # Set the current nzo status to "Ext Script...". Used in History nzo.status = Status.RUNNING nzo.set_action_line(T("Running script"), script) nzo.set_unpack_info("Script", T("Running user script %s") % script, unique=True) script_log, script_ret = external_processing( script_path, nzo, clip_path(workdir_complete), nzo.final_name, job_result ) script_line = get_last_line(script_log) if script_log: script_output = nzo.nzo_id if script_line: nzo.set_unpack_info("Script", script_line, unique=True) else: nzo.set_unpack_info("Script", T("Ran %s") % script, unique=True) else: script = "" script_line = "" script_ret = 0 # Maybe bad script result should fail job if script_ret and cfg.script_can_fail(): script_error = True all_ok = False nzo.fail_msg = T("Script exit code is %s") % script_ret else: script_error = False # Email the results if (not nzb_list) and cfg.email_endjob(): if (cfg.email_endjob() == 1) or (cfg.email_endjob() == 2 and (unpack_error or par_error or script_error)): emailer.endjob( nzo.final_name, nzo.cat, all_ok, workdir_complete, nzo.bytes_downloaded, nzo.fail_msg, nzo.unpack_info, script, script_log, script_ret, ) if script_output: # Can do this only now, otherwise it would show up in the email if script_ret: script_ret = "Exit(%s) " % script_ret else: script_ret = "" if len(script_log.rstrip().split("\n")) > 1: nzo.set_unpack_info( "Script", '%s%s (%s)' % (script_ret, script_line, encoding.xml_name(script_output), T("More")), unique=True, ) else: # No '(more)' button needed nzo.set_unpack_info("Script", "%s%s " % (script_ret, script_line), unique=True) # Cleanup again, including NZB files if all_ok: cleanup_list(workdir_complete, False) # Force error for empty result all_ok = all_ok and not empty # Update indexer with results if cfg.rating_enable(): if nzo.encrypted > 0: Rating.do.update_auto_flag(nzo.nzo_id, Rating.FLAG_ENCRYPTED) if empty: hosts = [s.host for s in sabnzbd.downloader.Downloader.do.nzo_servers(nzo)] if not hosts: hosts = [None] for host in hosts: Rating.do.update_auto_flag(nzo.nzo_id, Rating.FLAG_EXPIRED, host) except: logging.error(T("Post Processing Failed for %s (%s)"), filename, T("see logfile")) logging.info("Traceback: ", exc_info=True) nzo.fail_msg = T("PostProcessing was aborted (%s)") % T("see logfile") notifier.send_notification(T("Download Failed"), filename, "failed", nzo.cat) nzo.status = Status.FAILED par_error = True all_ok = False if cfg.email_endjob(): emailer.endjob( nzo.final_name, nzo.cat, all_ok, clip_path(workdir_complete), nzo.bytes_downloaded, nzo.fail_msg, nzo.unpack_info, "", "", 0, ) if all_ok: # If the folder only contains one file OR folder, have that as the path # Be aware that series/generic/date sorting may move a single file into a folder containing other files workdir_complete = one_file_or_folder(workdir_complete) workdir_complete = os.path.normpath(workdir_complete) # Clean up the NZO data try: nzo.purge_data(delete_all_data=all_ok) except: logging.error(T("Cleanup of %s failed."), nzo.final_name) logging.info("Traceback: ", exc_info=True) # Use automatic retry link on par2 errors and encrypted/bad RARs if par_error or unpack_error in (2, 3): try_alt_nzb(nzo) # Show final status in history if all_ok: notifier.send_notification(T("Download Completed"), filename, "complete", nzo.cat) nzo.status = Status.COMPLETED else: notifier.send_notification(T("Download Failed"), filename, "failed", nzo.cat) nzo.status = Status.FAILED # Log the overall time taken for postprocessing postproc_time = int(time.time() - start) # Create the history DB instance history_db = database.HistoryDB() # Add the nzo to the database. Only the path, script and time taken is passed # Other information is obtained from the nzo history_db.add_history_db(nzo, clip_path(workdir_complete), nzo.downpath, postproc_time, script_log, script_line) # Purge items history_db.auto_history_purge() # The connection is only used once, so close it here history_db.close() sabnzbd.history_updated() return True def prepare_extraction_path(nzo): """ Based on the information that we have, generate the extraction path and create the directory. Separated so it can be called from DirectUnpacker """ one_folder = False marker_file = None # Determine class directory catdir = config.get_categories(nzo.cat).dir() if catdir.endswith("*"): catdir = catdir.strip("*") one_folder = True complete_dir = real_path(cfg.complete_dir.get_path(), catdir) complete_dir = long_path(complete_dir) # TV/Movie/Date Renaming code part 1 - detect and construct paths if cfg.enable_meta(): file_sorter = Sorter(nzo, nzo.cat) else: file_sorter = Sorter(None, nzo.cat) complete_dir = file_sorter.detect(nzo.final_name, complete_dir) if file_sorter.sort_file: one_folder = False complete_dir = sanitize_and_trim_path(complete_dir) if one_folder: workdir_complete = create_all_dirs(complete_dir, umask=True) else: workdir_complete = get_unique_path(os.path.join(complete_dir, nzo.final_name), create_dir=True) marker_file = set_marker(workdir_complete) if not workdir_complete or not os.path.exists(workdir_complete): logging.error(T("Cannot create final folder %s") % os.path.join(complete_dir, nzo.final_name)) raise IOError if cfg.folder_rename() and not one_folder: prefixed_path = prefix(workdir_complete, "_UNPACK_") tmp_workdir_complete = get_unique_path(prefix(workdir_complete, "_UNPACK_"), create_dir=False) try: renamer(workdir_complete, tmp_workdir_complete) except: pass # On failure, just use the original name # Is the unique path different? Then we also need to modify the final path if prefixed_path != tmp_workdir_complete: workdir_complete = workdir_complete + os.path.splitext(tmp_workdir_complete)[1] else: tmp_workdir_complete = workdir_complete return tmp_workdir_complete, workdir_complete, file_sorter, one_folder, marker_file def parring(nzo, workdir): """ Perform par processing. Returns: (par_error, re_add) """ filename = nzo.final_name notifier.send_notification(T("Post-processing"), filename, "pp", nzo.cat) logging.info("Starting verification and repair of %s", filename) # Get verification status of sets verified = sabnzbd.load_data(VERIFIED_FILE, nzo.workpath, remove=False) or {} repair_sets = list(nzo.extrapars.keys()) re_add = False par_error = False single = len(repair_sets) == 1 if repair_sets: for setname in repair_sets: if cfg.ignore_samples() and RE_SAMPLE.search(setname.lower()): continue if not verified.get(setname, False): logging.info("Running verification and repair on set %s", setname) parfile_nzf = nzo.partable[setname] # Check if file maybe wasn't deleted and if we maybe have more files in the parset if os.path.exists(os.path.join(nzo.downpath, parfile_nzf.filename)) or nzo.extrapars[setname]: need_re_add, res = par2_repair(parfile_nzf, nzo, workdir, setname, single=single) # Was it aborted? if not nzo.pp_active: re_add = False par_error = True break re_add = re_add or need_re_add verified[setname] = res else: continue par_error = par_error or not res else: # We must not have found any par2.. logging.info("No par2 sets for %s", filename) nzo.set_unpack_info("Repair", T("[%s] No par2 sets") % filename) if cfg.sfv_check() and not verified.get("", False): par_error = not try_sfv_check(nzo, workdir) verified[""] = not par_error # If still no success, do RAR-check or RAR-rename if not par_error and cfg.enable_unrar(): _, _, rars, _, _ = build_filelists(workdir) # If there's no RAR's, they might be super-obfuscated if not rars: # Returns number of renamed RAR's if rar_renamer(nzo, workdir): # Re-parse the files so we can do RAR-check _, _, rars, _, _ = build_filelists(workdir) if rars: par_error = not try_rar_check(nzo, rars) verified[""] = not par_error if re_add: logging.info("Re-added %s to queue", filename) if nzo.priority != TOP_PRIORITY: nzo.priority = REPAIR_PRIORITY nzo.status = Status.FETCHING sabnzbd.nzbqueue.NzbQueue.do.add(nzo) sabnzbd.downloader.Downloader.do.resume_from_postproc() sabnzbd.save_data(verified, VERIFIED_FILE, nzo.workpath) logging.info("Verification and repair finished for %s", filename) return par_error, re_add def try_sfv_check(nzo, workdir): """ Attempt to verify set using SFV file Return True if verified, False when failed """ # Get list of SFV names; shortest name first, minimizes the chance on a mismatch sfvs = globber_full(workdir, "*.sfv") sfvs.sort(key=lambda x: len(x)) par_error = False found = False for sfv in sfvs: found = True setname = setname_from_path(sfv) nzo.status = Status.VERIFYING nzo.set_unpack_info("Repair", T("Trying SFV verification"), setname) nzo.set_action_line(T("Trying SFV verification"), "...") failed = sfv_check(sfv) if failed: fail_msg = T('Some files failed to verify against "%s"') % setname msg = fail_msg + "; " msg += "; ".join(failed) nzo.set_unpack_info("Repair", msg, setname) par_error = True else: nzo.set_unpack_info("Repair", T("Verified successfully using SFV files"), setname) # Show error in GUI if found and par_error: nzo.status = Status.FAILED nzo.fail_msg = fail_msg return False # Success or just no SFV's return True def try_rar_check(nzo, rars): """ Attempt to verify set using the RARs Return True if verified, False when failed When setname is '', all RAR files will be used, otherwise only the matching one If no RAR's are found, returns True """ # Sort for better processing rars.sort(key=functools.cmp_to_key(rar_sort)) # Test if rars: setname = setname_from_path(rars[0]) nzo.status = Status.VERIFYING nzo.set_unpack_info("Repair", T("Trying RAR-based verification"), setname) nzo.set_action_line(T("Trying RAR-based verification"), "...") try: # Set path to unrar and open the file # Requires de-unicode for RarFile to work! rarfile.UNRAR_TOOL = sabnzbd.newsunpack.RAR_COMMAND zf = rarfile.RarFile(rars[0]) # Skip if it's encrypted if zf.needs_password(): msg = T("[%s] RAR-based verification failed: %s") % (setname, T("Passworded")) nzo.set_unpack_info("Repair", msg) return True # Will throw exception if something is wrong zf.testrar() # Success! msg = T("RAR files verified successfully") nzo.set_unpack_info("Repair", msg, setname) logging.info(msg) return True except rarfile.Error as e: nzo.fail_msg = T("RAR files failed to verify") msg = T("[%s] RAR-based verification failed: %s") % (setname, e) nzo.set_unpack_info("Repair", msg, setname) logging.info(msg) return False else: # No rar-files, so just continue return True def rar_renamer(nzo, workdir): """ Deobfuscate rar file names: Use header and content information to give RAR-files decent names """ nzo.status = Status.VERIFYING nzo.set_unpack_info("Repair", T("Trying RAR-based verification")) nzo.set_action_line(T("Trying RAR-based verification"), "...") renamed_files = 0 # This is the most important datastructure (in case of mixed obfuscated rarsets) rarvolnr = {} # rarvolnr will contain per rar vol number the rarfilenames and their respective contents (and maybe other characteristics, like filesizes). # for example: rarvolnr[6]['somerandomfilename.rar']={'readme.txt', 'linux.iso'}, # which means 'somerandomfilename.rar' has rarvolnumber 6, and contents 'readme.txt' and 'linux.iso' # if we find a rarfile with rarvolnumber 7, and 'linux.iso' in it, we have a match! # The volume number and real extension of a (obfuscated) rar file # so volnrext['dfakjldfalkjdfl.blabla'] = (14, 'part014.rar') or (2, 'r000') # Not really needed, but handy to avoid a second lookup at the renaming volnrext = {} # Scan rar files in workdir workdir_files = recursive_listdir(workdir) for file_to_check in workdir_files: # The function will check if it's a RAR-file # We do a sanity-check for the returned number rar_vol, new_extension = rarvolinfo.get_rar_extension(file_to_check) if 0 < rar_vol < 1000: logging.debug("Detected volume-number %s from RAR-header: %s ", rar_vol, file_to_check) volnrext[file_to_check] = (rar_vol, new_extension) # The files inside rar file rar_contents = rarfile.RarFile(os.path.join(workdir, file_to_check), all_names=True).filelist() try: rarvolnr[rar_vol] except: # does not yet exist, so create: rarvolnr[rar_vol] = {} rarvolnr[rar_vol][file_to_check] = rar_contents # store them for matching (if needed) else: logging.debug("No RAR-volume-number found in %s", file_to_check) logging.debug("Deobfuscate: rarvolnr is: %s", rarvolnr) logging.debug("Deobfuscate: volnrext is: %s", volnrext) # Could be that there are no rar-files, we stop if not len(rarvolnr): return renamed_files # Check number of different obfuscated rar sets: numberofrarsets = len(rarvolnr[1]) if numberofrarsets == 1: # Just one obfuscated rarset logging.debug("Deobfuscate: Just one obfuscated rarset") for filename in volnrext: new_rar_name = "%s.%s" % (nzo.final_name, volnrext[filename][1]) new_rar_name = os.path.join(workdir, new_rar_name) new_rar_name = get_unique_filename(new_rar_name) logging.debug("Deobfuscate: Renaming %s to %s" % (filename, new_rar_name)) renamer(filename, new_rar_name) renamed_files += 1 else: # More than one obfuscated rarset, so we must do matching based of files inside the rar files logging.debug("Number of obfuscated rarsets: %s", numberofrarsets) # Assign (random) rar set names rarsetname = {} # in which rar set it should be, so rar set 'A', or 'B', or ... mychar = "A" # First things first: Assigning a rarsetname to the rar file which have volume number 1 for base_obfuscated_filename in rarvolnr[1]: rarsetname[base_obfuscated_filename] = mychar + "--" + nzo.final_name mychar = chr(ord(mychar) + 1) logging.debug("Deobfuscate: rarsetname %s", rarsetname) # Do the matching, layer by layer (read: rarvolnumber) # So, all rar files with rarvolnr 1, find the contents (files inside the rar), # and match with rarfiles with rarvolnr 2, and put them in the correct rarset. # And so on, until the highest rarvolnr minus 1 matched against highest rarvolnr for n in range(1, len(rarvolnr.keys())): logging.debug("Deobfuscate: Finding matches between rar sets %s and %s" % (n, n + 1)) for base_obfuscated_filename in rarvolnr[n]: matchcounter = 0 for next_obfuscated_filename in rarvolnr[n + 1]: # set() method with intersection (less strict): set(rarvolnr[n][base_obfuscated_filename]).intersection(set(rarvolnr[n+1][next_obfuscated_filename])) # check if the last filename inside the existing rar matches with the first filename in the following rar if rarvolnr[n][base_obfuscated_filename][-1] == rarvolnr[n + 1][next_obfuscated_filename][0]: rarsetname[next_obfuscated_filename] = rarsetname[base_obfuscated_filename] matchcounter += 1 if matchcounter > 1: logging.info("Deobfuscate: more than one match, so risk on false positive matching.") # Do the renaming: for filename in rarsetname: new_rar_name = "%s.%s" % (rarsetname[filename], volnrext[filename][1]) new_rar_name = os.path.join(workdir, new_rar_name) new_rar_name = get_unique_filename(new_rar_name) logging.debug("Deobfuscate: Renaming %s to %s" % (filename, new_rar_name)) renamer(filename, new_rar_name) renamed_files += 1 # Done: The obfuscated rar files have now been renamed to regular formatted filenames return renamed_files def handle_empty_queue(): """ Check if empty queue calls for action """ if sabnzbd.nzbqueue.NzbQueue.do.actives() == 0: sabnzbd.save_state() notifier.send_notification("SABnzbd", T("Queue finished"), "queue_done") # Perform end-of-queue action when one is set if sabnzbd.QUEUECOMPLETEACTION: logging.info( "Queue has finished, launching: %s (%s)", sabnzbd.QUEUECOMPLETEACTION, sabnzbd.QUEUECOMPLETEARG ) if sabnzbd.QUEUECOMPLETEARG: sabnzbd.QUEUECOMPLETEACTION(sabnzbd.QUEUECOMPLETEARG) else: Thread(target=sabnzbd.QUEUECOMPLETEACTION).start() sabnzbd.change_queue_complete_action(cfg.queue_complete(), new=False) def cleanup_list(wdir, skip_nzb): """ Remove all files whose extension matches the cleanup list, optionally ignoring the nzb extension """ if cfg.cleanup_list(): try: files = os.listdir(wdir) except: files = () for filename in files: path = os.path.join(wdir, filename) if os.path.isdir(path): cleanup_list(path, skip_nzb) else: if on_cleanup_list(filename, skip_nzb): try: logging.info("Removing unwanted file %s", path) remove_file(path) except: logging.error(T("Removing %s failed"), clip_path(path)) logging.info("Traceback: ", exc_info=True) if files: try: remove_dir(wdir) except: pass def prefix(path, pre): """ Apply prefix to last part of path '/my/path' and 'hi_' will give '/my/hi_path' """ p, d = os.path.split(path) return os.path.join(p, pre + d) def nzb_redirect(wdir, nzbname, pp, script, cat, priority): """ Check if this job contains only NZB files, if so send to queue and remove if on clean-up list Returns list of processed NZB's """ files = recursive_listdir(wdir) for file_ in files: if os.path.splitext(file_)[1].lower() != ".nzb": return None # For multiple NZBs, cannot use the current job name if len(files) != 1: nzbname = None # Process all NZB files for nzb_file in files: dirscanner.process_single_nzb( os.path.split(nzb_file)[1], file_, pp, script, cat, priority=priority, keep=False, dup_check=False, nzbname=nzbname, ) return files def one_file_or_folder(folder): """ If the dir only contains one file or folder, join that file/folder onto the path """ if os.path.exists(folder) and os.path.isdir(folder): try: cont = os.listdir(folder) if len(cont) == 1: folder = os.path.join(folder, cont[0]) folder = one_file_or_folder(folder) except WindowsError: # Can occur on paths it doesn't like, for example "C:" pass return folder TAG_RE = re.compile(r"<[^>]+>") def get_last_line(txt): """ Return last non-empty line of a text, trim to 150 max """ # First we remove HTML code in a basic way txt = TAG_RE.sub(" ", txt) # Then we get the last line lines = txt.split("\n") n = len(lines) - 1 while n >= 0 and not lines[n].strip("\r\t "): n = n - 1 line = lines[n].strip("\r\t ") if len(line) >= 150: line = line[:147] + "..." return line def remove_samples(path): """ Remove all files that match the sample pattern Skip deleting if it matches all files or there is only 1 file """ files_to_delete = [] nr_files = 0 for root, _dirs, files in os.walk(path): for file_to_match in files: nr_files += 1 if RE_SAMPLE.search(file_to_match): files_to_delete.append(os.path.join(root, file_to_match)) # Make sure we skip false-positives if len(files_to_delete) < nr_files: for path in files_to_delete: try: logging.info("Removing unwanted sample file %s", path) remove_file(path) except: logging.error(T("Removing %s failed"), clip_path(path)) logging.info("Traceback: ", exc_info=True) else: logging.info("Skipping sample-removal, false-positive") def rename_and_collapse_folder(oldpath, newpath, files): """ Rename folder, collapsing when there's just a single subfolder oldpath --> newpath OR oldpath/subfolder --> newpath Modify list of filenames accordingly """ orgpath = oldpath items = globber(oldpath) if len(items) == 1: folder = items[0] folder_path = os.path.join(oldpath, folder) if os.path.isdir(folder_path) and folder not in ("VIDEO_TS", "AUDIO_TS"): logging.info("Collapsing %s", os.path.join(newpath, folder)) oldpath = folder_path oldpath = os.path.normpath(oldpath) newpath = os.path.normpath(newpath) files = [os.path.normpath(f).replace(oldpath, newpath) for f in files] renamer(oldpath, newpath) try: remove_dir(orgpath) except: pass return files def set_marker(folder): """ Set marker file and return name """ name = cfg.marker_file() if name: path = os.path.join(folder, name) logging.debug("Create marker file %s", path) try: fp = open(path, "w") fp.close() except: logging.info("Cannot create marker file %s", path) logging.info("Traceback: ", exc_info=True) name = None return name def del_marker(path): """ Remove marker file """ if path and os.path.exists(path): logging.debug("Removing marker file %s", path) try: remove_file(path) except: logging.info("Cannot remove marker file %s", path) logging.info("Traceback: ", exc_info=True) def remove_from_list(name, lst): if name: for n in range(len(lst)): if lst[n].endswith(name): logging.debug("Popping %s", lst[n]) lst.pop(n) return def try_alt_nzb(nzo): """ Try to get a new NZB if available """ url = nzo.nzo_info.get("failure") if url and cfg.new_nzb_on_failure(): sabnzbd.add_url(url, nzo.pp, nzo.script, nzo.cat, nzo.priority) sabnzbd-develop/sabnzbd/misc.py0000600000175000017500000006375613642116632014706 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.misc - misc classes """ import os import sys import logging import urllib.request import urllib.parse import re import subprocess import socket import time import datetime import inspect import ctypes import sabnzbd from sabnzbd.constants import DEFAULT_PRIORITY, MEBI, DEF_ARTICLE_CACHE_DEFAULT, DEF_ARTICLE_CACHE_MAX import sabnzbd.config as config import sabnzbd.cfg as cfg from sabnzbd.encoding import ubtou, platform_btou TAB_UNITS = ("", "K", "M", "G", "T", "P") RE_UNITS = re.compile(r"(\d+\.*\d*)\s*([KMGTP]{0,1})", re.I) RE_VERSION = re.compile(r"(\d+)\.(\d+)\.(\d+)([a-zA-Z]*)(\d*)") RE_IP4 = re.compile(r"inet\s+(addr:\s*){0,1}(\d+\.\d+\.\d+\.\d+)") RE_IP6 = re.compile(r"inet6\s+(addr:\s*){0,1}([0-9a-f:]+)", re.I) # Check if strings are defined for AM and PM HAVE_AMPM = bool(time.strftime("%p", time.localtime())) def time_format(fmt): """ Return time-format string adjusted for 12/24 hour clock setting """ if cfg.ampm() and HAVE_AMPM: return fmt.replace("%H:%M:%S", "%I:%M:%S %p").replace("%H:%M", "%I:%M %p") else: return fmt def calc_age(date, trans=False): """ Calculate the age difference between now and date. Value is returned as either days, hours, or minutes. When 'trans' is True, time symbols will be translated. """ if trans: d = T("d") # : Single letter abbreviation of day h = T("h") # : Single letter abbreviation of hour m = T("m") # : Single letter abbreviation of minute else: d = "d" h = "h" m = "m" try: now = datetime.datetime.now() # age = str(now - date).split(".")[0] #old calc_age # time difference dage = now - date seconds = dage.seconds # only one value should be returned # if it is less than 1 day then it returns in hours, unless it is less than one hour where it returns in minutes if dage.days: age = "%d%s" % (dage.days, d) elif int(seconds / 3600): age = "%d%s" % (seconds / 3600, h) else: age = "%d%s" % (seconds / 60, m) except: age = "-" return age def monthrange(start, finish): """ Calculate months between 2 dates, used in the Config template """ months = (finish.year - start.year) * 12 + finish.month + 1 for i in range(start.month, months): year = (i - 1) / 12 + start.year month = (i - 1) % 12 + 1 yield datetime.date(int(year), int(month), 1) def safe_lower(txt): """ Return lowercased string. Return '' for None """ if txt: return txt.lower() else: return "" def cmp(x, y): """ Replacement for built-in funciton cmp that was removed in Python 3 Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y. """ return (x > y) - (x < y) def cat_to_opts(cat, pp=None, script=None, priority=None): """ Derive options from category, if options not already defined. Specified options have priority over category-options. If no valid category is given, special category '*' will supply default values """ def_cat = config.get_categories("*") cat = safe_lower(cat) if cat in ("", "none", "default"): cat = "*" try: my_cat = config.get_categories()[cat] except KeyError: cat = "*" my_cat = def_cat if pp is None: pp = my_cat.pp() if pp == "": pp = def_cat.pp() if not script: script = my_cat.script() if safe_lower(script) in ("", "default"): script = def_cat.script() if priority is None or priority == "" or priority == DEFAULT_PRIORITY: priority = my_cat.priority() if priority == DEFAULT_PRIORITY: priority = def_cat.priority() logging.debug("Cat->Attrib cat=%s pp=%s script=%s prio=%s", cat, pp, script, priority) return cat, pp, script, priority _wildcard_to_regex = { "\\": r"\\", "^": r"\^", "$": r"\$", ".": r"\.", "[": r"\[", "]": r"\]", "(": r"\(", ")": r"\)", "+": r"\+", "?": r".", "|": r"\|", "{": r"\{", "}": r"\}", "*": r".*", } def wildcard_to_re(text): """ Convert plain wildcard string (with '*' and '?') to regex. """ return "".join([_wildcard_to_regex.get(ch, ch) for ch in text]) def cat_convert(cat): """ Convert indexer's category/group-name to user categories. If no match found, but indexer-cat equals user-cat, then return user-cat If no match found, but the indexer-cat starts with the user-cat, return user-cat If no match found, return None """ if cat and cat.lower() != "none": cats = config.get_ordered_categories() raw_cats = config.get_categories() for ucat in cats: try: # Ordered cat-list has tags only as string indexer = raw_cats[ucat["name"]].newzbin() if not isinstance(indexer, list): indexer = [indexer] except: indexer = [] for name in indexer: if re.search("^%s$" % wildcard_to_re(name), cat, re.I): if "." in name: logging.debug('Convert group "%s" to user-cat "%s"', cat, ucat["name"]) else: logging.debug('Convert index site category "%s" to user-cat "%s"', cat, ucat["name"]) return ucat["name"] # Try to find full match between user category and indexer category for ucat in cats: if cat.lower() == ucat["name"].lower(): logging.debug('Convert index site category "%s" to user-cat "%s"', cat, ucat["name"]) return ucat["name"] # Try to find partial match between user category and indexer category for ucat in cats: if cat.lower().startswith(ucat["name"].lower()): logging.debug('Convert index site category "%s" to user-cat "%s"', cat, ucat["name"]) return ucat["name"] return None def windows_variant(): """ Determine Windows variant Return vista_plus, x64 """ from win32api import GetVersionEx from win32con import VER_PLATFORM_WIN32_NT import winreg vista_plus = x64 = False maj, _minor, _buildno, plat, _csd = GetVersionEx() if plat == VER_PLATFORM_WIN32_NT: vista_plus = maj > 5 if vista_plus: # Must be done the hard way, because the Python runtime lies to us. # This does *not* work: # return os.environ['PROCESSOR_ARCHITECTURE'] == 'AMD64' # because the Python runtime returns 'X86' even on an x64 system! key = winreg.OpenKey( winreg.HKEY_LOCAL_MACHINE, r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment" ) for n in range(winreg.QueryInfoKey(key)[1]): name, value, _val_type = winreg.EnumValue(key, n) if name == "PROCESSOR_ARCHITECTURE": x64 = value.upper() == "AMD64" break winreg.CloseKey(key) return vista_plus, x64 _SERVICE_KEY = "SYSTEM\\CurrentControlSet\\services\\" _SERVICE_PARM = "CommandLine" def get_serv_parms(service): """ Get the service command line parameters from Registry """ import winreg value = [] try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, _SERVICE_KEY + service) for n in range(winreg.QueryInfoKey(key)[1]): name, value, _val_type = winreg.EnumValue(key, n) if name == _SERVICE_PARM: break winreg.CloseKey(key) except WindowsError: pass for n in range(len(value)): value[n] = value[n] return value def set_serv_parms(service, args): """ Set the service command line parameters in Registry """ import winreg try: key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, _SERVICE_KEY + service) winreg.SetValueEx(key, _SERVICE_PARM, None, winreg.REG_MULTI_SZ, args) winreg.CloseKey(key) except WindowsError: return False return True def get_from_url(url): """ Retrieve URL and return content """ try: with urllib.request.urlopen(url) as response: return response.read() except: return None def convert_version(text): """ Convert version string to numerical value and a testversion indicator """ version = 0 test = True m = RE_VERSION.search(ubtou(text)) if m: version = int(m.group(1)) * 1000000 + int(m.group(2)) * 10000 + int(m.group(3)) * 100 try: if m.group(4).lower() == "rc": version = version + 80 elif m.group(4).lower() == "beta": version = version + 40 version = version + int(m.group(5)) except: version = version + 99 test = False return version, test def check_latest_version(): """ Do an online check for the latest version Perform an online version check Syntax of online version file: The latter two lines are only present when an alpha/beta/rc is available. Formula for the version numbers (line 1 and 3). ..[rc|beta|alpha] The value for a final version is assumned to be 99. The value for the beta/rc version is 1..98, with RC getting a boost of 80 and Beta of 40. This is done to signal alpha/beta/rc users of availability of the final version (which is implicitly 99). People will only be informed to upgrade to a higher alpha/beta/rc version, if they are already using an alpha/beta/rc. RC's are valued higher than Beta's, which are valued higher than Alpha's. """ if not cfg.version_check(): return current, testver = convert_version(sabnzbd.__version__) if not current: logging.debug("Unsupported release number (%s), will not check", sabnzbd.__version__) return # Fetch version info data = get_from_url("https://raw.githubusercontent.com/sabnzbd/sabnzbd.github.io/master/latest.txt") if not data: logging.info("Cannot retrieve version information from GitHub.com") logging.debug("Traceback: ", exc_info=True) return try: latest_label = data.split()[0] except: latest_label = "" try: url = ubtou(data.split()[1]) except: url = "" try: latest_testlabel = data.split()[2] except: latest_testlabel = "" try: url_beta = ubtou(data.split()[3]) except: url_beta = url latest = convert_version(latest_label)[0] latest_test = convert_version(latest_testlabel)[0] logging.debug( "Checked for a new release, cur= %s, latest= %s (on %s), latest_test= %s (on %s)", current, latest, url, latest_test, url_beta, ) if latest_test and cfg.version_check() > 1: # User always wants to see the latest test release latest = latest_test latest_label = latest_testlabel url = url_beta if testver and current < latest: # This is a test version, but user has't seen the # "Final" of this one yet, so show the Final sabnzbd.NEW_VERSION = (latest_label, url) elif current < latest: # This one is behind, show latest final sabnzbd.NEW_VERSION = (latest_label, url) elif testver and current < latest_test: # This is a test version beyond the latest Final, so show latest Alpha/Beta/RC sabnzbd.NEW_VERSION = (latest_testlabel, url_beta) def from_units(val): """ Convert K/M/G/T/P notation to float """ val = str(val).strip().upper() if val == "-1": return val m = RE_UNITS.search(val) if m: if m.group(2): val = float(m.group(1)) unit = m.group(2) n = 0 while unit != TAB_UNITS[n]: val = val * 1024.0 n = n + 1 else: val = m.group(1) try: return float(val) except: return 0.0 else: return 0.0 def to_units(val, postfix=""): """ Convert number to K/M/G/T/P notation Show single decimal for M and higher """ dec_limit = 1 if val < 0: sign = "-" else: sign = "" val = str(abs(val)).strip() n = 0 try: val = float(val) except: return "" while (val > 1023.0) and (n < 5): val = val / 1024.0 n = n + 1 unit = TAB_UNITS[n] if n > dec_limit: decimals = 1 else: decimals = 0 fmt = "%%s%%.%sf %%s%%s" % decimals return fmt % (sign, val, unit, postfix) def caller_name(skip=2): """Get a name of a caller in the format module.method Originally used: https://gist.github.com/techtonik/2151727 Adapted for speed by using sys calls directly """ # Only do the tracing on Debug (function is always called) if cfg.log_level() != 2: return "N/A" parentframe = sys._getframe(skip) function_name = parentframe.f_code.co_name # Modulename not available in the binaries, we can use the filename instead if getattr(sys, "frozen", None): module_name = inspect.getfile(parentframe) else: module_name = inspect.getmodule(parentframe).__name__ # For decorated functions we have to go deeper if function_name in ("call_func", "wrap") and skip == 2: return caller_name(4) return ".".join([module_name, function_name]) def exit_sab(value): """ Leave the program after flushing stderr/stdout """ sys.stderr.flush() sys.stdout.flush() if getattr(sys, "frozen", None) == "macosx_app": sabnzbd.SABSTOP = True from PyObjCTools import AppHelper AppHelper.stopEventLoop() sys.exit(value) def split_host(srv): """ Split host:port notation, allowing for IPV6 """ if not srv: return None, None # IPV6 literal (with no port) if srv[-1] == "]": return srv, None out = srv.rsplit(":", 1) if len(out) == 1: # No port port = None else: try: port = int(out[1]) except ValueError: return srv, None return out[0], port def get_cache_limit(): """ Depending on OS, calculate cache limits. In ArticleCache it will make sure we stay within system limits for 32/64 bit """ # Calculate, if possible try: if sabnzbd.WIN32: # Windows mem_bytes = get_windows_memory() elif sabnzbd.DARWIN: # macOS mem_bytes = get_darwin_memory() else: # Linux mem_bytes = os.sysconf("SC_PAGE_SIZE") * os.sysconf("SC_PHYS_PAGES") # Use 1/4th of available memory mem_bytes = mem_bytes / 4 # We don't want to set a value that's too high if mem_bytes > from_units(DEF_ARTICLE_CACHE_MAX): return DEF_ARTICLE_CACHE_MAX # We make sure it's at least a valid value if mem_bytes > from_units("32M"): return to_units(mem_bytes) except: pass # Always at least minimum on Windows/macOS if sabnzbd.WIN32 and sabnzbd.DARWIN: return DEF_ARTICLE_CACHE_DEFAULT # If failed, leave empty for Linux so user needs to decide return "" def get_windows_memory(): """ Use ctypes to extract available memory """ class MEMORYSTATUSEX(ctypes.Structure): _fields_ = [ ("dwLength", ctypes.c_ulong), ("dwMemoryLoad", ctypes.c_ulong), ("ullTotalPhys", ctypes.c_ulonglong), ("ullAvailPhys", ctypes.c_ulonglong), ("ullTotalPageFile", ctypes.c_ulonglong), ("ullAvailPageFile", ctypes.c_ulonglong), ("ullTotalVirtual", ctypes.c_ulonglong), ("ullAvailVirtual", ctypes.c_ulonglong), ("sullAvailExtendedVirtual", ctypes.c_ulonglong), ] def __init__(self): # have to initialize this to the size of MEMORYSTATUSEX self.dwLength = ctypes.sizeof(self) super(MEMORYSTATUSEX, self).__init__() stat = MEMORYSTATUSEX() ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat)) return stat.ullTotalPhys def get_darwin_memory(): """ Use system-call to extract total memory on macOS """ system_output = sabnzbd.newsunpack.run_simple(["sysctl", "hw.memsize"]) return float(system_output.split()[1]) def on_cleanup_list(filename, skip_nzb=False): """ Return True if a filename matches the clean-up list """ lst = cfg.cleanup_list() if lst: name, ext = os.path.splitext(filename) ext = ext.strip().lower() name = name.strip() for k in lst: item = k.strip().strip(".").lower() item = "." + item if (item == ext or (ext == "" and item == name)) and not (skip_nzb and item == ".nzb"): return True return False def memory_usage(): try: # Probably only works on Linux because it uses /proc//statm t = open("/proc/%d/statm" % os.getpid()) v = t.read().split() t.close() virt = int(_PAGE_SIZE * int(v[0]) / MEBI) res = int(_PAGE_SIZE * int(v[1]) / MEBI) return "V=%sM R=%sM" % (virt, res) except IOError: pass except: logging.debug("Error retrieving memory usage") logging.info("Traceback: ", exc_info=True) try: _PAGE_SIZE = os.sysconf("SC_PAGE_SIZE") except: _PAGE_SIZE = 0 _HAVE_STATM = _PAGE_SIZE and memory_usage() def loadavg(): """ Return 1, 5 and 15 minute load average of host or "" if not supported """ p = "" if not sabnzbd.WIN32 and not sabnzbd.DARWIN: opt = cfg.show_sysload() if opt: try: p = "%.2f | %.2f | %.2f" % os.getloadavg() except: pass if opt > 1 and _HAVE_STATM: p = "%s | %s" % (p, memory_usage()) return p def format_time_string(seconds): """ Return a formatted and translated time string """ def unit(single, n): # Seconds and minutes are special due to historical reasons if single == "minute" or (single == "second" and n == 1): single = single[:3] if n == 1: return T(single) return T(single + "s") # Format the string, size by size seconds = int_conv(seconds) completestr = [] days = seconds // 86400 if days >= 1: completestr.append("%s %s" % (days, unit("day", days))) seconds -= days * 86400 hours = seconds // 3600 if hours >= 1: completestr.append("%s %s" % (hours, unit("hour", hours))) seconds -= hours * 3600 minutes = seconds // 60 if minutes >= 1: completestr.append("%s %s" % (minutes, unit("minute", minutes))) seconds -= minutes * 60 if seconds > 0: completestr.append("%s %s" % (seconds, unit("second", seconds))) # Zero or invalid integer if not completestr: completestr.append("0 %s" % unit("second", 0)) return " ".join(completestr) def int_conv(value): """ Safe conversion to int (can handle None) """ try: value = int(value) except: value = 0 return value def create_https_certificates(ssl_cert, ssl_key): """ Create self-signed HTTPS certificates and store in paths 'ssl_cert' and 'ssl_key' """ try: from sabnzbd.utils.certgen import generate_key, generate_local_cert private_key = generate_key(key_size=2048, output_file=ssl_key) generate_local_cert(private_key, days_valid=3560, output_file=ssl_cert, LN="SABnzbd", ON="SABnzbd") logging.info("Self-signed certificates generated successfully") except: logging.error(T("Error creating SSL key and certificate")) logging.info("Traceback: ", exc_info=True) return False return True def get_all_passwords(nzo): """ Get all passwords, from the NZB, meta and password file """ if nzo.password: logging.info("Found a password that was set by the user: %s", nzo.password) passwords = [nzo.password.strip()] else: passwords = [] meta_passwords = nzo.meta.get("password", []) pw = nzo.nzo_info.get("password") if pw: meta_passwords.append(pw) if meta_passwords: if nzo.password == meta_passwords[0]: # this nzo.password came from meta, so don't use it twice passwords.extend(meta_passwords[1:]) else: passwords.extend(meta_passwords) logging.info("Read %s passwords from meta data in NZB: %s", len(meta_passwords), meta_passwords) pw_file = cfg.password_file.get_path() if pw_file: try: with open(pw_file, "r") as pwf: lines = pwf.read().split("\n") # Remove empty lines and space-only passwords and remove surrounding spaces pws = [pw.strip("\r\n ") for pw in lines if pw.strip("\r\n ")] logging.debug("Read these passwords from file: %s", pws) passwords.extend(pws) logging.info("Read %s passwords from file %s", len(pws), pw_file) # Check size if len(pws) > 30: logging.warning( T( "Your password file contains more than 30 passwords, testing all these passwords takes a lot of time. Try to only list useful passwords." ) ) except: logging.warning("Failed to read the passwords file %s", pw_file) if nzo.password: # If an explicit password was set, add a retry without password, just in case. passwords.append("") elif not passwords or nzo.encrypted < 1: # If we're not sure about encryption, start with empty password # and make sure we have at least the empty password passwords.insert(0, "") return passwords def find_on_path(targets): """ Search the PATH for a program and return full path """ if sabnzbd.WIN32: paths = os.getenv("PATH").split(";") else: paths = os.getenv("PATH").split(":") if isinstance(targets, str): targets = (targets,) for path in paths: for target in targets: target_path = os.path.abspath(os.path.join(path, target)) if os.path.isfile(target_path) and os.access(target_path, os.X_OK): return target_path return None def probablyipv4(ip): if ip.count(".") == 3 and re.sub("[0123456789.]", "", ip) == "": return True else: return False def probablyipv6(ip): # Returns True if the given input is probably an IPv6 address # Square Brackets like '[2001::1]' are OK if ip.count(":") >= 2 and re.sub("[0123456789abcdefABCDEF:\[\]]", "", ip) == "": return True else: return False def ip_extract(): """ Return list of IP addresses of this system """ ips = [] program = find_on_path("ip") if program: program = [program, "a"] else: program = find_on_path("ifconfig") if program: program = [program] if sabnzbd.WIN32 or not program: try: info = socket.getaddrinfo(socket.gethostname(), None) except: # Hostname does not resolve, use localhost info = socket.getaddrinfo("localhost", None) for item in info: ips.append(item[4][0]) else: p = subprocess.Popen( program, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=None, creationflags=0, ) output = platform_btou(p.stdout.read()) p.wait() for line in output.split("\n"): m = RE_IP4.search(line) if not (m and m.group(2)): m = RE_IP6.search(line) if m and m.group(2): ips.append(m.group(2)) return ips def get_base_url(url): """ Return only the true root domain for the favicon, so api.oznzb.com -> oznzb.com But also api.althub.co.za -> althub.co.za """ url_host = urllib.parse.urlparse(url).hostname if url_host: url_split = url_host.split(".") # Exception for localhost and IPv6 addresses if len(url_split) < 3: return url_host return ".".join(len(url_split[-2]) < 4 and url_split[-3:] or url_split[-2:]) else: return "" def match_str(text, matches): """ Return first matching element of list 'matches' in 'text', otherwise None """ for match in matches: if match in text: return match return None def nntp_to_msg(text): """ Format raw NNTP bytes data for display """ if isinstance(text, list): text = text[0] # Only need to split if it was raw data # Sometimes (failed login) we put our own texts if not isinstance(text, bytes): return text else: lines = text.split(b"\r\n") return ubtou(lines[0]) sabnzbd-develop/sabnzbd/osxmenu.py0000600000175000017500000007645013642116632015444 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.osxmenu - OSX Top Menu """ import objc from Foundation import * from AppKit import * from PyObjCTools import AppHelper from objc import YES, NO import os import sys import time import logging import sabnzbd import sabnzbd.cfg from sabnzbd.filesystem import get_filename, get_ext, diskspace from sabnzbd.misc import to_units from sabnzbd.constants import VALID_ARCHIVES, VALID_NZB_FILES, MEBI, Status from sabnzbd.panic import launch_a_browser import sabnzbd.notifier as notifier from sabnzbd.api import fast_queue from sabnzbd.nzbqueue import NzbQueue import sabnzbd.config as config import sabnzbd.scheduler as scheduler import sabnzbd.downloader import sabnzbd.dirscanner as dirscanner from sabnzbd.bpsmeter import BPSMeter status_icons = {'idle': '../Resources/sab_idle.tiff', 'pause': '../Resources/sab_pause.tiff', 'clicked': '../Resources/sab_clicked.tiff'} start_time = NSDate.date() debug = 0 class SABnzbdDelegate(NSObject): icons = {} status_bar = None osx_icon = True history_db = None isLeopard = 0 def awakeFromNib(self): # Status Bar initialize if debug == 1: NSLog("[osx] awake") self.buildMenu() # Timer for updating menu self.timer = NSTimer.alloc().initWithFireDate_interval_target_selector_userInfo_repeats_(start_time, 3.0, self, 'updateAction:', None, True) NSRunLoop.currentRunLoop().addTimer_forMode_(self.timer, NSDefaultRunLoopMode) NSRunLoop.currentRunLoop().addTimer_forMode_(self.timer, NSEventTrackingRunLoopMode) # NSRunLoop.currentRunLoop().addTimer_forMode_(self.timer, NSModalPanelRunLoopMode) self.timer.fire() def buildMenu(self): # logging.info("building menu") status_bar = NSStatusBar.systemStatusBar() self.status_item = status_bar.statusItemWithLength_(NSVariableStatusItemLength) for i in status_icons.keys(): self.icons[i] = NSImage.alloc().initByReferencingFile_(status_icons[i]) if sabnzbd.DARWIN_VERSION > 9: # Support for Yosemite Dark Mode self.icons[i].setTemplate_(YES) self.status_item.setImage_(self.icons['idle']) self.status_item.setAlternateImage_(self.icons['clicked']) self.status_item.setHighlightMode_(1) self.status_item.setToolTip_('SABnzbd') self.status_item.setEnabled_(YES) if debug == 1: NSLog("[osx] menu 1 building") # Wait for SABnzbd Initialization # cherrypy.engine.wait(cherrypy.process.wspbus.states.STARTED) # Wait for translated texts to be loaded while not sabnzbd.WEBUI_READY and not sabnzbd.SABSTOP: time.sleep(0.5) if debug == 1: NSLog("[osx] language file not loaded, waiting") # Variables self.state = "Idle" try: self.speed = sabnzbd.downloader.Downloader.do.get_limit() except: self.speed = 0 self.version_notify = 1 self.status_removed = 0 if debug == 1: NSLog("[osx] menu 2 initialization") # Menu construction self.menu = NSMenu.alloc().init() try: menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_("Dummy", '', '') menu_item.setHidden_(YES) self.isLeopard = 1 except: self.isLeopard = 0 if debug == 1: NSLog("[osx] menu 3 construction") # Warnings Item self.warnings_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Warnings'), 'openBrowserAction:', '') if self.isLeopard: self.warnings_menu_item.setHidden_(YES) else: self.warnings_menu_item.setEnabled_(NO) self.warnings_menu_item.setRepresentedObject_("connections/") self.menu.addItem_(self.warnings_menu_item) if debug == 1: NSLog("[osx] menu 4 warning added") # State Item self.state_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Idle'), 'openBrowserAction:', '') self.state_menu_item.setRepresentedObject_("") self.menu.addItem_(self.state_menu_item) if debug == 1: NSLog("[osx] menu 5 state added") # Config Item menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Configuration'), 'openBrowserAction:', '') menu_item.setRepresentedObject_("config/general/") menu_item.setAlternate_(YES) menu_item.setKeyEquivalentModifierMask_(NSAlternateKeyMask) self.menu.addItem_(menu_item) if debug == 1: NSLog("[osx] menu 6 config added") # Queue Item self.queue_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Queue'), 'openBrowserAction:', '') self.queue_menu_item.setRepresentedObject_("") self.menu.addItem_(self.queue_menu_item) if debug == 1: NSLog("[osx] menu 7 queue added") # Purge Queue Item self.purgequeue_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Purge Queue'), 'purgeAction:', '') self.purgequeue_menu_item.setRepresentedObject_("queue") self.purgequeue_menu_item.setAlternate_(YES) self.purgequeue_menu_item.setKeyEquivalentModifierMask_(NSAlternateKeyMask) self.menu.addItem_(self.purgequeue_menu_item) if debug == 1: NSLog("[osx] menu 8 purge queue added") # History Item self.history_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('History'), 'openBrowserAction:', '') self.history_menu_item.setRepresentedObject_("") self.menu.addItem_(self.history_menu_item) if debug == 1: NSLog("[osx] menu 9 history added") # Purge History Item self.purgehistory_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Purge History'), 'purgeAction:', '') self.purgehistory_menu_item.setRepresentedObject_("history") self.purgehistory_menu_item.setAlternate_(YES) self.purgehistory_menu_item.setKeyEquivalentModifierMask_(NSAlternateKeyMask) self.menu.addItem_(self.purgehistory_menu_item) if debug == 1: NSLog("[osx] menu 10 purge history added") self.separator_menu_item = NSMenuItem.separatorItem() self.menu.addItem_(self.separator_menu_item) # Limit Speed Item & Submenu self.speed_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Limit Speed'), '', '') self.menu_speed = NSMenu.alloc().init() speeds = {10: '10%', 20: '20%', 30: '30%', 40: '40%', 50: '50%', 60: '60%', 70: '70%', 80: '80%', 90: '90%', 100: '100%' } for speed in sorted(speeds.keys()): menu_speed_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_('%s' % (speeds[speed]), 'speedlimitAction:', '') menu_speed_item.setRepresentedObject_("%s" % speed) self.menu_speed.addItem_(menu_speed_item) self.speed_menu_item.setSubmenu_(self.menu_speed) self.menu.addItem_(self.speed_menu_item) if debug == 1: NSLog("[osx] menu 11 limit speed added") # Pause Item & Submenu self.pause_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Pause'), 'pauseAction:', '') self.pause_menu_item.setRepresentedObject_('0') self.menu_pause = NSMenu.alloc().init() for i in range(6): menu_pause_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_("%s %s" % ((i + 1) * 10, T('min.')), 'pauseAction:', '') menu_pause_item.setRepresentedObject_("%s" % ((i + 1) * 10)) self.menu_pause.addItem_(menu_pause_item) self.pause_menu_item.setSubmenu_(self.menu_pause) self.menu.addItem_(self.pause_menu_item) if debug == 1: NSLog("[osx] menu 12 pause added") # Resume Item self.resume_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Resume'), 'resumeAction:', '') if self.isLeopard: self.resume_menu_item.setHidden_(YES) else: self.resume_menu_item.setEnabled_(NO) self.menu.addItem_(self.resume_menu_item) if debug == 1: NSLog("[osx] menu 13 resume added") # Watched folder Item self.watched_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Scan watched folder'), 'watchedFolderAction:', '') if self.isLeopard: self.watched_menu_item.setHidden_(YES) else: self.watched_menu_item.setEnabled_(NO) self.menu.addItem_(self.watched_menu_item) # All RSS feeds self.rss_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Read all RSS feeds'), 'rssAction:', '') if self.isLeopard: self.rss_menu_item.setHidden_(YES) else: self.rss_menu_item.setEnabled_(NO) self.menu.addItem_(self.rss_menu_item) self.separator2_menu_item = NSMenuItem.separatorItem() self.menu.addItem_(self.separator2_menu_item) if debug == 1: NSLog("[osx] menu 14 watched folder added") # Complete Folder Item self.completefolder_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Complete Folder') + '\t\t\t', 'openFolderAction:', '') self.completefolder_menu_item.setRepresentedObject_(sabnzbd.cfg.complete_dir.get_path()) self.menu.addItem_(self.completefolder_menu_item) # Incomplete Folder Item self.incompletefolder_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Incomplete Folder') + '\t\t', 'openFolderAction:', '') self.incompletefolder_menu_item.setRepresentedObject_(sabnzbd.cfg.download_dir.get_path()) self.menu.addItem_(self.incompletefolder_menu_item) if debug == 1: NSLog("[osx] menu 15 folder added") self.menu.addItem_(NSMenuItem.separatorItem()) # Set diagnostic menu self.diagnostic_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Troubleshoot'), '', '') self.menu_diagnostic = NSMenu.alloc().init() diag_items = ((T('Restart'), 'restartAction:'), (T('Restart') + ' - 127.0.0.1:8080', 'restartSafeHost:'), (T('Restart without login'), 'restartNoLogin:') ) for item in diag_items: menu_diag_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(item[0], item[1], '') menu_diag_item.setRepresentedObject_(item[0]) self.menu_diagnostic.addItem_(menu_diag_item) self.diagnostic_menu_item.setSubmenu_(self.menu_diagnostic) self.menu.addItem_(self.diagnostic_menu_item) if debug == 1: NSLog("[osx] menu 16 Diagnostic added") # Quit Item menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Quit'), 'terminate:', '') self.menu.addItem_(menu_item) if debug == 1: NSLog("[osx] menu 16 quit added") # Add menu to Status Item self.status_item.setMenu_(self.menu) if debug == 1: NSLog("[osx] menu 18 menu added") def updateAction_(self, notification): try: self.osx_icon = sabnzbd.cfg.osx_menu() if self.osx_icon: if self.status_removed == 1: self.buildMenu() if self.serverUpdate(): self.warningsUpdate() self.queueUpdate() self.historyUpdate() self.stateUpdate() self.iconUpdate() self.pauseUpdate() self.speedlimitUpdate() self.versionUpdate() self.diskspaceUpdate() self.watchedUpdate() self.rssUpdate() else: if self.status_removed == 0: status_bar = NSStatusBar.systemStatusBar() status_bar.removeStatusItem_(self.status_item) self.status_removed = 1 status_bar = None self.status_item = None except: logging.info("[osx] Exception %s" % (sys.exc_info()[0])) def queueUpdate(self): try: qnfo = NzbQueue.do.queue_info(start=0, limit=10) pnfo_list = qnfo.list bytesleftprogess = 0 self.info = "" self.menu_queue = NSMenu.alloc().init() if len(pnfo_list): menu_queue_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Queue First 10 Items'), '', '') self.menu_queue.addItem_(menu_queue_item) self.menu_queue.addItem_(NSMenuItem.separatorItem()) for pnfo in pnfo_list: bytesleft = pnfo.bytes_left / MEBI bytesleftprogess += pnfo.bytes_left bytes = pnfo.bytes / MEBI nzo_id = pnfo.nzo_id timeleft = self.calc_timeleft_(bytesleftprogess, BPSMeter.do.bps) job = "%s\t(%d/%d MB) %s" % (pnfo.filename, bytesleft, bytes, timeleft) menu_queue_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(job, '', '') self.menu_queue.addItem_(menu_queue_item) self.info = "%d nzb(s)\t( %d / %d MB )" % (qnfo.q_size_list, (qnfo.bytes_left / MEBI), (qnfo.bytes / MEBI)) else: menu_queue_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Empty'), '', '') self.menu_queue.addItem_(menu_queue_item) self.queue_menu_item.setSubmenu_(self.menu_queue) except: logging.info("[osx] queueUpdate Exception %s" % (sys.exc_info()[0])) def historyUpdate(self): try: # Fetch history items if not self.history_db: self.history_db = sabnzbd.database.HistoryDB() items, fetched_items, _total_items = self.history_db.fetch_history(0, 10, None) self.menu_history = NSMenu.alloc().init() self.failedAttributes = {NSForegroundColorAttributeName: NSColor.redColor(), NSFontAttributeName: NSFont.menuFontOfSize_(14.0)} menu_history_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('History Last 10 Items'), '', '') self.menu_history.addItem_(menu_history_item) self.menu_history.addItem_(NSMenuItem.separatorItem()) if fetched_items: for history in items: # logging.info("[osx] history : %s" % (history)) job = "%s" % (history['name']) path = "" if os.path.isdir(history['storage']) or os.path.isfile(history['storage']): if os.path.isfile(history['storage']): path = os.path.dirname(history['storage']) else: path = history['storage'] if path: menu_history_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(job, 'openFolderAction:', '') else: menu_history_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(job, '', '') if history['status'] != Status.COMPLETED: jobfailed = NSAttributedString.alloc().initWithString_attributes_(job, self.failedAttributes) menu_history_item.setAttributedTitle_(jobfailed) menu_history_item.setRepresentedObject_("%s" % path) self.menu_history.addItem_(menu_history_item) else: menu_history_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(T('Empty'), '', '') self.menu_history.addItem_(menu_history_item) self.history_menu_item.setSubmenu_(self.menu_history) except: logging.info("[osx] historyUpdate Exception %s" % (sys.exc_info()[0])) def warningsUpdate(self): try: warnings = sabnzbd.GUIHANDLER.count() if warnings: warningsAttributes = { NSForegroundColorAttributeName: NSColor.redColor(), NSFontAttributeName: NSFont.menuFontOfSize_(14.0) } warningsTitle = NSAttributedString.alloc().initWithString_attributes_("%s : %s" % (T('Warnings'), warnings), warningsAttributes) self.warnings_menu_item.setAttributedTitle_(warningsTitle) if self.isLeopard: self.warnings_menu_item.setHidden_(NO) else: self.warnings_menu_item.setEnabled_(YES) else: self.warnings_menu_item.setTitle_("%s : 0" % (T('Warnings'))) if self.isLeopard: self.warnings_menu_item.setHidden_(YES) else: self.warnings_menu_item.setEnabled_(NO) except: logging.info("[osx] warningsUpdate Exception %s" % (sys.exc_info()[0])) def stateUpdate(self): try: paused, bytes_left, bpsnow, time_left = fast_queue() if paused: self.state = T('Paused') if sabnzbd.scheduler.pause_int() != "0": self.setMenuTitle_("\n\n%s\n" % (sabnzbd.scheduler.pause_int())) else: self.setMenuTitle_("") elif bytes_left > 0: self.state = "" speed = to_units(bpsnow) # "10.1 MB/s" doesn't fit, remove space char if 'M' in speed and len(speed) > 5: speed = speed.replace(' ', '') time_left = (bpsnow > 10 and time_left) or "------" statusbarText = "\n\n%s\n%sB/s\n" % (time_left, speed) if sabnzbd.SABSTOP: statusbarText = "..." if not sabnzbd.cfg.osx_speed(): statusbarText = "" self.setMenuTitle_(statusbarText) else: self.state = T('Idle') self.setMenuTitle_("") if self.state != "" and self.info != "": self.state_menu_item.setTitle_("%s - %s" % (self.state, self.info)) if self.info == "": self.state_menu_item.setTitle_("%s" % self.state) else: self.state_menu_item.setTitle_("%s" % self.info) except: logging.info("[osx] stateUpdate Exception %s" % (sys.exc_info()[0])) def iconUpdate(self): try: if sabnzbd.downloader.Downloader.do.paused: self.status_item.setImage_(self.icons['pause']) else: self.status_item.setImage_(self.icons['idle']) except: logging.info("[osx] iconUpdate Exception %s" % (sys.exc_info()[0])) def pauseUpdate(self): try: if sabnzbd.downloader.Downloader.do.paused: if self.isLeopard: self.resume_menu_item.setHidden_(NO) self.pause_menu_item.setHidden_(YES) else: self.resume_menu_item.setEnabled_(YES) self.pause_menu_item.setEnabled_(NO) else: if self.isLeopard: self.resume_menu_item.setHidden_(YES) self.pause_menu_item.setHidden_(NO) else: self.resume_menu_item.setEnabled_(NO) self.pause_menu_item.setEnabled_(YES) except: logging.info("[osx] pauseUpdate Exception %s" % (sys.exc_info()[0])) def speedlimitUpdate(self): try: speed = int(sabnzbd.downloader.Downloader.do.get_limit()) if self.speed != speed: self.speed = speed speedsValues = self.menu_speed.numberOfItems() for i in range(speedsValues): menuitem = self.menu_speed.itemAtIndex_(i) if speed == int(menuitem.representedObject()): menuitem.setState_(NSOnState) else: menuitem.setState_(NSOffState) except: logging.info("[osx] speedlimitUpdate Exception %s" % (sys.exc_info()[0])) def versionUpdate(self): try: if sabnzbd.NEW_VERSION and self.version_notify: # logging.info("[osx] New Version : %s" % (sabnzbd.NEW_VERSION)) new_release, _new_rel_url = sabnzbd.NEW_VERSION notifier.send_notification("SABnzbd", "%s : %s" % (T('New release available'), new_release), 'other') self.version_notify = 0 except: logging.info("[osx] versionUpdate Exception %s" % (sys.exc_info()[0])) def watchedUpdate(self): try: if sabnzbd.cfg.dirscan_dir(): if self.isLeopard: self.watched_menu_item.setHidden_(NO) else: self.watched_menu_item.setEnabled_(YES) else: if self.isLeopard: self.watched_menu_item.setHidden_(YES) else: self.watched_menu_item.setEnabled_(NO) except: logging.info("[osx] watchedUpdate Exception %s" % (sys.exc_info()[0])) def rssUpdate(self): try: if self.isLeopard: self.rss_menu_item.setHidden_(NO) else: self.rss_menu_item.setEnabled_(YES) except: logging.info("[osx] rssUpdate Exception %s" % (sys.exc_info()[0])) def serverUpdate(self): try: if not config.get_servers(): self.state_menu_item.setTitle_(T('Go to wizard')) hide = YES alternate = NO value = 0 else: hide = NO alternate = YES value = 1 if self.isLeopard: self.speed_menu_item.setHidden_(hide) self.resume_menu_item.setHidden_(hide) self.pause_menu_item.setHidden_(hide) self.watched_menu_item.setHidden_(hide) self.rss_menu_item.setHidden_(hide) self.purgequeue_menu_item.setAlternate_(alternate) self.purgequeue_menu_item.setHidden_(hide) self.queue_menu_item.setHidden_(hide) self.purgehistory_menu_item.setAlternate_(alternate) self.purgehistory_menu_item.setHidden_(hide) self.history_menu_item.setHidden_(hide) self.separator_menu_item.setHidden_(hide) self.separator2_menu_item.setHidden_(hide) self.completefolder_menu_item.setHidden_(hide) self.incompletefolder_menu_item.setHidden_(hide) else: self.speed_menu_item.setEnabled_(alternate) self.resume_menu_item.setEnabled_(alternate) self.pause_menu_item.setEnabled_(alternate) self.watched_menu_item.setEnabled_(alternate) self.rss_menu_item.setEnabled_(alternate) self.purgequeue_menu_item.setAlternate_(alternate) self.purgequeue_menu_item.setEnabled_(alternate) self.queue_menu_item.setEnabled_(alternate) self.purgehistory_menu_item.setAlternate_(alternate) self.purgehistory_menu_item.setEnabled_(alternate) self.history_menu_item.setEnabled_(alternate) self.separator_menu_item.setEnabled_(alternate) self.separator2_menu_item.setEnabled_(alternate) self.completefolder_menu_item.setEnabled_(alternate) self.incompletefolder_menu_item.setEnabled_(alternate) return value except: logging.info("[osx] configUpdate Exception %s" % (sys.exc_info()[0])) return 0 def diskspaceUpdate(self): try: self.completefolder_menu_item.setTitle_("%s%.2f GB" % (T('Complete Folder') + '\t\t\t', diskspace()['complete_dir'][1])) self.incompletefolder_menu_item.setTitle_("%s%.2f GB" % (T('Incomplete Folder') + '\t\t', diskspace()['download_dir'][1])) except: logging.info("[osx] diskspaceUpdate Exception %s" % (sys.exc_info()[0])) def setMenuTitle_(self, text): try: style = NSMutableParagraphStyle.new() style.setParagraphStyle_(NSParagraphStyle.defaultParagraphStyle()) style.setAlignment_(NSCenterTextAlignment) style.setLineSpacing_(0.0) style.setMaximumLineHeight_(9.0) style.setParagraphSpacing_(-3.0) # Trying to change color of title to white when menu is open TO FIX if self.menu.highlightedItem(): # logging.info("Menu Clicked") titleColor = NSColor.highlightColor() else: # logging.info("Menu Not Clicked") titleColor = NSColor.blackColor() titleAttributes = { NSBaselineOffsetAttributeName: 5.0, NSFontAttributeName: NSFont.menuFontOfSize_(9.0), NSParagraphStyleAttributeName: style #,NSForegroundColorAttributeName: titleColor } title = NSAttributedString.alloc().initWithString_attributes_(text, titleAttributes) self.status_item.setAttributedTitle_(title) except: logging.info("[osx] setMenuTitle Exception %s" % (sys.exc_info()[0])) def calc_timeleft_(self, bytesleft, bps): """ Calculate the time left in the format HH:MM:SS """ try: totalseconds = int(bytesleft / bps) minutes, seconds = divmod(totalseconds, 60) hours, minutes = divmod(minutes, 60) if minutes < 10: minutes = '0%s' % minutes if seconds < 10: seconds = '0%s' % seconds return '%s:%s:%s' % (hours, minutes, seconds) except: return '0:00:00' def openBrowserAction_(self, sender): if sender.representedObject: link = sender.representedObject() else: link = "" launch_a_browser(sabnzbd.BROWSER_URL, True) def speedlimitAction_(self, sender): # logging.info("[osx] speed limit to %s" % (sender.representedObject())) speed = int(sender.representedObject()) if speed != self.speed: sabnzbd.downloader.Downloader.do.limit_speed('%s%%' % speed) self.speedlimitUpdate() def purgeAction_(self, sender): mode = sender.representedObject() # logging.info("[osx] purge %s" % (mode)) if mode == "queue": NzbQueue.do.remove_all() elif mode == "history": if not self.history_db: self.history_db = sabnzbd.database.HistoryDB() self.history_db.remove_history() def pauseAction_(self, sender): minutes = int(sender.representedObject()) # logging.info("[osx] pause for %s" % (minutes)) if minutes: scheduler.plan_resume(minutes) else: sabnzbd.downloader.Downloader.do.pause() def resumeAction_(self, sender): scheduler.plan_resume(0) def watchedFolderAction_(self, sender): sabnzbd.dirscanner.dirscan() def rssAction_(self, sender): scheduler.force_rss() def openFolderAction_(self, sender): folder2open = sender.representedObject() if isinstance(folder2open, str): folder2open = folder2open.encode("utf-8") if debug == 1: NSLog("[osx] %@", folder2open) os.system('open "%s"' % folder2open) # def aboutAction_(self, sender): # app = NSApplication.sharedApplication() # app.orderFrontStandardAboutPanel_(nil) def restartAction_(self, sender): self.setMenuTitle_("\n\n%s\n" % (T('Stopping...'))) logging.info('Restart requested by tray') sabnzbd.trigger_restart() self.setMenuTitle_("\n\n%s\n" % (T('Stopping...'))) def restartSafeHost_(self, sender): sabnzbd.cfg.cherryhost.set('127.0.0.1') sabnzbd.cfg.cherryport.set('8080') sabnzbd.cfg.enable_https.set(False) sabnzbd.config.save_config() self.setMenuTitle_("\n\n%s\n" % (T('Stopping...'))) sabnzbd.trigger_restart() self.setMenuTitle_("\n\n%s\n" % (T('Stopping...'))) def restartNoLogin_(self, sender): sabnzbd.cfg.username.set('') sabnzbd.cfg.password.set('') sabnzbd.config.save_config() self.setMenuTitle_("\n\n%s\n" % (T('Stopping...'))) sabnzbd.trigger_restart() self.setMenuTitle_("\n\n%s\n" % (T('Stopping...'))) def application_openFiles_(self, nsapp, filenames): # logging.info('[osx] file open') # logging.info('[osx] file : %s' % (filenames)) for name in filenames: logging.info('[osx] receiving from OSX : %s', name) if os.path.exists(name): fn = get_filename(name) # logging.info('[osx] filename : %s' % (fn)) if fn: if get_ext(name) in VALID_ARCHIVES: # logging.info('[osx] archive') dirscanner.process_nzb_archive_file(fn, name, keep=True) elif get_ext(name) in VALID_NZB_FILES: # logging.info('[osx] nzb') dirscanner.process_single_nzb(fn, name, keep=True) # logging.info('opening done') def applicationShouldTerminate_(self, sender): logging.info('[osx] application terminating') self.setMenuTitle_("\n\n%s\n" % (T('Stopping...'))) self.status_item.setHighlightMode_(NO) self.osx_icon = False sabnzbd.shutdown_program() try: notifier.send_notification('SABnzbd', T('SABnzbd shutdown finished'), notifier.NOTIFICATION['other']) except AttributeError: # Fails for the OSX binary pass logging.info('Leaving SABnzbd') sys.stderr.flush() sys.stdout.flush() return NSTerminateNow def notify(notificationName, message): """ Send a notification to the OS (OSX-only) """ if sabnzbd.FOUNDATION: pool = Foundation.NSAutoreleasePool.alloc().init() nc = Foundation.NSDistributedNotificationCenter.defaultCenter() nc.postNotificationName_object_(notificationName, message) del pool sabnzbd-develop/sabnzbd/__init__.py0000600000175000017500000010515113642116632015474 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Imported to be referenced from other files directly from sabnzbd.version import __version__, __baseline__ import os import logging import datetime import tempfile import pickle import gzip import subprocess import time import socket import cherrypy import sys import re import ssl from threading import Lock, Thread ############################################################################## # Determine platform flags ############################################################################## WIN32 = DARWIN = FOUNDATION = WIN64 = DOCKER = False KERNEL32 = None if os.name == "nt": WIN32 = True from util.apireg import del_connection_info try: import ctypes KERNEL32 = ctypes.windll.LoadLibrary("Kernel32.dll") except: pass elif os.name == "posix": ORG_UMASK = os.umask(18) os.umask(ORG_UMASK) # Check if running in a Docker container try: with open("/proc/1/cgroup", "rt") as ifh: DOCKER = ":/docker/" in ifh.read() except: pass import platform if platform.system().lower() == "darwin": DARWIN = True # 12 = Sierra, 11 = ElCaptain, 10 = Yosemite, 9 = Mavericks, 8 = MountainLion DARWIN_VERSION = int(platform.mac_ver()[0].split(".")[1]) try: import Foundation import sabnzbd.utils.sleepless as sleepless FOUNDATION = True except: pass # Now we can import safely from sabnzbd.nzbqueue import NzbQueue from sabnzbd.postproc import PostProcessor from sabnzbd.downloader import Downloader from sabnzbd.assembler import Assembler from sabnzbd.rating import Rating import sabnzbd.misc as misc import sabnzbd.filesystem as filesystem import sabnzbd.powersup as powersup from sabnzbd.dirscanner import DirScanner, process_nzb_archive_file, process_single_nzb from sabnzbd.urlgrabber import URLGrabber import sabnzbd.scheduler as scheduler import sabnzbd.rss as rss import sabnzbd.emailer as emailer from sabnzbd.articlecache import ArticleCache import sabnzbd.newsunpack import sabnzbd.encoding as encoding import sabnzbd.config as config 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.interface import sabnzbd.nzbstuff as nzbstuff import sabnzbd.directunpacker as directunpacker from sabnzbd.decorators import synchronized from sabnzbd.constants import ( NORMAL_PRIORITY, VALID_ARCHIVES, REPAIR_REQUEST, QUEUE_FILE_NAME, QUEUE_VERSION, QUEUE_FILE_TMPL, ) import sabnzbd.getipaddress as getipaddress LINUX_POWER = powersup.HAVE_DBUS START = datetime.datetime.now() MY_NAME = None MY_FULLNAME = None RESTART_ARGS = [] NEW_VERSION = (None, None) DIR_HOME = None DIR_APPDATA = None DIR_LCLDATA = None DIR_PROG = None DIR_INTERFACES = None DIR_LANGUAGE = None DIR_PID = None QUEUECOMPLETE = None # stores the nice name of the action QUEUECOMPLETEACTION = None # stores the name of the function to be called QUEUECOMPLETEARG = None # stores an extra arguments that need to be passed DAEMON = None LOGFILE = None WEBLOGFILE = None LOGHANDLER = None GUIHANDLER = None LOG_ALL = False AMBI_LOCALHOST = False WIN_SERVICE = None # Instance of our Win32 Service Class BROWSER_URL = None CMDLINE = "" # Rendering of original command line arguments CERTIFICATE_VALIDATION = True NO_DOWNLOADING = False # When essentials are missing (SABYenc/par2/unrar) WEB_DIR = None WEB_DIR_CONFIG = None WIZARD_DIR = None WEB_COLOR = None SABSTOP = False RESTART_REQ = False PAUSED_ALL = False TRIGGER_RESTART = False # To trigger restart for Scheduler, WinService and Mac WINTRAY = None # Thread for the Windows SysTray icon WEBUI_READY = False LAST_WARNING = None LAST_ERROR = None EXTERNAL_IPV6 = False LAST_HISTORY_UPDATE = 1 # Performance measure for dashboard PYSTONE_SCORE = 0 DOWNLOAD_DIR_SPEED = 0 COMPLETE_DIR_SPEED = 0 INTERNET_BANDWIDTH = 0 __INITIALIZED__ = False __SHUTTING_DOWN__ = False ############################################################################## # Signal Handler ############################################################################## def sig_handler(signum=None, frame=None): global SABSTOP, WINTRAY if sabnzbd.WIN32 and signum is not None and DAEMON and signum == 5: # Ignore the "logoff" event when running as a Win32 daemon return True if signum is not None: logging.warning(T("Signal %s caught, saving and exiting..."), signum) try: save_state() sabnzbd.zconfig.remove_server() finally: if sabnzbd.WIN32: from util.apireg import del_connection_info del_connection_info() if sabnzbd.WINTRAY: sabnzbd.WINTRAY.terminate = True time.sleep(0.5) else: pid_file() SABSTOP = True os._exit(0) ############################################################################## # Initializing ############################################################################## INIT_LOCK = Lock() def get_db_connection(thread_index=0): # Create a connection and store it in the current thread if not (hasattr(cherrypy.thread_data, "history_db") and cherrypy.thread_data.history_db): cherrypy.thread_data.history_db = sabnzbd.database.HistoryDB() return cherrypy.thread_data.history_db @synchronized(INIT_LOCK) def initialize(pause_downloader=False, clean_up=False, evalSched=False, repair=0): global __INITIALIZED__, __SHUTTING_DOWN__, LOGFILE, WEBLOGFILE, LOGHANDLER, GUIHANDLER, AMBI_LOCALHOST, WAITEXIT, DAEMON, MY_NAME, MY_FULLNAME, NEW_VERSION, DIR_HOME, DIR_APPDATA, DIR_LCLDATA, DIR_PROG, DIR_INTERFACES, DARWIN, RESTART_REQ if __INITIALIZED__: return False __SHUTTING_DOWN__ = False # Set global database connection for Web-UI threads cherrypy.engine.subscribe("start_thread", get_db_connection) # Paused? pause_downloader = pause_downloader or cfg.start_paused() # Clean-up, if requested if clean_up: # New admin folder filesystem.remove_all(cfg.admin_dir.get_path(), "*.sab") # Optionally wait for "incomplete" to become online if cfg.wait_for_dfolder(): wait_for_download_folder() else: cfg.download_dir.set(cfg.download_dir(), create=True) cfg.download_dir.set_create(True) # Set access rights for "incomplete" base folder filesystem.set_permissions(cfg.download_dir.get_path(), recursive=False) # If dirscan_dir cannot be created, set a proper value anyway. # Maybe it's a network path that's temporarily missing. path = cfg.dirscan_dir.get_path() if not os.path.exists(path): filesystem.create_real_path(cfg.dirscan_dir.ident(), "", path, False) # Set call backs for Config items cfg.cache_limit.callback(new_limit) cfg.cherryhost.callback(guard_restart) cfg.cherryport.callback(guard_restart) cfg.web_dir.callback(guard_restart) cfg.web_color.callback(guard_restart) cfg.username.callback(guard_restart) cfg.password.callback(guard_restart) cfg.log_dir.callback(guard_restart) cfg.https_port.callback(guard_restart) cfg.https_cert.callback(guard_restart) cfg.https_key.callback(guard_restart) cfg.enable_https.callback(guard_restart) cfg.top_only.callback(guard_top_only) cfg.pause_on_post_processing.callback(guard_pause_on_pp) cfg.quota_size.callback(guard_quota_size) cfg.quota_day.callback(guard_quota_dp) cfg.quota_period.callback(guard_quota_dp) cfg.language.callback(guard_language) cfg.enable_https_verification.callback(guard_https_ver) guard_https_ver() # Set cache limit if not cfg.cache_limit() or (cfg.cache_limit() in ("200M", "450M") and (sabnzbd.WIN32 or sabnzbd.DARWIN)): cfg.cache_limit.set(misc.get_cache_limit()) ArticleCache.do.new_limit(cfg.cache_limit.get_int()) check_incomplete_vs_complete() # Set language files lang.set_locale_info("SABnzbd", DIR_LANGUAGE) lang.set_language(cfg.language()) sabnzbd.api.clear_trans_cache() sabnzbd.change_queue_complete_action(cfg.queue_complete(), new=False) # One time conversion "speedlimit" in schedules. if not cfg.sched_converted(): schedules = cfg.schedules() newsched = [] for sched in schedules: if "speedlimit" in sched: newsched.append(re.sub(r"(speedlimit \d+)$", r"\1K", sched)) else: newsched.append(sched) cfg.schedules.set(newsched) cfg.sched_converted.set(1) # Second time schedule conversion if cfg.sched_converted() != 2: cfg.schedules.set(["%s %s" % (1, schedule) for schedule in cfg.schedules()]) cfg.sched_converted.set(2) config.save_config() # Add hostname to the whitelist if not cfg.host_whitelist(): cfg.host_whitelist.set(socket.gethostname()) # Do repair if requested if check_repair_request(): repair = 2 pause_downloader = True # Initialize threads rss.init() paused = BPSMeter.do.read() NzbQueue() Downloader(pause_downloader or paused) Assembler() PostProcessor() NzbQueue.do.read_queue(repair) DirScanner() Rating() URLGrabber() scheduler.init() if evalSched: scheduler.analyse(pause_downloader) logging.info("All processes started") RESTART_REQ = False __INITIALIZED__ = True return True @synchronized(INIT_LOCK) def start(): global __INITIALIZED__ if __INITIALIZED__: logging.debug("Starting postprocessor") PostProcessor.do.start() logging.debug("Starting assembler") Assembler.do.start() logging.debug("Starting downloader") Downloader.do.start() scheduler.start() logging.debug("Starting dirscanner") DirScanner.do.start() Rating.do.start() logging.debug("Starting urlgrabber") URLGrabber.do.start() @synchronized(INIT_LOCK) def halt(): global __INITIALIZED__, __SHUTTING_DOWN__ if __INITIALIZED__: logging.info("SABnzbd shutting down...") __SHUTTING_DOWN__ = True # Stop the windows tray icon if sabnzbd.WINTRAY: sabnzbd.WINTRAY.terminate = True sabnzbd.zconfig.remove_server() sabnzbd.directunpacker.abort_all() rss.stop() logging.debug("Stopping URLGrabber") URLGrabber.do.stop() try: URLGrabber.do.join() except: pass logging.debug("Stopping rating") Rating.do.stop() try: Rating.do.join() except: pass logging.debug("Stopping dirscanner") DirScanner.do.stop() try: DirScanner.do.join() except: pass # Stop Required Objects logging.debug("Stopping downloader") sabnzbd.downloader.stop() logging.debug("Stopping assembler") Assembler.do.stop() try: Assembler.do.join() except: pass logging.debug("Stopping postprocessor") PostProcessor.do.stop() try: PostProcessor.do.join() except: pass # Save State try: save_state() except: logging.error(T("Fatal error at saving state"), exc_info=True) # The Scheduler cannot be stopped when the stop was scheduled. # Since all warm-restarts have been removed, it's not longer # needed to stop the scheduler. # We must tell the scheduler to deactivate. scheduler.abort() logging.info("All processes stopped") __INITIALIZED__ = False def trigger_restart(timeout=None): """ Trigger a restart by setting a flag an shutting down CP """ # Sometimes we need to wait a bit to send good-bye to the browser if timeout: time.sleep(timeout) # Add extra arguments if sabnzbd.downloader.Downloader.do.paused: sabnzbd.RESTART_ARGS.append("-p") sys.argv = sabnzbd.RESTART_ARGS # Stop all services sabnzbd.halt() cherrypy.engine.exit() if sabnzbd.WIN32: # Remove connection info for faster restart del_connection_info() # Leave the harder restarts to the polling in SABnzbd.py if sabnzbd.WIN_SERVICE or getattr(sys, "frozen", None) == "macosx_app": sabnzbd.TRIGGER_RESTART = True else: # Do the restart right now cherrypy.engine._do_execv() ############################################################################## # Misc Wrappers ############################################################################## def new_limit(): """ Callback for article cache changes """ ArticleCache.do.new_limit(cfg.cache_limit.get_int()) def guard_restart(): """ Callback for config options requiring a restart """ global RESTART_REQ sabnzbd.RESTART_REQ = True def guard_top_only(): """ Callback for change of top_only option """ NzbQueue.do.set_top_only(cfg.top_only()) def guard_pause_on_pp(): """ Callback for change of pause-download-on-pp """ if cfg.pause_on_post_processing(): pass # Not safe to idle downloader, because we don't know # if post-processing is active now else: Downloader.do.resume_from_postproc() def guard_quota_size(): """ Callback for change of quota_size """ BPSMeter.do.change_quota() def guard_quota_dp(): """ Callback for change of quota_day or quota_period """ scheduler.restart(force=True) def guard_language(): """ Callback for change of the interface language """ sabnzbd.lang.set_language(cfg.language()) sabnzbd.api.clear_trans_cache() def set_https_verification(value): """ Set HTTPS-verification state while returning current setting False = disable verification """ prev = ssl._create_default_https_context == ssl.create_default_context if value: ssl._create_default_https_context = ssl.create_default_context else: ssl._create_default_https_context = ssl._create_unverified_context return prev def guard_https_ver(): """ Callback for change of https verification """ set_https_verification(cfg.enable_https_verification()) def add_url(url, pp=None, script=None, cat=None, priority=None, nzbname=None): """ Add NZB based on a URL, attributes optional """ if "http" not in url: return if not pp or pp == "-1": pp = None if script and script.lower() == "default": script = 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 def save_state(): """ Save all internal bookkeeping to disk """ ArticleCache.do.flush_articles() NzbQueue.do.save() BPSMeter.do.save() rss.save() Rating.do.save() DirScanner.do.save() PostProcessor.do.save() def pause_all(): """ Pause all activities than cause disk access """ global PAUSED_ALL PAUSED_ALL = True Downloader.do.pause() logging.debug("PAUSED_ALL active") def unpause_all(): """ Resume all activities """ global PAUSED_ALL PAUSED_ALL = False Downloader.do.resume() logging.debug("PAUSED_ALL inactive") ############################################################################## # NZB Saving Methods ############################################################################## def backup_exists(filename): """ Return True if backup exists and no_dupes is set """ path = cfg.nzb_backup_dir.get_path() return path and os.path.exists(os.path.join(path, filename + ".gz")) def backup_nzb(filename, data): """ Backup NZB file """ path = cfg.nzb_backup_dir.get_path() if path: save_compressed(path, filename, data) def save_compressed(folder, filename, data): """ Save compressed NZB file in 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(encoding.utob(data)) f.flush() f.close() except: logging.error(T("Saving %s failed"), os.path.join(folder, filename)) logging.info("Traceback: ", exc_info=True) ############################################################################## # Unsynchronized methods ############################################################################## def add_nzbfile( nzbfile, pp=None, script=None, cat=None, priority=NORMAL_PRIORITY, nzbname=None, reuse=False, password=None ): """ Add disk-based NZB file, optional attributes, 'reuse' flag will suppress duplicate detection """ if pp and pp == "-1": pp = None if script and script.lower() == "default": script = None if cat and cat.lower() == "default": cat = None if isinstance(nzbfile, str): # File coming from queue repair filename = nzbfile keep = True else: # TODO: CherryPy mangles unicode-filenames! # See https://github.com/cherrypy/cherrypy/issues/1766 filename = encoding.correct_unknown_encoding(nzbfile.filename) keep = False if not sabnzbd.WIN32: # If windows client sends file to Unix server backslashes may # be included, so convert these filename = filename.replace("\\", "/") filename = os.path.basename(filename) ext = os.path.splitext(filename)[1] if ext.lower() in VALID_ARCHIVES: suffix = ext.lower() else: suffix = ".nzb" logging.info("Adding %s", filename) if isinstance(nzbfile, str): path = nzbfile else: try: nzb_file, path = tempfile.mkstemp(suffix=suffix) os.write(nzb_file, nzbfile.value) os.close(nzb_file) except OSError: logging.error(T("Cannot create temp file for %s"), filename) logging.info("Traceback: ", exc_info=True) return None if ext.lower() in VALID_ARCHIVES: return process_nzb_archive_file( filename, path, pp, script, cat, priority=priority, nzbname=nzbname, password=password ) else: return process_single_nzb( filename, path, pp, script, cat, priority=priority, nzbname=nzbname, keep=keep, reuse=reuse, password=password, ) def enable_server(server): """ Enable server (scheduler only) """ try: config.get_config("servers", server).enable.set(1) except: logging.warning(T("Trying to set status of non-existing server %s"), server) return config.save_config() Downloader.do.update_server(server, server) def disable_server(server): """ Disable server (scheduler only) """ try: config.get_config("servers", server).enable.set(0) except: logging.warning(T("Trying to set status of non-existing server %s"), server) return config.save_config() Downloader.do.update_server(server, server) def system_shutdown(): """ Shutdown system after halting download and saving bookkeeping """ logging.info("Performing system shutdown") Thread(target=halt).start() while __INITIALIZED__: time.sleep(1.0) if sabnzbd.WIN32: powersup.win_shutdown() elif DARWIN: powersup.osx_shutdown() else: powersup.linux_shutdown() def system_hibernate(): """ Hibernate system """ logging.info("Performing system hybernation") if sabnzbd.WIN32: powersup.win_hibernate() elif DARWIN: powersup.osx_hibernate() else: powersup.linux_hibernate() def system_standby(): """ Standby system """ logging.info("Performing system standby") if sabnzbd.WIN32: powersup.win_standby() elif DARWIN: powersup.osx_standby() else: powersup.linux_standby() def shutdown_program(): """ Stop program after halting and saving """ logging.info("[%s] Performing SABnzbd shutdown", misc.caller_name()) sabnzbd.halt() cherrypy.engine.exit() sabnzbd.SABSTOP = True def restart_program(): """ Restart program (used by scheduler) """ logging.info("Scheduled restart request") # Just set the stop flag, because stopping CherryPy from # the scheduler is not reliable sabnzbd.TRIGGER_RESTART = True def change_queue_complete_action(action, new=True): """ Action or script to be performed once the queue has been completed Scripts are prefixed with 'script_' When "new" is False, check whether non-script actions are acceptable """ global QUEUECOMPLETE, QUEUECOMPLETEACTION, QUEUECOMPLETEARG _action = None _argument = None if "script_" in action: # all scripts are labeled script_xxx _action = run_script _argument = action.replace("script_", "") elif new or cfg.queue_complete_pers.get(): if action == "shutdown_pc": _action = system_shutdown elif action == "hibernate_pc": _action = system_hibernate elif action == "standby_pc": _action = system_standby elif action == "shutdown_program": _action = shutdown_program else: action = None else: action = None if new: cfg.queue_complete.set(action or "") config.save_config() # keep the name of the action for matching the current select in queue.tmpl QUEUECOMPLETE = action QUEUECOMPLETEACTION = _action QUEUECOMPLETEARG = _argument def run_script(script): """ Run a user script (queue complete only) """ command = [os.path.join(cfg.script_dir.get_path(), script)] if os.path.exists(command[0]): try: stup, need_shell, command, creationflags = sabnzbd.newsunpack.build_command(command) logging.info("Spawning external command %s", command) subprocess.Popen( command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, creationflags=creationflags, ) except: logging.debug("Failed script %s, Traceback: ", script, exc_info=True) def empty_queues(): """ Return True if queues empty or non-existent """ global __INITIALIZED__ return (not __INITIALIZED__) or (PostProcessor.do.empty() and NzbQueue.do.is_empty()) def keep_awake(): """ If we still have work to do, keep Windows/OSX system awake """ if KERNEL32 or FOUNDATION: if sabnzbd.cfg.keep_awake(): ES_CONTINUOUS = 0x80000000 ES_SYSTEM_REQUIRED = 0x00000001 if (not Downloader.do.is_paused() and not NzbQueue.do.is_empty()) or ( not PostProcessor.do.paused and not PostProcessor.do.empty() ): if KERNEL32: # Set ES_SYSTEM_REQUIRED until the next call KERNEL32.SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED) else: sleepless.keep_awake("SABnzbd is busy downloading and/or post-processing") else: if KERNEL32: # Allow the regular state again KERNEL32.SetThreadExecutionState(ES_CONTINUOUS) else: sleepless.allow_sleep() ################################################################################ # Data IO # ################################################################################ def get_new_id(prefix, folder, check_list=None): """ Return unique prefixed admin identifier within folder optionally making sure that id is not in the check_list. """ for n in range(10000): try: if not os.path.exists(folder): os.makedirs(folder) fd, path = tempfile.mkstemp("", "SABnzbd_%s_" % prefix, folder) os.close(fd) head, tail = os.path.split(path) if not check_list or tail not in check_list: return tail except: logging.error(T("Failure in tempfile.mkstemp")) logging.info("Traceback: ", exc_info=True) break # Cannot create unique id, crash the process raise IOError 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) path = os.path.join(path, _id) # We try 3 times, to avoid any dict or access problems for t in range(3): try: with open(path, "wb") as data_file: if do_pickle: pickle.dump(data, data_file, protocol=pickle.HIGHEST_PROTOCOL) else: data_file.write(data) break except: if silent: # This can happen, probably a removed folder pass elif t == 2: logging.error(T("Saving %s failed"), path) logging.info("Traceback: ", exc_info=True) else: # Wait a tiny bit before trying again time.sleep(0.1) def load_data(data_id, path, remove=True, do_pickle=True, silent=False): """ Read data from disk file """ path = os.path.join(path, data_id) if not os.path.exists(path): logging.info("[%s] %s missing", misc.caller_name(), path) return None if not silent: logging.debug("[%s] Loading data for %s from %s", misc.caller_name(), data_id, path) try: with open(path, "rb") as data_file: if do_pickle: try: data = pickle.load(data_file, encoding=sabnzbd.encoding.CODEPAGE) except UnicodeDecodeError: # Could be Python 2 data that we can load using old encoding data = pickle.load(data_file, encoding="latin1") else: data = data_file.read() if remove: filesystem.remove_file(path) except: logging.error(T("Loading %s failed"), path) logging.info("Traceback: ", exc_info=True) return None return data def remove_data(_id, path): """ Remove admin file """ path = os.path.join(path, _id) try: if os.path.exists(path): filesystem.remove_file(path) except: logging.debug("Failed to remove %s", path) def save_admin(data, data_id): """ Save data in admin folder in specified format """ logging.debug("[%s] Saving data for %s", misc.caller_name(), data_id) save_data(data, data_id, cfg.admin_dir.get_path()) def load_admin(data_id, remove=False, silent=False): """ Read data in admin folder in specified format """ logging.debug("[%s] Loading data for %s from %s", misc.caller_name(), data_id) return load_data(data_id, cfg.admin_dir.get_path(), remove=remove, silent=silent) def pp_to_opts(pp): """ Convert numeric processing options to (repair, unpack, delete) """ # Convert the pp to an int pp = sabnzbd.interface.int_conv(pp) if pp == 0: return False, False, False if pp == 1: return True, False, False if pp == 2: return True, True, False return True, True, True def opts_to_pp(repair, unpack, delete): """ Convert (repair, unpack, delete) to numeric process options """ if repair is None: return None pp = 0 if repair: pp = 1 if unpack: pp = 2 if delete: pp = 3 return pp def request_repair(): """ Request a full repair on next restart """ path = os.path.join(cfg.admin_dir.get_path(), REPAIR_REQUEST) try: f = open(path, "w") f.write("\n") f.close() except: pass def check_repair_request(): """ Return True if repair request found, remove afterwards """ path = os.path.join(cfg.admin_dir.get_path(), REPAIR_REQUEST) if os.path.exists(path): try: filesystem.remove_file(path) except: pass return True return False def check_all_tasks(): """ Check every task and restart safe ones, else restart program Return True when everything is under control """ if __SHUTTING_DOWN__ or not __INITIALIZED__: return True # Non-restartable threads, require program restart if not sabnzbd.PostProcessor.do.isAlive(): logging.info("Restarting because of crashed postprocessor") return False if not Downloader.do.isAlive(): logging.info("Restarting because of crashed downloader") return False if not Assembler.do.isAlive(): logging.info("Restarting because of crashed assembler") return False # Kick the downloader, in case it missed the semaphore Downloader.do.wakeup() # Make sure the right servers are active Downloader.do.check_timers() # Restartable threads if not DirScanner.do.isAlive(): logging.info("Restarting crashed dirscanner") DirScanner.do.__init__() if not URLGrabber.do.isAlive(): logging.info("Restarting crashed urlgrabber") URLGrabber.do.__init__() if not Rating.do.isAlive(): logging.info("Restarting crashed rating") Rating.do.__init__() if not sabnzbd.scheduler.sched_check(): logging.info("Restarting crashed scheduler") sabnzbd.scheduler.init() sabnzbd.downloader.Downloader.do.unblock_all() # Check one-shot pause sabnzbd.scheduler.pause_check() # Check (and terminate) idle jobs sabnzbd.nzbqueue.NzbQueue.do.stop_idle_jobs() return True def pid_file(pid_path=None, pid_file=None, port=0): """ Create or remove pid file """ global DIR_PID if not sabnzbd.WIN32: if pid_path and pid_path.startswith("/"): DIR_PID = os.path.join(pid_path, "sabnzbd-%d.pid" % port) elif pid_file and pid_file.startswith("/"): DIR_PID = pid_file if DIR_PID: try: if port: f = open(DIR_PID, "w") f.write("%d\n" % os.getpid()) f.close() else: filesystem.remove_file(DIR_PID) except: logging.warning("Cannot access PID file %s", DIR_PID) def check_incomplete_vs_complete(): """ Make sure "incomplete" and "complete" are not identical """ complete = cfg.complete_dir.get_path() if filesystem.same_file(cfg.download_dir.get_path(), complete): if filesystem.real_path("X", cfg.download_dir()) == cfg.download_dir(): # Abs path, so set an abs path too cfg.download_dir.set(os.path.join(complete, "incomplete")) else: cfg.download_dir.set("incomplete") def wait_for_download_folder(): """ Wait for download folder to become available """ while not cfg.download_dir.test_path(): logging.debug('Waiting for "incomplete" folder') time.sleep(2.0) # Required wrapper because nzbstuff.py cannot import downloader.py def highest_server(me): return sabnzbd.downloader.Downloader.do.highest_server(me) def test_ipv6(): """ Check if external IPv6 addresses are reachable """ if not cfg.selftest_host(): # User disabled the test, assume active IPv6 return True try: info = getipaddress.addresslookup6(cfg.selftest_host()) except: logging.debug( "Test IPv6: Disabling IPv6, because it looks like it's not available. Reason: %s", sys.exc_info()[0] ) return False try: af, socktype, proto, canonname, sa = info[0] sock = socket.socket(af, socktype, proto) sock.settimeout(2) # 2 second timeout sock.connect(sa[0:2]) sock.close() logging.debug("Test IPv6: IPv6 test successful. Enabling IPv6") return True except socket.error: logging.debug("Test IPv6: Cannot reach IPv6 test host. Disabling IPv6") return False except: logging.debug("Test IPv6: Problem during IPv6 connect. Disabling IPv6. Reason: %s", sys.exc_info()[0]) return False def test_cert_checking(): """ Test quality of certificate validation """ # User disabled the test, assume proper SSL certificates if not cfg.selftest_host(): return True # Try a connection to our test-host try: ctx = ssl.create_default_context() base_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ssl_sock = ctx.wrap_socket(base_sock, server_hostname=cfg.selftest_host()) ssl_sock.settimeout(2.0) ssl_sock.connect((cfg.selftest_host(), 443)) ssl_sock.close() return True except (socket.gaierror, socket.timeout): # Non-SSL related error. # We now assume that certificates work instead of forcing # lower quality just because some (temporary) internet problem logging.info("Could not determine system certificate validation quality due to connection problems") return True except: # Seems something is still wrong sabnzbd.set_https_verification(False) return False def history_updated(): """ To make sure we always have a fresh history """ sabnzbd.LAST_HISTORY_UPDATE += 1 # Never go over the limit if sabnzbd.LAST_HISTORY_UPDATE + 1 >= sys.maxsize: sabnzbd.LAST_HISTORY_UPDATE = 1 sabnzbd-develop/sabnzbd/cfg.py0000600000175000017500000005671013642116632014502 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.cfg - Configuration Parameters """ import re import sabnzbd from sabnzbd.constants import ( DEF_HOST, DEF_PORT, DEF_STDINTF, DEF_ADMIN_DIR, DEF_DOWNLOAD_DIR, DEF_NZBBACK_DIR, DEF_SCANRATE, DEF_COMPLETE_DIR, QUEUE_VERSION, ) from sabnzbd.config import ( OptionBool, OptionNumber, OptionPassword, OptionDir, OptionStr, OptionList, no_nonsense, validate_octal, validate_safedir, all_lowercase, create_api_key, validate_notempty, ) ############################################################################## # Email validation support ############################################################################## RE_VAL = re.compile(r"[^@ ]+@[^.@ ]+\.[^.@ ]") def validate_email(value): global email_endjob, email_full, email_rss if email_endjob() or email_full() or email_rss(): if isinstance(value, list): values = value else: values = [value] for addr in values: if not (addr and RE_VAL.match(addr)): return T("%s is not a valid email address") % addr, None return None, value def validate_server(value): """ Check if server non-empty""" global email_endjob, email_full, email_rss if value == "" and (email_endjob() or email_full() or email_rss()): return T("Server address required"), None else: return None, value ############################################################################## # Special settings ############################################################################## pre_script = OptionStr("misc", "pre_script", "None") queue_complete = OptionStr("misc", "queue_complete") queue_complete_pers = OptionBool("misc", "queue_complete_pers", False) bandwidth_perc = OptionNumber("misc", "bandwidth_perc", 0, 0, 100) refresh_rate = OptionNumber("misc", "refresh_rate", 0) log_level = OptionNumber("logging", "log_level", 1, -1, 2) log_size = OptionStr("logging", "max_log_size", "5242880") log_backups = OptionNumber("logging", "log_backups", 5, 1, 1024) queue_limit = OptionNumber("misc", "queue_limit", 20, 0) configlock = OptionBool("misc", "config_lock", 0) ############################################################################## # One time trackers ############################################################################## warned_old_queue = OptionNumber("misc", "warned_old_queue", QUEUE_VERSION) sched_converted = OptionBool("misc", "sched_converted", False) notified_new_skin = OptionNumber("misc", "notified_new_skin", 0) direct_unpack_tested = OptionBool("misc", "direct_unpack_tested", False) ############################################################################## # Config - General ############################################################################## version_check = OptionNumber("misc", "check_new_rel", 1) autobrowser = OptionBool("misc", "auto_browser", True) language = OptionStr("misc", "language", "en") enable_https_verification = OptionBool("misc", "enable_https_verification", True) cherryhost = OptionStr("misc", "host", DEF_HOST) cherryport = OptionStr("misc", "port", DEF_PORT) https_port = OptionStr("misc", "https_port") username = OptionStr("misc", "username") password = OptionPassword("misc", "password") bandwidth_max = OptionStr("misc", "bandwidth_max") cache_limit = OptionStr("misc", "cache_limit") web_dir = OptionStr("misc", "web_dir", DEF_STDINTF) web_color = OptionStr("misc", "web_color", "") https_cert = OptionDir("misc", "https_cert", "server.cert", create=False) https_key = OptionDir("misc", "https_key", "server.key", create=False) https_chain = OptionDir("misc", "https_chain", create=False) enable_https = OptionBool("misc", "enable_https", False) # 0=local-only, 1=nzb, 2=api, 3=full_api, 4=webui, 5=webui with login for external inet_exposure = OptionNumber("misc", "inet_exposure", 0, protect=True) local_ranges = OptionList("misc", "local_ranges", protect=True) api_key = OptionStr("misc", "api_key", create_api_key()) nzb_key = OptionStr("misc", "nzb_key", create_api_key()) ############################################################################## # Config - Folders ############################################################################## umask = OptionStr("misc", "permissions", "", validation=validate_octal) download_dir = OptionDir("misc", "download_dir", DEF_DOWNLOAD_DIR, create=False, validation=validate_safedir) download_free = OptionStr("misc", "download_free") complete_dir = OptionDir( "misc", "complete_dir", DEF_COMPLETE_DIR, create=False, apply_umask=True, validation=validate_notempty ) script_dir = OptionDir("misc", "script_dir", create=True, writable=False) nzb_backup_dir = OptionDir("misc", "nzb_backup_dir", DEF_NZBBACK_DIR) admin_dir = OptionDir("misc", "admin_dir", DEF_ADMIN_DIR, validation=validate_safedir) dirscan_dir = OptionDir("misc", "dirscan_dir", create=False) dirscan_speed = OptionNumber("misc", "dirscan_speed", DEF_SCANRATE, 0, 3600) password_file = OptionDir("misc", "password_file", "", create=False) log_dir = OptionDir("misc", "log_dir", "logs", validation=validate_notempty) ############################################################################## # Config - Switches ############################################################################## max_art_tries = OptionNumber("misc", "max_art_tries", 3, 2) load_balancing = OptionNumber("misc", "load_balancing", 2) top_only = OptionBool("misc", "top_only", False) sfv_check = OptionBool("misc", "sfv_check", True) quick_check_ext_ignore = OptionList("misc", "quick_check_ext_ignore", ["nfo", "sfv", "srr"]) script_can_fail = OptionBool("misc", "script_can_fail", False) ssl_ciphers = OptionStr("misc", "ssl_ciphers", "") # Now per-server setting enable_recursive = OptionBool("misc", "enable_recursive", True) flat_unpack = OptionBool("misc", "flat_unpack", False) par_option = OptionStr("misc", "par_option", "", validation=no_nonsense) pre_check = OptionBool("misc", "pre_check", False) nice = OptionStr("misc", "nice", "", validation=no_nonsense) win_process_prio = OptionNumber("misc", "win_process_prio", 3) ionice = OptionStr("misc", "ionice", "", validation=no_nonsense) fail_hopeless_jobs = OptionBool("misc", "fail_hopeless_jobs", True) fast_fail = OptionBool("misc", "fast_fail", 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) direct_unpack = OptionBool("misc", "direct_unpack", False) direct_unpack_threads = OptionNumber("misc", "direct_unpack_threads", 3, 1) propagation_delay = OptionNumber("misc", "propagation_delay", 0) folder_rename = OptionBool("misc", "folder_rename", True) replace_spaces = OptionBool("misc", "replace_spaces", False) replace_dots = OptionBool("misc", "replace_dots", False) safe_postproc = OptionBool("misc", "safe_postproc", True) pause_on_post_processing = OptionBool("misc", "pause_on_post_processing", False) sanitize_safe = OptionBool("misc", "sanitize_safe", False) cleanup_list = OptionList("misc", "cleanup_list") unwanted_extensions = OptionList("misc", "unwanted_extensions") action_on_unwanted_extensions = OptionNumber("misc", "action_on_unwanted_extensions", 0) new_nzb_on_failure = OptionBool("misc", "new_nzb_on_failure", False) history_retention = OptionStr("misc", "history_retention", "0") enable_meta = OptionBool("misc", "enable_meta", True) quota_size = OptionStr("misc", "quota_size") quota_day = OptionStr("misc", "quota_day") quota_resume = OptionBool("misc", "quota_resume", False) quota_period = OptionStr("misc", "quota_period", "m") rating_enable = OptionBool("misc", "rating_enable", False) rating_host = OptionStr("misc", "rating_host") rating_api_key = OptionStr("misc", "rating_api_key") rating_filter_enable = OptionBool("misc", "rating_filter_enable", False) rating_filter_abort_audio = OptionNumber("misc", "rating_filter_abort_audio", 0) rating_filter_abort_video = OptionNumber("misc", "rating_filter_abort_video", 0) rating_filter_abort_encrypted = OptionBool("misc", "rating_filter_abort_encrypted", False) rating_filter_abort_encrypted_confirm = OptionBool("misc", "rating_filter_abort_encrypted_confirm", False) rating_filter_abort_spam = OptionBool("misc", "rating_filter_abort_spam", False) rating_filter_abort_spam_confirm = OptionBool("misc", "rating_filter_abort_spam_confirm", False) rating_filter_abort_downvoted = OptionBool("misc", "rating_filter_abort_downvoted", False) rating_filter_abort_keywords = OptionStr("misc", "rating_filter_abort_keywords") rating_filter_pause_audio = OptionNumber("misc", "rating_filter_pause_audio", 0) rating_filter_pause_video = OptionNumber("misc", "rating_filter_pause_video", 0) rating_filter_pause_encrypted = OptionBool("misc", "rating_filter_pause_encrypted", False) rating_filter_pause_encrypted_confirm = OptionBool("misc", "rating_filter_pause_encrypted_confirm", False) rating_filter_pause_spam = OptionBool("misc", "rating_filter_pause_spam", False) rating_filter_pause_spam_confirm = OptionBool("misc", "rating_filter_pause_spam_confirm", False) rating_filter_pause_downvoted = OptionBool("misc", "rating_filter_pause_downvoted", False) rating_filter_pause_keywords = OptionStr("misc", "rating_filter_pause_keywords") ############################################################################## # Config - Sorting ############################################################################## enable_tv_sorting = OptionBool("misc", "enable_tv_sorting", False) tv_sort_string = OptionStr("misc", "tv_sort_string") tv_sort_countries = OptionNumber("misc", "tv_sort_countries", 1) tv_categories = OptionList("misc", "tv_categories", "") enable_movie_sorting = OptionBool("misc", "enable_movie_sorting", False) movie_sort_string = OptionStr("misc", "movie_sort_string") movie_sort_extra = OptionStr("misc", "movie_sort_extra", "-cd%1", strip=False) movie_extra_folders = OptionBool("misc", "movie_extra_folder", False) movie_categories = OptionList("misc", "movie_categories", ["movies"]) enable_date_sorting = OptionBool("misc", "enable_date_sorting", False) date_sort_string = OptionStr("misc", "date_sort_string") date_categories = OptionList("misc", "date_categories", ["tv"]) ############################################################################## # Config - Scheduling and RSS ############################################################################## schedules = OptionList("misc", "schedlines") rss_rate = OptionNumber("misc", "rss_rate", 60, 15, 24 * 60) ############################################################################## # Config - Specials ############################################################################## # Bool switches ampm = OptionBool("misc", "ampm", False) replace_illegal = OptionBool("misc", "replace_illegal", True) start_paused = OptionBool("misc", "start_paused", False) enable_all_par = OptionBool("misc", "enable_all_par", False) enable_par_cleanup = OptionBool("misc", "enable_par_cleanup", True) enable_unrar = OptionBool("misc", "enable_unrar", True) enable_unzip = OptionBool("misc", "enable_unzip", True) enable_7zip = OptionBool("misc", "enable_7zip", True) enable_filejoin = OptionBool("misc", "enable_filejoin", True) enable_tsjoin = OptionBool("misc", "enable_tsjoin", True) overwrite_files = OptionBool("misc", "overwrite_files", False) ignore_unrar_dates = OptionBool("misc", "ignore_unrar_dates", False) ignore_wrong_unrar = OptionBool("misc", "ignore_wrong_unrar", False) multipar = OptionBool("misc", "multipar", sabnzbd.WIN32) backup_for_duplicates = OptionBool("misc", "backup_for_duplicates", True) empty_postproc = OptionBool("misc", "empty_postproc", False) wait_for_dfolder = OptionBool("misc", "wait_for_dfolder", False) warn_empty_nzb = OptionBool("misc", "warn_empty_nzb", True) rss_filenames = OptionBool("misc", "rss_filenames", False) api_logging = OptionBool("misc", "api_logging", True) html_login = OptionBool("misc", "html_login", True) osx_menu = OptionBool("misc", "osx_menu", True) osx_speed = OptionBool("misc", "osx_speed", True) warn_dupl_jobs = OptionBool("misc", "warn_dupl_jobs", True) 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) max_art_opt = OptionBool("misc", "max_art_opt", False) ipv6_hosting = OptionBool("misc", "ipv6_hosting", False) 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) ignore_empty_files = OptionBool("misc", "ignore_empty_files", False) x_frame_options = OptionBool("misc", "x_frame_options", True) require_modern_tls = OptionBool("misc", "require_modern_tls", False) # Text values rss_odd_titles = OptionList("misc", "rss_odd_titles", ["nzbindex.nl/", "nzbindex.com/", "nzbclub.com/"]) req_completion_rate = OptionNumber("misc", "req_completion_rate", 100.2, 100, 200) selftest_host = OptionStr("misc", "selftest_host", "self-test.sabnzbd.org") movie_rename_limit = OptionStr("misc", "movie_rename_limit", "100M") size_limit = OptionStr("misc", "size_limit", "0") show_sysload = OptionNumber("misc", "show_sysload", 2, 0, 2) 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") host_whitelist = OptionList("misc", "host_whitelist", validation=all_lowercase) max_url_retries = OptionNumber("misc", "max_url_retries", 10, 1) ############################################################################## # Config - Notifications ############################################################################## # [email] email_server = OptionStr("misc", "email_server", validation=validate_server) email_to = OptionList("misc", "email_to", validation=validate_email) email_from = OptionStr("misc", "email_from", validation=validate_email) email_account = OptionStr("misc", "email_account") email_pwd = OptionPassword("misc", "email_pwd") email_endjob = OptionNumber("misc", "email_endjob", 0, 0, 2) email_full = OptionBool("misc", "email_full", False) email_dir = OptionDir("misc", "email_dir", create=True) email_rss = OptionBool("misc", "email_rss", False) email_cats = OptionList("misc", "email_cats", ["*"]) # [ncenter] ncenter_enable = OptionBool("ncenter", "ncenter_enable", sabnzbd.DARWIN) ncenter_cats = OptionList("ncenter", "ncenter_cats", ["*"]) ncenter_prio_startup = OptionBool("ncenter", "ncenter_prio_startup", True) ncenter_prio_download = OptionBool("ncenter", "ncenter_prio_download", False) ncenter_prio_pp = OptionBool("ncenter", "ncenter_prio_pp", False) ncenter_prio_complete = OptionBool("ncenter", "ncenter_prio_complete", True) ncenter_prio_failed = OptionBool("ncenter", "ncenter_prio_failed", True) ncenter_prio_disk_full = OptionBool("ncenter", "ncenter_prio_disk_full", True) ncenter_prio_new_login = OptionBool("ncenter", "ncenter_prio_new_login", False) ncenter_prio_warning = OptionBool("ncenter", "ncenter_prio_warning", False) ncenter_prio_error = OptionBool("ncenter", "ncenter_prio_error", False) ncenter_prio_queue_done = OptionBool("ncenter", "ncenter_prio_queue_done", True) ncenter_prio_other = OptionBool("ncenter", "ncenter_prio_other", False) # [acenter] acenter_enable = OptionBool("acenter", "acenter_enable", sabnzbd.WIN32) acenter_cats = OptionList("acenter", "acenter_cats", ["*"]) acenter_prio_startup = OptionBool("acenter", "acenter_prio_startup", False) acenter_prio_download = OptionBool("acenter", "acenter_prio_download", False) acenter_prio_pp = OptionBool("acenter", "acenter_prio_pp", False) acenter_prio_complete = OptionBool("acenter", "acenter_prio_complete", True) acenter_prio_failed = OptionBool("acenter", "acenter_prio_failed", True) acenter_prio_disk_full = OptionBool("acenter", "acenter_prio_disk_full", True) acenter_prio_new_login = OptionBool("acenter", "acenter_prio_new_login", False) acenter_prio_warning = OptionBool("acenter", "acenter_prio_warning", False) acenter_prio_error = OptionBool("acenter", "acenter_prio_error", False) acenter_prio_queue_done = OptionBool("acenter", "acenter_prio_queue_done", True) acenter_prio_other = OptionBool("acenter", "acenter_prio_other", False) # [ntfosd] ntfosd_enable = OptionBool("ntfosd", "ntfosd_enable", not sabnzbd.WIN32 and not sabnzbd.DARWIN) ntfosd_cats = OptionList("ntfosd", "ntfosd_cats", ["*"]) ntfosd_prio_startup = OptionBool("ntfosd", "ntfosd_prio_startup", True) ntfosd_prio_download = OptionBool("ntfosd", "ntfosd_prio_download", False) ntfosd_prio_pp = OptionBool("ntfosd", "ntfosd_prio_pp", False) ntfosd_prio_complete = OptionBool("ntfosd", "ntfosd_prio_complete", True) ntfosd_prio_failed = OptionBool("ntfosd", "ntfosd_prio_failed", True) ntfosd_prio_disk_full = OptionBool("ntfosd", "ntfosd_prio_disk_full", True) ntfosd_prio_new_login = OptionBool("ntfosd", "ntfosd_prio_new_login", False) ntfosd_prio_warning = OptionBool("ntfosd", "ntfosd_prio_warning", False) ntfosd_prio_error = OptionBool("ntfosd", "ntfosd_prio_error", False) ntfosd_prio_queue_done = OptionBool("ntfosd", "ntfosd_prio_queue_done", True) ntfosd_prio_other = OptionBool("ntfosd", "ntfosd_prio_other", False) # [prowl] prowl_enable = OptionBool("prowl", "prowl_enable", False) prowl_cats = OptionList("prowl", "prowl_cats", ["*"]) prowl_apikey = OptionStr("prowl", "prowl_apikey") prowl_prio_startup = OptionNumber("prowl", "prowl_prio_startup", -3) prowl_prio_download = OptionNumber("prowl", "prowl_prio_download", -3) prowl_prio_pp = OptionNumber("prowl", "prowl_prio_pp", -3) prowl_prio_complete = OptionNumber("prowl", "prowl_prio_complete", 0) prowl_prio_failed = OptionNumber("prowl", "prowl_prio_failed", 1) prowl_prio_disk_full = OptionNumber("prowl", "prowl_prio_disk_full", 1) prowl_prio_new_login = OptionNumber("prowl", "prowl_prio_new_login", -3) prowl_prio_warning = OptionNumber("prowl", "prowl_prio_warning", -3) prowl_prio_error = OptionNumber("prowl", "prowl_prio_error", -3) prowl_prio_queue_done = OptionNumber("prowl", "prowl_prio_queue_done", 0) prowl_prio_other = OptionNumber("prowl", "prowl_prio_other", -3) # [pushover] 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) pushover_prio_download = OptionNumber("pushover", "pushover_prio_download", -2) pushover_prio_pp = OptionNumber("pushover", "pushover_prio_pp", -3) pushover_prio_complete = OptionNumber("pushover", "pushover_prio_complete", -1) pushover_prio_failed = OptionNumber("pushover", "pushover_prio_failed", -1) pushover_prio_disk_full = OptionNumber("pushover", "pushover_prio_disk_full", 1) pushover_prio_new_login = OptionNumber("pushover", "pushover_prio_new_login", -3) pushover_prio_warning = OptionNumber("pushover", "pushover_prio_warning", 1) pushover_prio_error = OptionNumber("pushover", "pushover_prio_error", 1) pushover_prio_queue_done = OptionNumber("pushover", "pushover_prio_queue_done", -1) pushover_prio_other = OptionNumber("pushover", "pushover_prio_other", -3) # [pushbullet] pushbullet_enable = OptionBool("pushbullet", "pushbullet_enable") pushbullet_cats = OptionList("pushbullet", "pushbullet_cats", ["*"]) pushbullet_apikey = OptionStr("pushbullet", "pushbullet_apikey") pushbullet_device = OptionStr("pushbullet", "pushbullet_device") pushbullet_prio_startup = OptionNumber("pushbullet", "pushbullet_prio_startup", 0) pushbullet_prio_download = OptionNumber("pushbullet", "pushbullet_prio_download", 0) pushbullet_prio_pp = OptionNumber("pushbullet", "pushbullet_prio_pp", 0) pushbullet_prio_complete = OptionNumber("pushbullet", "pushbullet_prio_complete", 1) pushbullet_prio_failed = OptionNumber("pushbullet", "pushbullet_prio_failed", 1) pushbullet_prio_disk_full = OptionNumber("pushbullet", "pushbullet_prio_disk_full", 1) pushbullet_prio_new_login = OptionNumber("pushbullet", "pushbullet_prio_new_login", 0) pushbullet_prio_warning = OptionNumber("pushbullet", "pushbullet_prio_warning", 0) pushbullet_prio_error = OptionNumber("pushbullet", "pushbullet_prio_error", 0) pushbullet_prio_queue_done = OptionNumber("pushbullet", "pushbullet_prio_queue_done", 0) pushbullet_prio_other = OptionNumber("pushbullet", "pushbullet_prio_other", 0) # [nscript] nscript_enable = OptionBool("nscript", "nscript_enable") nscript_cats = OptionList("nscript", "nscript_cats", ["*"]) nscript_script = OptionStr("nscript", "nscript_script") nscript_parameters = OptionStr("nscript", "nscript_parameters") nscript_prio_startup = OptionBool("nscript", "nscript_prio_startup", True) nscript_prio_download = OptionBool("nscript", "nscript_prio_download", False) nscript_prio_pp = OptionBool("nscript", "nscript_prio_pp", False) nscript_prio_complete = OptionBool("nscript", "nscript_prio_complete", True) nscript_prio_failed = OptionBool("nscript", "nscript_prio_failed", True) nscript_prio_disk_full = OptionBool("nscript", "nscript_prio_disk_full", True) nscript_prio_new_login = OptionBool("nscript", "nscript_prio_new_login", False) nscript_prio_warning = OptionBool("nscript", "nscript_prio_warning", False) nscript_prio_error = OptionBool("nscript", "nscript_prio_error", False) nscript_prio_queue_done = OptionBool("nscript", "nscript_prio_queue_done", True) nscript_prio_other = OptionBool("nscript", "nscript_prio_other", False) ############################################################################## # Set root folders for Folder config-items ############################################################################## def set_root_folders(home, lcldata): email_dir.set_root(home) download_dir.set_root(home) complete_dir.set_root(home) script_dir.set_root(home) nzb_backup_dir.set_root(lcldata) admin_dir.set_root(lcldata) dirscan_dir.set_root(home) log_dir.set_root(lcldata) password_file.set_root(home) def set_root_folders2(): https_cert.set_root(admin_dir.get_path()) https_key.set_root(admin_dir.get_path()) https_chain.set_root(admin_dir.get_path()) sabnzbd-develop/sabnzbd/downloader.py0000600000175000017500000011533013642116632016073 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.downloader - download engine """ import time import select import logging from threading import Thread, RLock from nntplib import NNTPPermanentError import socket import random import sys import queue import sabnzbd from sabnzbd.decorators import synchronized, NzbQueueLocker, DOWNLOADER_CV from sabnzbd.constants import MAX_DECODE_QUEUE, LIMIT_DECODE_QUEUE from sabnzbd.decoder import Decoder from sabnzbd.newswrapper import NewsWrapper, request_server_info from sabnzbd.articlecache import ArticleCache import sabnzbd.notifier as notifier import sabnzbd.config as config import sabnzbd.cfg as cfg from sabnzbd.bpsmeter import BPSMeter import sabnzbd.scheduler from sabnzbd.misc import from_units, nntp_to_msg, int_conv from sabnzbd.utils.happyeyeballs import happyeyeballs # Timeout penalty in minutes for each cause _PENALTY_UNKNOWN = 3 # Unknown cause _PENALTY_502 = 5 # Unknown 502 _PENALTY_TIMEOUT = 10 # Server doesn't give an answer (multiple times) _PENALTY_SHARE = 10 # Account sharing detected _PENALTY_TOOMANY = 10 # Too many connections _PENALTY_PERM = 10 # Permanent error, like bad username/password _PENALTY_SHORT = 1 # Minimal penalty when no_penalties is set _PENALTY_VERYSHORT = 0.1 # Error 400 without cause clues TIMER_LOCK = RLock() class Server: def __init__(self, id, displayname, host, port, timeout, threads, priority, ssl, ssl_verify, ssl_ciphers, send_group, username=None, password=None, optional=False, retention=0): self.id = id self.newid = None self.restart = False self.displayname = displayname self.host = host self.port = port self.timeout = timeout self.threads = threads self.priority = priority self.ssl = ssl self.ssl_verify = ssl_verify self.ssl_ciphers = ssl_ciphers self.optional = optional self.retention = retention self.send_group = send_group self.username = username self.password = password self.busy_threads = [] self.idle_threads = [] self.active = True self.bad_cons = 0 self.errormsg = '' self.warning = '' self.info = None # Will hold getaddrinfo() list self.ssl_info = '' # Will hold the type and cipher of SSL connection self.request = False # True if a getaddrinfo() request is pending self.have_body = 'free.xsusenet.com' not in host self.have_stat = True # Assume server has "STAT", until proven otherwise for i in range(threads): self.idle_threads.append(NewsWrapper(self, i + 1)) @property def hostip(self): """ In case a server still has active connections, we use the same IP again If new connection then based on value of load_balancing() and self.info: 0 - return the first entry, so all threads use the same IP 1 - and self.info has more than 1 entry (read: IP address): Return a random entry from the possible IPs 2 - and self.info has more than 1 entry (read: IP address): Return the quickest IP based on the happyeyeballs algorithm In case of problems: return the host name itself """ # Check if already a successful ongoing connection if self.busy_threads and self.busy_threads[0].nntp: # Re-use that IP logging.debug('%s: Re-using address %s', self.host, self.busy_threads[0].nntp.host) return self.busy_threads[0].nntp.host # Determine new IP if cfg.load_balancing() == 0 and self.info: # Just return the first one, so all next threads use the same IP ip = self.info[0][4][0] logging.debug('%s: Connecting to address %s', self.host, ip) elif cfg.load_balancing() == 1 and self.info and len(self.info) > 1: # Return a random entry from the possible IPs rnd = random.randint(0, len(self.info) - 1) ip = self.info[rnd][4][0] logging.debug('%s: Connecting to address %s', self.host, ip) elif cfg.load_balancing() == 2 and self.info and len(self.info) > 1: # RFC6555 / Happy Eyeballs: ip = happyeyeballs(self.host, port=self.port, ssl=self.ssl) if ip: logging.debug('%s: Connecting to address %s', self.host, ip) else: # nothing returned, so there was a connection problem ip = self.host logging.debug('%s: No successful IP connection was possible', self.host) else: ip = self.host return ip def stop(self, readers, writers): for nw in self.idle_threads: try: fno = nw.nntp.sock.fileno() except: fno = None if fno and fno in readers: readers.pop(fno) if fno and fno in writers: writers.pop(fno) nw.terminate(quit=True) self.idle_threads = [] def __repr__(self): return "%s:%s" % (self.host, self.port) class Downloader(Thread): """ Singleton Downloader Thread """ do = None def __init__(self, paused=False): Thread.__init__(self) logging.debug("Initializing downloader/decoder") # Used for scheduled pausing self.paused = paused # Used for reducing speed self.delayed = False self.bandwidth_limit = 0 self.bandwidth_perc = 0 cfg.bandwidth_perc.callback(self.speed_set) cfg.bandwidth_max.callback(self.speed_set) self.speed_set() # Used to see if we can add a slowdown to the Downloader-loop self.can_be_slowed = None self.can_be_slowed_timer = 0 self.postproc = False self.shutdown = False # A user might change server parms again before server restart is ready. # Keep a counter to prevent multiple restarts self.__restart = 0 self.force_disconnect = False self.read_fds = {} self.write_fds = {} self.servers = [] self.server_dict = {} # For faster lookups, but is not updated later! self.server_nr = 0 self._timers = {} for server in config.get_servers(): self.init_server(None, server) self.decoder_queue = queue.Queue() # Initialize decoders, only 1 for non-SABYenc self.decoder_workers = [] nr_decoders = 2 if sabnzbd.decoder.SABYENC_ENABLED else 1 for i in range(nr_decoders): self.decoder_workers.append(Decoder(self.servers, self.decoder_queue)) Downloader.do = self def init_server(self, oldserver, newserver): """ Setup or re-setup single server When oldserver is defined and in use, delay startup. Note that the server names are "host:port" strings! """ create = False servers = config.get_servers() if newserver in servers: srv = servers[newserver] enabled = srv.enable() displayname = srv.displayname() host = srv.host() port = srv.port() timeout = srv.timeout() threads = srv.connections() priority = srv.priority() ssl = srv.ssl() ssl_verify = srv.ssl_verify() ssl_ciphers = srv.ssl_ciphers() username = srv.username() password = srv.password() optional = srv.optional() retention = float(srv.retention() * 24 * 3600) # days ==> seconds send_group = srv.send_group() create = True if oldserver: for n in range(len(self.servers)): if self.servers[n].id == oldserver: # Server exists, do re-init later create = False self.servers[n].newid = newserver self.servers[n].restart = True self.__restart += 1 break if create and enabled and host and port and threads: server = Server(newserver, displayname, host, port, timeout, threads, priority, ssl, ssl_verify, ssl_ciphers, send_group, username, password, optional, retention) self.servers.append(server) self.server_dict[newserver] = server # Update server-count self.server_nr = len(self.servers) return @NzbQueueLocker def set_paused_state(self, state): """ Set downloader to specified paused state """ self.paused = state @NzbQueueLocker def resume(self): # Do not notify when SABnzbd is still starting if self.paused and sabnzbd.WEB_DIR: logging.info("Resuming") notifier.send_notification("SABnzbd", T('Resuming'), 'download') self.paused = False @NzbQueueLocker def pause(self): """ Pause the downloader, optionally saving admin """ if not self.paused: self.paused = True logging.info("Pausing") notifier.send_notification("SABnzbd", T('Paused'), 'download') if self.is_paused(): BPSMeter.do.reset() if cfg.autodisconnect(): self.disconnect() def delay(self): logging.debug("Delaying") self.delayed = True @NzbQueueLocker def undelay(self): logging.debug("Undelaying") self.delayed = False def wait_for_postproc(self): logging.info("Waiting for post-processing to finish") self.postproc = True @NzbQueueLocker def resume_from_postproc(self): logging.info("Post-processing finished, resuming download") self.postproc = False def disconnect(self): self.force_disconnect = True def limit_speed(self, value): """ Set the actual download speed in Bytes/sec When 'value' ends with a '%' sign or is within 1-100, it is interpreted as a pecentage of the maximum bandwidth When no '%' is found, it is interpreted as an absolute speed (including KMGT notation). """ if value: mx = cfg.bandwidth_max.get_int() if '%' in str(value) or (0 < from_units(value) < 101): limit = value.strip(' %') self.bandwidth_perc = from_units(limit) if mx: self.bandwidth_limit = mx * self.bandwidth_perc / 100 else: logging.warning(T('You must set a maximum bandwidth before you can set a bandwidth limit')) else: self.bandwidth_limit = from_units(value) if mx: self.bandwidth_perc = self.bandwidth_limit / mx * 100 else: self.bandwidth_perc = 100 else: self.speed_set() logging.info("Speed limit set to %s B/s", self.bandwidth_limit) def get_limit(self): return self.bandwidth_perc def get_limit_abs(self): return self.bandwidth_limit def speed_set(self): limit = cfg.bandwidth_max.get_int() perc = cfg.bandwidth_perc() if limit and perc: self.bandwidth_perc = perc self.bandwidth_limit = limit * perc / 100 else: self.bandwidth_perc = 0 self.bandwidth_limit = 0 def is_paused(self): if not self.paused: return False else: if sabnzbd.nzbqueue.NzbQueue.do.has_forced_items(): return False else: return True def highest_server(self, me): """ Return True when this server has the highest priority of the active ones 0 is the highest priority """ for server in self.servers: if server is not me and server.active and server.priority < me.priority: return False return True def nzo_servers(self, nzo): return list(filter(nzo.server_in_try_list, self.servers)) def maybe_block_server(self, server): # Was it resolving problem? if server.info is False: # Warn about resolving issues errormsg = T('Cannot connect to server %s [%s]') % (server.host, T('Server name does not resolve')) if server.errormsg != errormsg: server.errormsg = errormsg logging.warning(errormsg) logging.warning(T('Server %s will be ignored for %s minutes'), server.host, _PENALTY_TIMEOUT) # Not fully the same as the code below for optional servers server.bad_cons = 0 server.active = False self.plan_server(server, _PENALTY_TIMEOUT) # Optional and active server had too many problems. # Disable it now and send a re-enable plan to the scheduler if server.optional and server.active and (server.bad_cons / server.threads) > 3: server.bad_cons = 0 server.active = False logging.warning(T('Server %s will be ignored for %s minutes'), server.host, _PENALTY_TIMEOUT) self.plan_server(server, _PENALTY_TIMEOUT) # Remove all connections to server for nw in server.idle_threads + server.busy_threads: self.__reset_nw(nw, "forcing disconnect", warn=False, wait=False, quit=False) # Make sure server address resolution is refreshed server.info = None sabnzbd.nzbqueue.NzbQueue.do.reset_all_try_lists() def decode(self, article, raw_data): self.decoder_queue.put((article, raw_data)) # See if there's space left in cache, pause otherwise # We use reported article-size, just like sabyenc does # But do allow some articles to enter queue, in case of full cache qsize = self.decoder_queue.qsize() if (not ArticleCache.do.reserve_space(article.bytes) and qsize > MAX_DECODE_QUEUE) or (qsize > LIMIT_DECODE_QUEUE): sabnzbd.downloader.Downloader.do.delay() def run(self): # First check IPv6 connectivity sabnzbd.EXTERNAL_IPV6 = sabnzbd.test_ipv6() logging.debug('External IPv6 test result: %s', sabnzbd.EXTERNAL_IPV6) # Then we check SSL certificate checking sabnzbd.CERTIFICATE_VALIDATION = sabnzbd.test_cert_checking() logging.debug('SSL verification test: %s', sabnzbd.CERTIFICATE_VALIDATION) # Start decoders for decoder in self.decoder_workers: decoder.start() # Kick BPS-Meter to check quota BPSMeter.do.update() while 1: for server in self.servers: for nw in server.busy_threads[:]: if (nw.nntp and nw.nntp.error_msg) or (nw.timeout and time.time() > nw.timeout): if nw.nntp and nw.nntp.error_msg: self.__reset_nw(nw, "", warn=False) else: self.__reset_nw(nw, "timed out") server.bad_cons += 1 self.maybe_block_server(server) if server.restart: if not server.busy_threads: newid = server.newid server.stop(self.read_fds, self.write_fds) self.servers.remove(server) if newid: self.init_server(None, newid) self.__restart -= 1 sabnzbd.nzbqueue.NzbQueue.do.reset_all_try_lists() # Have to leave this loop, because we removed element break else: # Restart pending, don't add new articles continue if not server.idle_threads or server.restart or self.is_paused() or self.shutdown or self.delayed or self.postproc: continue if not server.active: continue for nw in server.idle_threads[:]: if nw.timeout: if time.time() < nw.timeout: continue else: nw.timeout = None if not server.info: # Only request info if there's stuff in the queue if not sabnzbd.nzbqueue.NzbQueue.do.is_empty(): self.maybe_block_server(server) request_server_info(server) break article = sabnzbd.nzbqueue.NzbQueue.do.get_article(server, self.servers) if not article: break if server.retention and article.nzf.nzo.avg_stamp < time.time() - server.retention: # Let's get rid of all the articles for this server at once logging.info('Job %s too old for %s, moving on', article.nzf.nzo.final_name, server.host) while article: self.decode(article, None) article = article.nzf.nzo.get_article(server, self.servers) break server.idle_threads.remove(nw) server.busy_threads.append(nw) nw.article = article if nw.connected: self.__request_article(nw) else: try: logging.info("%s@%s: Initiating connection", nw.thrdnum, server.host) nw.init_connect(self.write_fds) except: logging.error(T('Failed to initialize %s@%s with reason: %s'), nw.thrdnum, server.host, sys.exc_info()[1]) self.__reset_nw(nw, "failed to initialize") # Exit-point if self.shutdown: empty = True for server in self.servers: if server.busy_threads: empty = False break if empty: # Start decoders for decoder in self.decoder_workers: decoder.stop() decoder.join() for server in self.servers: server.stop(self.read_fds, self.write_fds) logging.info("Shutting down") break if self.force_disconnect: for server in self.servers: for nw in server.idle_threads + server.busy_threads: quit = nw.connected and server.active self.__reset_nw(nw, "forcing disconnect", warn=False, wait=False, quit=quit) # Make sure server address resolution is refreshed server.info = None self.force_disconnect = False # => Select readkeys = self.read_fds.keys() writekeys = self.write_fds.keys() if readkeys or writekeys: read, write, error = select.select(readkeys, writekeys, (), 1.0) # Why check so often when so few things happened? if self.can_be_slowed and len(readkeys) >= 8 and len(read) <= 2: time.sleep(0.01) # Need to initialize the check during first 20 seconds if self.can_be_slowed is None or self.can_be_slowed_timer: # Wait for stable speed to start testing if not self.can_be_slowed_timer and BPSMeter.do.get_stable_speed(timespan=10): self.can_be_slowed_timer = time.time() # Check 10 seconds after enabling slowdown if self.can_be_slowed_timer and time.time() > self.can_be_slowed_timer + 10: # Now let's check if it was stable in the last 10 seconds self.can_be_slowed = BPSMeter.do.get_stable_speed(timespan=10) self.can_be_slowed_timer = 0 logging.debug('Downloader-slowdown: %r', self.can_be_slowed) else: read, write, error = ([], [], []) BPSMeter.do.reset() time.sleep(1.0) DOWNLOADER_CV.acquire() while (sabnzbd.nzbqueue.NzbQueue.do.is_empty() or self.is_paused() or self.delayed or self.postproc) and not \ self.shutdown and not self.__restart: DOWNLOADER_CV.wait() DOWNLOADER_CV.release() self.force_disconnect = False for selected in write: nw = self.write_fds[selected] fileno = nw.nntp.sock.fileno() if fileno not in self.read_fds: self.read_fds[fileno] = nw if fileno in self.write_fds: self.write_fds.pop(fileno) if not read: BPSMeter.do.update() continue for selected in read: nw = self.read_fds[selected] article = nw.article server = nw.server if article: nzo = article.nzf.nzo try: bytes_received, done, skip = nw.recv_chunk() except: bytes_received, done, skip = (0, False, False) if skip: BPSMeter.do.update() continue if bytes_received < 1: self.__reset_nw(nw, "server closed connection", warn=False, wait=False) continue else: if self.bandwidth_limit: limit = self.bandwidth_limit if bytes_received + BPSMeter.do.bps > limit: while BPSMeter.do.bps > limit: time.sleep(0.05) BPSMeter.do.update() BPSMeter.do.update(server.id, bytes_received) nzo.update_download_stats(BPSMeter.do.bps, server.id, bytes_received) if not done and nw.status_code != 222: if not nw.connected or nw.status_code == 480: done = False try: nw.finish_connect(nw.status_code) if sabnzbd.LOG_ALL: logging.debug("%s@%s last message -> %s", nw.thrdnum, nw.server.host, nntp_to_msg(nw.data)) nw.clear_data() except NNTPPermanentError as error: # Handle login problems block = False penalty = 0 msg = error.response ecode = int_conv(msg[:3]) display_msg = ' [%s]' % msg logging.debug('Server login problem: %s, %s', ecode, msg) if ecode in (502, 400, 481, 482) and clues_too_many(msg): # Too many connections: remove this thread and reduce thread-setting for server # Plan to go back to the full number after a penalty timeout if server.active: errormsg = T('Too many connections to server %s') % display_msg if server.errormsg != errormsg: server.errormsg = errormsg logging.warning(T('Too many connections to server %s'), server.host) self.__reset_nw(nw, None, warn=False, destroy=True, quit=True) self.plan_server(server, _PENALTY_TOOMANY) server.threads -= 1 elif ecode in (502, 481, 482) and clues_too_many_ip(msg): # Account sharing? if server.active: errormsg = T('Probable account sharing') + display_msg if server.errormsg != errormsg: server.errormsg = errormsg name = ' (%s)' % server.host logging.warning(T('Probable account sharing') + name) penalty = _PENALTY_SHARE block = True elif ecode in (452, 481, 482, 381) or (ecode == 502 and clues_login(msg)): # Cannot login, block this server if server.active: errormsg = T('Failed login for server %s') % display_msg if server.errormsg != errormsg: server.errormsg = errormsg logging.error(T('Failed login for server %s'), server.host) penalty = _PENALTY_PERM block = True elif ecode in (502, 482): # Cannot connect (other reasons), block this server if server.active: errormsg = T('Cannot connect to server %s [%s]') % ('', display_msg) if server.errormsg != errormsg: server.errormsg = errormsg logging.warning(T('Cannot connect to server %s [%s]'), server.host, msg) if clues_pay(msg): penalty = _PENALTY_PERM else: penalty = _PENALTY_502 block = True elif ecode == 400: # Temp connection problem? if server.active: logging.debug('Unspecified error 400 from server %s', server.host) penalty = _PENALTY_VERYSHORT block = True else: # Unknown error, just keep trying if server.active: errormsg = T('Cannot connect to server %s [%s]') % ('', display_msg) if server.errormsg != errormsg: server.errormsg = errormsg logging.warning(T('Cannot connect to server %s [%s]'), server.host, msg) penalty = _PENALTY_UNKNOWN block = True if block or (penalty and server.optional): if server.active: server.active = False if penalty and (block or server.optional): self.plan_server(server, penalty) sabnzbd.nzbqueue.NzbQueue.do.reset_all_try_lists() self.__reset_nw(nw, None, warn=False, quit=True) continue except: logging.error(T('Connecting %s@%s failed, message=%s'), nw.thrdnum, nw.server.host, nntp_to_msg(nw.data)) # No reset-warning needed, above logging is sufficient self.__reset_nw(nw, None, warn=False) if nw.connected: logging.info("Connecting %s@%s finished", nw.thrdnum, nw.server.host) self.__request_article(nw) elif nw.status_code == 223: done = True logging.debug('Article <%s> is present', article.article) elif nw.status_code == 211: done = False logging.debug("group command ok -> %s", nntp_to_msg(nw.data)) nw.group = nw.article.nzf.nzo.group nw.clear_data() self.__request_article(nw) elif nw.status_code in (411, 423, 430): done = True logging.debug('Thread %s@%s: Article %s missing (error=%s)', nw.thrdnum, nw.server.host, article.article, nw.status_code) nw.clear_data() elif nw.status_code == 480: if server.active: server.active = False server.errormsg = T('Server %s requires user/password') % '' self.plan_server(server, 0) sabnzbd.nzbqueue.NzbQueue.do.reset_all_try_lists() msg = T('Server %s requires user/password') % nw.server.host self.__reset_nw(nw, msg, quit=True) elif nw.status_code == 500: if nzo.precheck: # Assume "STAT" command is not supported server.have_stat = False logging.debug('Server %s does not support STAT', server.host) else: # Assume "BODY" command is not supported server.have_body = False logging.debug('Server %s does not support BODY', server.host) nw.clear_data() self.__request_article(nw) if done: server.bad_cons = 0 # Succesful data, clear "bad" counter server.errormsg = server.warning = '' if sabnzbd.LOG_ALL: logging.debug('Thread %s@%s: %s done', nw.thrdnum, server.host, article.article) self.decode(article, nw.data) nw.soft_reset() server.busy_threads.remove(nw) server.idle_threads.append(nw) def __lookup_nw(self, nw): """ Find the fileno matching the nw, needed for closed connections """ for f in self.read_fds: if self.read_fds[f] == nw: return f for f in self.write_fds: if self.read_fds[f] == nw: return f return None def __reset_nw(self, nw, errormsg, warn=True, wait=True, destroy=False, quit=False): server = nw.server article = nw.article fileno = None if nw.nntp: try: fileno = nw.nntp.sock.fileno() except: fileno = self.__lookup_nw(nw) destroy = True nw.nntp.error_msg = None if warn and errormsg: server.warning = errormsg logging.info('Thread %s@%s: ' + errormsg, nw.thrdnum, server.host) elif errormsg: logging.info('Thread %s@%s: ' + errormsg, nw.thrdnum, server.host) if nw in server.busy_threads: server.busy_threads.remove(nw) if not (destroy or nw in server.idle_threads): server.idle_threads.append(nw) if fileno and fileno in self.write_fds: self.write_fds.pop(fileno) if fileno and fileno in self.read_fds: self.read_fds.pop(fileno) if article: if article.tries > cfg.max_art_tries() and (article.fetcher.optional or not cfg.max_art_opt()): # Too many tries on this server, consider article missing self.decode(article, None) else: # Allow all servers to iterate over each nzo/nzf again sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article) if destroy: nw.terminate(quit=quit) else: nw.hard_reset(wait, quit=quit) # Empty SSL info, it might change on next connect server.ssl_info = '' def __request_article(self, nw): try: nzo = nw.article.nzf.nzo if nw.server.send_group and nzo.group != nw.group: group = nzo.group if sabnzbd.LOG_ALL: logging.debug('Thread %s@%s: GROUP <%s>', nw.thrdnum, nw.server.host, group) nw.send_group(group) else: if sabnzbd.LOG_ALL: logging.debug('Thread %s@%s: BODY %s', nw.thrdnum, nw.server.host, nw.article.article) nw.body(nzo.precheck) fileno = nw.nntp.sock.fileno() if fileno not in self.read_fds: self.read_fds[fileno] = nw except socket.error as err: logging.info('Looks like server closed connection: %s', err) self.__reset_nw(nw, "server broke off connection", quit=False) except: logging.error(T('Suspect error in downloader')) logging.info("Traceback: ", exc_info=True) self.__reset_nw(nw, "server broke off connection", quit=False) #------------------------------------------------------------------------------ # Timed restart of servers admin. # For each server all planned events are kept in a list. # When the first timer of a server fires, all other existing timers # are neutralized. # Each server has a dictionary entry, consisting of a list of timestamps. @synchronized(TIMER_LOCK) def plan_server(self, server, interval): """ Plan the restart of a server in 'interval' minutes """ if cfg.no_penalties() and interval > _PENALTY_SHORT: # Overwrite in case of no_penalties interval = _PENALTY_SHORT logging.debug('Set planned server resume %s in %s mins', server.host, interval) if server.id not in self._timers: self._timers[server.id] = [] stamp = time.time() + 60.0 * interval self._timers[server.id].append(stamp) if interval: sabnzbd.scheduler.plan_server(self.trigger_server, [server.id, stamp], interval) @synchronized(TIMER_LOCK) def trigger_server(self, server_id, timestamp): """ Called by scheduler, start server if timer still valid """ logging.debug('Trigger planned server resume for server-id %s', server_id) if server_id in self._timers: if timestamp in self._timers[server_id]: del self._timers[server_id] self.init_server(server_id, server_id) @NzbQueueLocker @synchronized(TIMER_LOCK) def unblock(self, server_id): # Remove timer try: del self._timers[server_id] except KeyError: pass # Activate server if it was inactive for server in self.servers: if server.id == server_id and not server.active: logging.debug('Unblock server %s', server.host) self.init_server(server_id, server_id) break def unblock_all(self): for server_id in self._timers.keys(): self.unblock(server_id) @NzbQueueLocker @synchronized(TIMER_LOCK) def check_timers(self): """ Make sure every server without a non-expired timer is active """ # Clean expired timers now = time.time() kicked = [] for server_id in self._timers.keys(): if not [stamp for stamp in self._timers[server_id] if stamp >= now]: logging.debug('Forcing re-evaluation of server-id %s', server_id) del self._timers[server_id] self.init_server(server_id, server_id) kicked.append(server_id) # Activate every inactive server without an active timer for server in self.servers: if server.id not in self._timers: if server.id not in kicked and not server.active: logging.debug('Forcing activation of server %s', server.host) self.init_server(server.id, server.id) def update_server(self, oldserver, newserver): """ Update the server and make sure we trigger the update in the loop to do housekeeping """ self.init_server(oldserver, newserver) self.wakeup() @NzbQueueLocker def wakeup(self): """ Just rattle the semaphore """ pass def stop(self): self.shutdown = True notifier.send_notification("SABnzbd", T('Shutting down'), 'startup') def stop(): DOWNLOADER_CV.acquire() try: Downloader.do.stop() finally: DOWNLOADER_CV.notify_all() DOWNLOADER_CV.release() try: Downloader.do.join() except: pass def clues_login(text): """ Check for any "failed login" clues in the response code """ text = text.lower() for clue in ('username', 'password', 'invalid', 'authen', 'access denied'): if clue in text: return True return False def clues_too_many(text): """ Check for any "too many connections" clues in the response code """ text = text.lower() for clue in ('exceed', 'connections', 'too many', 'threads', 'limit'): # Not 'download limit exceeded' error if (clue in text) and ('download' not in text) and ('byte' not in text): return True return False def clues_too_many_ip(text): """ Check for any "account sharing" clues in the response code """ text = text.lower() for clue in ('simultaneous ip', 'multiple ip'): if clue in text: return True return False def clues_pay(text): """ Check for messages about payments """ text = text.lower() for clue in ('credits', 'paym', 'expired', 'exceeded'): if clue in text: return True return False sabnzbd-develop/sabnzbd/nzbstuff.py0000600000175000017500000022223113642116632015575 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.nzbstuff - misc """ import os import time import re import logging import datetime import threading import functools import difflib # SABnzbd modules import sabnzbd from sabnzbd.constants import GIGI, ATTRIB_FILE, JOB_ADMIN, \ REPAIR_PRIORITY, TOP_PRIORITY, HIGH_PRIORITY, NORMAL_PRIORITY, \ LOW_PRIORITY, DEFAULT_PRIORITY, PAUSED_PRIORITY, DUP_PRIORITY, STOP_PRIORITY, \ RENAMES_FILE, MAX_BAD_ARTICLES, Status, PNFO from sabnzbd.misc import to_units, cat_to_opts, cat_convert, int_conv, \ format_time_string, calc_age, cmp, caller_name from sabnzbd.filesystem import sanitize_foldername, get_unique_path, get_admin_path, \ remove_all, sanitize_filename, globber_full, set_permissions, long_path, \ trim_win_path, fix_unix_encoding, is_obfuscated_filename, get_ext, get_filename, \ get_unique_filename, renamer, remove_file, remove_dir from sabnzbd.decorators import synchronized import sabnzbd.config as config import sabnzbd.cfg as cfg import sabnzbd.nzbparser from sabnzbd.database import HistoryDB from sabnzbd.rating import Rating # Name patterns SUBJECT_FN_MATCHER = re.compile(r'"([^"]*)"') RE_NORMAL_NAME = re.compile(r'\.\w{1,5}$') # Test reasonably sized extension at the end RE_QUICK_PAR2_CHECK = re.compile(r'\.par2\W*', re.I) RE_RAR = re.compile(r'(\.rar|\.r\d\d|\.s\d\d|\.t\d\d|\.u\d\d|\.v\d\d)$', re.I) RE_PROPER = re.compile(r'(^|[\. _-])(PROPER|REAL|REPACK)([\. _-]|$)') ############################################################################## # Trylist ############################################################################## TRYLIST_LOCK = threading.Lock() class TryList: """ TryList keeps track of which servers have been tried for a specific article """ # Pre-define attributes to save memory __slots__ = ('try_list', 'fetcher_priority') def __init__(self): self.try_list = [] self.fetcher_priority = 0 def server_in_try_list(self, server): """ Return whether specified server has been tried """ with TRYLIST_LOCK: return server in self.try_list def add_to_try_list(self, server): """ Register server as having been tried already """ with TRYLIST_LOCK: if server not in self.try_list: self.try_list.append(server) def reset_try_list(self): """ Clean the list """ with TRYLIST_LOCK: self.try_list = [] def __getstate__(self): """ Save the servers """ return [server.id for server in self.try_list] def __setstate__(self, servers_ids): self.try_list = [] for server_id in servers_ids: if server_id in sabnzbd.downloader.Downloader.do.server_dict: self.add_to_try_list(sabnzbd.downloader.Downloader.do.server_dict[server_id]) ############################################################################## # Article ############################################################################## ArticleSaver = ( 'article', 'art_id', 'bytes', 'partnum', 'lowest_partnum', 'nzf' ) class Article(TryList): """ Representation of one article """ # Pre-define attributes to save memory __slots__ = ArticleSaver + ('fetcher', 'fetcher_priority', 'tries') def __init__(self, article, article_bytes, partnum, nzf): TryList.__init__(self) self.fetcher = None self.article = article self.art_id = None self.bytes = article_bytes self.partnum = partnum self.lowest_partnum = False self.tries = 0 # Try count self.nzf = nzf def get_article(self, server, servers): """ Return article when appropriate for specified server """ log = sabnzbd.LOG_ALL if not self.fetcher and not self.server_in_try_list(server): if log: logging.debug('Article %s | Server: %s | in second if', self.article, server.host) # Is the current selected server of the same priority as this article? if log: logging.debug('Article %s | Server: %s | Article priority: %s', self.article, server.host, self.fetcher_priority) if log: logging.debug('Article %s | Server: %s | Server priority: %s', self.article, server.host, server.priority) if server.priority == self.fetcher_priority: if log: logging.debug('Article %s | Server: %s | same priority, use it', self.article, server.host) self.fetcher = server self.tries += 1 if log: logging.debug('Article %s | Server: %s | Article-try: %s', self.article, server.host, self.tries) return self else: if log: logging.debug('Article %s | Server: %s | not the same priority', self.article, server.host) # No, so is it a lower priority? if server.priority > self.fetcher_priority: if log: logging.debug('Article %s | Server: %s | lower priority', self.article, server.host) # Is there an available server that is a higher priority? found_priority = 1000 # for server_check in config.get_servers(): for server_check in servers: if log: logging.debug('Article %s | Server: %s | checking', self.article, server.host) # if (server_check.priority() < found_priority and server_check.priority() < server.priority and not self.server_in_try_list(server_check)): if server_check.active and (server_check.priority < found_priority): if server_check.priority < server.priority: if not self.server_in_try_list(server_check): if log: logging.debug('Article %s | Server: %s | setting found priority to %s', self.article, server.host, server_check.priority) found_priority = server_check.priority if found_priority == 1000: # If no higher priority servers, use this server self.fetcher_priority = server.priority self.fetcher = server self.tries += 1 if log: logging.debug('Article %s | Server: %s | Article-try: %s', self.article, server.host, self.tries) return self else: # There is a higher priority server, so set article priority if log: logging.debug('Article %s | Server: %s | setting self priority', self.article, server.host) self.fetcher_priority = found_priority if log: logging.debug('Article %s | Server: %s | Returning None', self.article, server.host) return None def get_art_id(self): """ Return unique article storage name, create if needed """ if not self.art_id: self.art_id = sabnzbd.get_new_id("article", self.nzf.nzo.workpath) return self.art_id def __getstate__(self): """ Save to pickle file, selecting attributes """ dict_ = {} for item in ArticleSaver: dict_[item] = getattr(self, item) dict_['try_list'] = TryList.__getstate__(self) return dict_ def __setstate__(self, dict_): """ Load from pickle file, selecting attributes """ for item in ArticleSaver: try: setattr(self, item, dict_[item]) except KeyError: # Handle new attributes setattr(self, item, None) TryList.__setstate__(self, dict_.get('try_list', [])) self.fetcher_priority = 0 self.fetcher = None self.tries = 0 def __repr__(self): return "" % \ (self.article, self.bytes, self.partnum, self.art_id) ############################################################################## # NzbFile ############################################################################## NzbFileSaver = ( 'date', 'subject', 'filename', 'filename_checked', 'type', 'is_par2', 'vol', 'blocks', 'setname', 'articles', 'decodetable', 'bytes', 'bytes_left', 'article_count', 'nzo', 'nzf_id', 'deleted', 'valid', 'import_finished', 'md5sum', 'md5of16k' ) class NzbFile(TryList): """ Representation of one file consisting of multiple articles """ # Pre-define attributes to save memory __slots__ = NzbFileSaver def __init__(self, date, subject, article_db, file_bytes, nzo): """ Setup object """ TryList.__init__(self) self.date = date self.subject = subject self.type = None self.filename = name_extractor(subject) self.filename_checked = False self.is_par2 = False self.vol = None self.blocks = None self.setname = None self.articles = [] self.decodetable = {} self.bytes = file_bytes self.bytes_left = file_bytes self.article_count = 0 self.nzo = nzo self.nzf_id = sabnzbd.get_new_id("nzf", nzo.workpath) self.deleted = False self.valid = False self.import_finished = False self.md5sum = None self.md5of16k = None self.valid = bool(article_db) if self.valid and self.nzf_id: # Save first article seperate, but not for all but first par2 file # Non-par2 files and the first par2 will have no volume and block number setname, vol, block = sabnzbd.par2file.analyse_par2(self.filename) if not vol and not block: first_num = min(article_db.keys()) first_article = self.add_article(article_db.pop(first_num), first_num) first_article.lowest_partnum = True self.nzo.first_articles.append(first_article) self.nzo.first_articles_count += 1 # Any articles left? if article_db: # Save the rest sabnzbd.save_data(article_db, self.nzf_id, nzo.workpath) else: # All imported self.import_finished = True def finish_import(self): """ Load the article objects from disk """ logging.debug("Finishing import on %s", self.filename) article_db = sabnzbd.load_data(self.nzf_id, self.nzo.workpath, remove=False) if article_db: for partnum in article_db: self.add_article(article_db[partnum], partnum) # Make sure we have labeled the lowest part number # Also when DirectUnpack is disabled we need to know self.decodetable[min(self.decodetable)].lowest_partnum = True # Mark safe to continue self.import_finished = True def add_article(self, article_info, partnum): """ Add article to object database and return article object """ article = Article(article_info[0], article_info[1], partnum, self) self.articles.append(article) self.decodetable[partnum] = article return article def remove_article(self, article, found): """ Handle completed article, possibly end of file """ if article in self.articles: self.articles.remove(article) if found: self.bytes_left -= article.bytes return not self.articles def set_par2(self, setname, vol, blocks): """ Designate this this file as a par2 file """ self.is_par2 = True self.setname = setname self.vol = vol self.blocks = int_conv(blocks) def get_article(self, server, servers): """ Get next article to be downloaded """ for article in self.articles: article = article.get_article(server, servers) if article: return article self.add_to_try_list(server) def reset_all_try_lists(self): """ Clear all lists of visited servers """ for art in self.articles: art.reset_try_list() self.reset_try_list() @property def completed(self): """ Is this file completed? """ return self.import_finished and not bool(self.articles) def remove_admin(self): """ Remove article database from disk (sabnzbd_nzf_)""" try: logging.debug('Removing article database for %s', self.nzf_id) remove_file(os.path.join(self.nzo.workpath, self.nzf_id)) except: pass def __getstate__(self): """ Save to pickle file, selecting attributes """ dict_ = {} for item in NzbFileSaver: dict_[item] = getattr(self, item) dict_['try_list'] = TryList.__getstate__(self) return dict_ def __setstate__(self, dict_): """ Load from pickle file, selecting attributes """ for item in NzbFileSaver: try: setattr(self, item, dict_[item]) except KeyError: # Handle new attributes setattr(self, item, None) TryList.__setstate__(self, dict_.get('try_list', [])) def __repr__(self): return "" % (self.filename, self.type) ############################################################################## # NzbObject ############################################################################## NzbObjectSaver = ( 'filename', 'work_name', 'final_name', 'created', 'bytes', 'bytes_downloaded', 'bytes_tried', 'bytes_missing', 'repair', 'unpack', 'delete', 'script', 'cat', 'url', 'groups', 'avg_date', 'md5of16k', 'partable', 'extrapars', 'md5packs', 'files', 'files_table', 'finished_files', 'status', 'avg_bps_freq', 'avg_bps_total', 'priority', 'saved_articles', 'nzo_id', 'futuretype', 'deleted', 'parsed', 'action_line', 'unpack_info', 'fail_msg', 'nzo_info', 'custom_name', 'password', 'next_save', 'save_timeout', 'encrypted', 'bad_articles', 'duplicate', 'oversized', 'precheck', 'incomplete', 'reuse', 'meta', 'first_articles', 'first_articles_count', 'md5sum', 'servercount', 'unwanted_ext', 'renames', 'rating_filtered' ) # Lock to prevent errors when saving the NZO data NZO_LOCK = threading.RLock() class NzbObject(TryList): def __init__(self, filename, pp, script, nzb=None, futuretype=False, cat=None, url=None, priority=NORMAL_PRIORITY, nzbname=None, status=Status.QUEUED, nzo_info=None, reuse=False, dup_check=True): TryList.__init__(self) self.filename = filename # Original filename if nzbname and nzb: self.work_name = nzbname # Use nzbname if set and only for non-future slot else: self.work_name = filename # For future-slots we keep the name given by URLGrabber if nzb is None: self.final_name = self.work_name = filename else: # Remove trailing .nzb and .par(2) self.work_name = create_work_name(self.work_name) # Extract password self.work_name, self.password = scan_password(self.work_name) if not self.work_name: # In case only /password was entered for nzbname self.work_name = filename self.final_name = self.work_name # Check for password also in filename if not self.password: _, self.password = scan_password(os.path.splitext(filename)[0]) # Determine category and find pp/script values based on input # Later will be re-evaluated based on import steps if pp is None: r = u = d = None else: r, u, d = sabnzbd.pp_to_opts(pp) self.set_priority(priority) # Parse priority of input self.repair = r # True if we want to repair this set self.unpack = u # True if we want to unpack this set self.delete = d # True if we want to delete this set self.script = script # External script for this set self.cat = cat # User-set category # Information fields self.url = url or filename self.groups = [] self.avg_date = datetime.datetime(1970, 1, 1, 1, 0) self.avg_stamp = 0.0 # Avg age in seconds (calculated from avg_age) # Bookkeeping values self.meta = {} self.servercount = {} # Dict to keep bytes per server self.created = False # dirprefixes + work_name created self.direct_unpacker = None # Holds the DirectUnpacker instance self.bytes = 0 # Original bytesize self.bytes_downloaded = 0 # Downloaded byte self.bytes_tried = 0 # Which bytes did we try self.bytes_missing = 0 # Bytes missing self.bad_articles = 0 # How many bad (non-recoverable) articles self.partable = {} # Holds one parfile-name for each set self.extrapars = {} # Holds the extra parfile names for all sets self.md5packs = {} # Holds the md5pack for each set (name: hash) self.md5of16k = {} # Holds the md5s of the first-16k of all files in the NZB (hash: name) self.files = [] # List of all NZFs self.files_table = {} # Dictionary of NZFs indexed using NZF_ID self.renames = {} # Dictionary of all renamed files self.finished_files = [] # List of all finished NZFs # The current status of the nzo eg: # Queued, Downloading, Repairing, Unpacking, Failed, Complete self.status = status self.avg_bps_freq = 0 self.avg_bps_total = 0 self.first_articles = [] self.first_articles_count = 0 self.saved_articles = [] self.nzo_id = None self.futuretype = futuretype self.deleted = False self.to_be_removed = False self.parsed = False self.duplicate = False self.oversized = False self.precheck = False self.incomplete = False self.unwanted_ext = 0 self.rating_filtered = 0 self.reuse = reuse if self.status == Status.QUEUED and not reuse: self.precheck = cfg.pre_check() if self.precheck: self.status = Status.CHECKING # Store one line responses for filejoin/par2/unrar/unzip here for history display self.action_line = '' # Store the results from various filejoin/par2/unrar/unzip stages self.unpack_info = {} # Stores one line containing the last failure self.fail_msg = '' # Stores various info about the nzo to be self.nzo_info = nzo_info or {} # Temporary store for custom foldername - needs to be stored because of url fetching self.custom_name = nzbname self.next_save = None self.save_timeout = None self.encrypted = 0 self.url_wait = None self.url_tries = 0 self.pp_active = False # Signals active post-processing (not saved) self.md5sum = None if nzb is None: # This is a slot for a future NZB, ready now return # Apply conversion option to final folder if cfg.replace_spaces(): logging.info('Replacing spaces with underscores in %s', self.final_name) self.final_name = self.final_name.replace(' ', '_') if cfg.replace_dots(): logging.info('Replacing dots with spaces in %s', self.final_name) self.final_name = self.final_name.replace('.', ' ') # Determine "incomplete" folder wdir = long_path(os.path.join(cfg.download_dir.get_path(), self.work_name)) adir = os.path.join(wdir, JOB_ADMIN) # Check against identical checksum or series/season/episode if (not reuse) and nzb and dup_check and priority != REPAIR_PRIORITY: duplicate, series = self.has_duplicates() else: duplicate = series = 0 if reuse: remove_all(adir, 'SABnzbd_nz?_*', keep_folder=True) remove_all(adir, 'SABnzbd_article_*', keep_folder=True) else: wdir = trim_win_path(wdir) wdir = get_unique_path(wdir, create_dir=True) set_permissions(wdir) adir = os.path.join(wdir, JOB_ADMIN) if not os.path.exists(adir): os.mkdir(adir) _, self.work_name = os.path.split(wdir) self.created = True if nzb and '' not in nzb: logging.warning(T('Incomplete NZB file %s'), filename) else: logging.warning(T('Invalid NZB file %s, skipping (reason=%s, line=%s)'), filename, err, '1') if self.incomplete: if cfg.allow_incomplete_nzb(): self.pause() else: self.purge_data() raise ValueError sabnzbd.backup_nzb(filename, nzb) sabnzbd.save_compressed(adir, filename, nzb) if not self.files and not reuse: self.purge_data() if cfg.warn_empty_nzb(): mylog = logging.warning else: mylog = logging.info if self.url: mylog(T('Empty NZB file %s') + ' [%s]', filename, self.url) else: mylog(T('Empty NZB file %s'), filename) raise ValueError if cat is None: for metacat in self.meta.get('category', ()): metacat = cat_convert(metacat) if metacat: cat = metacat break if cat is None: for grp in self.groups: cat = cat_convert(grp) if cat: break # Pickup backed-up attributes when re-using if reuse: cat, pp, script, priority, name, password, self.url = get_attrib_file(self.workpath, 7) if name: self.final_name = name if password: self.password = password # Determine category and find pp/script values self.cat, pp_tmp, self.script, priority = cat_to_opts(cat, pp, script, priority) self.set_priority(priority) self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(pp_tmp) # Run user pre-queue script if needed if not reuse and cfg.pre_script(): # Call the script accept, name, pp, cat_pp, script_pp, priority, group = sabnzbd.newsunpack.pre_queue(self, pp, cat) # Accept or reject accept = int_conv(accept) if accept < 1: self.purge_data() raise TypeError if accept == 2: self.fail_msg = T('Pre-queue script marked job as failed') # Process all options, only over-write if set by script # Beware that cannot do "if priority/pp", because those can # also have a valid value of 0, which shouldn't be ignored if name: self.set_final_name_pw(name) try: pp = int(pp) except: pp = None if cat_pp: cat = cat_pp try: priority = int(priority) except: priority = DEFAULT_PRIORITY if script_pp: script = script_pp if group: self.groups = [str(group)] # Re-evaluate results from pre-queue script self.cat, pp, self.script, priority = cat_to_opts(cat, pp, script, priority) self.set_priority(priority) self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(pp) else: accept = 1 # Pause job when above size limit limit = cfg.size_limit.get_int() if not reuse and abs(limit) > 0.5 and self.bytes > limit: logging.info('Job too large, forcing low prio and paused (%s)', self.final_name) self.pause() self.oversized = True self.priority = LOW_PRIORITY if duplicate and ((not series and cfg.no_dupes() == 1) or (series and cfg.no_series_dupes() == 1)): if cfg.warn_dupl_jobs(): logging.warning(T('Ignoring duplicate NZB "%s"'), filename) self.purge_data() raise TypeError if duplicate and ((not series and cfg.no_dupes() == 3) or (series and cfg.no_series_dupes() == 3)): if cfg.warn_dupl_jobs(): logging.warning(T('Failing duplicate NZB "%s"'), filename) # Move to history, utilizing the same code as accept&fail from pre-queue script self.fail_msg = T('Duplicate NZB') accept = 2 duplicate = False if duplicate or self.priority == DUP_PRIORITY: if cfg.no_dupes() == 4 or cfg.no_series_dupes() == 4: if cfg.warn_dupl_jobs(): logging.warning('%s: "%s"', T('Duplicate NZB'), filename) self.duplicate = True self.priority = NORMAL_PRIORITY else: if cfg.warn_dupl_jobs(): logging.warning(T('Pausing duplicate NZB "%s"'), filename) self.duplicate = True self.pause() self.priority = NORMAL_PRIORITY if self.priority == PAUSED_PRIORITY: self.pause() self.priority = NORMAL_PRIORITY if reuse: self.check_existing_files(wdir) if cfg.auto_sort(): self.files.sort(key=functools.cmp_to_key(nzf_cmp_date)) else: self.files.sort(key=functools.cmp_to_key(nzf_cmp_name)) # Copy meta fields to nzo_info, if not already set for kw in self.meta: if not self.nzo_info.get(kw): self.nzo_info[kw] = self.meta[kw][0] # Show first meta-password (if any), when there's no explicit password if not self.password and self.meta.get('password'): self.password = self.meta.get('password', [None])[0] # Set nzo save-delay to minimum 120 seconds self.save_timeout = max(120, min(6.0 * float(self.bytes) / GIGI, 300.0)) # In case pre-queue script or duplicate check want to move # to history we first need an nzo_id by entering the NzbQueue if accept == 2: self.deleted = True self.status = Status.FAILED sabnzbd.NzbQueue.do.add(self, quiet=True) sabnzbd.NzbQueue.do.end_job(self) # Raise error, so it's not added raise TypeError def update_download_stats(self, bps, serverid, bytes): if bps: self.avg_bps_total += bps / 1024 self.avg_bps_freq += 1 if serverid in self.servercount: self.servercount[serverid] += bytes else: self.servercount[serverid] = bytes @synchronized(NZO_LOCK) def remove_nzf(self, nzf): if nzf in self.files: self.files.remove(nzf) if nzf not in self.finished_files: self.finished_files.append(nzf) nzf.import_finished = True nzf.deleted = True return not bool(self.files) def sort_nzfs(self): """ Sort the files in the NZO, respecting date sorting and unwanted extensions """ if cfg.auto_sort(): self.files.sort(key=functools.cmp_to_key(nzf_cmp_date)) else: self.files.sort(key=functools.cmp_to_key(nzf_cmp_name)) # In the hunt for Unwanted Extensions: # The file with the unwanted extension often is in the first or the last rar file # So put the last rar immediately after the first rar file so that it gets detected early if cfg.unwanted_extensions() and not cfg.auto_sort(): # ... only useful if there are unwanted extensions defined and there is no sorting on date logging.debug('Unwanted Extension: putting last rar after first rar') nzfposcounter = firstrarpos = lastrarpos = 0 for nzf in self.files: nzfposcounter += 1 if '.rar' in str(nzf): # a NZF found with '.rar' in the name if firstrarpos == 0: # this is the first .rar found, so remember this position firstrarpos = nzfposcounter lastrarpos = nzfposcounter lastrarnzf = nzf # The NZF itself if firstrarpos != lastrarpos: # at least two different .rar's found logging.debug('Unwanted Extension: First rar at %s, Last rar at %s', firstrarpos, lastrarpos) logging.debug('Unwanted Extension: Last rar is %s', str(lastrarnzf)) try: self.files.remove(lastrarnzf) # first remove. NB: remove() does searches for lastrarnzf self.files.insert(firstrarpos, lastrarnzf) # ... and only then add after position firstrarpos except: logging.debug('The lastrar swap did not go well') def reset_all_try_lists(self): for nzf in self.files: nzf.reset_all_try_lists() self.reset_try_list() @synchronized(NZO_LOCK) def postpone_pars(self, nzf, parset): """ Move all vol-par files matching 'parset' to the extrapars table """ # Create new extrapars if it didn't already exist # For example if created when the first par2 file was missing if parset not in self.extrapars: self.extrapars[parset] = [] # Set this one as the main one self.partable[parset] = nzf lparset = parset.lower() for xnzf in self.files[:]: name = xnzf.filename or xnzf.subject # Move only when not current NZF and filename was extractable from subject if name: setname, vol, block = sabnzbd.par2file.analyse_par2(name) # Don't postpone header-only-files, to extract all possible md5of16k if setname and block and matcher(lparset, setname.lower()): xnzf.set_par2(parset, vol, block) # Don't postpone if all par2 are desired and should be kept or not repairing if self.repair and not(cfg.enable_all_par() and not cfg.enable_par_cleanup()): self.extrapars[parset].append(xnzf) self.files.remove(xnzf) # Already count these bytes as done self.bytes_tried += xnzf.bytes_left # Sort the sets for setname in self.extrapars: self.extrapars[setname].sort(key=lambda x: x.blocks) # Also re-parse all filenames in case par2 came after first articles self.verify_all_filenames_and_resort() @synchronized(NZO_LOCK) def handle_par2(self, nzf, filepath): """ Check if file is a par2 and build up par2 collection """ # Need to remove it from the other set it might be in self.remove_extrapar(nzf) # Reparse setname, vol, block = sabnzbd.par2file.analyse_par2(nzf.filename, filepath) nzf.set_par2(setname, vol, block) # Parse the file contents for hashes pack = sabnzbd.par2file.parse_par2_file(nzf, filepath) # If we couldn't parse it, we ignore it if pack: if pack not in self.md5packs.values(): logging.debug('Got md5pack for set %s', nzf.setname) self.md5packs[setname] = pack # See if we need to postpone some pars self.postpone_pars(nzf, setname) else: # Need to add this to the set, first need setname for setname in self.md5packs: if self.md5packs[setname] == pack: break # Change the properties nzf.set_par2(setname, vol, block) logging.debug('Got additional md5pack for set %s', nzf.setname) # Make sure it exists, could be removed by newsunpack if setname not in self.extrapars: self.extrapars[setname] = [] self.extrapars[setname].append(nzf) elif self.repair: # For some reason this par2 file is broken but we still want repair self.promote_par2(nzf) # Is it an obfuscated file? if get_ext(nzf.filename) != '.par2': # Do cheap renaming so it gets better picked up by par2 # Only basename has to be the same new_fname = get_unique_filename(os.path.join(self.downpath, '%s.par2' % setname)) renamer(filepath, new_fname) self.renamed_file(get_filename(new_fname), nzf.filename) nzf.filename = get_filename(new_fname) @synchronized(NZO_LOCK) def promote_par2(self, nzf): """ In case of a broken par2 or missing par2, move another of the same set to the top (if we can find it) """ setname, vol, block = sabnzbd.par2file.analyse_par2(nzf.filename) # Now we need to identify if we have more in this set if setname and self.repair: # Maybe it was the first one if setname not in self.extrapars: self.postpone_pars(nzf, setname) # Get the next one for new_nzf in self.extrapars[setname]: if not new_nzf.completed: self.add_parfile(new_nzf) # Add it to the top self.files.remove(new_nzf) self.files.insert(0, new_nzf) break def get_extra_blocks(self, setname, needed_blocks): """ We want par2-files of all sets that are similar to this one So that we also can handle multi-sets with duplicate filenames Returns number of added blocks in case they are available In case of duplicate files for the same set, we might add too little par2 on the first add-run, but that's a risk we need to take. """ logging.info('Need %s more blocks, checking blocks', needed_blocks) avail_blocks = 0 block_list = [] for setname_search in self.extrapars: # Do it for our set, or highlight matching one # We might catch too many par2's, but that's okay if setname_search == setname or difflib.SequenceMatcher(None, setname, setname_search).ratio() > 0.85: for nzf in self.extrapars[setname_search]: # Don't count extrapars that are completed already if nzf.completed: continue block_list.append(nzf) avail_blocks += nzf.blocks # Sort by smallest blocks last, to be popped first block_list.sort(key=lambda x: x.blocks, reverse=True) logging.info('%s blocks available', avail_blocks) # Enough? if avail_blocks >= needed_blocks: added_blocks = 0 while added_blocks < needed_blocks: new_nzf = block_list.pop() self.add_parfile(new_nzf) added_blocks += new_nzf.blocks logging.info('Added %s blocks to %s', added_blocks, self.final_name) return added_blocks else: # Not enough return False @synchronized(NZO_LOCK) def remove_article(self, article, found): """ Remove article from the NzbFile and do check if it can succeed""" job_can_succeed = True nzf = article.nzf # First or regular article? if article.lowest_partnum and self.first_articles and article in self.first_articles: self.first_articles.remove(article) # All first articles done? if not self.first_articles: # Do we have rename information from par2 if self.md5of16k: self.verify_all_filenames_and_resort() # Check the availability of these first articles if cfg.fail_hopeless_jobs() and cfg.fast_fail(): job_can_succeed = self.check_first_article_availability() # Remove from file-tracking file_done = nzf.remove_article(article, found) # Only on fully loaded files we can say if it's really done if not nzf.import_finished: file_done = False # File completed, remove and do checks if file_done: self.remove_nzf(nzf) if not self.reuse and cfg.fail_hopeless_jobs(): job_can_succeed, _ratio = self.check_availability_ratio(99) # Abort the job due to failure if not job_can_succeed: # Set the nzo status to return "Queued" self.status = Status.QUEUED self.set_download_report() self.fail_msg = T('Aborted, cannot be completed') + ' - https://sabnzbd.org/not-complete' self.set_unpack_info('Download', self.fail_msg, unique=False) logging.debug('Abort job "%s", due to impossibility to complete it', self.final_name_pw_clean) return True, True if not found: # Add extra parfiles when there was a damaged article and not pre-checking if self.extrapars and not self.precheck: self.prospective_add(nzf) # Sometimes a few CRC errors are still fine, so we continue if self.bad_articles > MAX_BAD_ARTICLES: self.abort_direct_unpacker() # Increase missing bytes counter self.bytes_missing += article.bytes else: # Increase counter of actually finished bytes self.bytes_downloaded += article.bytes # All the bytes that were tried self.bytes_tried += article.bytes post_done = False if not self.files: post_done = True # set the nzo status to return "Queued" self.status = Status.QUEUED self.set_download_report() return file_done, post_done @synchronized(NZO_LOCK) def remove_saved_article(self, article): self.saved_articles.remove(article) def check_existing_files(self, wdir): """ Check if downloaded files already exits, for these set NZF to complete """ fix_unix_encoding(wdir) # Get a list of already present files files = [os.path.basename(f) for f in globber_full(wdir) if os.path.isfile(f)] # Substitute renamed files renames = sabnzbd.load_data(RENAMES_FILE, self.workpath, remove=True) if renames: for name in renames: if name in files or renames[name] in files: if name in files: files.remove(name) files.append(renames[name]) self.renames = renames # Looking for the longest name first, minimizes the chance on a mismatch files.sort(key=lambda x: len(x)) # The NZFs should be tried shortest first, to improve the chance on a proper match nzfs = self.files[:] nzfs.sort(key=lambda x: len(x.subject)) # Flag files from NZB that already exist as finished for filename in files[:]: for nzf in nzfs: subject = sanitize_filename(name_extractor(nzf.subject)) if (nzf.filename == filename) or (subject == filename) or (filename in subject): nzf.filename = filename nzf.bytes_left = 0 self.remove_nzf(nzf) nzfs.remove(nzf) files.remove(filename) # Set bytes correctly self.bytes_tried += nzf.bytes self.bytes_downloaded += nzf.bytes # Process par2 files filepath = os.path.join(wdir, filename) if sabnzbd.par2file.is_parfile(filepath): self.handle_par2(nzf, filepath) break # Create an NZF for each remaining existing file try: for filename in files: # Create NZB's using basic information filepath = os.path.join(wdir, filename) if os.path.exists(filepath): tup = os.stat(filepath) tm = datetime.datetime.fromtimestamp(tup.st_mtime) nzf = NzbFile(tm, filename, [], tup.st_size, self) self.files.append(nzf) self.files_table[nzf.nzf_id] = nzf nzf.filename = filename self.remove_nzf(nzf) # Set bytes correctly self.bytes += nzf.bytes self.bytes_tried += nzf.bytes self.bytes_downloaded += nzf.bytes # Process par2 files if sabnzbd.par2file.is_parfile(filepath): self.handle_par2(nzf, filepath) logging.info('Existing file %s added to job', filename) except: logging.debug('Bad NZB handling') logging.info("Traceback: ", exc_info=True) @property def pp(self): if self.repair is None: return None else: return sabnzbd.opts_to_pp(self.repair, self.unpack, self.delete) def set_pp(self, value): self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(value) logging.info('Set pp=%s for job %s', value, self.final_name) # Abort unpacking if not desired anymore if not self.unpack: self.abort_direct_unpacker() def set_priority(self, value): """ Check if this is a valid priority """ # When unknown (0 is a known one), set to DEFAULT if value == '' or value is None: self.priority = DEFAULT_PRIORITY return # Convert input value = int_conv(value) if value in (REPAIR_PRIORITY, TOP_PRIORITY, HIGH_PRIORITY, NORMAL_PRIORITY, LOW_PRIORITY, DEFAULT_PRIORITY, PAUSED_PRIORITY, DUP_PRIORITY, STOP_PRIORITY): self.priority = value return # Invalid value, set to normal priority self.priority = NORMAL_PRIORITY @property def final_name_labeled(self): prefix = '' # Duplicate label is always active if self.duplicate: prefix = T('DUPLICATE') + ' / ' # : Queue indicator for duplicate job # Only show label in case the download was not manually resumed if self.status == Status.PAUSED: if self.encrypted > 0: prefix += T('ENCRYPTED') + ' / ' #: Queue indicator for encrypted job if self.oversized: prefix += T('TOO LARGE') + ' / ' # : Queue indicator for oversized job if self.incomplete: prefix += T('INCOMPLETE') + ' / ' # : Queue indicator for incomplete NZB if self.unwanted_ext: prefix += T('UNWANTED') + ' / ' # : Queue indicator for unwanted extensions if self.rating_filtered: prefix += T('FILTERED') + ' / ' # : Queue indicator for filtered # Waiting for URL fetching if isinstance(self.url_wait, float): dif = int(self.url_wait - time.time() + 0.5) if dif > 0: prefix += T('WAIT %s sec') % dif + ' / ' # : Queue indicator for waiting URL fetch # Propagation delay label if (self.avg_stamp + float(cfg.propagation_delay() * 60)) > time.time() and self.priority != TOP_PRIORITY: wait_time = int((self.avg_stamp + float(cfg.propagation_delay() * 60) - time.time()) / 60 + 0.5) prefix += T('PROPAGATING %s min') % wait_time + ' / ' # : Queue indicator while waiting for propagation of post return '%s%s' % (prefix, self.final_name) @property def final_name_pw_clean(self): if self.password: return '%s / %s' % (self.final_name, self.password) else: return self.final_name def set_final_name_pw(self, name, password=None): if isinstance(name, str): if password is not None: self.password = password else: name, password = scan_password(name) if password is not None: self.password = password self.final_name = sanitize_foldername(name) self.save_to_disk() def pause(self): self.status = Status.PAUSED # Prevent loss of paused state when terminated if self.nzo_id and not self.is_gone(): self.save_to_disk() def resume(self): self.status = Status.QUEUED if self.encrypted > 0: # If user resumes after encryption warning, no more auto-pauses self.encrypted = 2 if self.rating_filtered: # If user resumes after filtered warning, no more auto-pauses self.rating_filtered = 2 # If user resumes after warning, reset duplicate/oversized/incomplete/unwanted indicators self.duplicate = False self.oversized = False self.incomplete = False if self.unwanted_ext: # If user resumes after "unwanted" warning, no more auto-pauses self.unwanted_ext = 2 @synchronized(NZO_LOCK) def add_parfile(self, parfile): """ Add parfile to the files to be downloaded Resets trylist just to be sure Adjust download-size accordingly """ if not parfile.completed and parfile not in self.files and parfile not in self.finished_files: parfile.reset_all_try_lists() self.files.append(parfile) self.bytes_tried -= parfile.bytes_left @synchronized(NZO_LOCK) def remove_parset(self, setname): if setname in self.extrapars: self.extrapars.pop(setname) if setname in self.partable: self.partable.pop(setname) @synchronized(NZO_LOCK) def remove_extrapar(self, parfile): """ Remove par file from any/all sets """ for _set in self.extrapars: if parfile in self.extrapars[_set]: self.extrapars[_set].remove(parfile) @synchronized(NZO_LOCK) def prospective_add(self, nzf): """ Add par2 files to compensate for missing articles This fails in case of multi-sets with identical setnames """ # Make sure to also select a parset if it was in the original filename original_filename = self.renames.get(nzf.filename, '') # Get some blocks! if not nzf.is_par2: # We have to find the right par-set blocks_new = 0 for parset in self.extrapars.keys(): if (parset in nzf.filename or parset in original_filename) and self.extrapars[parset]: for new_nzf in self.extrapars[parset]: self.add_parfile(new_nzf) blocks_new += new_nzf.blocks # Enough now? if blocks_new >= self.bad_articles: logging.info('Prospectively added %s repair blocks to %s', blocks_new, self.final_name) break # Reset NZO TryList self.reset_try_list() def add_to_direct_unpacker(self, nzf): """ Start or add to DirectUnpacker """ if not self.direct_unpacker: sabnzbd.directunpacker.DirectUnpacker(self) self.direct_unpacker.add(nzf) def abort_direct_unpacker(self): """ Abort any running DirectUnpackers """ if self.direct_unpacker: self.direct_unpacker.abort() def check_availability_ratio(self, req_ratio=0): """ Determine amount of articles present on servers and return (gross available, nett) bytes """ # Few missing articles in RAR-only job might still work if self.bad_articles <= MAX_BAD_ARTICLES: logging.debug('Download Quality: bad-articles=%s', self.bad_articles) return True, 200 # Do the full check need = 0 pars = 0 short = 0 anypars = False for nzf_id in self.files_table: nzf = self.files_table[nzf_id] if nzf.deleted: short += nzf.bytes_left if RE_QUICK_PAR2_CHECK.search(nzf.subject): pars += nzf.bytes anypars = True else: need += nzf.bytes have = need + pars - short ratio = float(have) / float(max(1, need)) if anypars: enough = ratio * 100.0 >= (req_ratio or float(cfg.req_completion_rate())) else: enough = have >= need logging.debug('Download Quality: enough=%s, have=%s, need=%s, ratio=%s', enough, have, need, ratio) return enough, ratio def check_first_article_availability(self): """ Use the first articles to see if it's likely the job will succeed """ # Ignore this check on retry if not self.reuse: # Ignore undamaged or small downloads if self.bad_articles and self.first_articles_count >= 10: # We need a float-division, see if more than 80% is there if (float(self.bad_articles) / self.first_articles_count) >= 0.8: return False return True @synchronized(NZO_LOCK) def set_download_report(self): """ Format the stats for the history information """ # Pretty-format the per-server stats if self.servercount: # Sort the servers first servers = config.get_servers() server_names = sorted(servers.keys(), key=lambda svr: '%d%02d%s' % (int(not servers[svr].enable()), servers[svr].priority(), servers[svr].displayname().lower())) msgs = ['%s=%sB' % (servers[server_name].displayname(), to_units(self.servercount[server_name])) for server_name in server_names if server_name in self.servercount] self.set_unpack_info('Servers', ', '.join(msgs), unique=True) # In case there were no bytes available at all of this download # we list the number of bytes we used while trying if not self.bytes_downloaded: self.bytes_downloaded = sum(self.servercount.values()) # Format information about the download itself download_msgs = [] if self.avg_bps_total and self.bytes_downloaded and self.avg_bps_freq: # Get the seconds it took to complete the download avg_bps = self.avg_bps_total / self.avg_bps_freq download_time = int_conv(self.bytes_downloaded / (avg_bps * 1024)) self.nzo_info['download_time'] = download_time # Format the total time the download took, in days, hours, and minutes, or seconds. complete_time = format_time_string(download_time) download_msgs.append(T('Downloaded in %s at an average of %sB/s') % (complete_time, to_units(avg_bps * 1024))) download_msgs.append(T('Age') + ': ' + calc_age(self.avg_date, True)) bad = self.nzo_info.get('bad_articles', 0) miss = self.nzo_info.get('missing_articles', 0) killed = self.nzo_info.get('killed_articles', 0) dups = self.nzo_info.get('duplicate_articles', 0) if bad: download_msgs.append(T('%s articles were malformed') % bad) if miss: download_msgs.append(T('%s articles were missing') % miss) if dups: download_msgs.append(T('%s articles had non-matching duplicates') % dups) if killed: download_msgs.append(T('%s articles were removed') % killed) self.set_unpack_info('Download', u'
'.join(download_msgs), unique=True) if self.url: self.set_unpack_info('Source', self.url, unique=True) @synchronized(NZO_LOCK) def increase_bad_articles_counter(self, article_type): """ Record information about bad articles """ if article_type not in self.nzo_info: self.nzo_info[article_type] = 0 self.nzo_info[article_type] += 1 self.bad_articles += 1 def get_article(self, server, servers): article = None nzf_remove_list = [] # Did we go through all first-articles? if self.first_articles: for article_test in self.first_articles: article = article_test.get_article(server, servers) if article: break # Move on to next ones if not article: for nzf in self.files: if nzf.deleted: logging.debug('Skipping existing file %s', nzf.filename or nzf.subject) else: # Don't try to get an article if server is in try_list of nzf if not nzf.server_in_try_list(server): if not nzf.import_finished: # Only load NZF when it's a primary server # or when it's a backup server without active primaries if sabnzbd.highest_server(server): nzf.finish_import() # Still not finished? Something went wrong... if not nzf.import_finished and not self.is_gone(): logging.error(T('Error importing %s'), nzf) nzf_remove_list.append(nzf) nzf.nzo.status = Status.PAUSED continue else: continue article = nzf.get_article(server, servers) if article: break # Remove all files for which admin could not be read for nzf in nzf_remove_list: nzf.deleted = True self.files.remove(nzf) # If cleanup emptied the active files list, end this job if nzf_remove_list and not self.files: sabnzbd.NzbQueue.do.end_job(self) if not article: # No articles for this server, block for next time self.add_to_try_list(server) return article @synchronized(NZO_LOCK) def move_top_bulk(self, nzf_ids): self.cleanup_nzf_ids(nzf_ids) if nzf_ids: target = list(range(len(nzf_ids))) while 1: self.move_up_bulk(nzf_ids, cleanup=False) pos_nzf_table = self.build_pos_nzf_table(nzf_ids) keys = list(pos_nzf_table.keys()) keys.sort() if target == keys: break @synchronized(NZO_LOCK) def move_bottom_bulk(self, nzf_ids): self.cleanup_nzf_ids(nzf_ids) if nzf_ids: target = list(range(len(self.files) - len(nzf_ids), len(self.files))) while 1: self.move_down_bulk(nzf_ids, cleanup=False) pos_nzf_table = self.build_pos_nzf_table(nzf_ids) keys = list(pos_nzf_table.keys()) keys.sort() if target == keys: break @synchronized(NZO_LOCK) def move_up_bulk(self, nzf_ids, cleanup=True): if cleanup: self.cleanup_nzf_ids(nzf_ids) if nzf_ids: pos_nzf_table = self.build_pos_nzf_table(nzf_ids) while pos_nzf_table: pos = min(pos_nzf_table) nzf = pos_nzf_table.pop(pos) if pos > 0: tmp_nzf = self.files[pos - 1] if tmp_nzf.nzf_id not in nzf_ids: self.files[pos - 1] = nzf self.files[pos] = tmp_nzf @synchronized(NZO_LOCK) def move_down_bulk(self, nzf_ids, cleanup=True): if cleanup: self.cleanup_nzf_ids(nzf_ids) if nzf_ids: pos_nzf_table = self.build_pos_nzf_table(nzf_ids) while pos_nzf_table: pos = max(pos_nzf_table) nzf = pos_nzf_table.pop(pos) if pos < len(self.files) - 1: tmp_nzf = self.files[pos + 1] if tmp_nzf.nzf_id not in nzf_ids: self.files[pos + 1] = nzf self.files[pos] = tmp_nzf def verify_nzf_filename(self, nzf, yenc_filename=None): """ Get filename from par2-info or from yenc """ # Already done? if nzf.filename_checked: return # If we have the md5, use it to rename if nzf.md5of16k and self.md5of16k: # Don't check again, even if no match nzf.filename_checked = True # Find the match and rename if nzf.md5of16k in self.md5of16k: new_filename = self.md5of16k[nzf.md5of16k] # Was it even new? if new_filename != nzf.filename: logging.info('Detected filename based on par2: %s -> %s', nzf.filename, new_filename) self.renamed_file(new_filename, nzf.filename) nzf.filename = new_filename return # Fallback to yenc/nzb name (also when there is no partnum=1) # We also keep the NZB name in case it ends with ".par2" (usually correct) if yenc_filename and yenc_filename != nzf.filename and not is_obfuscated_filename(yenc_filename) and not nzf.filename.endswith('.par2'): logging.info('Detected filename from yenc: %s -> %s', nzf.filename, yenc_filename) self.renamed_file(yenc_filename, nzf.filename) nzf.filename = yenc_filename def verify_all_filenames_and_resort(self): """ Verify all filenames based on par2 info and then re-sort files """ logging.info('Checking all filenames for %s', self.final_name) for nzf_verify in self.files: self.verify_nzf_filename(nzf_verify) logging.info('Re-sorting %s after getting filename information', self.final_name) self.sort_nzfs() @synchronized(NZO_LOCK) def renamed_file(self, name_set, old_name=None): """ Save renames at various stages (Download/PP) to be used on Retry. Accepts strings and dicts. """ if not old_name: # Add to dict self.renames.update(name_set) else: self.renames[name_set] = old_name # Determine if rating information (including site identifier so rating can be updated) # is present in metadata and if so store it @synchronized(NZO_LOCK) def update_rating(self): if cfg.rating_enable(): try: def _get_first_meta(type): values = self.nzo_info.get('x-oznzb-rating-' + type, None) or self.nzo_info.get('x-rating-' + type, None) return values[0] if values and isinstance(values, list) else values rating_types = ['url', 'host', 'video', 'videocnt', 'audio', 'audiocnt', 'voteup', 'votedown', 'spam', 'confirmed-spam', 'passworded', 'confirmed-passworded'] fields = {} for k in rating_types: fields[k] = _get_first_meta(k) Rating.do.add_rating(_get_first_meta('id'), self.nzo_id, fields) except: pass ## end nzo.Mutators ####################################################### ########################################################################### @property def workpath(self): """ Return the full path for my job-admin folder """ return long_path(get_admin_path(self.work_name, self.futuretype)) @property def downpath(self): """ Return the full path for my download folder """ if self.futuretype: return '' else: return long_path(os.path.join(cfg.download_dir.get_path(), self.work_name)) @property def group(self): if self.groups: return self.groups[0] else: return None @property def remaining(self): """ Return remaining bytes """ return self.bytes - self.bytes_tried @synchronized(NZO_LOCK) def purge_data(self, delete_all_data=True): """ Remove (all) job data """ logging.info('[%s] Purging data for job %s (delete_all_data=%s)', caller_name(), self.final_name, delete_all_data) # Abort DirectUnpack and let it remove files self.abort_direct_unpacker() # Delete all, or just basic? if delete_all_data: remove_all(self.downpath, recursive=True) else: # We remove any saved articles and save the renames file remove_all(self.downpath, 'SABnzbd_nz?_*', keep_folder=True) remove_all(self.downpath, 'SABnzbd_article_*', keep_folder=True) sabnzbd.save_data(self.renames, RENAMES_FILE, self.workpath, silent=True) def gather_info(self, full=False): queued_files = [] if full: # extrapars can change during iteration with NZO_LOCK: for _set in self.extrapars: for nzf in self.extrapars[_set]: # Don't show files twice if not nzf.completed and nzf not in self.files: queued_files.append(nzf) return PNFO(self.repair, self.unpack, self.delete, self.script, self.nzo_id, self.final_name_labeled, self.password, {}, '', self.cat, self.url, self.remaining, self.bytes, self.avg_stamp, self.avg_date, self.finished_files if full else [], self.files if full else [], queued_files, self.status, self.priority, self.bytes_missing, self.direct_unpacker.get_formatted_stats() if self.direct_unpacker else 0) def get_nzf_by_id(self, nzf_id): if nzf_id in self.files_table: return self.files_table[nzf_id] @synchronized(NZO_LOCK) def set_unpack_info(self, key, msg, setname=None, unique=False): """ Builds a dictionary containing the stage name (key) and a message If unique is present, it will only have a single line message """ # Add name of the set if setname: msg = "[%s] %s" % (setname, msg) # Unique messages allow only one line per stage(key) if not unique: if key not in self.unpack_info: self.unpack_info[key] = [] self.unpack_info[key].append(msg) else: self.unpack_info[key] = [msg] def set_action_line(self, action=None, msg=None): if action and msg: self.action_line = '%s: %s' % (action, msg) else: self.action_line = '' # Make sure it's updated in the interface sabnzbd.history_updated() @property def repair_opts(self): return self.repair, self.unpack, self.delete @synchronized(NZO_LOCK) def save_to_disk(self): """ Save job's admin to disk """ self.save_attribs() if self.nzo_id and not self.is_gone(): sabnzbd.save_data(self, self.nzo_id, self.workpath) def save_attribs(self): set_attrib_file(self.workpath, (self.cat, self.pp, self.script, self.priority, self.final_name, self.password, self.url)) @synchronized(NZO_LOCK) def build_pos_nzf_table(self, nzf_ids): pos_nzf_table = {} for nzf_id in nzf_ids: if nzf_id in self.files_table: nzf = self.files_table[nzf_id] pos = self.files.index(nzf) pos_nzf_table[pos] = nzf return pos_nzf_table @synchronized(NZO_LOCK) def cleanup_nzf_ids(self, nzf_ids): for nzf_id in nzf_ids[:]: if nzf_id in self.files_table: if self.files_table[nzf_id] not in self.files: nzf_ids.remove(nzf_id) else: nzf_ids.remove(nzf_id) def has_duplicates(self): """ Return (res, series) where "res" is True when this is a duplicate where "series" is True when this is an episode """ no_dupes = cfg.no_dupes() no_series_dupes = cfg.no_series_dupes() series_propercheck = cfg.series_propercheck() # abort logic if dupe check is off for both nzb+series if not no_dupes and not no_series_dupes: return False, False series = False res = False history_db = HistoryDB() # dupe check off nzb contents if no_dupes: res = history_db.have_name_or_md5sum(self.final_name, self.md5sum) logging.debug('Dupe checking NZB in history: filename=%s, md5sum=%s, result=%s', self.filename, self.md5sum, res) if not res and cfg.backup_for_duplicates(): res = sabnzbd.backup_exists(self.filename) logging.debug('Dupe checking NZB against backup: filename=%s, result=%s', self.filename, res) # dupe check off nzb filename if not res and no_series_dupes: series, season, episode, misc = sabnzbd.newsunpack.analyse_show(self.final_name) if RE_PROPER.match(misc) and series_propercheck: logging.debug('Dupe checking series+season+ep in history aborted due to PROPER/REAL/REPACK found') else: res = history_db.have_episode(series, season, episode) logging.debug('Dupe checking series+season+ep in history: series=%s, season=%s, episode=%s, result=%s', series, season, episode, res) history_db.close() return res, series def is_gone(self): """ Is this job still going somehow? """ return self.status in (Status.COMPLETED, Status.DELETED, Status.FAILED) def __getstate__(self): """ Save to pickle file, selecting attributes """ dict_ = {} for item in NzbObjectSaver: dict_[item] = getattr(self, item) dict_['try_list'] = TryList.__getstate__(self) return dict_ def __setstate__(self, dict_): """ Load from pickle file, selecting attributes """ for item in NzbObjectSaver: try: setattr(self, item, dict_[item]) except KeyError: # Handle new attributes setattr(self, item, None) TryList.__setstate__(self, dict_.get('try_list', [])) # Set non-transferable values self.pp_active = False self.avg_stamp = time.mktime(self.avg_date.timetuple()) self.url_wait = None self.url_tries = 0 self.to_be_removed = False self.direct_unpacker = None if self.meta is None: self.meta = {} if self.servercount is None: self.servercount = {} if self.md5of16k is None: self.md5of16k = {} if self.renames is None: self.renames = {} if self.bad_articles is None: self.bad_articles = 0 self.first_articles_count = 0 if self.bytes_missing is None: self.bytes_missing = 0 if self.bytes_tried is None: # Fill with old info self.bytes_tried = 0 for nzf in self.finished_files: # Emulate behavior of 1.0.x self.bytes_tried += nzf.bytes for nzf in self.files: self.bytes_tried += nzf.bytes - nzf.bytes_left def __repr__(self): return "" % self.filename def nzf_get_filename(nzf): """ Return filename, if the filename not set, try the the full subject line instead. Can produce non-ideal results """ name = nzf.filename if not name: name = nzf.subject if not name: name = '' return name.lower() def nzf_cmp_date(nzf1, nzf2): """ Compare files based on date, but give vol-par files preference. Wrapper needed, because `cmp` function doesn't handle extra parms. """ return nzf_cmp_name(nzf1, nzf2, name=False) def nzf_cmp_name(nzf1, nzf2, name=True): # The comparison will sort .par2 files to the top of the queue followed by .rar files, # they will then be sorted by name. name1 = nzf_get_filename(nzf1) name2 = nzf_get_filename(nzf2) # Determine vol-pars is_par1 = '.vol' in name1 and '.par2' in name1 is_par2 = '.vol' in name2 and '.par2' in name2 # mini-par2 in front if not is_par1 and name1.endswith('.par2'): return -1 if not is_par2 and name2.endswith('.par2'): return 1 # vol-pars go to the back if is_par1 and not is_par2: return 1 if is_par2 and not is_par1: return -1 if name: # Prioritize .rar files above any other type of file (other than vol-par) m1 = RE_RAR.search(name1) m2 = RE_RAR.search(name2) if m1 and not (is_par2 or m2): return -1 elif m2 and not (is_par1 or m1): return 1 # Force .rar to come before 'r00' if m1 and m1.group(1) == '.rar': name1 = name1.replace('.rar', '.r//') if m2 and m2.group(1) == '.rar': name2 = name2.replace('.rar', '.r//') return cmp(name1, name2) else: # Do date comparison return cmp(nzf1.date, nzf2.date) def create_work_name(name): """ Remove ".nzb" and ".par(2)" and sanitize """ strip_ext = ['.nzb', '.par', '.par2'] name = sanitize_foldername(name.strip()) if name.find('://') < 0: name_base, ext = os.path.splitext(name) # In case it was one of these, there might be more while ext.lower() in strip_ext: name = name_base name_base, ext = os.path.splitext(name) return name.strip() else: return name.strip() def scan_password(name): """ Get password (if any) from the title """ if 'http://' in name or 'https://' in name: return name, None braces = name.find('{{') if braces < 0: braces = len(name) slash = name.find('/') # Look for name/password, but make sure that '/' comes before any {{ if 0 <= slash < braces and 'password=' not in name: # Is it maybe in 'name / password' notation? if slash == name.find(' / ') + 1: # Remove the extra space after name and before password return name[:slash - 1].strip('. '), name[slash + 2:] return name[:slash].strip('. '), name[slash + 1:] # Look for "name password=password" pw = name.find('password=') if pw >= 0: return name[:pw].strip('. '), name[pw + 9:] # Look for name{{password}} if braces < len(name) and name.endswith('}}'): return name[:braces].strip('. '), name[braces + 2:len(name) - 2] # Look again for name/password if slash >= 0: return name[:slash].strip('. '), name[slash + 1:] # No password found return name, None def get_attrib_file(path, size): """ Read job's attributes from file """ attribs = [] path = os.path.join(path, ATTRIB_FILE) try: f = open(path, 'r', encoding="utf-8") except: return [None for unused in range(size)] for unused in range(size): line = f.readline().strip('\r\n ') if line: if line.lower() == 'none': line = None try: line = int(line) except: pass attribs.append(line) else: attribs.append(None) f.close() return attribs def set_attrib_file(path, attribs): """ Write job's attributes to file """ path = os.path.join(path, ATTRIB_FILE) try: f = open(path, 'w', encoding="utf-8") except: return for item in attribs: f.write('%s\n' % item) f.close() def name_extractor(subject): """ Try to extract a file name from a subject line, return `subject` if in doubt """ result = subject for name in re.findall(SUBJECT_FN_MATCHER, subject): name = name.strip(' "') if name and RE_NORMAL_NAME.search(name): result = name return result def matcher(pattern, txt): """ Return True if `pattern` is sufficiently equal to `txt` """ if txt.endswith(pattern): txt = txt[:txt.rfind(pattern)].strip() return (not txt) or txt.endswith('"') else: return False sabnzbd-develop/sabnzbd/getipaddress.py0000600000175000017500000001071013642116632016407 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.getipaddress """ import socket import multiprocessing.pool import functools import urllib.request import urllib.error import sabnzbd import sabnzbd.cfg from sabnzbd.encoding import ubtou def timeout(max_timeout): """ Timeout decorator, parameter in seconds. """ def timeout_decorator(item): """ Wrap the original function. """ @functools.wraps(item) def func_wrapper(*args, **kwargs): """ Closure for function. """ pool = multiprocessing.pool.ThreadPool(processes=1) async_result = pool.apply_async(item, args, kwargs) # raises a TimeoutError if execution exceeds max_timeout return async_result.get(max_timeout) return func_wrapper return timeout_decorator @timeout(3.0) def addresslookup(myhost): return socket.getaddrinfo(myhost, 80) @timeout(3.0) def addresslookup4(myhost): return socket.getaddrinfo(myhost, 80, socket.AF_INET) @timeout(3.0) def addresslookup6(myhost): return socket.getaddrinfo(myhost, 80, socket.AF_INET6) def localipv4(): try: s_ipv4 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Option: use 100.64.1.1 (IANA-Reserved IPv4 Prefix for Shared Address Space) s_ipv4.connect(("1.2.3.4", 80)) ipv4 = s_ipv4.getsockname()[0] s_ipv4.close() except socket.error: ipv4 = None return ipv4 def publicipv4(): """ Because of dual IPv4/IPv6 clients, finding the public ipv4 needs special attention, meaning forcing IPv4 connections, and not allowing IPv6 connections """ public_ipv4 = None try: ipv4_found = False # we only want IPv4 resolving, so socket.AF_INET: result = addresslookup4(sabnzbd.cfg.selftest_host()) except (socket.error, multiprocessing.context.TimeoutError): # something very bad: no urllib2, no resolving of selftest_host, no network at all return public_ipv4 # we got one or more IPv4 address(es), so let's connect to them for item in result: # get next IPv4 address of sabnzbd.cfg.selftest_host() selftest_ipv4 = item[4][0] try: # put the selftest_host's IPv4 address into the URL req = urllib.request.Request("http://" + selftest_ipv4 + "/") # specify the User-Agent, because certain sites refuse connections with "python urllib2" as User-Agent: req.add_header("User-Agent", "SABnzbd+/%s" % sabnzbd.version.__version__) # specify the Host, because we only provide the IPv4 address in the URL: req.add_header("Host", sabnzbd.cfg.selftest_host()) # get the response, timeout 2 seconds, in case the website is not accessible public_ipv4 = ubtou(urllib.request.urlopen(req, timeout=2).read()) # ... check the response is indeed an IPv4 address: # if we got anything else than a plain IPv4 address, this will raise an exception socket.inet_aton(public_ipv4) # if we get here without exception, we're done: ipv4_found = True break except (socket.error, urllib.error.URLError): # the connect OR the inet_aton raised an exception, so: # continue the for loop to try next server IPv4 address pass if not ipv4_found: public_ipv4 = None return public_ipv4 def ipv6(): try: s_ipv6 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) # IPv6 prefix for documentation purpose s_ipv6.connect(("2001:db8::8080", 80)) ipv6_address = s_ipv6.getsockname()[0] s_ipv6.close() except socket.error: ipv6_address = None return ipv6_address sabnzbd-develop/sabnzbd/decoder.py0000600000175000017500000002347713642116632015354 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.decoder - article decoder """ import logging import hashlib from time import sleep from threading import Thread import sabnzbd from sabnzbd.constants import MAX_DECODE_QUEUE, LIMIT_DECODE_QUEUE, SABYENC_VERSION_REQUIRED import sabnzbd.articlecache import sabnzbd.downloader import sabnzbd.nzbqueue import sabnzbd.cfg as cfg from sabnzbd.encoding import ubtou from sabnzbd.misc import match_str # Check for correct SABYenc version SABYENC_VERSION = None try: import sabyenc3 SABYENC_ENABLED = True SABYENC_VERSION = sabyenc3.__version__ # Verify version to at least match minor version if SABYENC_VERSION[:3] != SABYENC_VERSION_REQUIRED[:3]: raise ImportError except ImportError: SABYENC_ENABLED = False class CrcError(Exception): def __init__(self, needcrc, gotcrc, data): Exception.__init__(self) self.needcrc = needcrc self.gotcrc = gotcrc self.data = data class BadYenc(Exception): def __init__(self): Exception.__init__(self) YDEC_TRANS = ''.join([chr((i + 256 - 42) % 256) for i in range(256)]) class Decoder(Thread): def __init__(self, servers, queue): Thread.__init__(self) self.queue = queue self.servers = servers self.__log_decoding = cfg.debug_log_decoding() def stop(self): # Put multiple to stop all decoders self.queue.put(None) self.queue.put(None) def run(self): while 1: # Sleep to allow decoder/assembler switching sleep(0.0001) art_tup = self.queue.get() if not art_tup: break article, raw_data = art_tup nzf = article.nzf nzo = nzf.nzo art_id = article.article killed = False # Check if the space that's now free can let us continue the queue? qsize = self.queue.qsize() if (sabnzbd.articlecache.ArticleCache.do.free_reserve_space(article.bytes) or qsize < MAX_DECODE_QUEUE) and \ (qsize < LIMIT_DECODE_QUEUE) and sabnzbd.downloader.Downloader.do.delayed: sabnzbd.downloader.Downloader.do.undelay() data = None register = True # Finish article found = False # Proper article found logme = None if raw_data: try: if nzo.precheck: raise BadYenc register = True if self.__log_decoding: logging.debug("Decoding %s", art_id) data = self.decode(article, raw_data) nzf.article_count += 1 found = True except IOError: logme = T('Decoding %s failed') % art_id logging.warning(logme) logging.info("Traceback: ", exc_info=True) sabnzbd.downloader.Downloader.do.pause() sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article) register = False except MemoryError: logme = T('Decoder failure: Out of memory') logging.warning(logme) anfo = sabnzbd.articlecache.ArticleCache.do.cache_info() logging.info("Decoder-Queue: %d, Cache: %d, %d, %d", self.queue.qsize(), anfo.article_sum, anfo.cache_size, anfo.cache_limit) logging.info("Traceback: ", exc_info=True) sabnzbd.downloader.Downloader.do.pause() sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article) register = False except CrcError as e: logme = 'CRC Error in %s' % art_id logging.info(logme) data = e.data except (BadYenc, ValueError): # Handles precheck and badly formed articles killed = False found = False if nzo.precheck and raw_data and raw_data.startswith(b'223 '): # STAT was used, so we only get a status code found = True else: # Examine headers (for precheck) or body (for download) # And look for DMCA clues (while skipping "X-" headers) for line in raw_data: lline = ubtou(line).lower() if 'message-id:' in lline: found = True if not lline.startswith('X-') and match_str(lline, ('dmca', 'removed', 'cancel', 'blocked')): killed = True break if killed: logme = 'Article removed from server (%s)' logging.info(logme, art_id) if nzo.precheck: if found and not killed: # Pre-check, proper article found, just register if sabnzbd.LOG_ALL: logging.debug('Server %s has article %s', article.fetcher, art_id) register = True elif not killed and not found: logme = T('Badly formed yEnc article in %s') % art_id logging.info(logme) # bad yEnc article, so ... let's check if it's uuencode, to inform user and stop download if raw_data[0].lower().find(b'\nbegin ') >= 0: logme = T('UUencode detected, only yEnc encoding is supported [%s]') % nzo.final_name logging.error(logme) nzo.fail_msg = logme sabnzbd.nzbqueue.NzbQueue.do.end_job(nzo) break if not found or killed: new_server_found = self.search_new_server(article) if new_server_found: register = False logme = None except: logme = T('Unknown Error while decoding %s') % art_id logging.info(logme) logging.info("Traceback: ", exc_info=True) new_server_found = self.search_new_server(article) if new_server_found: register = False logme = None if logme: if killed: nzo.increase_bad_articles_counter('killed_articles') else: nzo.increase_bad_articles_counter('bad_articles') else: new_server_found = self.search_new_server(article) if new_server_found: register = False elif nzo.precheck: found = False if data: sabnzbd.articlecache.ArticleCache.do.save_article(article, data) if register: sabnzbd.nzbqueue.NzbQueue.do.register_article(article, found) def decode(self, article, raw_data): # Let SABYenc do all the heavy lifting decoded_data, output_filename, crc, crc_expected, crc_correct = sabyenc3.decode_usenet_chunks(raw_data, article.bytes) # Assume it is yenc article.nzf.type = 'yenc' # Only set the name if it was found and not obfuscated self.verify_filename(article, decoded_data, output_filename) # CRC check if not crc_correct: raise CrcError(crc_expected, crc, decoded_data) return decoded_data def search_new_server(self, article): # Search new server article.add_to_try_list(article.fetcher) for server in self.servers: if server.active and not article.server_in_try_list(server): if server.priority >= article.fetcher.priority: article.tries = 0 # Allow all servers for this nzo and nzf again (but not for this article) sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article, article_reset=False) return True msg = T('%s => missing from all servers, discarding') % article logging.info(msg) article.nzf.nzo.increase_bad_articles_counter('missing_articles') return False def verify_filename(self, article, decoded_data, yenc_filename): """ Verify the filename provided by yenc by using par2 information and otherwise fall back to NZB name """ nzf = article.nzf # Was this file already verified and did we get a name? if nzf.filename_checked or not yenc_filename: return # Set the md5-of-16k if this is the first article if article.lowest_partnum: nzf.md5of16k = hashlib.md5(decoded_data[:16384]).digest() # Try the rename nzf.nzo.verify_nzf_filename(nzf, yenc_filename) sabnzbd-develop/sabnzbd/skintext.py0000600000175000017500000016354413642116632015620 0ustar jpjp#!/usr/bin/python3 -OO # -*- coding: UTF-8 -*- # Copyright 2012-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.skintext - Language strings used in the templates """ SKIN_TEXT = { # Special texts 'stage-download' : TT('Download'), #: Queue status "download" 'stage-repair' : TT('Repair'), #: PP phase "repair" 'stage-filejoin' : TT('Join files'), #: PP phase "filejoin" 'stage-unpack' : TT('Unpack'), #: PP phase "unpack" 'stage-script' : TT('Script'), #: PP phase "script" 'stage-source' : TT('Source'), #: PP Source of the NZB (path or URL) 'stage-servers' : TT('Servers'), #: PP Distribution over servers 'stage-fail' : TT('Failure'), #: PP Failure message 'post-Completed' : TT('Completed'), #: PP status 'post-Failed' : TT('Failed'), #: PP status 'post-Queued' : TT('Waiting'), #: Queue and PP status 'post-Paused' : TT('Paused'), #: PP status 'post-Repairing' : TT('Repairing...'), #: PP status 'post-Extracting' : TT('Extracting...'), #: PP status 'post-Moving' : TT('Moving...'), #: PP status 'post-Running' : TT('Running script...'), #: PP status 'post-Fetching' : TT('Fetching extra blocks...'), #: PP status 'post-QuickCheck' : TT('Quick Check...'), #: PP status 'post-Verifying' : TT('Verifying...'), #: PP status 'post-Downloading' : TT('Downloading'), #: Pseudo-PP status, in reality used for Queue-status 'post-Propagating' : TT('Propagation delay'), 'post-Checking' : TT('Checking'), #: PP status 'sch-task' : TT('Task'), #: #: Config->Scheduler 'sch-disable_server' : TT('disable server'), #: #: Config->Scheduler 'sch-enable_server' : TT('enable server'), #: #: Config->Scheduler 'sch-speedlimit' : TT('Speedlimit'), #: #: Config->Scheduler 'sch-pause_all' : TT('Pause All'), #: #: Config->Scheduler 'sch-pause_post' : TT('Pause post-processing'), #: #: Config->Scheduler 'sch-resume_post' : TT('Resume post-processing'), #: #: Config->Scheduler 'sch-scan_folder' : TT('Scan watched folder'), #: #: Config->Scheduler 'sch-rss_scan' : TT('Read RSS feeds'), #: #: Config->Scheduler 'sch-remove_failed' : TT('Remove failed jobs'), #: Config->Scheduler 'sch-remove_completed': TT('Remove completed jobs'), #: Config->Scheduler 'sch-pause_all_low' : TT('Pause low prioirty jobs'), #: Config->Scheduler 'sch-pause_all_normal':TT('Pause normal prioirty jobs'), #: Config->Scheduler 'sch-pause_all_high' : TT('Pause high prioirty jobs'), #: Config->Scheduler 'sch-resume_all_low' : TT('Resume low prioirty jobs'), #: Config->Scheduler 'sch-resume_all_normal':TT('Resume normal prioirty jobs'), #: Config->Scheduler 'sch-resume_all_high': TT('Resume high prioirty jobs'), #: Config->Scheduler 'sch-enable_quota' : TT('Enable quota management'), #: Config->Scheduler 'sch-disable_quota' : TT('Disable quota management'), #: Config->Scheduler 'sch-pause_cat' : TT('Pause jobs with category'), #: Config->Scheduler 'sch-resume_cat' : TT('Resume jobs with category'), #: Config->Scheduler 'prowl-off' : TT('Off'), #: Prowl priority 'prowl-very-low' : TT('Very Low'), #: Prowl priority 'prowl-moderate' : TT('Moderate'), #: Prowl priority 'prowl-normal' : TT('Normal'), #: Prowl priority 'prowl-high' : TT('High'), #: Prowl priority 'prowl-emergency' : TT('Emergency'), #: Prowl priority 'pushover-off' : TT('Off'), #: Prowl priority 'pushover-low' : TT('Low'), #: Prowl priority 'pushover-high' : TT('High'), #: Prowl priority # General texts 'default' : TT('Default'), #: Default value, used in dropdown menus 'none' : TT('None'), #: No value, used in dropdown menus 'MB' : TT('MB'), #: Megabytes 'GB' : TT('GB'), #: Gigabytes 'B' : TT('B'), #: Bytes (used as postfix, as in "GB", "TB") 'hour' : TT('hour'), #: One hour 'hours' : TT('hours'), #: Multiple hours 'minute' : TT('min'), #: One minute 'minutes' : TT('mins'), #: Multiple minutes 'second' : TT('sec'), #: One second 'seconds' : TT('seconds'), #: Multiple seconds 'day' : TT('day'), 'days' : TT('days'), 'week' : TT('week'), 'month' : TT('Month'), 'year' : TT('Year'), 'January': TT('January'), 'February': TT('February'), 'March': TT('March'), 'April': TT('April'), 'May': TT('May'), 'June': TT('June'), 'July': TT('July'), 'August': TT('August'), 'September': TT('September'), 'October': TT('October'), 'November': TT('November'), 'December': TT('December'), 'monday' : TT('Monday'), 'tuesday' : TT('Tuesday'), 'wednesday' : TT('Wednesday'), 'thursday' : TT('Thursday'), 'friday' : TT('Friday'), 'saturday' : TT('Saturday'), 'sunday' : TT('Sunday'), 'day-of-month' : TT('Day of month'), 'thisWeek' : TT('This week'), 'thisMonth' : TT('This month'), 'today' : TT('Today'), 'total' : TT('Total'), 'on' : TT('on'), 'off' : TT('off'), 'parameters' : TT('Parameters'), #: Config: startup parameters of SABnzbd 'pythonVersion' : TT('Python Version'), 'notAvailable' : TT('Not available'), 'homePage' : TT('Home page'), #: Home page of the SABnzbd project 'source' : TT('Source'), #: Where to find the SABnzbd sourcecode 'or' : TT('or'), #: Used in "IRC or IRC-Webaccess" 'host' : TT('Host'), 'comment' : TT('Comment'), 'send' : TT('Send'), 'cancel' : TT('Cancel'), 'other' : TT('Other'), 'report' : TT('Report'), 'video' : TT('Video'), 'audio' : TT('Audio'), 'notUsed' : TT('Not used'), 'orLess' : TT('or less'), 'login' : TT('Log in'), 'logout' : TT('Log out'), 'rememberme' : TT('Remember me'), # General template elements 'signOn' : TT('The automatic usenet download tool'), #: SABnzbd's theme line 'button-save' : TT('Save'), #: "Save" button 'button-saving' : TT('Saving..'), 'button-failed' : TT('Failed'), 'confirm' : TT('Are you sure?'), #: Used in confirmation popups 'delFiles' : TT('Delete all downloaded files?'), #: Used in confirmation popups # Header 'menu-home' : TT('Home'), #: Main menu item 'menu-queue' : TT('Queue'), #: Main menu item 'menu-history' : TT('History'), #: Main menu item 'menu-config' : TT('Config'), #: Main menu item 'menu-cons' : TT('Status'), #: Main menu item 'menu-help' : TT('Help'), #: Main menu item 'menu-wiki' : TT('Wiki'), #: Main menu item 'menu-forums' : TT('Forum'), #: Main menu item 'menu-irc' : TT('IRC'), #: Main menu item 'menu-issues' : TT('Issues'), #: Main menu item 'menu-donate' : TT('Support the project, Donate!'), #: Main menu item 'cmenu-general' : TT('General'), #: Main menu item 'cmenu-folders' : TT('Folders'), #: Main menu item 'cmenu-switches' : TT('Switches'), #: Main menu item 'cmenu-servers' : TT('Servers'), #: Main menu item 'cmenu-scheduling' : TT('Scheduling'), #: Main menu item 'cmenu-rss' : TT('RSS'), #: Main menu item 'cmenu-notif' : TT('Notifications'), #: Main menu item 'cmenu-email' : TT('Email'), #: Main menu item 'cmenu-cat' : TT('Categories'), #: Main menu item 'cmenu-sorting' : TT('Sorting'), #: Main menu item 'cmenu-special' : TT('Special'), #: Main menu item 'cmenu-search' : TT('Search'), #: Main menu item # Footer 'ft-download' : TT('Download Dir'), # Used in Footer 'ft-paused' : TT('PAUSED'), # Used in Footer 'ft-buffer@2' : TT('Cached %s articles (%s)'), # Used in Footer 'ft-sysload' : TT('Sysload'), # Used in Footer 'ft-newRelease@1' : TT('New release %s available at'), # Used in Footer # Main page 'shutdownOK?' : TT('Are you sure you want to shutdown SABnzbd?'), 'link-shutdown' : TT('Shutdown'), #: Shutdown SABnzbd 'link-pause' : TT('Pause'), #: Pause downloading 'link-resume' : TT('Resume'), #: Resume downloading 'button-add' : TT('Add'), #: Add NZB to queue (button) 'add' : TT('Add'), #: Add NZB to queue (header) 'addFile' : TT('Add File'), #: Add NZB file to queue (header 'category' : TT('Category'), #: Job category 'pp' : TT('Processing'), 'script' : TT('Script'), 'priority' : TT('Priority'), 'pp-none' : TT('Download'), #: Post processing pick list 'pp-repair' : TT('+Repair'), #: Post processing pick list 'pp-unpack' : TT('+Unpack'), #: Post processing pick list 'pp-delete' : TT('+Delete'), #: Post processing pick list 'pp-r' : TT('R'), #: Post processing pick list: abbreviation for "+Repair" 'pp-u' : TT('U'), #: Post processing pick list: abbreviation for "+Unpack" 'pp-d' : TT('D'), #: Post processing pick list: abbreviation for "+Delete" 'pr-force' : TT('Force'), #: Priority pick list 'pr-normal' : TT('Normal'), #: Priority pick list 'pr-high' : TT('High'), #: Priority pick list 'pr-low' : TT('Low'), #: Priority pick list 'pr-paused' : TT('Paused'), #: Priority pick list 'pr-stop' : TT('Stop'), #: Priority pick list 'enterURL' : TT('Enter URL'), #: Add NZB Dialog # Queue page 'onQueueFinish' : TT('On queue finish'), #: Queue page selection menu 'shutdownPc' : TT('Shutdown PC'), #: Queue page end-of-queue action 'standbyPc' : TT('Standby PC'), #: Queue page end-of-queue action 'hibernatePc' : TT('Hibernate PC'), #: Queue page end-of-queue action 'shutdownSab' : TT('Shutdown SABnzbd'), #: Queue page end-of-queue action 'speedLimit' : TT('Speed Limit'), #: Queue page selection menu or entry box 'pauseFor' : TT('Pause for'), #: Queue page button or entry box 'mode' : TT('Processing'), #: Queue page table column header 'order' : TT('Order'), #: Queue page table column header 'name' : TT('Name'), #: Queue page table column header 'eta' : TT('ETA'), #: Queue page table column header, "estimated time of arrival" 'age' : TT('AGE'), #: Queue page table column header, "age of the NZB" 'button-del' : TT('Del'), #: Queue page table, "Delete" button 'button-retry' : TT('Retry'), #: Queue page button 'eoq-actions' : TT('Actions'), #: Queue end-of-queue selection box 'eoq-scripts' : TT('Scripts'), #: Queue page table, script selection menu 'purgeQueue' : TT('Purge Queue'), #: Queue page button 'purgeQueueConf' : TT('Delete all items from the queue?'), #: Confirmation popup 'purgeNZBs' : TT('Purge NZBs'), #: Queue page button 'purgeNZBs-Files' : TT('Purge NZBs & Delete Files'), #: Queue page button 'retryQueue' : TT('Retry all failed jobs'), #: Retry all failed jobs dialog box 'removeNZB' : TT('Remove NZB'), #: Queue page button 'removeNZB-Files' : TT('Remove NZB & Delete Files'), #: Queue page button 'AofB' : TT('of'), #: Queue page, as in "4G *of* 10G" 'missingArt': TT('Missing articles'), #: Caption for missing articles in Queue 'quota-left' : TT('Quota left'), #: Remaining quota (displayed in Queue) 'manual' : TT('manual'), #: Manual reset of quota 'link-resetQuota' : TT('Reset Quota now'), # History page 'purgeHist' : TT('Purge History'), #: History page button 'purgeHistConf' : TT('Delete all completed items from History?'), #: Confirmation popup 'hideDetails' : TT('Hide details'), #: Button/link hiding History job details 'showDetails' : TT('Show details'), #: Button/link showing History job details 'showFailedHis' : TT('Show Failed'), #: Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG! 'showAllHis' : TT('Show All'), #: Button or link showing all History jobs 'completed' : TT('Completed'), #: History: job status 'size' : TT('Size'), #: History table header 'status' : TT('Status'), #: History table header 'purgeFailed' : TT('Purge Failed NZBs'), #: Button to delete all failed jobs in History 'purgeFailed-Files' : TT('Purge Failed NZBs & Delete Files'), #: Button to delete all failed jobs in History, including files 'purgeCompl' : TT('Purge Completed NZBs'), #: Button to delete all completed jobs in History 'purgePage' : TT('Purge NZBs on the current page'), #: Button to delete jobs on current page in History 'opt-extra-NZB' : TT('Optional Supplemental NZB'), #: Button to add NZB to failed job in History 'msg-path' : TT('Path'), #: Path as displayed in History details 'link-retryAll' : TT('Retry all failed'), #: Retry all failed jobs in History 'retryNZBs' : TT('Retry All'), #: Retry all button for Retry All Failed Jobs 'spam' : TT('Virus/spam'), 'encrypted' : TT('Passworded'), 'expired' : TT('Out of retention'), 'otherProblem' : TT('Other problem'), # Connections page 'link-forceDisc' : TT('Force Disconnect'), #: Status page button 'explain-forceDisc' : TT('Disconnect all active connections to usenet servers. Connections will be reopened after a few seconds if there are items in the queue.'), #: Status page button text 'askTestEmail' : TT('This will send a test email to your account.'), 'link-showLog' : TT('Show Logging'), #: Status page button 'link-testEmail' : TT('Test Email'), #: Status page button 'logging' : TT('Logging'), #: Status page selection menu 'log-errWarn' : TT('Errors/Warning'), #: Status page table header 'log-info' : TT('+ Info'), #: Status page logging selection value 'log-debug' : TT('+ Debug'), #: Status page logging selection value 'connections' : TT('Connections'), #: Status page tab header 'lastWarnings' : TT('Latest Warnings'), #: Status page, table header 'clearWarnings' : TT('clear'), #: Status page button 'server-blocked' : TT('Unblock'), #: Status page button 'article-id' : TT('Article identifier'), #: Status page, article identifier 'file-set' : TT('File set'), #: Status page, par-set that article belongs to 'warn-when' : TT('When'), #: Status page, table column header, when error occured 'warn-type' : TT('Type'), #: Status page, table column header, type of message 'warning' : TT('Warning'), #: Status page, table column header, actual message 'warnings' : TT('Warnings'), #: Footer: indicator of warnings 'enabled' : TT('Enabled'), #: Status page, indicator that server is enabled # Dashboard 'dashboard-title' : TT('Dashboard'), 'dashboard-connectionError' : TT('Connection failed!'), 'dashboard-localIP4' : TT('Local IPv4 address'), 'dashboard-publicIP4' : TT('Public IPv4 address'), 'dashboard-IP6' : TT('IPv6 address'), 'dashboard-NameserverDNS' : TT('Nameserver / DNS Lookup'), 'dashboard-cpuModel' : TT('CPU Model'), 'dashboard-systemPerformance' : TT('System Performance (Pystone)'), #: Do not translate Pystone 'dashboard-downloadDirSpeed' : TT('Download folder speed'), 'dashboard-completeDirSpeed' : TT('Complete folder speed'), 'dashboard-writingSpeed' : TT('Writing speed'), 'dashboard-speedTestFailed' : TT('Could not write. Check that the directory is writable.'), 'dashboard-internetBandwidth' : TT('Internet Bandwidth'), 'dashboard-clickToStart' : TT('Click on Repeat test button below to determine'), 'dashboard-repeatTest' : TT('Repeat test'), 'dashboard-testDownload' : TT('Test download'), 'dashboard-testDownload-explain' : TT('Adds a verified test NZB of the specified size, filled with random data. Can be used to verify your setup.'), # Configuration 'confgFile' : TT('Config File'), 'cache' : TT('Used cache'), #: Main config page, how much cache is in use 'explain-Restart' : TT('This will restart SABnzbd.
Use it when you think the program has a stability problem.
Downloading will be paused before the restart and resume afterwards.'), 'explain-needNewLogin' : TT('
If authentication is enabled, you will need to login again.'), 'button-advanced' : TT('Advanced'), 'button-restart' : TT('Restart'), 'explain-orphans' : TT('There are orphaned jobs in the download folder.
You can choose to delete them (including files) or send them back to the queue.'), 'button-repair' : TT('Repair'), 'explain-Repair' : TT('The "Repair" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded files.
This will modify the queue order.'), 'confirmWithoutSavingPrompt' : TT('Changes have not been saved, and will be lost.'), 'explain-sessionExpire': TT('When your IP address changes or SABnzbd is restarted the session will expire.'), 'opt-enable_unzip' : TT('Enable Unzip'), 'opt-enable_7zip' : TT('Enable 7zip'), 'opt-multicore-par2' : TT('Multicore Par2'), 'explain-nosslcontext' : TT('Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will be encrypted, however, validating a server\'s identity using its certificates is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates are required.'), 'explain-getpar2mt': TT('Speed up repairs by installing multicore Par2, it is available for many platforms.'), 'version' : TT('Version'), 'uptime' : TT('Uptime'), 'backup' : TT('Backup'), #: Indicates that server is Backup server in Status page 'readwiki': TT('Read the Wiki Help on this!'), 'restarting-sab': TT('Restarting SABnzbd...'), # Config->General 'restartRequired' : TT('Changes will require a SABnzbd restart!'), 'webServer' : TT('SABnzbd Web Server'), 'opt-host' : TT('SABnzbd Host'), 'explain-host' : TT('Host SABnzbd should listen on.'), 'opt-port' : TT('SABnzbd Port'), 'explain-port' : TT('Port SABnzbd should listen on.'), 'opt-web_dir' : TT('Web Interface'), 'explain-web_dir' : TT('Choose a skin.'), 'opt-web_username' : TT('SABnzbd Username'), 'explain-web_username' : TT('Optional authentication username.'), 'opt-web_password' : TT('SABnzbd Password'), 'explain-web_password' : TT('Optional authentication password.'), 'checkSafety' : TT('If the SABnzbd Host or Port is exposed to the internet, your current settings allow full external access to the SABnzbd interface.'), 'security' : TT('Security'), 'opt-enable_https' : TT('Enable HTTPS'), 'opt-notInstalled' : TT('not installed'), 'explain-enable_https' : TT('Enable accessing the interface from a HTTPS address.'), 'opt-https_port' : TT('HTTPS Port'), 'explain-https_port' : TT('If empty, the standard port will only listen to HTTPS.'), 'opt-https_cert' : TT('HTTPS Certificate'), 'explain-https_cert' : TT('File name or path to HTTPS Certificate.'), 'explain-new-cert': TT('Generate new self-signed certificate and key. Requires SABnzbd restart!'), 'opt-https_key' : TT('HTTPS Key'), 'explain-https_key' : TT('File name or path to HTTPS Key.'), 'opt-https_chain' : TT('HTTPS Chain Certifcates'), 'explain-https_chain' : TT('File name or path to HTTPS Chain.'), 'tuning' : TT('Tuning'), 'opt-rss_rate' : TT('RSS Checking Interval'), 'explain-rss_rate' : TT('Checking interval (in minutes, at least 15). Not active when you use the Scheduler!'), 'opt-bandwidth_max' : TT('Maximum line speed'), 'opt-bandwidth_perc' : TT('Percentage of line speed'), 'explain-bandwidth_perc' : TT('Which percentage of the linespeed should SABnzbd use, e.g. 50'), 'opt-cache_limitstr' : TT('Article Cache Limit'), 'explain-cache_limitstr' : TT('Cache articles in memory to reduce disk access.
In bytes, optionally follow with K,M,G. For example: "64M" or "128M"'), 'opt-cleanup_list' : TT('Cleanup List'), 'explain-cleanup_list' : TT('List of file extensions that should be deleted after download.
For example: nfo or nfo, sfv'), 'opt-history_retention' : TT('History Retention'), 'explain-history_retention' : TT('Automatically delete completed jobs from History. Beware that Duplicate Detection and some external tools rely on History information.'), 'history_retention-all' : TT('Keep all jobs'), 'history_retention-number' : TT('Keep maximum number of completed jobs'), 'history_retention-days' : TT('Keep completed jobs maximum number of days'), 'history_retention-none' : TT('Do not keep any completed jobs'), 'history_retention-limit': TT('Jobs'), 'button-saveChanges' : TT('Save Changes'), 'button-restoreDefaults' : TT('Restore Defaults'), 'explain-restoreDefaults' : TT('Reset'), 'opt-language' : TT('Language'), 'explain-language' : TT('Select a web interface language.'), 'explain-ask-language': TT('Help us translate SABnzbd in your language!
Add untranslated texts or improved existing translations here:'), # Link to sabnzbd.org follows this text 'opt-apikey' : TT('API Key'), 'explain-apikey' : TT('This key will give 3rd party programs full access to SABnzbd.'), 'opt-nzbkey' : TT('NZB Key'), 'explain-nzbkey' : TT('This key will allow 3rd party programs to add NZBs to SABnzbd.'), 'button-apikey' : TT('Generate New Key'), 'explain-qr-code' : TT('API Key QR Code'), #: Explanation for QR code of APIKEY 'opt-local_ranges' : TT('List of local network ranges'), 'explain-local_ranges' : TT('All local network addresses start with these prefixes (often "192.168.1.")'), 'opt-inet_exposure' : TT('External internet access'), 'explain-inet_exposure' : TT('You can set access rights for systems outside your local network. Requires List of local network ranges to be defined.'), 'inet-local' : TT('No access'), # Selection value for external access 'inet-nzb' : TT('Add NZB files '), # Selection value for external access 'inet-api' : TT('API (no Config)'), # Selection value for external access 'inet-fullapi' : TT('Full API'), # Selection value for external access 'inet-ui' : TT('Full Web interface'), # Selection value for external access 'inet-external_login' : TT('Only external access requires login'), # Selection value for external access # Config->Folders 'explain-folderConfig' : TT('NOTE: Folders will be created automatically when Saving. You may use absolute paths to save outside of the default folders.'), 'userFolders' : TT('User Folders'), 'browse-folder' : TT('Browse'), 'in' : TT('In'), 'opt-download_dir' : TT('Temporary Download Folder'), 'explain-download_dir' : TT('Location to store unprocessed downloads.
Can only be changed when queue is empty.'), 'opt-download_free' : TT('Minimum Free Space for Temporary Download Folder'), 'explain-download_free' : TT('Auto-pause when free space is beneath this value.
In bytes, optionally follow with K,M,G,T. For example: "800M" or "8G"'), 'opt-complete_dir' : TT('Completed Download Folder'), 'explain-complete_dir' : TT('Location to store finished, fully processed downloads.
Can be overruled by user-defined categories.'), 'opt-permissions' : TT('Permissions for completed downloads'), 'explain-permissions' : TT('Set permissions pattern for completed files/folders.
In octal notation. For example: "755" or "777"'), 'opt-dirscan_dir' : TT('Watched Folder'), 'explain-dirscan_dir' : TT('Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz archives for .nzb files.'), 'opt-dirscan_speed' : TT('Watched Folder Scan Speed'), 'explain-dirscan_speed' : TT('Number of seconds between scans for .nzb files.'), 'opt-script_dir' : TT('Scripts Folder'), 'explain-script_dir' : TT('Folder containing user scripts.'), 'opt-email_dir' : TT('Email Templates Folder'), 'explain-email_dir' : TT('Folder containing user-defined email templates.'), 'opt-password_file' : TT('Password file'), 'explain-password_file' : TT('File containing all passwords to be tried on encrypted RAR files.'), 'systemFolders' : TT('System Folders'), 'opt-admin_dir' : TT('Administrative Folder'), 'explain-admin_dir1' : TT('Location for queue admin and history database.
Can only be changed when queue is empty.'), 'explain-admin_dir2' : TT('Data will not be moved. Requires SABnzbd restart!'), 'opt-log_dir' : TT('Log Folder'), 'explain-log_dir' : TT('Location of log files for SABnzbd.
Requires SABnzbd restart!'), 'opt-nzb_backup_dir' : TT('.nzb Backup Folder'), 'explain-nzb_backup_dir' : TT('Location where .nzb files will be stored.'), 'base-folder' : TT('Default Base Folder'), # Config->Switches 'opt-enable_all_par' : TT('Download all par2 files'), 'explain-enable_all_par' : TT('This prevents multiple repair runs by downloading all par2 files when needed.'), 'opt-enable_recursive' : TT('Enable recursive unpacking'), 'explain-enable_recursive' : TT('Unpack archives (rar, zip, 7z) within archives.'), 'opt-flat_unpack' : TT('Ignore any folders inside archives'), 'explain-flat_unpack' : TT('All files will go into a single folder.'), 'opt-top_only' : TT('Only Get Articles for Top of Queue'), 'explain-top_only' : TT('Enable for less memory usage. Disable to prevent slow jobs from blocking the queue.'), 'opt-safe_postproc' : TT('Post-Process Only Verified Jobs'), 'explain-safe_postproc' : TT('Only perform post-processing on jobs that passed all PAR2 checks.'), 'opt-pause_on_pwrar' : TT('Action when encrypted RAR is downloaded'), 'explain-pause_on_pwrar' : TT('In case of "Pause", you\'ll need to set a password and resume the job.'), 'opt-no_dupes' : TT('Detect Duplicate Downloads'), 'explain-no_dupes' : TT('Detect identical NZB files (based on items in your History or files in .nzb Backup Folder)'), 'opt-no_series_dupes' : TT('Detect duplicate episodes in series'), 'explain-no_series_dupes' : TT('Detect identical episodes in series (based on "name/season/episode" of items in your History)'), 'opt-series_propercheck' : TT('Allow proper releases'), 'explain-series_propercheck' : TT('Bypass series duplicate detection if PROPER, REAL or REPACK is detected in the download name'), 'nodupes-off' : TT('Off'), #: Three way switch for duplicates 'nodupes-ignore' : TT('Discard'), #: Four way switch for duplicates 'nodupes-pause' : TT('Pause'), #: Four way switch for duplicates 'nodupes-fail' : TT('Fail job (move to History)'), #: Four way switch for duplicates 'nodupes-tag' : TT('Tag job'), #: Four way switch for duplicates 'abort' : TT('Abort'), #: Three way switch for encrypted posts 'opt-action_on_unwanted_extensions' : TT('Action when unwanted extension detected'), 'explain-action_on_unwanted_extensions' : TT('Action when an unwanted extension is detected in RAR files'), 'opt-unwanted_extensions' : TT('Unwanted extensions'), 'explain-unwanted_extensions' : TT('List all unwanted extensions. For example: exe or exe, com'), 'opt-sfv_check' : TT('Enable SFV-based checks'), 'explain-sfv_check' : TT('Do an extra verification based on SFV files.'), 'opt-script_can_fail' : TT('User script can flag job as failed'), 'explain-script_can_fail' : TT('When the user script returns a non-zero exit code, the job will be flagged as failed.'), 'opt-new_nzb_on_failure' : TT('On failure, try alternative NZB'), 'explain-new_nzb_on_failure' : TT('Some servers provide an alternative NZB when a download fails.'), 'opt-enable_meta' : TT('Use tags from indexer'), 'explain-enable_meta' : TT('When sorting, use tags from indexer for title, season, episode, etc. Otherwise all naming is derived from the NZB name.'), 'opt-folder_rename' : TT('Enable folder rename'), 'explain-folder_rename' : TT('Use temporary names during post processing. Disable when your system doesn\'t handle that properly.'), 'opt-pre_script' : TT('Pre-queue user script'), 'explain-pre_script' : TT('Used before an NZB enters the queue.'), 'opt-par_option' : TT('Extra PAR2 Parameters'), 'explain-par_option' : TT('Read the Wiki Help on this!'), 'opt-nice' : TT('Nice Parameters'), 'explain-nice' : TT('Read the Wiki Help on this!'), 'opt-ionice' : TT('IONice Parameters'), 'explain-ionice' : TT('Read the Wiki Help on this!'), 'opt-win_process_prio' : TT('External process priority'), 'explain-win_process_prio' : TT('Read the Wiki Help on this!'), 'win_process_prio-high' : TT('High'), 'win_process_prio-normal' : TT('Normal'), 'win_process_prio-low' : TT('Low'), 'win_process_prio-idle' : TT('Idle'), 'opt-auto_disconnect' : TT('Disconnect on Empty Queue'), 'explain-auto_disconnect' : TT('Disconnect from Usenet server(s) when queue is empty or paused.'), 'opt-auto_sort' : TT('Sort by Age'), 'explain-auto_sort' : TT('Automatically sort items by (average) age.'), 'opt-direct_unpack' : TT('Direct Unpack'), 'explain-direct_unpack' : TT('Jobs will start unpacking during the downloading to reduce post-processing time. Only works for jobs that do not need repair.'), 'opt-propagation_delay' : TT('Propagation delay'), 'explain-propagation_delay' : TT('Posts will be paused untill they are at least this age. Setting job priority to Force will skip the delay.'), 'opt-check_new_rel' : TT('Check for New Release'), 'explain-check_new_rel' : TT('Weekly check for new SABnzbd release.'), 'also-test' : TT('Also test releases'), #: Pick list for weekly test for new releases 'opt-replace_spaces' : TT('Replace Spaces in Foldername'), 'explain-replace_spaces' : TT('Replace spaces with underscores in folder names.'), 'opt-replace_dots' : TT('Replace dots in Foldername'), 'explain-replace_dots' : TT('Replace dots with spaces in folder names.'), 'opt-sanitize_safe' : TT('Make Windows compatible'), 'explain-sanitize_safe' : TT('For servers: make sure names are compatible with Windows.'), 'opt-auto_browser' : TT('Launch Browser on Startup'), 'explain-auto_browser' : TT('Launch the default web browser when starting SABnzbd.'), 'opt-pause_on_post_processing' : TT('Pause Downloading During Post-Processing'), 'explain-pause_on_post_processing' : TT('Pauses downloading at the start of post processing and resumes when finished.'), 'opt-ignore_samples' : TT('Ignore Samples'), 'explain-ignore_samples' : TT('Filter out sample files (e.g. video samples).'), 'igsam-del' : TT('Delete after download'), 'opt-enable_https_verification' : TT('HTTPS certificate verification'), 'explain-enable_https_verification' : TT('Verify certificates when connecting to indexers and RSS-sources using HTTPS.'), 'swtag-server' : TT('Server'), 'swtag-queue' : TT('Queue'), 'swtag-pp' : TT('Post processing'), 'swtag-naming' : TT('Naming'), 'swtag-quota' : TT('Quota'), 'swtag-indexing' : TT('Indexing'), 'opt-quota_size' : TT('Size'), #: Size of the download quota 'explain-quota_size' : TT('How much can be downloaded this month (K/M/G)'), 'opt-quota_day' : TT('Reset day'), #: Reset day of the download quota 'explain-quota_day' : TT('On which day of the month or week (1=Monday) does your ISP reset the quota? (Optionally with hh:mm)'), 'opt-quota_resume' : TT('Auto resume'), #: Auto-resume download on the reset day 'explain-quota_resume' : TT('Should downloading resume after the quota is reset?'), 'opt-quota_period' : TT('Quota period'), #: Does the quota get reset every day, week or month? 'explain-quota_period' : TT('Does the quota get reset each day, week or month?'), 'opt-pre_check' : TT('Check before download'), 'explain-pre_check' : TT('Try to predict successful completion before actual download (slower!)'), 'opt-ssl_ciphers' : TT('SSL Ciphers'), 'explain-ssl_ciphers' : TT('Increase performance by forcing a lower SSL encryption strength.'), 'opt-max_art_tries' : TT('Maximum retries'), 'explain-max_art_tries' : TT('Maximum number of retries per server'), 'opt-fail_hopeless_jobs' : TT('Abort jobs that cannot be completed'), 'explain-fail_hopeless_jobs' : TT('When during download it becomes clear that too much data is missing, abort the job'), 'opt-rating_enable' : TT('Enable Indexer Integration'), 'explain-rating_enable' : TT('Indexers can supply rating information when a job is added and SABnzbd can report to the indexer if a job couldn\'t be completed.'), 'opt-rating_api_key' : TT('API Key'), 'explain-rating_api_key' : TT('This key provides identity to indexer. Check your profile on the indexer\'s website.'), 'opt-rating_filter_enable' : TT('Enable Filtering'), 'explain-rating_filter_enable' : TT('Action downloads according to filtering rules.'), 'opt-rating_filter_abort_if' : TT('Abort If'), 'opt-rating_filter_pause_if' : TT('Else Pause If'), 'opt-rating_filter_video' : TT('Video rating'), 'opt-rating_filter_audio' : TT('Audio rating'), 'opt-rating_filter_passworded' : TT('Passworded'), 'opt-rating_filter_spam' : TT('Spam'), 'opt-rating_filter_confirmed' : TT('Confirmed'), 'opt-rating_filter_downvoted' : TT('More thumbs down than up'), 'opt-rating_filter_keywords' : TT('Title keywords'), 'explain-rating_filter_keywords' : TT('Comma separated list'), 'opt-load_balancing' : TT('Server IP address selection'), 'no-load-balancing' : TT('First IP address'), 'load-balancing' : TT('Randomly selected IP address'), 'load-balancing-happy-eyeballs' : TT('Quickest IP address, preferring IPv6'), 'explain-load_balancing' : TT('Useful if a newsserver has more than one IPv4/IPv6 address'), # Config->Server 'addServer' : TT('Add Server'), #: Caption 'srv-displayname' : TT('Server description'), #: User defined name for server 'srv-host' : TT('Host'), #: Server hostname or IP 'srv-port' : TT('Port'), #: Server port 'srv-username' : TT('Username'), #: Server username 'srv-password' : TT('Password'), #: Server password 'srv-timeout' : TT('Timeout'), #: Server timeout 'srv-connections' : TT('Connections'), #: Server: amount of connections 'srv-retention' : TT('Retention time'), #: Server's retention time in days 'srv-ssl' : TT('SSL'), #: Server SSL tickbox 'explain-ssl' : TT('Secure connection to server'), #: Server SSL tickbox 'opt-ssl_verify' : TT('Certificate verification'), 'explain-ssl_verify' : TT('Minimal: when SSL is enabled, verify the identity of the server using its certificates. Strict: verify and enforce matching hostname.'), 'ssl_verify-disabled' : TT('Disabled'), 'ssl_verify-normal' : TT('Minimal'), 'ssl_verify-strict' : TT('Strict'), 'srv-priority' : TT('Priority'), #: Server priority 'explain-svrprio' : TT('0 is highest priority, 100 is the lowest priority'), #: Explain server priority 'srv-optional' : TT('Optional'), #: Server optional tickbox 'explain-optional' : TT('For unreliable servers, will be ignored longer in case of failures'), #: Explain server optional tickbox 'srv-enable' : TT('Enable'), #: Enable server tickbox 'button-addServer' : TT('Add Server'), #: Button: Add server 'button-delServer' : TT('Remove Server'), #: Button: Remove server 'button-testServer' : TT('Test Server'), #: Button: Test server 'button-clrServer' : TT('Clear Counters'), #: Button: Clear server's byte counters 'srv-testing' : TT('Testing server details...'), 'srv-bandwidth' : TT('Bandwidth'), 'srv-send_group' : TT('Send Group'), 'srv-explain-send_group' : TT('Send group command before requesting articles.'), 'srv-notes' : TT('Personal notes'), # Config->Scheduling 'addSchedule' : TT('Add Schedule'), #:Config->Scheduling 'sch-frequency' : TT('Frequency'), #:Config->Scheduling 'sch-action' : TT('Action'), #:Config->Scheduling 'sch-arguments' : TT('Arguments'), #:Config->Scheduling 'button-addSchedule' : TT('Add Schedule'), #:Config->Scheduling 'currentSchedules' : TT('Current Schedules'), #:Config->Scheduling 'sch-resume' : TT('Resume'), #:Config->Scheduling 'sch-pause' : TT('Pause'), #:Config->Scheduling 'sch-shutdown' : TT('Shutdown'), #:Config->Scheduling 'sch-restart' : TT('Restart'), #:Config->Scheduling # Config->RSS 'explain-RSS' : TT('The checkbox next to the feed name should be ticked for the feed to be enabled and be automatically checked for new items.
When a feed is added, it will only pick up new items and not anything already in the RSS feed unless you press "Force Download".'), 'feed' : TT('Feed'), #: Config->RSS, tab header 'addMultipleFeeds' : TT('Seperate multiple URLs by a comma'), #: Config->RSS, placeholder (cannot be too long) 'button-preFeed' : TT('Read Feed'),#: Config->RSS button 'button-forceFeed' : TT('Force Download'),#: Config->RSS button 'rss-order' : TT('Order'), #: Config->RSS table column header 'rss-type' : TT('Type'), #: Config->RSS table column header 'rss-filter' : TT('Filter'), #: Config->RSS table column header 'rss-accept' : TT('Accept'), #: Config->RSS filter-type selection menu 'rss-reject' : TT('Reject'), #: Config->RSS filter-type selection menu 'rss-must' : TT('Requires'), #: Config->RSS filter-type selection menu 'rss-mustcat' : TT('RequiresCat'), #: Config->RSS filter-type selection menu 'rss-atleast' : TT('At least'), #: Config->RSS filter-type selection menu 'rss-atmost' : TT('At most'), #: Config->RSS filter-type selection menu 'rss-from' : TT('From SxxEyy'), #: Config->RSS filter-type selection menu "From Season/Episode" 'rss-from-show' : TT('From Show SxxEyy'), #: Config->RSS filter-type selection menu "From Show Season/Episode" 'rss-matched' : TT('Matched'), #: Config->RSS section header 'rss-notMatched' : TT('Not Matched'), #: Config->RSS section header 'rss-done' : TT('Downloaded'), #: Config->RSS section header 'rss-added' : TT('Added NZB'), #: Config->RSS after adding to queue 'link-download' : TT('Download'), #: Config->RSS button "download item" 'button-rssNow' : TT('Read All Feeds Now'), #: Config->RSS button # Config->Notifications 'opt-email_endjob' : TT('Email Notification On Job Completion'), 'email-never' : TT('Never'), #: When to send email 'email-always' : TT('Always'), #: When to send email 'email-errorOnly' : TT('Error-only'), #: When to send email 'opt-email_full' : TT('Disk Full Notifications'), 'explain-email_full' : TT('Send email when disk is full and SABnzbd is paused.'), 'opt-email_rss' : TT('Send RSS notifications'), 'explain-email_rss' : TT('Send email when an RSS feed adds jobs to the queue.'), 'opt-email_server' : TT('SMTP Server'), 'explain-email_server' : TT('Set your ISP\'s server for outgoing email.'), 'opt-email_to' : TT('Email Recipient'), 'explain-email_to' : TT('Email address to send the email to.'), 'opt-email_from' : TT('Email Sender'), 'explain-email_from' : TT('Who should we say sent the email?'), 'opt-email_account' : TT('OPTIONAL Account Username'), 'explain-email_account' : TT('For authenticated email, account name.'), 'opt-email_pwd' : TT('OPTIONAL Account Password'), 'explain-email_pwd' : TT('For authenticated email, password.'), 'notifications-notesent': TT('Notification Sent!'), 'opt-ntfosd_enable' : TT('Enable NotifyOSD'), #: Don't translate "NotifyOSD" 'opt-ncenter_enable' : TT('Notification Center'), 'opt-acenter_enable' : TT('Enable Windows Notifications'), 'testNotify' : TT('Test Notification'), 'section-NC' : TT('Notification Center'), #: Header for OSX Notfication Center section 'section-AC' : TT('Windows Notifications'), 'section-OSD' : TT('NotifyOSD'), #: Header for Ubuntu's NotifyOSD notifications section 'section-Prowl' : TT('Prowl'), #: Header for Prowl notification section 'opt-prowl_enable' : TT('Enable Prowl notifications'), #: Prowl settings 'explain-prowl_enable' : TT('Requires a Prowl account'), #: Prowl settings 'opt-prowl_apikey' : TT('API key for Prowl'), #: Prowl settings 'explain-prowl_apikey' : TT('Personal API key for Prowl (required)'), #: Prowl settings 'section-Pushover' : TT('Pushover'), #: Header for Pushover notification section 'opt-pushover_enable' : TT('Enable Pushover notifications'), #: Pushover settings 'explain-pushover_enable' : TT('Requires a Pushover account'), #: Pushoversettings 'opt-pushover_token' : TT('Application Token'), #: Pushover settings 'explain-pushover_token' : TT('Application token (required)'), #: Pushover settings 'opt-pushover_userkey' : TT('User Key'), #: Pushover settings 'explain-pushover_userkey' : TT('User Key (required)'), #: Pushover settings 'opt-pushover_device' : TT('Device(s)'), #: Pushover settings 'explain-pushover_device' : TT('Device(s) to which message should be sent'), #: Pushover settings 'opt-pushover_emergency_retry' : TT('Emergency retry'), #: Pushover settings 'explain-pushover_emergency_retry' : TT('How often (in seconds) the same notification will be sent'), #: Pushover settings 'opt-pushover_emergency_expire' : TT('Emergency expire'), #: Pushover settings 'explain-pushover_emergency_expire' : TT('How many seconds your notification will continue to be retried'), #: Pushover settings 'section-Pushbullet' : TT('Pushbullet'), #: Header for Pushbullet notification section 'opt-pushbullet_enable' : TT('Enable Pushbullet notifications'), #: Pushbullet settings 'explain-pushbullet_enable' : TT('Requires a Pushbullet account'), #: Pushbulletsettings 'opt-pushbullet_apikey' : TT('Personal API key'), #: Pushbullet settings 'explain-pushbullet_apikey' : TT('Your personal Pushbullet API key (required)'), #: Pushbullet settings 'opt-pushbullet_device' : TT('Device'), #: Pushbullet settings 'explain-pushbullet_device' : TT('Device to which message should be sent'), #: Pushbullet settings 'section-NScript' : TT('Notification Script'), #: Header for Notification Script notification section 'opt-nscript_enable' : TT('Enable notification script'), #: Notification Script settings 'opt-nscript_script' : TT('Script'), #: Notification Script settings 'opt-nscript_parameters' : TT('Parameters'), #: Notification Script settings 'explain-nscript_enable' : TT('Executes a custom script'), #: Notification Scriptsettings 'explain-nscript_script' : TT('Which script should we execute for notification?'), #: Notification Scriptsettings 'explain-nscript_parameters' : TT('Read the Wiki Help on this!'), #: Notification Script settings # Config->Cat 'explain-catTags' : TT('Indexers can supply a category inside the NZB which SABnzbd will try to match to the categories defined below. Additionally, you can add terms to "Indexer Categories / Groups" to match more categories. Use commas to separate terms. Wildcards in the terms are supported.
More information can be found on the Wiki.'), 'explain-catTags2' : TT('Ending the path with an asterisk * will prevent creation of job folders.'), 'explain-relFolder' : TT('Relative folders are based on'), 'catFolderPath' : TT('Folder/Path'), 'catTags' : TT('Indexer Categories / Groups'), 'button-delCat' : TT('X'), #: Small delete button # Config->Sorting 'seriesSorting' : TT('Series Sorting'), 'opt-tvsort' : TT('Enable TV Sorting'), 'sort-legenda' : TT('Pattern Key'), 'button-clear' : TT('Clear'), 'button-evalFeed' : TT('Apply filters'), 'presetSort' : TT('Presets'), 'example' : TT('Example'), 'movieSort' : TT('Movie Sorting'), 'opt-movieSort' : TT('Enable Movie Sorting'), 'opt-movieExtra' : TT('Keep loose downloads in extra folders'), 'affectedCat' : TT('Affected Categories'), 'sort-meaning' : TT('Meaning'), 'sort-pattern' : TT('Pattern'), 'sort-result' : TT('Result'), 'button-Season1x05' : TT('1x05 Season Folder'), 'button-SeasonS01E05' : TT('S01E05 Season Folder'), 'button-Ep1x05' : TT('1x05 Episode Folder'), 'button-EpS01E05' : TT('S01E05 Episode Folder'), 'button-FileLikeFolder' : TT('Job Name as Filename'), 'sort-title' : TT('Title'), 'movie-sp-name' : TT('Movie Name'), 'movie-dot-name' : TT('Movie.Name'), 'movie-us-name' : TT('Movie_Name'), 'show-name' : TT('Show Name'), 'show-sp-name' : TT('Show Name'), 'show-dot-name' : TT('Show.Name'), 'show-us-name' : TT('Show_Name'), 'show-seasonNum' : TT('Season Number'), 'show-epNum' : TT('Episode Number'), 'ep-name' : TT('Episode Name'), 'ep-sp-name' : TT('Episode Name'), 'ep-dot-name' : TT('Episode.Name'), 'ep-us-name' : TT('Episode_Name'), 'fileExt' : TT('File Extension'), 'extension' : TT('Extension'), 'partNumber' : TT('Part Number'), 'decade' : TT('Decade'), 'orgFilename' : TT('Original Filename'), 'orgJobname' : TT('Original Job Name'), 'lowercase' : TT('Lower Case'), 'TEXT' : TT('TEXT'), 'text' : TT('text'), 'sort-File' : TT('file'), 'sortString' : TT('Sort String'), 'multiPartLabel' : TT('Multi-part label'), 'button-inFolders' : TT('In folders'), 'button-noFolders' : TT('No folders'), 'dateSorting' : TT('Date Sorting'), 'opt-dateSort' : TT('Enable Date Sorting'), 'button-ShowNameF' : TT('Show Name folder'), 'button-YMF' : TT('Year-Month Folders'), 'button-DailyF' : TT('Daily Folders'), 'case-adjusted' : TT('case-adjusted'), #: Note for title expression in Sorting that does case adjustment 'sortResult' : TT('Processed Result'), # Config->Special 'explain-special' : TT('Rarely used options. For their meaning and explanation, click on the Help button to go to the Wiki page.
' 'Don\'t change these without checking the Wiki first, as some have serious side-effects.
' 'The default values are between parentheses.'), 'sptag-boolean' : TT('Switches'), 'sptag-entries' : TT('Values'), # NZO 'nzoDetails' : TT('Edit NZB Details'), #: Job details page 'nzoName' : TT('Name'), #: Job details page 'nzo-delete' : TT('Delete'), #: Job details page, delete button 'nzo-top' : TT('Top'), #: Job details page, move file to top 'nzo-up' : TT('Up'), #: Job details page, move file one place up 'nzo-down' : TT('Down'), #: Job details page, move file one place down 'nzo-bottom' : TT('Bottom'), #: Job details page, move file to bottom 'nzo-all' : TT('All'), #: Job details page, select all files 'nzo-none' : TT('None'), #: Job details page, select no files 'nzo-invert' : TT('Invert'), #: Job details page, invert file selection 'nzo-filename' : TT('Filename'), #: Job details page, filename column header 'nzo-subject' : TT('Subject'), #: Job details page, subject column header 'nzo-age' : TT('Age'), #: Job details page, file age column header 'nzo-selection' : TT('Selection'), #: Job details page, section header 'nzo-action' : TT('Action'), #: Job details page, section header #Glitter skin 'Glitter-addNZB' : TT('Add NZB'), 'Glitter-pause5m' : TT('Pause for 5 minutes'), 'Glitter-pause15m' : TT('Pause for 15 minutes'), 'Glitter-pause30m' : TT('Pause for 30 minutes'), 'Glitter-pause1h' : TT('Pause for 1 hour'), 'Glitter-pause3h' : TT('Pause for 3 hours'), 'Glitter-pause6h' : TT('Pause for 6 hours'), 'Glitter-setMaxLinespeed' : TT('You must set a maximum bandwidth before you can set a bandwidth limit'), 'Glitter-left' : TT('left'), 'Glitter-free' : TT('Free Space'), 'Glitter-freeTemp' : TT('Temp Folder'), 'Glitter-search' : TT('Search'), 'Glitter-multiOperations' : TT('Multi-Operations'), 'Glitter-multiSelect' : TT('Hold shift key to select a range'), 'Glitter-checkAll' : TT('Check all'), 'Glitter-restartSab' : TT('Restart SABnzbd'), 'Glitter-onFinish' : TT('On queue finish'), 'Glitter-statusInterfaceOptions' : TT('Status and interface options'), 'Glitter-dragAndDrop' : TT('Or drag and drop files in the window!'), 'Glitter-today' : TT('Today'), 'Glitter-thisMonth' : TT('This month'), 'Glitter-total' : TT('Total'), 'Glitter-lostConnection' : TT('Lost connection to SABnzbd..'), 'Glitter-afterRestart' : TT('In case of SABnzbd restart this screen will disappear automatically!'), 'Glitter-disabled' : TT('Disabled'), 'Glitter-warning' : TT('WARNING:'), 'Glitter-encrypted' : TT('ENCRYPTED'), 'Glitter-incomplete' : TT('INCOMPLETE'), 'Glitter-duplicate' : TT('DUPLICATE'), 'Glitter-unwanted' : TT('UNWANTED'), 'Glitter-tooLarge' : TT('TOO LARGE'), 'Glitter-filtered' : TT('FILTERED'), 'Glitter-waitSec' : TT('WAIT %s sec'), 'Glitter-error' : TT('ERROR:'), 'Glitter-fetch' : TT('Fetch'), 'Glitter-interfaceOptions' : TT('Web Interface'), 'Glitter-interfaceRefresh' : TT('Refresh rate'), 'Glitter-useGlobalOptions' : TT('Use global interface settings'), 'Glitter-queueItemLimit' : TT('Queue item limit'), 'Glitter-historyItemLimit' : TT('History item limit'), 'Glitter-dateFormat' : TT('Date format'), 'Glitter-showExtraQueueColumn' : TT('Extra queue column'), 'Glitter-showExtraHistoryColumn' : TT('Extra history column'), 'Glitter-page' : TT('page'), 'Glitter-loading' : TT('Loading'), 'Glitter-articles' : TT('articles'), 'Glitter-rename' : TT('Rename'), 'Glitter-repairQueue' : TT('Queue repair'), 'Glitter-showActiveConnections' : TT('Show active connections'), 'Glitter-unblockServer' : TT('Unblock'), 'Glitter-orphanedJobs' : TT('Orphaned jobs'), 'Glitter-backToQueue' : TT('Send back to queue'), 'Glitter-purgeOrphaned' : TT('Delete All'), 'Glitter-retryAllOrphaned' : TT('Retry all'), 'Glitter-deleteJobAndFolders' : TT('Remove NZB & Delete Files'), 'Glitter-addFromURL' : TT('Fetch NZB from URL'), 'Glitter-addFromFile' : TT('Upload NZB'), 'Glitter-chooseFile' : TT('Browse'), 'Glitter-addnzbFilename' : TT('Optionally specify a filename'), 'Glitter-submit' : TT('Submit'), 'Glitter-openInfoURL' : TT('Open Informational URL'), 'Glitter-sendThanks' : TT('Submitted. Thank you!'), 'Glitter-noSelect' : TT('Nothing selected!'), 'Glitter-removeSelected' : TT('Remove all selected files'), 'Glitter-toggleCompletedFiles' : TT('Hide/show completed files'), 'Glitter-top' : TT('Top'), 'Glitter-bottom' : TT('Bottom'), 'Glitter-retryJob' : TT('Retry'), 'Glitter-more' : TT('More'), 'Glitter-scriptLog' : TT('View Script Log'), 'Glitter-clearHistory' : TT('Purge History'), 'Glitter-confirmClearWarnings' : TT('Are you sure?'), 'Glitter-confirmClearDownloads' : TT('Are you sure?'), 'Glitter-confirmClear1Download' : TT('Are you sure?'), 'Glitter-updateAvailable' : TT('Update Available!'), 'Glitter-noLocalStorage' : TT('LocalStorage (cookies) are disabled in your browser, interface settings will be lost after you close the browser!'), #: Don't translate LocalStorage 'Glitter-glitterTips' : TT('Glitter has some (new) features you might like!'), 'Glitter-custom' : TT('Custom'), 'Glitter-displayCompact' : TT('Compact layout'), 'Glitter-displayTabbed' : TT('Tabbed layout
(separate queue and history)'), 'Glitter-speed' : TT('Speed'), 'Glitter-confirmDeleteQueue' : TT('Confirm Queue Deletions'), 'Glitter-confirmDeleteHistory' : TT('Confirm History Deletions'), 'Glitter-pausePrompt': TT('How long or untill when do you want to pause? (in English!)'), 'Glitter-pausePromptFail': TT('Sorry, we could not interpret that. Try again.'), 'Glitter-pauseFor' : TT('Pause for...'), 'Glitter-refresh' : TT('Refresh'), 'Glitter-logText' : TT('All usernames, passwords and API-keys are automatically removed from the log and the included copy of your settings.'), 'Glitter-sortAgeAsc' : TT('Sort by Age Oldest→Newest'), 'Glitter-sortAgeDesc' : TT('Sort by Age Newest→Oldest'), 'Glitter-sortNameAsc' : TT('Sort by Name A→Z'), 'Glitter-sortNameDesc' : TT('Sort by Name Z→A'), 'Glitter-sortSizeAsc' : TT('Sort by Size Smallest→Largest'), 'Glitter-sortSizeDesc' : TT('Sort by Size Largest→Smallest'), 'Glitter-notification-uploading' : TT('Uploading'), # Notification window 'Glitter-notification-disconnect' : TT('Forcing disconnect'), # Notification window 'Glitter-notification-removing1' : TT('Removing job'), # Notification window 'Glitter-notification-removing' : TT('Removing jobs'), # Notification window 'Glitter-notification-shutdown' : TT('Shutting down'), # Notification window #Plush skin 'Plush-confirmWithoutSavingPrompt' : TT('Changes have not been saved, and will be lost.'), 'Plush-confirm' : TT('Are you sure?'), 'Plush-openInfoURL' : TT('Open Informational URL'), 'Plush-viewScriptLog' : TT('View Script Log'), 'Plush-prev' : TT('Prev'), 'Plush-next' : TT('Next'), 'Plush-confirmPurgeH' : TT('Purge the History?'), 'Plush-enableJavascript' : TT('You must enable JavaScript for Plush to function!'), 'Plush-addnzb' : TT('Add NZB'), 'Plush-button-refresh' : TT('Refresh'), 'Plush-options' : TT('Options'), 'Plush-updateAvailable' : TT('Update Available!'), 'Plush-pause5m' : TT('Pause for 5 minutes'), 'Plush-pause15m' : TT('Pause for 15 minutes'), 'Plush-pause30m' : TT('Pause for 30 minutes'), 'Plush-pause1h' : TT('Pause for 1 hour'), 'Plush-pause3h' : TT('Pause for 3 hours'), 'Plush-pause6h' : TT('Pause for 6 hours'), 'Plush-pauseForPrompt' : TT('Pause for how many minutes?'), 'Plush-pauseFor' : TT('Pause for...'), 'Plush-multiOperations' : TT('Multi-Operations'), 'Plush-topMenu' : TT('Top Menu'), 'Plush-onQueueFinish' : TT('On Finish'), 'Plush-sort' : TT('Sort'), 'Plush-sortAgeAsc' : TT('Sort by Age (Oldest→Newest)'), 'Plush-sortAgeDesc' : TT('Sort by Age (Newest→Oldest)'), 'Plush-sortNameAsc' : TT('Sort by Name (A→Z)'), 'Plush-sortNameDesc' : TT('Sort by Name (Z→A)'), 'Plush-sortSizeAsc' : TT('Sort by Size (Smallest→Largest)'), 'Plush-sortSizeDesc' : TT('Sort by Size (Largest→Smallest)'), 'Plush-confirmPurgeQ' : TT('Purge the Queue?'), 'Plush-confirmRetryQ' : TT('Retry all failed jobs in History?'), 'Plush-purge' : TT('Purge'), 'Plush-left' : TT('left'), 'Plush-maxSpeed' : TT('Max Speed'), #: Used in speed menu. Split in two lines if too long. 'Plush-nzo-range' : TT('Range'), 'Plush-reset' : TT('Reset'), 'Plush-applySelected' : TT('Apply to Selected'), 'Plush-page' : TT('page'), 'Plush-everything' : TT('Everything'), 'Plush-disabled' : TT('Disabled'), 'Plush-refreshRate' : TT('Refresh Rate'), 'Plush-containerWidth' : TT('Container Width'), 'Plush-confirmDeleteQueue' : TT('Confirm Queue Deletions'), 'Plush-confirmDeleteHistory' : TT('Confirm History Deletions'), 'Plush-explain-blockRefresh' : TT('This will prevent refreshing content when your mouse cursor is hovering over the queue.'), 'Plush-blockRefresh' : TT('Block Refreshes on Hover'), 'Plush-fetch' : TT('Fetch'), #: Fetch from URL button in "Add NZB" dialog box 'Plush-upload' : TT('Upload'), #: Upload button in "Add NZB" dialog box 'Plush-uploadTip' : TT('Upload: .nzb .rar .zip .gz, .bz2'), 'Plush-addnzb-filename' : TT('Optionally specify a filename'), 'Plush-progress' : TT('Progress'), 'Plush-remaining' : TT('Remaining'), 'Plush-notEnoughSpace' : TT('Not enough disk space to complete downloads!'), 'Plush-freeSpace' : TT('Free Space'), 'Plush-freeSpaceTemp' : TT('Free (Temp)'), 'Plush-idle' : TT('IDLE'), 'Plush-downloads' : TT('Downloads'), 'Plush-tab-repair' : TT('Queue repair'), #Wizard 'wizard-quickstart' : TT('SABnzbd Quick-Start Wizard'), 'wizard-version' : TT('SABnzbd Version'), 'wizard-previous' : TT('Previous'), #: Button to go to previous Wizard page 'wizard-next' : TT('Next'), #: Button to go to next Wizard page 'wizard-server' : TT('Server Details'), 'wizard-explain-server' : TT('Please enter in the details of your primary usenet provider.'), 'wizard-server-con-explain' : TT('The number of connections allowed by your provider'), 'wizard-server-con-eg' : TT('E.g. 8 or 20'), #: Wizard: examples of amount of connections 'wizard-server-ssl-explain' : TT('Select only if your provider allows SSL connections.'), 'wizard-server-text' : TT('Click to test the entered details.'), 'wizard-example' : TT('E.g.'), #: Abbreviation for "for example" 'wizard-button-testServer' : TT('Test Server'), #: Wizard step 'wizard-complete' : TT('Setup is now complete!'), #: Wizard step 'wizard-tip1' : TT('SABnzbd will now be running in the background.'), #: Wizard tip 'wizard-tip2' : TT('Closing any browser windows/tabs will NOT close SABnzbd.'), #: Wizard tip 'wizard-tip4' : TT('It is recommended you right click and bookmark this location and use this bookmark to access SABnzbd when it is running in the background.'), #: Wizard tip 'wizard-tip-wiki' : TT('Further help can be found on our'), #: Will be appended with a wiki-link, adjust word order accordingly 'wizard-goto' : TT('Go to SABnzbd'), #: Wizard step 'wizard-exit' : TT('Exit SABnzbd'), #: Wizard EXIT button on first page 'wizard-start' : TT('Start Wizard'), #: Wizard START button on first page #Special 'yourRights' : TT(''' SABnzbd comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your option) any later version. '''), 'wizard-ad-1': TT('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.'), 'wizard-ad-2': TT('Don\'t have a usenet provider? We recommend trying %s.'), } sabnzbd-develop/sabnzbd/sabtraylinux.py0000600000175000017500000001336413642116632016466 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.sabtraylinux - System tray icon for Linux, inspired from the Windows one """ from gi.repository import Gtk from gi.repository import GObject from time import sleep import subprocess from threading import Thread import logging import sabnzbd from sabnzbd.panic import launch_a_browser import sabnzbd.api as api import sabnzbd.scheduler as scheduler from sabnzbd.downloader import Downloader import sabnzbd.cfg as cfg from sabnzbd.misc import to_units from sabnzbd.utils.upload import add_local class StatusIcon(Thread): sabicons = { 'default': 'icons/sabnzbd16_32.ico', 'green': 'icons/sabnzbd16_32green.ico', 'pause': 'icons/sabnzbd16_32paused.ico' } updatefreq = 1000 # ms def __init__(self): self.mythread = Thread(target=self.dowork) self.mythread.start() def dowork(self): # Wait for translated texts to be loaded while not sabnzbd.WEBUI_READY: sleep(0.2) logging.debug('language file not loaded, waiting') self.sabpaused = False self.statusicon = Gtk.StatusIcon() self.icon = self.sabicons['default'] self.refresh_icon() self.tooltip = "SABnzbd" self.refresh_tooltip() self.statusicon.connect("popup-menu", self.right_click_event) GObject.timeout_add(self.updatefreq, self.run) Gtk.main() def refresh_icon(self): self.statusicon.set_from_file(self.icon) def refresh_tooltip(self): self.statusicon.set_tooltip_text(self.tooltip) # run this every updatefreq ms def run(self): self.sabpaused, bytes_left, bpsnow, time_left = api.fast_queue() mb_left = to_units(bytes_left) speed = to_units(bpsnow) if self.sabpaused: self.tooltip = T('Paused') self.icon = self.sabicons['pause'] elif bytes_left > 0: self.tooltip = "%sB/s %s: %sB (%s)" % (speed, T('Remaining'), mb_left, time_left) self.icon = self.sabicons['green'] else: self.tooltip = T('Idle') self.icon = self.sabicons['default'] self.refresh_icon() self.refresh_tooltip() return 1 def right_click_event(self, icon, button, time): """ menu """ menu = Gtk.Menu() maddnzb = Gtk.MenuItem(T("Add NZB")) mshowinterface = Gtk.MenuItem(T("Show interface")) mopencomplete = Gtk.MenuItem(T("Open complete folder")) mrss = Gtk.MenuItem(T("Read all RSS feeds")) if self.sabpaused: mpauseresume = Gtk.MenuItem(T("Resume")) else: mpauseresume = Gtk.MenuItem(T("Pause")) mrestart = Gtk.MenuItem(T("Restart")) mshutdown = Gtk.MenuItem(T("Shutdown")) maddnzb.connect("activate", self.addnzb) mshowinterface.connect("activate", self.browse) mopencomplete.connect("activate", self.opencomplete) mrss.connect("activate", self.rss) mpauseresume.connect("activate", self.pauseresume) mrestart.connect("activate", self.restart) mshutdown.connect("activate", self.shutdown) menu.append(maddnzb) menu.append(mshowinterface) menu.append(mopencomplete) menu.append(mrss) menu.append(mpauseresume) menu.append(mrestart) menu.append(mshutdown) menu.show_all() menu.popup(None, None, self.statusicon.position_menu, self.statusicon, button, time) def addnzb(self, icon): """ menu handlers """ dialog = Gtk.FileChooserDialog(title=None, action=Gtk.FileChooserAction.OPEN, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) dialog.set_select_multiple(True) filter = Gtk.FileFilter() filter.set_name("*.nzb,*.gz,*.bz2,*.zip,*.rar,*.7z") filter.add_pattern("*.nzb") filter.add_pattern("*.gz") filter.add_pattern("*.bz2") filter.add_pattern("*.zip") filter.add_pattern("*.rar") filter.add_pattern("*.7z") dialog.add_filter(filter) response = dialog.run() if response == Gtk.ResponseType.OK: for filename in dialog.get_filenames(): add_local(filename) dialog.destroy() def opencomplete(self, icon): subprocess.Popen(["xdg-open", cfg.complete_dir.get_path()]) def browse(self, icon): launch_a_browser(sabnzbd.BROWSER_URL, True) def pauseresume(self, icon): if self.sabpaused: self.resume() else: self.pause() def restart(self, icon): self.hover_text = T('Restart') sabnzbd.trigger_restart() def shutdown(self, icon): self.hover_text = T('Shutdown') sabnzbd.shutdown_program() def pause(self): scheduler.plan_resume(0) Downloader.do.pause() def resume(self): scheduler.plan_resume(0) sabnzbd.unpause_all() def rss(self, icon): scheduler.force_rss() sabnzbd-develop/sabnzbd/newsunpack.py0000600000175000017500000026511513642116632016122 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.newsunpack """ import os import sys import re import subprocess import logging import time import binascii import shutil import functools from subprocess import Popen import sabnzbd from sabnzbd.encoding import platform_btou import sabnzbd.utils.rarfile as rarfile from sabnzbd.misc import format_time_string, find_on_path, int_conv, \ get_all_passwords, calc_age, cmp, caller_name from sabnzbd.filesystem import make_script_path, real_path, globber, globber_full, \ renamer, clip_path, long_path, remove_file, recursive_listdir, setname_from_path from sabnzbd.sorting import SeriesSorter import sabnzbd.cfg as cfg from sabnzbd.constants import Status if sabnzbd.WIN32: try: import win32api import win32con import win32process # Define scheduling priorities WIN_SCHED_PRIOS = {1: win32process.IDLE_PRIORITY_CLASS, 2: win32process.BELOW_NORMAL_PRIORITY_CLASS, 3: win32process.NORMAL_PRIORITY_CLASS, 4: win32process.ABOVE_NORMAL_PRIORITY_CLASS,} except ImportError: pass else: # Define dummy WindowsError for non-Windows class WindowsError(Exception): def __init__(self, value): self.parameter = value def __str__(self): return repr(self.parameter) # Regex globals RAR_RE = re.compile(r'\.(?Ppart\d*\.rar|rar|r\d\d|s\d\d|t\d\d|u\d\d|v\d\d|\d\d\d?\d)$', re.I) RAR_RE_V3 = re.compile(r'\.(?Ppart\d*)$', re.I) LOADING_RE = re.compile(r'^Loading "(.+)"') TARGET_RE = re.compile(r'^(?:File|Target): "(.+)" -') EXTRACTFROM_RE = re.compile(r'^Extracting\sfrom\s(.+)') EXTRACTED_RE = re.compile(r'^(Extracting|Creating|...)\s+(.*?)\s+OK\s*$') SPLITFILE_RE = re.compile(r'\.(\d\d\d?\d$)', re.I) ZIP_RE = re.compile(r'\.(zip$)', re.I) SEVENZIP_RE = re.compile(r'\.7z$', re.I) SEVENMULTI_RE = re.compile(r'\.7z\.\d+$', re.I) TS_RE = re.compile(r'\.(\d+)\.(ts$)', re.I) PAR2_COMMAND = None MULTIPAR_COMMAND = None RAR_COMMAND = None NICE_COMMAND = None ZIP_COMMAND = None SEVEN_COMMAND = None IONICE_COMMAND = None RAR_PROBLEM = False PAR2_MT = True RAR_VERSION = 0 def find_programs(curdir): """ Find external programs """ def check(path, program): p = os.path.abspath(os.path.join(path, program)) if os.access(p, os.X_OK): return p else: return None if sabnzbd.DARWIN: sabnzbd.newsunpack.PAR2_COMMAND = check(curdir, 'osx/par2/par2-sl64') sabnzbd.newsunpack.RAR_COMMAND = check(curdir, 'osx/unrar/unrar') sabnzbd.newsunpack.SEVEN_COMMAND = check(curdir, 'osx/7zip/7za') if sabnzbd.WIN32: if sabnzbd.WIN64: # 64 bit versions sabnzbd.newsunpack.MULTIPAR_COMMAND = check(curdir, 'win/par2/multipar/par2j64.exe') sabnzbd.newsunpack.RAR_COMMAND = check(curdir, 'win/unrar/x64/UnRAR.exe') else: # 32 bit versions sabnzbd.newsunpack.MULTIPAR_COMMAND = check(curdir, 'win/par2/multipar/par2j.exe') sabnzbd.newsunpack.RAR_COMMAND = check(curdir, 'win/unrar/UnRAR.exe') sabnzbd.newsunpack.PAR2_COMMAND = check(curdir, 'win/par2/par2.exe') sabnzbd.newsunpack.SEVEN_COMMAND = check(curdir, 'win/7zip/7za.exe') else: if not sabnzbd.newsunpack.PAR2_COMMAND: sabnzbd.newsunpack.PAR2_COMMAND = find_on_path('par2') if not sabnzbd.newsunpack.RAR_COMMAND: sabnzbd.newsunpack.RAR_COMMAND = find_on_path(('unrar', 'rar', 'unrar3', 'rar3',)) sabnzbd.newsunpack.NICE_COMMAND = find_on_path('nice') sabnzbd.newsunpack.IONICE_COMMAND = find_on_path('ionice') if not sabnzbd.newsunpack.ZIP_COMMAND: sabnzbd.newsunpack.ZIP_COMMAND = find_on_path('unzip') if not sabnzbd.newsunpack.SEVEN_COMMAND: sabnzbd.newsunpack.SEVEN_COMMAND = find_on_path('7za') if not sabnzbd.newsunpack.SEVEN_COMMAND: sabnzbd.newsunpack.SEVEN_COMMAND = find_on_path('7z') if not (sabnzbd.WIN32 or sabnzbd.DARWIN): # Run check on rar version version, original = unrar_check(sabnzbd.newsunpack.RAR_COMMAND) sabnzbd.newsunpack.RAR_PROBLEM = not original or version < sabnzbd.constants.REC_RAR_VERSION sabnzbd.newsunpack.RAR_VERSION = version # Run check on par2-multicore sabnzbd.newsunpack.PAR2_MT = par2_mt_check(sabnzbd.newsunpack.PAR2_COMMAND) ENV_NZO_FIELDS = ['bytes', 'bytes_downloaded', 'bytes_tried', 'cat', 'duplicate', 'encrypted', 'fail_msg', 'filename', 'final_name', 'group', 'nzo_id', 'oversized', 'password', 'pp', 'priority', 'repair', 'script', 'status', 'unpack', 'unwanted_ext', 'url'] def external_processing(extern_proc, nzo, complete_dir, nicename, status): """ Run a user postproc script, return console output and exit value """ failure_url = nzo.nzo_info.get('failure', '') # Items can be bool or null, causing POpen to fail command = [str(extern_proc), str(complete_dir), str(nzo.filename), str(nicename), '', str(nzo.cat), str(nzo.group), str(status), str(failure_url)] # Add path to original NZB nzb_paths = globber_full(nzo.workpath, '*.gz') # Fields not in the NZO directly extra_env_fields = {'failure_url': failure_url, 'complete_dir': complete_dir, 'pp_status': status, 'download_time': nzo.nzo_info.get('download_time', ''), 'avg_bps': int(nzo.avg_bps_total / nzo.avg_bps_freq) if nzo.avg_bps_freq else 0, 'age': calc_age(nzo.avg_date), 'orig_nzb_gz': clip_path(nzb_paths[0]) if nzb_paths else ''} try: stup, need_shell, command, creationflags = build_command(command) env = create_env(nzo, extra_env_fields) logging.info('Running external script %s(%s, %s, %s, %s, %s, %s, %s, %s)', extern_proc, complete_dir, nzo.filename, nicename, '', nzo.cat, nzo.group, status, failure_url) p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, env=env, creationflags=creationflags) # Follow the output, so we can abort it proc = p.stdout if p.stdin: p.stdin.close() lines = [] while 1: line = platform_btou(proc.readline()) if not line: break line = line.strip() lines.append(line) # Show current line in history nzo.set_action_line(T('Running script'), line) # Check if we should still continue if not nzo.pp_active: p.kill() lines.append(T('PostProcessing was aborted (%s)') % T('Script')) # Print at least what we got output = '\n'.join(lines) return output, 1 except: logging.debug("Failed script %s, Traceback: ", extern_proc, exc_info=True) return "Cannot run script %s\r\n" % extern_proc, -1 output = '\n'.join(lines) ret = p.wait() return output, ret def external_script(script, p1, p2, p3=None, p4=None): """ Run a user script with two parameters, return console output and exit value """ command = [script, p1, p2, p3, p4] try: stup, need_shell, command, creationflags = build_command(command) env = create_env() logging.info('Running user script %s(%s, %s)', script, p1, p2) p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, env=env, creationflags=creationflags) except: logging.debug("Failed script %s, Traceback: ", script, exc_info=True) return "Cannot run script %s\r\n" % script, -1 output = platform_btou(p.stdout.read()) ret = p.wait() return output, ret def unpack_magic(nzo, workdir, workdir_complete, dele, one_folder, joinables, zips, rars, sevens, ts, depth=0): """ Do a recursive unpack from all archives in 'workdir' to 'workdir_complete' """ if depth > 5: logging.warning(T('Unpack nesting too deep [%s]'), nzo.final_name) return False, [] depth += 1 if depth == 1: # First time, ignore anything in workdir_complete xjoinables, xzips, xrars, xsevens, xts = build_filelists(workdir) else: xjoinables, xzips, xrars, xsevens, xts = build_filelists(workdir, workdir_complete, check_both=dele) force_rerun = False newfiles = [] error = None new_joins = new_ts = None if cfg.enable_filejoin(): new_joins = [jn for jn in xjoinables if jn not in joinables] if new_joins: logging.info('Filejoin starting on %s', workdir) error, newf = file_join(nzo, workdir, workdir_complete, dele, new_joins) if newf: newfiles.extend(newf) logging.info('Filejoin finished on %s', workdir) if cfg.enable_unrar(): new_rars = [rar for rar in xrars if rar not in rars] if new_rars: logging.info('Unrar starting on %s', workdir) error, newf = rar_unpack(nzo, workdir, workdir_complete, dele, one_folder, new_rars) if newf: newfiles.extend(newf) logging.info('Unrar finished on %s', workdir) if cfg.enable_7zip(): new_sevens = [seven for seven in xsevens if seven not in sevens] if new_sevens: logging.info('7za starting on %s', workdir) error, newf = unseven(nzo, workdir, workdir_complete, dele, one_folder, new_sevens) if newf: newfiles.extend(newf) logging.info('7za finished on %s', workdir) if cfg.enable_unzip(): new_zips = [zip for zip in xzips if zip not in zips] if new_zips: logging.info('Unzip starting on %s', workdir) if SEVEN_COMMAND: error, newf = unseven(nzo, workdir, workdir_complete, dele, one_folder, new_zips) else: error, newf = unzip(nzo, workdir, workdir_complete, dele, one_folder, new_zips) if newf: newfiles.extend(newf) logging.info('Unzip finished on %s', workdir) if cfg.enable_tsjoin(): new_ts = [_ts for _ts in xts if _ts not in ts] if new_ts: logging.info('TS Joining starting on %s', workdir) error, newf = file_join(nzo, workdir, workdir_complete, dele, new_ts) if newf: newfiles.extend(newf) logging.info('TS Joining finished on %s', workdir) # Refresh history and set output nzo.set_action_line() # Only re-run if something was unpacked and it was success rerun = error in (False, 0) # During a Retry we might miss files that failed during recursive unpack if nzo.reuse and depth == 1 and any(build_filelists(workdir, workdir_complete)): rerun = True # We can't recursive unpack on long paths on Windows # See: https://github.com/sabnzbd/sabnzbd/pull/771 if sabnzbd.WIN32 and len(workdir_complete) > 256: rerun = False # Double-check that we didn't miss any files in workdir # But only if dele=True, otherwise of course there will be files left if rerun and dele and depth == 1 and any(build_filelists(workdir)): force_rerun = True # Clear lists to force re-scan of files xjoinables, xzips, xrars, xsevens, xts = ([], [], [], [], []) if rerun and (cfg.enable_recursive() or new_ts or new_joins or force_rerun): z, y = unpack_magic(nzo, workdir, workdir_complete, dele, one_folder, xjoinables, xzips, xrars, xsevens, xts, depth) if z: error = z if y: newfiles.extend(y) return error, newfiles ############################################################################## # Filejoin Functions ############################################################################## def match_ts(file): """ Return True if file is a joinable TS file """ match = TS_RE.search(file) if not match: return False, '', 0 num = int(match.group(1)) try: set = file[:match.start()] set += '.ts' except: set = '' return match, set, num def clean_up_joinables(names): """ Remove joinable files and their .1 backups """ for name in names: if os.path.exists(name): try: remove_file(name) except: pass name1 = name + ".1" if os.path.exists(name1): try: remove_file(name1) except: pass def get_seq_number(name): """ Return sequence number if name as an int """ head, tail = os.path.splitext(name) if tail == '.ts': match, set, num = match_ts(name) else: num = tail[1:] if num.isdigit(): return int(num) else: return 0 def file_join(nzo, workdir, workdir_complete, delete, joinables): """ Join and joinable files in 'workdir' to 'workdir_complete' and when successful, delete originals """ newfiles = [] bufsize = 24 * 1024 * 1024 # Create matching sets from the list of files joinable_sets = {} joinable_set = None for joinable in joinables: head, tail = os.path.splitext(joinable) if tail == '.ts': head = match_ts(joinable)[1] if head not in joinable_sets: joinable_sets[head] = [] joinable_sets[head].append(joinable) logging.debug("joinable_sets: %s", joinable_sets) try: # Handle each set for joinable_set in joinable_sets: current = joinable_sets[joinable_set] joinable_sets[joinable_set].sort() # If par2 already did the work, just remove the files if os.path.exists(joinable_set): logging.debug("file_join(): Skipping %s, (probably) joined by par2", joinable_set) if delete: clean_up_joinables(current) # done, go to next set continue # Only join when there is more than one file size = len(current) if size < 2: continue # Prepare joined file filename = joinable_set if workdir_complete: filename = filename.replace(workdir, workdir_complete) logging.debug("file_join(): Assembling %s", filename) joined_file = open(filename, 'ab') # Join the segments n = get_seq_number(current[0]) seq_error = n > 1 for joinable in current: if get_seq_number(joinable) != n: seq_error = True perc = (100.0 / size) * n logging.debug("Processing %s", joinable) nzo.set_action_line(T('Joining'), '%.0f%%' % perc) f = open(joinable, 'rb') shutil.copyfileobj(f, joined_file, bufsize) f.close() if delete: remove_file(joinable) n += 1 # Remove any remaining .1 files clean_up_joinables(current) # Finish up joined_file.flush() joined_file.close() newfiles.append(filename) setname = setname_from_path(joinable_set) if seq_error: msg = T('Incomplete sequence of joinable files') nzo.fail_msg = T('File join of %s failed') % setname nzo.set_unpack_info('Filejoin', T('[%s] Error "%s" while joining files') % (setname, msg)) logging.error(T('Error "%s" while running file_join on %s'), msg, nzo.final_name) return True, [] else: msg = T('[%s] Joined %s files') % (joinable_set, size) nzo.set_unpack_info('Filejoin', msg, setname) except: msg = sys.exc_info()[1] nzo.fail_msg = T('File join of %s failed') % msg nzo.set_unpack_info('Filejoin', T('[%s] Error "%s" while joining files') % (setname_from_path(joinable_set), msg)) logging.error(T('Error "%s" while running file_join on %s'), msg, nzo.final_name) return True, [] return False, newfiles ############################################################################## # (Un)Rar Functions ############################################################################## def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars): """ Unpack multiple sets 'rars' of RAR files from 'workdir' to 'workdir_complete. When 'delete' is set, originals will be deleted. When 'one_folder' is set, all files will be in a single folder """ newfiles = extracted_files = [] rar_sets = {} for rar in rars: rar_set = setname_from_path(rar) if RAR_RE_V3.search(rar_set): # Remove the ".partXX" part rar_set = os.path.splitext(rar_set)[0] if rar_set not in rar_sets: rar_sets[rar_set] = [] rar_sets[rar_set].append(rar) logging.debug('Rar_sets: %s', rar_sets) for rar_set in rar_sets: # Run the RAR extractor rar_sets[rar_set].sort(key=functools.cmp_to_key(rar_sort)) rarpath = rar_sets[rar_set][0] if workdir_complete and rarpath.startswith(workdir): extraction_path = workdir_complete else: extraction_path = os.path.split(rarpath)[0] # Is the direct-unpacker still running? We wait for it if nzo.direct_unpacker: wait_count = 0 last_stats = nzo.direct_unpacker.get_formatted_stats() while nzo.direct_unpacker.is_alive(): logging.debug('DirectUnpacker still alive for %s: %s', nzo.final_name, last_stats) # Bump the file-lock in case it's stuck with nzo.direct_unpacker.next_file_lock: nzo.direct_unpacker.next_file_lock.notify() time.sleep(2) # Did something change? Might be stuck if last_stats == nzo.direct_unpacker.get_formatted_stats(): wait_count += 1 if wait_count > 60: # We abort after 2 minutes of no changes nzo.direct_unpacker.abort() else: wait_count = 0 last_stats = nzo.direct_unpacker.get_formatted_stats() # Did we already direct-unpack it? Not when recursive-unpacking if nzo.direct_unpacker and rar_set in nzo.direct_unpacker.success_sets: logging.info("Set %s completed by DirectUnpack", rar_set) fail = False success = True rars, newfiles = nzo.direct_unpacker.success_sets.pop(rar_set) else: logging.info("Extracting rarfile %s (belonging to %s) to %s", rarpath, rar_set, extraction_path) try: fail, newfiles, rars = rar_extract(rarpath, len(rar_sets[rar_set]), one_folder, nzo, rar_set, extraction_path) # Was it aborted? if not nzo.pp_active: fail = True break success = not fail except: success = False fail = True msg = sys.exc_info()[1] nzo.fail_msg = T('Unpacking failed, %s') % msg setname = nzo.final_name nzo.set_unpack_info('Unpack', T('[%s] Error "%s" while unpacking RAR files') % (setname, msg)) logging.error(T('Error "%s" while running rar_unpack on %s'), msg, setname) logging.debug("Traceback: ", exc_info=True) if success: logging.debug('rar_unpack(): Rars: %s', rars) logging.debug('rar_unpack(): Newfiles: %s', newfiles) extracted_files.extend(newfiles) # Do not fail if this was a recursive unpack if fail and rarpath.startswith(workdir_complete): # Do not delete the files, leave it to user! logging.info('Ignoring failure to do recursive unpack of %s', rarpath) fail = 0 success = True newfiles = [] # Do not fail if this was maybe just some duplicate fileset # Multipar and par2tbb will detect and log them, par2cmdline will not if fail and rar_set.endswith(('.1', '.2')): # Just in case, we leave the raw files logging.info('Ignoring failure of unpack for possible duplicate file %s', rarpath) fail = 0 success = True newfiles = [] # Delete the old files if we have to if success and delete and newfiles: for rar in rars: try: remove_file(rar) except OSError: if os.path.exists(rar): logging.warning(T('Deleting %s failed!'), rar) brokenrar = '%s.1' % rar if os.path.exists(brokenrar): logging.info("Deleting %s", brokenrar) try: remove_file(brokenrar) except OSError: if os.path.exists(brokenrar): logging.warning(T('Deleting %s failed!'), brokenrar) return fail, extracted_files def rar_extract(rarfile_path, numrars, one_folder, nzo, setname, extraction_path): """ Unpack single rar set 'rarfile' to 'extraction_path', with password tries Return fail==0(ok)/fail==1(error)/fail==2(wrong password), new_files, rars """ fail = 0 new_files = None rars = [] passwords = get_all_passwords(nzo) for password in passwords: if password: logging.debug('Trying unrar with password "%s"', password) msg = T('Trying unrar with password "%s"') % password nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname) fail, new_files, rars = rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction_path, password) if fail != 2: break if fail == 2: logging.error('%s (%s)', T('Unpacking failed, archive requires a password'), os.path.split(rarfile_path)[1]) return fail, new_files, rars def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction_path, password): """ Unpack single rar set 'rarfile_path' to 'extraction_path' Return fail==0(ok)/fail==1(error)/fail==2(wrong password)/fail==3(crc-error), new_files, rars """ start = time.time() logging.debug("rar_extract(): Extractionpath: %s", extraction_path) if password: password_command = '-p%s' % password else: password_command = '-p-' ############################################################################ if one_folder or cfg.flat_unpack(): action = 'e' else: action = 'x' if cfg.overwrite_files(): overwrite = '-o+' # Enable overwrite rename = '-o+' # Dummy else: overwrite = '-o-' # Disable overwrite rename = '-or' # Auto renaming if sabnzbd.WIN32: # For Unrar to support long-path, we need to cricumvent Python's list2cmdline # See: https://github.com/sabnzbd/sabnzbd/issues/1043 command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, rename, '-ai', password_command, '%s' % clip_path(rarfile_path), '%s\\' % long_path(extraction_path)] elif RAR_PROBLEM: # Use only oldest options (specifically no "-or") command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, password_command, '%s' % rarfile_path, '%s/' % extraction_path] else: # Don't use "-ai" (not needed for non-Windows) command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, rename, password_command, '%s' % rarfile_path, '%s/' % extraction_path] if cfg.ignore_unrar_dates(): command.insert(3, '-tsm-') stup, need_shell, command, creationflags = build_command(command, flatten_command=True) # Get list of all the volumes part of this set logging.debug("Analyzing rar file ... %s found", rarfile.is_rarfile(rarfile_path)) logging.debug("Running unrar %s", command) p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, creationflags=creationflags) proc = p.stdout if p.stdin: p.stdin.close() nzo.set_action_line(T('Unpacking'), '00/%02d' % numrars) # Loop over the output from rar! curr = 0 extracted = [] rarfiles = [] fail = 0 inrecovery = False lines = [] while 1: line = platform_btou(proc.readline()) if not line: break # Check if we should still continue if not nzo.pp_active: p.kill() msg = T('PostProcessing was aborted (%s)') % T('Unpack') nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname) nzo.status = Status.FAILED return fail, (), () line = line.strip() lines.append(line) if line.startswith('Extracting from'): filename = (re.search(EXTRACTFROM_RE, line).group(1)) if filename not in rarfiles: rarfiles.append(filename) curr += 1 nzo.set_action_line(T('Unpacking'), '%02d/%02d' % (curr, numrars)) elif line.find('recovery volumes found') > -1: inrecovery = True # and thus start ignoring "Cannot find volume" for a while logging.debug("unrar recovery start: %s" % line) elif line.startswith('Reconstruct'): # end of reconstruction: 'Reconstructing... 100%' or 'Reconstructing... ' (both success), or 'Reconstruction impossible' inrecovery = False logging.debug("unrar recovery result: %s" % line) elif line.startswith('Cannot find volume') and not inrecovery: filename = os.path.basename(line[19:]) msg = T('Unpacking failed, unable to find %s') % filename nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname) logging.warning(T('ERROR: unable to find "%s"'), filename) fail = 1 elif line.endswith('- CRC failed'): msg = T('Unpacking failed, CRC error') nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname) logging.warning(T('ERROR: CRC failed in "%s"'), setname) fail = 2 # Older unrar versions report a wrong password as a CRC error elif line.startswith('File too large'): msg = T('Unpacking failed, file too large for filesystem (FAT?)') nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname) # ERROR: File too large for file system (bigfile-5000MB) logging.error(T('ERROR: File too large for filesystem (%s)'), setname) fail = 1 elif line.startswith('Write error'): msg = T('Unpacking failed, write error or disk is full?') nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname) logging.error(T('ERROR: write error (%s)'), line[11:]) fail = 1 elif line.startswith('Cannot create'): line2 = platform_btou(proc.readline()) if 'must not exceed 260' in line2: msg = '%s: %s' % (T('Unpacking failed, path is too long'), line[13:]) nzo.fail_msg = msg logging.error(T('ERROR: path too long (%s)'), line[13:]) else: msg = '%s: %s' % (T('Unpacking failed, write error or disk is full?'), line[13:]) nzo.fail_msg = msg logging.error(T('ERROR: write error (%s)'), line[13:]) nzo.set_unpack_info('Unpack', msg, setname) fail = 1 # Kill the process (can stay in endless loop on Windows Server) p.kill() elif line.startswith('ERROR: '): msg = T('ERROR: %s' % line[7:]) nzo.fail_msg = msg logging.warning(msg) nzo.set_unpack_info('Unpack', msg, setname) fail = 1 elif 'The specified password is incorrect' in line or 'Incorrect password' in line or \ ('ncrypted file' in line and (('CRC failed' in line) or ('Checksum error' in line))): # unrar 3.x: "Encrypted file: CRC failed in oLKQfrcNVivzdzSG22a2xo7t001.part1.rar (password incorrect ?)" # unrar 4.x: "CRC failed in the encrypted file oLKQfrcNVivzdzSG22a2xo7t001.part1.rar. Corrupt file or wrong password." # unrar 5.x: "Checksum error in the encrypted file oLKQfrcNVivzdzSG22a2xo7t001.part1.rar. Corrupt file or wrong password." # unrar 5.01: "The specified password is incorrect." # unrar 5.80: "Incorrect password for oLKQfrcNVivzdzSG22a2xo7t001.part1.rar" msg = T('Unpacking failed, archive requires a password') nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname) fail = 2 elif 'is not RAR archive' in line: # Unrecognizable RAR file msg = T('Unusable RAR file') nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname) fail = 3 elif 'checksum error' in line or 'Unexpected end of archive' in line: # Corrupt archive or passworded, we can't know # packed data checksum error in volume FILE msg = T('Corrupt RAR file') nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname) fail = 3 else: m = re.search(EXTRACTED_RE, line) if m: # In case of flat-unpack, UnRar still prints the whole path (?!) unpacked_file = m.group(2) if cfg.flat_unpack(): unpacked_file = os.path.basename(unpacked_file) extracted.append(real_path(extraction_path, unpacked_file)) if fail: if proc: proc.close() p.wait() logging.debug('UNRAR output %s', '\n'.join(lines)) return fail, (), () if proc: proc.close() p.wait() # Which files did we use to extract this? rarfiles = rar_volumelist(rarfile_path, password, rarfiles) logging.debug('UNRAR output %s', '\n'.join(lines)) nzo.fail_msg = '' msg = T('Unpacked %s files/folders in %s') % (str(len(extracted)), format_time_string(time.time() - start)) nzo.set_unpack_info('Unpack', msg, setname) logging.info('%s', msg) return 0, extracted, rarfiles ############################################################################## # (Un)Zip Functions ############################################################################## def unzip(nzo, workdir, workdir_complete, delete, one_folder, zips): """ Unpack multiple sets 'zips' of ZIP files from 'workdir' to 'workdir_complete. When 'delete' is ste, originals will be deleted. """ try: i = 0 unzip_failed = False tms = time.time() # For file-bookkeeping orig_dir_content = recursive_listdir(workdir_complete) for _zip in zips: logging.info("Starting extract on zipfile: %s ", _zip) nzo.set_action_line(T('Unpacking'), '%s' % setname_from_path(_zip)) if workdir_complete and _zip.startswith(workdir): extraction_path = workdir_complete else: extraction_path = os.path.split(_zip)[0] if ZIP_Extract(_zip, extraction_path, one_folder): unzip_failed = True else: i += 1 msg = T('%s files in %s') % (str(i), format_time_string(time.time() - tms)) nzo.set_unpack_info('Unpack', msg) # What's new? new_files = list(set(orig_dir_content + recursive_listdir(workdir_complete))) # Delete the old files if we have to if delete and not unzip_failed: i = 0 for _zip in zips: try: remove_file(_zip) i += 1 except OSError: logging.warning(T('Deleting %s failed!'), _zip) brokenzip = '%s.1' % _zip if os.path.exists(brokenzip): try: remove_file(brokenzip) i += 1 except OSError: logging.warning(T('Deleting %s failed!'), brokenzip) return unzip_failed, new_files except: msg = sys.exc_info()[1] nzo.fail_msg = T('Unpacking failed, %s') % msg logging.error(T('Error "%s" while running unzip() on %s'), msg, nzo.final_name) return True, [] def ZIP_Extract(zipfile, extraction_path, one_folder): """ Unzip single zip set 'zipfile' to 'extraction_path' """ command = ['%s' % ZIP_COMMAND, '-o', '-Pnone', '%s' % clip_path(zipfile), '-d%s' % extraction_path] if one_folder or cfg.flat_unpack(): command.insert(3, '-j') # Unpack without folders stup, need_shell, command, creationflags = build_command(command) logging.debug('Starting unzip: %s', command) p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, creationflags=creationflags) output = platform_btou(p.stdout.read()) logging.debug('unzip output: \n%s', output) ret = p.wait() return ret ############################################################################## # 7Zip Functions ############################################################################## def unseven(nzo, workdir, workdir_complete, delete, one_folder, sevens): """ Unpack multiple sets '7z' of 7Zip files from 'workdir' to 'workdir_complete. When 'delete' is set, originals will be deleted. """ i = 0 unseven_failed = False new_files = [] tms = time.time() # Find multi-volume sets, because 7zip will not provide actual set members sets = {} for seven in sevens: name, ext = os.path.splitext(seven) ext = ext.strip('.') if not ext.isdigit(): name = seven ext = None if name not in sets: sets[name] = [] if ext: sets[name].append(ext) # Unpack each set for seven in sets: extensions = sets[seven] logging.info("Starting extract on 7zip set/file: %s ", seven) nzo.set_action_line(T('Unpacking'), '%s' % setname_from_path(seven)) if workdir_complete and seven.startswith(workdir): extraction_path = workdir_complete else: extraction_path = os.path.split(seven)[0] res, new_files_set, msg = seven_extract(nzo, seven, extensions, extraction_path, one_folder, delete) if res: unseven_failed = True nzo.set_unpack_info('Unpack', msg, setname_from_path(seven)) else: i += 1 new_files.extend(new_files_set) if not unseven_failed: msg = T('%s files in %s') % (str(i), format_time_string(time.time() - tms)) nzo.set_unpack_info('Unpack', msg) return unseven_failed, new_files def seven_extract(nzo, sevenset, extensions, extraction_path, one_folder, delete): """ Unpack single set 'sevenset' to 'extraction_path', with password tries Return fail==0(ok)/fail==1(error)/fail==2(wrong password), new_files, sevens """ # Before we start, make sure the 7z binary SEVEN_COMMAND is defined if not SEVEN_COMMAND: msg = T('No 7za binary found, cannot unpack "%s"') % os.path.basename(sevenset) logging.error(msg) return 1, [], msg fail = 0 passwords = get_all_passwords(nzo) for password in passwords: if password: msg = T('Trying 7zip with password "%s"') % password logging.debug(msg) nzo.fail_msg = msg nzo.set_unpack_info('Unpack', msg, setname_from_path(sevenset)) fail, new_files, msg = seven_extract_core(sevenset, extensions, extraction_path, one_folder, delete, password) if fail != 2: break nzo.fail_msg = '' if fail == 2: msg = '%s (%s)' % (T('Unpacking failed, archive requires a password'), os.path.basename(sevenset)) if fail > 0: nzo.fail_msg = msg nzo.status = Status.FAILED logging.error(msg) return fail, new_files, msg def seven_extract_core(sevenset, extensions, extraction_path, one_folder, delete, password): """ Unpack single 7Z set 'sevenset' to 'extraction_path' Return fail==0(ok)/fail==1(error)/fail==2(wrong password), new_files, message """ if one_folder: method = 'e' # Unpack without folders else: method = 'x' # Unpack with folders if sabnzbd.WIN32 or sabnzbd.DARWIN: case = '-ssc-' # Case insensitive else: case = '-ssc' # Case sensitive if cfg.overwrite_files(): overwrite = '-aoa' else: overwrite = '-aou' if password: password = '-p%s' % password else: password = '-p' if len(extensions) > 0: name = '%s.001' % sevenset parm = '-tsplit' else: name = sevenset parm = '-tzip' if sevenset.lower().endswith('.zip') else '-t7z' if not os.path.exists(name): return 1, [], T('7ZIP set "%s" is incomplete, cannot unpack') % setname_from_path(sevenset) # For file-bookkeeping orig_dir_content = recursive_listdir(extraction_path) command = [SEVEN_COMMAND, method, '-y', overwrite, parm, case, password, '-o%s' % extraction_path, name] stup, need_shell, command, creationflags = build_command(command) logging.debug('Starting 7za: %s', command) p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, creationflags=creationflags) output = platform_btou(p.stdout.read()) logging.debug('7za output: %s', output) ret = p.wait() # Return-code for CRC and Password is the same if ret == 2 and 'ERROR: CRC Failed' in output: # We can output a more general error ret = 1 msg = T('ERROR: CRC failed in "%s"') % setname_from_path(sevenset) else: # Default message msg = T('Could not unpack %s') % setname_from_path(sevenset) # What's new? new_files = list(set(orig_dir_content + recursive_listdir(extraction_path))) if ret == 0 and delete: if extensions: for ext in extensions: path = '%s.%s' % (sevenset, ext) try: remove_file(path) except: logging.warning(T('Deleting %s failed!'), path) else: try: remove_file(sevenset) except: logging.warning(T('Deleting %s failed!'), sevenset) # Always return an error message, even when return code is 0 return ret, new_files, msg ############################################################################## # PAR2 Functions ############################################################################## def par2_repair(parfile_nzf, nzo, workdir, setname, single): """ Try to repair a set, return readd or correctness """ # Check if file exists, otherwise see if another is done parfile_path = os.path.join(workdir, parfile_nzf.filename) if not os.path.exists(parfile_path) and nzo.extrapars[setname]: for new_par in nzo.extrapars[setname]: test_parfile = os.path.join(workdir, new_par.filename) if os.path.exists(test_parfile): parfile_nzf = new_par break else: # No file was found, we assume this set already finished return False, True parfile = os.path.join(workdir, parfile_nzf.filename) old_dir_content = os.listdir(workdir) used_joinables = () joinables = () used_for_repair = () result = readd = False # Need to copy now, gets pop-ed during repair setpars = nzo.extrapars[setname][:] # Start QuickCheck nzo.status = Status.QUICK_CHECK nzo.set_action_line(T('Repair'), T('Quick Checking')) qc_result = QuickCheck(setname, nzo) if qc_result: logging.info("Quick-check for %s is OK, skipping repair", setname) nzo.set_unpack_info('Repair', T('[%s] Quick Check OK') % setname) result = True if not result and cfg.enable_all_par(): # Download all par2 files that haven't been downloaded yet readd = False for extrapar in nzo.extrapars[setname][:]: # Make sure we only get new par2 files if extrapar not in nzo.finished_files and extrapar not in nzo.files: nzo.add_parfile(extrapar) readd = True if readd: return readd, result if not result: nzo.status = Status.REPAIRING result = False readd = False try: nzo.set_action_line(T('Repair'), T('Starting Repair')) logging.info('Scanning "%s"', parfile) joinables, zips, rars, sevens, ts = build_filelists(workdir, check_rar=False) # Multipar or not? if sabnzbd.WIN32 and cfg.multipar(): finished, readd, datafiles, used_joinables, used_for_repair = MultiPar_Verify(parfile, nzo, setname, joinables, single=single) else: finished, readd, datafiles, used_joinables, used_for_repair = PAR_Verify(parfile, nzo, setname, joinables, single=single) if finished: result = True logging.info('Par verify finished ok on %s!', parfile) # Remove this set so we don't try to check it again nzo.remove_parset(parfile_nzf.setname) else: logging.info('Par verify failed on %s!', parfile) if not readd: # Failed to repair -> remove this set nzo.remove_parset(parfile_nzf.setname) return readd, False except: msg = sys.exc_info()[1] nzo.fail_msg = T('Repairing failed, %s') % msg logging.error(T('Error %s while running par2_repair on set %s'), msg, setname) logging.info("Traceback: ", exc_info=True) return readd, result try: if cfg.enable_par_cleanup(): deletables = [] new_dir_content = os.listdir(workdir) # Remove extra files created during repair and par2 base files for path in new_dir_content: if os.path.splitext(path)[1] == '.1' and path not in old_dir_content: deletables.append(os.path.join(workdir, path)) deletables.append(os.path.join(workdir, setname + '.par2')) deletables.append(os.path.join(workdir, setname + '.PAR2')) deletables.append(parfile) # Add output of par2-repair to remove deletables.extend(used_joinables) deletables.extend([os.path.join(workdir, f) for f in used_for_repair]) # Delete pars of the set deletables.extend([os.path.join(workdir, nzf.filename) for nzf in setpars]) for filepath in deletables: if filepath in joinables: joinables.remove(filepath) if os.path.exists(filepath): try: remove_file(filepath) except OSError: logging.warning(T('Deleting %s failed!'), filepath) except: msg = sys.exc_info()[1] nzo.fail_msg = T('Repairing failed, %s') % msg logging.error(T('Error "%s" while running par2_repair on set %s'), msg, setname, exc_info=True) return readd, result _RE_BLOCK_FOUND = re.compile(r'File: "([^"]+)" - found \d+ of \d+ data blocks from "([^"]+)"') _RE_IS_MATCH_FOR = re.compile(r'File: "([^"]+)" - is a match for "([^"]+)"') _RE_LOADING_PAR2 = re.compile(r'Loading "([^"]+)"\.') _RE_LOADED_PAR2 = re.compile(r'Loaded (\d+) new packets') def PAR_Verify(parfile, nzo, setname, joinables, single=False): """ Run par2 on par-set """ used_joinables = [] used_for_repair = [] # set the current nzo status to "Verifying...". Used in History nzo.status = Status.VERIFYING start = time.time() options = cfg.par_option().strip() command = [str(PAR2_COMMAND), 'r', options, parfile] # Append the wildcard for this set parfolder = os.path.split(parfile)[0] if single or len(globber(parfolder, setname + '*')) < 2: # Support bizarre naming conventions wildcard = '*' else: # Normal case, everything is named after set wildcard = setname + '*' if sabnzbd.WIN32 or sabnzbd.DARWIN: command.append(os.path.join(parfolder, wildcard)) else: # For Unix systems, remove folders, due to bug in some par2cmdline versions flist = [item for item in globber_full(parfolder, wildcard) if os.path.isfile(item)] command.extend(flist) # We need to check for the bad par2cmdline that skips blocks # Or the one that complains about basepath # Only if we're not doing multicore if not sabnzbd.WIN32 and not sabnzbd.DARWIN: par2text = run_simple([command[0], '-h']) if 'No data skipping' in par2text: logging.info('Detected par2cmdline version that skips blocks, adding -N parameter') command.insert(2, '-N') if 'Set the basepath' in par2text: logging.info('Detected par2cmdline version that needs basepath, adding -B parameter') command.insert(2, '-B') command.insert(3, parfolder) stup, need_shell, command, creationflags = build_command(command) # par2multicore wants to see \\.\ paths on Windows # See: https://github.com/sabnzbd/sabnzbd/pull/771 if sabnzbd.WIN32: command = [clip_path(x) if x.startswith('\\\\?\\') else x for x in command] # Run the external command logging.info('Starting par2: %s', command) lines = [] try: p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, creationflags=creationflags) proc = p.stdout if p.stdin: p.stdin.close() # Set up our variables datafiles = [] renames = {} reconstructed = [] linebuf = '' finished = 0 readd = False verifynum = 1 verifytotal = 0 verified = 0 in_verify_repaired = False # Loop over the output, whee while 1: char = platform_btou(proc.read(1)) if not char: break # Line not complete yet if char not in ('\n', '\r'): linebuf += char continue line = linebuf.strip() linebuf = '' # Check if we should still continue if not nzo.pp_active: p.kill() msg = T('PostProcessing was aborted (%s)') % T('Repair') nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED readd = False break # Skip empty lines if line == '': continue if 'Repairing:' not in line: lines.append(line) if line.startswith(('Invalid option specified', 'Invalid thread option', 'Cannot specify recovery file count')): msg = T('[%s] PAR2 received incorrect options, check your Config->Switches settings') % setname nzo.set_unpack_info('Repair', msg) nzo.status = Status.FAILED logging.error(msg) elif line.startswith('All files are correct'): msg = T('[%s] Verified in %s, all files correct') % (setname, format_time_string(time.time() - start)) nzo.set_unpack_info('Repair', msg) logging.info('Verified in %s, all files correct', format_time_string(time.time() - start)) finished = 1 elif line.startswith('Repair is required'): msg = T('[%s] Verified in %s, repair is required') % (setname, format_time_string(time.time() - start)) nzo.set_unpack_info('Repair', msg) logging.info('Verified in %s, repair is required', format_time_string(time.time() - start)) start = time.time() verified = 1 # Reset to use them again for verification of repair verifytotal = 0 verifynum = 0 elif line.startswith('Main packet not found') or 'The recovery file does not exist' in line: # Initialparfile probably didn't decode properly or bad user parameters # We will try to get another par2 file, but 99% of time it's user parameters msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair') logging.info(msg) logging.info("Extra pars = %s", nzo.extrapars[setname]) # Look for the smallest par2file block_table = {} for nzf in nzo.extrapars[setname]: if not nzf.completed: block_table[nzf.blocks] = nzf if block_table: nzf = block_table[min(block_table.keys())] logging.info("Found new par2file %s", nzf.filename) # Move from extrapar list to files to be downloaded # and remove it from the extrapars list nzo.add_parfile(nzf) readd = True else: nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED elif line.startswith('You need'): # We need more blocks, but are they available? chunks = line.split() needed_blocks = int(chunks[2]) # Check if we have enough blocks added_blocks = nzo.get_extra_blocks(setname, needed_blocks) if added_blocks: msg = T('Fetching %s blocks...') % str(added_blocks) nzo.set_action_line(T('Fetching'), msg) readd = True else: # Failed msg = T('Repair failed, not enough repair blocks (%s short)') % str(needed_blocks) nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED elif line.startswith('Repair is possible'): start = time.time() nzo.set_action_line(T('Repairing'), '%2d%%' % 0) elif line.startswith('Repairing:'): chunks = line.split() per = float(chunks[-1][:-1]) nzo.set_action_line(T('Repairing'), '%2d%%' % per) nzo.status = Status.REPAIRING elif line.startswith('Repair complete'): msg = T('[%s] Repaired in %s') % (setname, format_time_string(time.time() - start)) nzo.set_unpack_info('Repair', msg) logging.info('Repaired in %s', format_time_string(time.time() - start)) finished = 1 elif verified and line.endswith(('are missing.', 'exist but are damaged.')): # Files that will later be verified after repair chunks = line.split() verifytotal += int(chunks[0]) elif line.startswith('Verifying repaired files'): in_verify_repaired = True nzo.set_action_line(T('Verifying repair'), '%02d/%02d' % (verifynum, verifytotal)) elif in_verify_repaired and line.startswith('Target'): verifynum += 1 if verifynum <= verifytotal: nzo.set_action_line(T('Verifying repair'), '%02d/%02d' % (verifynum, verifytotal)) elif line.startswith('File:') and line.find('data blocks from') > 0: m = _RE_BLOCK_FOUND.search(line) if m: workdir = os.path.split(parfile)[0] old_name = m.group(1) new_name = m.group(2) if joinables: # Find out if a joinable file has been used for joining for jn in joinables: if line.find(os.path.split(jn)[1]) > 0: used_joinables.append(jn) break # Special case of joined RAR files, the "of" and "from" must both be RAR files # This prevents the joined rars files from being seen as an extra rar-set if '.rar' in old_name.lower() and '.rar' in new_name.lower(): used_joinables.append(os.path.join(workdir, old_name)) else: logging.debug('PAR2 will reconstruct "%s" from "%s"', new_name, old_name) reconstructed.append(os.path.join(workdir, old_name)) elif 'Could not write' in line and 'at offset 0:' in line: # If there are joinables, this error will only happen in case of 100% complete files # We can just skip the retry, because par2cmdline will fail in those cases # becauses it refuses to scan the ".001" file if joinables: finished = 1 used_joinables = [] elif ' cannot be renamed to ' in line: msg = line.strip() nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED elif 'There is not enough space on the disk' in line: # Oops, disk is full! msg = T('Repairing failed, %s') % T('Disk full') nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED # File: "oldname.rar" - is a match for "newname.rar". elif 'is a match for' in line: m = _RE_IS_MATCH_FOR.search(line) if m: old_name = m.group(1) new_name = m.group(2) logging.debug('PAR2 will rename "%s" to "%s"', old_name, new_name) renames[new_name] = old_name # Show progress if verifytotal == 0 or verifynum < verifytotal: verifynum += 1 nzo.set_action_line(T('Verifying'), '%02d/%02d' % (verifynum, verifytotal)) elif 'Scanning extra files' in line: # Obfuscated post most likely, so reset counter to show progress verifynum = 1 elif 'No details available for recoverable file' in line: msg = line.strip() nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED elif line.startswith('Repair Failed.'): # Unknown repair problem msg = T('Repairing failed, %s') % line nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED finished = 0 elif not verified: if line.startswith('Verifying source files'): nzo.set_action_line(T('Verifying'), '01/%02d' % verifytotal) nzo.status = Status.VERIFYING elif line.startswith('Scanning:'): pass # Target files m = TARGET_RE.match(line) if m: nzo.status = Status.VERIFYING verifynum += 1 if verifytotal == 0 or verifynum < verifytotal: nzo.set_action_line(T('Verifying'), '%02d/%02d' % (verifynum, verifytotal)) else: nzo.set_action_line(T('Checking extra files'), '%02d' % verifynum) # Remove redundant extra files that are just duplicates of original ones if 'duplicate data blocks' in line: used_for_repair.append(m.group(1)) else: datafiles.append(m.group(1)) continue # Verify done m = re.match(r'There are (\d+) recoverable files', line) if m: verifytotal = int(m.group(1)) p.wait() except WindowsError as err: raise WindowsError(err) # Also log what is shown to user in history if nzo.fail_msg: logging.info(nzo.fail_msg) logging.debug('PAR2 output was\n%s', '\n'.join(lines)) # If successful, add renamed files to the collection if finished and renames: nzo.renamed_file(renames) # If successful and files were reconstructed, remove incomplete original files if finished and reconstructed: # Use 'used_joinables' as a vehicle to get rid of the files used_joinables.extend(reconstructed) return finished, readd, datafiles, used_joinables, used_for_repair _RE_FILENAME = re.compile(r'"([^"]+)"') def MultiPar_Verify(parfile, nzo, setname, joinables, single=False): """ Run par2 on par-set """ parfolder = os.path.split(parfile)[0] used_joinables = [] used_for_repair = [] # set the current nzo status to "Verifying...". Used in History nzo.status = Status.VERIFYING start = time.time() # Caching of verification implemented by adding: # But not really required due to prospective-par2 command = [str(MULTIPAR_COMMAND), 'r', '-vs2', '-vd%s' % parfolder, parfile] # Check if there are maybe par2cmdline/par2tbb commands supplied if '-t' in cfg.par_option() or '-p' in cfg.par_option(): logging.info('Removing old par2cmdline/par2tbb options for MultiPar') cfg.par_option.set('') # Only add user-options if supplied options = cfg.par_option().strip() if options: # We wrongly instructed users to use /x parameter style instead of -x options = options.replace('/', '-', 1) command.insert(2, options) # Append the wildcard for this set if single or len(globber(parfolder, setname + '*')) < 2: # Support bizarre naming conventions wildcard = '*' else: # Normal case, everything is named after set wildcard = setname + '*' command.append(os.path.join(parfolder, wildcard)) stup, need_shell, command, creationflags = build_command(command) logging.info('Starting MultiPar: %s', command) lines = [] p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, creationflags=creationflags) proc = p.stdout if p.stdin: p.stdin.close() # Set up our variables datafiles = [] renames = {} reconstructed = [] linebuf = '' finished = 0 readd = False verifynum = 0 verifytotal = 0 in_check = False in_verify = False in_repair = False in_verify_repaired = False misnamed_files = False old_name = None # Loop over the output, whee while 1: char = platform_btou(proc.read(1)) if not char: break # Line not complete yet if char not in ('\n', '\r'): linebuf += char continue line = linebuf.strip() linebuf = '' # Check if we should still continue if not nzo.pp_active: p.kill() msg = T('PostProcessing was aborted (%s)') % T('Repair') nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED readd = False break # Skip empty lines if line == '': continue # Save it all lines.append(line) # ----------------- Startup if line.startswith('invalid option'): # Option error msg = T('[%s] PAR2 received incorrect options, check your Config->Switches settings') % setname nzo.set_unpack_info('Repair', msg) nzo.status = Status.FAILED logging.error(msg) elif line.startswith('valid file is not found'): # Initialparfile probably didn't decode properly, or bad user parameters # We will try to get another par2 file, but 99% of time it's user parameters msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair') logging.info(msg) logging.info("Extra pars = %s", nzo.extrapars[setname]) # Look for the smallest par2file block_table = {} for nzf in nzo.extrapars[setname]: if not nzf.completed: block_table[nzf.blocks] = nzf if block_table: nzf = block_table[min(block_table.keys())] logging.info("Found new par2file %s", nzf.filename) # Move from extrapar list to files to be downloaded # and remove it from the extrapars list nzo.add_parfile(nzf) readd = True else: nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED elif line.startswith('There is not enough space on the disk'): msg = T('Repairing failed, %s') % T('Disk full') nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED # ----------------- Start check/verify stage elif line.startswith('Recovery Set ID'): # Remove files were MultiPar stores verification result when repaired succesfull recovery_id = line.split()[-1] used_for_repair.append('2_%s.bin' % recovery_id) used_for_repair.append('2_%s.ini' % recovery_id) elif line.startswith('Input File total count'): # How many files will it try to find? verifytotal = int(line.split()[-1]) # ----------------- Misnamed-detection stage # Misnamed files elif line.startswith('Searching misnamed file'): # We are in the misnamed files block misnamed_files = True verifynum = 0 elif misnamed_files and 'Found' in line: # First it reports the current filename m = _RE_FILENAME.search(line) if m: verifynum += 1 nzo.set_action_line(T('Checking'), '%02d/%02d' % (verifynum, verifytotal)) old_name = m.group(1) elif misnamed_files and 'Misnamed' in line: # Then it finds the actual m = _RE_FILENAME.search(line) if m and old_name: new_name = m.group(1) logging.debug('MultiPar will rename "%s" to "%s"', old_name, new_name) renames[new_name] = old_name # New name is also part of data! datafiles.append(new_name) reconstructed.append(old_name) # ----------------- Checking stage # Checking input files elif line.startswith('Complete file count'): in_check = False verifynum = 0 old_name = None elif line.startswith('Verifying Input File'): in_check = True nzo.status = Status.VERIFYING elif in_check: m = _RE_FILENAME.search(line) if m: # Only increase counter if it was really the detection line if line.startswith('= ') or '%' not in line: verifynum += 1 nzo.set_action_line(T('Checking'), '%02d/%02d' % (verifynum, verifytotal)) old_name = m.group(1) # ----------------- Verify stage # Which files need extra verification? elif line.startswith('Damaged file count'): verifytotal = int(line.split()[-1]) elif line.startswith('Missing file count'): verifytotal += int(line.split()[-1]) # Actual verification elif line.startswith('Input File Slice found'): # End of verification AND end of misnamed file search in_verify = False misnamed_files = False old_name = None elif line.startswith('Finding available slice'): # The actual scanning of the files in_verify = True nzo.set_action_line(T('Verifying'), T('Checking')) elif in_verify: m = _RE_FILENAME.search(line) if m: # It prints the filename couple of times, so we save it to check # 'datafiles' will not contain all data-files in par-set, only the # ones that got scanned, but it's ouput is never used! nzo.status = Status.VERIFYING if line.split()[1] in ('Damaged', 'Found'): verifynum += 1 datafiles.append(m.group(1)) # Set old_name in case it was misnamed and found (not when we are joining) old_name = None if line.split()[1] == 'Found' and not joinables: old_name = m.group(1) # Sometimes we don't know the total (filejoin) if verifytotal <= 1: nzo.set_action_line(T('Verifying'), '%02d' % verifynum) else: nzo.set_action_line(T('Verifying'), '%02d/%02d' % (verifynum, verifytotal)) elif old_name and old_name != m.group(1): # Hey we found another misnamed one! new_name = m.group(1) logging.debug('MultiPar will rename "%s" to "%s"', old_name, new_name) renames[new_name] = old_name # Put it back with it's new name! datafiles.pop() datafiles.append(new_name) # Need to remove the old file after repair (Multipar keeps it) used_for_repair.append(old_name) # Need to reset it to avoid collision old_name = None else: # It's scanning extra files that don't belong to the set # For damaged files it reports the filename twice, so only then start verifynum += 1 if verifynum / 2 > verifytotal: nzo.set_action_line(T('Checking extra files'), '%02d' % verifynum) if joinables: # Find out if a joinable file has been used for joining for jn in joinables: if line.find(os.path.split(jn)[1]) > 0: used_joinables.append(jn) datafiles.append(m.group(1)) break elif line.startswith('Need'): # We need more blocks, but are they available? chunks = line.split() needed_blocks = int(chunks[1]) # Check if we have enough blocks added_blocks = nzo.get_extra_blocks(setname, needed_blocks) if added_blocks: msg = T('Fetching %s blocks...') % str(added_blocks) nzo.set_action_line(T('Fetching'), msg) readd = True else: # Failed msg = T('Repair failed, not enough repair blocks (%s short)') % str(needed_blocks) nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED # MultiPar can say 'PAR File(s) Incomplete' also when it needs more blocks # But the Need-more-blocks message is always last, so force failure finished = 0 # Result of verification elif line.startswith('All Files Complete') or line.endswith('PAR File(s) Incomplete'): # Completed without damage! # 'PAR File(s) Incomplete' is reported for success # but when there are very similar filenames in the folder msg = T('[%s] Verified in %s, all files correct') % (setname, format_time_string(time.time() - start)) nzo.set_unpack_info('Repair', msg) logging.info('Verified in %s, all files correct', format_time_string(time.time() - start)) finished = 1 elif line.startswith(('Ready to repair', 'Ready to rejoin')): # Ready to repair! # Or we are re-joining a split file when there's no damage but takes time msg = T('[%s] Verified in %s, repair is required') % (setname, format_time_string(time.time() - start)) nzo.set_unpack_info('Repair', msg) logging.info('Verified in %s, repair is required', format_time_string(time.time() - start)) start = time.time() # Set message for user in case of joining if line.startswith('Ready to rejoin'): nzo.set_action_line(T('Joining'), '%2d' % len(used_joinables)) else: # If we are repairing a joinable set, it won't actually # do the joining. So we can't remove those files! used_joinables = [] # ----------------- Repair stage elif 'Recovering slice' in line: # Before this it will calculate matrix, here is where it starts start = time.time() in_repair = True nzo.set_action_line(T('Repairing'), '%2d%%' % 0) elif in_repair and line.startswith('Verifying repair'): in_repair = False in_verify_repaired = True # How many will be checked? verifytotal = int(line.split()[-1]) verifynum = 0 elif in_repair: try: # Line with percentage of repair (nothing else) per = float(line[:-1]) nzo.set_action_line(T('Repairing'), '%2d%%' % per) nzo.status = Status.REPAIRING except: # Checksum error if 'checksum' in line: # Failed due to checksum error of multipar msg = T('Repairing failed, %s') % line nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED else: # Not sure, log error logging.info("Traceback: ", exc_info=True) elif line.startswith('Repaired successfully'): msg = T('[%s] Repaired in %s') % (setname, format_time_string(time.time() - start)) nzo.set_unpack_info('Repair', msg) logging.info('Repaired in %s', format_time_string(time.time() - start)) finished = 1 elif in_verify_repaired and line.startswith('Repaired :'): # Track verification of repaired files (can sometimes take a while) verifynum += 1 nzo.set_action_line(T('Verifying repair'), '%02d/%02d' % (verifynum, verifytotal)) elif line.startswith('Failed to repair'): # Unknown repair problem msg = T('Repairing failed, %s') % line nzo.fail_msg = msg nzo.set_unpack_info('Repair', msg, setname) nzo.status = Status.FAILED finished = 0 p.wait() # Also log what is shown to user in history if nzo.fail_msg: logging.info(nzo.fail_msg) logging.debug('MultiPar output was\n%s', '\n'.join(lines)) # Add renamed files to the collection # MultiPar always(!!) renames automatically whatever it can in the 'Searching misnamed file:'-section # Even if the repair did not complete fully it will rename those! # But the ones in 'Finding available slices'-section will only be renamed after succesfull repair if renames: # If succes, we also remove the possibly previously renamed ones if finished: reconstructed.extend(list(renames.values())) # Adding to the collection nzo.renamed_file(renames) # Remove renamed original files workdir = os.path.split(parfile)[0] used_joinables.extend([os.path.join(workdir, name) for name in reconstructed]) return finished, readd, datafiles, used_joinables, used_for_repair def create_env(nzo=None, extra_env_fields={}): """ Modify the environment for pp-scripts with extra information OSX: Return copy of environment without PYTHONPATH and PYTHONHOME other: return None """ env = os.environ.copy() # Are we adding things? if nzo: # Add basic info for field in ENV_NZO_FIELDS: try: field_value = getattr(nzo, field) # Special filters for Python types if field_value is None: env['SAB_' + field.upper()] = '' elif isinstance(field_value, bool): env['SAB_' + field.upper()] = str(field_value*1) else: env['SAB_' + field.upper()] = str(field_value) except: # Catch key errors pass # Always supply basic info extra_env_fields.update({'program_dir': sabnzbd.DIR_PROG, 'par2_command': sabnzbd.newsunpack.PAR2_COMMAND, 'multipar_command': sabnzbd.newsunpack.MULTIPAR_COMMAND, 'rar_command': sabnzbd.newsunpack.RAR_COMMAND, 'zip_command': sabnzbd.newsunpack.ZIP_COMMAND, '7zip_command': sabnzbd.newsunpack.SEVEN_COMMAND, 'version': sabnzbd.__version__}) # Add extra fields for field in extra_env_fields: try: if extra_env_fields[field] is not None: env['SAB_' + field.upper()] = str(extra_env_fields[field]) else: env['SAB_' + field.upper()] = '' except: # Catch key errors pass if sabnzbd.DARWIN: if 'PYTHONPATH' in env: del env['PYTHONPATH'] if 'PYTHONHOME' in env: del env['PYTHONHOME'] elif not nzo: # No modification return None return env def userxbit(filename): # Returns boolean if the x-bit for user is set on the given file # This is a workaround: os.access(filename, os.X_OK) does not work on certain mounted file systems # Does not work on Windows, but it is not called on Windows # rwx rwx rwx # 876 543 210 # we want bit 6 from the right, counting from 0 userxbit = 1<<6 # bit 6 rwxbits = os.stat(filename)[0] # the first element of os.stat() is "mode" # do logical AND, check if it is not 0: xbitset = (rwxbits & userxbit) > 0 return xbitset def build_command(command, flatten_command=False): """ Prepare list from running an external program On Windows we need to run our own list2cmdline for Unrar """ # command[0] should be set, and thus not None if not command[0]: logging.error(T('[%s] The command in build_command is undefined.'), caller_name()) raise IOError if not sabnzbd.WIN32: if command[0].endswith('.py'): with open(command[0], 'r') as script_file: if not userxbit(command[0]): # Inform user that Python scripts need x-bit and then stop logging.error(T('Python script "%s" does not have execute (+x) permission set'), command[0]) raise IOError elif script_file.read(2) != '#!': # No shebang (#!) defined, add default python command.insert(0, 'python') if IONICE_COMMAND and cfg.ionice().strip(): lst = cfg.ionice().split() lst.reverse() for arg in lst: command.insert(0, arg) command.insert(0, IONICE_COMMAND) if NICE_COMMAND and cfg.nice().strip(): lst = cfg.nice().split() lst.reverse() for arg in lst: command.insert(0, arg) command.insert(0, NICE_COMMAND) need_shell = False stup = None creationflags = 0 else: # For Windows we always need to add python interpreter if command[0].endswith('.py'): command.insert(0, 'python') need_shell = os.path.splitext(command[0])[1].lower() not in ('.exe', '.com') stup = subprocess.STARTUPINFO() stup.dwFlags = win32process.STARTF_USESHOWWINDOW stup.wShowWindow = win32con.SW_HIDE creationflags = WIN_SCHED_PRIOS[cfg.win_process_prio()] if need_shell or flatten_command: command = list2cmdline(command) return stup, need_shell, command, creationflags def rar_volumelist(rarfile_path, password, known_volumes): """ Extract volumes that are part of this rarset and merge them with existing list, removing duplicates """ # UnRar is required to read some RAR files # RarFile can fail in special cases try: rarfile.UNRAR_TOOL = RAR_COMMAND zf = rarfile.RarFile(rarfile_path) # setpassword can fail due to bugs in RarFile if password: try: zf.setpassword(password) except: pass zf_volumes = zf.volumelist() except: zf_volumes = [] # Remove duplicates known_volumes_base = [os.path.basename(vol) for vol in known_volumes] for zf_volume in zf_volumes: if os.path.basename(zf_volume) not in known_volumes_base: # Long-path notation just to be sure known_volumes.append(long_path(zf_volume)) return known_volumes # Sort the various RAR filename formats properly :\ def rar_sort(a, b): """ Define sort method for rar file names """ aext = a.split('.')[-1] bext = b.split('.')[-1] if aext == 'rar' and bext == 'rar': return cmp(a, b) elif aext == 'rar': return -1 elif bext == 'rar': return 1 else: return cmp(a, b) def build_filelists(workdir, workdir_complete=None, check_both=False, check_rar=True): """ Build filelists, if workdir_complete has files, ignore workdir. Optionally scan both directories. Optionally test content to establish RAR-ness """ sevens, joinables, zips, rars, ts, filelist = ([], [], [], [], [], []) if workdir_complete: filelist.extend(recursive_listdir(workdir_complete)) if workdir and (not filelist or check_both): filelist.extend(recursive_listdir(workdir)) for file in filelist: # Extra check for rar (takes CPU/disk) file_is_rar = False if check_rar: file_is_rar = rarfile.is_rarfile(file) # Run through all the checks if SEVENZIP_RE.search(file) or SEVENMULTI_RE.search(file): # 7zip sevens.append(file) elif SPLITFILE_RE.search(file) and not file_is_rar: # Joinables, optional with RAR check joinables.append(file) elif ZIP_RE.search(file): # ZIP files zips.append(file) elif RAR_RE.search(file): # RAR files rars.append(file) elif TS_RE.search(file): # TS split files ts.append(file) logging.debug("build_filelists(): joinables: %s", joinables) logging.debug("build_filelists(): zips: %s", zips) logging.debug("build_filelists(): rars: %s", rars) logging.debug("build_filelists(): 7zips: %s", sevens) logging.debug("build_filelists(): ts: %s", ts) return joinables, zips, rars, sevens, ts def QuickCheck(set, nzo): """ Check all on-the-fly md5sums of a set """ md5pack = nzo.md5packs.get(set) if md5pack is None: return False # We use bitwise assigment (&=) so False always wins in case of failure # This way the renames always get saved! result = True nzf_list = nzo.finished_files renames = {} # Files to ignore ignore_ext = cfg.quick_check_ext_ignore() for file in md5pack: found = False file_to_ignore = os.path.splitext(file)[1].lower().replace('.', '') in ignore_ext for nzf in nzf_list: # Do a simple filename based check if file == nzf.filename: found = True if (nzf.md5sum is not None) and nzf.md5sum == md5pack[file]: logging.debug('Quick-check of file %s OK', file) result &= True elif file_to_ignore: # We don't care about these files logging.debug('Quick-check ignoring file %s', file) result &= True else: logging.info('Quick-check of file %s failed!', file) result = False break # Now lets do obfuscation check if nzf.md5sum == md5pack[file]: try: logging.debug('Quick-check will rename %s to %s', nzf.filename, file) renamer(os.path.join(nzo.downpath, nzf.filename), os.path.join(nzo.downpath, file)) renames[file] = nzf.filename nzf.filename = file result &= True found = True break except IOError: # Renamed failed for some reason, probably already done break if not found: if file_to_ignore: # We don't care about these files logging.debug('Quick-check ignoring missing file %s', file) continue logging.info('Cannot Quick-check missing file %s!', file) result = False # Save renames if renames: nzo.renamed_file(renames) return result def unrar_check(rar): """ Return version number of unrar, where "5.01" returns 501 Also return whether an original version is found (version, original) """ version = 0 original = '' if rar: try: version = run_simple(rar) except: return version, original original = "Alexander Roshal" in version m = re.search(r"RAR\s(\d+)\.(\d+)", version) if m: version = int(m.group(1)) * 100 + int(m.group(2)) else: version = 0 return version, original def par2_mt_check(par2_path): """ Detect if we have multicore par2 variants """ try: par2_version = run_simple([par2_path, '-h']) # Look for a threads option if '-t<' in par2_version: return True except: pass return False def sfv_check(sfv_path): """ Verify files using SFV file, input: full path of sfv, file are assumed to be relative to sfv returns: List of failing files or [] when all is OK """ failed = [] try: fp = open(sfv_path, 'r') except: logging.info('Cannot open SFV file %s', sfv_path) failed.append(sfv_path) return failed root = os.path.split(sfv_path)[0] for line in fp: line = line.strip('\n\r ') if line and line[0] != ';': x = line.rfind(' ') if x > 0: filename = line[:x].strip() checksum = line[x:].strip() path = os.path.join(root, filename) if os.path.exists(path): if crc_check(path, checksum): logging.debug('File %s passed SFV check', path) else: logging.info('File %s did not pass SFV check', path) failed.append(filename) else: logging.info('File %s missing in SFV check', path) failed.append(filename) fp.close() return failed def crc_check(path, target_crc): """ Return True if file matches CRC """ try: fp = open(path, 'rb') except: return False crc = 0 while 1: data = fp.read(4096) if not data: break crc = binascii.crc32(data, crc) fp.close() crc = '%08x' % (crc & 0xffffffff,) return crc.lower() == target_crc.lower() def analyse_show(name): """ Do a quick SeasonSort check and return basic facts """ job = SeriesSorter(None, name, None, None) job.match(force=True) if job.is_match(): job.get_values() info = job.show_info show_name = info.get('show_name', '').replace('.', ' ').replace('_', ' ') show_name = show_name.replace(' ', ' ') return show_name, \ info.get('season_num', ''), \ info.get('episode_num', ''), \ info.get('ep_name', '') def pre_queue(nzo, pp, cat): """ Run pre-queue script (if any) and process results. pp and cat are supplied seperate since they can change. """ def fix(p): # If added via API, some items can still be "None" (as a string) if not p or str(p).lower() == 'none': return '' return str(p) values = [1, nzo.final_name_pw_clean, pp, cat, nzo.script, nzo.priority, None] script_path = make_script_path(cfg.pre_script()) if script_path: # Basic command-line parameters command = [script_path, nzo.final_name_pw_clean, pp, cat, nzo.script, nzo.priority, str(nzo.bytes), ' '.join(nzo.groups)] command.extend(analyse_show(nzo.final_name_pw_clean)) command = [fix(arg) for arg in command] # Fields not in the NZO directly extra_env_fields = {'groups': ' '.join(nzo.groups), 'show_name': command[8], 'show_season': command[9], 'show_episode': command[10], 'show_episode_name': command[11]} try: stup, need_shell, command, creationflags = build_command(command) env = create_env(nzo, extra_env_fields) logging.info('Running pre-queue script %s', command) p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, env=env, creationflags=creationflags) except: logging.debug("Failed script %s, Traceback: ", script_path, exc_info=True) return values output = platform_btou(p.stdout.read()) ret = p.wait() logging.info('Pre-queue script returns %s and output=\n%s', ret, output) if ret == 0: n = 0 for line in output.split('\n'): line = line.strip('\r\n \'"') if n < len(values) and line: values[n] = line n += 1 accept = int_conv(values[0]) if accept < 1: logging.info('Pre-Q refuses %s', nzo.final_name_pw_clean) elif accept == 2: logging.info('Pre-Q accepts&fails %s', nzo.final_name_pw_clean) else: logging.info('Pre-Q accepts %s', nzo.final_name_pw_clean) return values def list2cmdline(lst): """ convert list to a cmd.exe-compatible command string """ nlst = [] for arg in lst: if not arg: nlst.append('""') else: nlst.append('"%s"' % arg) return ' '.join(nlst) def is_sevenfile(path): """ Return True if path has proper extension and 7Zip is installed """ return SEVEN_COMMAND and os.path.splitext(path)[1].lower() == '.7z' class SevenZip: """ Minimal emulation of ZipFile class for 7Zip """ def __init__(self, path): self.path = path def namelist(self): """ Return list of names in 7Zip """ names = [] # Future extension: use '-sccUTF-8' to get names in UTF8 encoding command = [SEVEN_COMMAND, 'l', '-p', '-y', '-slt', self.path] stup, need_shell, command, creationflags = build_command(command) p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, creationflags=creationflags) output = platform_btou(p.stdout.read()) _ = p.wait() re_path = re.compile('^Path = (.+)') for line in output.split('\n'): m = re_path.search(line) if m: names.append(m.group(1).strip('\r')) if names: # Remove name of archive itself del names[0] return names def read(self, name): """ Read named file from 7Zip and return data """ command = [SEVEN_COMMAND, 'e', '-p', '-y', '-so', self.path, name] stup, need_shell, command, creationflags = build_command(command) # Ignore diagnostic output, otherwise it will be appended to content if sabnzbd.WIN32: stderr = open('nul', 'w') else: stderr = open('/dev/null', 'w') p = Popen(command, shell=need_shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=stderr, startupinfo=stup, creationflags=creationflags) output = platform_btou(p.stdout.read()) _ = p.wait() stderr.close() return output def close(self): """ Close file """ pass def run_simple(cmd): """ Run simple external command and return output """ p = Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) txt = platform_btou(p.stdout.read()) p.wait() return txt sabnzbd-develop/sabnzbd/par2file.py0000600000175000017500000001335313642116632015443 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.par2file - All par2-related functionality """ import os import logging import re import hashlib import struct from sabnzbd.encoding import correct_unknown_encoding PROBABLY_PAR2_RE = re.compile(r"(.*)\.vol(\d*)[\+\-](\d*)\.par2", re.I) PAR_PKT_ID = b"PAR2\x00PKT" PAR_FILE_ID = b"PAR 2.0\x00FileDesc" PAR_CREATOR_ID = b"PAR 2.0\x00Creator" PAR_RECOVERY_ID = b"RecvSlic" def is_parfile(filename): """ Check quickly whether file has par2 signature """ try: with open(filename, "rb") as f: buf = f.read(8) return buf.startswith(PAR_PKT_ID) except: pass return False def analyse_par2(name, filepath=None): """ Check if file is a par2-file and determine vol/block return setname, vol, block setname is empty when not a par2 file """ name = name.strip() vol = block = 0 m = PROBABLY_PAR2_RE.search(name) if m: setname = m.group(1) vol = m.group(2) block = m.group(3) else: # Base-par2 file setname = os.path.splitext(name)[0].strip() # Could not parse the filename, need deep inspection # We already know it's a par2 from the is_parfile if filepath: try: # Quick loop to find number blocks # Assumes blocks are larger than 128 bytes # Worst case, we only count 1, still good with open(filepath, "rb") as f: buf = f.read(128) while buf: if PAR_RECOVERY_ID in buf: block += 1 buf = f.read(128) except: pass return setname, vol, block def parse_par2_file(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, filehash, hash16k = parse_par2_file_packet(f, header) if name: table[name] = filehash if hash16k not in nzf.nzo.md5of16k: nzf.nzo.md5of16k[hash16k] = name elif nzf.nzo.md5of16k[hash16k] != name: # Not unique and not already linked to this file # 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) logging.info("Traceback: ", exc_info=True) 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) return table def parse_par2_file_packet(f, header): """ Look up and analyze a FileDesc package """ nothing = None, None, None if header != PAR_PKT_ID: return nothing # Length must be multiple of 4 and at least 20 pack_len = struct.unpack(" # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.panic - Send panic message to the browser """ import os import logging import tempfile import ctypes try: import webbrowser except ImportError: webbrowser = None import sabnzbd import sabnzbd.cfg as cfg from sabnzbd.encoding import utob PANIC_PORT = 1 PANIC_TEMPL = 2 PANIC_QUEUE = 3 PANIC_OTHER = 5 PANIC_SQLITE = 7 PANIC_HOST = 8 def MSG_BAD_NEWS(): return r''' ''' + T('Problem with') + ''' %s %s

%s %s

 

%s

%s
''' def MSG_BAD_PORT(): return T(r''' SABnzbd needs a free tcp/ip port for its internal web server.
Port %s on %s was tried , but it is not available.
Some other software uses the port or SABnzbd is already running.

Please restart SABnzbd with a different port number.''') + \ '''

%s
    %s --server %s:%s

''' + \ T(r'If you get this error message again, please try a different number.
') def MSG_BAD_HOST(): return T(r''' SABnzbd needs a valid host address for its internal web server.
You have specified an invalid address.
Safe values are localhost and 0.0.0.0

Please restart SABnzbd with a proper host address.''') + \ '''

%s
    %s --server %s:%s

''' def MSG_BAD_QUEUE(): return T(r''' SABnzbd detected saved data from an other SABnzbd version
but cannot re-use the data of the other program.

You may want to finish your queue first with the other program.

After that, start this program with the "--clean" option.
This will erase the current queue and history!
SABnzbd read the file "%s".''') + \ '''

%s
    %s --clean

''' def MSG_BAD_TEMPL(): return T(r''' SABnzbd cannot find its web interface files in %s.
Please install the program again.

''') def MSG_OTHER(): return T('SABnzbd detected a fatal error:') + '
%s

%s
' def MSG_SQLITE(): return T(r''' SABnzbd detected that the file sqlite3.dll is missing.

Some poorly designed virus-scanners remove this file.
Please check your virus-scanner, try to re-install SABnzbd and complain to your virus-scanner vendor.

''') def panic_message(panic_code, a=None, b=None): """ Create the panic message from templates """ if sabnzbd.WIN32: os_str = T('Press Startkey+R and type the line (example):') prog_path = '"%s"' % sabnzbd.MY_FULLNAME else: os_str = T('Open a Terminal window and type the line (example):') prog_path = sabnzbd.MY_FULLNAME if panic_code == PANIC_PORT: newport = int(b) + 1 newport = "%s" % newport msg = MSG_BAD_PORT() % (b, a, os_str, prog_path, a, newport) elif panic_code == PANIC_TEMPL: msg = MSG_BAD_TEMPL() % a elif panic_code == PANIC_QUEUE: msg = MSG_BAD_QUEUE() % (a, os_str, prog_path) elif panic_code == PANIC_SQLITE: msg = MSG_SQLITE() elif panic_code == PANIC_HOST: msg = MSG_BAD_HOST() % (os_str, prog_path, 'localhost', b) else: msg = MSG_OTHER() % (a, b) msg = MSG_BAD_NEWS() % (sabnzbd.MY_NAME, sabnzbd.__version__, sabnzbd.MY_NAME, sabnzbd.__version__, msg, T('Program did not start!')) if sabnzbd.WIN_SERVICE: sabnzbd.WIN_SERVICE.ErrLogger('Panic exit', msg) if (not cfg.autobrowser()) or sabnzbd.DAEMON: return msgfile, url = tempfile.mkstemp(suffix='.html') os.write(msgfile, utob(msg)) os.close(msgfile) return url def panic_port(host, port): show_error_dialog("\n%s:\n %s" % (T('Fatal error'), T('Unable to bind to port %s on %s. Some other software uses the port or SABnzbd is already running.') % (port, host))) launch_a_browser(panic_message(PANIC_PORT, host, port)) def panic_host(host, port): launch_a_browser(panic_message(PANIC_HOST, host, port)) def panic_queue(name): launch_a_browser(panic_message(PANIC_QUEUE, name, 0)) def panic_tmpl(name): launch_a_browser(panic_message(PANIC_TEMPL, name, 0)) def panic(reason, remedy=""): show_error_dialog("\n%s:\n %s\n%s" % (T('Fatal error'), reason, remedy)) launch_a_browser(panic_message(PANIC_OTHER, reason, remedy)) def launch_a_browser(url, force=False): """ Launch a browser pointing to the URL """ if not force and not cfg.autobrowser() or sabnzbd.DAEMON: return if '::1' in url and '[::1]' not in url: # Get around idiosyncrasy in Python runtime url = url.replace('::1', '[::1]') if cfg.enable_https() and not cfg.https_port.get_int(): # Must use https, because http is not available url = url.replace('http:', 'https:') if 'localhost' in url and not cfg.ipv6_hosting(): url = url.replace('localhost', '127.0.0.1') logging.info("Launching browser with %s", url) try: if url and not url.startswith('http'): url = 'file:///%s' % url if webbrowser: webbrowser.open(url, 2, 1) else: logging.info('Not showing panic message in webbrowser, no support found') except: logging.warning(T('Cannot launch the browser, probably not found')) logging.info("Traceback: ", exc_info=True) def show_error_dialog(msg): """ Show a pop-up when program cannot start Windows-only, otherwise only print to console """ if sabnzbd.WIN32: ctypes.windll.user32.MessageBoxW(0, msg, T('Fatal error'), 0) print(msg) def error_page_401(status, message, traceback, version): """ Custom handler for 401 error """ title = T('Access denied') body = T('Error %s: You need to provide a valid username and password.') % status return r''' %s

%s ''' % (title, body) def error_page_404(status, message, traceback, version): """ Custom handler for 404 error, redirect to main page """ return r'''
''' % cfg.url_base() sabnzbd-develop/sabnzbd/notifier.py0000600000175000017500000003153113642116632015554 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # """ sabnzbd.notifier - Send notifications to any notification services """ import os.path import logging import urllib.request, urllib.error, urllib.parse import http.client import subprocess import json from threading import Thread import sabnzbd import sabnzbd.cfg from sabnzbd.encoding import platform_btou from sabnzbd.filesystem import make_script_path from sabnzbd.newsunpack import external_script if sabnzbd.FOUNDATION: import Foundation import objc try: import notify2 _HAVE_NTFOSD = True # Check for working version, not all pynotify are the same # Without DISPLAY, notify2 cannot autolaunch a dbus-daemon if not hasattr(notify2, "init") or "DISPLAY" not in os.environ: _HAVE_NTFOSD = False except: _HAVE_NTFOSD = False ############################################################################## # Define translatable message table ############################################################################## TT = lambda x: x NOTIFICATION = { "startup": TT("Startup/Shutdown"), #: Notification "download": TT("Added NZB"), #: Notification "pp": TT("Post-processing started"), # : Notification "complete": TT("Job finished"), #: Notification "failed": TT("Job failed"), #: Notification "warning": TT("Warning"), #: Notification "error": TT("Error"), #: Notification "disk_full": TT("Disk full"), #: Notification "queue_done": TT("Queue finished"), #: Notification "new_login": TT("User logged in"), #: Notification "other": TT("Other Messages"), #: Notification } def get_icon(): icon = os.path.join(os.path.join(sabnzbd.DIR_PROG, "icons"), "sabnzbd.ico") if not os.path.isfile(icon): icon = os.path.join(sabnzbd.DIR_PROG, "sabnzbd.ico") if os.path.isfile(icon): fp = open(icon, "rb") icon = fp.read() fp.close() else: icon = None return icon def have_ntfosd(): """ Return if any PyNotify (notify2) support is present """ return bool(_HAVE_NTFOSD) def check_classes(gtype, section): """ Check if `gtype` is enabled in `section` """ try: return sabnzbd.config.get_config(section, "%s_prio_%s" % (section, gtype))() > 0 except TypeError: logging.debug("Incorrect Notify option %s:%s_prio_%s", section, section, gtype) return False def get_prio(gtype, section): """ Check prio of `gtype` in `section` """ try: return sabnzbd.config.get_config(section, "%s_prio_%s" % (section, gtype))() except TypeError: logging.debug("Incorrect Notify option %s:%s_prio_%s", section, section, gtype) return -1000 def check_cat(section, job_cat, keyword=None): """ Check if `job_cat` is enabled in `section`. * = All, if no other categories selected. """ if not job_cat: return True try: if not keyword: keyword = section section_cats = sabnzbd.config.get_config(section, "%s_cats" % keyword)() return ["*"] == section_cats or job_cat in section_cats except TypeError: logging.debug("Incorrect Notify option %s:%s_cats", section, section) return True def send_notification(title, msg, gtype, job_cat=None): """ Send Notification message """ # Notification Center if sabnzbd.DARWIN and sabnzbd.cfg.ncenter_enable(): if check_classes(gtype, "ncenter") and check_cat("ncenter", job_cat): send_notification_center(title, msg, gtype) # Windows if sabnzbd.WIN32 and sabnzbd.cfg.acenter_enable(): if check_classes(gtype, "acenter") and check_cat("acenter", job_cat): send_windows(title, msg, gtype) # Prowl if sabnzbd.cfg.prowl_enable() and check_cat("prowl", job_cat): if sabnzbd.cfg.prowl_apikey(): Thread(target=send_prowl, args=(title, msg, gtype)).start() # Pushover if sabnzbd.cfg.pushover_enable() and check_cat("pushover", job_cat): if sabnzbd.cfg.pushover_token(): Thread(target=send_pushover, args=(title, msg, gtype)).start() # Pushbullet if sabnzbd.cfg.pushbullet_enable() and check_cat("pushbullet", job_cat): if sabnzbd.cfg.pushbullet_apikey() and check_classes(gtype, "pushbullet"): Thread(target=send_pushbullet, args=(title, msg, gtype)).start() # Notification script. if sabnzbd.cfg.nscript_enable() and check_cat("nscript", job_cat): if sabnzbd.cfg.nscript_script(): Thread(target=send_nscript, args=(title, msg, gtype)).start() # NTFOSD if have_ntfosd() and sabnzbd.cfg.ntfosd_enable(): if check_classes(gtype, "ntfosd") and check_cat("ntfosd", job_cat): send_notify_osd(title, msg) ############################################################################## # Ubuntu NotifyOSD Support ############################################################################## _NTFOSD = False def send_notify_osd(title, message): """ Send a message to NotifyOSD """ global _NTFOSD if not _HAVE_NTFOSD: return T("Not available") # : Function is not available on this OS error = "NotifyOSD not working" icon = os.path.join(sabnzbd.DIR_PROG, "icons", "sabnzbd.ico") _NTFOSD = _NTFOSD or notify2.init("icon-summary-body") if _NTFOSD: logging.info("Send to NotifyOSD: %s / %s", title, message) try: note = notify2.Notification(title, message, icon) note.show() except: # Apparently not implemented on this system logging.info(error) return error return None else: return error def send_notification_center(title, msg, gtype): """ Send message to macOS Notification Center """ try: NSUserNotification = objc.lookUpClass("NSUserNotification") NSUserNotificationCenter = objc.lookUpClass("NSUserNotificationCenter") notification = NSUserNotification.alloc().init() notification.setTitle_(title) notification.setSubtitle_(T(NOTIFICATION.get(gtype, "other"))) notification.setInformativeText_(msg) notification.setSoundName_("NSUserNotificationDefaultSoundName") notification.setDeliveryDate_(Foundation.NSDate.dateWithTimeInterval_sinceDate_(0, Foundation.NSDate.date())) NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification_(notification) except: logging.info(T("Failed to send macOS notification")) logging.debug("Traceback: ", exc_info=True) return T("Failed to send macOS notification") def send_prowl(title, msg, gtype, force=False, test=None): """ Send message to Prowl """ if test: apikey = test.get("prowl_apikey") else: apikey = sabnzbd.cfg.prowl_apikey() if not apikey: return T("Cannot send, missing required data") title = T(NOTIFICATION.get(gtype, "other")) title = urllib.parse.quote(title.encode("utf8")) msg = urllib.parse.quote(msg.encode("utf8")) prio = get_prio(gtype, "prowl") if force: prio = 0 if prio > -3: url = ( "https://api.prowlapp.com/publicapi/add?apikey=%s&application=SABnzbd" "&event=%s&description=%s&priority=%d" % (apikey, title, msg, prio) ) try: urllib.request.urlopen(url) return "" except: logging.warning(T("Failed to send Prowl message")) logging.info("Traceback: ", exc_info=True) return T("Failed to send Prowl message") return "" def send_pushover(title, msg, gtype, force=False, test=None): """ Send message to pushover """ if test: apikey = test.get("pushover_token") userkey = test.get("pushover_userkey") device = test.get("pushover_device") else: apikey = sabnzbd.cfg.pushover_token() userkey = sabnzbd.cfg.pushover_userkey() device = sabnzbd.cfg.pushover_device() emergency_retry = sabnzbd.cfg.pushover_emergency_retry() emergency_expire = sabnzbd.cfg.pushover_emergency_expire() if not apikey or not userkey: return T("Cannot send, missing required data") title = T(NOTIFICATION.get(gtype, "other")) prio = get_prio(gtype, "pushover") if force: prio = 1 if prio == 2: body = { "token": apikey, "user": userkey, "device": device, "title": title, "message": msg, "priority": prio, "retry": emergency_retry, "expire": emergency_expire, } return do_send_pushover(body) if -3 < prio < 2: body = { "token": apikey, "user": userkey, "device": device, "title": title, "message": msg, "priority": prio, } return do_send_pushover(body) def do_send_pushover(body): try: conn = http.client.HTTPSConnection("api.pushover.net:443") conn.request( "POST", "/1/messages.json", urllib.parse.urlencode(body), {"Content-type": "application/x-www-form-urlencoded"}, ) res = conn.getresponse() if res.status != 200: logging.error(T("Bad response from Pushover (%s): %s"), res.status, res.read()) return T("Failed to send pushover message") else: return "" except: logging.warning(T("Failed to send pushover message")) logging.info("Traceback: ", exc_info=True) return T("Failed to send pushover message") def send_pushbullet(title, msg, gtype, force=False, test=None): """ Send message to Pushbullet """ if test: apikey = test.get("pushbullet_apikey") device = test.get("pushbullet_device") else: apikey = sabnzbd.cfg.pushbullet_apikey() device = sabnzbd.cfg.pushbullet_device() if not apikey: return T("Cannot send, missing required data") title = "SABnzbd: " + T(NOTIFICATION.get(gtype, "other")) try: conn = http.client.HTTPSConnection("api.pushbullet.com:443") conn.request( "POST", "/v2/pushes", json.dumps({"type": "note", "device": device, "title": title, "body": msg}), headers={"Authorization": "Bearer " + apikey, "Content-type": "application/json"}, ) res = conn.getresponse() if res.status != 200: logging.error(T("Bad response from Pushbullet (%s): %s"), res.status, res.read()) else: logging.info("Successfully sent to Pushbullet") except: logging.warning(T("Failed to send pushbullet message")) logging.info("Traceback: ", exc_info=True) return T("Failed to send pushbullet message") return "" def send_nscript(title, msg, gtype, force=False, test=None): """ Run user's notification script """ if test: script = test.get("nscript_script") parameters = test.get("nscript_parameters") else: script = sabnzbd.cfg.nscript_script() parameters = sabnzbd.cfg.nscript_parameters() if not script: return T("Cannot send, missing required data") title = "SABnzbd: " + T(NOTIFICATION.get(gtype, "other")) if force or check_classes(gtype, "nscript"): script_path = make_script_path(script) if script_path: output, ret = external_script(script_path, gtype, title, msg, parameters) if ret: logging.error(T('Script returned exit code %s and output "%s"') % (ret, output)) return T('Script returned exit code %s and output "%s"') % (ret, output) else: logging.info("Successfully executed notification script " + script_path) else: return T('Notification script "%s" does not exist') % script_path return "" def send_windows(title, msg, gtype): if sabnzbd.WINTRAY and not sabnzbd.WINTRAY.terminate: try: sabnzbd.WINTRAY.sendnotification(title, msg) except: logging.info(T("Failed to send Windows notification")) logging.debug("Traceback: ", exc_info=True) return T("Failed to send Windows notification") return None sabnzbd-develop/sabnzbd/interface.py0000600000175000017500000030367313642116632015706 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.interface - webinterface """ import os import time from datetime import datetime import cherrypy import logging import urllib.request, urllib.parse, urllib.error import json import re import hashlib import socket import ssl import functools from threading import Thread from random import randint from xml.sax.saxutils import escape import sabnzbd import sabnzbd.rss import sabnzbd.scheduler as scheduler from Cheetah.Template import Template from sabnzbd.misc import to_units, from_units, time_format, calc_age, \ int_conv, get_base_url, probablyipv4, probablyipv6 from sabnzbd.filesystem import real_path, long_path, globber, globber_full, remove_all, \ clip_path, same_file from sabnzbd.newswrapper import GetServerParms from sabnzbd.bpsmeter import BPSMeter from sabnzbd.encoding import xml_name, utob import sabnzbd.config as config import sabnzbd.cfg as cfg import sabnzbd.notifier as notifier import sabnzbd.newsunpack from sabnzbd.downloader import Downloader from sabnzbd.nzbqueue import NzbQueue from sabnzbd.utils.servertests import test_nntp_server_dict from sabnzbd.decoder import SABYENC_ENABLED from sabnzbd.utils.diskspeed import diskspeedmeasure from sabnzbd.utils.getperformance import getpystone from sabnzbd.utils.internetspeed import internetspeed from sabnzbd.constants import NORMAL_PRIORITY, MEBI, DEF_SKIN_COLORS, \ DEF_STDCONFIG, DEF_MAIN_TMPL, DEFAULT_PRIORITY, CHEETAH_DIRECTIVES from sabnzbd.lang import list_languages from sabnzbd.api import list_scripts, list_cats, del_from_section, \ api_handler, build_queue, build_status, \ retry_job, retry_all_jobs, build_header, build_history, del_job_files, \ format_bytes, report, del_hist_job, Ttemplate, build_queue_header, \ _api_test_email, _api_test_notif ############################################################################## # Global constants ############################################################################## ############################################################################## # Security functions ############################################################################## def secured_expose(wrap_func=None, check_configlock=False, check_session_key=False): """ Wrapper for both cherrypy.expose and login/access check """ if not wrap_func: return functools.partial(secured_expose, check_configlock=check_configlock, check_session_key=check_session_key) # Expose to cherrypy wrap_func.exposed = True @functools.wraps(wrap_func) def internal_wrap(*args, **kwargs): # Add X-Frame-Headers headers to page-requests if cfg.x_frame_options(): cherrypy.response.headers['X-Frame-Options'] = 'SameOrigin' # Check if config is locked if check_configlock and cfg.configlock(): cherrypy.response.status = 403 return 'Access denied - Configuration locked' # Check if external access if not check_access(): cherrypy.response.status = 403 return 'Access denied' # Verify login status, only for non-key pages if not check_login() and not check_session_key: raise Raiser('/login/') # Verify host used for the visit if not check_hostname(): cherrypy.response.status = 403 return 'Access denied - Hostname verification failed: https://sabnzbd.org/hostname-check' # Some pages need correct session key if check_session_key: msg = check_session(kwargs) if msg: return msg # All good, cool! return wrap_func(*args, **kwargs) return internal_wrap def check_access(access_type=4): """ Check if external address is allowed given access_type: 1=nzb 2=api 3=full_api 4=webui 5=webui with login for external """ referrer = cherrypy.request.remote.ip # CherryPy will report ::ffff:192.168.0.10 on dual-stack situation # It will always contain that ::ffff: prefix range_ok = not cfg.local_ranges() or bool([1 for r in cfg.local_ranges() if (referrer.startswith(r) or referrer.replace('::ffff:', '').startswith(r))]) allowed = referrer in ('127.0.0.1', '::ffff:127.0.0.1', '::1') or range_ok or access_type <= cfg.inet_exposure() if not allowed: logging.debug('Refused connection from %s', referrer) return allowed def check_hostname(): """ Check if hostname is allowed, to mitigate DNS-rebinding attack. Similar to CVE-2019-5702, we need to add protection even if only allowed to be accessed via localhost. """ # If login is enabled, no API-key can be deducted if cfg.username() and cfg.password(): return True # Don't allow requests without Host host = cherrypy.request.headers.get('Host') if not host: return False # Remove the port-part (like ':8080'), if it is there, always on the right hand side. # Not to be confused with IPv6 colons (within square brackets) host = re.sub(':[0123456789]+$', '', host).lower() # Fine if localhost or IP if host == 'localhost' or probablyipv4(host) or probablyipv6(host): return True # Check on the whitelist if host in cfg.host_whitelist(): return True # Fine if ends with ".local" or ".local.", aka mDNS name # See rfc6762 Multicast DNS if host.endswith(('.local', '.local.')): return True # Ohoh, bad log_warning_and_ip(T('Refused connection with hostname "%s" from:') % host) return False # Create a more unique ID for each instance COOKIE_SECRET = str(randint(1000,100000)*os.getpid()) def set_login_cookie(remove=False, remember_me=False): """ We try to set a cookie as unique as possible to the current user. Based on it's IP and the current process ID of the SAB instance and a random number, so cookies cannot be re-used """ salt = randint(1, 1000) cookie_str = utob(str(salt) + cherrypy.request.remote.ip + COOKIE_SECRET) cherrypy.response.cookie['login_cookie'] = hashlib.sha1(cookie_str).hexdigest() cherrypy.response.cookie['login_cookie']['path'] = '/' cherrypy.response.cookie['login_cookie']['httponly'] = 1 cherrypy.response.cookie['login_salt'] = salt cherrypy.response.cookie['login_salt']['path'] = '/' cherrypy.response.cookie['login_salt']['httponly'] = 1 # If we want to be remembered if remember_me: cherrypy.response.cookie['login_cookie']['max-age'] = 3600*24*14 cherrypy.response.cookie['login_salt']['max-age'] = 3600*24*14 # To remove if remove: cherrypy.response.cookie['login_cookie']['expires'] = 0 cherrypy.response.cookie['login_salt']['expires'] = 0 else: # Notify about new login notifier.send_notification(T('User logged in'), T('User logged in to the web interface'), 'new_login') def check_login_cookie(): # Do we have everything? if 'login_cookie' not in cherrypy.request.cookie or 'login_salt' not in cherrypy.request.cookie: return False cookie_str = utob(str(cherrypy.request.cookie['login_salt'].value) + cherrypy.request.remote.ip + COOKIE_SECRET) return cherrypy.request.cookie['login_cookie'].value == hashlib.sha1(cookie_str).hexdigest() def check_login(): # Not when no authentication required or basic-auth is on if not cfg.html_login() or not cfg.username() or not cfg.password(): return True # If we show login for external IP, by using access_type=6 we can check if IP match if cfg.inet_exposure() == 5 and check_access(access_type=6): return True # Check the cookie return check_login_cookie() def get_users(): users = {cfg.username(): cfg.password()} return users def encrypt_pwd(pwd): return pwd def set_auth(conf): """ Set the authentication for CherryPy """ if cfg.username() and cfg.password() and not cfg.html_login(): conf.update({'tools.auth_basic.on': True, 'tools.auth_basic.realm': 'SABnzbd', 'tools.auth_basic.users': get_users, 'tools.auth_basic.encrypt': encrypt_pwd}) conf.update({'/api': {'tools.auth_basic.on': False}, '%s/api' % cfg.url_base(): {'tools.auth_basic.on': False}, }) else: conf.update({'tools.auth_basic.on': False}) def check_session(kwargs): """ Check session key """ if not check_access(): return 'Access denied' key = kwargs.get('session') if not key: key = kwargs.get('apikey') msg = None if not key: log_warning_and_ip(T('Missing Session key')) msg = T('Error: Session Key Required') elif key != cfg.api_key(): log_warning_and_ip(T('Error: Session Key Incorrect')) msg = T('Error: Session Key Incorrect') return msg def check_apikey(kwargs, nokey=False): """ Check api key or nzbkey Return None when OK, otherwise an error message """ output = kwargs.get('output') mode = kwargs.get('mode', '') name = kwargs.get('name', '') # Lookup required access level req_access = sabnzbd.api.api_level(mode, name) if req_access == 1 and check_access(1): # NZB-only actions pass elif not check_access(req_access): return report(output, 'Access denied') # First check APIKEY, if OK that's sufficient if not (cfg.disable_key() or nokey): key = kwargs.get('apikey') if not key: key = kwargs.get('session') if not key: if cfg.api_warnings(): log_warning_and_ip(T('API Key missing, please enter the api key from Config->General into your 3rd party program:')) return report(output, 'API Key Required') elif req_access == 1 and key == cfg.nzb_key(): return None elif key == cfg.api_key(): return None else: log_warning_and_ip(T('API Key incorrect, Use the api key from Config->General in your 3rd party program:')) return report(output, 'API Key Incorrect') # No active APIKEY, check web credentials instead if cfg.username() and cfg.password(): if check_login() or (kwargs.get('ma_username') == cfg.username() and kwargs.get('ma_password') == cfg.password()): pass else: if cfg.api_warnings(): log_warning_and_ip(T('Authentication missing, please enter username/password from Config->General into your 3rd party program:')) return report(output, 'Missing authentication') return None def log_warning_and_ip(txt): """ Include the IP and the Proxy-IP for warnings """ # Was it proxy forwarded? xff = cherrypy.request.headers.get('X-Forwarded-For') if xff: txt = '%s %s (X-Forwarded-For: %s)>%s' % (txt, cherrypy.request.remote.ip, xff, cherrypy.request.headers.get('User-Agent', '??')) else: txt = '%s %s>%s' % (txt, cherrypy.request.remote.ip, cherrypy.request.headers.get('User-Agent', '??')) logging.warning('%s', txt) ############################################################################## # Helper raiser functions ############################################################################## def Raiser(root='', **kwargs): args = {} for key in kwargs: val = kwargs.get(key) if val: args[key] = val # Add extras if args: root = '%s?%s' % (root, urllib.parse.urlencode(args)) # Optionally add the leading /sabnzbd/ (or what the user set) if not root.startswith(cfg.url_base()): root = cherrypy.request.script_name + root # Send the redirect return cherrypy.HTTPRedirect(root) def queueRaiser(root, kwargs): return Raiser(root, start=kwargs.get('start'), limit=kwargs.get('limit'), search=kwargs.get('search')) def rssRaiser(root, kwargs): return Raiser(root, feed=kwargs.get('feed')) ############################################################################## # Page definitions ############################################################################## class MainPage: def __init__(self): self.__root = '/' # Add all sub-pages self.login = LoginPage() self.queue = QueuePage('/queue/') self.history = HistoryPage('/history/') self.status = Status('/status/') self.config = ConfigPage('/config/') self.nzb = NzoPage('/nzb/') self.wizard = Wizard('/wizard/') @secured_expose def index(self, **kwargs): if not cfg.notified_new_skin() and cfg.web_dir() != 'Glitter': logging.warning(T('Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin.')) if not cfg.notified_new_skin(): cfg.notified_new_skin.set(1) config.save_config() if kwargs.get('skip_wizard') or config.get_servers(): info = build_header() info['scripts'] = list_scripts(default=True) info['script'] = 'Default' info['cat'] = 'Default' info['categories'] = list_cats(True) info['have_rss_defined'] = bool(config.get_rss()) info['have_watched_dir'] = bool(cfg.dirscan_dir()) # Have logout only with HTML and if inet=5, only when we are external info['have_logout'] = cfg.username() and cfg.password() and (cfg.html_login() and (cfg.inet_exposure() < 5 or (cfg.inet_exposure() == 5 and not check_access(access_type=6)))) bytespersec_list = BPSMeter.do.get_bps_list() info['bytespersec_list'] = ','.join([str(bps) for bps in bytespersec_list]) template = Template(file=os.path.join(sabnzbd.WEB_DIR, 'main.tmpl'), searchList=[info], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() else: # Redirect to the setup wizard raise cherrypy.HTTPRedirect('%s/wizard/' % cfg.url_base()) @secured_expose(check_session_key=True) def shutdown(self, **kwargs): # Check for PID pid_in = kwargs.get('pid') if pid_in and int(pid_in) != os.getpid(): return "Incorrect PID for this instance, remove PID from URL to initiate shutdown." sabnzbd.shutdown_program() return T('SABnzbd shutdown finished') @secured_expose(check_session_key=True) def pause(self, **kwargs): scheduler.plan_resume(0) Downloader.do.pause() raise Raiser(self.__root) @secured_expose(check_session_key=True) def resume(self, **kwargs): scheduler.plan_resume(0) sabnzbd.unpause_all() raise Raiser(self.__root) @cherrypy.expose def tapi(self, **kwargs): """ Handler for API over http, for template use """ msg = check_apikey(kwargs) if msg: return msg return api_handler(kwargs) @cherrypy.expose def api(self, **kwargs): """ Handler for API over http, with explicit authentication parameters """ if cfg.api_logging(): # Was it proxy forwarded? xff = cherrypy.request.headers.get('X-Forwarded-For') if xff: logging.debug('API-call from %s (X-Forwarded-For: %s) [%s] %s', cherrypy.request.remote.ip, xff, cherrypy.request.headers.get('User-Agent', '??'), kwargs) else: logging.debug('API-call from %s [%s] %s', cherrypy.request.remote.ip, cherrypy.request.headers.get('User-Agent', '??'), kwargs) mode = kwargs.get('mode', '') if isinstance(mode, list): mode = mode[0] kwargs['mode'] = mode name = kwargs.get('name', '') if isinstance(name, list): name = name[0] kwargs['name'] = name if mode not in ('version', 'auth'): msg = check_apikey(kwargs) if msg: return msg return api_handler(kwargs) @secured_expose def scriptlog(self, **kwargs): """ Duplicate of scriptlog of History, needed for some skins """ # No session key check, due to fixed URLs name = kwargs.get('name') if name: history_db = sabnzbd.get_db_connection() return ShowString(history_db.get_name(name), history_db.get_script_log(name)) else: raise Raiser(self.__root) @secured_expose(check_session_key=True) def retry(self, **kwargs): """ Duplicate of retry of History, needed for some skins """ job = kwargs.get('job', '') url = kwargs.get('url', '').strip() pp = kwargs.get('pp') cat = kwargs.get('cat') script = kwargs.get('script') if url: sabnzbd.add_url(url, pp, script, cat, nzbname=kwargs.get('nzbname')) del_hist_job(job, del_files=True) raise Raiser(self.__root) @secured_expose(check_session_key=True) def retry_pp(self, **kwargs): # Duplicate of History/retry_pp to please the SMPL skin :( retry_job(kwargs.get('job'), kwargs.get('nzbfile'), kwargs.get('password')) raise Raiser(self.__root) @secured_expose def robots_txt(self, **kwargs): """ Keep web crawlers out """ cherrypy.response.headers['Content-Type'] = 'text/plain' return 'User-agent: *\nDisallow: /\n' ############################################################################## class Wizard: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): """ Show the language selection page """ if sabnzbd.WIN32: import util.apireg cfg.language.set(util.apireg.get_install_lng()) logging.debug('Installer language code "%s"', cfg.language()) info = build_header(sabnzbd.WIZARD_DIR) info['languages'] = list_languages() template = Template(file=os.path.join(sabnzbd.WIZARD_DIR, 'index.html'), searchList=[info], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_configlock=True) def one(self, **kwargs): """ Accept language and show server page """ if kwargs.get('lang'): cfg.language.set(kwargs.get('lang')) # Always setup Glitter change_web_dir('Glitter - Default') info = build_header(sabnzbd.WIZARD_DIR) info['certificate_validation'] = sabnzbd.CERTIFICATE_VALIDATION # Just in case, add server servers = config.get_servers() if not servers: info['host'] = '' info['port'] = '' info['username'] = '' info['password'] = '' info['connections'] = '' info['ssl'] = 0 info['ssl_verify'] = 2 else: # Sort servers to get the first enabled one server_names = sorted(servers.keys(), key=lambda svr: '%d%02d%s' % (int(not servers[svr].enable()), servers[svr].priority(), servers[svr].displayname().lower())) for server in server_names: # If there are multiple servers, just use the first enabled one s = servers[server] info['host'] = s.host() info['port'] = s.port() info['username'] = s.username() info['password'] = s.password.get_stars() info['connections'] = s.connections() info['ssl'] = s.ssl() info['ssl_verify'] = s.ssl_verify() if s.enable(): break template = Template(file=os.path.join(sabnzbd.WIZARD_DIR, 'one.html'), searchList=[info], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_configlock=True) def two(self, **kwargs): """ Accept server and show the final page for restart """ # Save server details if kwargs: kwargs['enable'] = 1 handle_server(kwargs) config.save_config() # Show Restart screen info = build_header(sabnzbd.WIZARD_DIR) info['access_url'], info['urls'] = get_access_info() info['download_dir'] = cfg.download_dir.get_clipped_path() info['complete_dir'] = cfg.complete_dir.get_clipped_path() template = Template(file=os.path.join(sabnzbd.WIZARD_DIR, 'two.html'), searchList=[info], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose def exit(self, **kwargs): """ Stop SABnzbd """ sabnzbd.shutdown_program() return T('SABnzbd shutdown finished') def get_access_info(): """ Build up a list of url's that sabnzbd can be accessed from """ # Access_url is used to provide the user a link to sabnzbd depending on the host access_uri = 'localhost' cherryhost = cfg.cherryhost() if cherryhost == '0.0.0.0': host = socket.gethostname() socks = [host] # Grab a list of all ips for the hostname try: addresses = socket.getaddrinfo(host, None) except: addresses = [] for addr in addresses: address = addr[4][0] # Filter out ipv6 addresses (should not be allowed) if ':' not in address and address not in socks: socks.append(address) if "host" in cherrypy.request.headers: host = cherrypy.request.headers['host'] host = host.rsplit(':')[0] access_uri = host socks.insert(0, host) else: socks.insert(0, 'localhost') elif cherryhost == '::': host = socket.gethostname() socks = [host] # Grab a list of all ips for the hostname addresses = socket.getaddrinfo(host, None) for addr in addresses: address = addr[4][0] # Only ipv6 addresses will work if ':' in address: address = '[%s]' % address if address not in socks: socks.append(address) if "host" in cherrypy.request.headers: host = cherrypy.request.headers['host'] host = host.rsplit(':')[0] access_uri = host socks.insert(0, host) else: socks.insert(0, 'localhost') elif not cherryhost: socks = [socket.gethostname()] access_uri = socket.gethostname() else: socks = [cherryhost] access_uri = cherryhost urls = [] for sock in socks: if sock: if cfg.enable_https() and cfg.https_port(): url = 'https://%s:%s%s' % (sock, cfg.https_port(), cfg.url_base()) elif cfg.enable_https(): url = 'https://%s:%s%s' % (sock, cfg.cherryport(), cfg.url_base()) else: url = 'http://%s:%s%s' % (sock, cfg.cherryport(), cfg.url_base()) urls.append(url) if cfg.enable_https() and cfg.https_port(): access_url = 'https://%s:%s%s' % (sock, cfg.https_port(), cfg.url_base()) elif cfg.enable_https(): access_url = 'https://%s:%s%s' % (access_uri, cfg.cherryport(), cfg.url_base()) else: access_url = 'http://%s:%s%s' % (access_uri, cfg.cherryport(), cfg.url_base()) return access_url, urls ############################################################################## class LoginPage: @cherrypy.expose def index(self, **kwargs): # Base output var info = build_header(sabnzbd.WEB_DIR_CONFIG) info['error'] = '' # Logout? if kwargs.get('logout'): set_login_cookie(remove=True) raise Raiser() # Check if there's even a username/password set if check_login(): raise Raiser(cherrypy.request.script_name + '/') # Was it proxy forwarded? xff = cherrypy.request.headers.get('X-Forwarded-For') # Check login info if kwargs.get('username') == cfg.username() and kwargs.get('password') == cfg.password(): # Save login cookie set_login_cookie(remember_me=kwargs.get('remember_me', False)) # Log the succes if xff: logging.info('Successful login from %s (X-Forwarded-For: %s)', cherrypy.request.remote.ip, xff) else: logging.info('Successful login from %s', cherrypy.request.remote.ip) # Redirect raise Raiser(cherrypy.request.script_name + '/') elif kwargs.get('username') or kwargs.get('password'): info['error'] = T('Authentication failed, check username/password.') # Warn about the potential security problem fail_msg = T('Unsuccessful login attempt from %s') % cherrypy.request.remote.ip if xff: fail_msg = '%s (X-Forwarded-For: %s)' % (fail_msg, xff) logging.warning(fail_msg) # Show login template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'login', 'main.tmpl'), searchList=[info], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() ############################################################################## class NzoPage: def __init__(self, root): self.__root = root self.__cached_selection = {} # None @secured_expose def default(self, *args, **kwargs): # Allowed URL's # /nzb/SABnzbd_nzo_xxxxx/ # /nzb/SABnzbd_nzo_xxxxx/details # /nzb/SABnzbd_nzo_xxxxx/files # /nzb/SABnzbd_nzo_xxxxx/bulk_operation # /nzb/SABnzbd_nzo_xxxxx/save nzo_id = None for a in args: if a.startswith('SABnzbd_nzo'): nzo_id = a break nzo = NzbQueue.do.get_nzo(nzo_id) if nzo_id and nzo: info, pnfo_list, bytespersec, q_size, bytes_left_previous_page = build_queue_header() # /SABnzbd_nzo_xxxxx/bulk_operation if 'bulk_operation' in args: return self.bulk_operation(nzo_id, kwargs) # /SABnzbd_nzo_xxxxx/details elif 'details' in args: info = self.nzo_details(info, pnfo_list, nzo_id) # /SABnzbd_nzo_xxxxx/files elif 'files' in args: info = self.nzo_files(info, nzo_id) # /SABnzbd_nzo_xxxxx/save elif 'save' in args: self.save_details(nzo_id, args, kwargs) return # never reached # /SABnzbd_nzo_xxxxx/ else: info = self.nzo_details(info, pnfo_list, nzo_id) info = self.nzo_files(info, nzo_id) template = Template(file=os.path.join(sabnzbd.WEB_DIR, 'nzo.tmpl'), searchList=[info], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() else: # Job no longer exists, go to main page raise Raiser(cherrypy.lib.httputil.urljoin(self.__root, '../queue/')) def nzo_details(self, info, pnfo_list, nzo_id): slot = {} n = 0 for pnfo in pnfo_list: if pnfo.nzo_id == nzo_id: nzo = NzbQueue.do.get_nzo(nzo_id) repair = pnfo.repair unpack = pnfo.unpack delete = pnfo.delete unpackopts = sabnzbd.opts_to_pp(repair, unpack, delete) script = pnfo.script if script is None: script = 'None' cat = pnfo.category if not cat: cat = 'None' filename_pw = nzo.final_name_pw_clean filename = nzo.final_name priority = pnfo.priority slot['nzo_id'] = str(nzo_id) slot['cat'] = cat slot['filename'] = filename_pw slot['filename_clean'] = filename slot['password'] = nzo.password or '' slot['script'] = script slot['priority'] = str(priority) slot['unpackopts'] = str(unpackopts) info['index'] = n break n += 1 info['slot'] = slot info['scripts'] = list_scripts() info['categories'] = list_cats() info['noofslots'] = len(pnfo_list) return info def nzo_files(self, info, nzo_id): active = [] nzo = NzbQueue.do.get_nzo(nzo_id) if nzo: pnfo = nzo.gather_info(full=True) info['nzo_id'] = pnfo.nzo_id info['filename'] = pnfo.filename for nzf in pnfo.active_files: checked = False if nzf.nzf_id in self.__cached_selection and \ self.__cached_selection[nzf.nzf_id] == 'on': checked = True active.append({'filename': nzf.filename if nzf.filename else nzf.subject, 'mbleft': "%.2f" % (nzf.bytes_left / MEBI), 'mb': "%.2f" % (nzf.bytes / MEBI), 'size': format_bytes(nzf.bytes), 'sizeleft': format_bytes(nzf.bytes_left), 'nzf_id': nzf.nzf_id, 'age': calc_age(nzf.date), 'checked': checked}) info['active_files'] = active return info def save_details(self, nzo_id, args, kwargs): index = kwargs.get('index', None) name = kwargs.get('name', None) password = kwargs.get('password', None) if password == "": password = None pp = kwargs.get('pp', None) script = kwargs.get('script', None) cat = kwargs.get('cat', None) priority = kwargs.get('priority', None) nzo = NzbQueue.do.get_nzo(nzo_id) if index is not None: NzbQueue.do.switch(nzo_id, index) if name is not None: NzbQueue.do.change_name(nzo_id, name, password) if cat is not None and nzo.cat is not cat and not (nzo.cat == '*' and cat == 'Default'): NzbQueue.do.change_cat(nzo_id, cat, priority) # Category changed, so make sure "Default" attributes aren't set again if script == 'Default': script = None if priority == 'Default': priority = None if pp == 'Default': pp = None if script is not None and nzo.script != script: NzbQueue.do.change_script(nzo_id, script) if pp is not None and nzo.pp != pp: NzbQueue.do.change_opts(nzo_id, pp) if priority is not None and nzo.priority != int(priority): NzbQueue.do.set_priority(nzo_id, priority) raise Raiser(cherrypy.lib.httputil.urljoin(self.__root, '../queue/')) def bulk_operation(self, nzo_id, kwargs): self.__cached_selection = kwargs if kwargs['action_key'] == 'Delete': for key in kwargs: if kwargs[key] == 'on': NzbQueue.do.remove_nzf(nzo_id, key, force_delete=True) elif kwargs['action_key'] in ('Top', 'Up', 'Down', 'Bottom'): nzf_ids = [] for key in kwargs: if kwargs[key] == 'on': nzf_ids.append(key) size = int_conv(kwargs.get('action_size', 1)) if kwargs['action_key'] == 'Top': NzbQueue.do.move_top_bulk(nzo_id, nzf_ids) elif kwargs['action_key'] == 'Up': NzbQueue.do.move_up_bulk(nzo_id, nzf_ids, size) elif kwargs['action_key'] == 'Down': NzbQueue.do.move_down_bulk(nzo_id, nzf_ids, size) elif kwargs['action_key'] == 'Bottom': NzbQueue.do.move_bottom_bulk(nzo_id, nzf_ids) if NzbQueue.do.get_nzo(nzo_id): url = cherrypy.lib.httputil.urljoin(self.__root, nzo_id) else: url = cherrypy.lib.httputil.urljoin(self.__root, '../queue') if url and not url.endswith('/'): url += '/' raise Raiser(url) ############################################################################## class QueuePage: def __init__(self, root): self.__root = root @secured_expose def index(self, **kwargs): start = int_conv(kwargs.get('start')) limit = int_conv(kwargs.get('limit')) search = kwargs.get('search') info, _pnfo_list, _bytespersec = build_queue(start=start, limit=limit, trans=True, search=search) template = Template(file=os.path.join(sabnzbd.WEB_DIR, 'queue.tmpl'), searchList=[info], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True) def delete(self, **kwargs): uid = kwargs.get('uid') del_files = int_conv(kwargs.get('del_files')) if uid: NzbQueue.do.remove(uid, add_to_history=False, delete_all_data=del_files) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def purge(self, **kwargs): NzbQueue.do.remove_all(kwargs.get('search')) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def change_queue_complete_action(self, **kwargs): """ Action or script to be performed once the queue has been completed Scripts are prefixed with 'script_' """ action = kwargs.get('action') sabnzbd.change_queue_complete_action(action) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def switch(self, **kwargs): uid1 = kwargs.get('uid1') uid2 = kwargs.get('uid2') if uid1 and uid2: NzbQueue.do.switch(uid1, uid2) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def change_opts(self, **kwargs): nzo_id = kwargs.get('nzo_id') pp = kwargs.get('pp', '') if nzo_id and pp and pp.isdigit(): NzbQueue.do.change_opts(nzo_id, int(pp)) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def change_script(self, **kwargs): nzo_id = kwargs.get('nzo_id') script = kwargs.get('script', '') if nzo_id and script: if script == 'None': script = None NzbQueue.do.change_script(nzo_id, script) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def change_cat(self, **kwargs): nzo_id = kwargs.get('nzo_id') cat = kwargs.get('cat', '') if nzo_id and cat: if cat == 'None': cat = None NzbQueue.do.change_cat(nzo_id, cat) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def shutdown(self, **kwargs): sabnzbd.shutdown_program() return T('SABnzbd shutdown finished') @secured_expose(check_session_key=True) def pause(self, **kwargs): scheduler.plan_resume(0) Downloader.do.pause() raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def resume(self, **kwargs): scheduler.plan_resume(0) sabnzbd.unpause_all() raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def pause_nzo(self, **kwargs): uid = kwargs.get('uid', '') NzbQueue.do.pause_multiple_nzo(uid.split(',')) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def resume_nzo(self, **kwargs): uid = kwargs.get('uid', '') NzbQueue.do.resume_multiple_nzo(uid.split(',')) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def set_priority(self, **kwargs): NzbQueue.do.set_priority(kwargs.get('nzo_id'), kwargs.get('priority')) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def sort_by_avg_age(self, **kwargs): NzbQueue.do.sort_queue('avg_age', kwargs.get('dir')) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def sort_by_name(self, **kwargs): NzbQueue.do.sort_queue('name', kwargs.get('dir')) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def sort_by_size(self, **kwargs): NzbQueue.do.sort_queue('size', kwargs.get('dir')) raise queueRaiser(self.__root, kwargs) ############################################################################## class HistoryPage: def __init__(self, root): self.__root = root self.__failed_only = False @secured_expose def index(self, **kwargs): start = int_conv(kwargs.get('start')) limit = int_conv(kwargs.get('limit')) search = kwargs.get('search') failed_only = kwargs.get('failed_only') if failed_only is None: failed_only = self.__failed_only history = build_header() history['failed_only'] = failed_only history['rating_enable'] = bool(cfg.rating_enable()) postfix = T('B') # : Abbreviation for bytes, as in GB grand, month, week, day = BPSMeter.do.get_sums() history['total_size'], history['month_size'], history['week_size'], history['day_size'] = \ to_units(grand, postfix=postfix), to_units(month, postfix=postfix), \ to_units(week, postfix=postfix), to_units(day, postfix=postfix) history['lines'], history['fetched'], history['noofslots'] = build_history(limit=limit, start=start, search=search, failed_only=failed_only) if search: history['search'] = escape(search) else: history['search'] = '' history['start'] = int_conv(start) history['limit'] = int_conv(limit) history['finish'] = history['start'] + history['limit'] if history['finish'] > history['noofslots']: history['finish'] = history['noofslots'] if not history['finish']: history['finish'] = history['fetched'] history['time_format'] = time_format template = Template(file=os.path.join(sabnzbd.WEB_DIR, 'history.tmpl'), searchList=[history], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True) def purge(self, **kwargs): history_db = sabnzbd.get_db_connection() history_db.remove_history() raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def delete(self, **kwargs): job = kwargs.get('job') del_files = int_conv(kwargs.get('del_files')) if job: jobs = job.split(',') for job in jobs: del_hist_job(job, del_files=del_files) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def retry_pp(self, **kwargs): retry_job(kwargs.get('job'), kwargs.get('nzbfile'), kwargs.get('password')) raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def retry_all(self, **kwargs): retry_all_jobs() raise queueRaiser(self.__root, kwargs) @secured_expose(check_session_key=True) def reset(self, **kwargs): # sabnzbd.reset_byte_counter() raise queueRaiser(self.__root, kwargs) @secured_expose def scriptlog(self, **kwargs): """ Duplicate of scriptlog of History, needed for some skins """ # No session key check, due to fixed URLs name = kwargs.get('name') if name: history_db = sabnzbd.get_db_connection() return ShowString(history_db.get_name(name), history_db.get_script_log(name)) else: raise Raiser(self.__root) @secured_expose(check_session_key=True) def retry(self, **kwargs): job = kwargs.get('job', '') url = kwargs.get('url', '').strip() pp = kwargs.get('pp') cat = kwargs.get('cat') script = kwargs.get('script') if url: sabnzbd.add_url(url, pp, script, cat, nzbname=kwargs.get('nzbname')) del_hist_job(job, del_files=True) raise Raiser(self.__root) ############################################################################## class ConfigPage: def __init__(self, root): self.__root = root self.folders = ConfigFolders('/config/folders/') self.notify = ConfigNotify('/config/notify/') self.general = ConfigGeneral('/config/general/') self.rss = ConfigRss('/config/rss/') self.scheduling = ConfigScheduling('/config/scheduling/') self.server = ConfigServer('/config/server/') self.switches = ConfigSwitches('/config/switches/') self.categories = ConfigCats('/config/categories/') self.sorting = ConfigSorting('/config/sorting/') self.special = ConfigSpecial('/config/special/') @secured_expose(check_configlock=True) def index(self, **kwargs): conf = build_header(sabnzbd.WEB_DIR_CONFIG) conf['configfn'] = clip_path(config.get_filename()) conf['cmdline'] = sabnzbd.CMDLINE conf['build'] = sabnzbd.version.__baseline__[:7] conf['have_unzip'] = bool(sabnzbd.newsunpack.ZIP_COMMAND) conf['have_7zip'] = bool(sabnzbd.newsunpack.SEVEN_COMMAND) conf['have_sabyenc'] = SABYENC_ENABLED conf['have_mt_par2'] = sabnzbd.newsunpack.PAR2_MT conf['certificate_validation'] = sabnzbd.CERTIFICATE_VALIDATION conf['ssl_version'] = ssl.OPENSSL_VERSION new = {} for svr in config.get_servers(): new[svr] = {} conf['servers'] = new conf['folders'] = NzbQueue.do.scan_jobs(all=False, action=False) template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True) def restart(self, **kwargs): logging.info('Restart requested by interface') # Do the shutdown async to still send goodbye to browser Thread(target=sabnzbd.trigger_restart, kwargs={'timeout': 1}).start() return T(' 
SABnzbd shutdown finished.
Wait for about 5 second and then click the button below.

Refresh
') @secured_expose(check_session_key=True) def repair(self, **kwargs): logging.info('Queue repair requested by interface') sabnzbd.request_repair() # Do the shutdown async to still send goodbye to browser Thread(target=sabnzbd.trigger_restart, kwargs={'timeout': 1}).start() return T(' 
SABnzbd shutdown finished.
Wait for about 5 second and then click the button below.

Refresh
') ############################################################################## LIST_DIRPAGE = ( 'download_dir', 'download_free', 'complete_dir', 'admin_dir', 'nzb_backup_dir', 'dirscan_dir', 'dirscan_speed', 'script_dir', 'email_dir', 'permissions', 'log_dir', 'password_file' ) class ConfigFolders: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): conf = build_header(sabnzbd.WEB_DIR_CONFIG) for kw in LIST_DIRPAGE: conf[kw] = config.get_config('misc', kw)() template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_folders.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def saveDirectories(self, **kwargs): for kw in LIST_DIRPAGE: value = kwargs.get(kw) if value is not None: if kw in ('complete_dir', 'dirscan_dir'): msg = config.get_config('misc', kw).set(value, create=True) else: msg = config.get_config('misc', kw).set(value) if msg: # return sabnzbd.api.report('json', error=msg) return badParameterResponse(msg, kwargs.get('ajax')) sabnzbd.check_incomplete_vs_complete() config.save_config() if kwargs.get('ajax'): return sabnzbd.api.report('json') else: raise Raiser(self.__root) ############################################################################## SWITCH_LIST = \ ('par_option', 'top_only', 'direct_unpack', 'enable_meta', 'win_process_prio', 'auto_sort', 'propagation_delay', 'auto_disconnect', 'flat_unpack', 'safe_postproc', 'no_dupes', 'replace_spaces', 'replace_dots', 'ignore_samples', 'pause_on_post_processing', 'nice', 'ionice', 'pre_script', 'pause_on_pwrar', 'sfv_check', 'folder_rename', 'load_balancing', 'quota_size', 'quota_day', 'quota_resume', 'quota_period', 'history_retention', 'pre_check', 'max_art_tries', 'fail_hopeless_jobs', 'enable_all_par', 'enable_recursive', 'no_series_dupes', 'series_propercheck', 'script_can_fail', 'new_nzb_on_failure', 'unwanted_extensions', 'action_on_unwanted_extensions', 'sanitize_safe', 'rating_enable', 'rating_api_key', 'rating_filter_enable', 'rating_filter_abort_audio', 'rating_filter_abort_video', 'rating_filter_abort_encrypted', 'rating_filter_abort_encrypted_confirm', 'rating_filter_abort_spam', 'rating_filter_abort_spam_confirm', 'rating_filter_abort_downvoted', 'rating_filter_abort_keywords', 'rating_filter_pause_audio', 'rating_filter_pause_video', 'rating_filter_pause_encrypted', 'rating_filter_pause_encrypted_confirm', 'rating_filter_pause_spam', 'rating_filter_pause_spam_confirm', 'rating_filter_pause_downvoted', 'rating_filter_pause_keywords' ) class ConfigSwitches: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): conf = build_header(sabnzbd.WEB_DIR_CONFIG) conf['certificate_validation'] = sabnzbd.CERTIFICATE_VALIDATION conf['have_nice'] = bool(sabnzbd.newsunpack.NICE_COMMAND) conf['have_ionice'] = bool(sabnzbd.newsunpack.IONICE_COMMAND) conf['cleanup_list'] = cfg.cleanup_list.get_string() for kw in SWITCH_LIST: conf[kw] = config.get_config('misc', kw)() conf['unwanted_extensions'] = cfg.unwanted_extensions.get_string() conf['scripts'] = list_scripts() or ['None'] template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_switches.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def saveSwitches(self, **kwargs): for kw in SWITCH_LIST: item = config.get_config('misc', kw) value = kwargs.get(kw) if kw == 'unwanted_extensions' and value: value = value.lower().replace('.', '') msg = item.set(value) if msg: return badParameterResponse(msg) cleanup_list = kwargs.get('cleanup_list') if cleanup_list and sabnzbd.WIN32: cleanup_list = cleanup_list.lower() cfg.cleanup_list.set(cleanup_list) config.save_config() raise Raiser(self.__root) ############################################################################## SPECIAL_BOOL_LIST = \ ('start_paused', 'no_penalties', 'fast_fail', 'ignore_wrong_unrar', 'overwrite_files', 'enable_par_cleanup', 'queue_complete_pers', 'api_warnings', 'ampm', 'enable_unrar', 'enable_unzip', 'enable_7zip', 'enable_filejoin', 'enable_tsjoin', 'ignore_unrar_dates', 'debug_log_decoding', 'multipar', 'osx_menu', 'osx_speed', 'win_menu', 'allow_incomplete_nzb', 'rss_filenames', 'ipv6_hosting', 'keep_awake', 'empty_postproc', 'html_login', 'wait_for_dfolder', 'max_art_opt', 'warn_empty_nzb', 'enable_bonjour', 'reject_duplicate_files', 'warn_dupl_jobs', 'replace_illegal', 'backup_for_duplicates', 'disable_api_key', 'api_logging', 'ignore_empty_files', 'x_frame_options', 'require_modern_tls' ) SPECIAL_VALUE_LIST = \ ('size_limit', 'movie_rename_limit', 'nomedia_marker', 'max_url_retries', 'req_completion_rate', 'wait_ext_drive', 'show_sysload', 'url_base', 'direct_unpack_threads', 'ipv6_servers', 'selftest_host', 'rating_host' ) SPECIAL_LIST_LIST = ('rss_odd_titles', 'quick_check_ext_ignore', 'host_whitelist') class ConfigSpecial: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): conf = build_header(sabnzbd.WEB_DIR_CONFIG) conf['switches'] = [(kw, config.get_config('misc', kw)(), config.get_config('misc', kw).default()) for kw in SPECIAL_BOOL_LIST] conf['entries'] = [(kw, config.get_config('misc', kw)(), config.get_config('misc', kw).default()) for kw in SPECIAL_VALUE_LIST] conf['entries'].extend([(kw, config.get_config('misc', kw).get_string(), config.get_config('misc', kw).default_string()) for kw in SPECIAL_LIST_LIST]) template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_special.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def saveSpecial(self, **kwargs): for kw in SPECIAL_BOOL_LIST + SPECIAL_VALUE_LIST + SPECIAL_LIST_LIST: item = config.get_config('misc', kw) value = kwargs.get(kw) msg = item.set(value) if msg: return badParameterResponse(msg) config.save_config() raise Raiser(self.__root) ############################################################################## GENERAL_LIST = ( 'host', 'port', 'username', 'refresh_rate', 'language', 'cache_limit', 'local_ranges', 'inet_exposure', 'enable_https', 'https_port', 'https_cert', 'https_key', 'https_chain', 'enable_https_verification', 'auto_browser', 'check_new_rel' ) class ConfigGeneral: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): def ListColors(web_dir): lst = [] web_dir = os.path.join(sabnzbd.DIR_INTERFACES, web_dir) dd = os.path.abspath(web_dir + '/templates/static/stylesheets/colorschemes') if (not dd) or (not os.access(dd, os.R_OK)): return lst for color in globber(dd): col = color.replace('.css', '') lst.append(col) return lst def add_color(skin_dir, color): if skin_dir: if not color: try: color = DEF_SKIN_COLORS[skin_dir.lower()] except KeyError: return skin_dir return '%s - %s' % (skin_dir, color) else: return '' conf = build_header(sabnzbd.WEB_DIR_CONFIG) conf['configfn'] = config.get_filename() conf['certificate_validation'] = sabnzbd.CERTIFICATE_VALIDATION wlist = [] interfaces = globber_full(sabnzbd.DIR_INTERFACES) for k in interfaces: if k.endswith(DEF_STDCONFIG): interfaces.remove(k) continue for web in interfaces: rweb = os.path.basename(web) if os.access(os.path.join(web, DEF_MAIN_TMPL), os.R_OK): cols = ListColors(rweb) if cols: for col in cols: wlist.append(add_color(rweb, col)) else: wlist.append(rweb) conf['web_list'] = wlist conf['web_dir'] = add_color(cfg.web_dir(), cfg.web_color()) conf['password'] = cfg.password.get_stars() conf['language'] = cfg.language() lang_list = list_languages() if len(lang_list) < 2: lang_list = [] conf['lang_list'] = lang_list for kw in GENERAL_LIST: conf[kw] = config.get_config('misc', kw)() conf['bandwidth_max'] = cfg.bandwidth_max() conf['bandwidth_perc'] = cfg.bandwidth_perc() conf['nzb_key'] = cfg.nzb_key() conf['local_ranges'] = cfg.local_ranges.get_string() conf['my_lcldata'] = cfg.admin_dir.get_clipped_path() conf['caller_url'] = cherrypy.request.base + cfg.url_base() template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_general.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def saveGeneral(self, **kwargs): # Handle general options for kw in GENERAL_LIST: item = config.get_config('misc', kw) value = kwargs.get(kw) msg = item.set(value) if msg: return badParameterResponse(msg) # Handle special options cfg.password.set(kwargs.get('password')) web_dir = kwargs.get('web_dir') change_web_dir(web_dir) bandwidth_max = kwargs.get('bandwidth_max') if bandwidth_max is not None: cfg.bandwidth_max.set(bandwidth_max) bandwidth_perc = kwargs.get('bandwidth_perc') if bandwidth_perc is not None: cfg.bandwidth_perc.set(bandwidth_perc) bandwidth_perc = cfg.bandwidth_perc() if bandwidth_perc and not bandwidth_max: logging.warning(T('You must set a maximum bandwidth before you can set a bandwidth limit')) config.save_config() # Update CherryPy authentication set_auth(cherrypy.config) if kwargs.get('ajax'): return sabnzbd.api.report('json', data={'success': True, 'restart_req': sabnzbd.RESTART_REQ}) else: raise Raiser(self.__root) def change_web_dir(web_dir): try: web_dir, web_color = web_dir.split(' - ') except: try: web_color = DEF_SKIN_COLORS[web_dir.lower()] except: web_color = '' web_dir_path = real_path(sabnzbd.DIR_INTERFACES, web_dir) if not os.path.exists(web_dir_path): return badParameterResponse('Cannot find web template: %s' % web_dir_path) else: cfg.web_dir.set(web_dir) cfg.web_color.set(web_color) ############################################################################## class ConfigServer: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): conf = build_header(sabnzbd.WEB_DIR_CONFIG) new = [] servers = config.get_servers() server_names = sorted(list(servers.keys()), key=lambda svr: '%d%02d%s' % (int(not servers[svr].enable()), servers[svr].priority(), servers[svr].displayname().lower())) for svr in server_names: new.append(servers[svr].get_dict(safe=True)) t, m, w, d, timeline = BPSMeter.do.amounts(svr) if t: new[-1]['amounts'] = to_units(t), to_units(m), to_units(w), to_units(d), timeline conf['servers'] = new conf['cats'] = list_cats(default=True) conf['certificate_validation'] = sabnzbd.CERTIFICATE_VALIDATION template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_server.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def addServer(self, **kwargs): return handle_server(kwargs, self.__root, True) @secured_expose(check_session_key=True, check_configlock=True) def saveServer(self, **kwargs): return handle_server(kwargs, self.__root) @secured_expose(check_session_key=True, check_configlock=True) def testServer(self, **kwargs): return handle_server_test(kwargs, self.__root) @secured_expose(check_session_key=True, check_configlock=True) def delServer(self, **kwargs): kwargs['section'] = 'servers' kwargs['keyword'] = kwargs.get('server') del_from_section(kwargs) raise Raiser(self.__root) @secured_expose(check_session_key=True, check_configlock=True) def clrServer(self, **kwargs): server = kwargs.get('server') if server: BPSMeter.do.clear_server(server) raise Raiser(self.__root) @secured_expose(check_session_key=True, check_configlock=True) def toggleServer(self, **kwargs): server = kwargs.get('server') if server: svr = config.get_config('servers', server) if svr: svr.enable.set(not svr.enable()) config.save_config() Downloader.do.update_server(server, server) raise Raiser(self.__root) def unique_svr_name(server): """ Return a unique variant on given server name """ num = 0 svr = 1 new_name = server while svr: if num: new_name = '%s@%d' % (server, num) else: new_name = '%s' % server svr = config.get_config('servers', new_name) num += 1 return new_name def check_server(host, port, ajax): """ Check if server address resolves properly """ if host.lower() == 'localhost' and sabnzbd.AMBI_LOCALHOST: return badParameterResponse(T('Warning: LOCALHOST is ambiguous, use numerical IP-address.'), ajax) if GetServerParms(host, int_conv(port)): return "" else: return badParameterResponse(T('Server address "%s:%s" is not valid.') % (host, port), ajax) def handle_server(kwargs, root=None, new_svr=False): """ Internal server handler """ ajax = kwargs.get('ajax') host = kwargs.get('host', '').strip() if not host: return badParameterResponse(T('Server address required'), ajax) port = kwargs.get('port', '').strip() if not port: if not kwargs.get('ssl', '').strip(): port = '119' else: port = '563' kwargs['port'] = port if kwargs.get('connections', '').strip() == '': kwargs['connections'] = '1' if kwargs.get('enable') == '1': msg = check_server(host, port, ajax) if msg: return msg # Default server name is just the host name server = host svr = None old_server = kwargs.get('server') if old_server: svr = config.get_config('servers', old_server) if svr: server = old_server else: svr = config.get_config('servers', server) if new_svr: server = unique_svr_name(server) for kw in ('ssl', 'send_group', 'enable', 'optional'): if kw not in kwargs.keys(): kwargs[kw] = None if svr and not new_svr: svr.set_dict(kwargs) else: old_server = None config.ConfigServer(server, kwargs) config.save_config() Downloader.do.update_server(old_server, server) if root: if ajax: return sabnzbd.api.report('json') else: raise Raiser(root) def handle_server_test(kwargs, root): _result, msg = test_nntp_server_dict(kwargs) return msg ############################################################################## class ConfigRss: def __init__(self, root): self.__root = root self.__refresh_readout = None # Set to URL when new readout is needed self.__refresh_download = False # True when feed needs to be read self.__refresh_force = False # True if forced download of all matches is required self.__refresh_ignore = False # True if first batch of new feed must be ignored self.__evaluate = False # True if feed needs to be re-filtered self.__show_eval_button = False # True if the "Apply filers" button should be shown self.__last_msg = '' # Last error message from RSS reader @secured_expose(check_configlock=True) def index(self, **kwargs): conf = build_header(sabnzbd.WEB_DIR_CONFIG) conf['scripts'] = list_scripts(default=True) pick_script = conf['scripts'] != [] conf['categories'] = list_cats(default=True) pick_cat = conf['categories'] != [] conf['rss_rate'] = cfg.rss_rate() rss = {} feeds = config.get_rss() for feed in feeds: rss[feed] = feeds[feed].get_dict() filters = feeds[feed].filters() rss[feed]['filters'] = filters rss[feed]['filter_states'] = [bool(sabnzbd.rss.convert_filter(f[4])) for f in filters] rss[feed]['filtercount'] = len(filters) rss[feed]['pick_cat'] = pick_cat rss[feed]['pick_script'] = pick_script rss[feed]['link'] = urllib.parse.quote_plus(feed.encode('utf-8')) rss[feed]['baselink'] = [get_base_url(uri) for uri in rss[feed]['uri']] rss[feed]['uris'] = feeds[feed].uri.get_string() active_feed = kwargs.get('feed', '') conf['active_feed'] = active_feed conf['rss'] = rss conf['rss_next'] = time.strftime(time_format('%H:%M'), time.localtime(sabnzbd.rss.next_run())) if active_feed: readout = bool(self.__refresh_readout) logging.debug('RSS READOUT = %s', readout) if not readout: self.__refresh_download = False self.__refresh_force = False self.__refresh_ignore = False if self.__evaluate: msg = sabnzbd.rss.run_feed(active_feed, download=self.__refresh_download, force=self.__refresh_force, ignoreFirst=self.__refresh_ignore, readout=readout) else: msg = '' self.__evaluate = False if readout: sabnzbd.rss.save() self.__last_msg = msg else: msg = self.__last_msg self.__refresh_readout = None conf['evalButton'] = self.__show_eval_button conf['error'] = msg conf['downloaded'], conf['matched'], conf['unmatched'] = GetRssLog(active_feed) else: self.__last_msg = '' # Find a unique new Feed name unum = 1 txt = T('Feed') # : Used as default Feed name in Config->RSS while txt + str(unum) in feeds: unum += 1 conf['feed'] = txt + str(unum) template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_rss.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def save_rss_rate(self, **kwargs): """ Save changed RSS automatic readout rate """ cfg.rss_rate.set(kwargs.get('rss_rate')) config.save_config() scheduler.restart() raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def upd_rss_feed(self, **kwargs): """ Update Feed level attributes, legacy version: ignores 'enable' parameter """ if kwargs.get('enable') is not None: del kwargs['enable'] try: cf = config.get_rss()[kwargs.get('feed')] except KeyError: cf = None uri = Strip(kwargs.get('uri')) if cf and uri: kwargs['uri'] = uri cf.set_dict(kwargs) config.save_config() self.__evaluate = False self.__show_eval_button = True raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def save_rss_feed(self, **kwargs): """ Update Feed level attributes """ try: cf = config.get_rss()[kwargs.get('feed')] except KeyError: cf = None if 'enable' not in kwargs: kwargs['enable'] = 0 uri = Strip(kwargs.get('uri')) if cf and uri: kwargs['uri'] = uri cf.set_dict(kwargs) config.save_config() raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def toggle_rss_feed(self, **kwargs): """ Toggle automatic read-out flag of Feed """ try: item = config.get_rss()[kwargs.get('feed')] except KeyError: item = None if cfg: item.enable.set(not item.enable()) config.save_config() if kwargs.get('table'): raise Raiser(self.__root) else: raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def add_rss_feed(self, **kwargs): """ Add one new RSS feed definition """ feed = Strip(kwargs.get('feed')).strip('[]') uri = Strip(kwargs.get('uri')) if feed and uri: try: cfg = config.get_rss()[feed] except KeyError: cfg = None if (not cfg) and uri: kwargs['feed'] = feed kwargs['uri'] = uri config.ConfigRSS(feed, kwargs) # Clear out any existing reference to this feed name # Otherwise first-run detection can fail sabnzbd.rss.clear_feed(feed) config.save_config() self.__refresh_readout = feed self.__refresh_download = False self.__refresh_force = False self.__refresh_ignore = True self.__evaluate = True raise rssRaiser(self.__root, kwargs) else: raise Raiser(self.__root) else: raise Raiser(self.__root) @secured_expose(check_session_key=True, check_configlock=True) def upd_rss_filter(self, **kwargs): """ Wrapper, so we can call from api.py """ self.internal_upd_rss_filter(**kwargs) def internal_upd_rss_filter(self, **kwargs): """ Save updated filter definition """ try: feed_cfg = config.get_rss()[kwargs.get('feed')] except KeyError: raise rssRaiser(self.__root, kwargs) pp = kwargs.get('pp') if IsNone(pp): pp = '' script = ConvertSpecials(kwargs.get('script')) cat = ConvertSpecials(kwargs.get('cat')) prio = ConvertSpecials(kwargs.get('priority')) filt = kwargs.get('filter_text') enabled = kwargs.get('enabled', '0') if filt: feed_cfg.filters.update(int(kwargs.get('index', 0)), (cat, pp, script, kwargs.get('filter_type'), filt, prio, enabled)) # Move filter if requested index = int_conv(kwargs.get('index', '')) new_index = kwargs.get('new_index', '') if new_index and int_conv(new_index) != index: feed_cfg.filters.move(int(index), int_conv(new_index)) config.save_config() self.__evaluate = False self.__show_eval_button = True raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def del_rss_feed(self, *args, **kwargs): """ Remove complete RSS feed """ kwargs['section'] = 'rss' kwargs['keyword'] = kwargs.get('feed') del_from_section(kwargs) sabnzbd.rss.clear_feed(kwargs.get('feed')) raise Raiser(self.__root) @secured_expose(check_session_key=True, check_configlock=True) def del_rss_filter(self, **kwargs): """ Wrapper, so we can call from api.py """ self.internal_del_rss_filter(**kwargs) def internal_del_rss_filter(self, **kwargs): """ Remove one RSS filter """ try: feed_cfg = config.get_rss()[kwargs.get('feed')] except KeyError: raise rssRaiser(self.__root, kwargs) feed_cfg.filters.delete(int(kwargs.get('index', 0))) config.save_config() self.__evaluate = False self.__show_eval_button = True raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def download_rss_feed(self, *args, **kwargs): """ Force download of all matching jobs in a feed """ if 'feed' in kwargs: feed = kwargs['feed'] self.__refresh_readout = feed self.__refresh_download = True self.__refresh_force = True self.__refresh_ignore = False self.__evaluate = True raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def clean_rss_jobs(self, *args, **kwargs): """ Remove processed RSS jobs from UI """ sabnzbd.rss.clear_downloaded(kwargs['feed']) self.__evaluate = True raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def test_rss_feed(self, *args, **kwargs): """ Read the feed content again and show results """ if 'feed' in kwargs: feed = kwargs['feed'] self.__refresh_readout = feed self.__refresh_download = False self.__refresh_force = False self.__refresh_ignore = True self.__evaluate = True self.__show_eval_button = False raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def eval_rss_feed(self, *args, **kwargs): """ Re-apply the filters to the feed """ if 'feed' in kwargs: self.__refresh_download = False self.__refresh_force = False self.__refresh_ignore = False self.__show_eval_button = False self.__evaluate = True raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def download(self, **kwargs): """ Download NZB from provider (Download button) """ feed = kwargs.get('feed') url = kwargs.get('url') nzbname = kwargs.get('nzbname') att = sabnzbd.rss.lookup_url(feed, url) if att: pp = att.get('pp') cat = att.get('cat') script = att.get('script') prio = att.get('prio') if url: sabnzbd.add_url(url, pp, script, cat, prio, nzbname) # Need to pass the title instead sabnzbd.rss.flag_downloaded(feed, url) raise rssRaiser(self.__root, kwargs) @secured_expose(check_session_key=True, check_configlock=True) def rss_now(self, *args, **kwargs): """ Run an automatic RSS run now """ scheduler.force_rss() raise rssRaiser(self.__root, kwargs) def ConvertSpecials(p): """ Convert None to 'None' and 'Default' to '' """ if p is None: p = 'None' elif p.lower() == T('Default').lower(): p = '' return p def IsNone(value): """ Return True if either None, 'None' or '' """ return value is None or value == "" or value.lower() == 'none' def Strip(txt): """ Return stripped string, can handle None """ try: return txt.strip() except: return None ############################################################################## _SCHED_ACTIONS = ('resume', 'pause', 'pause_all', 'shutdown', 'restart', 'speedlimit', 'pause_post', 'resume_post', 'scan_folder', 'rss_scan', 'remove_failed', 'remove_completed', 'pause_all_low', 'pause_all_normal', 'pause_all_high', 'resume_all_low', 'resume_all_normal', 'resume_all_high', 'enable_quota', 'disable_quota' ) class ConfigScheduling: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): def get_days(): days = {"*": T('Daily'), "1": T('Monday'), "2": T('Tuesday'), "3": T('Wednesday'), "4": T('Thursday'), "5": T('Friday'), "6": T('Saturday'), "7": T('Sunday')} return days conf = build_header(sabnzbd.WEB_DIR_CONFIG) actions = [] actions.extend(_SCHED_ACTIONS) day_names = get_days() categories = list_cats(False) snum = 1 conf['schedlines'] = [] conf['taskinfo'] = [] for ev in scheduler.sort_schedules(all_events=False): line = ev[3] conf['schedlines'].append(line) try: enabled, m, h, day_numbers, action = line.split(' ', 4) except: continue action = action.strip() try: action, value = action.split(' ', 1) except: value = '' value = value.strip() if value and not value.lower().strip('0123456789kmgtp%.'): if '%' not in value and from_units(value) < 1.0: value = T('off') # : "Off" value for speedlimit in scheduler else: if '%' not in value and 1 < int_conv(value) < 101: value += '%' value = value.upper() if action in actions: action = Ttemplate("sch-" + action) else: if action in ('enable_server', 'disable_server'): try: value = '"%s"' % config.get_servers()[value].displayname() except KeyError: value = '"%s" <<< %s' % (value, T('Undefined server!')) action = Ttemplate("sch-" + action) if action in ('pause_cat', 'resume_cat'): action = Ttemplate("sch-" + action) if value not in categories: # Category name change value = '"%s" <<< %s' % (value, T('Incorrect parameter')) else: value = '"%s"' % value if day_numbers == "1234567": days_of_week = "Daily" elif day_numbers == "12345": days_of_week = "Weekdays" elif day_numbers == "67": days_of_week = "Weekends" else: days_of_week = ", ".join([day_names.get(i, "**") for i in day_numbers]) item = (snum, '%02d' % int(h), '%02d' % int(m), days_of_week, '%s %s' % (action, value), enabled) conf['taskinfo'].append(item) snum += 1 actions_lng = {} for action in actions: actions_lng[action] = Ttemplate("sch-" + action) actions_servers = {} servers = config.get_servers() for srv in servers: actions_servers[srv] = servers[srv].displayname() conf['actions_servers'] = actions_servers conf['actions'] = actions conf['actions_lng'] = actions_lng conf['categories'] = categories template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_scheduling.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def addSchedule(self, **kwargs): servers = config.get_servers() minute = kwargs.get('minute') hour = kwargs.get('hour') days_of_week = ''.join([str(x) for x in kwargs.get('daysofweek', '')]) if not days_of_week: days_of_week = '1234567' action = kwargs.get('action') arguments = kwargs.get('arguments') arguments = arguments.strip().lower() if arguments in ('on', 'enable'): arguments = '1' elif arguments in ('off', 'disable'): arguments = '0' if minute and hour and days_of_week and action: if action == 'speedlimit': if not arguments or arguments.strip('0123456789kmgtp%.'): arguments = 0 elif action in _SCHED_ACTIONS: arguments = '' elif action in servers: if arguments == '1': arguments = action action = 'enable_server' else: arguments = action action = 'disable_server' elif action in ('pause_cat', 'resume_cat'): # Need original category name, not lowercased arguments = arguments.strip() else: # Something else, leave empty action = None if action: sched = cfg.schedules() sched.append('%s %s %s %s %s %s' % (1, minute, hour, days_of_week, action, arguments)) cfg.schedules.set(sched) config.save_config() scheduler.restart(force=True) raise Raiser(self.__root) @secured_expose(check_session_key=True, check_configlock=True) def delSchedule(self, **kwargs): schedules = cfg.schedules() line = kwargs.get('line') if line and line in schedules: schedules.remove(line) cfg.schedules.set(schedules) config.save_config() scheduler.restart(force=True) raise Raiser(self.__root) @secured_expose(check_session_key=True, check_configlock=True) def toggleSchedule(self, **kwargs): schedules = cfg.schedules() line = kwargs.get('line') if line: for i, schedule in enumerate(schedules): if schedule == line: # Toggle the schedule schedule_split = schedule.split() schedule_split[0] = '%d' % (schedule_split[0] == '0') schedules[i] = ' '.join(schedule_split) break cfg.schedules.set(schedules) config.save_config() scheduler.restart(force=True) raise Raiser(self.__root) ############################################################################## class ConfigCats: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): conf = build_header(sabnzbd.WEB_DIR_CONFIG) conf['scripts'] = list_scripts(default=True) conf['defdir'] = cfg.complete_dir.get_clipped_path() categories = config.get_ordered_categories() conf['have_cats'] = len(categories) > 1 slotinfo = [] for cat in categories: cat['newzbin'] = cat['newzbin'].replace('"', '"') slotinfo.append(cat) # Add empty line empty = {'name': '', 'order': '0', 'pp': '-1', 'script': '', 'dir': '', 'newzbin': '', 'priority': DEFAULT_PRIORITY} slotinfo.insert(1, empty) conf['slotinfo'] = slotinfo template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_cat.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def delete(self, **kwargs): kwargs['section'] = 'categories' kwargs['keyword'] = kwargs.get('name') del_from_section(kwargs) raise Raiser(self.__root) @secured_expose(check_session_key=True, check_configlock=True) def save(self, **kwargs): name = kwargs.get('name', '*') if name == '*': newname = name else: newname = re.sub('"', '', kwargs.get('newname', '')) if newname: # Check if this cat-dir is not sub-folder of incomplete if same_file(cfg.download_dir.get_path(), real_path(cfg.complete_dir.get_path(), kwargs['dir'])): return T('Category folder cannot be a subfolder of the Temporary Download Folder.') # Delete current one and replace with new one if name: config.delete('categories', name) config.ConfigCat(newname.lower(), kwargs) config.save_config() raise Raiser(self.__root) ############################################################################## SORT_LIST = ( 'enable_tv_sorting', 'tv_sort_string', 'tv_categories', 'enable_movie_sorting', 'movie_sort_string', 'movie_sort_extra', 'movie_extra_folder', 'enable_date_sorting', 'date_sort_string', 'movie_categories', 'date_categories' ) class ConfigSorting: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): conf = build_header(sabnzbd.WEB_DIR_CONFIG) conf['complete_dir'] = cfg.complete_dir.get_clipped_path() for kw in SORT_LIST: conf[kw] = config.get_config('misc', kw)() conf['categories'] = list_cats(False) template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_sorting.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def saveSorting(self, **kwargs): try: kwargs['movie_categories'] = kwargs['movie_cat'] except: pass try: kwargs['date_categories'] = kwargs['date_cat'] except: pass try: kwargs['tv_categories'] = kwargs['tv_cat'] except: pass for kw in SORT_LIST: item = config.get_config('misc', kw) value = kwargs.get(kw) msg = item.set(value) if msg: return badParameterResponse(msg) config.save_config() raise Raiser(self.__root) ############################################################################## LOG_API_RE = re.compile(b"(apikey|api)(=|:)[\w]+", re.I) LOG_API_JSON_RE = re.compile(b"'(apikey|api)': '[\w]+'", re.I) LOG_USER_RE = re.compile(b"(user|username)\s?=\s?[\S]+", re.I) LOG_PASS_RE = re.compile(b"(password)\s?=\s?[\S]+", re.I) LOG_INI_HIDE_RE = re.compile(b"(email_pwd|email_account|email_to|rating_api_key|pushover_token|pushover_userkey|pushbullet_apikey|prowl_apikey|growl_password|growl_server|IPv[4|6] address)\s?=\s?[\S]+", re.I) LOG_HASH_RE = re.compile(b"([a-fA-F\d]{25})", re.I) class Status: def __init__(self, root): self.__root = root @secured_expose(check_configlock=True) def index(self, **kwargs): header = build_status(skip_dashboard=kwargs.get('skip_dashboard')) template = Template(file=os.path.join(sabnzbd.WEB_DIR, 'status.tmpl'), searchList=[header], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True) def reset_quota(self, **kwargs): BPSMeter.do.reset_quota(force=True) raise Raiser(self.__root) @secured_expose(check_session_key=True) def disconnect(self, **kwargs): Downloader.do.disconnect() raise Raiser(self.__root) @secured_expose(check_session_key=True) def refresh_conn(self, **kwargs): # No real action, just reload the page raise Raiser(self.__root) @secured_expose(check_session_key=True) def showlog(self, **kwargs): try: sabnzbd.LOGHANDLER.flush() except: pass # Fetch the INI and the log-data and add a message at the top log_data = b'--------------------------------\n\n' log_data += b'The log includes a copy of your sabnzbd.ini with\nall usernames, passwords and API-keys removed.' log_data += b'\n\n--------------------------------\n' log_data += open(sabnzbd.LOGFILE, "rb").read() log_data += open(config.get_filename(), 'rb').read() # We need to remove all passwords/usernames/api-keys log_data = LOG_API_RE.sub(b"apikey=", log_data) log_data = LOG_API_JSON_RE.sub(b"'apikey':'", log_data) log_data = LOG_USER_RE.sub(b'\g<1>=', log_data) log_data = LOG_PASS_RE.sub(b"password=", log_data) log_data = LOG_INI_HIDE_RE.sub(b"\\1 = ", log_data) log_data = LOG_HASH_RE.sub(b"", log_data) # Try to replace the username try: import getpass cur_user = getpass.getuser() if cur_user: log_data = log_data.replace(utob(cur_user), b'') except: pass # Set headers cherrypy.response.headers['Content-Type'] = 'application/x-download;charset=utf-8' cherrypy.response.headers['Content-Disposition'] = 'attachment;filename="sabnzbd.log"' return log_data @secured_expose(check_session_key=True) def clearwarnings(self, **kwargs): sabnzbd.GUIHANDLER.clear() raise Raiser(self.__root) @secured_expose(check_session_key=True) def change_loglevel(self, **kwargs): cfg.log_level.set(kwargs.get('loglevel')) config.save_config() raise Raiser(self.__root) @secured_expose(check_session_key=True) def unblock_server(self, **kwargs): Downloader.do.unblock(kwargs.get('server')) # Short sleep so that UI shows new server status time.sleep(1.0) raise Raiser(self.__root) @secured_expose(check_session_key=True) def delete(self, **kwargs): orphan_delete(kwargs) raise Raiser(self.__root) @secured_expose(check_session_key=True) def delete_all(self, **kwargs): orphan_delete_all() raise Raiser(self.__root) @secured_expose(check_session_key=True) def add(self, **kwargs): orphan_add(kwargs) raise Raiser(self.__root) @secured_expose(check_session_key=True) def add_all(self, **kwargs): orphan_add_all() raise Raiser(self.__root) @secured_expose(check_session_key=True) def dashrefresh(self, **kwargs): # This function is run when Refresh button on Dashboard is clicked # Put the time consuming dashboard functions here; they only get executed when the user clicks the Refresh button # PyStone sabnzbd.PYSTONE_SCORE = getpystone() # Diskspeed of download (aka incomplete) directory: dir_speed = diskspeedmeasure(sabnzbd.cfg.download_dir.get_path()) if dir_speed: sabnzbd.DOWNLOAD_DIR_SPEED = round(dir_speed, 1) else: sabnzbd.DOWNLOAD_DIR_SPEED = 0 time.sleep(1.0) # Diskspeed of complete directory: dir_speed = diskspeedmeasure(sabnzbd.cfg.complete_dir.get_path()) if dir_speed: sabnzbd.COMPLETE_DIR_SPEED = round(dir_speed, 1) else: sabnzbd.COMPLETE_DIR_SPEED = 0 # Internet bandwidth sabnzbd.INTERNET_BANDWIDTH = round(internetspeed(), 1) raise Raiser(self.__root) # Refresh screen def orphan_delete(kwargs): path = kwargs.get('name') if path: path = os.path.join(long_path(cfg.download_dir.get_path()), path) logging.info('Removing orphaned job %s', path) remove_all(path, recursive=True) def orphan_delete_all(): paths = NzbQueue.do.scan_jobs(all=False, action=False) for path in paths: kwargs = {'name': path} orphan_delete(kwargs) def orphan_add(kwargs): path = kwargs.get('name') if path: path = os.path.join(long_path(cfg.download_dir.get_path()), path) logging.info('Re-adding orphaned job %s', path) NzbQueue.do.repair_job(path, None, None) def orphan_add_all(): paths = NzbQueue.do.scan_jobs(all=False, action=False) for path in paths: kwargs = {'name': path} orphan_add(kwargs) def badParameterResponse(msg, ajax=None): """ Return a html page with error message and a 'back' button """ if ajax: return sabnzbd.api.report('json', error=msg) else: return ''' SABnzbd %s - %s

%s

%s

''' % (sabnzbd.__version__, T('ERROR:'), T('Incorrect parameter'), msg, T('Back')) def ShowString(name, msg): """ Return a html page listing a file and a 'back' button """ return ''' %s

%s

%s
''' % (xml_name(name), T('Back'), xml_name(name), escape(msg)) def GetRssLog(feed): def make_item(job): # Make a copy job = job.copy() # Now we apply some formatting job['title'] = job['title'] job['skip'] = '*' * int(job.get('status', '').endswith('*')) # These fields could be empty job['cat'] = job.get('cat', '') job['size'] = job.get('size', '') job['infourl'] = job.get('infourl', '') # Auto-fetched jobs didn't have these fields set if job.get('url'): job['baselink'] = get_base_url(job.get('url')) if sabnzbd.rss.special_rss_site(job.get('url')): job['nzbname'] = '' else: job['nzbname'] = job['title'] else: job['baselink'] = '' job['nzbname'] = job['title'] if job.get('size', 0): job['size_units'] = to_units(job['size']) else: job['size_units'] = '-' # And we add extra fields for sorting if job.get('age', 0): job['age_ms'] = (job['age'] - datetime.utcfromtimestamp(0)).total_seconds() job['age'] = calc_age(job['age'], True) else: job['age_ms'] = '' job['age'] = '' if job.get('time_downloaded'): job['time_downloaded_ms'] = time.mktime(job['time_downloaded']) job['time_downloaded'] = time.strftime(time_format('%H:%M %a %d %b'), job['time_downloaded']) else: job['time_downloaded_ms'] = '' job['time_downloaded'] = '' return job jobs = list(sabnzbd.rss.show_result(feed).values()) good, bad, done = ([], [], []) for job in jobs: if job['status'][0] == 'G': good.append(make_item(job)) elif job['status'][0] == 'B': bad.append(make_item(job)) elif job['status'] == 'D': done.append(make_item(job)) try: # Sort based on actual age, in try-catch just to be sure good.sort(key=lambda job: job['age_ms'], reverse=True) bad.sort(key=lambda job: job['age_ms'], reverse=True) done.sort(key=lambda job: job['time_downloaded_ms'], reverse=True) except: # Let the javascript do it then.. pass return done, good, bad ############################################################################## LIST_EMAIL = ( 'email_endjob', 'email_cats', 'email_full', 'email_server', 'email_to', 'email_from', 'email_account', 'email_pwd', 'email_rss' ) LIST_NCENTER = ('ncenter_enable', 'ncenter_cats', 'ncenter_prio_startup', 'ncenter_prio_download', 'ncenter_prio_pp', 'ncenter_prio_complete', 'ncenter_prio_failed', 'ncenter_prio_disk_full', 'ncenter_prio_warning', 'ncenter_prio_error', 'ncenter_prio_queue_done', 'ncenter_prio_other', 'ncenter_prio_new_login') LIST_ACENTER = ('acenter_enable', 'acenter_cats', 'acenter_prio_startup', 'acenter_prio_download', 'acenter_prio_pp', 'acenter_prio_complete', 'acenter_prio_failed', 'acenter_prio_disk_full', 'acenter_prio_warning', 'acenter_prio_error', 'acenter_prio_queue_done', 'acenter_prio_other', 'acenter_prio_new_login') LIST_NTFOSD = ('ntfosd_enable', 'ntfosd_cats', 'ntfosd_prio_startup', 'ntfosd_prio_download', 'ntfosd_prio_pp', 'ntfosd_prio_complete', 'ntfosd_prio_failed', 'ntfosd_prio_disk_full', 'ntfosd_prio_warning', 'ntfosd_prio_error', 'ntfosd_prio_queue_done', 'ntfosd_prio_other', 'ntfosd_prio_new_login') LIST_PROWL = ('prowl_enable', 'prowl_cats', 'prowl_apikey', 'prowl_prio_startup', 'prowl_prio_download', 'prowl_prio_pp', 'prowl_prio_complete', 'prowl_prio_failed', 'prowl_prio_disk_full', 'prowl_prio_warning', 'prowl_prio_error', 'prowl_prio_queue_done', 'prowl_prio_other', 'prowl_prio_new_login') LIST_PUSHOVER = ('pushover_enable', 'pushover_cats', 'pushover_token', 'pushover_userkey', 'pushover_device', 'pushover_prio_startup', 'pushover_prio_download', 'pushover_prio_pp', 'pushover_prio_complete', 'pushover_prio_failed', 'pushover_prio_disk_full', 'pushover_prio_warning', 'pushover_prio_error', 'pushover_prio_queue_done', 'pushover_prio_other', 'pushover_prio_new_login', 'pushover_emergency_retry', 'pushover_emergency_expire') LIST_PUSHBULLET = ('pushbullet_enable', 'pushbullet_cats', 'pushbullet_apikey', 'pushbullet_device', 'pushbullet_prio_startup', 'pushbullet_prio_download', 'pushbullet_prio_pp', 'pushbullet_prio_complete', 'pushbullet_prio_failed', 'pushbullet_prio_disk_full', 'pushbullet_prio_warning', 'pushbullet_prio_error', 'pushbullet_prio_queue_done', 'pushbullet_prio_other', 'pushbullet_prio_new_login') LIST_NSCRIPT = ('nscript_enable', 'nscript_cats', 'nscript_script', 'nscript_parameters', 'nscript_prio_startup', 'nscript_prio_download', 'nscript_prio_pp', 'nscript_prio_complete', 'nscript_prio_failed', 'nscript_prio_disk_full', 'nscript_prio_warning', 'nscript_prio_error', 'nscript_prio_queue_done', 'nscript_prio_other', 'nscript_prio_new_login') class ConfigNotify: def __init__(self, root): self.__root = root self.__lastmail = None @secured_expose(check_configlock=True) def index(self, **kwargs): conf = build_header(sabnzbd.WEB_DIR_CONFIG) conf['categories'] = list_cats(False) conf['lastmail'] = self.__lastmail conf['have_ntfosd'] = sabnzbd.notifier.have_ntfosd() conf['have_ncenter'] = sabnzbd.DARWIN and sabnzbd.FOUNDATION conf['scripts'] = list_scripts(default=False, none=True) for kw in LIST_EMAIL: conf[kw] = config.get_config('misc', kw).get_string() for kw in LIST_PROWL: conf[kw] = config.get_config('prowl', kw)() for kw in LIST_PUSHOVER: conf[kw] = config.get_config('pushover', kw)() for kw in LIST_PUSHBULLET: conf[kw] = config.get_config('pushbullet', kw)() for kw in LIST_NCENTER: conf[kw] = config.get_config('ncenter', kw)() for kw in LIST_ACENTER: conf[kw] = config.get_config('acenter', kw)() for kw in LIST_NTFOSD: conf[kw] = config.get_config('ntfosd', kw)() for kw in LIST_NSCRIPT: conf[kw] = config.get_config('nscript', kw)() conf['notify_keys'] = sabnzbd.constants.NOTIFY_KEYS conf['notify_texts'] = sabnzbd.notifier.NOTIFICATION template = Template(file=os.path.join(sabnzbd.WEB_DIR_CONFIG, 'config_notify.tmpl'), searchList=[conf], compilerSettings=CHEETAH_DIRECTIVES) return template.respond() @secured_expose(check_session_key=True, check_configlock=True) def saveEmail(self, **kwargs): ajax = kwargs.get('ajax') for kw in LIST_EMAIL: msg = config.get_config('misc', kw).set(kwargs.get(kw)) if msg: return badParameterResponse(T('Incorrect value for %s: %s') % (kw, msg), ajax) for kw in LIST_NCENTER: msg = config.get_config('ncenter', kw).set(kwargs.get(kw)) if msg: return badParameterResponse(T('Incorrect value for %s: %s') % (kw, msg), ajax) for kw in LIST_ACENTER: msg = config.get_config('acenter', kw).set(kwargs.get(kw)) if msg: return badParameterResponse(T('Incorrect value for %s: %s') % (kw, msg), ajax) for kw in LIST_NTFOSD: msg = config.get_config('ntfosd', kw).set(kwargs.get(kw)) if msg: return badParameterResponse(T('Incorrect value for %s: %s') % (kw, msg), ajax) for kw in LIST_PROWL: msg = config.get_config('prowl', kw).set(kwargs.get(kw)) if msg: return badParameterResponse(T('Incorrect value for %s: %s') % (kw, msg), ajax) for kw in LIST_PUSHOVER: msg = config.get_config('pushover', kw).set(kwargs.get(kw)) if msg: return badParameterResponse(T('Incorrect value for %s: %s') % (kw, msg), ajax) for kw in LIST_PUSHBULLET: msg = config.get_config('pushbullet', kw).set(kwargs.get(kw, 0)) if msg: return badParameterResponse(T('Incorrect value for %s: %s') % (kw, msg), ajax) for kw in LIST_NSCRIPT: msg = config.get_config('nscript', kw).set(kwargs.get(kw, 0)) if msg: return badParameterResponse(T('Incorrect value for %s: %s') % (kw, msg), ajax) config.save_config() self.__lastmail = None if ajax: return sabnzbd.api.report('json') else: raise Raiser(self.__root) sabnzbd-develop/sabnzbd/nzbparser.py0000600000175000017500000001226313642116632015744 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2008-2017 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.nzbparser - Parse and import NZB files """ import time import logging import hashlib import xml.etree.ElementTree import datetime import sabnzbd from sabnzbd.encoding import utob def nzbfile_parser(raw_data, nzo): # Load data as file-object raw_data = raw_data.replace("http://www.newzbin.com/DTD/2003/nzb", "", 1) nzb_tree = xml.etree.ElementTree.fromstring(raw_data) # Hash for dupe-checking md5sum = hashlib.md5() # Average date avg_age_sum = 0 # In case of failing timestamps and failing files time_now = time.time() skipped_files = 0 valid_files = 0 # Parse the header if nzb_tree.find("head"): for meta in nzb_tree.find("head").iter("meta"): meta_type = meta.attrib.get("type") if meta_type and meta.text: # Meta tags can occur multiple times if meta_type not in nzo.meta: nzo.meta[meta_type] = [] nzo.meta[meta_type].append(meta.text) logging.debug("NZB Meta-data = %s", nzo.meta) # Parse the files for file in nzb_tree.iter("file"): # Get subject and date file_name = "" if file.attrib.get("subject"): file_name = file.attrib.get("subject") # Don't fail if no date present try: file_date = datetime.datetime.fromtimestamp(int(file.attrib.get("date"))) file_timestamp = int(file.attrib.get("date")) except: file_date = datetime.datetime.fromtimestamp(time_now) file_timestamp = time_now # Get group for group in file.iter("group"): if group.text not in nzo.groups: nzo.groups.append(group.text) # Get segments article_db = {} file_bytes = 0 if file.find("segments"): for segment in file.find("segments").iter("segment"): try: article_id = segment.text segment_size = int(segment.attrib.get("bytes")) partnum = int(segment.attrib.get("number")) # Update hash md5sum.update(utob(article_id)) # Duplicate parts? if partnum in article_db: if article_id != article_db[partnum][0]: logging.info( "Duplicate part %s, but different ID-s (%s // %s)", partnum, article_db[partnum][0], article_id, ) nzo.increase_bad_articles_counter("duplicate_articles") else: logging.info("Skipping duplicate article (%s)", article_id) elif segment_size <= 0 or segment_size >= 2 ** 23: # Perform sanity check (not negative, 0 or larger than 8MB) on article size # We use this value later to allocate memory in cache and sabyenc logging.info("Skipping article %s due to strange size (%s)", article_id, segment_size) nzo.increase_bad_articles_counter("bad_articles") else: article_db[partnum] = (article_id, segment_size) file_bytes += segment_size except: # In case of missing attributes pass # Create NZF nzf = sabnzbd.nzbstuff.NzbFile(file_date, file_name, article_db, file_bytes, nzo) # Add valid NZF's if file_name and nzf.valid and nzf.nzf_id: logging.info("File %s added to queue", nzf.filename) nzo.files.append(nzf) nzo.files_table[nzf.nzf_id] = nzf nzo.bytes += nzf.bytes valid_files += 1 avg_age_sum += file_timestamp else: logging.info("Error importing %s, skipping", file_name) if nzf.nzf_id: sabnzbd.remove_data(nzf.nzf_id, nzo.workpath) skipped_files += 1 # Final bookkeeping files = max(1, valid_files) nzo.avg_stamp = avg_age_sum / files nzo.avg_date = datetime.datetime.fromtimestamp(avg_age_sum / files) nzo.md5sum = md5sum.hexdigest() if skipped_files: logging.warning(T("Failed to import %s files from %s"), skipped_files, nzo.filename) sabnzbd-develop/sabnzbd/rating.py0000600000175000017500000003142013642116632015216 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2008-2012 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.rating - Rating support functions """ import http.client import urllib.parse import time import logging import copy import queue import collections from threading import RLock, Thread import sabnzbd from sabnzbd.decorators import synchronized import sabnzbd.cfg as cfg # A queue which ignores duplicates but maintains ordering class OrderedSetQueue(queue.Queue): def _init(self, maxsize): self.maxsize = maxsize self.queue = collections.OrderedDict() def _put(self, item): self.queue[item] = None def _get(self): return self.queue.popitem()[0] _RATING_URL = "/releaseRatings/releaseRatings.php" RATING_LOCK = RLock() _g_warnings = 0 def _warn(msg): global _g_warnings _g_warnings += 1 if _g_warnings < 3: logging.warning(msg) def _reset_warn(): global _g_warnings _g_warnings = 0 class NzbRating: def __init__(self): self.avg_video = 0 self.avg_video_cnt = 0 self.avg_audio = 0 self.avg_audio_cnt = 0 self.avg_vote_up = 0 self.avg_vote_down = 0 self.user_video = None self.user_audio = None self.user_vote = None self.user_flag = {} self.auto_flag = {} self.changed = 0 class NzbRatingV2(NzbRating): def __init__(self): super(NzbRatingV2, self).__init__() self.avg_spam_cnt = 0 self.avg_spam_confirm = False self.avg_encrypted_cnt = 0 self.avg_encrypted_confirm = False def to_v2(self, rating): self.__dict__.update(rating.__dict__) return self class Rating(Thread): VERSION = 2 VOTE_UP = 1 VOTE_DOWN = 2 FLAG_OK = 0 FLAG_SPAM = 1 FLAG_ENCRYPTED = 2 FLAG_EXPIRED = 3 FLAG_OTHER = 4 FLAG_COMMENT = 5 CHANGED_USER_VIDEO = 0x01 CHANGED_USER_AUDIO = 0x02 CHANGED_USER_VOTE = 0x04 CHANGED_USER_FLAG = 0x08 CHANGED_AUTO_FLAG = 0x10 do = None def __init__(self): Rating.do = self self.shutdown = False self.queue = OrderedSetQueue() try: self.version, self.ratings, self.nzo_indexer_map = sabnzbd.load_admin("Rating.sab", silent=not cfg.rating_enable()) if self.version == 1: ratings = {} for k, v in self.ratings.items(): ratings[k] = NzbRatingV2().to_v2(v) self.ratings = ratings self.version = 2 if self.version != Rating.VERSION: raise Exception() except: self.version = Rating.VERSION self.ratings = {} self.nzo_indexer_map = {} Thread.__init__(self) def stop(self): self.shutdown = True self.queue.put(None) # Unblock queue def run(self): self.shutdown = False while not self.shutdown: time.sleep(1) if not cfg.rating_enable(): continue indexer_id = self.queue.get() try: if indexer_id and not self._send_rating(indexer_id): for unused in range(0, 60): if self.shutdown: break time.sleep(1) self.queue.put(indexer_id) except: pass logging.debug('Stopping ratings') @synchronized(RATING_LOCK) def save(self): if self.ratings and self.nzo_indexer_map: sabnzbd.save_admin((self.version, self.ratings, self.nzo_indexer_map), "Rating.sab") # The same file may be uploaded multiple times creating a new nzo_id each time @synchronized(RATING_LOCK) def add_rating(self, indexer_id, nzo_id, fields): if indexer_id and nzo_id: logging.debug('Add rating (%s, %s: %s, %s, %s, %s)', indexer_id, nzo_id, fields['video'], fields['audio'], fields['voteup'], fields['votedown']) try: rating = self.ratings.get(indexer_id, NzbRatingV2()) if fields['video'] and fields['videocnt']: rating.avg_video = int(float(fields['video'])) rating.avg_video_cnt = int(float(fields['videocnt'])) if fields['audio'] and fields['audiocnt']: rating.avg_audio = int(float(fields['audio'])) rating.avg_audio_cnt = int(float(fields['audiocnt'])) if fields['voteup']: rating.avg_vote_up = int(float(fields['voteup'])) if fields['votedown']: rating.avg_vote_down = int(float(fields['votedown'])) if fields['spam']: rating.avg_spam_cnt = int(float(fields['spam'])) if fields['confirmed-spam']: rating.avg_spam_confirm = (fields['confirmed-spam'].lower() == 'yes') if fields['passworded']: rating.avg_encrypted_cnt = int(float(fields['passworded'])) if fields['confirmed-passworded']: rating.avg_encrypted_confirm = (fields['confirmed-passworded'].lower() == 'yes') # Indexers can supply a full URL or just a host if fields['host']: rating.host = fields['host'][0] if fields['host'] and isinstance(fields['host'], list) else fields['host'] if fields['url']: rating.host = fields['url'][0] if fields['url'] and isinstance(fields['url'], list) else fields['url'] self.ratings[indexer_id] = rating self.nzo_indexer_map[nzo_id] = indexer_id except: pass @synchronized(RATING_LOCK) def update_user_rating(self, nzo_id, video, audio, vote, flag, flag_detail=None): logging.debug('Updating user rating (%s: %s, %s, %s, %s)', nzo_id, video, audio, vote, flag) if nzo_id not in self.nzo_indexer_map: logging.warning(T('Indexer id (%s) not found for ratings file'), nzo_id) return indexer_id = self.nzo_indexer_map[nzo_id] rating = self.ratings[indexer_id] if video: rating.user_video = int(video) rating.avg_video = int((rating.avg_video_cnt * rating.avg_video + rating.user_video) / (rating.avg_video_cnt + 1)) rating.changed = rating.changed | Rating.CHANGED_USER_VIDEO if audio: rating.user_audio = int(audio) rating.avg_audio = int((rating.avg_audio_cnt * rating.avg_audio + rating.user_audio) / (rating.avg_audio_cnt + 1)) rating.changed = rating.changed | Rating.CHANGED_USER_AUDIO if flag: rating.user_flag = {'val': int(flag), 'detail': flag_detail} rating.changed = rating.changed | Rating.CHANGED_USER_FLAG if vote: rating.changed = rating.changed | Rating.CHANGED_USER_VOTE if int(vote) == Rating.VOTE_UP: rating.avg_vote_up += 1 # Update if already a vote if rating.user_vote and rating.user_vote == Rating.VOTE_DOWN: rating.avg_vote_down -= 1 else: rating.avg_vote_down += 1 # Update if already a vote if rating.user_vote and rating.user_vote == Rating.VOTE_UP: rating.avg_vote_up -= 1 rating.user_vote = int(vote) self.queue.put(indexer_id) @synchronized(RATING_LOCK) def update_auto_flag(self, nzo_id, flag, flag_detail=None): if not flag or not cfg.rating_enable() or (nzo_id not in self.nzo_indexer_map): return logging.debug('Updating auto flag (%s: %s)', nzo_id, flag) indexer_id = self.nzo_indexer_map[nzo_id] rating = self.ratings[indexer_id] rating.auto_flag = {'val': int(flag), 'detail': flag_detail} rating.changed = rating.changed | Rating.CHANGED_AUTO_FLAG self.queue.put(indexer_id) @synchronized(RATING_LOCK) def get_rating_by_nzo(self, nzo_id): if nzo_id not in self.nzo_indexer_map: return None return copy.copy(self.ratings[self.nzo_indexer_map[nzo_id]]) @synchronized(RATING_LOCK) def _get_rating_by_indexer(self, indexer_id): return copy.copy(self.ratings[indexer_id]) def _flag_request(self, val, flag_detail, auto): if val == Rating.FLAG_SPAM: return {'m': 'rs', 'auto': auto} if val == Rating.FLAG_ENCRYPTED: return {'m': 'rp', 'auto': auto} if val == Rating.FLAG_EXPIRED: expired_host = flag_detail if flag_detail and len(flag_detail) > 0 else 'Other' return {'m': 'rpr', 'pr': expired_host, 'auto': auto} if (val == Rating.FLAG_OTHER) and flag_detail and len(flag_detail) > 0: return {'m': 'o', 'r': flag_detail} if (val == Rating.FLAG_COMMENT) and flag_detail and len(flag_detail) > 0: return {'m': 'rc', 'r': flag_detail} def _send_rating(self, indexer_id): logging.debug('Updating indexer rating (%s)', indexer_id) api_key = cfg.rating_api_key() rating_host = cfg.rating_host() rating_url = _RATING_URL requests = [] _headers = {'User-agent': 'SABnzbd+/%s' % sabnzbd.version.__version__, 'Content-type': 'application/x-www-form-urlencoded'} rating = self._get_rating_by_indexer(indexer_id) # Requesting info here ensures always have latest information even on retry if hasattr(rating, 'host') and rating.host: host_parsed = urllib.parse.urlparse(rating.host) rating_host = host_parsed.netloc # Is it an URL or just a HOST? if host_parsed.path and host_parsed.path != '/': rating_url = host_parsed.path + '?' + host_parsed.query if host_parsed.query else host_parsed.path if not rating_host: _warn('%s: %s' % (T('Cannot send, missing required data'), T('Server address'))) return True if not api_key: _warn('%s [%s]: %s - %s' % (T('Cannot send, missing required data'), rating_host, T('API Key'), T('This key provides identity to indexer. Check your profile on the indexer\'s website.'))) return True if rating.changed & Rating.CHANGED_USER_VIDEO: requests.append({'m': 'r', 'r': 'videoQuality', 'rn': rating.user_video}) if rating.changed & Rating.CHANGED_USER_AUDIO: requests.append({'m': 'r', 'r': 'audioQuality', 'rn': rating.user_audio}) if rating.changed & Rating.CHANGED_USER_VOTE: up_down = 'up' if rating.user_vote == Rating.VOTE_UP else 'down' requests.append({'m': 'v', 'v': up_down, 'r': 'overall'}) if rating.changed & Rating.CHANGED_USER_FLAG: requests.append(self._flag_request(rating.user_flag.get('val'), rating.user_flag.get('detail'), 0)) if rating.changed & Rating.CHANGED_AUTO_FLAG: requests.append(self._flag_request(rating.auto_flag.get('val'), rating.auto_flag.get('detail'), 1)) try: conn = http.client.HTTPSConnection(rating_host) for request in [r for r in requests if r is not None]: if api_key: request['apikey'] = api_key request['i'] = indexer_id conn.request('POST', rating_url, urllib.parse.urlencode(request), headers=_headers) response = conn.getresponse() response.read() if response.status == http.client.UNAUTHORIZED: _warn('Ratings server unauthorized user') return False elif response.status != http.client.OK: _warn('Ratings server failed to process request (%s, %s)' % (response.status, response.reason)) return False self.ratings[indexer_id].changed = self.ratings[indexer_id].changed & ~rating.changed _reset_warn() return True except: _warn('Problem accessing ratings server: %s' % rating_host) return False sabnzbd-develop/sabnzbd/version.py0000600000175000017500000000034013642116632015414 0ustar jpjp# This file will be patched by setup.py # The __version__ should be set to the branch name # (e.g. "develop" or "1.2.x") # You MUST use double quotes (so " and not ') __version__ = "3.0.0-develop" __baseline__ = "unknown" sabnzbd-develop/sabnzbd/newswrapper.py0000600000175000017500000004211613642116632016313 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.newswrapper """ import errno import socket from threading import Thread from nntplib import NNTPPermanentError import time import logging import ssl import sabnzbd from sabnzbd.constants import * from sabnzbd.encoding import utob import sabnzbd.cfg from sabnzbd.misc import nntp_to_msg, probablyipv4, probablyipv6 # Set pre-defined socket timeout socket.setdefaulttimeout(DEF_TIMEOUT) # getaddrinfo() can be very slow. In some situations this can lead # to delayed starts and timeouts on connections. # Because of this, the results will be cached in the server object. def _retrieve_info(server): """ Async attempt to run getaddrinfo() for specified server """ logging.debug('Retrieving server address information for %s', server.host) info = GetServerParms(server.host, server.port) if not info: server.bad_cons += server.threads else: server.bad_cons = 0 (server.info, server.request) = (info, False) sabnzbd.downloader.Downloader.do.wakeup() def request_server_info(server): """ Launch async request to resolve server address """ if not server.request: server.request = True Thread(target=_retrieve_info, args=(server,)).start() def GetServerParms(host, port): """ Return processed getaddrinfo() for server """ try: int(port) except: port = 119 opt = sabnzbd.cfg.ipv6_servers() ''' ... with the following meaning for 'opt': Control the use of IPv6 Usenet server addresses. Meaning: 0 = don't use 1 = use when available and reachable (DEFAULT) 2 = force usage (when SABnzbd's detection fails) ''' try: # Standard IPV4 or IPV6 ips = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) if opt == 2 or (opt == 1 and sabnzbd.EXTERNAL_IPV6) or (opt == 1 and sabnzbd.cfg.load_balancing() == 2): # IPv6 forced by user, or IPv6 allowed and reachable, or IPv6 allowed and loadbalancing-with-IPv6 activated # So return all IP addresses, no matter IPv4 or IPv6: return ips else: # IPv6 unreachable or not allowed by user, so only return IPv4 address(es): return [ip for ip in ips if ':' not in ip[4][0]] except: if opt == 2 or (opt == 1 and sabnzbd.EXTERNAL_IPV6) or (opt == 1 and sabnzbd.cfg.load_balancing() == 2): try: # Try IPV6 explicitly return socket.getaddrinfo(host, port, socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_IP, socket.AI_CANONNAME) except: # Nothing found! pass return False def con(sock, host, port, sslenabled, write_fds, nntp): try: sock.connect((host, port)) sock.setblocking(0) if sslenabled: # Log SSL/TLS info logging.info("%s@%s: Connected using %s (%s)", nntp.nw.thrdnum, nntp.nw.server.host, sock.version(), sock.cipher()[0]) nntp.nw.server.ssl_info = "%s (%s)" % (sock.version(), sock.cipher()[0]) # Now it's safe to add the socket to the list of active sockets. # 'write_fds' is an attribute of the Downloader singleton. # This direct access is needed to prevent multi-threading sync problems. if write_fds is not None: write_fds[sock.fileno()] = nntp.nw except (ssl.SSLError, ssl.CertificateError) as e: nntp.error(e) except socket.error as e: try: # socket.error can either return a string or a tuple if isinstance(e, tuple): (_errno, strerror) = e else: # Are we safe to hardcode the ETIMEDOUT error? (_errno, strerror) = (errno.ETIMEDOUT, str(e)) e = (_errno, strerror) # expected, do nothing if _errno == errno.EINPROGRESS: pass finally: nntp.error(e) class NNTP: # Pre-define attributes to save memory __slots__ = ('host', 'port', 'nw', 'blocking', 'error_msg', 'sock') def __init__(self, host, port, info, sslenabled, nw, block=False, write_fds=None): self.host = host self.port = port self.nw = nw self.blocking = block self.error_msg = None if not info: raise socket.error(errno.EADDRNOTAVAIL, "Address not available - Check for internet or DNS problems") af, socktype, proto, canonname, sa = info[0] # there will be a connect to host (or self.host, so let's force set 'af' to the correct value if probablyipv4(host): af = socket.AF_INET if probablyipv6(host): af = socket.AF_INET6 if sslenabled: # Use context or just wrapper if sabnzbd.CERTIFICATE_VALIDATION: # Setup the SSL socket ctx = ssl.create_default_context() if sabnzbd.cfg.require_modern_tls(): # We want a modern TLS (1.2 or higher), so we disallow older protocol versions (<= TLS 1.1) ctx.options |= ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 # Only verify hostname when we're strict if nw.server.ssl_verify < 2: ctx.check_hostname = False # Certificates optional if nw.server.ssl_verify == 0: ctx.verify_mode = ssl.CERT_NONE # Did the user set a custom cipher-string? if nw.server.ssl_ciphers: # At their own risk, socket will error out in case it was invalid ctx.set_ciphers(nw.server.ssl_ciphers) self.sock = ctx.wrap_socket(socket.socket(af, socktype, proto), server_hostname=str(nw.server.host)) else: # Use a regular wrapper, no certificate validation self.sock = ssl.wrap_socket(socket.socket(af, socktype, proto), ciphers=sabnzbd.cfg.ssl_ciphers()) else: self.sock = socket.socket(af, socktype, proto) try: # Open the connection in a separate thread due to avoid blocking # For server-testing we do want blocking if not block: Thread(target=con, args=(self.sock, self.host, self.port, sslenabled, write_fds, self)).start() else: # if blocking (server test) only wait for 15 seconds during connect until timeout self.sock.settimeout(15) self.sock.connect((self.host, self.port)) if sslenabled: # Log SSL/TLS info logging.info("%s@%s: Connected using %s (%s)", self.nw.thrdnum, self.nw.server.host, self.sock.version(), self.sock.cipher()[0]) self.nw.server.ssl_info = "%s (%s)" % (self.sock.version(), self.sock.cipher()[0]) except (ssl.SSLError, ssl.CertificateError) as e: self.error(e) except socket.error as e: try: # socket.error can either return a string or a tuple if isinstance(e, tuple): (_errno, strerror) = e else: # Are we safe to hardcode the ETIMEDOUT error? (_errno, strerror) = (errno.ETIMEDOUT, str(e)) e = (_errno, strerror) # expected, do nothing if _errno == errno.EINPROGRESS: pass finally: self.error(e) def error(self, error): raw_error_str = str(error) if 'SSL23_GET_SERVER_HELLO' in str(error) or 'SSL3_GET_RECORD' in raw_error_str: error = T('This server does not allow SSL on this port') # Catch certificate errors if type(error) == ssl.CertificateError or 'CERTIFICATE_VERIFY_FAILED' in raw_error_str: # Log the raw message for debug purposes logging.info('Certificate error for host %s: %s', self.nw.server.host, raw_error_str) # Try to see if we should catch this message and provide better text if 'hostname' in raw_error_str: raw_error_str = T('Certificate hostname mismatch: the server hostname is not listed in the certificate. This is a server issue.') elif 'certificate verify failed' in raw_error_str: raw_error_str = T('Certificate not valid. This is most probably a server issue.') # Reformat error error = T('Server %s uses an untrusted certificate [%s]') % (self.nw.server.host, raw_error_str) error = '%s - %s: %s' % (error, T('Wiki'), 'https://sabnzbd.org/certificate-errors') # Prevent throwing a lot of errors or when testing server if error not in self.nw.server.warning and not self.blocking: logging.error(error) # Pass to server-test if self.blocking: raise ssl.CertificateError(error) # Blocking = server-test, pass directly to display code if self.blocking: raise socket.error(errno.ECONNREFUSED, str(error)) else: msg = "Failed to connect: %s" % (str(error)) msg = "%s %s@%s:%s" % (msg, self.nw.thrdnum, self.host, self.port) self.error_msg = msg logging.info(msg) self.nw.server.warning = msg class NewsWrapper: # Pre-define attributes to save memory __slots__ = ('server', 'thrdnum', 'blocking', 'timeout', 'article', 'data', 'last_line', 'nntp', 'recv', 'connected', 'user_sent', 'pass_sent', 'group', 'user_ok', 'pass_ok', 'force_login') def __init__(self, server, thrdnum, block=False): self.server = server self.thrdnum = thrdnum self.blocking = block self.timeout = None self.article = None self.data = [] self.last_line = '' self.nntp = None self.recv = None self.connected = False self.user_sent = False self.pass_sent = False self.group = None self.user_ok = False self.pass_ok = False self.force_login = False @property def status_code(self): """ Shorthand to get the code """ try: return int(self.data[0][:3]) except: return None def init_connect(self, write_fds): # Server-info is normally requested by initialization of # servers in Downloader, but not when testing servers if self.blocking and not self.server.info: self.server.info = GetServerParms(self.server.host, self.server.port) # Construct NNTP object and shorthands self.nntp = NNTP(self.server.hostip, self.server.port, self.server.info, self.server.ssl, self, self.blocking, write_fds) self.recv = self.nntp.sock.recv self.timeout = time.time() + self.server.timeout def finish_connect(self, code): if not (self.server.username or self.server.password or self.force_login): self.connected = True self.user_sent = True self.user_ok = True self.pass_sent = True self.pass_ok = True if code == 501 and self.user_sent: # Change to a sensible text code = 481 self.data[0] = "%d %s" % (code, T('Authentication failed, check username/password.')) self.user_ok = True self.pass_sent = True if code == 480: self.force_login = True self.connected = False self.user_sent = False self.user_ok = False self.pass_sent = False self.pass_ok = False if code in (400, 502): raise NNTPPermanentError(nntp_to_msg(self.data)) elif not self.user_sent: command = utob('authinfo user %s\r\n' % self.server.username) self.nntp.sock.sendall(command) self.data = [] self.user_sent = True elif not self.user_ok: if code == 381: self.user_ok = True elif code == 281: # No login required self.user_ok = True self.pass_sent = True self.pass_ok = True self.connected = True if self.user_ok and not self.pass_sent: command = utob('authinfo pass %s\r\n' % self.server.password) self.nntp.sock.sendall(command) self.data = [] self.pass_sent = True elif self.user_ok and not self.pass_ok: if code != 281: # Assume that login failed (code 481 or other) raise NNTPPermanentError(nntp_to_msg(self.data)) else: self.connected = True self.timeout = time.time() + self.server.timeout def body(self, precheck): self.timeout = time.time() + self.server.timeout if precheck: if self.server.have_stat: command = utob('STAT <%s>\r\n' % (self.article.article)) else: command = utob('HEAD <%s>\r\n' % (self.article.article)) elif self.server.have_body: command = utob('BODY <%s>\r\n' % (self.article.article)) else: command = utob('ARTICLE <%s>\r\n' % (self.article.article)) self.nntp.sock.sendall(command) self.data = [] def send_group(self, group): self.timeout = time.time() + self.server.timeout command = utob('GROUP %s\r\n' % (group)) self.nntp.sock.sendall(command) self.data = [] def recv_chunk(self, block=False): """ Receive data, return #bytes, done, skip """ self.timeout = time.time() + self.server.timeout while 1: try: if self.nntp.nw.server.ssl: # SSL chunks come in 16K frames # Setting higher limits results in slowdown chunk = self.recv(16384) else: # Get as many bytes as possible chunk = self.recv(262144) break except ssl.SSLWantReadError as e: # SSL connections will block until they are ready. # Either ignore the connection until it responds # Or wait in a loop until it responds if block: # time.sleep(0.0001) continue else: return 0, False, True # Append so we can do 1 join(), much faster than multiple! self.data.append(chunk) # Official end-of-article is ".\r\n" but sometimes it can get lost between 2 chunks chunk_len = len(chunk) if chunk[-5:] == b'\r\n.\r\n': return (chunk_len, True, False) elif chunk_len < 5 and len(self.data) > 1: # We need to make sure the end is not split over 2 chunks # This is faster than join() combine_chunk = self.data[-2][-5:] + chunk if combine_chunk[-5:] == b'\r\n.\r\n': return (chunk_len, True, False) # Still in middle of data, so continue! return (chunk_len, False, False) def soft_reset(self): self.timeout = None self.article = None self.clear_data() def clear_data(self): self.data = [] self.last_line = '' def hard_reset(self, wait=True, quit=True): if self.nntp: try: if quit: self.nntp.sock.sendall(b'QUIT\r\n') time.sleep(0.1) self.nntp.sock.close() except: pass self.__init__(self.server, self.thrdnum) # Wait before re-using this newswrapper if wait: # Reset due to error condition, use server timeout self.timeout = time.time() + self.server.timeout else: # Reset for internal reasons, just wait 5 sec self.timeout = time.time() + 5 def terminate(self, quit=False): """ Close connection and remove nntp object """ if self.nntp: try: if quit: self.nntp.sock.sendall(b'QUIT\r\n') time.sleep(0.1) self.nntp.sock.close() except: pass del self.nntp sabnzbd-develop/sabnzbd/decorators.py0000600000175000017500000000341013642116632016075 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ############################################################################## # Decorators ############################################################################## from threading import RLock, Condition # All operations that modify the queue need to happen in a lock # Also used when importing NZBs to prevent IO-race conditions # Names of wrapper-functions should be the same in misc.caller_name # The NzbQueueLocker both locks and notifies the Downloader NZBQUEUE_LOCK = RLock() DOWNLOADER_CV = Condition(NZBQUEUE_LOCK) def synchronized(lock): def wrap(f): def call_func(*args, **kw): with lock: return f(*args, **kw) return call_func return wrap def NzbQueueLocker(func): global DOWNLOADER_CV def call_func(*params, **kparams): DOWNLOADER_CV.acquire() try: return func(*params, **kparams) finally: DOWNLOADER_CV.notify_all() DOWNLOADER_CV.release() return call_func sabnzbd-develop/sabnzbd/emailer.py0000600000175000017500000002330413642116632015352 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.emailer - Send notification emails """ import smtplib import os import logging import re import time import glob from Cheetah.Template import Template from email.message import EmailMessage from sabnzbd.constants import * import sabnzbd from sabnzbd.misc import to_units, split_host, time_format from sabnzbd.notifier import check_cat import sabnzbd.cfg as cfg RE_HEADER = re.compile(r"^([^:]+):(.*)") def errormsg(msg): logging.error(msg) return msg def get_email_date(): """ Return un-localized date string for the Date: field """ # Get locale independent date/time string: "Sun May 22 20:15:12 2011" day, month, dayno, hms, year = time.asctime(time.gmtime()).split() return "%s, %s %s %s %s +0000" % (day, dayno, month, year, hms) def send_email(message, email_to, test=None): """ Send message if message non-empty and email-parms are set """ # we should not use CFG if we are testing. we should use values # from UI instead. # email_to is replaced at send_with_template, since it can be an array if test: email_server = test.get("email_server") email_from = test.get("email_from") email_account = test.get("email_account") email_pwd = test.get("email_pwd") if email_pwd and not email_pwd.replace("*", ""): # If all stars, get stored password instead email_pwd = cfg.email_pwd() else: email_server = cfg.email_server() email_from = cfg.email_from() email_account = cfg.email_account() email_pwd = cfg.email_pwd() if not message.strip("\n\r\t "): return "Skipped empty message" # Prepare the email email_message = _prepare_message(message) if email_server and email_to and email_from: server, port = split_host(email_server) if not port: port = 25 logging.debug("Connecting to server %s:%s", server, port) try: mailconn = smtplib.SMTP_SSL(server, port) mailconn.ehlo() logging.debug("Connected to server %s:%s", server, port) except: # Non SSL mail server logging.debug("Non-SSL mail server detected reconnecting to server %s:%s", server, port) try: mailconn = smtplib.SMTP(server, port) mailconn.ehlo() except: logging.info("Traceback: ", exc_info=True) return errormsg(T("Failed to connect to mail server")) # TLS support if mailconn.ehlo_resp: m = re.search(b"STARTTLS", mailconn.ehlo_resp, re.IGNORECASE) if m: logging.debug("TLS mail server detected") try: mailconn.starttls() mailconn.ehlo() except: logging.info("Traceback: ", exc_info=True) return errormsg(T("Failed to initiate TLS connection")) # Authentication if (email_account != "") and (email_pwd != ""): try: mailconn.login(email_account, email_pwd) except smtplib.SMTPHeloError: return errormsg(T("The server didn't reply properly to the helo greeting")) except smtplib.SMTPAuthenticationError: return errormsg(T("Failed to authenticate to mail server")) except smtplib.SMTPException: return errormsg(T("No suitable authentication method was found")) except: logging.info("Traceback: ", exc_info=True) return errormsg(T("Unknown authentication failure in mail server")) try: mailconn.sendmail(email_from, email_to, email_message) msg = None except smtplib.SMTPHeloError: msg = errormsg("The server didn't reply properly to the helo greeting.") except smtplib.SMTPRecipientsRefused: msg = errormsg("The server rejected ALL recipients (no mail was sent).") except smtplib.SMTPSenderRefused: msg = errormsg("The server didn't accept the from_addr.") except smtplib.SMTPDataError: msg = errormsg("The server replied with an unexpected error code (other than a refusal of a recipient).") except: logging.info("Traceback: ", exc_info=True) msg = errormsg(T("Failed to send e-mail")) try: mailconn.close() except: logging.info("Traceback: ", exc_info=True) errormsg(T("Failed to close mail connection")) if msg: return msg else: logging.info("Notification e-mail successfully sent") return T("Email succeeded") else: return T("Cannot send, missing required data") def send_with_template(prefix, parm, test=None): """ Send an email using template """ parm["from"] = cfg.email_from() parm["date"] = get_email_date() ret = None email_templates = [] path = cfg.email_dir.get_path() if path and os.path.exists(path): try: email_templates = glob.glob(os.path.join(path, "%s-*.tmpl" % prefix)) except: logging.error(T("Cannot find email templates in %s"), path) else: path = os.path.join(sabnzbd.DIR_PROG, DEF_EMAIL_TMPL) tpath = os.path.join(path, "%s-%s.tmpl" % (prefix, cfg.language())) if os.path.exists(tpath): email_templates = [tpath] else: email_templates = [os.path.join(path, "%s-en.tmpl" % prefix)] for template_file in email_templates: if os.access(template_file, os.R_OK): if test: recipients = [test.get("email_to")] else: recipients = cfg.email_to() if len(recipients): for recipient in recipients: # Force-open as UTF-8, otherwise Cheetah breaks it with open(template_file, "r", encoding="utf-8") as template_fp: parm["to"] = recipient message = Template(file=template_fp, searchList=[parm], compilerSettings=CHEETAH_DIRECTIVES) ret = send_email(message.respond(), recipient, test) else: ret = T("No recipients given, no email sent") return ret def endjob( filename, cat, status, path, bytes_downloaded, fail_msg, stages, script, script_output, script_ret, test=None ): """ Send end-of-job email """ # Is it allowed? if not check_cat("misc", cat, keyword="email") and not test: return None # Translate the stage names tr = sabnzbd.api.Ttemplate if not status and fail_msg: xstages = {tr("stage-fail"): (fail_msg,)} else: xstages = {} for stage in stages: lines = [] for line in stages[stage]: if "\n" in line or "
" in line: lines.extend(line.replace("
", "\n").split("\n")) else: lines.append(line) xstages[tr("stage-" + stage.lower())] = lines parm = {} parm["status"] = status parm["name"] = filename parm["path"] = path parm["msgid"] = "" parm["stages"] = xstages parm["script"] = script parm["script_output"] = script_output parm["script_ret"] = script_ret parm["cat"] = cat parm["size"] = "%sB" % to_units(bytes_downloaded) parm["end_time"] = time.strftime(time_format("%Y-%m-%d %H:%M:%S"), time.localtime(time.time())) return send_with_template("email", parm, test) def rss_mail(feed, jobs): """ Send notification email containing list of files """ parm = {"amount": len(jobs), "feed": feed, "jobs": jobs} return send_with_template("rss", parm) def badfetch_mail(msg, url): """ Send notification email about failed NZB fetch """ parm = {"url": url, "msg": msg} return send_with_template("badfetch", parm) def diskfull_mail(): """ Send email about disk full, no templates """ if cfg.email_full(): return send_email( T( """To: %s From: %s Date: %s Subject: SABnzbd reports Disk Full Hi, SABnzbd has stopped downloading, because the disk is almost full. Please make room and resume SABnzbd manually. """ ) % (cfg.email_to.get_string(), cfg.email_from(), get_email_date()), cfg.email_to(), ) else: return "" def _prepare_message(txt): """ Parse the headers in the template to real headers """ msg = EmailMessage() payload = [] body = False header = False for line in txt.split("\n"): if header and not line: body = True if body: payload.append(line) else: # See if we match a header m = RE_HEADER.search(line) if m: header = True keyword = m.group(1).strip() value = m.group(2).strip() msg[keyword] = value msg.set_content("\n".join(payload)) return msg.as_bytes() sabnzbd-develop/sabnzbd/nzbqueue.py0000600000175000017500000010663313642116632015601 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.nzbqueue - nzb queue """ import os import logging import time import datetime import functools import sabnzbd from sabnzbd.nzbstuff import NzbObject from sabnzbd.misc import exit_sab, cat_to_opts, int_conv, caller_name, cmp, safe_lower from sabnzbd.filesystem import get_admin_path, remove_all, globber_full, remove_file from sabnzbd.panic import panic_queue import sabnzbd.database as database from sabnzbd.decorators import NzbQueueLocker from sabnzbd.constants import QUEUE_FILE_NAME, QUEUE_VERSION, FUTURE_Q_FOLDER, \ JOB_ADMIN, LOW_PRIORITY, NORMAL_PRIORITY, HIGH_PRIORITY, TOP_PRIORITY, \ REPAIR_PRIORITY, STOP_PRIORITY, VERIFIED_FILE, \ Status, IGNORED_FOLDERS, QNFO import sabnzbd.cfg as cfg from sabnzbd.articlecache import ArticleCache import sabnzbd.downloader from sabnzbd.assembler import Assembler, file_has_articles import sabnzbd.notifier as notifier from sabnzbd.bpsmeter import BPSMeter from sabnzbd.dirscanner import process_single_nzb class NzbQueue: """ Singleton NzbQueue """ do = None def __init__(self): self.__top_only = cfg.top_only() self.__nzo_list = [] self.__nzo_table = {} NzbQueue.do = self def read_queue(self, repair): """ Read queue from disk, supporting repair modes 0 = no repairs 1 = use existing queue, add missing "incomplete" folders 2 = Discard all queue admin, reconstruct from "incomplete" folders """ nzo_ids = [] if repair < 2: # Try to process the queue file try: data = sabnzbd.load_admin(QUEUE_FILE_NAME) if data: queue_vers, nzo_ids, _ = data if not queue_vers == QUEUE_VERSION: nzo_ids = [] logging.error(T('Incompatible queuefile found, cannot proceed')) if not repair: panic_queue(os.path.join(cfg.admin_dir.get_path(), QUEUE_FILE_NAME)) exit_sab(2) except: nzo_ids = [] logging.error(T('Error loading %s, corrupt file detected'), os.path.join(cfg.admin_dir.get_path(), QUEUE_FILE_NAME)) # First handle jobs in the queue file folders = [] for nzo_id in nzo_ids: folder, _id = os.path.split(nzo_id) path = get_admin_path(folder, future=False) # Try as normal job nzo = sabnzbd.load_data(_id, path, remove=False) if not nzo: # Try as future job path = get_admin_path(folder, future=True) nzo = sabnzbd.load_data(_id, path) if nzo: self.add(nzo, save=False, quiet=True) folders.append(folder) # Scan for any folders in "incomplete" that are not yet in the queue if repair: self.scan_jobs(not folders) # Handle any lost future jobs for item in globber_full(os.path.join(cfg.admin_dir.get_path(), FUTURE_Q_FOLDER)): path, nzo_id = os.path.split(item) if nzo_id not in self.__nzo_table: if nzo_id.startswith('SABnzbd_nzo'): nzo = sabnzbd.load_data(nzo_id, path, remove=True) if nzo: self.add(nzo, save=True) else: try: remove_file(item) except: pass @NzbQueueLocker def scan_jobs(self, all=False, action=True): """ Scan "incomplete" for missing folders, 'all' is True: Include active folders 'action' is True, do the recovery action returns list of orphaned folders """ result = [] # Folders from the download queue if all: registered = [] else: registered = [nzo.work_name for nzo in self.__nzo_list] # Retryable folders from History items = sabnzbd.api.build_history(output=True)[0] # Anything waiting or active or retryable is a known item registered.extend([os.path.basename(item['path']) for item in items if item['retry'] or item['loaded'] or item['status'] == Status.QUEUED]) # Repair unregistered folders for folder in globber_full(cfg.download_dir.get_path()): name = os.path.basename(folder) if os.path.isdir(folder) and name not in registered and name not in IGNORED_FOLDERS: if action: logging.info('Repairing job %s', folder) self.repair_job(folder) result.append(os.path.basename(folder)) else: if action: logging.info('Skipping repair for job %s', folder) return result def repair_job(self, folder, new_nzb=None, password=None): """ Reconstruct admin for a single job folder, optionally with new NZB """ # Check if folder exists if not folder or not os.path.exists(folder): return None name = os.path.basename(folder) path = os.path.join(folder, JOB_ADMIN) if hasattr(new_nzb, 'filename'): filename = new_nzb.filename else: filename = '' if not filename: # Was this file already post-processed? verified = sabnzbd.load_data(VERIFIED_FILE, path, remove=False) if not verified or not all(verified[x] for x in verified): filename = globber_full(path, '*.gz') if len(filename) > 0: logging.debug('Repair job %s by re-parsing stored NZB', name) nzo_id = sabnzbd.add_nzbfile(filename[0], pp=None, script=None, cat=None, priority=None, nzbname=name, reuse=True, password=password)[1] else: logging.debug('Repair job %s without stored NZB', name) nzo = NzbObject(name, pp=None, script=None, nzb='', cat=None, priority=None, nzbname=name, reuse=True) nzo.password = password self.add(nzo) nzo_id = nzo.nzo_id else: remove_all(path, '*.gz') logging.debug('Repair job %s with new NZB (%s)', name, filename) nzo_id = sabnzbd.add_nzbfile(new_nzb, pp=None, script=None, cat=None, priority=None, nzbname=name, reuse=True, password=password)[1] return nzo_id @NzbQueueLocker def send_back(self, nzo): """ Send back job to queue after successful pre-check """ try: nzb_path = globber_full(nzo.workpath, '*.gz')[0] except: logging.debug('Failed to find NZB file after pre-check (%s)', nzo.nzo_id) return # Need to remove it first, otherwise it might still be downloading self.remove(nzo, add_to_history=False, cleanup=False) res, nzo_ids = process_single_nzb(nzo.work_name, nzb_path, keep=True, reuse=True, nzo_id=nzo.nzo_id) if res == 0 and nzo_ids: # Reset reuse flag to make pause/abort on encryption possible self.__nzo_table[nzo_ids[0]].reuse = False @NzbQueueLocker def save(self, save_nzo=None): """ Save queue, all nzo's or just the specified one """ logging.info("Saving queue") nzo_ids = [] # Aggregate nzo_ids and save each nzo for nzo in self.__nzo_list[:]: if not nzo.is_gone(): nzo_ids.append(os.path.join(nzo.work_name, nzo.nzo_id)) if save_nzo is None or nzo is save_nzo: if not nzo.futuretype: # Also includes save_data for NZO nzo.save_to_disk() else: sabnzbd.save_data(nzo, nzo.nzo_id, nzo.workpath) sabnzbd.save_admin((QUEUE_VERSION, nzo_ids, []), QUEUE_FILE_NAME) def set_top_only(self, value): self.__top_only = value def generate_future(self, msg, pp=None, script=None, cat=None, url=None, priority=NORMAL_PRIORITY, nzbname=None): """ Create and return a placeholder nzo object """ logging.debug('Creating placeholder NZO') future_nzo = NzbObject(msg, pp, script, None, futuretype=True, cat=cat, url=url, priority=priority, nzbname=nzbname, status=Status.GRABBING) self.add(future_nzo) return future_nzo def change_opts(self, nzo_ids, pp): result = 0 for nzo_id in [item.strip() for item in nzo_ids.split(',')]: if nzo_id in self.__nzo_table: self.__nzo_table[nzo_id].set_pp(pp) result += 1 return result def change_script(self, nzo_ids, script): result = 0 for nzo_id in [item.strip() for item in nzo_ids.split(',')]: if nzo_id in self.__nzo_table: self.__nzo_table[nzo_id].script = script logging.info('Set script=%s for job %s', script, self.__nzo_table[nzo_id].final_name) result += 1 return result def change_cat(self, nzo_ids, cat, explicit_priority=None): result = 0 for nzo_id in [item.strip() for item in nzo_ids.split(',')]: if nzo_id in self.__nzo_table: nzo = self.__nzo_table[nzo_id] nzo.cat, pp, nzo.script, prio = cat_to_opts(cat) logging.info('Set cat=%s for job %s', cat, nzo.final_name) nzo.set_pp(pp) if explicit_priority is None: self.set_priority(nzo_id, prio) # Abort any ongoing unpacking if the category changed nzo.abort_direct_unpacker() result += 1 return result def change_name(self, nzo_id, name, password=None): if nzo_id in self.__nzo_table: nzo = self.__nzo_table[nzo_id] logging.info('Renaming %s to %s', nzo.final_name, name) # Abort any ongoing unpacking if the name changed (dirs change) nzo.abort_direct_unpacker() if not nzo.futuretype: nzo.set_final_name_pw(name, password) else: # Reset url fetch wait time nzo.url_wait = None nzo.url_tries = 0 return True else: return False def get_nzo(self, nzo_id): if nzo_id in self.__nzo_table: return self.__nzo_table[nzo_id] else: return None @NzbQueueLocker def add(self, nzo, save=True, quiet=False): if not nzo.nzo_id: nzo.nzo_id = sabnzbd.get_new_id('nzo', nzo.workpath, self.__nzo_table) # If no files are to be downloaded anymore, send to postproc if not nzo.files and not nzo.futuretype: self.end_job(nzo) return '' # Reset try_lists nzo.reset_try_list() if nzo.nzo_id: nzo.deleted = False priority = nzo.priority if sabnzbd.scheduler.analyse(False, priority): nzo.status = Status.PAUSED self.__nzo_table[nzo.nzo_id] = nzo if priority > HIGH_PRIORITY: # Top and repair priority items are added to the top of the queue self.__nzo_list.insert(0, nzo) elif priority == LOW_PRIORITY: self.__nzo_list.append(nzo) else: # for high priority we need to add the item at the bottom # of any other high priority items above the normal priority # for normal priority we need to add the item at the bottom # of the normal priority items above the low priority if self.__nzo_list: pos = 0 added = False for position in self.__nzo_list: if position.priority < priority: self.__nzo_list.insert(pos, nzo) added = True break pos += 1 if not added: # if there are no other items classed as a lower priority # then it will be added to the bottom of the queue self.__nzo_list.append(nzo) else: # if the queue is empty then simple append the item to the bottom self.__nzo_list.append(nzo) if save: self.save(nzo) if not (quiet or nzo.status == Status.FETCHING): notifier.send_notification(T('NZB added to queue'), nzo.filename, 'download', nzo.cat) if not quiet and cfg.auto_sort(): self.sort_by_avg_age() return nzo.nzo_id @NzbQueueLocker def remove(self, nzo_id, add_to_history=True, cleanup=True, delete_all_data=True): """ Remove NZO from queue. It can be added to history directly. Or, we do some clean-up, sometimes leaving some data. """ if nzo_id in self.__nzo_table: nzo = self.__nzo_table.pop(nzo_id) logging.info('[%s] Removing job %s', caller_name(), nzo.final_name) # Set statuses nzo.deleted = True if cleanup and not nzo.is_gone(): nzo.status = Status.DELETED self.__nzo_list.remove(nzo) if add_to_history: # Create the history DB instance history_db = database.HistoryDB() # Add the nzo to the database. Only the path, script and time taken is passed # Other information is obtained from the nzo history_db.add_history_db(nzo) history_db.close() sabnzbd.history_updated() elif cleanup: nzo.purge_data(delete_all_data=delete_all_data) self.save(False) return nzo_id return None @NzbQueueLocker def remove_multiple(self, nzo_ids, delete_all_data=True): removed = [] for nzo_id in nzo_ids: if self.remove(nzo_id, add_to_history=False, delete_all_data=delete_all_data): removed.append(nzo_id) # Save with invalid nzo_id, to that only queue file is saved self.save(False) # Any files left? Otherwise let's disconnect if self.actives(grabs=False) == 0 and cfg.autodisconnect(): # This was the last job, close server connections sabnzbd.downloader.Downloader.do.disconnect() return removed @NzbQueueLocker def remove_all(self, search=None): """ Remove NZO's that match the search-pattern """ nzo_ids = [] search = safe_lower(search) for nzo_id, nzo in self.__nzo_table.items(): if not search or search in nzo.final_name_pw_clean.lower(): nzo_ids.append(nzo_id) return self.remove_multiple(nzo_ids) def remove_nzf(self, nzo_id, nzf_id, force_delete=False): removed = [] if nzo_id in self.__nzo_table: nzo = self.__nzo_table[nzo_id] nzf = nzo.get_nzf_by_id(nzf_id) if nzf: removed.append(nzf_id) nzo.abort_direct_unpacker() post_done = nzo.remove_nzf(nzf) if post_done: if nzo.finished_files: self.end_job(nzo) else: self.remove(nzo_id, add_to_history=False, keep_basic=False) elif force_delete: # Force-remove all trace nzo.bytes -= nzf.bytes nzo.bytes_tried -= (nzf.bytes - nzf.bytes_left) del nzo.files_table[nzf_id] nzo.finished_files.remove(nzf) logging.info('Removed NZFs %s from job %s', removed, nzo.final_name) return removed def pause_multiple_nzo(self, nzo_ids): handled = [] for nzo_id in nzo_ids: self.pause_nzo(nzo_id) handled.append(nzo_id) return handled def pause_nzo(self, nzo_id): handled = [] if nzo_id in self.__nzo_table: nzo = self.__nzo_table[nzo_id] nzo.pause() logging.info("Paused nzo: %s", nzo_id) handled.append(nzo_id) return handled def resume_multiple_nzo(self, nzo_ids): handled = [] for nzo_id in nzo_ids: self.resume_nzo(nzo_id) handled.append(nzo_id) return handled @NzbQueueLocker def resume_nzo(self, nzo_id): handled = [] if nzo_id in self.__nzo_table: nzo = self.__nzo_table[nzo_id] nzo.resume() nzo.reset_all_try_lists() logging.info("Resumed nzo: %s", nzo_id) handled.append(nzo_id) return handled @NzbQueueLocker def switch(self, item_id_1, item_id_2): try: # Allow an index as second parameter, easier for some skins i = int(item_id_2) item_id_2 = self.__nzo_list[i].nzo_id except: pass try: nzo1 = self.__nzo_table[item_id_1] nzo2 = self.__nzo_table[item_id_2] except KeyError: # One or both jobs missing return -1, 0 if nzo1 == nzo2: return -1, 0 # get the priorities of the two items nzo1_priority = nzo1.priority nzo2_priority = nzo2.priority try: # get the item id of the item below to use in priority changing item_id_3 = self.__nzo_list[i + 1].nzo_id # if there is an item below the id1 and id2 then we need that too # to determine whether to change the priority nzo3 = self.__nzo_table[item_id_3] nzo3_priority = nzo3.priority # if id1 is surrounded by items of a different priority then change it's pririty to match if nzo2_priority != nzo1_priority and nzo3_priority != nzo1_priority or nzo2_priority > nzo1_priority: nzo1.priority = nzo2_priority except: nzo1.priority = nzo2_priority item_id_pos1 = -1 item_id_pos2 = -1 for i in range(len(self.__nzo_list)): if item_id_1 == self.__nzo_list[i].nzo_id: item_id_pos1 = i elif item_id_2 == self.__nzo_list[i].nzo_id: item_id_pos2 = i if (item_id_pos1 > -1) and (item_id_pos2 > -1): item = self.__nzo_list[item_id_pos1] logging.info('Switching job [%s] %s => [%s] %s', item_id_pos1, item.final_name, item_id_pos2, self.__nzo_list[item_id_pos2].final_name) del self.__nzo_list[item_id_pos1] self.__nzo_list.insert(item_id_pos2, item) return item_id_pos2, nzo1.priority # If moving failed/no movement took place return -1, nzo1.priority @NzbQueueLocker def move_up_bulk(self, nzo_id, nzf_ids, size): if nzo_id in self.__nzo_table: for unused in range(size): self.__nzo_table[nzo_id].move_up_bulk(nzf_ids) @NzbQueueLocker def move_top_bulk(self, nzo_id, nzf_ids): if nzo_id in self.__nzo_table: self.__nzo_table[nzo_id].move_top_bulk(nzf_ids) @NzbQueueLocker def move_down_bulk(self, nzo_id, nzf_ids, size): if nzo_id in self.__nzo_table: for unused in range(size): self.__nzo_table[nzo_id].move_down_bulk(nzf_ids) @NzbQueueLocker def move_bottom_bulk(self, nzo_id, nzf_ids): if nzo_id in self.__nzo_table: self.__nzo_table[nzo_id].move_bottom_bulk(nzf_ids) @NzbQueueLocker def sort_by_avg_age(self, reverse=False): logging.info("Sorting by average date... (reversed:%s)", reverse) self.__nzo_list = sort_queue_function(self.__nzo_list, _nzo_date_cmp, reverse) @NzbQueueLocker def sort_by_name(self, reverse=False): logging.info("Sorting by name... (reversed:%s)", reverse) self.__nzo_list = sort_queue_function(self.__nzo_list, _nzo_name_cmp, reverse) @NzbQueueLocker def sort_by_size(self, reverse=False): logging.info("Sorting by size... (reversed:%s)", reverse) self.__nzo_list = sort_queue_function(self.__nzo_list, _nzo_size_cmp, reverse) def sort_queue(self, field, reverse=None): if isinstance(reverse, str): if reverse.lower() == 'desc': reverse = True else: reverse = False if reverse is None: reverse = False if field.lower() == 'name': self.sort_by_name(reverse) elif field.lower() == 'size' or field.lower() == 'bytes': self.sort_by_size(reverse) elif field.lower() == 'avg_age': self.sort_by_avg_age(reverse) else: logging.debug("Sort: %s not recognized", field) @NzbQueueLocker def __set_priority(self, nzo_id, priority): """ Sets the priority on the nzo and places it in the queue at the appropriate position """ try: priority = int_conv(priority) nzo = self.__nzo_table[nzo_id] nzo_id_pos1 = -1 pos = -1 # If priority == STOP_PRIORITY, then send to queue if priority == STOP_PRIORITY: self.end_job(nzo) return # Get the current position in the queue for i in range(len(self.__nzo_list)): if nzo_id == self.__nzo_list[i].nzo_id: nzo_id_pos1 = i break # Don't change priority and order if priority is the same as asked if priority == self.__nzo_list[nzo_id_pos1].priority: return nzo_id_pos1 nzo.set_priority(priority) if sabnzbd.scheduler.analyse(False, priority) and \ nzo.status in (Status.CHECKING, Status.DOWNLOADING, Status.QUEUED): nzo.status = Status.PAUSED elif nzo.status == Status.PAUSED: nzo.status = Status.QUEUED nzo.save_to_disk() if nzo_id_pos1 != -1: del self.__nzo_list[nzo_id_pos1] if priority == TOP_PRIORITY: # A top priority item (usually a completed download fetching pars) # is added to the top of the queue self.__nzo_list.insert(0, nzo) pos = 0 elif priority == LOW_PRIORITY: pos = len(self.__nzo_list) self.__nzo_list.append(nzo) else: # for high priority we need to add the item at the bottom # of any other high priority items above the normal priority # for normal priority we need to add the item at the bottom # of the normal priority items above the low priority if self.__nzo_list: p = 0 added = False for position in self.__nzo_list: if position.priority < priority: self.__nzo_list.insert(p, nzo) pos = p added = True break p += 1 if not added: # if there are no other items classed as a lower priority # then it will be added to the bottom of the queue pos = len(self.__nzo_list) self.__nzo_list.append(nzo) else: # if the queue is empty then simple append the item to the bottom self.__nzo_list.append(nzo) pos = 0 logging.info('Set priority=%s for job %s => position=%s ', priority, self.__nzo_table[nzo_id].final_name, pos) return pos except: return -1 @NzbQueueLocker def set_priority(self, nzo_ids, priority): try: n = -1 for nzo_id in [item.strip() for item in nzo_ids.split(',')]: n = self.__set_priority(nzo_id, priority) return n except: return -1 def reset_try_lists(self, article, article_reset=True): """ Let article get new fetcher and reset trylists """ article.fetcher = None if article_reset: article.reset_try_list() article.nzf.reset_try_list() article.nzf.nzo.reset_try_list() def reset_all_try_lists(self): for nzo in self.__nzo_list: nzo.reset_all_try_lists() def has_forced_items(self): """ Check if the queue contains any Forced Priority items to download while paused """ for nzo in self.__nzo_list: if nzo.priority == TOP_PRIORITY and nzo.status not in (Status.PAUSED, Status.GRABBING): return True return False def get_article(self, server, servers): """ Get next article for jobs in the queue Not locked for performance, since it only reads the queue """ # Pre-calculate propagation delay propagtion_delay = float(cfg.propagation_delay() * 60) for nzo in self.__nzo_list: # Not when queue paused and not a forced item if nzo.status not in (Status.PAUSED, Status.GRABBING) or nzo.priority == TOP_PRIORITY: # Check if past propagation delay, or forced if not propagtion_delay or nzo.priority == TOP_PRIORITY or (nzo.avg_stamp + propagtion_delay) < time.time(): if not nzo.server_in_try_list(server): article = nzo.get_article(server, servers) if article: return article # Stop after first job that wasn't paused/propagating/etc if self.__top_only: return def register_article(self, article, found=True): """ Register the articles we tried Not locked for performance, since it only modifies individual NZOs """ nzf = article.nzf nzo = nzf.nzo if nzf.deleted: logging.debug("Discarding article %s, no longer in queue", article.article) return file_done, post_done = nzo.remove_article(article, found) filename = nzf.filename if nzo.is_gone(): logging.debug('Discarding article %s for deleted job', filename) else: if file_done: if nzo.next_save is None or time.time() > nzo.next_save: nzo.save_to_disk() BPSMeter.do.save() if nzo.save_timeout is None: nzo.next_save = None else: nzo.next_save = time.time() + nzo.save_timeout if not nzo.precheck: _type = nzf.type # Only start decoding if we have a filename and type if filename and _type: Assembler.do.process((nzo, nzf)) elif filename.lower().endswith('.par2'): # Broken par2 file, try to get another one nzo.promote_par2(nzf) else: if file_has_articles(nzf): logging.warning(T('%s -> Unknown encoding'), filename) if post_done: self.end_job(nzo) def end_job(self, nzo): """ Send NZO to the post-processing queue """ logging.info('[%s] Ending job %s', caller_name(), nzo.final_name) # Notify assembler to call postprocessor if not nzo.deleted: nzo.deleted = True if nzo.precheck: nzo.save_to_disk() # Check result enough, _ratio = nzo.check_availability_ratio() if enough: # Enough data present, do real download self.send_back(nzo) return else: # Not enough data, let postprocessor show it as failed pass Assembler.do.process((nzo, None)) def actives(self, grabs=True): """ Return amount of non-paused jobs, optionally with 'grabbing' items Not locked for performance, only reads the queue """ n = 0 for nzo in self.__nzo_list: # Ignore any items that are paused if grabs and nzo.status == Status.GRABBING: n += 1 elif nzo.status not in (Status.PAUSED, Status.GRABBING): n += 1 return n def queue_info(self, search=None, start=0, limit=0): """ Return list of queued jobs, optionally filtered by 'search' and limited by start and limit. Not locked for performance, only reads the queue """ if search: search = search.lower() bytes_left = 0 bytes_total = 0 bytes_left_previous_page = 0 q_size = 0 pnfo_list = [] n = 0 for nzo in self.__nzo_list: if nzo.status not in (Status.PAUSED, Status.CHECKING) or nzo.priority == TOP_PRIORITY: b_left = nzo.remaining bytes_total += nzo.bytes bytes_left += b_left q_size += 1 # We need the number of bytes before the current page if n < start: bytes_left_previous_page += b_left if (not search) or search in nzo.final_name_pw_clean.lower(): if (not limit) or (start <= n < start + limit): pnfo_list.append(nzo.gather_info()) n += 1 if not search: n = len(self.__nzo_list) return QNFO(bytes_total, bytes_left, bytes_left_previous_page, pnfo_list, q_size, n) def remaining(self): """ Return bytes left in the queue by non-paused items Not locked for performance, only reads the queue """ bytes_left = 0 for nzo in self.__nzo_list: if nzo.status != Status.PAUSED: bytes_left += nzo.remaining return bytes_left def is_empty(self): empty = True for nzo in self.__nzo_list: if not nzo.futuretype and nzo.status != Status.PAUSED: empty = False break return empty def stop_idle_jobs(self): """ Detect jobs that have zero files left and send them to post processing """ empty = [] for nzo in self.__nzo_list: if not nzo.futuretype and not nzo.files and nzo.status not in (Status.PAUSED, Status.GRABBING): logging.info('Found idle job %s', nzo.final_name) empty.append(nzo) # Stall prevention by checking if all servers are in the trylist # This is a CPU-cheaper alternative to prevent stalling if len(nzo.try_list) == sabnzbd.downloader.Downloader.do.server_nr: # Maybe the NZF's need a reset too? for nzf in nzo.files: if len(nzf.try_list) == sabnzbd.downloader.Downloader.do.server_nr: # We do not want to reset all article trylists, they are good logging.info('Resetting bad trylist for file %s in job %s', nzf.filename, nzo.final_name) nzf.reset_try_list() # Reset main trylist, minimal performance impact logging.info('Resetting bad trylist for job %s', nzo.final_name) nzo.reset_try_list() for nzo in empty: self.end_job(nzo) def pause_on_prio(self, priority): for nzo in self.__nzo_list: if nzo.priority == priority: nzo.pause() @NzbQueueLocker def resume_on_prio(self, priority): for nzo in self.__nzo_list: if nzo.priority == priority: # Don't use nzo.resume() to avoid resetting job warning flags nzo.status = Status.QUEUED def pause_on_cat(self, cat): for nzo in self.__nzo_list: if nzo.cat == cat: nzo.pause() @NzbQueueLocker def resume_on_cat(self, cat): for nzo in self.__nzo_list: if nzo.cat == cat: # Don't use nzo.resume() to avoid resetting job warning flags nzo.status = Status.QUEUED def get_urls(self): """ Return list of future-types needing URL """ lst = [] for nzo_id in self.__nzo_table: nzo = self.__nzo_table[nzo_id] if nzo.futuretype: url = nzo.url if nzo.futuretype and url.lower().startswith('http'): lst.append((url, nzo)) return lst def __repr__(self): return "" def _nzo_date_cmp(nzo1, nzo2): avg_date1 = nzo1.avg_date avg_date2 = nzo2.avg_date if avg_date1 is None and avg_date2 is None: return 0 if avg_date1 is None: avg_date1 = datetime.datetime.now() elif avg_date2 is None: avg_date2 = datetime.datetime.now() return cmp(avg_date1, avg_date2) def _nzo_name_cmp(nzo1, nzo2): return cmp(nzo1.final_name.lower(), nzo2.final_name.lower()) def _nzo_size_cmp(nzo1, nzo2): return cmp(nzo1.bytes, nzo2.bytes) def sort_queue_function(nzo_list, method, reverse): ultra_high_priority = [nzo for nzo in nzo_list if nzo.priority == REPAIR_PRIORITY] super_high_priority = [nzo for nzo in nzo_list if nzo.priority == TOP_PRIORITY] high_priority = [nzo for nzo in nzo_list if nzo.priority == HIGH_PRIORITY] normal_priority = [nzo for nzo in nzo_list if nzo.priority == NORMAL_PRIORITY] low_priority = [nzo for nzo in nzo_list if nzo.priority == LOW_PRIORITY] ultra_high_priority.sort(key=functools.cmp_to_key(method), reverse=reverse) super_high_priority.sort(key=functools.cmp_to_key(method), reverse=reverse) high_priority.sort(key=functools.cmp_to_key(method), reverse=reverse) normal_priority.sort(key=functools.cmp_to_key(method), reverse=reverse) low_priority.sort(key=functools.cmp_to_key(method), reverse=reverse) new_list = ultra_high_priority new_list.extend(super_high_priority) new_list.extend(high_priority) new_list.extend(normal_priority) new_list.extend(low_priority) # Make sure any left-over jobs enter the new list for item in nzo_list: if item not in new_list: new_list.append(item) return new_list sabnzbd-develop/sabnzbd/directunpacker.py0000600000175000017500000004537413642116632016752 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.directunpacker """ import os import re import time import threading import subprocess import logging from subprocess import Popen import sabnzbd import sabnzbd.cfg as cfg from sabnzbd.misc import int_conv, format_time_string from sabnzbd.filesystem import clip_path, long_path, remove_all, real_path, remove_file from sabnzbd.encoding import platform_btou from sabnzbd.decorators import synchronized from sabnzbd.newsunpack import build_command, EXTRACTFROM_RE, EXTRACTED_RE, rar_volumelist from sabnzbd.postproc import prepare_extraction_path from sabnzbd.utils.rarfile import RarFile from sabnzbd.utils.diskspeed import diskspeedmeasure # Need a lock to make sure start and stop is handled correctly # Otherwise we could stop while the thread was still starting START_STOP_LOCK = threading.RLock() ACTIVE_UNPACKERS = [] RAR_NR = re.compile(r'(.*?)(\.part(\d*).rar|\.r(\d*))$', re.IGNORECASE) class DirectUnpacker(threading.Thread): def __init__(self, nzo): threading.Thread.__init__(self) self.nzo = nzo self.active_instance = None self.killed = False self.next_file_lock = threading.Condition(threading.RLock()) self.unpack_dir_info = None self.rarfile_nzf = None self.cur_setname = None self.cur_volume = 0 self.total_volumes = {} self.unpack_time = 0.0 self.success_sets = {} self.next_sets = [] self.duplicate_lines = 0 nzo.direct_unpacker = self def stop(self): pass def save(self): pass def reset_active(self): self.active_instance = None self.cur_setname = None self.cur_volume = 0 self.rarfile_nzf = None def check_requirements(self): if not cfg.direct_unpack() or self.killed or not self.nzo.unpack or self.nzo.bad_articles or sabnzbd.newsunpack.RAR_PROBLEM: return False return True def set_volumes_for_nzo(self): """ Loop over all files to detect the names """ none_counter = 0 found_counter = 0 for nzf in self.nzo.files + self.nzo.finished_files: nzf.setname, nzf.vol = analyze_rar_filename(nzf.filename) # We matched? if nzf.setname: found_counter += 1 if nzf.setname not in self.total_volumes: self.total_volumes[nzf.setname] = 0 self.total_volumes[nzf.setname] = max(self.total_volumes[nzf.setname], nzf.vol) else: none_counter += 1 # Too much not found? Obfuscated, ignore results if none_counter > found_counter: self.total_volumes = {} @synchronized(START_STOP_LOCK) def add(self, nzf): """ Add jobs and start instance of DirectUnpack """ if not cfg.direct_unpack_tested(): test_disk_performance() # Stop if something is wrong if not self.check_requirements(): return # Is this the first set? if not self.cur_setname: self.set_volumes_for_nzo() self.cur_setname = nzf.setname # Analyze updated filenames nzf.setname, nzf.vol = analyze_rar_filename(nzf.filename) # Are we doing this set? if self.cur_setname == nzf.setname: logging.debug('DirectUnpack queued %s for %s', nzf.filename, self.cur_setname) # Is this the first one of the first set? if not self.active_instance and not self.is_alive() and self.have_next_volume(): # Too many runners already? if len(ACTIVE_UNPACKERS) >= cfg.direct_unpack_threads(): logging.info('Too many DirectUnpackers currently to start %s', self.cur_setname) return # Start the unrar command and the loop self.create_unrar_instance() self.start() elif not any(test_nzf.setname == nzf.setname for test_nzf in self.next_sets): # Need to store this for the future, only once per set! self.next_sets.append(nzf) # Wake up the thread to see if this is good to go with self.next_file_lock: self.next_file_lock.notify() def run(self): # Input and output linebuf = '' last_volume_linebuf = '' unrar_log = [] rarfiles = [] extracted = [] start_time = time.time() # Need to read char-by-char because there's no newline after new-disk message while 1: if not self.active_instance: break char = platform_btou(self.active_instance.stdout.read(1)) linebuf += char if not char: # End of program break # Error? Let PP-handle it if linebuf.endswith(('ERROR: ', 'Cannot create', 'in the encrypted file', 'CRC failed', 'checksum failed', 'You need to start extraction from a previous volume', 'password is incorrect', 'Incorrect password', 'Write error', 'checksum error', 'start extraction from a previous volume', 'Unexpected end of archive')): logging.info('Error in DirectUnpack of %s: %s', self.cur_setname, linebuf.strip()) self.abort() if linebuf.endswith('\n'): # List files we used if linebuf.startswith('Extracting from'): filename = (re.search(EXTRACTFROM_RE, linebuf.strip()).group(1)) if filename not in rarfiles: rarfiles.append(filename) # List files we extracted m = re.search(EXTRACTED_RE, linebuf) if m: # In case of flat-unpack, UnRar still prints the whole path (?!) unpacked_file = m.group(2) if cfg.flat_unpack(): unpacked_file = os.path.basename(unpacked_file) extracted.append(real_path(self.unpack_dir_info[0], unpacked_file)) # Did we reach the end? if linebuf.endswith('All OK'): # Stop timer and finish self.unpack_time += time.time() - start_time ACTIVE_UNPACKERS.remove(self) # Add to success rarfile_path = os.path.join(self.nzo.downpath, self.rarfile_nzf.filename) self.success_sets[self.cur_setname] = (rar_volumelist(rarfile_path, self.nzo.password, rarfiles), extracted) logging.info('DirectUnpack completed for %s', self.cur_setname) self.nzo.set_action_line(T('Direct Unpack'), T('Completed')) # List success in history-info msg = T('Unpacked %s files/folders in %s') % (len(extracted), format_time_string(self.unpack_time)) msg = '%s - %s' % (T('Direct Unpack'), msg) self.nzo.set_unpack_info('Unpack', msg, self.cur_setname) # Write current log and clear unrar_log.append(linebuf.strip()) linebuf = '' last_volume_linebuf = '' logging.debug('DirectUnpack Unrar output %s', '\n'.join(unrar_log)) unrar_log = [] rarfiles = [] extracted = [] # Are there more files left? while self.nzo.files and not self.next_sets: with self.next_file_lock: self.next_file_lock.wait() # Is there another set to do? if self.next_sets: # Start new instance nzf = self.next_sets.pop(0) self.reset_active() self.cur_setname = nzf.setname # Wait for the 1st volume to appear self.wait_for_next_volume() self.create_unrar_instance() start_time = time.time() else: self.killed = True break if linebuf.endswith('[C]ontinue, [Q]uit '): # Stop timer self.unpack_time += time.time() - start_time # Wait for the next one.. self.wait_for_next_volume() # Possible that the instance was deleted while locked if not self.killed: # If unrar stopped or is killed somehow, writing will cause a crash try: # Give unrar some time to do it's thing self.active_instance.stdin.write(b'C\n') start_time = time.time() time.sleep(0.1) except IOError: self.abort() break # Did we unpack a new volume? Sometimes UnRar hangs on 1 volume if not last_volume_linebuf or last_volume_linebuf != linebuf: # Next volume self.cur_volume += 1 self.nzo.set_action_line(T('Direct Unpack'), self.get_formatted_stats()) logging.info('DirectUnpacked volume %s for %s', self.cur_volume, self.cur_setname) # If lines did not change and we don't have the next volume, this download is missing files! # In rare occasions we can get stuck forever with repeating lines if last_volume_linebuf == linebuf: if not self.have_next_volume() or self.duplicate_lines > 10: logging.info('DirectUnpack failed due to missing files %s', self.cur_setname) self.abort() else: logging.debug('Duplicate output line detected: "%s"', last_volume_linebuf) self.duplicate_lines += 1 else: self.duplicate_lines = 0 last_volume_linebuf = linebuf # Show the log if linebuf.endswith('\n'): unrar_log.append(linebuf.strip()) linebuf = '' # Add last line unrar_log.append(linebuf.strip()) logging.debug('DirectUnpack Unrar output %s', '\n'.join(unrar_log)) # Make more space self.reset_active() if self in ACTIVE_UNPACKERS: ACTIVE_UNPACKERS.remove(self) # Set the thread to killed so it never gets restarted by accident self.killed = True def have_next_volume(self): """ Check if next volume of set is available, start from the end of the list where latest completed files are Make sure that files are 100% written to disk by checking md5sum """ for nzf_search in reversed(self.nzo.finished_files): if nzf_search.setname == self.cur_setname and nzf_search.vol == (self.cur_volume+1) and nzf_search.md5sum: return nzf_search return False def wait_for_next_volume(self): """ Wait for the correct volume to appear But stop if it was killed or the NZB is done """ while not self.have_next_volume() and not self.killed and self.nzo.files: with self.next_file_lock: self.next_file_lock.wait() @synchronized(START_STOP_LOCK) def create_unrar_instance(self): """ Start the unrar instance using the user's options """ # Generate extraction path and save for post-proc if not self.unpack_dir_info: try: self.unpack_dir_info = prepare_extraction_path(self.nzo) except: # Prevent fatal crash if directory creation fails self.abort() return # Get the information extraction_path, _, _, one_folder, _ = self.unpack_dir_info # Set options if self.nzo.password: password_command = '-p%s' % self.nzo.password else: password_command = '-p-' if one_folder or cfg.flat_unpack(): action = 'e' else: action = 'x' # The first NZF self.rarfile_nzf = self.have_next_volume() # Ignore if maybe this set is not there any more # This can happen due to race/timing issues when creating the sets if not self.rarfile_nzf: return # Generate command rarfile_path = os.path.join(self.nzo.downpath, self.rarfile_nzf.filename) if sabnzbd.WIN32: # For Unrar to support long-path, we need to cricumvent Python's list2cmdline # See: https://github.com/sabnzbd/sabnzbd/issues/1043 command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', '-ai', password_command, '%s' % clip_path(rarfile_path), '%s\\' % long_path(extraction_path)] else: # Don't use "-ai" (not needed for non-Windows) command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', password_command, '%s' % rarfile_path, '%s/' % extraction_path] if cfg.ignore_unrar_dates(): command.insert(3, '-tsm-') # Let's start from the first one! self.cur_volume = 1 stup, need_shell, command, creationflags = build_command(command, flatten_command=True) logging.debug('Running unrar for DirectUnpack %s', command) # Need to disable buffer to have direct feedback self.active_instance = Popen(command, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=stup, creationflags=creationflags, bufsize=0) # Add to runners ACTIVE_UNPACKERS.append(self) # Doing the first logging.info('DirectUnpacked volume %s for %s', self.cur_volume, self.cur_setname) @synchronized(START_STOP_LOCK) def abort(self): """ Abort running instance and delete generated files """ if not self.killed and self.cur_setname: logging.info('Aborting DirectUnpack for %s', self.cur_setname) self.killed = True # Save reference to the first rarfile rarfile_nzf = self.rarfile_nzf # Abort Unrar if self.active_instance: # First we try to abort gracefully try: self.active_instance.stdin.write(b'Q\n') time.sleep(0.2) except IOError: pass # Now force kill and give it a bit of time try: self.active_instance.kill() time.sleep(0.2) except AttributeError: # Already killed by the Quit command pass # Wake up the thread with self.next_file_lock: self.next_file_lock.notify() # No new sets self.next_sets = [] self.success_sets = {} # Remove files if self.unpack_dir_info: extraction_path, _, _, one_folder, _ = self.unpack_dir_info # In case of flat-unpack we need to remove the files manually if one_folder: # RarFile can fail for mysterious reasons try: rar_contents = RarFile(os.path.join(self.nzo.downpath, rarfile_nzf.filename), all_names=True).filelist() for rm_file in rar_contents: # Flat-unpack, so remove foldername from RarFile output f = os.path.join(extraction_path, os.path.basename(rm_file)) remove_file(f) except: # The user will have to remove it themselves logging.info('Failed to clean Direct Unpack after aborting %s', rarfile_nzf.filename, exc_info=True) else: # We can just remove the whole path remove_all(extraction_path, recursive=True) # Remove dir-info self.unpack_dir_info = None # Reset settings self.reset_active() def get_formatted_stats(self): """ Get percentage or number of rar's done """ if self.cur_setname and self.cur_setname in self.total_volumes: # This won't work on obfuscated posts if self.total_volumes[self.cur_setname] >= self.cur_volume and self.cur_volume: return '%02d/%02d' % (self.cur_volume, self.total_volumes[self.cur_setname]) return self.cur_volume def analyze_rar_filename(filename): """ Extract volume number and setname from rar-filenames Both ".part01.rar" and ".r01" """ m = RAR_NR.search(filename) if m: if m.group(4): # Special since starts with ".rar", ".r00" return m.group(1), int_conv(m.group(4)) + 2 return m.group(1), int_conv(m.group(3)) else: # Detect if first of "rxx" set if filename.endswith('.rar'): return os.path.splitext(filename)[0], 1 return None, None def abort_all(): """ Abort all running DirectUnpackers """ logging.info('Aborting all DirectUnpackers') for direct_unpacker in ACTIVE_UNPACKERS: direct_unpacker.abort() def test_disk_performance(): """ Test the incomplete-dir performance and enable Direct Unpack if good enough (> 40MB/s) """ if diskspeedmeasure(sabnzbd.cfg.download_dir.get_path()) > 40: cfg.direct_unpack.set(True) logging.warning(T('Direct Unpack was automatically enabled.') + ' ' + T('Jobs will start unpacking during the downloading to reduce post-processing time. Only works for jobs that do not need repair.')) else: logging.info('Direct Unpack was not enabled, incomplete folder disk speed below 40MB/s') cfg.direct_unpack_tested.set(True) sabnzbd.config.save_config() sabnzbd-develop/sabnzbd/utils/0000700000175000017500000000000013642116632014516 5ustar jpjpsabnzbd-develop/sabnzbd/utils/rarfile.py0000600000175000017500000025031313642116632016522 0ustar jpjp# rarfile.py # # Copyright (c) 2005-2016 Marko Kreen # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. r"""RAR archive reader. This is Python module for Rar archive reading. The interface is made as :mod:`zipfile`-like as possible. Basic logic: - Parse archive structure with Python. - Extract non-compressed files with Python - Extract compressed files with unrar. - Optionally write compressed data to temp file to speed up unrar, otherwise it needs to scan whole archive on each execution. Example:: import rarfile rf = rarfile.RarFile('myarchive.rar') for f in rf.infolist(): print f.filename, f.file_size if f.filename == 'README': print(rf.read(f)) Archive files can also be accessed via file-like object returned by :meth:`RarFile.open`:: import rarfile with rarfile.RarFile('archive.rar') as rf: with rf.open('README') as f: for ln in f: print(ln.strip()) There are few module-level parameters to tune behaviour, here they are with defaults, and reason to change it:: import rarfile # Set to full path of unrar.exe if it is not in PATH rarfile.UNRAR_TOOL = "unrar" # Set to '\\' to be more compatible with old rarfile rarfile.PATH_SEP = '/' For more details, refer to source. """ ## ## Imports and compat - support both Python 2.x and 3.x ## import sys import os import errno import struct from struct import pack, unpack, Struct from binascii import crc32, hexlify from tempfile import mkstemp from subprocess import Popen, PIPE, STDOUT from io import RawIOBase from hashlib import sha1, sha256 from hmac import HMAC from datetime import datetime, timedelta, tzinfo # fixed offset timezone, for UTC try: from datetime import timezone except ImportError: class timezone(tzinfo): """Compat timezone.""" __slots__ = ("_ofs", "_name") _DST = timedelta(0) def __init__(self, offset, name): super(timezone, self).__init__() self._ofs, self._name = offset, name def utcoffset(self, dt): return self._ofs def tzname(self, dt): return self._name def dst(self, dt): return self._DST # only needed for encryped headers try: try: from cryptography.hazmat.primitives.ciphers import algorithms, modes, Cipher from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf import pbkdf2 class AES_CBC_Decrypt(object): """Decrypt API""" def __init__(self, key, iv): ciph = Cipher(algorithms.AES(key), modes.CBC(iv), default_backend()) self.decrypt = ciph.decryptor().update def pbkdf2_sha256(password, salt, iters): """PBKDF2 with HMAC-SHA256""" ctx = pbkdf2.PBKDF2HMAC(hashes.SHA256(), 32, salt, iters, default_backend()) return ctx.derive(password) except ImportError: from Crypto.Cipher import AES from Crypto.Protocol import KDF class AES_CBC_Decrypt(object): """Decrypt API""" def __init__(self, key, iv): self.decrypt = AES.new(key, AES.MODE_CBC, iv).decrypt def pbkdf2_sha256(password, salt, iters): """PBKDF2 with HMAC-SHA256""" return KDF.PBKDF2(password, salt, 32, iters, hmac_sha256) _have_crypto = 1 except ImportError: _have_crypto = 0 try: from pyblake2 import blake2s _have_blake2 = True except ImportError: _have_blake2 = False # compat with 2.x if sys.hexversion < 0x3000000: def rar_crc32(data, prev=0): """CRC32 with unsigned values. """ if (prev > 0) and (prev & 0x80000000): prev -= 1 << 32 res = crc32(data, prev) if res < 0: res += 1 << 32 return res tohex = hexlify _byte_code = ord else: # pragma: no cover def tohex(data): """Return hex string.""" return hexlify(data).decode("ascii") rar_crc32 = crc32 str = str _byte_code = int # noqa __version__ = "3.0" # export only interesting items __all__ = ["is_rarfile", "RarInfo", "RarFile", "RarExtFile"] ## ## Module configuration. Can be tuned after importing. ## #: default fallback charset DEFAULT_CHARSET = "windows-1252" #: list of encodings to try, with fallback to DEFAULT_CHARSET if none succeed TRY_ENCODINGS = ("utf8", "utf-16le") #: 'unrar', 'rar' or full path to either one UNRAR_TOOL = "unrar" #: Command line args to use for opening file for reading. OPEN_ARGS = ("p", "-inul") #: Command line args to use for extracting file to disk. EXTRACT_ARGS = ("x", "-y", "-idq") #: args for testrar() TEST_ARGS = ("t", "-idq") # # Allow use of tool that is not compatible with unrar. # # By default use 'bsdtar' which is 'tar' program that # sits on top of libarchive. # # Problems with libarchive RAR backend: # - Does not support solid archives. # - Does not support password-protected archives. # ALT_TOOL = "bsdtar" ALT_OPEN_ARGS = ("-x", "--to-stdout", "-f") ALT_EXTRACT_ARGS = ("-x", "-f") ALT_TEST_ARGS = ("-t", "-f") ALT_CHECK_ARGS = ("--help",) #: whether to speed up decompression by using tmp archive USE_EXTRACT_HACK = 0 #: limit the filesize for tmp archive usage HACK_SIZE_LIMIT = 20 * 1024 * 1024 #: Separator for path name components. RAR internally uses '\\'. #: Use '/' to be similar with zipfile. PATH_SEP = "/" ## ## rar constants ## # block types RAR_BLOCK_MARK = 0x72 # r RAR_BLOCK_MAIN = 0x73 # s RAR_BLOCK_FILE = 0x74 # t RAR_BLOCK_OLD_COMMENT = 0x75 # u RAR_BLOCK_OLD_EXTRA = 0x76 # v RAR_BLOCK_OLD_SUB = 0x77 # w RAR_BLOCK_OLD_RECOVERY = 0x78 # x RAR_BLOCK_OLD_AUTH = 0x79 # y RAR_BLOCK_SUB = 0x7A # z RAR_BLOCK_ENDARC = 0x7B # { # flags for RAR_BLOCK_MAIN RAR_MAIN_VOLUME = 0x0001 RAR_MAIN_COMMENT = 0x0002 RAR_MAIN_LOCK = 0x0004 RAR_MAIN_SOLID = 0x0008 RAR_MAIN_NEWNUMBERING = 0x0010 RAR_MAIN_AUTH = 0x0020 RAR_MAIN_RECOVERY = 0x0040 RAR_MAIN_PASSWORD = 0x0080 RAR_MAIN_FIRSTVOLUME = 0x0100 RAR_MAIN_ENCRYPTVER = 0x0200 # flags for RAR_BLOCK_FILE RAR_FILE_SPLIT_BEFORE = 0x0001 RAR_FILE_SPLIT_AFTER = 0x0002 RAR_FILE_PASSWORD = 0x0004 RAR_FILE_COMMENT = 0x0008 RAR_FILE_SOLID = 0x0010 RAR_FILE_DICTMASK = 0x00E0 RAR_FILE_DICT64 = 0x0000 RAR_FILE_DICT128 = 0x0020 RAR_FILE_DICT256 = 0x0040 RAR_FILE_DICT512 = 0x0060 RAR_FILE_DICT1024 = 0x0080 RAR_FILE_DICT2048 = 0x00A0 RAR_FILE_DICT4096 = 0x00C0 RAR_FILE_DIRECTORY = 0x00E0 RAR_FILE_LARGE = 0x0100 RAR_FILE_UNICODE = 0x0200 RAR_FILE_SALT = 0x0400 RAR_FILE_VERSION = 0x0800 RAR_FILE_EXTTIME = 0x1000 RAR_FILE_EXTFLAGS = 0x2000 # flags for RAR_BLOCK_ENDARC RAR_ENDARC_NEXT_VOLUME = 0x0001 RAR_ENDARC_DATACRC = 0x0002 RAR_ENDARC_REVSPACE = 0x0004 RAR_ENDARC_VOLNR = 0x0008 # flags common to all blocks RAR_SKIP_IF_UNKNOWN = 0x4000 RAR_LONG_BLOCK = 0x8000 # Host OS types RAR_OS_MSDOS = 0 RAR_OS_OS2 = 1 RAR_OS_WIN32 = 2 RAR_OS_UNIX = 3 RAR_OS_MACOS = 4 RAR_OS_BEOS = 5 # Compression methods - '0'..'5' RAR_M0 = 0x30 RAR_M1 = 0x31 RAR_M2 = 0x32 RAR_M3 = 0x33 RAR_M4 = 0x34 RAR_M5 = 0x35 # # RAR5 constants # RAR5_BLOCK_MAIN = 1 RAR5_BLOCK_FILE = 2 RAR5_BLOCK_SERVICE = 3 RAR5_BLOCK_ENCRYPTION = 4 RAR5_BLOCK_ENDARC = 5 RAR5_BLOCK_FLAG_EXTRA_DATA = 0x01 RAR5_BLOCK_FLAG_DATA_AREA = 0x02 RAR5_BLOCK_FLAG_SKIP_IF_UNKNOWN = 0x04 RAR5_BLOCK_FLAG_SPLIT_BEFORE = 0x08 RAR5_BLOCK_FLAG_SPLIT_AFTER = 0x10 RAR5_BLOCK_FLAG_DEPENDS_PREV = 0x20 RAR5_BLOCK_FLAG_KEEP_WITH_PARENT = 0x40 RAR5_MAIN_FLAG_ISVOL = 0x01 RAR5_MAIN_FLAG_HAS_VOLNR = 0x02 RAR5_MAIN_FLAG_SOLID = 0x04 RAR5_MAIN_FLAG_RECOVERY = 0x08 RAR5_MAIN_FLAG_LOCKED = 0x10 RAR5_FILE_FLAG_ISDIR = 0x01 RAR5_FILE_FLAG_HAS_MTIME = 0x02 RAR5_FILE_FLAG_HAS_CRC32 = 0x04 RAR5_FILE_FLAG_UNKNOWN_SIZE = 0x08 RAR5_COMPR_SOLID = 0x40 RAR5_ENC_FLAG_HAS_CHECKVAL = 0x01 RAR5_ENDARC_FLAG_NEXT_VOL = 0x01 RAR5_XFILE_ENCRYPTION = 1 RAR5_XFILE_HASH = 2 RAR5_XFILE_TIME = 3 RAR5_XFILE_VERSION = 4 RAR5_XFILE_REDIR = 5 RAR5_XFILE_OWNER = 6 RAR5_XFILE_SERVICE = 7 RAR5_XTIME_UNIXTIME = 0x01 RAR5_XTIME_HAS_MTIME = 0x02 RAR5_XTIME_HAS_CTIME = 0x04 RAR5_XTIME_HAS_ATIME = 0x08 RAR5_XENC_CIPHER_AES256 = 0 RAR5_XENC_CHECKVAL = 0x01 RAR5_XENC_TWEAKED = 0x02 RAR5_XHASH_BLAKE2SP = 0 RAR5_XREDIR_UNIX_SYMLINK = 1 RAR5_XREDIR_WINDOWS_SYMLINK = 2 RAR5_XREDIR_WINDOWS_JUNCTION = 3 RAR5_XREDIR_HARD_LINK = 4 RAR5_XREDIR_FILE_COPY = 5 RAR5_XREDIR_ISDIR = 0x01 RAR5_XOWNER_UNAME = 0x01 RAR5_XOWNER_GNAME = 0x02 RAR5_XOWNER_UID = 0x04 RAR5_XOWNER_GID = 0x08 RAR5_OS_WINDOWS = 0 RAR5_OS_UNIX = 1 ## ## internal constants ## RAR_ID = b"Rar!\x1a\x07\x00" RAR5_ID = b"Rar!\x1a\x07\x01\x00" ZERO = b"\0" EMPTY = b"" UTC = timezone(timedelta(0), "UTC") BSIZE = 32 * 1024 def _get_rar_version(xfile): """Check quickly whether file is rar archive. """ with XFile(xfile) as fd: buf = fd.read(len(RAR5_ID)) if buf.startswith(RAR_ID): return 3 elif buf.startswith(RAR5_ID): return 5 return 0 ## ## Public interface ## def is_rarfile(xfile): """Check quickly whether file is rar archive. """ rar_ver = _get_rar_version(xfile) if rar_ver: return "RAR%d" % rar_ver else: return None class Error(Exception): """Base class for rarfile errors.""" class BadRarFile(Error): """Incorrect data in archive.""" class NotRarFile(Error): """The file is not RAR archive.""" class BadRarName(Error): """Cannot guess multipart name components.""" class NoRarEntry(Error): """File not found in RAR""" class PasswordRequired(Error): """File requires password""" class NeedFirstVolume(Error): """Need to start from first volume.""" class NoCrypto(Error): """Cannot parse encrypted headers - no crypto available.""" class RarExecError(Error): """Problem reported by unrar/rar.""" class RarWarning(RarExecError): """Non-fatal error""" class RarFatalError(RarExecError): """Fatal error""" class RarCRCError(RarExecError): """CRC error during unpacking""" class RarLockedArchiveError(RarExecError): """Must not modify locked archive""" class RarWriteError(RarExecError): """Write error""" class RarOpenError(RarExecError): """Open error""" class RarUserError(RarExecError): """User error""" class RarMemoryError(RarExecError): """Memory error""" class RarCreateError(RarExecError): """Create error""" class RarNoFilesError(RarExecError): """No files that match pattern were found""" class RarUserBreak(RarExecError): """User stop""" class RarWrongPassword(RarExecError): """Incorrect password""" class RarUnknownError(RarExecError): """Unknown exit code""" class RarSignalExit(RarExecError): """Unrar exited with signal""" class RarCannotExec(RarExecError): """Executable not found.""" class RarInfo(object): r"""An entry in rar archive. RAR3 extended timestamps are :class:`datetime.datetime` objects without timezone. RAR5 extended timestamps are :class:`datetime.datetime` objects with UTC timezone. Attributes: filename File name with relative path. Path separator is '/'. Always unicode string. date_time File modification timestamp. As tuple of (year, month, day, hour, minute, second). RAR5 allows archives where it is missing, it's None then. file_size Uncompressed size. compress_size Compressed size. compress_type Compression method: one of :data:`RAR_M0` .. :data:`RAR_M5` constants. extract_version Minimal Rar version needed for decompressing. As (major*10 + minor), so 2.9 is 29. RAR3: 10, 20, 29 RAR5 does not have such field in archive, it's simply set to 50. host_os Host OS type, one of RAR_OS_* constants. RAR3: :data:`RAR_OS_WIN32`, :data:`RAR_OS_UNIX`, :data:`RAR_OS_MSDOS`, :data:`RAR_OS_OS2`, :data:`RAR_OS_BEOS`. RAR5: :data:`RAR_OS_WIN32`, :data:`RAR_OS_UNIX`. mode File attributes. May be either dos-style or unix-style, depending on host_os. mtime File modification time. Same value as :attr:`date_time` but as :class:`datetime.datetime` object with extended precision. ctime Optional time field: creation time. As :class:`datetime.datetime` object. atime Optional time field: last access time. As :class:`datetime.datetime` object. arctime Optional time field: archival time. As :class:`datetime.datetime` object. (RAR3-only) CRC CRC-32 of uncompressed file, unsigned int. RAR5: may be None. blake2sp_hash Blake2SP hash over decompressed data. (RAR5-only) comment Optional file comment field. Unicode string. (RAR3-only) file_redir If not None, file is link of some sort. Contains tuple of (type, flags, target). (RAR5-only) Type is one of constants: :data:`RAR5_XREDIR_UNIX_SYMLINK` unix symlink to target. :data:`RAR5_XREDIR_WINDOWS_SYMLINK` windows symlink to target. :data:`RAR5_XREDIR_WINDOWS_JUNCTION` windows junction. :data:`RAR5_XREDIR_HARD_LINK` hard link to target. :data:`RAR5_XREDIR_FILE_COPY` current file is copy of another archive entry. Flags may contain :data:`RAR5_XREDIR_ISDIR` bit. volume Volume nr, starting from 0. volume_file Volume file name, where file starts. """ # zipfile-compatible fields filename = None file_size = None compress_size = None date_time = None comment = None CRC = None volume = None orig_filename = None # optional extended time fields, datetime() objects. mtime = None ctime = None atime = None extract_version = None mode = None host_os = None compress_type = None # rar3-only fields comment = None arctime = None # rar5-only fields blake2sp_hash = None file_redir = None # internal fields flags = 0 type = None def isdir(self): """Returns True if entry is a directory. """ if self.type == RAR_BLOCK_FILE: return (self.flags & RAR_FILE_DIRECTORY) == RAR_FILE_DIRECTORY return False def needs_password(self): """Returns True if data is stored password-protected. """ if self.type == RAR_BLOCK_FILE: return (self.flags & RAR_FILE_PASSWORD) > 0 return False class RarFile(object): """Parse RAR structure, provide access to files in archive. """ #: Archive comment. Unicode string or None. comment = None def __init__( self, rarfile, mode="r", charset=None, info_callback=None, crc_check=True, errors="stop", all_names=False ): """Open and parse a RAR archive. Parameters: rarfile archive file name mode only 'r' is supported. charset fallback charset to use, if filenames are not already Unicode-enabled. info_callback debug callback, gets to see all archive entries. crc_check set to False to disable CRC checks errors Either "stop" to quietly stop parsing on errors, or "strict" to raise errors. Default is "stop". """ self._rarfile = rarfile self._charset = charset or DEFAULT_CHARSET self._info_callback = info_callback self._crc_check = crc_check self._password = None self._file_parser = None self._all_names = all_names if errors == "stop": self._strict = False elif errors == "strict": self._strict = True else: raise ValueError("Invalid value for 'errors' parameter.") if mode != "r": raise NotImplementedError("RarFile supports only mode=r") self._parse() def __enter__(self): return self def __exit__(self, typ, value, traceback): self.close() def setpassword(self, password): """Sets the password to use when extracting.""" self._password = password if self._file_parser: if self._file_parser.has_header_encryption(): self._file_parser = None if not self._file_parser: self._parse() else: self._file_parser.setpassword(self._password) def needs_password(self): """Returns True if any archive entries require password for extraction.""" return self._file_parser.needs_password() def namelist(self): """Return list of file and foldernames in archive.""" return [f.filename for f in self.infolist()] def filelist(self): """Return list of filenames in archive.""" return [f.filename for f in self.infolist() if not f.isdir()] def infolist(self): """Return RarInfo objects for all files/directories in archive.""" return self._file_parser.infolist() def volumelist(self): """Returns filenames of archive volumes. In case of single-volume archive, the list contains just the name of main archive file. """ return self._file_parser.volumelist() def getinfo(self, fname): """Return RarInfo for file. """ return self._file_parser.getinfo(fname) def open(self, fname, mode="r", psw=None): """Returns file-like object (:class:`RarExtFile`), from where the data can be read. The object implements :class:`io.RawIOBase` interface, so it can be further wrapped with :class:`io.BufferedReader` and :class:`io.TextIOWrapper`. On older Python where io module is not available, it implements only .read(), .seek(), .tell() and .close() methods. The object is seekable, although the seeking is fast only on uncompressed files, on compressed files the seeking is implemented by reading ahead and/or restarting the decompression. Parameters: fname file name or RarInfo instance. mode must be 'r' psw password to use for extracting. """ if mode != "r": raise NotImplementedError("RarFile.open() supports only mode=r") # entry lookup inf = self.getinfo(fname) if inf.isdir(): raise TypeError("Directory does not have any data: " + inf.filename) # check password if inf.needs_password(): psw = psw or self._password if psw is None: raise PasswordRequired("File %s requires password" % inf.filename) else: psw = None return self._file_parser.open(inf, psw) def read(self, fname, psw=None): """Return uncompressed data for archive entry. For longer files using :meth:`RarFile.open` may be better idea. Parameters: fname filename or RarInfo instance psw password to use for extracting. """ with self.open(fname, "r", psw) as f: return f.read() def close(self): """Release open resources.""" pass def printdir(self): """Print archive file list to stdout.""" for f in self.infolist(): print((f.filename)) def extract(self, member, path=None, pwd=None): """Extract single file into current directory. Parameters: member filename or :class:`RarInfo` instance path optional destination path pwd optional password to use """ if isinstance(member, RarInfo): fname = member.filename else: fname = member self._extract([fname], path, pwd) def extractall(self, path=None, members=None, pwd=None): """Extract all files into current directory. Parameters: path optional destination path members optional filename or :class:`RarInfo` instance list to extract pwd optional password to use """ fnlist = [] if members is not None: for m in members: if isinstance(m, RarInfo): fnlist.append(m.filename) else: fnlist.append(m) self._extract(fnlist, path, pwd) def testrar(self): """Let 'unrar' test the archive. """ # Modified for SABnzbd by clipping paths from sabnzbd.filesystem import clip_path rarpath = clip_path(self._rarfile) cmd = [UNRAR_TOOL] + list(TEST_ARGS) add_password_arg(cmd, self._password) cmd.append("--") with XTempFile(rarpath) as rarfile: cmd.append(rarfile) p = custom_popen(cmd) output = p.communicate()[0] check_returncode(p, output) def strerror(self): """Return error string if parsing failed, or None if no problems. """ if not self._file_parser: return "Not a RAR file" return self._file_parser.strerror() ## ## private methods ## def _parse(self): ver = _get_rar_version(self._rarfile) if ver == 3: p3 = RAR3Parser( self._rarfile, self._password, self._crc_check, self._charset, self._strict, self._info_callback, self._all_names, ) self._file_parser = p3 # noqa elif ver == 5: p5 = RAR5Parser( self._rarfile, self._password, self._crc_check, self._charset, self._strict, self._info_callback, self._all_names, ) self._file_parser = p5 # noqa else: raise BadRarFile("Not a RAR file") self._file_parser.parse() self.comment = self._file_parser.comment # call unrar to extract a file def _extract(self, fnlist, path=None, psw=None): cmd = [UNRAR_TOOL] + list(EXTRACT_ARGS) # pasoword psw = psw or self._password add_password_arg(cmd, psw) cmd.append("--") # rar file with XTempFile(self._rarfile) as rarfn: cmd.append(rarfn) # file list for fn in fnlist: if os.sep != PATH_SEP: fn = fn.replace(PATH_SEP, os.sep) cmd.append(fn) # destination path if path is not None: cmd.append(path + os.sep) # call p = custom_popen(cmd) output = p.communicate()[0] check_returncode(p, output) # # File format parsing # class CommonParser(object): """Shared parser parts.""" _main = None _hdrenc_main = None _needs_password = False _fd = None _expect_sig = None _parse_error = None _password = None comment = None def __init__(self, rarfile, password, crc_check, charset, strict, info_cb, all_names): self._rarfile = rarfile self._password = password self._crc_check = crc_check self._charset = charset self._strict = strict self._all_names = all_names self._info_callback = info_cb self._info_list = [] self._info_map = {} self._vol_list = [] def has_header_encryption(self): """Returns True if headers are encrypted """ if self._hdrenc_main: return True if self._main: if self._main.flags & RAR_MAIN_PASSWORD: return True return False def setpassword(self, psw): """Set cached password.""" self._password = psw def volumelist(self): """Volume files""" return self._vol_list def needs_password(self): """Is password required""" return self._needs_password def strerror(self): """Last error""" return self._parse_error def infolist(self): """List of RarInfo records. """ return self._info_list def getinfo(self, fname): """Return RarInfo for filename """ # accept both ways here if PATH_SEP == "/": fname2 = fname.replace("\\", "/") else: fname2 = fname.replace("/", "\\") try: return self._info_map[fname] except KeyError: try: return self._info_map[fname2] except KeyError: raise NoRarEntry("No such file: %s" % fname) # read rar def parse(self): """Process file.""" self._fd = None try: self._parse_real() finally: if self._fd: self._fd.close() self._fd = None def _parse_real(self): fd = XFile(self._rarfile) self._fd = fd sig = fd.read(len(self._expect_sig)) if sig != self._expect_sig: if isinstance(self._rarfile, str): raise NotRarFile("Not a Rar archive: {}".format(self._rarfile)) raise NotRarFile("Not a Rar archive") volume = 0 # first vol (.rar) is 0 more_vols = False endarc = False volfile = self._rarfile self._vol_list = [self._rarfile] while 1: if endarc: h = None # don't read past ENDARC else: h = self._parse_header(fd) if not h: if more_vols: volume += 1 fd.close() try: volfile = self._next_volname(volfile) fd = XFile(volfile) except IOError: self._set_error("Cannot open next volume: %s", volfile) break self._fd = fd sig = fd.read(len(self._expect_sig)) if sig != self._expect_sig: self._set_error("Invalid volume sig: %s", volfile) break more_vols = False endarc = False self._vol_list.append(volfile) continue break h.volume = volume h.volume_file = volfile if h.type == RAR_BLOCK_MAIN and not self._main: self._main = h if h.flags & RAR_MAIN_NEWNUMBERING: # RAR 2.x does not set FIRSTVOLUME, # so check it only if NEWNUMBERING is used if not self._all_names and (h.flags & RAR_MAIN_FIRSTVOLUME) == 0: raise NeedFirstVolume("Need to start from first volume") if h.flags & RAR_MAIN_PASSWORD: self._needs_password = True if not self._password: break elif h.type == RAR_BLOCK_ENDARC: more_vols = (h.flags & RAR_ENDARC_NEXT_VOLUME) > 0 endarc = True elif h.type == RAR_BLOCK_FILE: # RAR 2.x does not write RAR_BLOCK_ENDARC if h.flags & RAR_FILE_SPLIT_AFTER: more_vols = True # RAR 2.x does not set RAR_MAIN_FIRSTVOLUME if not self._all_names and volume == 0 and h.flags & RAR_FILE_SPLIT_BEFORE: raise NeedFirstVolume("Need to start from first volume") if h.needs_password(): self._needs_password = True # store it self.process_entry(fd, h) if self._info_callback: self._info_callback(h) # go to next header if h.add_size > 0: fd.seek(h.data_offset + h.add_size, 0) def process_entry(self, fd, item): """Examine item, add into lookup cache.""" raise NotImplementedError() def _decrypt_header(self, fd): raise NotImplementedError("_decrypt_header") def _parse_block_header(self, fd): raise NotImplementedError("_parse_block_header") def _open_hack(self, inf, psw): raise NotImplementedError("_open_hack") # read single header def _parse_header(self, fd): try: # handle encrypted headers if (self._main and self._main.flags & RAR_MAIN_PASSWORD) or self._hdrenc_main: if not self._password: return fd = self._decrypt_header(fd) # now read actual header return self._parse_block_header(fd) except struct.error: self._set_error("Broken header in RAR file") return None # given current vol name, construct next one def _next_volname(self, volfile): if is_filelike(volfile): raise IOError("Working on single FD") if self._main.flags & RAR_MAIN_NEWNUMBERING: return _next_newvol(volfile) return _next_oldvol(volfile) def _set_error(self, msg, *args): if args: msg = msg % args self._parse_error = msg if self._strict: raise BadRarFile(msg) def open(self, inf, psw): """Return stream object for file data.""" if inf.file_redir: # cannot leave to unrar as it expects copied file to exist if inf.file_redir[0] in (RAR5_XREDIR_FILE_COPY, RAR5_XREDIR_HARD_LINK): inf = self.getinfo(inf.file_redir[2]) if not inf: raise BadRarFile("cannot find copied file") if inf.flags & RAR_FILE_SPLIT_BEFORE: raise NeedFirstVolume("Partial file, please start from first volume: " + inf.filename) # is temp write usable? use_hack = 1 if not self._main: use_hack = 0 elif self._main._must_disable_hack(): use_hack = 0 elif inf._must_disable_hack(): use_hack = 0 elif is_filelike(self._rarfile): pass elif inf.file_size > HACK_SIZE_LIMIT: use_hack = 0 elif not USE_EXTRACT_HACK: use_hack = 0 # now extract if inf.compress_type == RAR_M0 and (inf.flags & RAR_FILE_PASSWORD) == 0 and inf.file_redir is None: return self._open_clear(inf) elif use_hack: return self._open_hack(inf, psw) elif is_filelike(self._rarfile): return self._open_unrar_membuf(self._rarfile, inf, psw) else: return self._open_unrar(self._rarfile, inf, psw) def _open_clear(self, inf): return DirectReader(self, inf) def _open_hack_core(self, inf, psw, prefix, suffix): size = inf.compress_size + inf.header_size rf = XFile(inf.volume_file, 0) rf.seek(inf.header_offset) tmpfd, tmpname = mkstemp(suffix=".rar") tmpf = os.fdopen(tmpfd, "wb") try: tmpf.write(prefix) while size > 0: if size > BSIZE: buf = rf.read(BSIZE) else: buf = rf.read(size) if not buf: raise BadRarFile("read failed: " + inf.filename) tmpf.write(buf) size -= len(buf) tmpf.write(suffix) tmpf.close() rf.close() except: rf.close() tmpf.close() os.unlink(tmpname) raise return self._open_unrar(tmpname, inf, psw, tmpname) # write in-memory archive to temp file - needed for solid archives def _open_unrar_membuf(self, memfile, inf, psw): tmpname = membuf_tempfile(memfile) return self._open_unrar(tmpname, inf, psw, tmpname, force_file=True) # extract using unrar def _open_unrar(self, rarfile, inf, psw=None, tmpfile=None, force_file=False): cmd = [UNRAR_TOOL] + list(OPEN_ARGS) add_password_arg(cmd, psw) cmd.append("--") cmd.append(rarfile) # not giving filename avoids encoding related problems if not tmpfile or force_file: fn = inf.filename if PATH_SEP != os.sep: fn = fn.replace(PATH_SEP, os.sep) cmd.append(fn) # read from unrar pipe return PipeReader(self, inf, cmd, tmpfile) # # RAR3 format # class Rar3Info(RarInfo): """RAR3 specific fields.""" extract_version = 15 salt = None add_size = 0 header_crc = None header_size = None header_offset = None data_offset = None _md_class = None _md_expect = None # make sure some rar5 fields are always present file_redir = None blake2sp_hash = None def _must_disable_hack(self): if self.type == RAR_BLOCK_FILE: if self.flags & RAR_FILE_PASSWORD: return True elif self.flags & (RAR_FILE_SPLIT_BEFORE | RAR_FILE_SPLIT_AFTER): return True elif self.type == RAR_BLOCK_MAIN: if self.flags & (RAR_MAIN_SOLID | RAR_MAIN_PASSWORD): return True return False class RAR3Parser(CommonParser): """Parse RAR3 file format. """ _expect_sig = RAR_ID _last_aes_key = (None, None, None) # (salt, key, iv) def _decrypt_header(self, fd): if not _have_crypto: raise NoCrypto("Cannot parse encrypted headers - no crypto") salt = fd.read(8) if self._last_aes_key[0] == salt: key, iv = self._last_aes_key[1:] else: key, iv = rar3_s2k(self._password, salt) self._last_aes_key = (salt, key, iv) return HeaderDecrypt(fd, key, iv) # common header def _parse_block_header(self, fd): h = Rar3Info() h.header_offset = fd.tell() # read and parse base header buf = fd.read(S_BLK_HDR.size) if not buf: return None t = S_BLK_HDR.unpack_from(buf) h.header_crc, h.type, h.flags, h.header_size = t # read full header if h.header_size > S_BLK_HDR.size: hdata = buf + fd.read(h.header_size - S_BLK_HDR.size) else: hdata = buf h.data_offset = fd.tell() # unexpected EOF? if len(hdata) != h.header_size: self._set_error("Unexpected EOF when reading header") return None pos = S_BLK_HDR.size # block has data assiciated with it? if h.flags & RAR_LONG_BLOCK: h.add_size, pos = load_le32(hdata, pos) else: h.add_size = 0 # parse interesting ones, decide header boundaries for crc if h.type == RAR_BLOCK_MARK: return h elif h.type == RAR_BLOCK_MAIN: pos += 6 if h.flags & RAR_MAIN_ENCRYPTVER: pos += 1 crc_pos = pos if h.flags & RAR_MAIN_COMMENT: self._parse_subblocks(h, hdata, pos) elif h.type == RAR_BLOCK_FILE: pos = self._parse_file_header(h, hdata, pos - 4) crc_pos = pos if h.flags & RAR_FILE_COMMENT: pos = self._parse_subblocks(h, hdata, pos) elif h.type == RAR_BLOCK_SUB: pos = self._parse_file_header(h, hdata, pos - 4) crc_pos = h.header_size elif h.type == RAR_BLOCK_OLD_AUTH: pos += 8 crc_pos = pos elif h.type == RAR_BLOCK_OLD_EXTRA: pos += 7 crc_pos = pos else: crc_pos = h.header_size # check crc if h.type == RAR_BLOCK_OLD_SUB: crcdat = hdata[2:] + fd.read(h.add_size) else: crcdat = hdata[2:crc_pos] calc_crc = rar_crc32(crcdat) & 0xFFFF # return good header if h.header_crc == calc_crc: return h # header parsing failed. self._set_error( "Header CRC error (%02x): exp=%x got=%x (xlen = %d)", h.type, h.header_crc, calc_crc, len(crcdat) ) # instead panicing, send eof return None # read file-specific header def _parse_file_header(self, h, hdata, pos): fld = S_FILE_HDR.unpack_from(hdata, pos) pos += S_FILE_HDR.size h.compress_size = fld[0] h.file_size = fld[1] h.host_os = fld[2] h.CRC = fld[3] h.date_time = parse_dos_time(fld[4]) h.mtime = to_datetime(h.date_time) h.extract_version = fld[5] h.compress_type = fld[6] name_size = fld[7] h.mode = fld[8] h._md_class = CRC32Context h._md_expect = h.CRC if h.flags & RAR_FILE_LARGE: h1, pos = load_le32(hdata, pos) h2, pos = load_le32(hdata, pos) h.compress_size |= h1 << 32 h.file_size |= h2 << 32 h.add_size = h.compress_size name, pos = load_bytes(hdata, name_size, pos) if h.flags & RAR_FILE_UNICODE: nul = name.find(ZERO) h.orig_filename = name[:nul] u = UnicodeFilename(h.orig_filename, name[nul + 1 :]) h.filename = u.decode() # if parsing failed fall back to simple name if u.failed: h.filename = self._decode(h.orig_filename) else: h.orig_filename = name h.filename = self._decode(name) # change separator, if requested if PATH_SEP != "\\": h.filename = h.filename.replace("\\", PATH_SEP) if h.flags & RAR_FILE_SALT: h.salt, pos = load_bytes(hdata, 8, pos) else: h.salt = None # optional extended time stamps if h.flags & RAR_FILE_EXTTIME: pos = _parse_ext_time(h, hdata, pos) else: h.mtime = h.atime = h.ctime = h.arctime = None return pos # find old-style comment subblock def _parse_subblocks(self, h, hdata, pos): while pos < len(hdata): # ordinary block header t = S_BLK_HDR.unpack_from(hdata, pos) ___scrc, stype, sflags, slen = t pos_next = pos + slen pos += S_BLK_HDR.size # corrupt header if pos_next < pos: break # followed by block-specific header if stype == RAR_BLOCK_OLD_COMMENT and pos + S_COMMENT_HDR.size <= pos_next: declen, ver, meth, crc = S_COMMENT_HDR.unpack_from(hdata, pos) pos += S_COMMENT_HDR.size data = hdata[pos:pos_next] cmt = rar3_decompress(ver, meth, data, declen, sflags, crc, self._password) if not self._crc_check: h.comment = self._decode_comment(cmt) elif rar_crc32(cmt) & 0xFFFF == crc: h.comment = self._decode_comment(cmt) pos = pos_next return pos def _read_comment_v3(self, inf, psw=None): # read data with XFile(inf.volume_file) as rf: rf.seek(inf.data_offset) data = rf.read(inf.compress_size) # decompress cmt = rar3_decompress( inf.extract_version, inf.compress_type, data, inf.file_size, inf.flags, inf.CRC, psw, inf.salt ) # check crc if self._crc_check: crc = rar_crc32(cmt) if crc != inf.CRC: return None return self._decode_comment(cmt) def _decode(self, val): for c in TRY_ENCODINGS: try: return val.decode(c) except UnicodeError: pass return val.decode(self._charset, "replace") def _decode_comment(self, val): return self._decode(val) def process_entry(self, fd, item): if item.type == RAR_BLOCK_FILE: # use only first part if (item.flags & RAR_FILE_SPLIT_BEFORE) == 0: self._info_map[item.filename] = item self._info_list.append(item) elif self._all_names: # Broken rar-files would lead to double file-listings if item.filename not in self._info_map: self._info_map[item.filename] = item self._info_list.append(item) elif len(self._info_list) > 0: # final crc is in last block old = self._info_list[-1] old.CRC = item.CRC old._md_expect = item._md_expect old.compress_size += item.compress_size # parse new-style comment if item.type == RAR_BLOCK_SUB and item.filename == "CMT": if item.flags & (RAR_FILE_SPLIT_BEFORE | RAR_FILE_SPLIT_AFTER): pass elif item.flags & RAR_FILE_SOLID: # file comment cmt = self._read_comment_v3(item, self._password) if len(self._info_list) > 0: old = self._info_list[-1] old.comment = cmt else: # archive comment cmt = self._read_comment_v3(item, self._password) self.comment = cmt if item.type == RAR_BLOCK_MAIN: if item.flags & RAR_MAIN_COMMENT: self.comment = item.comment if item.flags & RAR_MAIN_PASSWORD: self._needs_password = True # put file compressed data into temporary .rar archive, and run # unrar on that, thus avoiding unrar going over whole archive def _open_hack(self, inf, psw): # create main header: crc, type, flags, size, res1, res2 prefix = RAR_ID + S_BLK_HDR.pack(0x90CF, 0x73, 0, 13) + ZERO * (2 + 4) return self._open_hack_core(inf, psw, prefix, EMPTY) # # RAR5 format # class Rar5Info(RarInfo): """Shared fields for RAR5 records. """ extract_version = 50 header_crc = None header_size = None header_offset = None data_offset = None # type=all block_type = None block_flags = None add_size = 0 block_extra_size = 0 # type=MAIN volume_number = None _md_class = None _md_expect = None def _must_disable_hack(self): return False class Rar5BaseFile(Rar5Info): """Shared sturct for file & service record. """ type = -1 file_flags = None file_encryption = (0, 0, 0, EMPTY, EMPTY, EMPTY) file_compress_flags = None file_redir = None file_owner = None file_version = None blake2sp_hash = None def _must_disable_hack(self): if self.flags & RAR_FILE_PASSWORD: return True if self.block_flags & (RAR5_BLOCK_FLAG_SPLIT_BEFORE | RAR5_BLOCK_FLAG_SPLIT_AFTER): return True if self.file_compress_flags & RAR5_COMPR_SOLID: return True if self.file_redir: return True return False class Rar5FileInfo(Rar5BaseFile): """RAR5 file record. """ type = RAR_BLOCK_FILE class Rar5ServiceInfo(Rar5BaseFile): """RAR5 service record. """ type = RAR_BLOCK_SUB class Rar5MainInfo(Rar5Info): """RAR5 archive main record. """ type = RAR_BLOCK_MAIN main_flags = None main_volume_number = None def _must_disable_hack(self): if self.main_flags & RAR5_MAIN_FLAG_SOLID: return True return False class Rar5EncryptionInfo(Rar5Info): """RAR5 archive header encryption record. """ type = RAR5_BLOCK_ENCRYPTION encryption_algo = None encryption_flags = None encryption_kdf_count = None encryption_salt = None encryption_check_value = None def needs_password(self): return True class Rar5EndArcInfo(Rar5Info): """RAR5 end of archive record. """ type = RAR_BLOCK_ENDARC endarc_flags = None class RAR5Parser(CommonParser): """Parse RAR5 format. """ _expect_sig = RAR5_ID _hdrenc_main = None # AES encrypted headers _last_aes256_key = (-1, None, None) # (kdf_count, salt, key) def _gen_key(self, kdf_count, salt): if self._last_aes256_key[:2] == (kdf_count, salt): return self._last_aes256_key[2] if kdf_count > 24: raise BadRarFile("Too large kdf_count") psw = self._password if isinstance(psw, str): psw = psw.encode("utf8") key = pbkdf2_sha256(psw, salt, 1 << kdf_count) self._last_aes256_key = (kdf_count, salt, key) return key def _decrypt_header(self, fd): if not _have_crypto: raise NoCrypto("Cannot parse encrypted headers - no crypto") h = self._hdrenc_main key = self._gen_key(h.encryption_kdf_count, h.encryption_salt) iv = fd.read(16) return HeaderDecrypt(fd, key, iv) # common header def _parse_block_header(self, fd): header_offset = fd.tell() preload = 4 + 3 start_bytes = fd.read(preload) header_crc, pos = load_le32(start_bytes, 0) hdrlen, pos = load_vint(start_bytes, pos) if hdrlen > 2 * 1024 * 1024: return None header_size = pos + hdrlen # SABnzbd-edit: # Python 3 only supports -1 for read(), while Python 2 doesn't care! read_size = max(-1, header_size - len(start_bytes)) # read full header, check for EOF hdata = start_bytes + fd.read(read_size) if len(hdata) != header_size: self._set_error("Unexpected EOF when reading header") return None data_offset = fd.tell() calc_crc = rar_crc32(memoryview(hdata)[4:]) if header_crc != calc_crc: # header parsing failed. self._set_error("Header CRC error: exp=%x got=%x (xlen = %d)", header_crc, calc_crc, len(hdata)) return None block_type, pos = load_vint(hdata, pos) if block_type == RAR5_BLOCK_MAIN: h, pos = self._parse_block_common(Rar5MainInfo(), hdata) h = self._parse_main_block(h, hdata, pos) elif block_type == RAR5_BLOCK_FILE: h, pos = self._parse_block_common(Rar5FileInfo(), hdata) h = self._parse_file_block(h, hdata, pos) elif block_type == RAR5_BLOCK_SERVICE: h, pos = self._parse_block_common(Rar5ServiceInfo(), hdata) h = self._parse_file_block(h, hdata, pos) elif block_type == RAR5_BLOCK_ENCRYPTION: h, pos = self._parse_block_common(Rar5EncryptionInfo(), hdata) h = self._parse_encryption_block(h, hdata, pos) elif block_type == RAR5_BLOCK_ENDARC: h, pos = self._parse_block_common(Rar5EndArcInfo(), hdata) h = self._parse_endarc_block(h, hdata, pos) else: h = None if h: h.header_offset = header_offset h.data_offset = data_offset return h def _parse_block_common(self, h, hdata): h.header_crc, pos = load_le32(hdata, 0) hdrlen, pos = load_vint(hdata, pos) h.header_size = hdrlen + pos h.block_type, pos = load_vint(hdata, pos) h.block_flags, pos = load_vint(hdata, pos) if h.block_flags & RAR5_BLOCK_FLAG_EXTRA_DATA: h.block_extra_size, pos = load_vint(hdata, pos) if h.block_flags & RAR5_BLOCK_FLAG_DATA_AREA: h.add_size, pos = load_vint(hdata, pos) h.compress_size = h.add_size if h.block_flags & RAR5_BLOCK_FLAG_SKIP_IF_UNKNOWN: h.flags |= RAR_SKIP_IF_UNKNOWN if h.block_flags & RAR5_BLOCK_FLAG_DATA_AREA: h.flags |= RAR_LONG_BLOCK return h, pos def _parse_main_block(self, h, hdata, pos): h.main_flags, pos = load_vint(hdata, pos) if h.main_flags & RAR5_MAIN_FLAG_HAS_VOLNR: h.main_volume_number = load_vint(hdata, pos) h.flags |= RAR_MAIN_NEWNUMBERING if h.main_flags & RAR5_MAIN_FLAG_SOLID: h.flags |= RAR_MAIN_SOLID if h.main_flags & RAR5_MAIN_FLAG_ISVOL: h.flags |= RAR_MAIN_VOLUME if h.main_flags & RAR5_MAIN_FLAG_RECOVERY: h.flags |= RAR_MAIN_RECOVERY if self._hdrenc_main: h.flags |= RAR_MAIN_PASSWORD if h.main_flags & RAR5_MAIN_FLAG_HAS_VOLNR == 0: h.flags |= RAR_MAIN_FIRSTVOLUME return h def _parse_file_block(self, h, hdata, pos): h.file_flags, pos = load_vint(hdata, pos) h.file_size, pos = load_vint(hdata, pos) h.mode, pos = load_vint(hdata, pos) if h.file_flags & RAR5_FILE_FLAG_HAS_MTIME: h.mtime, pos = load_unixtime(hdata, pos) h.date_time = h.mtime.timetuple()[:6] if h.file_flags & RAR5_FILE_FLAG_HAS_CRC32: h.CRC, pos = load_le32(hdata, pos) h._md_class = CRC32Context h._md_expect = h.CRC h.file_compress_flags, pos = load_vint(hdata, pos) h.file_host_os, pos = load_vint(hdata, pos) h.orig_filename, pos = load_vstr(hdata, pos) h.filename = h.orig_filename.decode("utf8", "replace") # use compatible values if h.file_host_os == RAR5_OS_WINDOWS: h.host_os = RAR_OS_WIN32 else: h.host_os = RAR_OS_UNIX h.compress_type = RAR_M0 + ((h.file_compress_flags >> 7) & 7) if h.block_extra_size: # allow 1 byte of garbage while pos < len(hdata) - 1: xsize, pos = load_vint(hdata, pos) xdata, pos = load_bytes(hdata, xsize, pos) self._process_file_extra(h, xdata) if h.block_flags & RAR5_BLOCK_FLAG_SPLIT_BEFORE: h.flags |= RAR_FILE_SPLIT_BEFORE if h.block_flags & RAR5_BLOCK_FLAG_SPLIT_AFTER: h.flags |= RAR_FILE_SPLIT_AFTER if h.file_flags & RAR5_FILE_FLAG_ISDIR: h.flags |= RAR_FILE_DIRECTORY if h.file_compress_flags & RAR5_COMPR_SOLID: h.flags |= RAR_FILE_SOLID return h def _parse_endarc_block(self, h, hdata, pos): h.endarc_flags, pos = load_vint(hdata, pos) if h.endarc_flags & RAR5_ENDARC_FLAG_NEXT_VOL: h.flags |= RAR_ENDARC_NEXT_VOLUME return h def _parse_encryption_block(self, h, hdata, pos): h.encryption_algo, pos = load_vint(hdata, pos) h.encryption_flags, pos = load_vint(hdata, pos) h.encryption_kdf_count, pos = load_byte(hdata, pos) h.encryption_salt, pos = load_bytes(hdata, 16, pos) if h.encryption_flags & RAR5_ENC_FLAG_HAS_CHECKVAL: h.encryption_check_value = load_bytes(hdata, 12, pos) if h.encryption_algo != RAR5_XENC_CIPHER_AES256: raise BadRarFile("Unsupported header encryption cipher") self._hdrenc_main = h return h # file extra record def _process_file_extra(self, h, xdata): xtype, pos = load_vint(xdata, 0) if xtype == RAR5_XFILE_TIME: self._parse_file_xtime(h, xdata, pos) elif xtype == RAR5_XFILE_ENCRYPTION: self._parse_file_encryption(h, xdata, pos) elif xtype == RAR5_XFILE_HASH: self._parse_file_hash(h, xdata, pos) elif xtype == RAR5_XFILE_VERSION: self._parse_file_version(h, xdata, pos) elif xtype == RAR5_XFILE_REDIR: self._parse_file_redir(h, xdata, pos) elif xtype == RAR5_XFILE_OWNER: self._parse_file_owner(h, xdata, pos) elif xtype == RAR5_XFILE_SERVICE: pass else: pass # extra block for file time record def _parse_file_xtime(self, h, xdata, pos): tflags, pos = load_vint(xdata, pos) ldr = load_windowstime if tflags & RAR5_XTIME_UNIXTIME: ldr = load_unixtime if tflags & RAR5_XTIME_HAS_MTIME: h.mtime, pos = ldr(xdata, pos) h.date_time = h.mtime.timetuple()[:6] if tflags & RAR5_XTIME_HAS_CTIME: h.ctime, pos = ldr(xdata, pos) if tflags & RAR5_XTIME_HAS_ATIME: h.atime, pos = ldr(xdata, pos) # just remember encryption info def _parse_file_encryption(self, h, xdata, pos): algo, pos = load_vint(xdata, pos) flags, pos = load_vint(xdata, pos) kdf_count, pos = load_byte(xdata, pos) salt, pos = load_bytes(xdata, 16, pos) iv, pos = load_bytes(xdata, 16, pos) checkval = None if flags & RAR5_XENC_CHECKVAL: checkval, pos = load_bytes(xdata, 12, pos) if flags & RAR5_XENC_TWEAKED: h._md_expect = None h._md_class = NoHashContext h.file_encryption = (algo, flags, kdf_count, salt, iv, checkval) h.flags |= RAR_FILE_PASSWORD def _parse_file_hash(self, h, xdata, pos): hash_type, pos = load_vint(xdata, pos) if hash_type == RAR5_XHASH_BLAKE2SP: h.blake2sp_hash, pos = load_bytes(xdata, 32, pos) if _have_blake2 and (h.file_encryption[1] & RAR5_XENC_TWEAKED) == 0: h._md_class = Blake2SP h._md_expect = h.blake2sp_hash def _parse_file_version(self, h, xdata, pos): flags, pos = load_vint(xdata, pos) version, pos = load_vint(xdata, pos) h.file_version = (flags, version) def _parse_file_redir(self, h, xdata, pos): redir_type, pos = load_vint(xdata, pos) redir_flags, pos = load_vint(xdata, pos) redir_name, pos = load_vstr(xdata, pos) redir_name = redir_name.decode("utf8", "replace") h.file_redir = (redir_type, redir_flags, redir_name) def _parse_file_owner(self, h, xdata, pos): user_name = group_name = user_id = group_id = None flags, pos = load_vint(xdata, pos) if flags & RAR5_XOWNER_UNAME: user_name, pos = load_vstr(xdata, pos) if flags & RAR5_XOWNER_GNAME: group_name, pos = load_vstr(xdata, pos) if flags & RAR5_XOWNER_UID: user_id, pos = load_vint(xdata, pos) if flags & RAR5_XOWNER_GID: group_id, pos = load_vint(xdata, pos) h.file_owner = (user_name, group_name, user_id, group_id) def process_entry(self, fd, item): if item.block_type == RAR5_BLOCK_FILE: # use only first part if (item.block_flags & RAR5_BLOCK_FLAG_SPLIT_BEFORE) == 0: self._info_map[item.filename] = item self._info_list.append(item) elif self._all_names: # Broken rar-files would lead to double file-listings if item.filename not in self._info_map: self._info_map[item.filename] = item self._info_list.append(item) elif len(self._info_list) > 0: # final crc is in last block old = self._info_list[-1] old.CRC = item.CRC old._md_expect = item._md_expect old.blake2sp_hash = item.blake2sp_hash old.compress_size += item.compress_size elif item.block_type == RAR5_BLOCK_SERVICE: if item.filename == "CMT": self._load_comment(fd, item) def _load_comment(self, fd, item): if item.block_flags & (RAR5_BLOCK_FLAG_SPLIT_BEFORE | RAR5_BLOCK_FLAG_SPLIT_AFTER): return None if item.compress_type != RAR_M0: return None if item.flags & RAR_FILE_PASSWORD: algo, ___flags, kdf_count, salt, iv, ___checkval = item.file_encryption if algo != RAR5_XENC_CIPHER_AES256: return None key = self._gen_key(kdf_count, salt) f = HeaderDecrypt(fd, key, iv) cmt = f.read(item.file_size) else: # archive comment with self._open_clear(item) as cmtstream: cmt = cmtstream.read() # rar bug? - appends zero to comment cmt = cmt.split(ZERO, 1)[0] self.comment = cmt.decode("utf8") def _open_hack(self, inf, psw): # len, type, blk_flags, flags main_hdr = b"\x03\x01\x00\x00" endarc_hdr = b"\x03\x05\x00\x00" main_hdr = S_LONG.pack(rar_crc32(main_hdr)) + main_hdr endarc_hdr = S_LONG.pack(rar_crc32(endarc_hdr)) + endarc_hdr return self._open_hack_core(inf, psw, RAR5_ID + main_hdr, endarc_hdr) ## ## Utility classes ## class UnicodeFilename(object): """Handle RAR3 unicode filename decompression. """ def __init__(self, name, encdata): self.std_name = bytearray(name) self.encdata = bytearray(encdata) self.pos = self.encpos = 0 self.buf = bytearray() self.failed = 0 def enc_byte(self): """Copy encoded byte.""" try: c = self.encdata[self.encpos] self.encpos += 1 return c except IndexError: self.failed = 1 return 0 def std_byte(self): """Copy byte from 8-bit representation.""" try: return self.std_name[self.pos] except IndexError: self.failed = 1 return ord("?") def put(self, lo, hi): """Copy 16-bit value to result.""" self.buf.append(lo) self.buf.append(hi) self.pos += 1 def decode(self): """Decompress compressed UTF16 value.""" hi = self.enc_byte() flagbits = 0 while self.encpos < len(self.encdata): if flagbits == 0: flags = self.enc_byte() flagbits = 8 flagbits -= 2 t = (flags >> flagbits) & 3 if t == 0: self.put(self.enc_byte(), 0) elif t == 1: self.put(self.enc_byte(), hi) elif t == 2: self.put(self.enc_byte(), self.enc_byte()) else: n = self.enc_byte() if n & 0x80: c = self.enc_byte() for _ in range((n & 0x7F) + 2): lo = (self.std_byte() + c) & 0xFF self.put(lo, hi) else: for _ in range(n + 2): self.put(self.std_byte(), 0) return self.buf.decode("utf-16le", "replace") class RarExtFile(RawIOBase): """Base class for file-like object that :meth:`RarFile.open` returns. Provides public methods and common crc checking. Behaviour: - no short reads - .read() and .readinfo() read as much as requested. - no internal buffer, use io.BufferedReader for that. """ #: Filename of the archive entry name = None def __init__(self, parser, inf): super(RarExtFile, self).__init__() # standard io.* properties self.name = inf.filename self.mode = "rb" self._parser = parser self._inf = inf self._fd = None self._remain = 0 self._returncode = 0 self._md_context = None self._open() def _open(self): if self._fd: self._fd.close() md_class = self._inf._md_class or NoHashContext self._md_context = md_class() self._fd = None self._remain = self._inf.file_size def read(self, cnt=None): """Read all or specified amount of data from archive entry.""" # sanitize cnt if cnt is None or cnt < 0: cnt = self._remain elif cnt > self._remain: cnt = self._remain if cnt == 0: return EMPTY # actual read data = self._read(cnt) if data: self._md_context.update(data) self._remain -= len(data) if len(data) != cnt: raise BadRarFile("Failed the read enough data") # done? if not data or self._remain == 0: # self.close() self._check() return data def _check(self): """Check final CRC.""" final = self._md_context.digest() exp = self._inf._md_expect if exp is None: return if final is None: return if self._returncode: check_returncode(self, "") if self._remain != 0: raise BadRarFile("Failed the read enough data") if final != exp: raise BadRarFile("Corrupt file - CRC check failed: %s - exp=%r got=%r" % (self._inf.filename, exp, final)) def _read(self, cnt): """Actual read that gets sanitized cnt.""" def close(self): """Close open resources.""" super(RarExtFile, self).close() if self._fd: self._fd.close() self._fd = None def __del__(self): """Hook delete to make sure tempfile is removed.""" self.close() def readinto(self, buf): """Zero-copy read directly into buffer. Returns bytes read. """ raise NotImplementedError("readinto") def tell(self): """Return current reading position in uncompressed data.""" return self._inf.file_size - self._remain def seek(self, ofs, whence=0): """Seek in data. On uncompressed files, the seeking works by actual seeks so it's fast. On compresses files its slow - forward seeking happends by reading ahead, backwards by re-opening and decompressing from the start. """ # disable crc check when seeking self._md_context = NoHashContext() fsize = self._inf.file_size cur_ofs = self.tell() if whence == 0: # seek from beginning of file new_ofs = ofs elif whence == 1: # seek from current position new_ofs = cur_ofs + ofs elif whence == 2: # seek from end of file new_ofs = fsize + ofs else: raise ValueError("Invalid value for whence") # sanity check if new_ofs < 0: new_ofs = 0 elif new_ofs > fsize: new_ofs = fsize # do the actual seek if new_ofs >= cur_ofs: self._skip(new_ofs - cur_ofs) else: # reopen and seek self._open() self._skip(new_ofs) return self.tell() def _skip(self, cnt): """Read and discard data""" while cnt > 0: if cnt > 8192: buf = self.read(8192) else: buf = self.read(cnt) if not buf: break cnt -= len(buf) def readable(self): """Returns True""" return True def writable(self): """Returns False. Writing is not supported.""" return False def seekable(self): """Returns True. Seeking is supported, although it's slow on compressed files. """ return True def readall(self): """Read all remaining data""" # avoid RawIOBase default impl return self.read() class PipeReader(RarExtFile): """Read data from pipe, handle tempfile cleanup.""" def __init__(self, rf, inf, cmd, tempfile=None): self._cmd = cmd self._proc = None self._tempfile = tempfile super(PipeReader, self).__init__(rf, inf) def _close_proc(self): if not self._proc: return if self._proc.stdout: self._proc.stdout.close() if self._proc.stdin: self._proc.stdin.close() if self._proc.stderr: self._proc.stderr.close() self._proc.wait() self._returncode = self._proc.returncode self._proc = None def _open(self): super(PipeReader, self)._open() # stop old process self._close_proc() # launch new process self._returncode = 0 self._proc = custom_popen(self._cmd) self._fd = self._proc.stdout # avoid situation where unrar waits on stdin if self._proc.stdin: self._proc.stdin.close() def _read(self, cnt): """Read from pipe.""" # normal read is usually enough data = self._fd.read(cnt) if len(data) == cnt or not data: return data # short read, try looping buf = [data] cnt -= len(data) while cnt > 0: data = self._fd.read(cnt) if not data: break cnt -= len(data) buf.append(data) return EMPTY.join(buf) def close(self): """Close open resources.""" self._close_proc() super(PipeReader, self).close() if self._tempfile: try: os.unlink(self._tempfile) except OSError: pass self._tempfile = None def readinto(self, buf): """Zero-copy read directly into buffer.""" cnt = len(buf) if cnt > self._remain: cnt = self._remain vbuf = memoryview(buf) res = got = 0 while got < cnt: res = self._fd.readinto(vbuf[got:cnt]) if not res: break self._md_context.update(vbuf[got : got + res]) self._remain -= res got += res return got class DirectReader(RarExtFile): """Read uncompressed data directly from archive. """ _cur = None _cur_avail = None _volfile = None def _open(self): super(DirectReader, self)._open() self._volfile = self._inf.volume_file self._fd = XFile(self._volfile, 0) self._fd.seek(self._inf.header_offset, 0) self._cur = self._parser._parse_header(self._fd) self._cur_avail = self._cur.add_size def _skip(self, cnt): """RAR Seek, skipping through rar files to get to correct position """ while cnt > 0: # next vol needed? if self._cur_avail == 0: if not self._open_next(): break # fd is in read pos, do the read if cnt > self._cur_avail: cnt -= self._cur_avail self._remain -= self._cur_avail self._cur_avail = 0 else: self._fd.seek(cnt, 1) self._cur_avail -= cnt self._remain -= cnt cnt = 0 def _read(self, cnt): """Read from potentially multi-volume archive.""" buf = [] while cnt > 0: # next vol needed? if self._cur_avail == 0: if not self._open_next(): break # fd is in read pos, do the read if cnt > self._cur_avail: data = self._fd.read(self._cur_avail) else: data = self._fd.read(cnt) if not data: break # got some data cnt -= len(data) self._cur_avail -= len(data) buf.append(data) if len(buf) == 1: return buf[0] return EMPTY.join(buf) def _open_next(self): """Proceed to next volume.""" # is the file split over archives? if (self._cur.flags & RAR_FILE_SPLIT_AFTER) == 0: return False if self._fd: self._fd.close() self._fd = None # open next part self._volfile = self._parser._next_volname(self._volfile) fd = open(self._volfile, "rb", 0) self._fd = fd sig = fd.read(len(self._parser._expect_sig)) if sig != self._parser._expect_sig: raise BadRarFile("Invalid signature") # loop until first file header while 1: cur = self._parser._parse_header(fd) if not cur: raise BadRarFile("Unexpected EOF") if cur.type in (RAR_BLOCK_MARK, RAR_BLOCK_MAIN): if cur.add_size: fd.seek(cur.add_size, 1) continue if cur.orig_filename != self._inf.orig_filename: raise BadRarFile("Did not found file entry") self._cur = cur self._cur_avail = cur.add_size return True def readinto(self, buf): """Zero-copy read directly into buffer.""" got = 0 vbuf = memoryview(buf) while got < len(buf): # next vol needed? if self._cur_avail == 0: if not self._open_next(): break # length for next read cnt = len(buf) - got if cnt > self._cur_avail: cnt = self._cur_avail # read into temp view res = self._fd.readinto(vbuf[got : got + cnt]) if not res: break self._md_context.update(vbuf[got : got + res]) self._cur_avail -= res self._remain -= res got += res return got class HeaderDecrypt(object): """File-like object that decrypts from another file""" def __init__(self, f, key, iv): self.f = f self.ciph = AES_CBC_Decrypt(key, iv) self.buf = EMPTY def tell(self): """Current file pos - works only on block boundaries.""" return self.f.tell() def read(self, cnt=None): """Read and decrypt.""" if cnt > 8 * 1024: raise BadRarFile("Bad count to header decrypt - wrong password?") # consume old data if cnt <= len(self.buf): res = self.buf[:cnt] self.buf = self.buf[cnt:] return res res = self.buf self.buf = EMPTY cnt -= len(res) # decrypt new data blklen = 16 while cnt > 0: enc = self.f.read(blklen) if len(enc) < blklen: break dec = self.ciph.decrypt(enc) if cnt >= len(dec): res += dec cnt -= len(dec) else: res += dec[:cnt] self.buf = dec[cnt:] cnt = 0 return res # handle (filename|filelike) object class XFile(object): """Input may be filename or file object. """ __slots__ = ("_fd", "_need_close") def __init__(self, xfile, bufsize=1024): if is_filelike(xfile): self._need_close = False self._fd = xfile self._fd.seek(0) else: self._need_close = True self._fd = open(xfile, "rb", bufsize) def read(self, n=None): """Read from file.""" return self._fd.read(n) def tell(self): """Return file pos.""" return self._fd.tell() def seek(self, ofs, whence=0): """Move file pos.""" return self._fd.seek(ofs, whence) def readinto(self, dst): """Read into buffer.""" return self._fd.readinto(dst) def close(self): """Close file object.""" if self._need_close: self._fd.close() def __enter__(self): return self def __exit__(self, typ, val, tb): self.close() class NoHashContext(object): """No-op hash function.""" def __init__(self, data=None): """Initialize""" def update(self, data): """Update data""" def digest(self): """Final hash""" def hexdigest(self): """Hexadecimal digest.""" class CRC32Context(object): """Hash context that uses CRC32.""" __slots__ = ["_crc"] def __init__(self, data=None): self._crc = 0 if data: self.update(data) def update(self, data): """Process data.""" self._crc = rar_crc32(data, self._crc) def digest(self): """Final hash.""" return self._crc def hexdigest(self): """Hexadecimal digest.""" return "%08x" % self.digest() class Blake2SP(object): """Blake2sp hash context. """ __slots__ = ["_thread", "_buf", "_cur", "_digest"] digest_size = 32 block_size = 64 parallelism = 8 def __init__(self, data=None): self._buf = b"" self._cur = 0 self._digest = None self._thread = [] for i in range(self.parallelism): ctx = self._blake2s(i, 0, i == (self.parallelism - 1)) self._thread.append(ctx) if data: self.update(data) def _blake2s(self, ofs, depth, is_last): return blake2s( node_offset=ofs, node_depth=depth, last_node=is_last, depth=2, inner_size=32, fanout=self.parallelism ) def _add_block(self, blk): self._thread[self._cur].update(blk) self._cur = (self._cur + 1) % self.parallelism def update(self, data): """Hash data. """ view = memoryview(data) bs = self.block_size if self._buf: need = bs - len(self._buf) if len(view) < need: self._buf += view.tobytes() return self._add_block(self._buf + view[:need].tobytes()) view = view[need:] while len(view) >= bs: self._add_block(view[:bs]) view = view[bs:] self._buf = view.tobytes() def digest(self): """Return final digest value. """ if self._digest is None: if self._buf: self._add_block(self._buf) self._buf = EMPTY ctx = self._blake2s(0, 1, True) for t in self._thread: ctx.update(t.digest()) self._digest = ctx.digest() return self._digest def hexdigest(self): """Hexadecimal digest.""" return tohex(self.digest()) ## ## Utility functions ## S_LONG = Struct(" len(buf): raise BadRarFile("cannot load byte") return S_BYTE.unpack_from(buf, pos)[0], end def load_le32(buf, pos): """Load little-endian 32-bit integer""" end = pos + 4 if end > len(buf): raise BadRarFile("cannot load le32") return S_LONG.unpack_from(buf, pos)[0], pos + 4 def load_bytes(buf, num, pos): """Load sequence of bytes""" end = pos + num if end > len(buf): raise BadRarFile("cannot load bytes") return buf[pos:end], end def load_vstr(buf, pos): """Load bytes prefixed by vint length""" slen, pos = load_vint(buf, pos) return load_bytes(buf, slen, pos) def load_dostime(buf, pos): """Load LE32 dos timestamp""" stamp, pos = load_le32(buf, pos) tup = parse_dos_time(stamp) return to_datetime(tup), pos def load_unixtime(buf, pos): """Load LE32 unix timestamp""" secs, pos = load_le32(buf, pos) dt = datetime.fromtimestamp(secs, UTC) return dt, pos def load_windowstime(buf, pos): """Load LE64 windows timestamp""" # unix epoch (1970) in seconds from windows epoch (1601) unix_epoch = 11644473600 val1, pos = load_le32(buf, pos) val2, pos = load_le32(buf, pos) secs, n1secs = divmod((val2 << 32) | val1, 10000000) dt = datetime.fromtimestamp(secs - unix_epoch, UTC) dt = dt.replace(microsecond=n1secs // 10) return dt, pos # new-style next volume def _next_newvol(volfile): i = len(volfile) - 1 while i >= 0: if volfile[i] >= "0" and volfile[i] <= "9": return _inc_volname(volfile, i) i -= 1 raise BadRarName("Cannot construct volume name: " + volfile) # old-style next volume def _next_oldvol(volfile): # rar -> r00 if volfile[-4:].lower() == ".rar": return volfile[:-2] + "00" return _inc_volname(volfile, len(volfile) - 1) # increase digits with carry, otherwise just increment char def _inc_volname(volfile, i): fn = list(volfile) while i >= 0: if fn[i] != "9": fn[i] = chr(ord(fn[i]) + 1) break fn[i] = "0" i -= 1 return "".join(fn) # rar3 extended time fields def _parse_ext_time(h, data, pos): # flags and rest of data can be missing flags = 0 if pos + 2 <= len(data): flags = S_SHORT.unpack_from(data, pos)[0] pos += 2 mtime, pos = _parse_xtime(flags >> 3 * 4, data, pos, h.mtime) h.ctime, pos = _parse_xtime(flags >> 2 * 4, data, pos) h.atime, pos = _parse_xtime(flags >> 1 * 4, data, pos) h.arctime, pos = _parse_xtime(flags >> 0 * 4, data, pos) if mtime: h.mtime = mtime h.date_time = mtime.timetuple()[:6] return pos # rar3 one extended time field def _parse_xtime(flag, data, pos, basetime=None): res = None if flag & 8: if not basetime: basetime, pos = load_dostime(data, pos) # load second fractions rem = 0 cnt = flag & 3 for _ in range(cnt): b, pos = load_byte(data, pos) rem = (b << 16) | (rem >> 8) # convert 100ns units to microseconds usec = rem // 10 if usec > 1000000: usec = 999999 # dostime has room for 30 seconds only, correct if needed if flag & 4 and basetime.second < 59: res = basetime.replace(microsecond=usec, second=basetime.second + 1) else: res = basetime.replace(microsecond=usec) return res, pos def is_filelike(obj): """Filename or file object? """ if isinstance(obj, str) or isinstance(obj, str): return False res = True for a in ("read", "tell", "seek"): res = res and hasattr(obj, a) if not res: raise ValueError("Invalid object passed as file") return True def rar3_s2k(psw, salt): """String-to-key hash for RAR3. """ if not isinstance(psw, str): psw = psw.decode("utf8") seed = psw.encode("utf-16le") + salt iv = EMPTY h = sha1() for i in range(16): for j in range(0x4000): cnt = S_LONG.pack(i * 0x4000 + j) h.update(seed + cnt[:3]) if j == 0: iv += h.digest()[19:20] key_be = h.digest()[:16] key_le = pack("LLLL", key_be)) return key_le, iv def rar3_decompress(vers, meth, data, declen=0, flags=0, crc=0, psw=None, salt=None): """Decompress blob of compressed data. Used for data with non-standard header - eg. comments. """ # already uncompressed? if meth == RAR_M0 and (flags & RAR_FILE_PASSWORD) == 0: return data # take only necessary flags flags = flags & (RAR_FILE_PASSWORD | RAR_FILE_SALT | RAR_FILE_DICTMASK) flags |= RAR_LONG_BLOCK # file header fname = b"data" date = 0 mode = 0x20 fhdr = S_FILE_HDR.pack(len(data), declen, RAR_OS_MSDOS, crc, date, vers, meth, len(fname), mode) fhdr += fname if flags & RAR_FILE_SALT: if not salt: return EMPTY fhdr += salt # full header hlen = S_BLK_HDR.size + len(fhdr) hdr = S_BLK_HDR.pack(0, RAR_BLOCK_FILE, flags, hlen) + fhdr hcrc = rar_crc32(hdr[2:]) & 0xFFFF hdr = S_BLK_HDR.pack(hcrc, RAR_BLOCK_FILE, flags, hlen) + fhdr # archive main header mh = S_BLK_HDR.pack(0x90CF, RAR_BLOCK_MAIN, 0, 13) + ZERO * (2 + 4) # decompress via temp rar tmpfd, tmpname = mkstemp(suffix=".rar") tmpf = os.fdopen(tmpfd, "wb") try: tmpf.write(RAR_ID + mh + hdr + data) tmpf.close() cmd = [UNRAR_TOOL] + list(OPEN_ARGS) add_password_arg(cmd, psw, (flags & RAR_FILE_PASSWORD)) cmd.append(tmpname) p = custom_popen(cmd) return p.communicate()[0] finally: tmpf.close() os.unlink(tmpname) def to_datetime(t): """Convert 6-part time tuple into datetime object. """ if t is None: return None # extract values year, mon, day, h, m, s = t # assume the values are valid try: return datetime(year, mon, day, h, m, s) except ValueError: pass # sanitize invalid values mday = (0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) if mon < 1: mon = 1 if mon > 12: mon = 12 if day < 1: day = 1 if day > mday[mon]: day = mday[mon] if h > 23: h = 23 if m > 59: m = 59 if s > 59: s = 59 if mon == 2 and day == 29: try: return datetime(year, mon, day, h, m, s) except ValueError: day = 28 return datetime(year, mon, day, h, m, s) def parse_dos_time(stamp): """Parse standard 32-bit DOS timestamp. """ sec, stamp = stamp & 0x1F, stamp >> 5 mn, stamp = stamp & 0x3F, stamp >> 6 hr, stamp = stamp & 0x1F, stamp >> 5 day, stamp = stamp & 0x1F, stamp >> 5 mon, stamp = stamp & 0x0F, stamp >> 4 yr = (stamp & 0x7F) + 1980 return (yr, mon, day, hr, mn, sec * 2) def custom_popen(cmd): """Disconnect cmd from parent fds, read only from stdout. """ # needed for py2exe creationflags = 0 if sys.platform == "win32": creationflags = 0x08000000 # CREATE_NO_WINDOW # run command try: p = Popen(cmd, bufsize=0, stdout=PIPE, stdin=PIPE, stderr=STDOUT, creationflags=creationflags) except OSError as ex: if ex.errno == errno.ENOENT: raise RarCannotExec("Unrar not installed? (rarfile.UNRAR_TOOL=%r)" % UNRAR_TOOL) raise return p def custom_check(cmd, ignore_retcode=False): """Run command, collect output, raise error if needed. """ p = custom_popen(cmd) out, _ = p.communicate() if p.returncode and not ignore_retcode: raise RarExecError("Check-run failed") return out def add_password_arg(cmd, psw, ___required=False): """Append password switch to commandline. """ if UNRAR_TOOL == ALT_TOOL: return if psw is not None: cmd.append("-p" + psw) else: cmd.append("-p-") def check_returncode(p, out): """Raise exception according to unrar exit code. """ code = p.returncode if code == 0: return # map return code to exception class, codes from rar.txt errmap = [ None, RarWarning, RarFatalError, RarCRCError, RarLockedArchiveError, # 1..4 RarWriteError, RarOpenError, RarUserError, RarMemoryError, # 5..8 RarCreateError, RarNoFilesError, RarWrongPassword, ] # 9..11 if UNRAR_TOOL == ALT_TOOL: errmap = [None] if code > 0 and code < len(errmap): exc = errmap[code] elif code == 255: exc = RarUserBreak elif code < 0: exc = RarSignalExit else: exc = RarUnknownError # format message if out: msg = "%s [%d]: %s" % (exc.__doc__, p.returncode, out) else: msg = "%s [%d]" % (exc.__doc__, p.returncode) raise exc(msg) def hmac_sha256(key, data): """HMAC-SHA256""" return HMAC(key, data, sha256).digest() def membuf_tempfile(memfile): memfile.seek(0, 0) tmpfd, tmpname = mkstemp(suffix=".rar") tmpf = os.fdopen(tmpfd, "wb") try: while True: buf = memfile.read(BSIZE) if not buf: break tmpf.write(buf) tmpf.close() except: tmpf.close() os.unlink(tmpname) raise return tmpname class XTempFile(object): __slots__ = ("_tmpfile", "_filename") def __init__(self, rarfile): if is_filelike(rarfile): self._tmpfile = membuf_tempfile(rarfile) self._filename = self._tmpfile else: self._tmpfile = None self._filename = rarfile def __enter__(self): return self._filename def __exit__(self, exc_type, exc_value, tb): if self._tmpfile: try: os.unlink(self._tmpfile) except OSError: pass self._tmpfile = None sabnzbd-develop/sabnzbd/utils/pystone.py0000600000175000017500000001634013642116632016577 0ustar jpjp#!/usr/bin/python3 -OO """ "PYSTONE" Benchmark Program Version: Python/1.1 (corresponds to C/1.1 plus 2 Pystone fixes) Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg. 1013. Translated from ADA to C by Rick Richardson. Every method to preserve ADA-likeness has been used, at the expense of C-ness. Translated from C to Python by Guido van Rossum. Version History: Version 1.1 corrects two bugs in version 1.0: First, it leaked memory: in Proc1(), NextRecord ends up having a pointer to itself. I have corrected this by zapping NextRecord.PtrComp at the end of Proc1(). Second, Proc3() used the operator != to compare a record to None. This is rather inefficient and not true to the intention of the original benchmark (where a pointer comparison to None is intended; the != operator attempts to find a method __cmp__ to do value comparison of the record). Version 1.1 runs 5-10 percent faster than version 1.0, so benchmark figures of different versions can't be compared directly. """ LOOPS = 50000 from time import perf_counter __version__ = "1.1" [Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6) class Record: def __init__(self, PtrComp=None, Discr=0, EnumComp=0, IntComp=0, StringComp=0): self.PtrComp = PtrComp self.Discr = Discr self.EnumComp = EnumComp self.IntComp = IntComp self.StringComp = StringComp def copy(self): return Record(self.PtrComp, self.Discr, self.EnumComp, self.IntComp, self.StringComp) TRUE = 1 FALSE = 0 def main(loops=LOOPS): benchtime, stones = pystones(loops) print("Pystone(%s) time for %d passes = %g" % (__version__, loops, benchtime)) print("This machine benchmarks at %g pystones/second" % stones) def pystones(loops=LOOPS): return Proc0(loops) IntGlob = 0 BoolGlob = FALSE Char1Glob = "\0" Char2Glob = "\0" Array1Glob = [0] * 51 Array2Glob = [x[:] for x in [Array1Glob] * 51] PtrGlb = None PtrGlbNext = None def Proc0(loops=LOOPS): global IntGlob global BoolGlob global Char1Glob global Char2Glob global Array1Glob global Array2Glob global PtrGlb global PtrGlbNext starttime = perf_counter() for i in range(loops): pass nulltime = perf_counter() - starttime PtrGlbNext = Record() PtrGlb = Record() PtrGlb.PtrComp = PtrGlbNext PtrGlb.Discr = Ident1 PtrGlb.EnumComp = Ident3 PtrGlb.IntComp = 40 PtrGlb.StringComp = "DHRYSTONE PROGRAM, SOME STRING" String1Loc = "DHRYSTONE PROGRAM, 1'ST STRING" Array2Glob[8][7] = 10 starttime = perf_counter() for i in range(loops): Proc5() Proc4() IntLoc1 = 2 IntLoc2 = 3 String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING" EnumLoc = Ident2 BoolGlob = not Func2(String1Loc, String2Loc) while IntLoc1 < IntLoc2: IntLoc3 = 5 * IntLoc1 - IntLoc2 IntLoc3 = Proc7(IntLoc1, IntLoc2) IntLoc1 = IntLoc1 + 1 Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3) PtrGlb = Proc1(PtrGlb) CharIndex = "A" while CharIndex <= Char2Glob: if EnumLoc == Func1(CharIndex, "C"): EnumLoc = Proc6(Ident1) CharIndex = chr(ord(CharIndex) + 1) IntLoc3 = IntLoc2 * IntLoc1 IntLoc2 = IntLoc3 / IntLoc1 IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1 IntLoc1 = Proc2(IntLoc1) benchtime = perf_counter() - starttime - nulltime if benchtime == 0.0: loopsPerBenchtime = 0.0 else: loopsPerBenchtime = loops / benchtime return benchtime, loopsPerBenchtime def Proc1(PtrParIn): PtrParIn.PtrComp = NextRecord = PtrGlb.copy() PtrParIn.IntComp = 5 NextRecord.IntComp = PtrParIn.IntComp NextRecord.PtrComp = PtrParIn.PtrComp NextRecord.PtrComp = Proc3(NextRecord.PtrComp) if NextRecord.Discr == Ident1: NextRecord.IntComp = 6 NextRecord.EnumComp = Proc6(PtrParIn.EnumComp) NextRecord.PtrComp = PtrGlb.PtrComp NextRecord.IntComp = Proc7(NextRecord.IntComp, 10) else: PtrParIn = NextRecord.copy() NextRecord.PtrComp = None return PtrParIn def Proc2(IntParIO): IntLoc = IntParIO + 10 while 1: if Char1Glob == "A": IntLoc = IntLoc - 1 IntParIO = IntLoc - IntGlob EnumLoc = Ident1 if EnumLoc == Ident1: break return IntParIO def Proc3(PtrParOut): global IntGlob if PtrGlb is not None: PtrParOut = PtrGlb.PtrComp else: IntGlob = 100 PtrGlb.IntComp = Proc7(10, IntGlob) return PtrParOut def Proc4(): global Char2Glob BoolLoc = Char1Glob == "A" BoolLoc = BoolLoc or BoolGlob Char2Glob = "B" def Proc5(): global Char1Glob global BoolGlob Char1Glob = "A" BoolGlob = FALSE def Proc6(EnumParIn): EnumParOut = EnumParIn if not Func3(EnumParIn): EnumParOut = Ident4 if EnumParIn == Ident1: EnumParOut = Ident1 elif EnumParIn == Ident2: if IntGlob > 100: EnumParOut = Ident1 else: EnumParOut = Ident4 elif EnumParIn == Ident3: EnumParOut = Ident2 elif EnumParIn == Ident4: pass elif EnumParIn == Ident5: EnumParOut = Ident3 return EnumParOut def Proc7(IntParI1, IntParI2): IntLoc = IntParI1 + 2 IntParOut = IntParI2 + IntLoc return IntParOut def Proc8(Array1Par, Array2Par, IntParI1, IntParI2): global IntGlob IntLoc = IntParI1 + 5 Array1Par[IntLoc] = IntParI2 Array1Par[IntLoc + 1] = Array1Par[IntLoc] Array1Par[IntLoc + 30] = IntLoc for IntIndex in range(IntLoc, IntLoc + 2): Array2Par[IntLoc][IntIndex] = IntLoc Array2Par[IntLoc][IntLoc - 1] = Array2Par[IntLoc][IntLoc - 1] + 1 Array2Par[IntLoc + 20][IntLoc] = Array1Par[IntLoc] IntGlob = 5 def Func1(CharPar1, CharPar2): CharLoc1 = CharPar1 CharLoc2 = CharLoc1 if CharLoc2 != CharPar2: return Ident1 else: return Ident2 def Func2(StrParI1, StrParI2): IntLoc = 1 while IntLoc <= 1: if Func1(StrParI1[IntLoc], StrParI2[IntLoc + 1]) == Ident1: CharLoc = "A" IntLoc = IntLoc + 1 if "W" <= CharLoc <= "Z": IntLoc = 7 if CharLoc == "X": return TRUE else: if StrParI1 > StrParI2: IntLoc = IntLoc + 7 return TRUE else: return FALSE def Func3(EnumParIn): EnumLoc = EnumParIn if EnumLoc == Ident3: return TRUE return FALSE if __name__ == "__main__": import sys def error(msg): print(msg, end=" ", file=sys.stderr) print("usage: %s [number_of_loops]" % sys.argv[0], file=sys.stderr) sys.exit(100) nargs = len(sys.argv) - 1 if nargs > 1: error("%d arguments are too many;" % nargs) elif nargs == 1: try: loops = int(sys.argv[1]) except ValueError: error("Invalid argument %r;" % sys.argv[1]) else: loops = LOOPS main(loops) sabnzbd-develop/sabnzbd/utils/systrayiconthread.py0000600000175000017500000002412113642116632020651 0ustar jpjp#!/usr/bin/env python # based on SysTrayIcon.py by Simon Brunning - simon@brunningonline.net # http://www.brunningonline.net/simon/blog/archives/001835.html # http://www.brunningonline.net/simon/blog/archives/SysTrayIcon.py.html # modified on 2011-10-04 by Jan Schejbal to support threading and preload icons # override doUpdates to perform actions inside the icon thread # override click to perform actions when left-clicking the icon import os import pywintypes import win32api import win32con import win32gui_struct import timer try: import winxpgui as win32gui except ImportError: import win32gui from threading import Thread from time import sleep class SysTrayIconThread(Thread): QUIT = "QUIT" SPECIAL_ACTIONS = [QUIT] FIRST_ID = 1023 terminate = False def __init__(self, icon, hover_text, menu_options, on_quit=None, default_menu_index=None, window_class_name=None): Thread.__init__(self) self.icon = icon self.icons = {} self.hover_text = hover_text self.on_quit = on_quit # menu_options = menu_options + (('Quit', None, self.QUIT),) self._next_action_id = self.FIRST_ID self.menu_actions_by_id = set() self.menu_options = self._add_ids_to_menu_options(list(menu_options)) self.menu_actions_by_id = dict(self.menu_actions_by_id) del self._next_action_id self.click_timer = None self.default_menu_index = default_menu_index or 0 self.window_class_name = window_class_name or "SysTrayIconPy" self.start() def initialize(self): message_map = { win32gui.RegisterWindowMessage("TaskbarCreated"): self.restart, win32con.WM_DESTROY: self.destroy, win32con.WM_COMMAND: self.command, win32con.WM_USER + 20: self.notify, } # Register the Window class. window_class = win32gui.WNDCLASS() hinst = window_class.hInstance = win32gui.GetModuleHandle(None) window_class.lpszClassName = self.window_class_name window_class.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW window_class.hCursor = win32gui.LoadCursor(0, win32con.IDC_ARROW) window_class.hbrBackground = win32con.COLOR_WINDOW window_class.lpfnWndProc = message_map # could also specify a wndproc. classAtom = win32gui.RegisterClass(window_class) # Create the Window. style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU self.hwnd = win32gui.CreateWindow( classAtom, self.window_class_name, style, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 0, 0, hinst, None, ) win32gui.UpdateWindow(self.hwnd) self.notify_id = None self.refresh_icon() def run(self): self.initialize() while not self.terminate: win32gui.PumpWaitingMessages() self.doUpdates() sleep(0.100) win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, (self.hwnd, 0)) # Override this def doUpdates(self): pass # Notification def sendnotification(self, title, msg): hicon = self.get_icon(self.icon) win32gui.Shell_NotifyIcon( win32gui.NIM_MODIFY, (self.hwnd, 0, win32gui.NIF_INFO, win32con.WM_USER + 20, hicon, "Balloon tooltip", msg, 200, title), ) def _add_ids_to_menu_options(self, menu_options): result = [] for menu_option in menu_options: option_text, option_icon, option_action = menu_option if callable(option_action) or option_action in self.SPECIAL_ACTIONS: self.menu_actions_by_id.add((self._next_action_id, option_action)) result.append(menu_option + (self._next_action_id,)) elif non_string_iterable(option_action): result.append( (option_text, option_icon, self._add_ids_to_menu_options(option_action), self._next_action_id) ) elif option_text == "SEPARATOR": # Skip, add separator later result.append(menu_option + (self._next_action_id,)) else: print(("Unknown item", option_text, option_icon, option_action)) self._next_action_id += 1 return result def get_icon(self, path): hicon = self.icons.get(path) if hicon != None: return hicon # Try and find a custom icon hinst = win32gui.GetModuleHandle(None) if os.path.isfile(path): icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE hicon = win32gui.LoadImage(hinst, path, win32con.IMAGE_ICON, 0, 0, icon_flags) else: print("Can't find icon file - using default.") hicon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION) self.icons[path] = hicon return hicon def refresh_icon(self): hicon = self.get_icon(self.icon) if self.notify_id: message = win32gui.NIM_MODIFY else: message = win32gui.NIM_ADD self.notify_id = ( self.hwnd, 0, win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP, win32con.WM_USER + 20, hicon, self.hover_text, ) try: win32gui.Shell_NotifyIcon(message, self.notify_id) except: # Timeouts can occur after system comes out of standby/hibernate pass def restart(self, hwnd, msg, wparam, lparam): self.refresh_icon() def destroy(self, hwnd, msg, wparam, lparam): if self.on_quit: self.on_quit(self) nid = (self.hwnd, 0) win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, nid) win32gui.PostQuitMessage(0) # Terminate the app. def notify(self, hwnd, msg, wparam, lparam): # Double click is actually 1 single click followed # by a double-click event, no way to differentiate # So we need a timed callback to cancel if lparam == win32con.WM_LBUTTONDBLCLK: self.execute_menu_option(self.default_menu_index + self.FIRST_ID) self.stop_click_timer() elif lparam == win32con.WM_RBUTTONUP: self.show_menu() elif lparam == win32con.WM_LBUTTONDOWN: # Wrapper of win32api, timeout is in ms # We need to wait at least untill what user has defined as double click self.stop_click_timer() self.click_timer = timer.set_timer(win32gui.GetDoubleClickTime() * 2, self.click) return True def show_menu(self): menu = win32gui.CreatePopupMenu() self.create_menu(menu, self.menu_options) # win32gui.SetMenuDefaultItem(menu, 1000, 0) try: pos = win32gui.GetCursorPos() # See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/menus_0hdi.asp win32gui.SetForegroundWindow(self.hwnd) win32gui.TrackPopupMenu(menu, win32con.TPM_LEFTALIGN, pos[0], pos[1], 0, self.hwnd, None) win32gui.PostMessage(self.hwnd, win32con.WM_NULL, 0, 0) except pywintypes.error: # Weird PyWin/win32gui bug, just ignore it for now pass # Override this for left-click action # Need to call the stop-timer in that function! def click(self, *args): pass def stop_click_timer(self): # Stop the timer if self.click_timer: timer.kill_timer(self.click_timer) self.click_timer = None def create_menu(self, menu, menu_options): for option_text, option_icon, option_action, option_id in menu_options[::-1]: if option_icon: option_icon = self.prep_menu_icon(option_icon) if option_id in self.menu_actions_by_id: item, extras = win32gui_struct.PackMENUITEMINFO(text=option_text, hbmpItem=option_icon, wID=option_id) win32gui.InsertMenuItem(menu, 0, 1, item) elif option_text == "SEPARATOR": item, extras = win32gui_struct.PackMENUITEMINFO(fType=win32con.MFT_SEPARATOR) win32gui.InsertMenuItem(menu, 0, 1, item) else: submenu = win32gui.CreatePopupMenu() self.create_menu(submenu, option_action) item, extras = win32gui_struct.PackMENUITEMINFO( text=option_text, hbmpItem=option_icon, hSubMenu=submenu ) win32gui.InsertMenuItem(menu, 0, 1, item) def prep_menu_icon(self, icon): # First load the icon. ico_x = win32api.GetSystemMetrics(win32con.SM_CXSMICON) ico_y = win32api.GetSystemMetrics(win32con.SM_CYSMICON) hicon = win32gui.LoadImage(0, icon, win32con.IMAGE_ICON, ico_x, ico_y, win32con.LR_LOADFROMFILE) hdcBitmap = win32gui.CreateCompatibleDC(0) hdcScreen = win32gui.GetDC(0) hbm = win32gui.CreateCompatibleBitmap(hdcScreen, ico_x, ico_y) hbmOld = win32gui.SelectObject(hdcBitmap, hbm) # Fill the background. brush = win32gui.GetSysColorBrush(win32con.COLOR_MENU) win32gui.FillRect(hdcBitmap, (0, 0, 16, 16), brush) # unclear if brush needs to be feed. Best clue I can find is: # "GetSysColorBrush returns a cached brush instead of allocating a new # one." - implies no DeleteObject # draw the icon win32gui.DrawIconEx(hdcBitmap, 0, 0, hicon, ico_x, ico_y, 0, 0, win32con.DI_NORMAL) win32gui.SelectObject(hdcBitmap, hbmOld) win32gui.DeleteDC(hdcBitmap) return hbm def command(self, hwnd, msg, wparam, lparam): id = win32gui.LOWORD(wparam) self.execute_menu_option(id) def execute_menu_option(self, id): menu_action = self.menu_actions_by_id[id] if menu_action == self.QUIT: win32gui.DestroyWindow(self.hwnd) else: menu_action(self) def non_string_iterable(obj): try: iter(obj) except TypeError: return False else: return not isinstance(obj, str) sabnzbd-develop/sabnzbd/utils/diskspeed.py0000600000175000017500000000360413642116632017050 0ustar jpjp#!/usr/bin/env python import time import os import sys _DUMP_DATA_SIZE = 10 * 1024 * 1024 _DUMP_DATA = os.urandom(_DUMP_DATA_SIZE) def diskspeedmeasure(dirname): """ Returns writing speed to dirname in MB/s method: keep writing a file, until 1 second is passed. Then divide bytes written by time passed In case of problems (ie non-writable dir or file), return None """ maxtime = 1.0 # sec total_written = 0 filename = os.path.join(dirname, "outputTESTING.txt") try: # Use low-level I/O fp = os.open(filename, os.O_CREAT | os.O_WRONLY, 0o777) # Start looping total_time = 0.0 while total_time < maxtime: start = time.time() os.write(fp, _DUMP_DATA) os.fsync(fp) total_time += time.time() - start total_written += _DUMP_DATA_SIZE # Remove the file try: # Have to use low-level close os.close(fp) os.remove(filename) except: pass except: # No succesful measurement, so ... report None return None return total_written / total_time / 1024 / 1024 if __name__ == "__main__": print("Let's go") if len(sys.argv) >= 2: dirname = sys.argv[1] if not os.path.isdir(dirname): print("Specified argument is not a directory. Bailing out") sys.exit(1) else: # no argument, so use current working directory dirname = os.getcwd() print("Using current working directory") try: speed = diskspeedmeasure(dirname) if speed: print("Disk writing speed: %.2f Mbytes per second" % speed) else: print("No measurement possible. Check that directory is writable.") except: print("Something went wrong. I don't know what") raise print("Done") sabnzbd-develop/sabnzbd/utils/__init__.py0000600000175000017500000000004413642116632016627 0ustar jpjp# Needed so the import always works sabnzbd-develop/sabnzbd/utils/getperformance.py0000600000175000017500000000375513642116632020105 0ustar jpjpimport platform import subprocess import locale from .pystone import pystones def getcpu(): # find the CPU name (which needs a different method per OS), and return it # If none found, return platform.platform(). cputype = None try: if platform.system() == "Windows": import winreg key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"Hardware\Description\System\CentralProcessor\0") cputype = winreg.QueryValueEx(key, "ProcessorNameString")[0] winreg.CloseKey(key) elif platform.system() == "Darwin": cputype = subprocess.check_output(["sysctl", "-n", "machdep.cpu.brand_string"]).strip() elif platform.system() == "Linux": for myline in open("/proc/cpuinfo"): if myline.startswith("model name"): # Typical line: # model name : Intel(R) Xeon(R) CPU E5335 @ 2.00GHz cputype = myline.split(":", 1)[1] # get everything after the first ":" break # we're done cputype = cputype.decode(locale.getpreferredencoding()) except: # An exception, maybe due to a subprocess call gone wrong pass if cputype: # OK, found. Remove unwanted spaces: cputype = " ".join(cputype.split()) else: # Not found, so let's fall back to platform() cputype = platform.platform() return cputype def getpystone(): # Start calculation maxpystone = 0 # Start with a short run, find the the pystone, and increase runtime until duration took > 0.1 second for pyseed in [1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000]: duration, pystonefloat = pystones(pyseed) maxpystone = max(maxpystone, int(pystonefloat)) # Stop when pystone() has been running for at least 0.1 second if duration > 0.1: break return maxpystone if __name__ == "__main__": print(getpystone()) print(getcpu()) sabnzbd-develop/sabnzbd/utils/pybonjour.py0000600000175000017500000016403013642116632017125 0ustar jpjp################################################################################ # # Copyright (c) 2007-2008 Christopher J. Stawarz # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation files # (the "Software"), to deal in the Software without restriction, # including without limitation the rights to use, copy, modify, merge, # publish, distribute, sublicense, and/or sell copies of the Software, # and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # ################################################################################ """ Pure-Python interface to Apple Bonjour and compatible DNS-SD libraries pybonjour provides a pure-Python interface (via ctypes) to Apple Bonjour and compatible DNS-SD libraries (such as Avahi). It allows Python scripts to take advantage of Zero Configuration Networking (Zeroconf) to register, discover, and resolve services on both local and wide-area networks. Since pybonjour is implemented in pure Python, scripts that use it can easily be ported to Mac OS X, Windows, Linux, and other systems that run Bonjour. Note on strings: Internally, all strings used in DNS-SD are UTF-8 strings. String arguments passed to the DNS-SD functions provided by pybonjour must be either unicode instances or str instances that can be converted to unicode using the default encoding. (Passing a non-convertible str will result in an exception.) Strings returned from pybonjour (either directly from API functions or passed to application callbacks) are always unicode instances. """ __author__ = "Christopher Stawarz " __version__ = "1.1.1" __revision__ = int("$Revision: 6125 $".split()[1]) import ctypes import os import re import socket import sys ################################################################################ # # Global setup # ################################################################################ class _DummyLock(object): @staticmethod def acquire(): pass @staticmethod def release(): pass _global_lock = _DummyLock() if sys.platform == "win32": # Need to use the stdcall variants _libdnssd = ctypes.windll.dnssd _CFunc = ctypes.WINFUNCTYPE else: if sys.platform == "darwin": _libdnssd = "libSystem.B.dylib" else: _libdnssd = "libdns_sd.so.1" # If libdns_sd is actually Avahi's Bonjour compatibility # layer, silence its annoying warning messages, and use a real # RLock as the global lock, since the compatibility layer # isn't thread safe. try: ctypes.cdll.LoadLibrary("libavahi-client.so.3") except OSError: pass else: os.environ["AVAHI_COMPAT_NOWARN"] = "1" import threading _global_lock = threading.RLock() _libdnssd = ctypes.cdll.LoadLibrary(_libdnssd) _CFunc = ctypes.CFUNCTYPE ################################################################################ # # Constants # ################################################################################ # # General flags # kDNSServiceFlagsMoreComing = 0x1 kDNSServiceFlagsAdd = 0x2 kDNSServiceFlagsDefault = 0x4 kDNSServiceFlagsNoAutoRename = 0x8 kDNSServiceFlagsShared = 0x10 kDNSServiceFlagsUnique = 0x20 kDNSServiceFlagsBrowseDomains = 0x40 kDNSServiceFlagsRegistrationDomains = 0x80 kDNSServiceFlagsLongLivedQuery = 0x100 kDNSServiceFlagsAllowRemoteQuery = 0x200 kDNSServiceFlagsForceMulticast = 0x400 kDNSServiceFlagsReturnCNAME = 0x800 # # Service classes # kDNSServiceClass_IN = 1 # # Service types # kDNSServiceType_A = 1 kDNSServiceType_NS = 2 kDNSServiceType_MD = 3 kDNSServiceType_MF = 4 kDNSServiceType_CNAME = 5 kDNSServiceType_SOA = 6 kDNSServiceType_MB = 7 kDNSServiceType_MG = 8 kDNSServiceType_MR = 9 kDNSServiceType_NULL = 10 kDNSServiceType_WKS = 11 kDNSServiceType_PTR = 12 kDNSServiceType_HINFO = 13 kDNSServiceType_MINFO = 14 kDNSServiceType_MX = 15 kDNSServiceType_TXT = 16 kDNSServiceType_RP = 17 kDNSServiceType_AFSDB = 18 kDNSServiceType_X25 = 19 kDNSServiceType_ISDN = 20 kDNSServiceType_RT = 21 kDNSServiceType_NSAP = 22 kDNSServiceType_NSAP_PTR = 23 kDNSServiceType_SIG = 24 kDNSServiceType_KEY = 25 kDNSServiceType_PX = 26 kDNSServiceType_GPOS = 27 kDNSServiceType_AAAA = 28 kDNSServiceType_LOC = 29 kDNSServiceType_NXT = 30 kDNSServiceType_EID = 31 kDNSServiceType_NIMLOC = 32 kDNSServiceType_SRV = 33 kDNSServiceType_ATMA = 34 kDNSServiceType_NAPTR = 35 kDNSServiceType_KX = 36 kDNSServiceType_CERT = 37 kDNSServiceType_A6 = 38 kDNSServiceType_DNAME = 39 kDNSServiceType_SINK = 40 kDNSServiceType_OPT = 41 kDNSServiceType_TKEY = 249 kDNSServiceType_TSIG = 250 kDNSServiceType_IXFR = 251 kDNSServiceType_AXFR = 252 kDNSServiceType_MAILB = 253 kDNSServiceType_MAILA = 254 kDNSServiceType_ANY = 255 # # Error codes # kDNSServiceErr_NoError = 0 kDNSServiceErr_Unknown = -65537 kDNSServiceErr_NoSuchName = -65538 kDNSServiceErr_NoMemory = -65539 kDNSServiceErr_BadParam = -65540 kDNSServiceErr_BadReference = -65541 kDNSServiceErr_BadState = -65542 kDNSServiceErr_BadFlags = -65543 kDNSServiceErr_Unsupported = -65544 kDNSServiceErr_NotInitialized = -65545 kDNSServiceErr_AlreadyRegistered = -65547 kDNSServiceErr_NameConflict = -65548 kDNSServiceErr_Invalid = -65549 kDNSServiceErr_Firewall = -65550 kDNSServiceErr_Incompatible = -65551 kDNSServiceErr_BadInterfaceIndex = -65552 kDNSServiceErr_Refused = -65553 kDNSServiceErr_NoSuchRecord = -65554 kDNSServiceErr_NoAuth = -65555 kDNSServiceErr_NoSuchKey = -65556 kDNSServiceErr_NATTraversal = -65557 kDNSServiceErr_DoubleNAT = -65558 kDNSServiceErr_BadTime = -65559 # # Other constants # kDNSServiceMaxServiceName = 64 kDNSServiceMaxDomainName = 1005 kDNSServiceInterfaceIndexAny = 0 kDNSServiceInterfaceIndexLocalOnly = -1 ################################################################################ # # Error handling # ################################################################################ class BonjourError(Exception): """ Exception representing an error returned by the DNS-SD library. The errorCode attribute contains the actual integer error code returned. """ _errmsg = { kDNSServiceErr_NoSuchName: "no such name", kDNSServiceErr_NoMemory: "no memory", kDNSServiceErr_BadParam: "bad param", kDNSServiceErr_BadReference: "bad reference", kDNSServiceErr_BadState: "bad state", kDNSServiceErr_BadFlags: "bad flags", kDNSServiceErr_Unsupported: "unsupported", kDNSServiceErr_NotInitialized: "not initialized", kDNSServiceErr_AlreadyRegistered: "already registered", kDNSServiceErr_NameConflict: "name conflict", kDNSServiceErr_Invalid: "invalid", kDNSServiceErr_Firewall: "firewall", kDNSServiceErr_Incompatible: "incompatible", kDNSServiceErr_BadInterfaceIndex: "bad interface index", kDNSServiceErr_Refused: "refused", kDNSServiceErr_NoSuchRecord: "no such record", kDNSServiceErr_NoAuth: "no auth", kDNSServiceErr_NoSuchKey: "no such key", kDNSServiceErr_NATTraversal: "NAT traversal", kDNSServiceErr_DoubleNAT: "double NAT", kDNSServiceErr_BadTime: "bad time", } @classmethod def _errcheck(cls, result, func, args): if result != kDNSServiceErr_NoError: raise cls(result) return args def __init__(self, errorCode): self.errorCode = errorCode Exception.__init__(self, (errorCode, self._errmsg.get(errorCode, "unknown"))) ################################################################################ # # Data types # ################################################################################ class _utf8_char_p(ctypes.c_char_p): @classmethod def from_param(cls, obj): if (obj is not None) and (not isinstance(obj, cls)): if not str(obj): raise TypeError("parameter must be a string type instance") obj = obj.encode("utf-8") return ctypes.c_char_p.from_param(obj) def decode(self): if self.value is None: return None return self.value.decode("utf-8") class _utf8_char_p_non_null(_utf8_char_p): @classmethod def from_param(cls, obj): if obj is None: raise ValueError("parameter cannot be None") return _utf8_char_p.from_param(obj) _DNSServiceFlags = ctypes.c_uint32 _DNSServiceErrorType = ctypes.c_int32 class DNSRecordRef(ctypes.c_void_p): """ A DNSRecordRef pointer. DO NOT CREATE INSTANCES OF THIS CLASS! Only instances returned by the DNS-SD library are valid. Using others will likely cause the Python interpreter to crash. Application code should not use any of the methods of this class. The only valid use of a DNSRecordRef instance is as an argument to a DNS-SD function. To compare two DNSRecordRef instances for equality, use '==' rather than 'is'. """ @classmethod def from_param(cls, obj): if type(obj) is not cls: raise TypeError("expected '%s', got '%s'" % (cls.__name__, type(obj).__name__)) if obj.value is None: raise ValueError("invalid %s instance" % cls.__name__) return obj def __eq__(self, other): return (type(other) is type(self)) and (other.value == self.value) def __ne__(self, other): return not (other == self) def _invalidate(self): self.value = None def _valid(self): return self.value is not None class _DNSRecordRef_or_null(DNSRecordRef): @classmethod def from_param(cls, obj): if obj is None: return obj return DNSRecordRef.from_param(obj) class DNSServiceRef(DNSRecordRef): """ A DNSServiceRef pointer. DO NOT CREATE INSTANCES OF THIS CLASS! Only instances returned by the DNS-SD library are valid. Using others will likely cause the Python interpreter to crash. An instance of this class represents an active connection to the mDNS daemon. The connection remains open until the close() method is called (which also terminates the associated browse, resolve, etc.). Note that this method is *not* called automatically when the instance is deallocated; therefore, application code must be certain to call close() when the connection is no longer needed. The primary use of a DNSServiceRef instance is in conjunction with select() or poll() to determine when a response from the daemon is available. When the file descriptor returned by fileno() is ready for reading, a reply from the daemon is available and should be processed by passing the DNSServiceRef instance to DNSServiceProcessResult(), which will invoke the appropriate application callback function. (Note that the file descriptor should never be read from or written to directly.) The DNSServiceRef class supports the context management protocol introduced in Python 2.5, meaning applications can use the 'with' statement to ensure that DNSServiceRef instances are closed regardless of whether an exception occurs, e.g. sdRef = DNSServiceBrowse(...) with sdRef: # sdRef will be closed regardless of how this block is # exited ... To compare two DNSServiceRef instances for equality, use '==' rather than 'is'. """ def __init__(self, *args, **kwargs): DNSRecordRef.__init__(self, *args, **kwargs) # Since callback functions are called asynchronously, we need # to hold onto references to them for as long as they're in # use. Otherwise, Python could deallocate them before we call # DNSServiceProcessResult(), meaning the Bonjour library would # dereference freed memory when it tried to invoke the # callback. self._callbacks = [] # A DNSRecordRef is invalidated if DNSServiceRefDeallocate() # is called on the corresponding DNSServiceRef, so we need to # keep track of all our record refs and invalidate them when # we're closed. self._record_refs = [] def __enter__(self): return self def __exit__(self, type, value, traceback): self.close() def _add_callback(self, cb): self._callbacks.append(cb) def _add_record_ref(self, ref): self._record_refs.append(ref) def close(self): """ Close the connection to the mDNS daemon and terminate any associated browse, resolve, etc. operations. """ if self._valid(): for ref in self._record_refs: ref._invalidate() del self._record_refs _global_lock.acquire() try: _DNSServiceRefDeallocate(self) finally: _global_lock.release() self._invalidate() del self._callbacks def fileno(self): """ Return the file descriptor associated with this connection. This descriptor should never be read from or written to directly. It should only be passed to select() or poll() to determine when a response from the mDNS daemon is available. """ _global_lock.acquire() try: fd = _DNSServiceRefSockFD(self) finally: _global_lock.release() return fd _DNSServiceDomainEnumReply = _CFunc( None, DNSServiceRef, # sdRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _DNSServiceErrorType, # errorCode _utf8_char_p, # replyDomain ctypes.c_void_p, # context ) _DNSServiceRegisterReply = _CFunc( None, DNSServiceRef, # sdRef _DNSServiceFlags, # flags _DNSServiceErrorType, # errorCode _utf8_char_p, # name _utf8_char_p, # regtype _utf8_char_p, # domain ctypes.c_void_p, # context ) _DNSServiceBrowseReply = _CFunc( None, DNSServiceRef, # sdRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _DNSServiceErrorType, # errorCode _utf8_char_p, # serviceName _utf8_char_p, # regtype _utf8_char_p, # replyDomain ctypes.c_void_p, # context ) _DNSServiceResolveReply = _CFunc( None, DNSServiceRef, # sdRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _DNSServiceErrorType, # errorCode _utf8_char_p, # fullname _utf8_char_p, # hosttarget ctypes.c_uint16, # port ctypes.c_uint16, # txtLen ctypes.c_void_p, # txtRecord (not null-terminated, so c_void_p) ctypes.c_void_p, # context ) _DNSServiceRegisterRecordReply = _CFunc( None, DNSServiceRef, # sdRef DNSRecordRef, # RecordRef _DNSServiceFlags, # flags _DNSServiceErrorType, # errorCode ctypes.c_void_p, # context ) _DNSServiceQueryRecordReply = _CFunc( None, DNSServiceRef, # sdRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _DNSServiceErrorType, # errorCode _utf8_char_p, # fullname ctypes.c_uint16, # rrtype ctypes.c_uint16, # rrclass ctypes.c_uint16, # rdlen ctypes.c_void_p, # rdata ctypes.c_uint32, # ttl ctypes.c_void_p, # context ) ################################################################################ # # Low-level function bindings # ################################################################################ def _create_function_bindings(): ERRCHECK = True NO_ERRCHECK = False OUTPARAM = lambda index: index NO_OUTPARAM = None specs = { #'funcname': # ( # return_type, # errcheck, # outparam, # ( # param_1_type, # param_2_type, # ... # param_n_type, # )), "DNSServiceRefSockFD": (ctypes.c_int, NO_ERRCHECK, NO_OUTPARAM, (DNSServiceRef,)), # sdRef "DNSServiceProcessResult": (_DNSServiceErrorType, ERRCHECK, NO_OUTPARAM, (DNSServiceRef,)), # sdRef "DNSServiceRefDeallocate": (None, NO_ERRCHECK, NO_OUTPARAM, (DNSServiceRef,)), # sdRef "DNSServiceEnumerateDomains": ( _DNSServiceErrorType, ERRCHECK, OUTPARAM(0), ( ctypes.POINTER(DNSServiceRef), # sdRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _DNSServiceDomainEnumReply, # callBack ctypes.c_void_p, # context ), ), "DNSServiceRegister": ( _DNSServiceErrorType, ERRCHECK, OUTPARAM(0), ( ctypes.POINTER(DNSServiceRef), # sdRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _utf8_char_p, # name _utf8_char_p_non_null, # regtype _utf8_char_p, # domain _utf8_char_p, # host ctypes.c_uint16, # port ctypes.c_uint16, # txtLen ctypes.c_void_p, # txtRecord _DNSServiceRegisterReply, # callBack ctypes.c_void_p, # context ), ), "DNSServiceAddRecord": ( _DNSServiceErrorType, ERRCHECK, OUTPARAM(1), ( DNSServiceRef, # sdRef ctypes.POINTER(DNSRecordRef), # RecordRef _DNSServiceFlags, # flags ctypes.c_uint16, # rrtype ctypes.c_uint16, # rdlen ctypes.c_void_p, # rdata ctypes.c_uint32, # ttl ), ), "DNSServiceUpdateRecord": ( _DNSServiceErrorType, ERRCHECK, NO_OUTPARAM, ( DNSServiceRef, # sdRef _DNSRecordRef_or_null, # RecordRef _DNSServiceFlags, # flags ctypes.c_uint16, # rdlen ctypes.c_void_p, # rdata ctypes.c_uint32, # ttl ), ), "DNSServiceRemoveRecord": ( _DNSServiceErrorType, ERRCHECK, NO_OUTPARAM, (DNSServiceRef, DNSRecordRef, _DNSServiceFlags), # sdRef # RecordRef # flags ), "DNSServiceBrowse": ( _DNSServiceErrorType, ERRCHECK, OUTPARAM(0), ( ctypes.POINTER(DNSServiceRef), # sdRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _utf8_char_p_non_null, # regtype _utf8_char_p, # domain _DNSServiceBrowseReply, # callBack ctypes.c_void_p, # context ), ), "DNSServiceResolve": ( _DNSServiceErrorType, ERRCHECK, OUTPARAM(0), ( ctypes.POINTER(DNSServiceRef), # sdRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _utf8_char_p_non_null, # name _utf8_char_p_non_null, # regtype _utf8_char_p_non_null, # domain _DNSServiceResolveReply, # callBack ctypes.c_void_p, # context ), ), "DNSServiceCreateConnection": ( _DNSServiceErrorType, ERRCHECK, OUTPARAM(0), (ctypes.POINTER(DNSServiceRef),), # sdRef ), "DNSServiceRegisterRecord": ( _DNSServiceErrorType, ERRCHECK, OUTPARAM(1), ( DNSServiceRef, # sdRef ctypes.POINTER(DNSRecordRef), # RecordRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _utf8_char_p_non_null, # fullname ctypes.c_uint16, # rrtype ctypes.c_uint16, # rrclass ctypes.c_uint16, # rdlen ctypes.c_void_p, # rdata ctypes.c_uint32, # ttl _DNSServiceRegisterRecordReply, # callBack ctypes.c_void_p, # context ), ), "DNSServiceQueryRecord": ( _DNSServiceErrorType, ERRCHECK, OUTPARAM(0), ( ctypes.POINTER(DNSServiceRef), # sdRef _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _utf8_char_p_non_null, # fullname ctypes.c_uint16, # rrtype ctypes.c_uint16, # rrclass _DNSServiceQueryRecordReply, # callBack ctypes.c_void_p, # context ), ), "DNSServiceReconfirmRecord": ( None, # _DNSServiceErrorType in more recent versions NO_ERRCHECK, NO_OUTPARAM, ( _DNSServiceFlags, # flags ctypes.c_uint32, # interfaceIndex _utf8_char_p_non_null, # fullname ctypes.c_uint16, # rrtype ctypes.c_uint16, # rrclass ctypes.c_uint16, # rdlen ctypes.c_void_p, # rdata ), ), "DNSServiceConstructFullName": ( ctypes.c_int, ERRCHECK, OUTPARAM(0), ( ctypes.c_char * kDNSServiceMaxDomainName, # fullName _utf8_char_p, # service _utf8_char_p_non_null, # regtype _utf8_char_p_non_null, # domain ), ), } for name, (restype, errcheck, outparam, argtypes) in specs.items(): prototype = _CFunc(restype, *argtypes) paramflags = [1] * len(argtypes) if outparam is not None: paramflags[outparam] = 2 paramflags = tuple((val,) for val in paramflags) func = prototype((name, _libdnssd), paramflags) if errcheck: func.errcheck = BonjourError._errcheck globals()["_" + name] = func # Only need to do this once _create_function_bindings() del _create_function_bindings ################################################################################ # # Internal utility types and functions # ################################################################################ class _NoDefault(object): def __repr__(self): return "" def check(self, obj): if obj is self: raise ValueError("required parameter value missing") _NO_DEFAULT = _NoDefault() def _string_to_length_and_void_p(string): if isinstance(string, TXTRecord): string = str(string) void_p = ctypes.cast(ctypes.c_char_p(string), ctypes.c_void_p) return len(string), void_p def _length_and_void_p_to_string(length, void_p): char_p = ctypes.cast(void_p, ctypes.POINTER(ctypes.c_char)) return "".join(char_p[i].decode("utf-8") for i in range(length)) ################################################################################ # # High-level functions # ################################################################################ def DNSServiceProcessResult(sdRef,): """ Read a reply from the daemon, calling the appropriate application callback. This call will block until the daemon's response is received. Use sdRef in conjunction with select() or poll() to determine the presence of a response from the server before calling this function to process the reply without blocking. Call this function at any point if it is acceptable to block until the daemon's response arrives. Note that the client is responsible for ensuring that DNSServiceProcessResult() is called whenever there is a reply from the daemon; the daemon may terminate its connection with a client that does not process the daemon's responses. sdRef: A DNSServiceRef returned by any of the DNSService calls that take a callback parameter. """ _global_lock.acquire() try: _DNSServiceProcessResult(sdRef) finally: _global_lock.release() def DNSServiceEnumerateDomains(flags, interfaceIndex=kDNSServiceInterfaceIndexAny, callBack=None): """ Asynchronously enumerate domains available for browsing and registration. The enumeration MUST be cancelled by closing the returned DNSServiceRef when no more domains are to be found. flags: Possible values are: kDNSServiceFlagsBrowseDomains to enumerate domains recommended for browsing. kDNSServiceFlagsRegistrationDomains to enumerate domains recommended for registration. interfaceIndex: If non-zero, specifies the interface on which to look for domains. Most applications will pass kDNSServiceInterfaceIndexAny (0) to enumerate domains on all interfaces. callBack: The function to be called when a domain is found or the call asynchronously fails. Its signature should be callBack(sdRef, flags, interfaceIndex, errorCode, replyDomain). return value: A DNSServiceRef instance. Callback Parameters: sdRef: The DNSServiceRef returned by DNSServiceEnumerateDomains(). flags: Possible values are: kDNSServiceFlagsMoreComing kDNSServiceFlagsAdd kDNSServiceFlagsDefault interfaceIndex: Specifies the interface on which the domain exists. errorCode: Will be kDNSServiceErr_NoError (0) on success, otherwise indicates the failure that occurred (in which case other parameters are undefined). replyDomain: The name of the domain. """ @_DNSServiceDomainEnumReply def _callback(sdRef, flags, interfaceIndex, errorCode, replyDomain, context): if callBack is not None: callBack(sdRef, flags, interfaceIndex, errorCode, replyDomain.decode()) _global_lock.acquire() try: sdRef = _DNSServiceEnumerateDomains(flags, interfaceIndex, _callback, None) finally: _global_lock.release() sdRef._add_callback(_callback) return sdRef def DNSServiceRegister( flags=0, interfaceIndex=kDNSServiceInterfaceIndexAny, name=None, regtype=_NO_DEFAULT, domain=None, host=None, port=_NO_DEFAULT, txtRecord="", callBack=None, ): """ Register a service that is discovered via DNSServiceBrowse() and DNSServiceResolve() calls. flags: Indicates the renaming behavior on name conflict. Most applications will pass 0. interfaceIndex: If non-zero, specifies the interface on which to register the service. Most applications will pass kDNSServiceInterfaceIndexAny (0) to register on all available interfaces. name: If not None, specifies the service name to be registered. Most applications will not specify a name, in which case the computer name is used. (This name is communicated to the client via the callback.) If a name is specified, it must be 1-63 bytes of UTF-8 text. If the name is longer than 63 bytes, it will be automatically truncated to a legal length, unless the flag kDNSServiceFlagsNoAutoRename is set, in which case a BonjourError exception will be thrown. regtype: The service type followed by the protocol, separated by a dot (e.g. "_ftp._tcp"). The service type must be an underscore, followed by 1-14 characters, which may be letters, digits, or hyphens. The transport protocol must be "_tcp" or "_udp". New service types should be registered at . domain: If not None, specifies the domain on which to advertise the service. Most applications will not specify a domain, instead automatically registering in the default domain(s). host: If not None, specifies the SRV target host name. Most applications will not specify a host, instead automatically using the machine's default host name(s). Note that specifying a host name does NOT create an address record for that host; the application is responsible for ensuring that the appropriate address record exists, or creating it via DNSServiceRegisterRecord(). port: The port, in host (not network) byte order, on which the service accepts connections. Pass 0 for a "placeholder" service (i.e. a service that will not be discovered by browsing, but will cause a name conflict if another client tries to register that same name). Most clients will not use placeholder services. txtRecord: The TXT record rdata. If not None, txtRecord must be either a TXTRecord instance or a string containing a properly formatted DNS TXT record, i.e. ... callBack: The function to be called when the registration completes or asynchronously fails. Its signature should be callBack(sdRef, flags, errorCode, name, regtype, domain). The client MAY pass None for the callback, in which case the client will NOT be notified of the default values picked on its behalf, and the client will NOT be notified of any asynchronous errors (e.g. out of memory errors, etc.) that may prevent the registration of the service. The client may NOT pass the flag kDNSServiceFlagsNoAutoRename if the callback is None. The client may still deregister the service at any time by closing the returned DNSServiceRef. return value: A DNSServiceRef instance. The registration will remain active indefinitely until the client terminates it by closing the DNSServiceRef. Callback Parameters: sdRef: The DNSServiceRef returned by DNSServiceRegister(). flags: Currently unused, reserved for future use. errorCode: Will be kDNSServiceErr_NoError on success, otherwise will indicate the failure that occurred (including name conflicts, if the kDNSServiceFlagsNoAutoRename flag was used when registering). Other parameters are undefined if an error occurred. name: The service name registered. (If the application did not specify a name in DNSServiceRegister(), this indicates what name was automatically chosen.) regtype: The type of service registered, as it was passed to the callout. domain: The domain on which the service was registered. (If the application did not specify a domain in DNSServiceRegister(), this indicates the default domain on which the service was registered.) """ _NO_DEFAULT.check(regtype) _NO_DEFAULT.check(port) port = socket.htons(port) # From here on txtRecord has to be a bytes type, so convert what # we have: if type(txtRecord) == TXTRecord: txtRecord = str(txtRecord).encode("utf-8") elif type(txtRecord) == str: txtRecord = txtRecord.encode("utf-8") else: raise TypeError("txtRecord is unhandlable type: {type}".format(type=type(txtRecord))) if not txtRecord: txtLen, txtRecord = 1, "\0" else: txtLen, txtRecord = _string_to_length_and_void_p(txtRecord) @_DNSServiceRegisterReply def _callback(sdRef, flags, errorCode, name, regtype, domain, context): if callBack is not None: callBack(sdRef, flags, errorCode, name.decode(), regtype.decode(), domain.decode()) _global_lock.acquire() try: sdRef = _DNSServiceRegister( flags, interfaceIndex, name, regtype, domain, host, port, txtLen, txtRecord, _callback, None ) finally: _global_lock.release() sdRef._add_callback(_callback) return sdRef def DNSServiceAddRecord(sdRef, flags=0, rrtype=_NO_DEFAULT, rdata=_NO_DEFAULT, ttl=0): """ Add a record to a registered service. The name of the record will be the same as the registered service's name. The record can later be updated or deregistered by passing the DNSRecordRef returned by this function to DNSServiceUpdateRecord() or DNSServiceRemoveRecord(). Note that DNSServiceAddRecord/UpdateRecord/RemoveRecord are NOT thread-safe with respect to a single DNSServiceRef. If you plan to have multiple threads in your program simultaneously add, update, or remove records from the same DNSServiceRef, then it's the caller's responsibility to use a lock or take similar appropriate precautions to serialize those calls. sdRef: A DNSServiceRef returned by DNSServiceRegister(). flags: Currently ignored, reserved for future use. rrtype: The type of the record (e.g. kDNSServiceType_TXT, kDNSServiceType_SRV, etc.). rdata: A string containing the raw rdata to be contained in the added resource record. ttl: The time to live of the resource record, in seconds. Pass 0 to use a default value. return value: A DNSRecordRef instance, which may be passed to DNSServiceUpdateRecord() or DNSServiceRemoveRecord(). If sdRef is closed, the DNSRecordRef is also invalidated and may not be used further. """ _NO_DEFAULT.check(rrtype) _NO_DEFAULT.check(rdata) rdlen, rdata = _string_to_length_and_void_p(rdata) _global_lock.acquire() try: RecordRef = _DNSServiceAddRecord(sdRef, flags, rrtype, rdlen, rdata, ttl) finally: _global_lock.release() sdRef._add_record_ref(RecordRef) return RecordRef def DNSServiceUpdateRecord(sdRef, RecordRef=None, flags=0, rdata=_NO_DEFAULT, ttl=0): """ Update a registered resource record. The record must either be: - The primary txt record of a service registered via DNSServiceRegister(), or - A record added to a registered service via DNSServiceAddRecord(), or - An individual record registered by DNSServiceRegisterRecord() sdRef: A DNSServiceRef returned by DNSServiceRegister() or DNSServiceCreateConnection(). RecordRef: A DNSRecordRef returned by DNSServiceAddRecord(), or None to update the service's primary txt record. flags: Currently ignored, reserved for future use. rdata: A string containing the new rdata to be contained in the updated resource record. ttl: The time to live of the updated resource record, in seconds. """ _NO_DEFAULT.check(rdata) rdlen, rdata = _string_to_length_and_void_p(rdata) _global_lock.acquire() try: _DNSServiceUpdateRecord(sdRef, RecordRef, flags, rdlen, rdata, ttl) finally: _global_lock.release() def DNSServiceRemoveRecord(sdRef, RecordRef, flags=0): """ Remove a record previously added to a service record set via DNSServiceAddRecord(), or deregister a record registered individually via DNSServiceRegisterRecord(). sdRef: A DNSServiceRef returned by DNSServiceRegister() (if the record being removed was registered via DNSServiceAddRecord()) or by DNSServiceCreateConnection() (if the record being removed was registered via DNSServiceRegisterRecord()). recordRef: A DNSRecordRef returned by DNSServiceAddRecord() or DNSServiceRegisterRecord(). flags: Currently ignored, reserved for future use. """ _global_lock.acquire() try: _DNSServiceRemoveRecord(sdRef, RecordRef, flags) finally: _global_lock.release() RecordRef._invalidate() def DNSServiceBrowse( flags=0, interfaceIndex=kDNSServiceInterfaceIndexAny, regtype=_NO_DEFAULT, domain=None, callBack=None ): """ Browse for instances of a service. flags: Currently ignored, reserved for future use. interfaceIndex: If non-zero, specifies the interface on which to browse for services. Most applications will pass kDNSServiceInterfaceIndexAny (0) to browse on all available interfaces. regtype: The service type being browsed for followed by the protocol, separated by a dot (e.g. "_ftp._tcp"). The transport protocol must be "_tcp" or "_udp". domain: If not None, specifies the domain on which to browse for services. Most applications will not specify a domain, instead browsing on the default domain(s). callBack: The function to be called when an instance of the service being browsed for is found, or if the call asynchronously fails. Its signature should be callBack(sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain). return value: A DNSServiceRef instance. The browse operation will run indefinitely until the client terminates it by closing the DNSServiceRef. Callback Parameters: sdRef: The DNSServiceRef returned by DNSServiceBrowse(). flags: Possible values are kDNSServiceFlagsMoreComing and kDNSServiceFlagsAdd. interfaceIndex: The interface on which the service is advertised. This index should be passed to DNSServiceResolve() when resolving the service. errorCode: Will be kDNSServiceErr_NoError (0) on success, otherwise will indicate the failure that occurred. Other parameters are undefined if an error occurred. serviceName: The discovered service name. This name should be displayed to the user and stored for subsequent use in the DNSServiceResolve() call. regtype: The service type, which is usually (but not always) the same as was passed to DNSServiceBrowse(). One case where the discovered service type may not be the same as the requested service type is when using subtypes: The client may want to browse for only those ftp servers that allow anonymous connections. The client will pass the string "_ftp._tcp,_anon" to DNSServiceBrowse(), but the type of the service that's discovered is simply "_ftp._tcp". The regtype for each discovered service instance should be stored along with the name, so that it can be passed to DNSServiceResolve() when the service is later resolved. replyDomain: The domain of the discovered service instance. This may or may not be the same as the domain that was passed to DNSServiceBrowse(). The domain for each discovered service instance should be stored along with the name, so that it can be passed to DNSServiceResolve() when the service is later resolved. """ _NO_DEFAULT.check(regtype) @_DNSServiceBrowseReply def _callback(sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain, context): if callBack is not None: callBack( sdRef, flags, interfaceIndex, errorCode, serviceName.decode(), regtype.decode(), replyDomain.decode() ) _global_lock.acquire() try: sdRef = _DNSServiceBrowse(flags, interfaceIndex, regtype, domain, _callback, None) finally: _global_lock.release() sdRef._add_callback(_callback) return sdRef def DNSServiceResolve( flags=0, interfaceIndex=_NO_DEFAULT, name=_NO_DEFAULT, regtype=_NO_DEFAULT, domain=_NO_DEFAULT, callBack=None ): """ Resolve a service name discovered via DNSServiceBrowse() to a target host name, port number, and txt record. Note: Applications should NOT use DNSServiceResolve() solely for txt record monitoring; use DNSServiceQueryRecord() instead, as it is more efficient for this task. Note: When the desired results have been returned, the client MUST terminate the resolve by closing the returned DNSServiceRef. Note: DNSServiceResolve() behaves correctly for typical services that have a single SRV record and a single TXT record. To resolve non-standard services with multiple SRV or TXT records, DNSServiceQueryRecord() should be used. flags: Currently ignored, reserved for future use. interfaceIndex: The interface on which to resolve the service. If this resolve call is as a result of a currently active DNSServiceBrowse() operation, then the interfaceIndex should be the index reported in the browse callback. If this resolve call is using information previously saved (e.g. in a preference file) for later use, then use kDNSServiceInterfaceIndexAny (0), because the desired service may now be reachable via a different physical interface. name: The name of the service instance to be resolved, as reported to the DNSServiceBrowse() callback. regtype: The type of the service instance to be resolved, as reported to the DNSServiceBrowse() callback. domain: The domain of the service instance to be resolved, as reported to the DNSServiceBrowse() callback. callBack: The function to be called when a result is found, or if the call asynchronously fails. Its signature should be callBack(sdRef, flags, interfaceIndex, errorCode, fullname, hosttarget, port, txtRecord). return value: A DNSServiceRef instance. The resolve operation will run indefinitely until the client terminates it by closing the DNSServiceRef. Callback Parameters: sdRef: The DNSServiceRef returned by DNSServiceResolve(). flags: Currently unused, reserved for future use. interfaceIndex: The interface on which the service was resolved. errorCode: Will be kDNSServiceErr_NoError (0) on success, otherwise will indicate the failure that occurred. Other parameters are undefined if an error occurred. fullname: The full service domain name, in the form ... hosttarget: The target hostname of the machine providing the service. port: The port, in host (not network) byte order, on which connections are accepted for this service. txtRecord: A string containing the service's primary txt record, in standard txt record format. """ _NO_DEFAULT.check(interfaceIndex) _NO_DEFAULT.check(name) _NO_DEFAULT.check(regtype) _NO_DEFAULT.check(domain) @_DNSServiceResolveReply def _callback(sdRef, flags, interfaceIndex, errorCode, fullname, hosttarget, port, txtLen, txtRecord, context): if callBack is not None: port = socket.ntohs(port) txtRecord = _length_and_void_p_to_string(txtLen, txtRecord) callBack(sdRef, flags, interfaceIndex, errorCode, fullname.decode(), hosttarget.decode(), port, txtRecord) _global_lock.acquire() try: sdRef = _DNSServiceResolve(flags, interfaceIndex, name, regtype, domain, _callback, None) finally: _global_lock.release() sdRef._add_callback(_callback) return sdRef def DNSServiceCreateConnection(): """ Create a connection to the daemon allowing efficient registration of multiple individual records. return value: A DNSServiceRef instance. Closing it severs the connection and deregisters all records registered on this connection. """ _global_lock.acquire() try: sdRef = _DNSServiceCreateConnection() finally: _global_lock.release() return sdRef def DNSServiceRegisterRecord( sdRef, flags, interfaceIndex=kDNSServiceInterfaceIndexAny, fullname=_NO_DEFAULT, rrtype=_NO_DEFAULT, rrclass=kDNSServiceClass_IN, rdata=_NO_DEFAULT, ttl=0, callBack=None, ): """ Register an individual resource record on a connected DNSServiceRef. Note that name conflicts occurring for records registered via this call must be handled by the client in the callback. sdRef: A DNSServiceRef returned by DNSServiceCreateConnection(). flags: Possible values are kDNSServiceFlagsShared or kDNSServiceFlagsUnique. interfaceIndex: If non-zero, specifies the interface on which to register the record. Passing kDNSServiceInterfaceIndexAny (0) causes the record to be registered on all interfaces. fullname: The full domain name of the resource record. rrtype: The numerical type of the resource record (e.g. kDNSServiceType_PTR, kDNSServiceType_SRV, etc.). rrclass: The class of the resource record (usually kDNSServiceClass_IN). rdata: A string containing the raw rdata, as it is to appear in the DNS record. ttl: The time to live of the resource record, in seconds. Pass 0 to use a default value. callBack: The function to be called when a result is found, or if the call asynchronously fails (e.g. because of a name conflict). Its signature should be callBack(sdRef, RecordRef, flags, errorCode). return value: A DNSRecordRef instance, which may be passed to DNSServiceUpdateRecord() or DNSServiceRemoveRecord(). (To deregister ALL records registered on a single connected DNSServiceRef and deallocate each of their corresponding DNSRecordRefs, close the DNSServiceRef.) Callback Parameters: sdRef: The connected DNSServiceRef returned by DNSServiceCreateConnection(). RecordRef: The DNSRecordRef returned by DNSServiceRegisterRecord(). flags: Currently unused, reserved for future use. errorCode: Will be kDNSServiceErr_NoError on success, otherwise will indicate the failure that occurred (including name conflicts). Other parameters are undefined if an error occurred. """ _NO_DEFAULT.check(fullname) _NO_DEFAULT.check(rrtype) _NO_DEFAULT.check(rdata) rdlen, rdata = _string_to_length_and_void_p(rdata) @_DNSServiceRegisterRecordReply def _callback(sdRef, RecordRef, flags, errorCode, context): if callBack is not None: callBack(sdRef, RecordRef, flags, errorCode) _global_lock.acquire() try: RecordRef = _DNSServiceRegisterRecord( sdRef, flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, rdata, ttl, _callback, None ) finally: _global_lock.release() sdRef._add_callback(_callback) sdRef._add_record_ref(RecordRef) return RecordRef def DNSServiceQueryRecord( flags=0, interfaceIndex=kDNSServiceInterfaceIndexAny, fullname=_NO_DEFAULT, rrtype=_NO_DEFAULT, rrclass=kDNSServiceClass_IN, callBack=None, ): """ Query for an arbitrary DNS record. flags: Pass kDNSServiceFlagsLongLivedQuery to create a "long-lived" unicast query in a non-local domain. Without setting this flag, unicast queries will be one-shot; that is, only answers available at the time of the call will be returned. By setting this flag, answers (including Add and Remove events) that become available after the initial call is made will generate callbacks. This flag has no effect on link-local multicast queries. interfaceIndex: If non-zero, specifies the interface on which to issue the query. Passing kDNSServiceInterfaceIndexAny (0) causes the name to be queried for on all interfaces. fullname: The full domain name of the resource record to be queried for. rrtype: The numerical type of the resource record to be queried for (e.g. kDNSServiceType_PTR, kDNSServiceType_SRV, etc.). rrclass: The class of the resource record (usually kDNSServiceClass_IN). callBack: The function to be called when a result is found, or if the call asynchronously fails. Its signature should be callBack(sdRef, flags, interfaceIndex, errorCode, fullname, rrtype, rrclass, rdata, ttl). return value: A DNSServiceRef instance. The query operation will run indefinitely until the client terminates it by closing the DNSServiceRef. Callback Parameters: sdRef: The DNSServiceRef returned by DNSServiceQueryRecord(). flags: Possible values are kDNSServiceFlagsMoreComing and kDNSServiceFlagsAdd. The Add flag is NOT set for PTR records with a ttl of 0, i.e. "Remove" events. interfaceIndex: The interface on which the query was resolved. errorCode: Will be kDNSServiceErr_NoError on success, otherwise will indicate the failure that occurred. Other parameters are undefined if an error occurred. fullname: The resource record's full domain name. rrtype: The resource record's type (e.g. kDNSServiceType_PTR, kDNSServiceType_SRV, etc.). rrclass: The class of the resource record (usually kDNSServiceClass_IN). rdata: A string containing the raw rdata of the resource record. ttl: The resource record's time to live, in seconds. """ _NO_DEFAULT.check(fullname) _NO_DEFAULT.check(rrtype) @_DNSServiceQueryRecordReply def _callback(sdRef, flags, interfaceIndex, errorCode, fullname, rrtype, rrclass, rdlen, rdata, ttl, context): if callBack is not None: rdata = _length_and_void_p_to_string(rdlen, rdata) callBack(sdRef, flags, interfaceIndex, errorCode, fullname.decode(), rrtype, rrclass, rdata, ttl) _global_lock.acquire() try: sdRef = _DNSServiceQueryRecord(flags, interfaceIndex, fullname, rrtype, rrclass, _callback, None) finally: _global_lock.release() sdRef._add_callback(_callback) return sdRef def DNSServiceReconfirmRecord( flags=0, interfaceIndex=kDNSServiceInterfaceIndexAny, fullname=_NO_DEFAULT, rrtype=_NO_DEFAULT, rrclass=kDNSServiceClass_IN, rdata=_NO_DEFAULT, ): """ Instruct the daemon to verify the validity of a resource record that appears to be out of date (e.g. because tcp connection to a service's target failed). Causes the record to be flushed from the daemon's cache (as well as all other daemons' caches on the network) if the record is determined to be invalid. flags: Currently unused, reserved for future use. interfaceIndex: If non-zero, specifies the interface of the record in question. Passing kDNSServiceInterfaceIndexAny (0) causes all instances of this record to be reconfirmed. fullname: The resource record's full domain name. rrtype: The resource record's type (e.g. kDNSServiceType_PTR, kDNSServiceType_SRV, etc.). rrclass: The class of the resource record (usually kDNSServiceClass_IN). rdata: A string containing the raw rdata of the resource record. """ _NO_DEFAULT.check(fullname) _NO_DEFAULT.check(rrtype) _NO_DEFAULT.check(rdata) rdlen, rdata = _string_to_length_and_void_p(rdata) _global_lock.acquire() try: _DNSServiceReconfirmRecord(flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, rdata) finally: _global_lock.release() def DNSServiceConstructFullName(service=None, regtype=_NO_DEFAULT, domain=_NO_DEFAULT): """ Concatenate a three-part domain name (as returned by a callback function) into a properly-escaped full domain name. Note that callback functions already escape strings where necessary. service: The service name; any dots or backslashes must NOT be escaped. May be None (to construct a PTR record name, e.g. "_ftp._tcp.apple.com."). regtype: The service type followed by the protocol, separated by a dot (e.g. "_ftp._tcp"). domain: The domain name, e.g. "apple.com.". Literal dots or backslashes, if any, must be escaped, e.g. "1st\. Floor.apple.com." return value: The resulting full domain name. """ _NO_DEFAULT.check(regtype) _NO_DEFAULT.check(domain) _global_lock.acquire() try: fullName = _DNSServiceConstructFullName(service, regtype, domain) finally: _global_lock.release() return fullName.value.decode("utf-8") ################################################################################ # # TXTRecord class # ################################################################################ class TXTRecord(object): """ A mapping representing a DNS TXT record. The TXT record's name=value entries are stored as key/value pairs in the mapping. Although keys can be accessed in a case-insensitive fashion (meaning txt['foo'] and txt['FoO'] refer to the same value), key case is preserved in the wire representation of the record (so txt['FoO'] = 'bar' will generate a FoO=bar entry in the TXT record). Key order is also preserved, so keys appear in the wire format in the order in which they were created. Note that in addition to being valid as a txtRecord parameter to DNSServiceRegister(), a TXTRecord instance can be used in place of a resource record data string (i.e. rdata parameter) with any function that accepts one. """ def __init__(self, items={}, strict=True): """ Create a new TXTRecord instance, initializing it with the contents of items. If strict is true, then strict conformance to the DNS TXT record format will be enforced, and attempts to add a name containing invalid characters or a name/value pair whose wire representation is longer than 255 bytes will raise a ValueError exception. """ self.strict = strict self._names = [] self._items = {} for name, value in items.items(): self[name] = value def __contains__(self, name): "Return True if name is a key in the record, False otherwise" return name.lower() in self._items def __iter__(self): "Return an iterator over name/value pairs" for name in self._names: yield self._items[name] def __len__(self): "Return the number of name/value pairs" return len(self._names) def __bool__(self): "Return False if the record is empty, True otherwise" return bool(self._items) def __str__(self): """ Return the wire representation of the TXT record as a string. If self.strict is false, any name/value pair whose wire length if greater than 255 bytes will be truncated to 255 bytes. If the record is empty, '\\0' is returned. """ if not self: return "\0" parts = [] for name, value in self: if value is None: item = name else: item = "%s=%s" % (name, value) if (not self.strict) and (len(item) > 255): item = item[:255] parts.append(chr(len(item))) parts.append(item) return "".join(parts) def __getitem__(self, name): """ Return the value associated with name. The value is either None (meaning name has no associated value) or an str instance (which may be of length 0). Raises KeyError if name is not a key. """ return self._items[name.lower()][1] # Require one or more printable ASCII characters (0x20-0x7E), # excluding '=' (0x3D) _valid_name_re = re.compile(r"^[ -<>-~]+$") def __setitem__(self, name, value): """ Add a name/value pair to the record. If value is None, then name will have no associated value. If value is a unicode instance, it will be encoded as a UTF-8 string. Otherwise, value will be converted to an str instance. """ stored_name = name name = name.lower() length = len(name) if value is not None: value = str(value) length += 1 + len(value) if self.strict and (length > 255): raise ValueError("name=value string must be 255 bytes or less") if name not in self._items: if self.strict and (self._valid_name_re.match(stored_name) is None): raise ValueError("invalid name: '%s'" % stored_name) self._names.append(name) self._items[name] = (stored_name, value) def __delitem__(self, name): """ Remove name and its corresponding value from the record. Raises KeyError if name is not a key. """ name = name.lower() del self._items[name] self._names.remove(name) @classmethod def parse(cls, data, strict=False): """ Given a string data containing the wire representation of a DNS TXT record, parse it and return a TXTRecord instance. The strict parameter is passed to the TXTRecord constructor. """ txt = cls(strict=strict) while data: length = ord(data[0]) item = data[1 : length + 1].split("=", 1) # Add the item only if the name is non-empty and there are # no existing items with the same name if item[0] and (item[0] not in txt): if len(item) == 1: txt[item[0]] = None else: txt[item[0]] = item[1] data = data[length + 1 :] return txt sabnzbd-develop/sabnzbd/utils/servertests.py0000600000175000017500000001240613642116632017466 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.utils.servertests - Debugging server connections. Currently only NNTP server tests are done. """ import socket import sys import select from sabnzbd.newswrapper import NewsWrapper from sabnzbd.downloader import Server, clues_login, clues_too_many, nntp_to_msg from sabnzbd.config import get_servers from sabnzbd.misc import int_conv def test_nntp_server_dict(kwargs): # Grab the host/port/user/pass/connections/ssl host = kwargs.get("host", "").strip() if not host: return False, T("The hostname is not set.") username = kwargs.get("username", "").strip() password = kwargs.get("password", "").strip() server = kwargs.get("server", "").strip() connections = int_conv(kwargs.get("connections", 0)) if not connections: return False, T("There are no connections set. Please set at least one connection.") ssl = int_conv(kwargs.get("ssl", 0)) ssl_verify = int_conv(kwargs.get("ssl_verify", 1)) ssl_ciphers = kwargs.get("ssl_ciphers") port = int_conv(kwargs.get("port", 0)) if not port: if ssl: port = 563 else: port = 119 return test_nntp_server( host, port, server, username=username, password=password, ssl=ssl, ssl_verify=ssl_verify, ssl_ciphers=ssl_ciphers, ) def test_nntp_server(host, port, server=None, username=None, password=None, ssl=None, ssl_verify=1, ssl_ciphers=None): """ Will connect (blocking) to the nttp server and report back any errors """ timeout = 4.0 if "*" in password and not password.strip("*"): # If the password is masked, try retrieving it from the config if not server: servers = get_servers() got_pass = False for server in servers: if host in servers[server].host(): srv = servers[server] password = srv.password() got_pass = True else: srv = get_servers().get(server) if srv: password = srv.password() got_pass = True if not got_pass: return False, T("Password masked in ******, please re-enter") try: s = Server(-1, "", host, port, timeout, 0, 0, ssl, ssl_verify, ssl_ciphers, False, username, password) except: return False, T("Invalid server details") try: nw = NewsWrapper(s, -1, block=True) nw.init_connect(None) while not nw.connected: nw.clear_data() nw.recv_chunk(block=True) # Handle 1/n-1 splitting to prevent Rizzo/Duong-Beast read_sockets, _, _ = select.select([nw.nntp.sock], [], [], 0.1) if read_sockets: nw.recv_chunk(block=True) nw.finish_connect(nw.status_code) except socket.timeout: if port != 119 and not ssl: return False, T("Timed out: Try enabling SSL or connecting on a different port.") else: return False, T("Timed out") except socket.error as e: # Trying SSL on non-SSL port? if "unknown protocol" in str(e).lower(): return False, T("Unknown SSL protocol: Try disabling SSL or connecting on a different port.") return False, str(e) except TypeError: return False, T("Invalid server address.") except IndexError: # No data was received in recv_chunk() call return False, T("Server quit during login sequence.") except: return False, str(sys.exc_info()[1]) if not username or not password: nw.nntp.sock.sendall(b"ARTICLE \r\n") try: nw.clear_data() nw.recv_chunk(block=True) except: # Some internal error, not always safe to close connection return False, str(sys.exc_info()[1]) # Close the connection nw.terminate(quit=True) if nw.status_code == 480: return False, T("Server requires username and password.") elif nw.status_code == 100 or str(nw.status_code).startswith(("2", "4")): return True, T("Connection Successful!") elif nw.status_code == 502 or clues_login(nntp_to_msg(nw.data)): return False, T("Authentication failed, check username/password.") elif clues_too_many(nntp_to_msg(nw.data)): return False, T("Too many connections, please pause downloading or try again later") else: return False, T("Could not determine connection result (%s)") % nntp_to_msg(nw.data) sabnzbd-develop/sabnzbd/utils/pathbrowser.py0000600000175000017500000001044713642116632017440 0ustar jpjp# ------------------------------------------------------------------------------------------------ # This file is an excerpt from Sick Beard's browser.py # Modified and improved to fit SABnzbd. # # Author: Nic Wolfe # URL: http://code.google.com/p/sickbeard/ # # Sick Beard is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Sick Beard is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Sick Beard. If not, see . import os import sabnzbd if os.name == "nt": import win32api import win32con import win32file from ctypes import windll MASK = win32con.FILE_ATTRIBUTE_DIRECTORY | win32con.FILE_ATTRIBUTE_HIDDEN TMASK = win32con.FILE_ATTRIBUTE_DIRECTORY DRIVES = (2, 3, 4) NT = True else: NT = False _JUNKFOLDERS = ( "boot", "bootmgr", "cache", "msocache", "recovery", "$recycle.bin", "recycler", "system volume information", "temporary internet files", "perflogs", # windows specific ".fseventd", ".spotlight", ".trashes", ".vol", "cachedmessages", "caches", "trash", # osx specific ) def get_win_drives(): """ Return list of detected drives, adapted from: http://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python/827490 """ assert NT drives = [] bitmask = windll.kernel32.GetLogicalDrives() for letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": if (bitmask & 1) and win32file.GetDriveType("%s:\\" % letter) in DRIVES: drives.append(letter) bitmask >>= 1 return drives def folders_at_path(path, include_parent=False, show_hidden=False): """ Returns a list of dictionaries with the folders contained at the given path Give the empty string as the path to list the contents of the root path under Unix this means "/", on Windows this will be a list of drive letters) """ if path == "": if NT: entries = [{"name": letter + ":\\", "path": letter + ":\\"} for letter in get_win_drives()] entries.insert(0, {"current_path": "Root"}) return entries else: path = "/" # Walk up the tree until we find a valid path path = sabnzbd.filesystem.real_path(sabnzbd.DIR_HOME, path) while path and not os.path.isdir(path): if path == os.path.dirname(path): return folders_at_path("", include_parent) else: path = os.path.dirname(path) # Fix up the path and find the parent path = os.path.abspath(os.path.normpath(path)) parent_path = os.path.dirname(path) # If we're at the root then the next step is the meta-node showing our drive letters if path == parent_path and NT: parent_path = "" # List all files and folders file_list = [] for filename in os.listdir(path): fpath = os.path.join(path, filename) try: if NT: # Remove hidden folders list_folder = (win32api.GetFileAttributes(fpath) & MASK) == TMASK elif not show_hidden: list_folder = not filename.startswith(".") else: list_folder = True except: list_folder = False # Remove junk and sort results if list_folder and os.path.isdir(fpath) and filename.lower() not in _JUNKFOLDERS: file_list.append( {"name": sabnzbd.filesystem.clip_path(filename), "path": sabnzbd.filesystem.clip_path(fpath)} ) # Sort results file_list = sorted(file_list, key=lambda x: os.path.basename(x["name"]).lower()) # Add current path file_list.insert(0, {"current_path": sabnzbd.filesystem.clip_path(path)}) if include_parent and parent_path != path: file_list.insert(1, {"name": "..", "path": sabnzbd.filesystem.clip_path(parent_path)}) return file_list sabnzbd-develop/sabnzbd/utils/checkdir.py0000600000175000017500000000724013642116632016651 0ustar jpjp#!/usr/bin/env python """ Functions to check if the path filesystem uses FAT """ import sys import os debug = False def isFAT(check_dir): """ Check if "check_dir" is on FAT. FAT considered harmful (for big files) Works for Linux, Windows, MacOS NB: On Windows, full path with drive letter is needed! """ FAT = False # default: not FAT # We're dealing with OS calls, so put everything in a try/except, just in case: try: if "linux" in sys.platform: # On Linux: # df -T /home/sander/weg """ Example output of a 500GB external USB drive formatted with FAT: $ df -T /media/sander/INTENSO Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/sda1 vfat 488263616 163545248 324718368 34% /media/sander/INTENSO """ cmd = "df -T " + check_dir + " 2>&1" for thisline in os.popen(cmd).readlines(): if thisline.find("/") == 0: # Starts with /, so a real, local device fstype = thisline.split()[1] if debug: print(("File system type:", fstype)) if fstype.lower().find("fat") >= 0 and fstype.lower().find("exfat") < 0: # FAT, but not EXFAT FAT = True if debug: print("FAT found") break elif "win32" in sys.platform: import win32api if "?" in check_dir: # Remove \\?\ or \\?\UNC\ prefix from Windows path check_dir = check_dir.replace("\\\\?\\UNC\\", "\\\\", 1).replace("\\\\?\\", "", 1) try: result = win32api.GetVolumeInformation(os.path.splitdrive(check_dir)[0]) if debug: print(result) if result[4].startswith("FAT"): FAT = True except: pass elif "darwin" in sys.platform: # MacOS formerly known as OSX """ MacOS needs a two-step approach: # First: directory => device server:~ sander$ df /Volumes/CARTUNES/Tuna/ Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on /dev/disk9s1 120815744 108840000 11975744 91% 0 0 100% /Volumes/CARTUNES # Then: device => filesystem type server:~ sander$ mount | grep /dev/disk9s1 /dev/disk9s1 on /Volumes/CARTUNES (msdos, local, nodev, nosuid, noowners) """ dfcmd = "df " + check_dir for thisline in os.popen(dfcmd).readlines(): if thisline.find("/") == 0: if debug: print(thisline) # Starts with /, so a real, local device device = thisline.split()[0] mountcmd = "mount | grep " + device mountoutput = os.popen(mountcmd).readline().strip() if debug: print(mountoutput) if "msdos" in mountoutput.split("(")[1]: FAT = True break except: pass return FAT if __name__ == "__main__": if debug: print((sys.platform)) try: dir_to_check = sys.argv[1] except: print("Specify dir on the command line") sys.exit(0) if isFAT(dir_to_check): print((dir_to_check, "is on FAT")) else: print((dir_to_check, "is not on FAT")) sabnzbd-develop/sabnzbd/utils/internetspeed.py0000755000175000017500000000640013642116632017756 0ustar jpjp#!/usr/bin/env python3 """ Module to measure and report Internet speed Method: get one or more files, and measure how long it takes Reports in MB/s (so mega BYTES per seconds), not to be confused with Mbps """ import sys import time import logging SizeUrlList = [ [5, "https://sabnzbd.org/tests/internetspeed/5MB.bin"], [10, "https://sabnzbd.org/tests/internetspeed/10MB.bin"], [20, "https://sabnzbd.org/tests/internetspeed/20MB.bin"], ] def measurespeed(url): """ Download the specified url, and report back MB/s (as a float) """ logging.debug("URL is %s" % url) start = time.time() downloadedbytes = 0 # default try: if sys.version_info[0] == 2: import urllib2 # python2 req = urllib2.Request(url, headers={"User-Agent": "Mozilla/5.0"}) downloadedbytes = len(urllib2.urlopen(req, timeout=4).read()) elif sys.version_info[0] == 3: import urllib.request # python3 req = urllib.request.Request(url, data=None, headers={"User-Agent": "Mozilla/5.0 (Macintosh)"}) downloadedbytes = len(urllib.request.urlopen(req, timeout=4).read()) else: logging.error("ERROR: no python version?!") except: # No connection at all? pass duration = time.time() - start logging.debug("Downloaded bytes: %d" % downloadedbytes) if downloadedbytes == 0: return 0 logging.debug("Duration in seconds: %f" % duration) MBps = (downloadedbytes / 1000111) / duration # Bytes return MBps def BytestoBits(MBps): return 8.05 * MBps # bits def internetspeed(): """ Report Internet speed in MB/s as a float """ # Do basic test with a small download logging.debug("Basic measurement, with small download:") urlbasic = SizeUrlList[0][1] # get first URL, which is smallest download baseMBps = measurespeed(urlbasic) logging.debug("Speed in MB/s: %.2f" % baseMBps) if baseMBps == 0: # no Internet connection, or other problem return baseMBps """ Based on this first, small download, do a bigger download; the biggest download that still fits in 10 seconds Rationale: a bigger download could yield higher MB/s because the 'starting delay' is relatively less Calculation as example: If the 5MB download took 0.3 seconds, you can do a 30 times bigger download, so about 150 MB, will round to 100 MB """ # Calculate: maxtime = 8 # seconds URLtoDO = None for size, sizeurl in SizeUrlList: expectedtime = size / baseMBps if expectedtime < maxtime: # ok, this one is feasible, so keep it in mind URLtoDO = sizeurl maxMBps = baseMBps # Execute: if URLtoDO: logging.debug(URLtoDO) MBps = measurespeed(URLtoDO) logging.debug("Speed in MB/s: %.2f" % MBps) if MBps > maxMBps: maxMBps = MBps return maxMBps ############################################ ############### MAIN ####################### if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG) logging.debug("Log level is DEBUG") print("Starting speed test:") maxMBps = internetspeed() print("Speed in MB/s: %.2f" % maxMBps) print("Speed in Mbps: %.2f" % BytestoBits(maxMBps)) sabnzbd-develop/sabnzbd/utils/sleepless.py0000600000175000017500000000363313642116632017076 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2009-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.utils.sleepless - Keep macOS (OSX) awake by setting power assertions """ import objc from Foundation import NSBundle # https://developer.apple.com/documentation/iokit/iopowersources.h?language=objc IOKit = NSBundle.bundleWithIdentifier_("com.apple.framework.IOKit") functions = [ ("IOPMAssertionCreateWithName", b"i@i@o^i"), ("IOPMAssertionRelease", b"vi"), ] objc.loadBundleFunctions(IOKit, globals(), functions) # Keep track of the assertion ID at the module-level assertion_id = None def keep_awake(reason): """ Tell OS to stay awake. One argument: text to send to OS. Stays in effect until next 'allow_sleep' call. Multiple calls allowed. """ global assertion_id kIOPMAssertionTypeNoIdleSleep = "PreventUserIdleSystemSleep" kIOPMAssertionLevelOn = 255 errcode, assertion_id = IOPMAssertionCreateWithName( kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, reason, None ) return errcode == 0 def allow_sleep(): """ Allow OS to go to sleep """ global assertion_id if assertion_id: IOPMAssertionRelease(assertion_id) assertion_id = None sabnzbd-develop/sabnzbd/utils/kronos.py0000600000175000017500000004573113642116632016417 0ustar jpjp#!/usr/bin/python3 """Module that provides a cron-like task scheduler. This task scheduler is designed to be used from inside your own program. You can schedule Python functions to be called at specific intervals or days. It uses the standard 'sched' module for the actual task scheduling, but provides much more: * repeated tasks (at intervals, or on specific days) * error handling (exceptions in tasks don't kill the scheduler) * optional to run scheduler in its own thread or separate process * optional to run a task in its own thread or separate process If the threading module is available, you can use the various Threaded variants of the scheduler and associated tasks. If threading is not available, you could still use the forked variants. If fork is also not available, all processing is done in a single process, sequentially. There are three Scheduler classes: Scheduler ThreadedScheduler ForkedScheduler You usually add new tasks to a scheduler using the add_interval_task or add_daytime_task methods, with the appropriate processmethod argument to select sequential, threaded or forked processing. NOTE: it is impossible to add new tasks to a ForkedScheduler, after the scheduler has been started! For more control you can use one of the following Task classes and use schedule_task or schedule_task_abs: IntervalTask ThreadedIntervalTask ForkedIntervalTask SingleTask ThreadedSingleTask ForkedSingleTask WeekdayTask ThreadedWeekdayTask ForkedWeekdayTask MonthdayTask ThreadedMonthdayTask ForkedMonthdayTask Kronos is the Greek God of Time. Kronos scheduler (c) Irmen de Jong. This version has been extracted from the Turbogears source repository and slightly changed to be completely stand-alone again. Also some fixes have been made to make it work on Python 2.6 (sched module changes). The version in Turbogears is based on the original stand-alone Kronos. This is open-source software, released under the MIT Software License: http://www.opensource.org/licenses/mit-license.php """ __version__ = "2.0" __all__ = [ "DayTaskRescheduler", "ForkedIntervalTask", "ForkedMonthdayTask", "ForkedScheduler", "ForkedSingleTask", "ForkedTaskMixin", "ForkedWeekdayTask", "IntervalTask", "MonthdayTask", "Scheduler", "SingleTask", "Task", "ThreadedIntervalTask", "ThreadedMonthdayTask", "ThreadedScheduler", "ThreadedSingleTask", "ThreadedTaskMixin", "ThreadedWeekdayTask", "WeekdayTask", "add_interval_task", "add_monthday_task", "add_single_task", "add_weekday_task", "cancel", "method", ] import os import sys import sched import time import weakref import logging class method: sequential = "sequential" forked = "forked" threaded = "threaded" class Scheduler: """The Scheduler itself.""" def __init__(self): self.running = True self.sched = sched.scheduler(time.time, self.__delayfunc) def __delayfunc(self, delay): # This delay function is basically a time.sleep() that is # divided up, so that we can check the self.running flag while delaying. # there is an additional check in here to ensure that the top item of # the queue hasn't changed if delay < 10: time.sleep(delay) else: toptime = self._getqueuetoptime() endtime = time.time() + delay period = 5 stoptime = endtime - period while self.running and stoptime > time.time() and self._getqueuetoptime() == toptime: time.sleep(period) if not self.running or self._getqueuetoptime() != toptime: return now = time.time() if endtime > now: time.sleep(endtime - now) def _acquire_lock(self): pass def _release_lock(self): pass def add_interval_task(self, action, taskname, initialdelay, interval, processmethod, args, kw): """Add a new Interval Task to the schedule. A very short initialdelay or one of zero cannot be honored, you will see a slight delay before the task is first executed. This is because the scheduler needs to pick it up in its loop. """ if initialdelay < 0 or interval < 1: raise ValueError("Delay or interval must be >0") # Select the correct IntervalTask class. Not all types may be available! if processmethod == method.sequential: TaskClass = IntervalTask elif processmethod == method.threaded: TaskClass = ThreadedIntervalTask elif processmethod == method.forked: TaskClass = ForkedIntervalTask else: raise ValueError("Invalid processmethod") if not args: args = [] if not kw: kw = {} task = TaskClass(taskname, interval, action, args, kw) self.schedule_task(task, initialdelay) return task def add_single_task(self, action, taskname, initialdelay, processmethod, args, kw): """Add a new task to the scheduler that will only be executed once.""" if initialdelay < 0: raise ValueError("Delay must be >0") # Select the correct SingleTask class. Not all types may be available! if processmethod == method.sequential: TaskClass = SingleTask elif processmethod == method.threaded: TaskClass = ThreadedSingleTask elif processmethod == method.forked: TaskClass = ForkedSingleTask else: raise ValueError("Invalid processmethod") if not args: args = [] if not kw: kw = {} task = TaskClass(taskname, action, args, kw) self.schedule_task(task, initialdelay) return task def add_daytime_task(self, action, taskname, weekdays, monthdays, timeonday, processmethod, args, kw): """Add a new Day Task (Weekday or Monthday) to the schedule.""" if weekdays and monthdays: raise ValueError("You can only specify weekdays or monthdays, " "not both") if not args: args = [] if not kw: kw = {} if weekdays: # Select the correct WeekdayTask class. # Not all types may be available! if processmethod == method.sequential: TaskClass = WeekdayTask elif processmethod == method.threaded: TaskClass = ThreadedWeekdayTask elif processmethod == method.forked: TaskClass = ForkedWeekdayTask else: raise ValueError("Invalid processmethod") task = TaskClass(taskname, weekdays, timeonday, action, args, kw) if monthdays: # Select the correct MonthdayTask class. # Not all types may be available! if processmethod == method.sequential: TaskClass = MonthdayTask elif processmethod == method.threaded: TaskClass = ThreadedMonthdayTask elif processmethod == method.forked: TaskClass = ForkedMonthdayTask else: raise ValueError("Invalid processmethod") task = TaskClass(taskname, monthdays, timeonday, action, args, kw) firsttime = task.get_schedule_time(True) self.schedule_task_abs(task, firsttime) return task def schedule_task(self, task, delay): """Add a new task to the scheduler with the given delay (seconds). Low-level method for internal use. """ if self.running: # lock the sched queue, if needed self._acquire_lock() try: task.event = self.sched.enter(delay, 0, task, (weakref.ref(self),)) finally: self._release_lock() else: task.event = self.sched.enter(delay, 0, task, (weakref.ref(self),)) def schedule_task_abs(self, task, abstime): """Add a new task to the scheduler for the given absolute time value. Low-level method for internal use. """ if self.running: # lock the sched queue, if needed self._acquire_lock() try: task.event = self.sched.enterabs(abstime, 0, task, (weakref.ref(self),)) finally: self._release_lock() else: task.event = self.sched.enterabs(abstime, 0, task, (weakref.ref(self),)) def start(self): """Start the scheduler.""" self._run() def stop(self): """Remove all pending tasks and stop the Scheduler.""" self.running = False self._clearschedqueue() def cancel(self, task): """Cancel given scheduled task.""" self.sched.cancel(task.event) if sys.version_info >= (2, 6): # code for sched module of python 2.6+ def _getqueuetoptime(self): try: return self.sched._queue[0].time except IndexError: return 0.0 def _clearschedqueue(self): self.sched._queue[:] = [] else: # code for sched module of python 2.5 and older def _getqueuetoptime(self): try: return self.sched.queue[0][0] except IndexError: return 0.0 def _clearschedqueue(self): self.sched.queue[:] = [] def _run(self): # Low-level run method to do the actual scheduling loop. while self.running: try: self.sched.run() except Exception as x: logging.error("ERROR DURING SCHEDULER EXECUTION %s" % str(x), exc_info=True) # queue is empty; sleep a short while before checking again if self.running: time.sleep(5) class Task: """Abstract base class of all scheduler tasks""" def __init__(self, name, action, args, kw): """This is an abstract class!""" self.name = name self.action = action self.args = args self.kw = kw def __call__(self, schedulerref): """Execute the task action in the scheduler's thread.""" try: self.execute() except Exception as x: self.handle_exception(x) self.reschedule(schedulerref()) def reschedule(self, scheduler): """This method should be defined in one of the sub classes!""" raise NotImplementedError("You're using the abstract base class 'Task'," " use a concrete class instead") def execute(self): """Execute the actual task.""" self.action(*self.args, **self.kw) def handle_exception(self, exc): """Handle any exception that occured during task execution.""" logging.error("ERROR DURING SCHEDULER EXECUTION %s" % str(exc), exc_info=True) class SingleTask(Task): """A task that only runs once.""" def reschedule(self, scheduler): pass class IntervalTask(Task): """A repeated task that occurs at certain intervals (in seconds).""" def __init__(self, name, interval, action, args=None, kw=None): Task.__init__(self, name, action, args, kw) self.interval = interval def reschedule(self, scheduler): """Reschedule this task according to its interval (in seconds).""" scheduler.schedule_task(self, self.interval) class DayTaskRescheduler: """A mixin class that contains the reschedule logic for the DayTasks.""" def __init__(self, timeonday): self.timeonday = timeonday def get_schedule_time(self, today): """Calculate the time value at which this task is to be scheduled.""" now = list(time.localtime()) if today: # schedule for today. let's see if that is still possible if (now[3], now[4]) >= self.timeonday: # too bad, it will be tomorrow now[2] += 1 else: # tomorrow now[2] += 1 # set new time on day (hour,minute) now[3], now[4] = self.timeonday # seconds now[5] = 0 return time.mktime(tuple(now)) def reschedule(self, scheduler): """Reschedule this task according to the daytime for the task. The task is scheduled for tomorrow, for the given daytime. """ # (The execute method in the concrete Task classes will check # if the current day is a day on which the task must run). abstime = self.get_schedule_time(False) scheduler.schedule_task_abs(self, abstime) class WeekdayTask(DayTaskRescheduler, Task): """A task that is called at specific days in a week (1-7), at a fixed time on the day. """ def __init__(self, name, weekdays, timeonday, action, args=None, kw=None): if type(timeonday) not in (list, tuple) or len(timeonday) != 2: raise TypeError("timeonday must be a 2-tuple (hour,minute)") if type(weekdays) not in (list, tuple): raise TypeError("weekdays must be a sequence of weekday numbers " "1-7 (1 is Monday)") DayTaskRescheduler.__init__(self, timeonday) Task.__init__(self, name, action, args, kw) self.days = weekdays def execute(self): # This is called every day, at the correct time. We only need to # check if we should run this task today (this day of the week). weekday = time.localtime().tm_wday + 1 if weekday in self.days: self.action(*self.args, **self.kw) class MonthdayTask(DayTaskRescheduler, Task): """A task that is called at specific days in a month (1-31), at a fixed time on the day. """ def __init__(self, name, monthdays, timeonday, action, args=None, kw=None): if type(timeonday) not in (list, tuple) or len(timeonday) != 2: raise TypeError("timeonday must be a 2-tuple (hour,minute)") if type(monthdays) not in (list, tuple): raise TypeError("monthdays must be a sequence of monthdays numbers " "1-31") DayTaskRescheduler.__init__(self, timeonday) Task.__init__(self, name, action, args, kw) self.days = monthdays def execute(self): # This is called every day, at the correct time. We only need to # check if we should run this task today (this day of the month). if time.localtime().tm_mday in self.days: self.action(*self.args, **self.kw) try: import threading class ThreadedScheduler(Scheduler): """A Scheduler that runs in its own thread.""" def __init__(self): Scheduler.__init__(self) # we require a lock around the task queue self._lock = threading.Lock() def start(self): """Splice off a thread in which the scheduler will run.""" self.thread = threading.Thread(target=self._run) self.thread.setDaemon(True) self.thread.start() def stop(self): """Stop the scheduler and wait for the thread to finish.""" Scheduler.stop(self) try: self.thread.join() except AttributeError: pass def _acquire_lock(self): """Lock the thread's task queue.""" self._lock.acquire() def _release_lock(self): """Release the lock on th ethread's task queue.""" self._lock.release() class ThreadedTaskMixin: """A mixin class to make a Task execute in a separate thread.""" def __call__(self, schedulerref): """Execute the task action in its own thread.""" threading.Thread(target=self.threadedcall).start() self.reschedule(schedulerref()) def threadedcall(self): # This method is run within its own thread, so we have to # do the execute() call and exception handling here. try: self.execute() except Exception as x: self.handle_exception(x) class ThreadedIntervalTask(ThreadedTaskMixin, IntervalTask): """Interval Task that executes in its own thread.""" pass class ThreadedSingleTask(ThreadedTaskMixin, SingleTask): """Single Task that executes in its own thread.""" pass class ThreadedWeekdayTask(ThreadedTaskMixin, WeekdayTask): """Weekday Task that executes in its own thread.""" pass class ThreadedMonthdayTask(ThreadedTaskMixin, MonthdayTask): """Monthday Task that executes in its own thread.""" pass except ImportError: # threading is not available pass if hasattr(os, "fork"): import signal class ForkedScheduler(Scheduler): """A Scheduler that runs in its own forked process.""" def __del__(self): if hasattr(self, "childpid"): os.kill(self.childpid, signal.SIGKILL) def start(self): """Fork off a new process in which the scheduler will run.""" pid = os.fork() if pid == 0: # we are the child signal.signal(signal.SIGUSR1, self.signalhandler) self._run() os._exit(0) else: # we are the parent self.childpid = pid # can no longer insert in the scheduler queue del self.sched def stop(self): """Stop the scheduler and wait for the process to finish.""" os.kill(self.childpid, signal.SIGUSR1) os.waitpid(self.childpid, 0) def signalhandler(self, sig, stack): Scheduler.stop(self) class ForkedTaskMixin: """A mixin class to make a Task execute in a separate process.""" def __call__(self, schedulerref): """Execute the task action in its own process.""" pid = os.fork() if pid == 0: # we are the child try: self.execute() except Exception as x: self.handle_exception(x) os._exit(0) else: # we are the parent self.reschedule(schedulerref()) class ForkedIntervalTask(ForkedTaskMixin, IntervalTask): """Interval Task that executes in its own process.""" pass class ForkedSingleTask(ForkedTaskMixin, SingleTask): """Single Task that executes in its own process.""" pass class ForkedWeekdayTask(ForkedTaskMixin, WeekdayTask): """Weekday Task that executes in its own process.""" pass class ForkedMonthdayTask(ForkedTaskMixin, MonthdayTask): """Monthday Task that executes in its own process.""" pass if __name__ == "__main__": def testaction(arg): print((">>>TASK", arg, "sleeping 3 seconds")) time.sleep(3) print(("<< # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.utils.upload - File association functions for adding nzb files to sabnzbd """ import os import logging import urllib.request import urllib.parse import urllib.error import sabnzbd.cfg as cfg from sabnzbd.filesystem import get_ext, get_filename from sabnzbd.constants import VALID_ARCHIVES, VALID_NZB_FILES from sabnzbd.dirscanner import process_nzb_archive_file, process_single_nzb from sabnzbd.misc import get_from_url def upload_file(url, fp): """ Function for uploading nzbs to a running SABnzbd instance """ try: fp = urllib.parse.quote_plus(fp) url = "%s&mode=addlocalfile&name=%s" % (url, fp) # Add local API-key if it wasn't already in the registered URL apikey = cfg.api_key() if apikey and "apikey" not in url: url = "%s&apikey=%s" % (url, apikey) if "apikey" not in url: # Use alternative login method username = cfg.username() password = cfg.password() if username and password: url = "%s&ma_username=%s&ma_password=%s" % (url, username, password) get_from_url(url) except: logging.error("Failed to upload file: %s", fp) logging.info("Traceback: ", exc_info=True) def add_local(f): """ Function for easily adding nzb/zip/rar/nzb.gz to SABnzbd """ if os.path.exists(f): fn = get_filename(f) if fn: if get_ext(fn) in VALID_ARCHIVES: process_nzb_archive_file(fn, f, keep=True) elif get_ext(fn) in VALID_NZB_FILES: process_single_nzb(fn, f, keep=True) else: logging.error("Filename not found: %s", f) else: logging.error("File not found: %s", f) sabnzbd-develop/sabnzbd/utils/rarvolinfo.py0000600000175000017500000000751113642116632017257 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2009-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.utils.rarvolinfo - Find out volume number and/or original extension of a rar file. Useful with obfuscated files """ import os try: import sabnzbd.utils.rarfile as rarfile except ImportError: import rarfile def get_rar_extension(myrarfile): """ Find out orginal extension of a rar file. Returns "" in case of file problems So ... returns: "part001.rar", ... "part005.rar" or old number scheme (can only happen for rar3/rar4 files): "rar", r00, ... r89 """ # When things go wrong volumenumber = -1 org_extension = False try: rar_ver = rarfile.is_rarfile(myrarfile) with open(myrarfile, "rb") as fh: if rar_ver.endswith("3"): # As it's rar3, let's first find the numbering scheme: old (rNN) or new (partNN.rar) mybuf = fh.read(100) # first 100 bytes is enough HEAD_FLAGS_LSB = mybuf[10] # LSB = Least Significant Byte newnumbering = HEAD_FLAGS_LSB & 0x10 # For the volume number, At the end of the file, we need about 20 bytes fh.seek(-20, os.SEEK_END) mybuf = fh.read() volumenumber = 1 + mybuf[-9] + 256 * mybuf[-8] if newnumbering: org_extension = "part%02d.rar" % volumenumber else: # 1, 2, 3, 4 resp refers to .rar, .r00, .r01, .r02 ... if volumenumber == 1: org_extension = "rar" else: org_extension = "r%02d" % (volumenumber - 2) elif rar_ver.endswith("5"): mybuf = fh.read(100) # first 100 bytes is enough # Get (and skip) the first 8 + 4 bytes rar5sig, newpos = rarfile.load_bytes(mybuf, 8, 0) # Rar5 signature crc32, newpos = rarfile.load_bytes(mybuf, 4, newpos) # crc32 # Then get the VINT values (with variable size, so parse them all): headersize, newpos = rarfile.load_vint(mybuf, newpos) headertype, newpos = rarfile.load_vint(mybuf, newpos) headerflags, newpos = rarfile.load_vint(mybuf, newpos) extraareasize, newpos = rarfile.load_vint(mybuf, newpos) archiveflags, newpos = rarfile.load_vint(mybuf, newpos) # Now we're ready for the volume number: if archiveflags & 2: value, newpos = rarfile.load_vint(mybuf, newpos) volumenumber = value + 1 else: # first volume, aka 1 volumenumber = 1 # Combine into the extension org_extension = "part%03d.rar" % volumenumber except: pass return volumenumber, org_extension # Main if __name__ == "__main__": import sys try: myfile = sys.argv[1] print("File:", myfile) print("Volume and extension:", get_rar_extension(myfile)) except: print("Please specify rar file as parameter") sabnzbd-develop/sabnzbd/utils/happyeyeballs.py0000600000175000017500000001560313642116632017741 0ustar jpjp#!/usr/bin/python3 # Python implementation of RFC 6555 / Happy Eyeballs: find the quickest IPv4/IPv6 connection # See https://tools.ietf.org/html/rfc6555 # Method: Start parallel sessions using threads, and only wait for the quickest succesful socket connect # If the HOST has an IPv6 address, IPv6 is given a head start by delaying IPv4. See https://tools.ietf.org/html/rfc6555#section-4.1 # You can run this as a standalone program, or as a module: """ from happyeyeballs import happyeyeballs print happyeyeballs('newszilla.xs4all.nl', port=119) """ # or with more logging: """ from happyeyeballs import happyeyeballs import logging logger = logging.getLogger('') logger.setLevel(logging.DEBUG) print happyeyeballs('newszilla.xs4all.nl', port=119) """ import socket import ssl import threading import time import logging import queue DEBUG = False # called by each thread def do_socket_connect(queue, ip, PORT, SSL, ipv4delay): # connect to the ip, and put the result into the queue if DEBUG: logging.debug("Input for thread is %s %s %s", ip, PORT, SSL) try: # CREATE SOCKET if ip.find(":") >= 0: s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) if ip.find(".") >= 0: time.sleep(ipv4delay) # IPv4 ... so a delay for IPv4 as we prefer IPv6. Note: ipv4delay could be 0 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(3) if not SSL: # Connect ... s.connect((ip, PORT)) # ... and close s.close() else: # WRAP SOCKET wrappedSocket = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_TLSv1) # CONNECT wrappedSocket.connect((ip, PORT)) # CLOSE SOCKET CONNECTION wrappedSocket.close() queue.put((ip, True)) if DEBUG: logging.debug("connect to %s OK", ip) except: queue.put((ip, False)) if DEBUG: logging.debug("connect to %s not OK", ip) pass def happyeyeballs(HOST, **kwargs): # Happyeyeballs function, with caching of the results # Fill out the parameters into the variables try: PORT = kwargs["port"] except: PORT = 80 try: SSL = kwargs["ssl"] except: SSL = False try: preferipv6 = kwargs["preferipv6"] except: preferipv6 = True # prefer IPv6, so give IPv6 connects a head start by delaying IPv4 # Find out if a cached result is available, and recent enough: timecurrent = int(time.time()) # current time in seconds since epoch retentionseconds = 100 hostkey = (HOST, PORT, SSL, preferipv6) # Example key: (u'ssl.astraweb.com', 563, True, True) try: happyeyeballs.happylist[hostkey] # just to check: does it exist? # No exception, so entry exists, so let's check the time: timecached = happyeyeballs.happylist[hostkey][1] if timecurrent - timecached <= retentionseconds: if DEBUG: logging.debug("existing cached result recent enough") return happyeyeballs.happylist[hostkey][0] else: if DEBUG: logging.debug("existing cached result too old. Find a new one") # Continue a few lines down except: # Exception, so entry not there, so we have to fill it out if DEBUG: logging.debug("Host not yet in the cache. Find entry") pass # we only arrive here if the entry has to be determined. So let's do that: # We have to determine the (new) best IP address start = time.perf_counter() if DEBUG: logging.debug("\n\n%s %s %s %s", HOST, PORT, SSL, preferipv6) ipv4delay = 0 try: # Check if there is an AAAA / IPv6 result for this host: socket.getaddrinfo(HOST, PORT, socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_IP, socket.AI_CANONNAME) if DEBUG: logging.debug("IPv6 address found for %s", HOST) if preferipv6: ipv4delay = 0.1 # preferipv6, AND at least one IPv6 found, so give IPv4 (!) a delay so that IPv6 has a head start and is preferred except: if DEBUG: logging.debug("No IPv6 address found for %s", HOST) myqueue = queue.Queue() # queue used for threads giving back the results try: # Get all IP (IPv4 and IPv6) addresses: allinfo = socket.getaddrinfo(HOST, PORT, 0, 0, socket.IPPROTO_TCP) for info in allinfo: address = info[4][0] thisthread = threading.Thread(target=do_socket_connect, args=(myqueue, address, PORT, SSL, ipv4delay)) thisthread.daemon = True thisthread.start() result = None # default return value, used if none of threads says True/"OK", so no connect on any IP address # start reading from the Queue for message from the threads: for i in range(len(allinfo)): s = myqueue.get() # get a response if s[1] == True: result = s[0] break # the first True/"OK" is enough, so break out of for loop except: if DEBUG: logging.debug("something went wrong in the try block") result = None logging.info( "Quickest IP address for %s (port %s, ssl %s, preferipv6 %s) is %s", HOST, PORT, SSL, preferipv6, result ) delay = int(1000 * (time.perf_counter() - start)) logging.debug("Happy Eyeballs lookup and port connect took %s ms", delay) # We're done. Store and return the result if result: happyeyeballs.happylist[hostkey] = (result, timecurrent) if DEBUG: logging.debug("Determined new result for %s with result %s", hostkey, happyeyeballs.happylist[hostkey]) return result happyeyeballs.happylist = {} # The cached results. This static variable must be after the def happyeyeballs() if __name__ == "__main__": logger = logging.getLogger("") logger.setLevel(logging.INFO) if DEBUG: logger.setLevel(logging.DEBUG) # plain HTTP/HTTPS sites: print((happyeyeballs("www.google.com"))) print((happyeyeballs("www.google.com", port=443, ssl=True))) print((happyeyeballs("www.nu.nl"))) # newsservers: print((happyeyeballs("newszilla6.xs4all.nl", port=119))) print((happyeyeballs("newszilla.xs4all.nl", port=119))) print((happyeyeballs("block.cheapnews.eu", port=119))) print((happyeyeballs("block.cheapnews.eu", port=443, ssl=True))) print((happyeyeballs("sslreader.eweka.nl", port=563, ssl=True))) print((happyeyeballs("news.thundernews.com", port=119))) print((happyeyeballs("news.thundernews.com", port=119, preferipv6=False))) print((happyeyeballs("secure.eu.thundernews.com", port=563, ssl=True))) # Strange cases print((happyeyeballs("does.not.resolve", port=443, ssl=True))) print((happyeyeballs("www.google.com", port=119))) print((happyeyeballs("216.58.211.164"))) sabnzbd-develop/sabnzbd/urlgrabber.py0000600000175000017500000003566113642116632016074 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.urlgrabber - Queue for grabbing NZB files from websites """ import os import sys import time import logging import queue import urllib.request import urllib.error import urllib.parse from http.client import IncompleteRead from threading import Thread import sabnzbd from sabnzbd.constants import DEF_TIMEOUT, FUTURE_Q_FOLDER, VALID_NZB_FILES, Status import sabnzbd.misc as misc import sabnzbd.filesystem import sabnzbd.dirscanner as dirscanner from sabnzbd.nzbqueue import NzbQueue from sabnzbd.postproc import PostProcessor import sabnzbd.cfg as cfg import sabnzbd.emailer as emailer import sabnzbd.notifier as notifier _BAD_GZ_HOSTS = ('.zip', 'nzbsa.co.za', 'newshost.za.net') _RARTING_FIELDS = ('x-rating-id', 'x-rating-url', 'x-rating-host', 'x-rating-video', 'x-rating-videocnt', 'x-rating-audio', 'x-rating-audiocnt', 'x-rating-voteup', 'x-rating-votedown', 'x-rating-spam', 'x-rating-confirmed-spam', 'x-rating-passworded', 'x-rating-confirmed-passworded') class URLGrabber(Thread): do = None # Link to instance of the thread def __init__(self): Thread.__init__(self) self.queue = queue.Queue() for tup in NzbQueue.do.get_urls(): url, nzo = tup self.queue.put((url, nzo)) self.shutdown = False URLGrabber.do = self def add(self, url, future_nzo, when=None): """ Add an URL to the URLGrabber queue, 'when' is seconds from now """ if future_nzo and when: # Always increase counter future_nzo.url_tries += 1 # Too many tries? Cancel if future_nzo.url_tries > cfg.max_url_retries(): self.fail_to_history(future_nzo, url, T('Maximum retries')) return future_nzo.url_wait = time.time() + when self.queue.put((url, future_nzo)) def stop(self): logging.info('URLGrabber shutting down') self.shutdown = True self.add(None, None) def run(self): logging.info('URLGrabber starting up') self.shutdown = False while not self.shutdown: (url, future_nzo) = self.queue.get() if not url: # stop signal, go test self.shutdown continue if future_nzo: # Re-queue when too early and still active if future_nzo.url_wait and future_nzo.url_wait > time.time(): self.add(url, future_nzo) time.sleep(1.0) continue # Paused if future_nzo.status == Status.PAUSED: self.add(url, future_nzo) time.sleep(1.0) continue url = url.replace(' ', '') try: if future_nzo: # If nzo entry deleted, give up try: deleted = future_nzo.deleted except AttributeError: deleted = True if deleted: logging.debug('Dropping URL %s, job entry missing', url) continue filename = None category = None gzipped = False nzo_info = {} wait = 0 retry = True fetch_request = None logging.info('Grabbing URL %s', url) try: fetch_request = _build_request(url) except Exception as e: # Cannot list exceptions here, because of unpredictability over platforms error0 = str(sys.exc_info()[0]).lower() error1 = str(sys.exc_info()[1]).lower() logging.debug('Error "%s" trying to get the url %s', error1, url) if 'certificate_verify_failed' in error1 or 'certificateerror' in error0: msg = T('Server %s uses an untrusted HTTPS certificate') % '' msg += ' - https://sabnzbd.org/certificate-errors' retry = False elif 'nodename nor servname provided' in error1: msg = T('Server name does not resolve') retry = False elif '401' in error1 or 'unauthorized' in error1: msg = T('Unauthorized access') retry = False elif '404' in error1: msg = T('File not on server') retry = False elif hasattr(e, 'headers') and 'retry-after' in e.headers: # Catch if the server send retry (e.headers is case-INsensitive) wait = misc.int_conv(e.headers['retry-after']) if fetch_request: for hdr in fetch_request.headers: try: item = hdr.lower() value = fetch_request.headers[hdr] except: continue if item in ('content-encoding',) and value == 'gzip': gzipped = True if item in ('category_id', 'x-dnzb-category'): category = value elif item in ('x-dnzb-moreinfo',): nzo_info['more_info'] = value elif item in ('x-dnzb-name',): filename = value if not filename.endswith('.nzb'): filename += '.nzb' elif item == 'x-dnzb-propername': nzo_info['propername'] = value elif item == 'x-dnzb-episodename': nzo_info['episodename'] = value elif item == 'x-dnzb-year': nzo_info['year'] = value elif item == 'x-dnzb-failure': nzo_info['failure'] = value elif item == 'x-dnzb-details': nzo_info['details'] = value elif item == 'x-dnzb-password': nzo_info['password'] = value elif item == 'retry-after': wait = misc.int_conv(value) # Rating fields if item in _RARTING_FIELDS: nzo_info[item] = value # Get filename from Content-Disposition header if not filename and "filename=" in value: filename = value[value.index("filename=") + 9:].strip(';').strip('"') if wait: # For sites that have a rate-limiting attribute msg = '' retry = True fetch_request = None elif retry: fetch_request, msg, retry, wait, data = _analyse(fetch_request, future_nzo) if not fetch_request: if retry: logging.info('Retry URL %s', url) self.add(url, future_nzo, wait) else: self.fail_to_history(future_nzo, url, msg) continue if not filename: filename = os.path.basename(urllib.parse.unquote(url)) # URL was redirected, maybe the redirect has better filename? # Check if the original URL has extension if url != fetch_request.url and sabnzbd.filesystem.get_ext(filename) not in VALID_NZB_FILES: filename = os.path.basename(urllib.parse.unquote(fetch_request.url)) elif '&nzbname=' in filename: # Sometimes the filename contains the full URL, duh! filename = filename[filename.find('&nzbname=') + 9:] pp = future_nzo.pp script = future_nzo.script cat = future_nzo.cat if (cat is None or cat == '*') and category: cat = misc.cat_convert(category) priority = future_nzo.priority nzbname = future_nzo.custom_name # process data if gzipped: filename += '.gz' if not data: try: data = fetch_request.read() except (IncompleteRead, IOError): self.fail_to_history(future_nzo, url, T('Server could not complete request')) fetch_request.close() continue fetch_request.close() if b' 0: emailer.badfetch_mail(msg, url) # Parse category to make sure script is set correctly after a grab nzo.cat, _, nzo.script, _ = misc.cat_to_opts(nzo.cat, script=nzo.script) # Add to history and run script if desired NzbQueue.do.remove(nzo.nzo_id, add_to_history=False, delete_all_data=False) PostProcessor.do.process(nzo) def _build_request(url): # Detect basic auth # Adapted from python-feedparser user_passwd = None urltype, rest = urllib.parse.splittype(url) realhost, rest = urllib.parse.splithost(rest) if realhost: user_passwd, realhost = urllib.parse.splituser(realhost) if user_passwd: url = '%s://%s%s' % (urltype, realhost, rest) # Start request req = urllib.request.Request(url) # Add headers req.add_header('User-Agent', 'SABnzbd+/%s' % sabnzbd.version.__version__) if not any(item in url for item in _BAD_GZ_HOSTS): req.add_header('Accept-encoding', 'gzip') if user_passwd: req.add_header('Authorization', 'Basic ' + user_passwd.encode('base64').strip()) return urllib.request.urlopen(req) def _analyse(fetch_request, future_nzo): """ Analyze response of indexer returns fetch_request|None, error-message|None, retry, wait-seconds, data """ data = None if not fetch_request or fetch_request.code != 200: if fetch_request: msg = fetch_request.msg else: msg = '' # Increasing wait-time in steps for standard errors when = DEF_TIMEOUT * (future_nzo.url_tries + 1) logging.debug('No usable response from indexer, retry after %s sec', when) return None, msg, True, when, data return fetch_request, fetch_request.msg, False, 0, data sabnzbd-develop/sabnzbd/database.py0000600000175000017500000005142513642116632015505 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.database - Database Support """ import os import time import zlib import logging import sys import threading import sqlite3 import sabnzbd import sabnzbd.cfg from sabnzbd.constants import DB_HISTORY_NAME, STAGES, Status from sabnzbd.bpsmeter import this_week, this_month from sabnzbd.decorators import synchronized from sabnzbd.encoding import ubtou, utob from sabnzbd.misc import int_conv, caller_name from sabnzbd.filesystem import remove_file DB_LOCK = threading.RLock() def convert_search(search): """ Convert classic wildcard to SQL wildcard """ if not search: # Default value search = "" else: # Allow * for wildcard matching and space search = search.replace("*", "%").replace(" ", "%") # Allow ^ for start of string and $ for end of string if search and search.startswith("^"): search = search.replace("^", "") search += "%" elif search and search.endswith("$"): search = search.replace("$", "") search = "%" + search else: search = "%" + search + "%" return search class HistoryDB: """ Class to access the History database Each class-instance will create an access channel that can be used in one thread. Each thread needs its own class-instance! """ # 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 @synchronized(DB_LOCK) def __init__(self): """ Determine databse path and create connection """ self.con = self.c = None if not HistoryDB.db_path: 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) self.con = sqlite3.connect(HistoryDB.db_path) self.con.row_factory = dict_factory self.c = self.con.cursor() if create_table: self.create_history_db() elif not HistoryDB.done_cleaning: # Run VACUUM on sqlite # When an object (table, index, or trigger) is dropped from the database, it leaves behind empty space # http://www.sqlite.org/lang_vacuum.html HistoryDB.done_cleaning = True self.execute("VACUUM") self.execute("PRAGMA user_version;") try: version = self.c.fetchone()["user_version"] except TypeError: version = 0 if version < 1: # Add any missing columns added since first DB version # Use "and" to stop when database has been reset due to corruption _ = ( self.execute("PRAGMA user_version = 1;") and self.execute('ALTER TABLE "history" ADD COLUMN series TEXT;') and self.execute('ALTER TABLE "history" ADD COLUMN md5sum TEXT;') ) if version < 2: # Add any missing columns added since second DB version # Use "and" to stop when database has been reset due to corruption _ = 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 range(5, 0, -1): try: if args and isinstance(args, tuple): self.c.execute(command, args) else: self.c.execute(command) if save: self.con.commit() return True except: error = str(sys.exc_info()[1]) if tries >= 0 and "is locked" in error: logging.debug("Database locked, wait and retry") time.sleep(0.5) continue elif "readonly" in error: logging.error(T("Cannot write to History database, check access rights!")) # Report back success, because there's no recovery possible return True elif "not a database" in error or "malformed" in error or "duplicate column name" in error: logging.error(T("Damaged History database, created empty replacement")) logging.info("Traceback: ", exc_info=True) self.close() try: remove_file(HistoryDB.db_path) except: pass self.connect() # Return False in case of "duplicate column" error # because the column addition in connect() must be terminated return "duplicate column name" not in error else: logging.error(T("SQL Command Failed, see log")) logging.info("SQL: %s", command) logging.info("Arguments: %s", repr(args)) logging.info("Traceback: ", exc_info=True) try: self.con.rollback() except: logging.debug("Rollback Failed:", exc_info=True) return False def create_history_db(self): """ Create a new (empty) database file """ self.execute( """ CREATE TABLE "history" ( "id" INTEGER PRIMARY KEY, "completed" INTEGER NOT NULL, "name" TEXT NOT NULL, "nzb_name" TEXT NOT NULL, "category" TEXT, "pp" TEXT, "script" TEXT, "report" TEXT, "url" TEXT, "status" TEXT, "nzo_id" TEXT, "storage" TEXT, "path" TEXT, "script_log" BLOB, "script_line" TEXT, "download_time" INTEGER, "postproc_time" INTEGER, "stage_log" TEXT, "downloaded" INTEGER, "completeness" INTEGER, "fail_message" TEXT, "url_info" TEXT, "bytes" INTEGER, "meta" TEXT, "series" TEXT, "md5sum" TEXT, "password" TEXT ) """ ) self.execute("PRAGMA user_version = 2;") def close(self): """ Close database connection """ try: self.c.close() self.con.close() except: logging.error(T("Failed to close database, see log")) logging.info("Traceback: ", exc_info=True) def remove_completed(self, search=None): """ Remove all completed jobs from the database, optional with `search` pattern """ search = convert_search(search) logging.info("Removing all completed jobs from history") return self.execute( """DELETE FROM history WHERE name LIKE ? AND status = ?""", (search, Status.COMPLETED), save=True ) def get_failed_paths(self, search=None): """ Return list of all storage paths of failed jobs (may contain non-existing or empty paths) """ search = convert_search(search) fetch_ok = self.execute( """SELECT path FROM history WHERE name LIKE ? AND status = ?""", (search, Status.FAILED) ) if fetch_ok: return [item.get("path") for item in self.c.fetchall()] else: return [] def remove_failed(self, search=None): """ Remove all failed jobs from the database, optional with `search` pattern """ search = convert_search(search) logging.info("Removing all failed jobs from history") return self.execute( """DELETE FROM history WHERE name LIKE ? AND status = ?""", (search, Status.FAILED), save=True ) def remove_history(self, jobs=None): """ Remove all jobs in the list `jobs`, empty list will remove all completed jobs """ if jobs is None: self.remove_completed() else: if not isinstance(jobs, list): 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) def auto_history_purge(self): """ Remove history items based on the configured history-retention """ if sabnzbd.cfg.history_retention() == "0": return if sabnzbd.cfg.history_retention() == "-1": # Delete all non-failed ones self.remove_completed() 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 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 = ? AND completed < ?""", (Status.COMPLETED, seconds_to_keep), save=True, ) else: # How many to keep? to_keep = int_conv(sabnzbd.cfg.history_retention()) if to_keep > 0: logging.info("Removing all but last %s completed jobs from history", to_keep) return self.execute( """DELETE FROM history WHERE status = ? AND id NOT IN ( SELECT id FROM history WHERE status = ? ORDER BY completed DESC LIMIT ? )""", (Status.COMPLETED, Status.COMPLETED, to_keep), save=True, ) def add_history_db(self, nzo, storage="", path="", postproc_time=0, 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, series_info=True) 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, ) 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): """ Return records for specified jobs """ command_args = [convert_search(search)] post = "" if categories: categories = ["*" if c == "Default" else c for c in categories] post = " AND (CATEGORY = ?" post += " OR CATEGORY = ? " * (len(categories) - 1) post += ")" command_args.extend(categories) if failed_only: post += " AND STATUS = ?" command_args.append(Status.FAILED) cmd = "SELECT COUNT(*) FROM history WHERE name LIKE ?" res = self.execute(cmd + post, tuple(command_args)) total_items = -1 if res: try: total_items = self.c.fetchone().get("COUNT(*)") except AttributeError: pass if not start: start = 0 if not limit: limit = total_items command_args.extend([start, limit]) cmd = "SELECT * FROM history WHERE name LIKE ?" fetch_ok = self.execute(cmd + post + " ORDER BY completed desc LIMIT ?, ?", tuple(command_args)) if fetch_ok: items = self.c.fetchall() else: items = [] fetched_items = len(items) # Unpack the single line stage log # Stage Name is separated by ::: stage lines by ; and stages by \r\n items = [unpack_history_info(item) for item in items] return items, fetched_items, total_items def have_episode(self, series, season, episode): """ Check whether History contains this series episode """ total = 0 series = series.lower().replace(".", " ").replace("_", " ").replace(" ", " ") if series and season and episode: pattern = "%s/%s/%s" % (series, season, episode) res = self.execute( "select count(*) from History WHERE series = ? AND STATUS != ?", (pattern, Status.FAILED) ) if res: try: total = self.c.fetchone().get("count(*)") except AttributeError: pass return total > 0 def have_name_or_md5sum(self, name, md5sum): """ Check whether this name or md5sum is already in History """ total = 0 res = self.execute("select count(*) from History WHERE md5sum = ? AND STATUS != ?", (md5sum, Status.FAILED)) if res: try: total = self.c.fetchone().get("count(*)") except AttributeError: pass return total > 0 def get_history_size(self): """ Returns the total size of the history and amounts downloaded in the last month and week """ # Total Size of the history total = 0 if self.execute("""SELECT sum(bytes) FROM history"""): try: total = self.c.fetchone().get("sum(bytes)") except AttributeError: pass # Amount downloaded this month # r = time.gmtime(time.time()) # month_timest = int(time.mktime((r.tm_year, r.tm_mon, 0, 0, 0, 1, r.tm_wday, r.tm_yday, r.tm_isdst))) month_timest = int(this_month(time.time())) month = 0 if self.execute("""SELECT sum(bytes) FROM history WHERE completed > ?""", (month_timest,)): try: month = self.c.fetchone().get("sum(bytes)") except AttributeError: pass # Amount downloaded this week week_timest = int(this_week(time.time())) week = 0 if self.execute("""SELECT sum(bytes) FROM history WHERE completed > ?""", (week_timest,)): try: week = self.c.fetchone().get("sum(bytes)") except AttributeError: pass return total, month, week def get_script_log(self, nzo_id): """ Return decompressed log file """ data = "" t = (nzo_id,) if self.execute("SELECT script_log FROM history WHERE nzo_id = ?", t): try: data = ubtou(zlib.decompress(self.c.fetchone().get("script_log"))) except: pass return data def get_name(self, nzo_id): """ Return name of the job `nzo_id` """ t = (nzo_id,) name = "" if self.execute("SELECT name FROM history WHERE nzo_id = ?", t): try: name = self.c.fetchone().get("name") except AttributeError: pass return name def get_path(self, nzo_id): """ Return the `incomplete` path of the job `nzo_id` if it is still there """ t = (nzo_id,) path = "" if self.execute("SELECT path FROM history WHERE nzo_id = ?", t): try: path = self.c.fetchone().get("path") except AttributeError: pass if os.path.exists(path): return path return None def get_other(self, nzo_id): """ Return additional data for job `nzo_id` """ t = (nzo_id,) if self.execute("SELECT * FROM history WHERE nzo_id = ?", t): try: items = self.c.fetchone() dtype = items.get("report") url = items.get("url") pp = items.get("pp") script = items.get("script") cat = items.get("category") return dtype, url, pp, script, cat except (AttributeError, IndexError): pass return "", "", "", "", "" def dict_factory(cursor, row): """ Return a dictionary for the current database position """ d = {} for idx, col in enumerate(cursor.description): d[col[0]] = row[idx] return d _PP_LOOKUP = {0: "", 1: "R", 2: "U", 3: "D"} def build_history_info( nzo, storage="", downpath="", postproc_time=0, script_output="", script_line="", series_info=False ): """ Collects all the information needed for the database """ completed = int(time.time()) if not downpath: downpath = nzo.downpath pp = _PP_LOOKUP.get(sabnzbd.opts_to_pp(*nzo.repair_opts), "X") if script_output: # Compress the output of the script script_output = sqlite3.Binary(zlib.compress(utob(script_output))) download_time = nzo.nzo_info.get("download_time", 0) completeness = 0 url_info = nzo.nzo_info.get("details", "") or nzo.nzo_info.get("more_info", "") # Get the dictionary containing the stages and their unpack process # Pack the dictionary up into a single string # Stage Name is separated by ::: stage lines by ; and stages by \r\n lines = [] for key, results in nzo.unpack_info.items(): lines.append("%s:::%s" % (key, ";".join(results))) stage_log = "\r\n".join(lines) # Reuse the old 'report' column to indicate a URL-fetch report = "future" if nzo.futuretype else "" # Analyze series info only when job is finished series = "" if series_info: seriesname, season, episode, _ = sabnzbd.newsunpack.analyse_show(nzo.final_name) if seriesname and season and episode: series = "%s/%s/%s" % (seriesname.lower(), season, episode) return ( completed, nzo.final_name, nzo.filename, nzo.cat, pp, nzo.script, report, nzo.url, nzo.status, nzo.nzo_id, storage, downpath, script_output, script_line, download_time, postproc_time, stage_log, nzo.bytes_downloaded, completeness, nzo.fail_msg, url_info, nzo.bytes_downloaded, series, nzo.md5sum, nzo.password, ) def unpack_history_info(item): """ Expands the single line stage_log from the DB into a python dictionary for use in the history display """ # Stage Name is separated by ::: stage lines by ; and stages by \r\n lst = item["stage_log"] if lst: try: lines = lst.split("\r\n") except: logging.error(T("Invalid stage logging in history for %s") + " (\\r\\n)", item["name"]) logging.debug("Lines: %s", lst) lines = [] lst = [None for x in STAGES] for line in lines: stage = {} try: key, logs = line.split(":::") except: logging.debug('Missing key:::logs "%s"', line) key = line logs = "" stage["name"] = key stage["actions"] = [] try: logs = logs.split(";") except: logging.error(T("Invalid stage logging in history for %s") + " (;)", item["name"]) logging.debug("Logs: %s", logs) logs = [] for log in logs: stage["actions"].append(log) try: lst[STAGES[key]] = stage except KeyError: lst.append(stage) # Remove unused stages item["stage_log"] = [x for x in lst if x is not None] if item["script_log"]: item["script_log"] = "" # The action line is only available for items in the postproc queue if "action_line" not in item: item["action_line"] = "" return item def midnight_history_purge(): logging.info("Scheduled history purge") history_db = HistoryDB() history_db.auto_history_purge() history_db.close() sabnzbd-develop/sabnzbd/assembler.py0000600000175000017500000004011613642116632015711 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.assembler - threaded assembly/decoding of files """ import os import queue import logging import re from threading import Thread from time import sleep import hashlib import sabnzbd from sabnzbd.misc import get_all_passwords from sabnzbd.filesystem import get_filepath, sanitize_filename, \ set_permissions, long_path, clip_path, has_win_device, diskspace, \ get_filename, get_ext from sabnzbd.constants import Status, GIGI import sabnzbd.cfg as cfg from sabnzbd.articlecache import ArticleCache from sabnzbd.postproc import PostProcessor import sabnzbd.downloader import sabnzbd.par2file as par2file import sabnzbd.utils.rarfile as rarfile from sabnzbd.rating import Rating class Assembler(Thread): do = None # Link to the instance of this method def __init__(self): Thread.__init__(self) self.queue = queue.Queue() Assembler.do = self def stop(self): self.process(None) def process(self, job): self.queue.put(job) def run(self): while 1: job = self.queue.get() if not job: logging.info("Shutting down") break nzo, nzf = job if nzf: # Check if enough disk space is free, if not pause downloader and send email if diskspace(force=True)['download_dir'][1] < (cfg.download_free.get_float() + nzf.bytes) / GIGI: # Only warn and email once 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.emailer.diskfull_mail() # Abort all direct unpackers, just to be sure sabnzbd.directunpacker.abort_all() # Prepare filename nzo.verify_nzf_filename(nzf) nzf.filename = sanitize_filename(nzf.filename) filepath = get_filepath(long_path(cfg.download_dir.get_path()), nzo, nzf.filename) nzf.filename = get_filename(filepath) if filepath: logging.info('Decoding %s %s', filepath, nzf.type) try: filepath = self.assemble(nzf, filepath) except IOError as err: # If job was deleted or in active post-processing, ignore error if not nzo.deleted and not nzo.is_gone() and not nzo.pp_active: # 28 == disk full => pause downloader if err.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() continue except: logging.error(T('Fatal error in Assembler'), exc_info=True) break # 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) if unwanted_file: logging.warning(remove_warning_label(T('WARNING: In "%s" unwanted extension in RAR file. Unwanted file is %s ')), nzo.final_name, unwanted_file) logging.debug(T('Unwanted extension is in rar file %s'), filepath) if cfg.action_on_unwanted_extensions() == 1 and nzo.unwanted_ext == 0: logging.debug('Unwanted extension ... pausing') nzo.unwanted_ext = 1 nzo.pause() if cfg.action_on_unwanted_extensions() == 2: logging.debug('Unwanted extension ... aborting') nzo.fail_msg = T('Aborted, unwanted extension detected') sabnzbd.nzbqueue.NzbQueue.do.end_job(nzo) # Add to direct unpack nzo.add_to_direct_unpacker(nzf) elif par2file.is_parfile(filepath): # Parse par2 files, cloaked or not nzo.handle_par2(nzf, filepath) filter, reason = nzo_filtered_by_rating(nzo) if filter == 1: logging.warning(remove_warning_label(T('WARNING: Paused job "%s" because of rating (%s)')), nzo.final_name, reason) nzo.pause() elif filter == 2: logging.warning(remove_warning_label(T('WARNING: Aborted job "%s" because of rating (%s)')), nzo.final_name, reason) nzo.fail_msg = T('Aborted, rating filter matched (%s)') % reason sabnzbd.nzbqueue.NzbQueue.do.end_job(nzo) else: sabnzbd.nzbqueue.NzbQueue.do.remove(nzo.nzo_id, add_to_history=False, cleanup=False) PostProcessor.do.process(nzo) def assemble(self, nzf, path): """ Assemble a NZF from its table of articles """ md5 = hashlib.md5() fout = open(path, 'ab') decodetable = nzf.decodetable for articlenum in sorted(decodetable): # Break if deleted during writing if nzf.nzo.status is Status.DELETED: break # Sleep to allow decoder/assembler switching article = decodetable[articlenum] data = ArticleCache.do.load_article(article) if not data: logging.info(T('%s missing'), article) else: # yenc data already decoded, flush it out fout.write(data) md5.update(data) fout.flush() fout.close() set_permissions(path) nzf.md5sum = md5.digest() return path def file_has_articles(nzf): """ Do a quick check to see if any articles are present for this file. Destructive: only to be used to differentiate between unknown encoding and no articles. """ has = False decodetable = nzf.decodetable for articlenum in decodetable: sleep(0.01) article = decodetable[articlenum] data = ArticleCache.do.load_article(article) if data: has = True return has RE_SUBS = re.compile(r'\W+sub|subs|subpack|subtitle|subtitles(?![a-z])', re.I) SAFE_EXTS = ('.mkv', '.mp4', '.avi', '.wmv', '.mpg', '.webm') def is_cloaked(nzo, path, names): """ Return True if this is likely to be a cloaked encrypted post """ fname = os.path.splitext(get_filename(path.lower()))[0] for name in names: name = get_filename(name.lower()) name, ext = os.path.splitext(name) if ext == '.rar' and fname.startswith(name) and (len(fname) - len(name)) < 8 and len(names) < 3 and not RE_SUBS.search(fname): # Only warn once if nzo.encrypted == 0: logging.warning(T('Job "%s" is probably encrypted due to RAR with same name inside this RAR'), nzo.final_name) nzo.encrypted = 1 return True elif 'password' in name and ext not in SAFE_EXTS: # Only warn once if nzo.encrypted == 0: logging.warning(T('Job "%s" is probably encrypted: "password" in filename "%s"'), nzo.final_name, name) nzo.encrypted = 1 return True return False def check_encrypted_and_unwanted_files(nzo, filepath): """ Combines check for unwanted and encrypted files to save on CPU and IO """ encrypted = False unwanted = None if (cfg.unwanted_extensions() and cfg.action_on_unwanted_extensions()) or (nzo.encrypted == 0 and cfg.pause_on_pwrar()): # These checks should not break the assembler try: # Rarfile freezes on Windows special names, so don't try those! if sabnzbd.WIN32 and has_win_device(filepath): return encrypted, unwanted # Is it even a rarfile? if rarfile.is_rarfile(filepath): # Open the rar rarfile.UNRAR_TOOL = sabnzbd.newsunpack.RAR_COMMAND zf = rarfile.RarFile(filepath, all_names=True) # Check for encryption if nzo.encrypted == 0 and cfg.pause_on_pwrar() and (zf.needs_password() or is_cloaked(nzo, filepath, zf.namelist())): # Load all passwords passwords = get_all_passwords(nzo) # Cloaked job? if is_cloaked(nzo, filepath, zf.namelist()): encrypted = True elif not passwords: # Only error when no password was set nzo.encrypted = 1 encrypted = True else: # Lets test if any of the password work password_hit = False for password in passwords: if password: logging.info('Trying password "%s" on job "%s"', password, nzo.final_name) try: zf.setpassword(password) except rarfile.Error: # On weird passwords the setpassword() will fail # but the actual rartest() will work pass try: zf.testrar() password_hit = password break except rarfile.RarCRCError: # On CRC error we can continue! password_hit = password break except Exception as e: # Did we start from the right volume? if 'need to start extraction from a previous volume' in str(e): return encrypted, unwanted # This one failed pass # 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 encrypted = False else: # Encrypted and none of them worked nzo.encrypted = 1 encrypted = True # Check for unwanted extensions 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(): 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) return encrypted, unwanted def nzo_filtered_by_rating(nzo): if Rating.do and cfg.rating_enable() and cfg.rating_filter_enable() and (nzo.rating_filtered < 2): rating = Rating.do.get_rating_by_nzo(nzo.nzo_id) if rating is not None: nzo.rating_filtered = 1 reason = rating_filtered(rating, nzo.filename.lower(), True) if reason is not None: return 2, reason reason = rating_filtered(rating, nzo.filename.lower(), False) if reason is not None: return 1, reason return 0, "" def rating_filtered(rating, filename, abort): def check_keyword(keyword): clean_keyword = keyword.strip().lower() return (len(clean_keyword) > 0) and (clean_keyword in filename) audio = cfg.rating_filter_abort_audio() if abort else cfg.rating_filter_pause_audio() video = cfg.rating_filter_abort_video() if abort else cfg.rating_filter_pause_video() spam = cfg.rating_filter_abort_spam() if abort else cfg.rating_filter_pause_spam() spam_confirm = cfg.rating_filter_abort_spam_confirm() if abort else cfg.rating_filter_pause_spam_confirm() encrypted = cfg.rating_filter_abort_encrypted() if abort else cfg.rating_filter_pause_encrypted() encrypted_confirm = cfg.rating_filter_abort_encrypted_confirm() if abort else cfg.rating_filter_pause_encrypted_confirm() downvoted = cfg.rating_filter_abort_downvoted() if abort else cfg.rating_filter_pause_downvoted() keywords = cfg.rating_filter_abort_keywords() if abort else cfg.rating_filter_pause_keywords() if (video > 0) and (rating.avg_video > 0) and (rating.avg_video <= video): return T('video') if (audio > 0) and (rating.avg_audio > 0) and (rating.avg_audio <= audio): return T('audio') if (spam and ((rating.avg_spam_cnt > 0) or rating.avg_encrypted_confirm)) or (spam_confirm and rating.avg_spam_confirm): return T('spam') if (encrypted and ((rating.avg_encrypted_cnt > 0) or rating.avg_encrypted_confirm)) or (encrypted_confirm and rating.avg_encrypted_confirm): return T('passworded') if downvoted and (rating.avg_vote_up < rating.avg_vote_down): return T('downvoted') if any(check_keyword(k) for k in keywords.split(',')): return T('keywords') return None 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 sabnzbd-develop/sabnzbd/dirscanner.py0000600000175000017500000004053413642116632016070 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.dirscanner - Scanner for Watched Folder """ import os import time import logging import zipfile import gzip import bz2 import threading import sabnzbd from sabnzbd.constants import SCAN_FILE_NAME, VALID_ARCHIVES, VALID_NZB_FILES import sabnzbd.utils.rarfile as rarfile from sabnzbd.decorators import NzbQueueLocker from sabnzbd.encoding import correct_unknown_encoding from sabnzbd.newsunpack import is_sevenfile, SevenZip import sabnzbd.nzbstuff as nzbstuff import sabnzbd.filesystem as filesystem import sabnzbd.config as config import sabnzbd.cfg as cfg def name_to_cat(fname, cat=None): """ Retrieve category from file name, but only if "cat" is None. """ if cat is None and fname.startswith("{{"): n = fname.find("}}") if n > 2: cat = fname[2:n].strip() fname = fname[n + 2 :].strip() logging.debug("Job %s has category %s", fname, cat) return fname, cat def compare_stat_tuple(tup1, tup2): """ Test equality of two stat-tuples, content-related parts only """ if tup1.st_ino != tup2.st_ino: return False if tup1.st_size != tup2.st_size: return False if tup1.st_mtime != tup2.st_mtime: return False if tup1.st_ctime != tup2.st_ctime: return False return True def is_archive(path): """ Check if file in path is an ZIP, RAR or 7z file :param path: path to file :return: (zf, status, expected_extension) status: -1==Error/Retry, 0==OK, 1==Ignore """ if zipfile.is_zipfile(path): try: zf = zipfile.ZipFile(path) return 0, zf, ".zip" except: logging.info(T("Cannot read %s"), path, exc_info=True) return -1, None, "" elif rarfile.is_rarfile(path): try: # Set path to tool to open it rarfile.UNRAR_TOOL = sabnzbd.newsunpack.RAR_COMMAND zf = rarfile.RarFile(path) return 0, zf, ".rar" except: logging.info(T("Cannot read %s"), path, exc_info=True) return -1, None, "" elif is_sevenfile(path): try: zf = SevenZip(path) return 0, zf, ".7z" except: logging.info(T("Cannot read %s"), path, exc_info=True) return -1, None, "" else: logging.info("Archive %s is not a real archive!", os.path.basename(path)) return 1, None, "" def clean_file_list(inp_list, folder, files): """ Remove elements of "inp_list" not found in "files" """ for path in sorted(inp_list.keys()): fld, name = os.path.split(path) if fld == folder: present = False for name in files: if os.path.join(folder, name) == path: present = True break if not present: del inp_list[path] @NzbQueueLocker def process_nzb_archive_file( filename, path, pp=None, script=None, cat=None, catdir=None, keep=False, priority=None, url="", nzbname=None, password=None, nzo_id=None, ): """ Analyse ZIP file and create job(s). Accepts ZIP files with ONLY nzb/nfo/folder files in it. returns (status, nzo_ids) status: -1==Error/Retry, 0==OK, 1==Ignore """ nzo_ids = [] if catdir is None: catdir = cat filename, cat = name_to_cat(filename, catdir) status, zf, extension = is_archive(path) if status != 0: return status, [] status = 1 names = zf.namelist() nzbcount = 0 for name in names: name = name.lower() if name.endswith(".nzb"): status = 0 nzbcount += 1 if status == 0: if nzbcount != 1: nzbname = None for name in names: if name.lower().endswith(".nzb"): try: data = correct_unknown_encoding(zf.read(name)) except OSError: logging.error(T("Cannot read %s"), name, exc_info=True) zf.close() return -1, [] name = filesystem.setname_from_path(name) if data: nzo = None try: nzo = nzbstuff.NzbObject( name, pp, script, data, cat=cat, url=url, priority=priority, nzbname=nzbname ) if not nzo.password: nzo.password = password except (TypeError, ValueError): # Duplicate or empty, ignore pass except: # Something else is wrong, show error logging.error(T("Error while adding %s, removing"), name, exc_info=True) if nzo: if nzo_id: # Re-use existing nzo_id, when a "future" job gets it payload sabnzbd.nzbqueue.NzbQueue.do.remove(nzo_id, add_to_history=False, delete_all_data=False) nzo.nzo_id = nzo_id nzo_id = None nzo_ids.append(sabnzbd.nzbqueue.NzbQueue.do.add(nzo)) nzo.update_rating() zf.close() try: if not keep: filesystem.remove_file(path) except OSError: logging.error(T("Error removing %s"), filesystem.clip_path(path)) logging.info("Traceback: ", exc_info=True) status = 1 else: zf.close() status = 1 return status, nzo_ids @NzbQueueLocker def process_single_nzb( filename, path, pp=None, script=None, cat=None, catdir=None, keep=False, priority=None, nzbname=None, reuse=False, nzo_info=None, dup_check=True, url="", password=None, nzo_id=None, ): """ Analyze file and create a job from it Supports NZB, NZB.BZ2, NZB.GZ and GZ.NZB-in-disguise returns (status, nzo_ids) status: -2==Error/retry, -1==Error, 0==OK, 1==OK-but-ignorecannot-delete """ nzo_ids = [] if catdir is None: catdir = cat try: with open(path, "rb") as nzb_file: check_bytes = nzb_file.read(2) if check_bytes == b"\x1f\x8b": # gzip file or gzip in disguise name = filename.replace(".nzb.gz", ".nzb") nzb_reader_handler = gzip.GzipFile elif check_bytes == b"BZ": # bz2 file or bz2 in disguise name = filename.replace(".nzb.bz2", ".nzb") nzb_reader_handler = bz2.BZ2File else: name = filename nzb_reader_handler = open # Let's get some data and hope we can decode it with nzb_reader_handler(path, "rb") as nzb_file: data = correct_unknown_encoding(nzb_file.read()) except: logging.warning(T("Cannot read %s"), filesystem.clip_path(path)) logging.info("Traceback: ", exc_info=True) return -2, nzo_ids if name: name, cat = name_to_cat(name, catdir) # The name is used as the name of the folder, so sanitize it using folder specific santization if not nzbname: # Prevent embedded password from being damaged by sanitize and trimming nzbname = os.path.split(name)[1] try: nzo = nzbstuff.NzbObject( name, pp, script, data, cat=cat, priority=priority, nzbname=nzbname, nzo_info=nzo_info, url=url, reuse=reuse, dup_check=dup_check, ) if not nzo.password: nzo.password = password except TypeError: # Duplicate, ignore if nzo_id: sabnzbd.nzbqueue.NzbQueue.do.remove(nzo_id, add_to_history=False) nzo = None except ValueError: # Empty, but correct file return -1, nzo_ids except: if data.find("= 0 > data.find(" 0) and not self.shutdown and not self.trigger: time.sleep(1.0) x = x - 1 self.trigger = False if self.dirscan_speed and not self.shutdown: self.scan() def scan(self): """ Do one scan of the watched folder """ def run_dir(folder, catdir): try: files = os.listdir(folder) except OSError: if not self.error_reported and not catdir: logging.error(T("Cannot read Watched Folder %s"), filesystem.clip_path(folder)) self.error_reported = True files = [] for filename in files: path = os.path.join(folder, filename) if os.path.isdir(path) or path in self.ignored or filename[0] == ".": continue ext = os.path.splitext(path)[1].lower() candidate = ext in VALID_NZB_FILES + VALID_ARCHIVES if candidate: try: stat_tuple = os.stat(path) except OSError: continue else: self.ignored[path] = 1 if path in self.suspected: if compare_stat_tuple(self.suspected[path], stat_tuple): # Suspected file still has the same attributes continue else: del self.suspected[path] if candidate and stat_tuple.st_size > 0: logging.info("Trying to import %s", path) # Wait until the attributes are stable for 1 second # but give up after 3 sec stable = False for n in range(3): time.sleep(1.0) try: stat_tuple_tmp = os.stat(path) except OSError: continue if compare_stat_tuple(stat_tuple, stat_tuple_tmp): stable = True break else: stat_tuple = stat_tuple_tmp if not stable: continue # Handle archive files, but only when containing just NZB files if ext in VALID_ARCHIVES: res, nzo_ids = process_nzb_archive_file(filename, path, catdir=catdir, url=path) if res == -1: self.suspected[path] = stat_tuple elif res == 0: self.error_reported = False else: self.ignored[path] = 1 # Handle .nzb, .nzb.gz or gzip-disguised-as-nzb or .bz2 elif ext == ".nzb" or filename.lower().endswith(".nzb.gz") or filename.lower().endswith(".nzb.bz2"): res, nzo_id = process_single_nzb(filename, path, catdir=catdir, url=path) if res < 0: self.suspected[path] = stat_tuple elif res == 0: self.error_reported = False else: self.ignored[path] = 1 else: self.ignored[path] = 1 clean_file_list(self.ignored, folder, files) clean_file_list(self.suspected, folder, files) if not self.busy: self.busy = True dirscan_dir = self.dirscan_dir if dirscan_dir and not sabnzbd.PAUSED_ALL: run_dir(dirscan_dir, None) try: dirscan_list = os.listdir(dirscan_dir) except OSError: if not self.error_reported: logging.error(T("Cannot read Watched Folder %s"), filesystem.clip_path(dirscan_dir)) self.error_reported = True dirscan_list = [] cats = config.get_categories() for dd in dirscan_list: dpath = os.path.join(dirscan_dir, dd) if os.path.isdir(dpath) and dd.lower() in cats: run_dir(dpath, dd.lower()) self.busy = False def dirscan(): """ Wrapper required for scheduler """ logging.info("Scheduled or manual watched folder scan") DirScanner.do.scan() sabnzbd-develop/sabnzbd/lang.py0000600000175000017500000001562113642116632014660 0ustar jpjp#!/usr/bin/python3 -OO # -*- coding: utf-8 -*- # Copyright 2011-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.lang - Language support """ # This module should be the first non-standard import to # be done at the top of the application's main file. # This will ensure that the default language is available # and the special functions are active. # This module cannot import any application modules!! # # Required keywords for pygettext.py: -k T -k TT # # The following pseudo-builtins are provided. # T() Unicode translation # TT() Dummy translation, use to mark table entries for POT scanning import gettext import builtins import glob import os import locale __all__ = ["set_locale_info", "set_language", "list_languages"] _DOMAIN = "" # Holds translation domain _LOCALEDIR = "" # Holds path to the translation base folder def set_locale_info(domain, localedir): """ Setup the domain and localedir for translations """ global _DOMAIN, _LOCALEDIR _DOMAIN = domain _LOCALEDIR = localedir def set_language(language=None): """ Activate language, empty language will set default texts. """ if not language: language = "" lng = gettext.translation(_DOMAIN, _LOCALEDIR, [language], fallback=True) builtins.__dict__["T"] = lng.gettext builtins.__dict__["TT"] = lambda x: str(x) # Use in text tables def list_languages(): """ Return sorted list of (lang-code, lang-string) pairs, representing the available languages. When any language file is found, the default tuple ('en', 'English') will be included. Otherwise an empty list is returned. """ # Find all the MO files. lst = [] for path in glob.glob(os.path.join(_LOCALEDIR, "*")): if os.path.isdir(path) and not path.endswith("en"): lngname = os.path.basename(path) lng = locale.normalize(lngname) # Example: 'pt_BR.ISO8859-1' lng_short = lng[: lng.find("_")] lng_full = lng[: lng.find(".")] # First try full language string, e.g. 'pt_BR' language = LanguageTable.get(lng_full, (lng_full, lng_full)) if language[0] == lng_full: # Full language string not defined: try short form, e.g. 'pt' language = LanguageTable.get(lng_short, (lng_short, lng_short)) lng = lng_short else: lng = lng_full language = language[1] lst.append((lng, language)) lst.append(("en", "English")) lst.sort() return lst LanguageTable = { "aa": ("Afar", "Afaraf", 0), "af": ("Afrikaans", "Afrikaans", 0), "ak": ("Akan", "Akan", 0), "sq": ("Albanian", "Shqip", 0), "an": ("Aragonese", "Aragonés", 0), "ae": ("Avestan", "Avesta", 0), "ay": ("Aymara", "Aymararu", 0), "bm": ("Bambara", "Bamanankan", 0), "eu": ("Basque", "Euskara", 0), "bi": ("Bislama", "Bislama", 0), "bs": ("Bosnian", "Bosanskijezik", 0), "br": ("Breton", "Brezhoneg", 0), "ca": ("Catalan", "Català", 0), "ch": ("Chamorro", "Chamoru", 0), "kw": ("Cornish", "Kernewek", 0), "co": ("Corsican", "Corsu", 0), "hr": ("Croatian", "Hrvatski", 0), "cs": ("Czech", "Cesky, ceÅ¡tina", 0), "da": ("Danish", "Dansk", 0), "nl": ("Dutch", "Nederlands", 0), "en": ("English", "English", 0), "eo": ("Esperanto", "Esperanto", 0), "et": ("Estonian", "Eesti", 0), "fo": ("Faroese", "Føroyskt", 0), "fj": ("Fijian", "Vosa Vakaviti", 0), "fi": ("Finnish", "Suomi", 0), "fr": ("French", "Français", 0), "gl": ("Galician", "Galego", 0), "de": ("German", "Deutsch", 0), "he": ("Hebrew", "עִבְרִית‎", 1255), "hz": ("Herero", "Otjiherero", 0), "ho": ("Hiri Motu", "Hiri Motu", 0), "hu": ("Hungarian", "Magyar", 0), "id": ("Indonesian", "Bahasa Indonesia", 0), "ga": ("Irish", "Gaeilge", 0), "io": ("Ido", "Ido", 0), "is": ("Icelandic", "Ãslenska", 0), "it": ("Italian", "Italiano", 0), "jv": ("Javanese", "BasaJawa", 0), "rw": ("Kinyarwanda", "Ikinyarwanda", 0), "kg": ("Kongo", "KiKongo", 0), "kj": ("Kwanyama", "Kuanyama", 0), "la": ("Latin", "Lingua latina", 0), "lb": ("Luxembourgish", "Lëtzebuergesch", 0), "lg": ("Luganda", "Luganda", 0), "li": ("Limburgish", "Limburgs", 0), "ln": ("Lingala", "Lingála", 0), "lt": ("Lithuanian", "Lietuviukalba", 0), "lv": ("Latvian", "LatvieÅ¡uvaloda", 0), "gv": ("Manx", "Gaelg", 0), "mg": ("Malagasy", "Malagasy fiteny", 0), "mt": ("Maltese", "Malti", 0), "nb": ("Norwegian BokmÃ¥l", "Norsk bokmÃ¥l", 0), "nn": ("Norwegian Nynorsk", "Norsk nynorsk", 0), "no": ("Norwegian", "Norsk", 0), "oc": ("Occitan", "Occitan", 0), "om": ("Oromo", "Afaan Oromoo", 0), "pl": ("Polish", "Polski", 0), "pt": ("Portuguese", "Português", 0), "pt_BR": ("Portuguese Brazillian", "Português Brasileiro", 0), "rm": ("Romansh", "Rumantsch grischun", 0), "rn": ("Kirundi", "kiRundi", 0), "ro": ("Romanian", "Româna", 1250), "sc": ("Sardinian", "Sardu", 0), "se": ("Northern Sami", "Davvisámegiella", 0), "sm": ("Samoan", "Gagana fa'a Samoa", 0), "gd": ("Gaelic", "Gàidhlig", 0), "ru": ("Russian", "руÑÑкий Ñзык", 1251), "sr": ("Serbian", "ÑрпÑки", 1251), "sn": ("Shona", "Chi Shona", 0), "sk": ("Slovak", "Slovencina", 0), "sl": ("Slovene", "SlovenÅ¡cina", 0), "st": ("Southern Sotho", "Sesotho", 0), "es": ("Spanish Castilian", "Español, castellano", 0), "su": ("Sundanese", "Basa Sunda", 0), "sw": ("Swahili", "Kiswahili", 0), "ss": ("Swati", "SiSwati", 0), "sv": ("Swedish", "Svenska", 0), "tn": ("Tswana", "Setswana", 0), "to": ("Tonga (Tonga Islands)", "faka Tonga", 0), "tr": ("Turkish", "Türkçe", 0), "ts": ("Tsonga", "Xitsonga", 0), "tw": ("Twi", "Twi", 0), "ty": ("Tahitian", "Reo Tahiti", 0), "wa": ("Walloon", "Walon", 0), "cy": ("Welsh", "Cymraeg", 0), "wo": ("Wolof", "Wollof", 0), "fy": ("Western Frisian", "Frysk", 0), "xh": ("Xhosa", "isi Xhosa", 0), "yo": ("Yoruba", "Yorùbá", 0), "zu": ("Zulu", "isi Zulu", 0), "zh_CN": ("SimpChinese", "简体中文", 936), } # Setup a safe null-translation set_language() sabnzbd-develop/sabnzbd/zconfig.py0000600000175000017500000000736113642116632015400 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.zconfig - bonjour/zeroconfig support """ import os import logging _HOST_PORT = (None, None) try: from sabnzbd.utils import pybonjour from threading import Thread _HAVE_BONJOUR = True except: _HAVE_BONJOUR = False import sabnzbd import sabnzbd.cfg as cfg from sabnzbd.misc import match_str _BONJOUR_OBJECT = None def hostname(): """ Return host's pretty name """ if sabnzbd.WIN32: return os.environ.get('computername', 'unknown') try: return os.uname()[1] except: return 'unknown' def _zeroconf_callback(sdRef, flags, errorCode, name, regtype, domain): logging.debug('Full Bonjour-callback sdRef=%s, flags=%s, errorCode=%s, name=%s, regtype=%s, domain=%s', sdRef, flags, errorCode, name, regtype, domain) if errorCode == pybonjour.kDNSServiceErr_NoError: logging.info('Registered in Bonjour as "%s" (%s)', name, domain) def set_bonjour(host=None, port=None): """ Publish host/port combo through Bonjour """ global _HOST_PORT, _BONJOUR_OBJECT if not _HAVE_BONJOUR or not cfg.enable_bonjour(): logging.info('No Bonjour/ZeroConfig support installed') return if host is None and port is None: host, port = _HOST_PORT else: _HOST_PORT = (host, port) scope = pybonjour.kDNSServiceInterfaceIndexAny zhost = None domain = None if match_str(host, ('localhost', '127.0.', '::1')): logging.info('Bonjour/ZeroConfig does not support "localhost"') # All implementations fail to implement "localhost" properly # A false address is published even when scope==kDNSServiceInterfaceIndexLocalOnly return name = hostname() logging.debug('Try to publish in Bonjour as "%s" (%s:%s)', name, host, port) try: refObject = pybonjour.DNSServiceRegister( interfaceIndex=scope, name='SABnzbd on %s:%s' % (name, port), regtype='_http._tcp', domain=domain, host=zhost, port=int(port), txtRecord=pybonjour.TXTRecord({'path': cfg.url_base(), 'https': cfg.enable_https()}), callBack=_zeroconf_callback) except sabnzbd.utils.pybonjour.BonjourError as e: _BONJOUR_OBJECT = None logging.debug('Failed to start Bonjour service: %s', str(e)) except: _BONJOUR_OBJECT = None logging.debug('Failed to start Bonjour service due to non-pybonjour related problem', exc_info=True) else: Thread(target=_bonjour_server, args=(refObject,)) _BONJOUR_OBJECT = refObject logging.debug('Successfully started Bonjour service') def _bonjour_server(refObject): while 1: pybonjour.DNSServiceProcessResult(refObject) logging.debug('GOT A BONJOUR CALL') def remove_server(): """ Remove Bonjour registration """ global _BONJOUR_OBJECT if _BONJOUR_OBJECT: _BONJOUR_OBJECT.close() _BONJOUR_OBJECT = None sabnzbd-develop/tests/0000700000175000017500000000000013642116632013075 5ustar jpjpsabnzbd-develop/tests/test_newsunpack.py0000600000175000017500000000315413642116632016671 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_newsunpack - Tests of various functions in newspack """ import pytest from sabnzbd.newsunpack import * class TestNewsUnpack: @pytest.mark.parametrize( "test_input, expected_output", [ (["cmd1", 9, "cmd3"], '"cmd1" "9" "cmd3"'), # sending all commands as valid string (["", "cmd1", "5"], '"" "cmd1" "5"'), # sending blank string (["cmd1", None, "cmd3", "tail -f"], '"cmd1" "" "cmd3" "tail -f"'), # sending None in command (["cmd1", 0, "ps ux"], '"cmd1" "" "ps ux"'), # sending 0 ], ) def test_list_to_cmd(self, test_input, expected_output): """ Test to convert list to a cmd.exe-compatible command string """ res = list2cmdline(test_input) # Make sure the output is cmd.exe-compatible assert res == expected_output sabnzbd-develop/tests/test_encoding.py0000600000175000017500000000230413642116632016275 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_misc - Testing functions in encoding.py """ import sabnzbd.encoding as enc class TestEncoding: def test_correct_unknown_encoding(self): # Windows encoding in bytes assert "frènch_german_demö" == enc.correct_unknown_encoding(b"fr\xe8nch_german_dem\xf6") # Windows encoding in string that's already UTF8 assert "demotöwers" == enc.correct_unknown_encoding("demot\udcf6wers") sabnzbd-develop/tests/test_functional_downloads.py0000600000175000017500000001406013642116632020725 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_functional_downloads - Test the downloading flow """ import random from selenium.common.exceptions import NoSuchElementException from tests.testhelper import * @pytest.mark.skipif("SAB_NEWSSERVER_HOST" not in os.environ, reason="Test-server not specified") class SABnzbdDownloadFlow(SABnzbdBaseTest): def is_server_configured(self): """ Check if the wizard was already performed. If not: run the wizard! """ with open(os.path.join(SAB_CACHE_DIR, "sabnzbd.ini"), "r") as config_file: if self.newsserver_host not in config_file.read(): self.start_wizard() def start_wizard(self): # Language-selection self.open_page("http://%s:%s/sabnzbd/wizard/" % (SAB_HOST, SAB_PORT)) self.driver.find_element_by_id("en").click() self.driver.find_element_by_css_selector(".btn.btn-default").click() # Fill server-info self.no_page_crash() host_inp = self.driver.find_element_by_name("host") host_inp.clear() host_inp.send_keys(self.newsserver_host) username_imp = self.driver.find_element_by_name("username") username_imp.clear() username_imp.send_keys(self.newsserver_user) pass_inp = self.driver.find_element_by_name("password") pass_inp.clear() pass_inp.send_keys(self.newsserver_password) # With SSL ssl_imp = self.driver.find_element_by_name("ssl") if not ssl_imp.get_attribute("checked"): ssl_imp.click() # This will fail if the translations failed to compile! self.driver.find_element_by_partial_link_text("Advanced Settings").click() # Lower number of connections to prevent testing errors pass_inp = self.driver.find_element_by_name("connections") pass_inp.clear() pass_inp.send_keys(2) # Test server-check self.driver.find_element_by_id("serverTest").click() self.wait_for_ajax() self.assertIn("Connection Successful", self.driver.find_element_by_id("serverResponse").text) # Final page done self.driver.find_element_by_id("next-button").click() self.no_page_crash() check_result = self.driver.find_element_by_class_name("quoteBlock").text assert "http://%s:%s/sabnzbd" % (SAB_HOST, SAB_PORT) in check_result # Go to SAB! self.driver.find_element_by_css_selector(".btn.btn-success").click() self.no_page_crash() def add_nzb_from_url(self, file_url, file_output): test_job_name = "testfile_%s" % random.randint(500, 1000) self.open_page("http://%s:%s/sabnzbd/" % (SAB_HOST, SAB_PORT)) # Wait for modal to open, add URL self.driver.find_element_by_css_selector('a[href="#modal-add-nzb"]').click() time.sleep(1) self.driver.find_element_by_name("nzbURL").send_keys(file_url) self.driver.find_element_by_name("nzbname").send_keys(test_job_name) self.driver.find_element_by_css_selector('form[data-bind="submit: addNZBFromURL"] input[type="submit"]').click() # We wait for 30 seconds to let it complete for _ in range(120): try: # Locate resulting row result_row = self.driver.find_element_by_xpath( '//*[@id="history-tab"]//tr[td//text()[contains(., "%s")]]' % test_job_name ) # Did it complete? if result_row.find_element_by_css_selector("td.status").text == "Completed": break else: time.sleep(1) except NoSuchElementException: time.sleep(1) else: self.fail("Download did not complete") # Check if the file exists on disk file_to_find = os.path.join(SAB_COMPLETE_DIR, test_job_name, file_output) self.assertTrue(os.path.exists(file_to_find), "File not found") # Shutil can't handle unicode, need to remove the file here os.remove(file_to_find) def test_download_basic_rar5(self): self.is_server_configured() self.add_nzb_from_url("http://sabnzbd.org/tests/basic_rar5.nzb", "testfile.bin") def test_download_unicode_rar(self): self.is_server_configured() self.add_nzb_from_url("http://sabnzbd.org/tests/unicode_rar.nzb", "\u4f60\u597d\u4e16\u754c.bin") def test_download_win_unicode(self): self.is_server_configured() self.add_nzb_from_url("http://sabnzbd.org/tests/test_win_unicode.nzb", "frènch_german_demö") def test_download_passworded(self): self.is_server_configured() self.add_nzb_from_url("https://sabnzbd.org/tests/test_passworded%7B%7Bsecret%7D%7D.nzb", "random-1MB.bin") def test_download_zip(self): self.is_server_configured() self.add_nzb_from_url("https://sabnzbd.org/tests/test_zip.nzb", "testfile.bin") def test_download_sfv_check(self): self.is_server_configured() self.add_nzb_from_url("https://sabnzbd.org/tests/test_sfv_check.nzb", "blabla.bin") @pytest.mark.skip(reason="Fails due to wrong par2-renaming. Needs fixing.") def test_download_win_unicode(self): self.is_server_configured() self.add_nzb_from_url("http://sabnzbd.org/tests/unicode_rar_broken.nzb", "\u4f60\u597d\u4e16\u754c.bin") sabnzbd-develop/tests/test_win_utils.py0000600000175000017500000000463313642116632016533 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_win_utils - Testing mailslot communiction on Windows """ import subprocess import sys import time import pytest if not sys.platform.startswith("win"): pytest.skip("Skipping Windows-only tests", allow_module_level=True) import util.apireg as ar class TestMailslot: def test_mailslot_basic(self): """ Do the basic testing provided by the module """ # Start async both processes server_p = subprocess.Popen([sys.executable, "util/mailslot.py", "server"], stdout=subprocess.PIPE) # Need to pause to give server time to listen time.sleep(0.5) client_p = subprocess.Popen([sys.executable, "util/mailslot.py", "client"], stdout=subprocess.PIPE) # Server outputs basic response assert server_p.stdout.readlines() == [ b"restart\r\n", b"restart\r\n", b"restart\r\n", b"restart\r\n", b"restart\r\n", b"stop\r\n", ] # Client outputs nothing assert not client_p.stdout.readlines() class TestAPIReg: def test_set_get_connection_info_user(self): """ Test the saving of the URL in USER-registery We can't test the SYSTEM one. """ test_url = "sab_test:8080" ar.set_connection_info(test_url, True) assert ar.get_connection_info(True) == test_url assert not ar.get_connection_info(False) # Remove and check if gone ar.del_connection_info(True) assert not ar.get_connection_info(True) def test_get_install_lng(self): """ Not much to test yet.. """ assert ar.get_install_lng() == "en" sabnzbd-develop/tests/__init__.py0000600000175000017500000000004413642116632015206 0ustar jpjp# Needed for correct test-detection sabnzbd-develop/tests/test_functional_misc.py0000600000175000017500000001375613642116632017701 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_functional_misc - Functional tests of various functions """ import shutil import subprocess import sys import sabnzbd.encoding from tests.testhelper import * class SABnzbdShowLoggingTest(SABnzbdBaseTest): def test_showlog(self): """ Test the output of the filtered-log button """ # Basic URL-fetching, easier than Selenium file download log_result = get_url_result("status/showlog") # Make sure it has basic log stuff assert "The log" in log_result assert "Full executable path" in log_result # Make sure sabnzbd.ini was appended assert "__encoding__ = utf-8" in log_result assert "[misc]" in log_result class TestSamplePostProc: def test_sample_post_proc(self): """ Make sure we don't break things """ # Set parameters script_params = [ "somedir222", "nzbname", "frènch_german_demö", "Index12", "Cat88", "MyGroup", "PP0", "https://example.com/", ] script_call = [sys.executable, "scripts/Sample-PostProc.py", "server"] script_call.extend(script_params) # Set parameters via env env = os.environ.copy() env["SAB_VERSION"] = "frènch_german_demö_version" # Run script and check output script_call = subprocess.Popen(script_call, stdout=subprocess.PIPE, env=env) script_output, errs = script_call.communicate(timeout=15) # This is a bit bad, since we use our own function # But in a way it is also a test if the function does its job! script_output = sabnzbd.encoding.platform_btou(script_output) # Check if all parameters are there for param in script_params: assert param in script_output assert env["SAB_VERSION"] in script_output class TestExtractPot: def test_extract_pot(self): """ Simple test if translation extraction still works """ script_call = [sys.executable, "tools/extract_pot.py"] # Run script and check output script_call = subprocess.Popen(script_call, stdout=subprocess.PIPE) script_output, errs = script_call.communicate(timeout=15) script_output = sabnzbd.encoding.platform_btou(script_output) # Success message? assert "Creating POT file" in script_output assert "Finished creating POT file" in script_output assert "Post-process POT file" in script_output assert "Finished post-process POT file" in script_output assert "Creating email POT file" in script_output assert "Finished creating email POT file" in script_output # Check if the file was modified less than 30 seconds ago cur_time = time.time() assert (cur_time - os.path.getmtime("po/main/SABnzbd.pot")) < 30 assert (cur_time - os.path.getmtime("po/email/SABemail.pot")) < 30 @pytest.mark.skipif(sys.platform.startswith("win"), reason="Skipping on Windows") @pytest.mark.skipif(sys.platform.startswith("darwin"), reason="Fails for now due to PyObjC problem") class TestDaemonizing(SABnzbdBaseTest): def test_daemonizing(self): """ Simple test to see if daemon-mode still works. Also test removal of large "sabnzbd.error.log" We inherit from SABnzbdBaseTest so we can use it's clean-up logic! """ daemon_host = "localhost" daemon_port = 23456 ini_location = os.path.join(SAB_CACHE_DIR, "daemon_test") # Create large output-file error_log_path = os.path.join(ini_location, sabnzbd.cfg.log_dir(), sabnzbd.constants.DEF_LOG_ERRFILE) os.makedirs(os.path.dirname(error_log_path), exist_ok=True) with open(error_log_path, "wb") as large_log: large_log.seek(6 * 1024 * 1024) large_log.write(b"\1") # We need the basic-config to set the API-key # Otherwise we can't shut it down at the end shutil.copyfile(os.path.join(SAB_BASE_DIR, "sabnzbd.basic.ini"), os.path.join(ini_location, "sabnzbd.ini")) # Combine it all into the script call script_call = [ sys.executable, "SABnzbd.py", "-d", "-s", "%s:%s" % (daemon_host, daemon_port), "-f", ini_location, "--pid", ini_location, ] # Run script and check output script_call = subprocess.Popen(script_call, stdout=subprocess.PIPE) script_output, errs = script_call.communicate(timeout=15) # No error or output should be thrown by main process assert not script_output assert not errs # It should be online after 3 seconds time.sleep(3.0) assert "version" in get_api_result("version", daemon_host, daemon_port) # Did it create the PID file pid_file = os.path.join(ini_location, "sabnzbd-%d.pid" % daemon_port) assert os.path.exists(pid_file) # Did it remove the bad log file? assert os.path.exists(error_log_path) assert os.path.getsize(error_log_path) < 1024 # Let's shut it down and give it some time to do so get_url_result("shutdown", daemon_host, daemon_port) time.sleep(3.0) sabnzbd-develop/tests/sabnzbd.basic.ini0000600000175000017500000000007513642116632016305 0ustar jpjp__version__ = 19 __encoding__ = utf-8 [misc] api_key = apikeysabnzbd-develop/tests/test_misc.py0000600000175000017500000002022613642116632015445 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_misc - Testing functions in misc.py """ import datetime from sabnzbd import lang from sabnzbd import misc from sabnzbd.config import ConfigCat from tests.testhelper import * class TestMisc: def assertTime(self, offset, age): assert offset == misc.calc_age(age, trans=True) assert offset == misc.calc_age(age, trans=False) def test_timeformat24h(self): assert "%H:%M:%S" == misc.time_format("%H:%M:%S") assert "%H:%M" == misc.time_format("%H:%M") @set_config({"ampm": True}) def test_timeformatampm(self): misc.HAVE_AMPM = True assert "%I:%M:%S %p" == misc.time_format("%H:%M:%S") assert "%I:%M %p" == misc.time_format("%H:%M") def test_calc_age(self): date = datetime.datetime.now() m = date - datetime.timedelta(minutes=1) h = date - datetime.timedelta(hours=1) d = date - datetime.timedelta(days=1) self.assertTime("1m", m) self.assertTime("1h", h) self.assertTime("1d", d) def test_monthrange(self): # Dynamic dates would be a problem assert 12 == len(list(misc.monthrange(datetime.date(2018, 1, 1), datetime.date(2018, 12, 31)))) assert 2 == len(list(misc.monthrange(datetime.date(2019, 1, 1), datetime.date(2019, 2, 1)))) def test_safe_lower(self): assert "all caps" == misc.safe_lower("ALL CAPS") assert "" == misc.safe_lower(None) def test_cmp(self): assert misc.cmp(1, 2) < 0 assert misc.cmp(2, 1) > 0 assert misc.cmp(1, 1) == 0 def test_cat_to_opts(self): # Need to create the Default category # Otherwise it will try to save the config ConfigCat("*", {}) assert ("*", "", "Default", -100) == misc.cat_to_opts("*") assert ("*", "", "Default", -100) == misc.cat_to_opts("Nonsense") assert ("*", 1, "Default", -100) == misc.cat_to_opts("*", pp=1) assert ("*", 1, "test.py", -100) == misc.cat_to_opts("*", pp=1, script="test.py") def test_wildcard_to_re(self): assert "\\\\\\^\\$\\.\\[" == misc.wildcard_to_re("\\^$.[") assert "\\]\\(\\)\\+.\\|\\{\\}.*" == misc.wildcard_to_re("]()+?|{}*") def test_cat_convert(self): # TODO: Make test pass def test_convert_version(self): assert (3010099, False) == misc.convert_version("3.1.0") assert (3010099, False) == misc.convert_version("3.1.0BlaBla") assert (3010001, True) == misc.convert_version("3.1.0Alpha1") assert (3010041, True) == misc.convert_version("3.1.0Beta1") assert (3010081, True) == misc.convert_version("3.1.0RC1") assert (3010194, True) == misc.convert_version("3.1.1RC14") def test_from_units(self): assert 100.0 == misc.from_units("100") assert 1024.0 == misc.from_units("1KB") assert 1048576.0 == misc.from_units("1024KB") assert 1048576.0 == misc.from_units("1024Kb") assert 1048576.0 == misc.from_units("1024kB") assert 1048576.0 == misc.from_units("1MB") assert 1073741824.0 == misc.from_units("1GB") assert 1125899906842624.0 == misc.from_units("1P") def test_to_units(self): assert "1 K" == misc.to_units(1024) assert "1 KBla" == misc.to_units(1024, postfix="Bla") assert "1.0 M" == misc.to_units(1024 * 1024) assert "1.0 M" == misc.to_units(1024 * 1024 + 10) assert "10.0 M" == misc.to_units(1024 * 1024 * 10) assert "100.0 M" == misc.to_units(1024 * 1024 * 100) assert "9.8 G" == misc.to_units(1024 * 1024 * 10000) assert "1024.0 P" == misc.to_units(1024 ** 6) def test_unit_back_and_forth(self): assert 100 == misc.from_units(misc.to_units(100)) assert 1024 == misc.from_units(misc.to_units(1024)) assert 1024 ** 3 == misc.from_units(misc.to_units(1024 ** 3)) def test_caller_name(self): @set_config({"log_level": 0}) def test_wrapper(skip): return misc.caller_name(skip=skip) @set_config({"log_level": 2}) def test_wrapper_2(skip): return misc.caller_name(skip=skip) # No logging on lower-level assert "N/A" == test_wrapper(1) assert "N/A" == test_wrapper(2) assert "N/A" == test_wrapper(3) # Wrappers originate from the set_config-wrapper assert "test_wrapper_2" in test_wrapper_2(1) assert "wrapper_func" in test_wrapper_2(2) def test_split_host(self): assert (None, None) == misc.split_host(None) assert (None, None) == misc.split_host("") assert ("sabnzbd.org", 123) == misc.split_host("sabnzbd.org:123") assert ("sabnzbd.org", None) == misc.split_host("sabnzbd.org") assert ("127.0.0.1", 566) == misc.split_host("127.0.0.1:566") assert ("[::1]", 1234) == misc.split_host("[::1]:1234") assert ("[2001:db8::8080]", None) == misc.split_host("[2001:db8::8080]") @set_config({"cleanup_list": [".exe", ".nzb"]}) def test_on_cleanup_list(self): assert misc.on_cleanup_list("test.exe") assert misc.on_cleanup_list("TEST.EXE") assert misc.on_cleanup_list("longExeFIlanam.EXe") assert not misc.on_cleanup_list("testexe") assert misc.on_cleanup_list("test.nzb") assert not misc.on_cleanup_list("test.nzb", skip_nzb=True) assert not misc.on_cleanup_list("test.exe.lnk") def test_format_time_string(self): assert "0 seconds" == misc.format_time_string(None) assert "0 seconds" == misc.format_time_string("Test") assert "0 seconds" == misc.format_time_string(0) assert "1 sec" == misc.format_time_string(1) assert "10 seconds" == misc.format_time_string(10) assert "1 min" == misc.format_time_string(60) assert "1 hour 1 min 1 sec" == misc.format_time_string(60 * 60 + 60 + 1) assert "1 day 59 seconds" == misc.format_time_string(86400 + 59) assert "2 days 2 hours 2 seconds" == misc.format_time_string(2 * 86400 + 2 * 60 * 60 + 2) def test_format_time_string_locale(self): # Have to set the languages, if it was compiled locale_dir = os.path.join(SAB_BASE_DIR, "..", sabnzbd.constants.DEF_LANGUAGE) if not os.path.exists(locale_dir): pytest.mark.skip("No language files compiled") lang.set_locale_info("SABnzbd", locale_dir) lang.set_language("de") assert "1 Sekunde" == misc.format_time_string(1) assert "10 Sekunden" == misc.format_time_string(10) assert "1 Minuten" == misc.format_time_string(60) assert "1 Stunde 1 Minuten 1 Sekunde" == misc.format_time_string(60 * 60 + 60 + 1) assert "1 Tag 59 Sekunden" == misc.format_time_string(86400 + 59) assert "2 Tage 2 Stunden 2 Sekunden" == misc.format_time_string(2 * 86400 + 2 * 60 * 60 + 2) def test_int_conv(self): assert 0 == misc.int_conv("0") assert 10 == misc.int_conv("10") assert 10 == misc.int_conv(10) assert 10 == misc.int_conv(10.0) assert 0 == misc.int_conv(None) assert 1 == misc.int_conv(True) assert 0 == misc.int_conv(object) def test_create_https_certificates(self): cert_file = "test.cert" key_file = "test.key" assert misc.create_https_certificates(cert_file, key_file) assert os.path.exists(cert_file) assert os.path.exists(key_file) # Remove files os.unlink("test.cert") os.unlink("test.key") sabnzbd-develop/tests/test_getipaddress.py0000600000175000017500000000305213642116632017166 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_utils.test_check_dir - Testing SABnzbd checkdir util """ from sabnzbd.cfg import selftest_host from sabnzbd.getipaddress import * from sabnzbd.misc import probablyipv4, probablyipv6 class TestGetIpAddress: def test_addresslookup4(self): address = addresslookup4(selftest_host()) assert address for item in address: assert isinstance(item[0], type(socket.AF_INET)) def test_publicipv4(self): public_ipv4 = publicipv4() assert probablyipv4(public_ipv4) def test_localipv4(self): local_ipv4 = localipv4() assert probablyipv4(local_ipv4) def test_ipv6(self): test_ipv6 = ipv6() # Not all systems have IPv6 if test_ipv6: assert probablyipv6(test_ipv6) sabnzbd-develop/tests/conftest.py0000600000175000017500000000556213642116632015306 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.conftest - Setup pytest fixtures These have to be separate otherwise SABnzbd is started multiple times! """ import shutil import subprocess import sys from tests.testhelper import * @pytest.fixture(scope="session") def start_sabnzbd(): # Remove cache if already there if os.path.isdir(SAB_CACHE_DIR): shutil.rmtree(SAB_CACHE_DIR) # Copy basic config file with API key os.makedirs(SAB_CACHE_DIR, exist_ok=True) shutil.copyfile(os.path.join(SAB_BASE_DIR, "sabnzbd.basic.ini"), os.path.join(SAB_CACHE_DIR, "sabnzbd.ini")) # Check if we have language files if not os.path.exists(os.path.join(SAB_BASE_DIR, "..", "locale")): # Compile and wait to complete lang_command = "%s %s/../tools/make_mo.py" % (sys.executable, SAB_BASE_DIR) subprocess.Popen(lang_command.split()).communicate(timeout=30) # Check if it exists now, fail otherwise if not os.path.exists(os.path.join(SAB_BASE_DIR, "..", "locale")): raise FileNotFoundError("Failed to compile language files") # Start SABnzbd and continue sab_command = "%s %s/../SABnzbd.py --new -l2 -s %s:%s -b0 -f %s" % ( sys.executable, SAB_BASE_DIR, SAB_HOST, SAB_PORT, SAB_CACHE_DIR, ) subprocess.Popen(sab_command.split()) # Wait for SAB to respond for _ in range(10): try: get_url_result() # Woohoo, we're up! break except requests.ConnectionError: time.sleep(1) else: # Make sure we clean up shutdown_sabnzbd() raise requests.ConnectionError() # How we run the tests yield True # Shutdown SABnzbd gracefully shutdown_sabnzbd() def shutdown_sabnzbd(): # Graceful shutdown request try: get_url_result("shutdown") except requests.ConnectionError: pass # Takes a second to shutdown for x in range(10): try: shutil.rmtree(SAB_CACHE_DIR) break except OSError: print("Unable to remove cache dir (try %d)" % x) time.sleep(1) sabnzbd-develop/tests/test_functional_config.py0000600000175000017500000003071313642116632020203 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_functional_config - Basic testing if Config pages work """ from selenium.common.exceptions import NoSuchElementException, UnexpectedAlertPresentException, NoAlertPresentException from tests.testhelper import * class SABnzbdBasicPagesTest(SABnzbdBaseTest): def test_base_pages(self): # Quick-check of all Config pages test_urls = ["config", "config/server", "config/categories", "config/scheduling", "config/rss"] for test_url in test_urls: self.open_page("http://%s:%s/%s" % (SAB_HOST, SAB_PORT, test_url)) def test_base_submit_pages(self): test_urls_with_submit = [ "config/general", "config/folders", "config/switches", "config/sorting", "config/notify", "config/special", ] for test_url in test_urls_with_submit: self.open_page("http://%s:%s/%s" % (SAB_HOST, SAB_PORT, test_url)) # Can only click the visible buttons submit_btns = self.driver.find_elements_by_class_name("saveButton") for submit_btn in submit_btns: if submit_btn.is_displayed(): break else: raise NoSuchElementException # Click the right button submit_btn.click() try: self.wait_for_ajax() except UnexpectedAlertPresentException: try: # Ignore restart-request due to empty sabnzbd.ini in tests self.driver.switch_to.alert.dismiss() except NoAlertPresentException: pass # For Specials page we get redirected after save, so check for no crash if "special" in test_url: self.no_page_crash() else: # For others if all is fine, button will be back to normal in 1 second time.sleep(1.0) assert submit_btn.text == "Save Changes" class SABnzbdConfigLogin(SABnzbdBaseTest): def test_login(self): # Test if base page works self.open_page("http://%s:%s/sabnzbd/config/general" % (SAB_HOST, SAB_PORT)) # Set the username and password username_imp = self.driver.find_element_by_css_selector("input[data-hide='username']") username_imp.clear() username_imp.send_keys("test_username") pass_inp = self.driver.find_element_by_css_selector("input[data-hide='password']") pass_inp.clear() pass_inp.send_keys("test_password") # Submit and ignore alert self.driver.find_element_by_class_name("saveButton").click() try: self.wait_for_ajax() except UnexpectedAlertPresentException: try: # Ignore restart-request self.driver.switch_to.alert.dismiss() except NoAlertPresentException: pass # Open any page and check if we get redirected self.open_page("http://%s:%s/sabnzbd/general" % (SAB_HOST, SAB_PORT)) assert "/login/" in self.driver.current_url # Fill nonsense and submit username_login = self.driver.find_element_by_css_selector("input[name='username']") username_login.clear() username_login.send_keys("nonsense") pass_login = self.driver.find_element_by_css_selector("input[name='password']") pass_login.clear() pass_login.send_keys("nonsense") self.driver.find_element_by_tag_name("button").click() # Check if we were denied assert "Authentication failed" in self.driver.find_element_by_class_name("alert-danger").text # Fill right stuff username_login = self.driver.find_element_by_css_selector("input[name='username']") username_login.clear() username_login.send_keys("test_username") pass_login = self.driver.find_element_by_css_selector("input[name='password']") pass_login.clear() pass_login.send_keys("test_password") self.driver.find_element_by_tag_name("button").click() # Can we now go to the page and empty the settings again? self.open_page("http://%s:%s/sabnzbd/config/general" % (SAB_HOST, SAB_PORT)) assert "/login/" not in self.driver.current_url # Set the username and password username_imp = self.driver.find_element_by_css_selector("input[data-hide='username']") username_imp.clear() pass_inp = self.driver.find_element_by_css_selector("input[data-hide='password']") pass_inp.clear() # Submit and ignore alert self.driver.find_element_by_class_name("saveButton").click() try: self.wait_for_ajax() except UnexpectedAlertPresentException: try: # Ignore restart-request self.driver.switch_to.alert.dismiss() except NoAlertPresentException: pass # Open any page and check if we get redirected self.open_page("http://%s:%s/sabnzbd/general" % (SAB_HOST, SAB_PORT)) assert "/login/" not in self.driver.current_url class SABnzbdConfigCategories(SABnzbdBaseTest): category_name = "testCat" def test_page(self): # Test if base page works self.open_page("http://%s:%s/sabnzbd/config/categories" % (SAB_HOST, SAB_PORT)) # Add new category self.driver.find_elements_by_name("newname")[1].send_keys("testCat") self.driver.find_element_by_xpath("//button/text()[normalize-space(.)='Add']/parent::*").click() self.no_page_crash() self.assertNotIn(self.category_name, self.driver.page_source) class SABnzbdConfigRSS(SABnzbdBaseTest): rss_url = "https://sabnzbd.org/tests/rss_feed_test.xml" rss_name = "_SeleniumFeed" def test_rss_basic_flow(self): # Test if base page works self.open_page("http://%s:%s/sabnzbd/config/rss" % (SAB_HOST, SAB_PORT)) # Uncheck enabled-checkbox for new feeds self.driver.find_element_by_xpath('//form[@action="add_rss_feed"]//input[@name="enable"]').click() input_name = self.driver.find_element_by_xpath('//form[@action="add_rss_feed"]//input[@name="feed"]') input_name.clear() input_name.send_keys(self.rss_name) self.driver.find_element_by_xpath('//form[@action="add_rss_feed"]//input[@name="uri"]').send_keys(self.rss_url) self.driver.find_element_by_xpath('//form[@action="add_rss_feed"]//button').click() # Check if we have results tab_results = int(self.driver.find_element_by_xpath('//a[@href="#rss-tab-matched"]/span').text) assert tab_results > 0 # Check if it matches the number of rows tab_table_results = len(self.driver.find_elements_by_xpath('//div[@id="rss-tab-matched"]/table/tbody/tr')) assert tab_table_results == tab_results # Pause the queue do we don't download stuff assert get_api_result("pause") == {"status": True} # Download something download_btn = self.driver.find_element_by_xpath('//div[@id="rss-tab-matched"]/table/tbody//button') download_btn.click() self.wait_for_ajax() # Does the page think it's a success? assert "Added NZB" in download_btn.text # Let's check the queue queue_result_slots = get_api_result("queue")["queue"]["slots"] assert len(queue_result_slots) == 1 # Let's remove this thing get_api_result("queue", extra_arguments={"name": "delete", "value": queue_result_slots[0]["nzo_id"]}) queue_result_slots = get_api_result("queue")["queue"]["slots"] assert len(queue_result_slots) == 0 # Unpause assert get_api_result("resume") == {"status": True} @pytest.mark.skipif("SAB_NEWSSERVER_HOST" not in os.environ, reason="Test-server not specified") class SABnzbdConfigServers(SABnzbdBaseTest): server_name = "_SeleniumServer" def open_config_servers(self): # Test if base page works self.open_page("http://%s:%s/sabnzbd/config/server" % (SAB_HOST, SAB_PORT)) self.scroll_to_top() # Show advanced options advanced_btn = self.driver.find_element_by_name("advanced-settings-button") if not advanced_btn.get_attribute("checked"): advanced_btn.click() def add_test_server(self): # Add server self.driver.find_element_by_id("addServerButton").click() host_inp = self.driver.find_element_by_name("host") host_inp.clear() host_inp.send_keys(self.newsserver_host) username_imp = self.driver.find_element_by_css_selector("#addServerContent input[data-hide='username']") username_imp.clear() username_imp.send_keys(self.newsserver_user) pass_inp = self.driver.find_element_by_css_selector("#addServerContent input[data-hide='password']") pass_inp.clear() pass_inp.send_keys(self.newsserver_password) # With SSL ssl_imp = self.driver.find_element_by_name("ssl") if not ssl_imp.get_attribute("checked"): ssl_imp.click() # Check that we filled the right port automatically self.assertEqual(self.driver.find_element_by_id("port").get_attribute("value"), "563") # Test server-check self.driver.find_element_by_css_selector("#addServerContent .testServer").click() self.wait_for_ajax() check_result = self.driver.find_element_by_css_selector("#addServerContent .result-box").text assert "Connection Successful" in check_result # Set test-servername self.driver.find_element_by_id("displayname").send_keys(self.server_name) # Add and show details pass_inp.send_keys(Keys.RETURN) time.sleep(1) if not self.driver.find_element_by_id("host0").is_displayed(): self.driver.find_element_by_class_name("showserver").click() def remove_server(self): # Remove the first server and accept the confirmation self.driver.find_element_by_class_name("delServer").click() self.driver.switch_to.alert.accept() # Check that it's gone time.sleep(2) self.assertNotIn(self.server_name, self.driver.page_source) def test_add_and_remove_server(self): self.open_config_servers() self.add_test_server() self.remove_server() def test_empty_bad_password(self): self.open_config_servers() self.add_test_server() # Test server-check with empty password pass_inp = self.driver.find_elements_by_css_selector("input[data-hide='password']")[1] pass_inp.clear() self.driver.find_elements_by_css_selector(".testServer")[1].click() self.wait_for_ajax() check_result = self.driver.find_elements_by_css_selector(".result-box")[1].text.lower() assert "authentication failed" in check_result or "invalid username or password" in check_result # Test server-check with bad password pass_inp.send_keys("bad") self.driver.find_elements_by_css_selector(".testServer")[1].click() self.wait_for_ajax() check_result = self.driver.find_elements_by_css_selector(".result-box")[1].text.lower() assert "authentication failed" in check_result or "invalid username or password" in check_result # Test no username and password pass_inp.clear() username_inp = self.driver.find_elements_by_css_selector("input[data-hide='username']")[1] username_inp.clear() self.driver.find_elements_by_css_selector(".testServer")[1].click() self.wait_for_ajax() check_result = self.driver.find_elements_by_css_selector(".result-box")[1].text.lower() assert "server requires username and password" in check_result # Finish self.remove_server() sabnzbd-develop/tests/requirements.txt0000600000175000017500000000015313642116632016362 0ustar jpjp# Testing requirements selenium requests pytest # Only works on Python 3.6+ black; python_version >= "3.6"sabnzbd-develop/tests/test_filesystem.py0000600000175000017500000000703313642116632016677 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_misc - Testing functions in filesystem.py """ import sabnzbd.filesystem as filesystem from tests.testhelper import * class TestFileFolderNameSanitizer: def test_empty(self): assert filesystem.sanitize_filename(None) is None assert filesystem.sanitize_foldername(None) is None @set_platform("win32") def test_colon_handling_windows(self): assert filesystem.sanitize_filename("test:aftertest") == "test-aftertest" # They should act the same assert filesystem.sanitize_filename("test:aftertest") == filesystem.sanitize_foldername("test:aftertest") # TODO: Add a lot more tests here! @set_platform("darwin") def test_colon_handling_darwin(self): assert filesystem.sanitize_filename("test:aftertest") == "aftertest" @set_platform("linux") def test_colon_handling_other(self): assert filesystem.sanitize_filename("test:aftertest") == "test:aftertest" @set_platform("win32") def test_win_devices_on_win(self): assert filesystem.sanitize_filename(None) is None assert filesystem.sanitize_filename("aux.txt") == "_aux.txt" assert filesystem.sanitize_filename("txt.aux") == "txt.aux" assert filesystem.sanitize_filename("$mft") == "Smft" assert filesystem.sanitize_filename("a$mft") == "a$mft" @set_platform("linux") def test_win_devices_not_win(self): # Linux and Darwin are the same for this assert filesystem.sanitize_filename(None) is None assert filesystem.sanitize_filename("aux.txt") == "aux.txt" assert filesystem.sanitize_filename("txt.aux") == "txt.aux" assert filesystem.sanitize_filename("$mft") == "$mft" assert filesystem.sanitize_filename("a$mft") == "a$mft" class TestSameFile: def test_nothing_in_common(self): assert 0 == filesystem.same_file("C:\\", "D:\\") assert 0 == filesystem.same_file("C:\\", "/home/test") assert 0 == filesystem.same_file("/home/", "/data/test") assert 0 == filesystem.same_file("/test/home/test", "/home/") def test_same(self): assert 1 == filesystem.same_file("/home/123", "/home/123") assert 1 == filesystem.same_file("D:\\", "D:\\") def test_subfolder(self): assert 2 == filesystem.same_file("\\\\?\\C:\\", "\\\\?\\C:\\Users\\") assert 2 == filesystem.same_file("/home/test123", "/home/test123/sub") @set_platform("win32") def test_capitalization(self): # Only matters on Windows/macOS assert 1 == filesystem.same_file("/HOME/123", "/home/123") assert 1 == filesystem.same_file("D:\\", "d:\\") assert 2 == filesystem.same_file("\\\\?\\c:\\", "\\\\?\\C:\\Users\\") assert 2 == filesystem.same_file("/HOME/test123", "/home/test123/sub") sabnzbd-develop/tests/testhelper.py0000600000175000017500000001313013642116632015626 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.testhelper - Basic helper functions """ import os import time import unittest from http.client import RemoteDisconnected import pytest import requests from selenium import webdriver from selenium.webdriver.chrome.options import Options as ChromeOptions from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from urllib3.exceptions import ProtocolError import sabnzbd import sabnzbd.cfg as cfg SAB_HOST = "localhost" SAB_PORT = 8081 SAB_BASE_DIR = os.path.dirname(os.path.abspath(__file__)) SAB_CACHE_DIR = os.path.join(SAB_BASE_DIR, "cache") SAB_COMPLETE_DIR = os.path.join(SAB_CACHE_DIR, "Downloads", "complete") def set_config(settings_dict): """ Change config-values on the fly, per test""" def set_config_decorator(func): def wrapper_func(*args, **kwargs): # Setting up as requested for item, val in settings_dict.items(): getattr(cfg, item).set(val) # Perform test value = func(*args, **kwargs) # Reset values for item, val in settings_dict.items(): getattr(cfg, item).default() return value return wrapper_func return set_config_decorator def set_platform(platform): """ Change config-values on the fly, per test""" def set_platform_decorator(func): def wrapper_func(*args, **kwargs): # Save original values is_windows = sabnzbd.WIN32 is_darwin = sabnzbd.DARWIN # Set current platform if platform == "win32": sabnzbd.WIN32 = True sabnzbd.DARWIN = False elif platform == "darwin": sabnzbd.WIN32 = False sabnzbd.DARWIN = True elif platform == "linux": sabnzbd.WIN32 = False sabnzbd.DARWIN = False # Perform test value = func(*args, **kwargs) # Reset values sabnzbd.WIN32 = is_windows sabnzbd.DARWIN = is_darwin return value return wrapper_func return set_platform_decorator def get_url_result(url="", host=SAB_HOST, port=SAB_PORT): """ Do basic request to web page """ arguments = {"session": "apikey"} return requests.get("http://%s:%s/%s/" % (host, port, url), params=arguments).text def get_api_result(mode, host=SAB_HOST, port=SAB_PORT, extra_arguments={}): """ Build JSON request to SABnzbd """ arguments = {"apikey": "apikey", "output": "json", "mode": mode} arguments.update(extra_arguments) r = requests.get("http://%s:%s/api" % (host, port), params=arguments) return r.json() def upload_nzb(filename, host=SAB_HOST, port=SAB_PORT): """ Upload file and return nzo_id reponse """ files = {"name": open(filename, "rb")} arguments = {"apikey": "apikey", "mode": "addfile", "output": "json"} return requests.post("http://%s:%s/api" % (host, port), files=files, data=arguments).json() @pytest.mark.usefixtures("start_sabnzbd") class SABnzbdBaseTest(unittest.TestCase): @classmethod def setUpClass(cls): # We only try Chrome for consistent results driver_options = ChromeOptions() # Headless on Appveyor/Travis if "CI" in os.environ: driver_options.add_argument("--headless") driver_options.add_argument("--no-sandbox") cls.driver = webdriver.Chrome(options=driver_options) # Get the newsserver-info, if available if "SAB_NEWSSERVER_HOST" in os.environ: cls.newsserver_host = os.environ["SAB_NEWSSERVER_HOST"] cls.newsserver_user = os.environ["SAB_NEWSSERVER_USER"] cls.newsserver_password = os.environ["SAB_NEWSSERVER_PASSWORD"] @classmethod def tearDownClass(cls): try: cls.driver.close() cls.driver.quit() except: # If something else fails, this can cause very non-informative long tracebacks pass def no_page_crash(self): # Do a base test if CherryPy did not report test self.assertNotIn("500 Internal Server Error", self.driver.title) def open_page(self, url): # Open a page and test for crash self.driver.get(url) self.no_page_crash() def scroll_to_top(self): self.driver.find_element_by_tag_name("body").send_keys(Keys.CONTROL + Keys.HOME) time.sleep(2) def wait_for_ajax(self): # We catch common nonsense errors from Selenium try: wait = WebDriverWait(self.driver, 15) wait.until(lambda driver_wait: self.driver.execute_script("return jQuery.active") == 0) wait.until(lambda driver_wait: self.driver.execute_script("return document.readyState") == "complete") except (RemoteDisconnected, ProtocolError): pass sabnzbd-develop/tests/test_utils/0000700000175000017500000000000013642116632015274 5ustar jpjpsabnzbd-develop/tests/test_utils/test_sleepless.py0000600000175000017500000000403013642116632020703 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_sleepless - Test sleepless for macOS """ import sys import pytest import time import subprocess if not sys.platform.startswith("darwin"): pytest.skip("Skipping macOS-only tests", allow_module_level=True) import sabnzbd.utils.sleepless as sleepless class TestSleepless: sleep_msg = "SABnzbd is running, don't you stop us now!" def check_msg_in_assertions(self): return self.sleep_msg in subprocess.check_output(["pmset", "-g", "assertions"], universal_newlines=True) def test_sleepless(self): # Run twice to see if it keeps going well for _ in range(2): # Keep it awake sleepless.keep_awake(self.sleep_msg) time.sleep(2) # Check if it's still in the assertions list assert self.check_msg_in_assertions() # Remove and see if it's still there sleepless.allow_sleep() assert not self.check_msg_in_assertions() assert sleepless.assertion_id is None def test_sleepless_not_there(self): assert not self.check_msg_in_assertions() assert sleepless.assertion_id is None sleepless.allow_sleep() assert not self.check_msg_in_assertions() assert sleepless.assertion_id is None sabnzbd-develop/tests/test_utils/test_cert_gen.py0000600000175000017500000000537513642116632020507 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_cert_gen - Testing Certificate generation """ import datetime from cryptography import x509 from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asymmetric import rsa from sabnzbd.utils.certgen import generate_key, generate_local_cert from tests.testhelper import * class TestCertGen: def test_generate_key_default(self): # Generate private key with default key_size and file name private_key = generate_key(output_file=os.path.join(SAB_CACHE_DIR, "test_key.pem")) assert private_key.key_size == 2048 @pytest.mark.parametrize( "key_size, file_name", [(512, "test_key.pem"), (1024, "test_123_key.pem"), (4096, "123_key.pem")] ) def test_generate_key_custom(self, key_size, file_name): # Generate private key private_key = generate_key(key_size=key_size, output_file=os.path.join(SAB_CACHE_DIR, file_name)) # validate generated private key assert private_key.key_size == key_size assert os.path.isfile(os.path.join(SAB_CACHE_DIR, file_name)) def test_generate_local_cert(self): # Generate private key private_key = generate_key(output_file=os.path.join(SAB_CACHE_DIR, "test_key.pem")) # Generate local certificate using private key output_file = os.path.join(SAB_CACHE_DIR, "test_cert.cert") local_cert = generate_local_cert(private_key, output_file=output_file) assert local_cert # Validating generated key file public_key = local_cert.public_key() assert isinstance(public_key, rsa.RSAPublicKey) # Validate certificate file with open(output_file, "rb") as cert_file: cert_content = cert_file.read() cert = x509.load_pem_x509_certificate(cert_content, default_backend()) # Validate that the timestamp at which the certificate stops being valid (expiration date) is in future assert datetime.datetime.now() < cert.not_valid_after sabnzbd-develop/tests/test_utils/__init__.py0000600000175000017500000000000013642116632017375 0ustar jpjpsabnzbd-develop/tests/test_utils/test_internetspeed.py0000600000175000017500000000300513642116632021556 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_utils.test_internetspeed - Testing SABnzbd internetspeed """ from sabnzbd.utils.internetspeed import internetspeed, measurespeed, SizeUrlList class TestInternetSpeed: """ This class contains tests to measure internet speed with an active and inactive connection """ def test_measurespeed_invalid_url(self): speed = measurespeed("www.fake-url-9999999.xyz") assert not speed def test_measurespeed_valid_url(self): speed = measurespeed(SizeUrlList[0][1]) assert isinstance(speed, float) assert speed > 0 def test_internet_speed(self): curr_speed_mbps = internetspeed() assert isinstance(curr_speed_mbps, float) assert curr_speed_mbps > 0 sabnzbd-develop/tests/test_utils/test_pystone.py0000600000175000017500000000224413642116632020412 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_utils.test_pystone - Testing SABnzbd pystone """ from sabnzbd.utils.pystone import pystones class TestPystone: def test_pystone(self): """ Tests for performance with various loop sizes """ loops = [10, 1000, 50000, 100000] for loop in loops: benchtime, stones = pystones(loop) assert benchtime > 0 assert stones > 0 sabnzbd-develop/tests/test_utils/test_diskspeed.py0000600000175000017500000000234713642116632020670 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_utils.test_diskspeed - Testing SABnzbd diskspeed """ from sabnzbd.utils.diskspeed import diskspeedmeasure from tests.testhelper import * class TestDiskSpeed: def test_disk_speed(self): speed = diskspeedmeasure(SAB_CACHE_DIR) assert speed assert isinstance(speed, float) # Make sure the test-file was cleaned up after the test assert not os.path.exists(os.path.join(SAB_CACHE_DIR, "outputTESTING.txt")) sabnzbd-develop/tests/test_rss.py0000600000175000017500000000774613642116632015335 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ tests.test_misc - Testing functions in misc.py """ import datetime import time import sabnzbd.rss as rss from sabnzbd.config import CFG, define_rss, ConfigCat class TestRSS: def setup_rss(self, feed_name, feed_url): """ Setup the basic settings to get things going""" # Setup the config settings CFG["rss"] = {} CFG["rss"][feed_name] = {} CFG["rss"][feed_name]["uri"] = feed_url define_rss() # Need to create the Default category # Otherwise it will try to save the config ConfigCat("*", {}) ConfigCat("tv", {}) ConfigCat("movies", {}) def test_rss_newznab_parser(self): """ Test basic RSS-parsing of custom elements Harder to test in functional test """ feed_name = "TestFeedNewznab" self.setup_rss(feed_name, "https://sabnzbd.org/tests/rss_newznab_test.xml") # Start the RSS reader rss_obj = rss.RSSQueue() rss_obj.run_feed(feed_name) # Is the feed processed? assert feed_name in rss_obj.jobs assert "https://cdn.nzbgeek.info/cdn?t=get&id=FakeKey&apikey=FakeKey" in rss_obj.jobs[feed_name] # Check some job-data job_data = rss_obj.jobs[feed_name]["https://cdn.nzbgeek.info/cdn?t=get&id=FakeKey&apikey=FakeKey"] assert job_data["title"] == "FakeShow.S04E03.720p.WEB.H264-Obfuscated" assert job_data["infourl"] == "https://nzbgeek.info/geekseek.php?guid=FakeKey" assert job_data["orgcat"] == "TV > HD" assert job_data["cat"] == "tv" assert job_data["episode"] == "3" assert job_data["season"] == "4" assert job_data["size"] == 1209464000 # feedparser returns UTC so SABnzbd converts to locale # of the system, so now we have to return to UTC adjusted_date = datetime.datetime(2018, 4, 13, 5, 46, 25) - datetime.timedelta(seconds=time.timezone) assert job_data["age"] == adjusted_date def test_rss_nzedb_parser(self): feed_name = "TestFeednZEDb" self.setup_rss(feed_name, "https://sabnzbd.org/tests/rss_nzedb_test.xml") # Start the RSS reader rss_obj = rss.RSSQueue() rss_obj.run_feed(feed_name) # Is the feed processed? assert feed_name in rss_obj.jobs assert "https://nzbfinder.ws/getnzb/FakeKey.nzb&i=46181&r=FakeKey" in rss_obj.jobs[feed_name] # Check some job-data # Added fake season and episode to test file job_data = rss_obj.jobs[feed_name]["https://nzbfinder.ws/getnzb/FakeKey.nzb&i=46181&r=FakeKey"] assert job_data["title"] == "Movie.With.a.Dog.2018.720p.BluRay.x264-SPRiNTER" assert job_data["infourl"] == "https://nzbfinder.ws/details/FakeKey" assert job_data["orgcat"] == "Movies > HD" assert job_data["cat"] == "movies" assert job_data["episode"] == "720" assert job_data["season"] == "2018" assert job_data["size"] == 5164539914 # feedparser returns UTC so SABnzbd converts to locale # of the system, so now we have to return to UTC adjusted_date = datetime.datetime(2019, 3, 2, 17, 18, 7) - datetime.timedelta(seconds=time.timezone) assert job_data["age"] == adjusted_date sabnzbd-develop/po/0000700000175000017500000000000013642116632012351 5ustar jpjpsabnzbd-develop/po/email/0000700000175000017500000000000013642116632013440 5ustar jpjpsabnzbd-develop/po/email/SABemail.pot0000600000175000017500000000564613642116632015616 0ustar jpjp# # SABnzbd Translation Template file EMAIL # Copyright 2011-2019 The SABnzbd-Team # team@sabnzbd.org # msgid "" msgstr "" "Project-Id-Version: SABnzbd-3.0.0-develop\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: shypike@sabnzbd.org\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 7bit\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" sabnzbd-develop/po/email/da.po0000600000175000017500000001325113642116632014370 0ustar jpjp# Danish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2018-11-27 23:39+0000\n" "Last-Translator: scootergrisen \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## Standard E-mail-skabelon til SABnzbd\n" "## Dette er en Cheetah-skabelon\n" "## Dokumentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Linjeskift og blanktegn har betydning!\n" "##\n" "## Dette er e-mail-headerne \n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd har " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Herefter kommer kroppen, den tomme linje skal være der!\n" "\n" "Hej,\n" "\n" "SABnzbd har hentet \"$name\" \n" "\n" "SABnzbd kunne ikke hente \"$name\" \n" "\n" "Færdig kl. $end_time\n" "Hentet $size\n" "\n" "Resultat af job:\n" "\n" "Etape $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output fra brugerscriptet \"$script\" (Afslutningskode = $script_ret):\n" "$script_output\n" "\n" "\n" "Hav det godt!\n" "\n" "Beklager!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## RSS E-mail-skabelon til SABnzbd\n" "## Dette er en Cheetah-skabelon\n" "## Dokumentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Linjeskift og blanktegn har betydning!\n" "##\n" "## Dette er e-mai-headere\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd har tilføjet $antal jobs til køen\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Herefter kommer kroppen, den tomme linje skal være der!\n" "\n" "Hej,\n" "\n" "SABnzbd har tilføjet $antal job(s) til køen.\n" "De er fra RSS-feedet \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Farvel\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## DÃ¥rlig URL-hentning af E-mail-skabelon til SABnzbd\n" "## Dette er en Cheetah-skabelon\n" "## Dokumentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Linjeskift og blanktegn har betydning!\n" "##\n" "## Dette er e-mail-headere\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd kunne ikke hente en NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Herefter kommer kroppen, den tomme linje skal være der!\n" "\n" "Hej,\n" "\n" "SABnzbd kunne ikke hente NZB fra $url.\n" "Fejlmeddelelsen er: $msg\n" "\n" "Farvel\n" sabnzbd-develop/po/email/nl.po0000600000175000017500000001336113642116632014417 0ustar jpjp# Dutch translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: shypike \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## Standaard Email sjabloon voor SABnzbd\n" "## Dit is een Cheetah sjabloon\n" "## Documentatie: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Lege regels en witruimte zijn belangrijk!\n" "##\n" "## Dit zijn de email koppen\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd: opdracht $name is \n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Hier onder volgt de hoofdtekst, de lege regel is noodzakelijk!\n" "\n" "Hallo,\n" "\n" "SABnzbd heeft \"$name\" gedownload\n" "\n" "SABnzbd is niet geslaagd in het downloaden van \"$name\" \n" "\n" "Klaar om $end_time\n" "Hoeveelheid gedownload $size\n" "\n" "Resultaat van de opdracht:\n" "\n" "Fase $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Bericht van het script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Veel plezier!\n" "\n" "Sorry!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## RSS Email sjabloon voor SABnzbd\n" "## Dit is een Cheetah sjabloon\n" "## Documentatie: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Lege regels en spaties zijn belangrijk!\n" "##\n" "## Dit zijn de email koppen\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd heeft $amount opdrachten aan de wachtrij toegevoegd\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Hierna komt de inhoud, de lege regel is benodigd!\n" "\n" "Hallo,\n" "\n" "SABnzbd heeft $amount opdrachten aan de wachtrij toegevoegd.\n" "Ze komen van de RSS bron \"$feed\".\n" "\n" " $job \n" "\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Ongeldige URL Ophaal Email sjabloon voor SABnzbd\n" "## Dit is een Cheetah sjabloon\n" "## Documentatie: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Lege regels en spaties zijn belangrijk!\n" "##\n" "## Dit zijn de email koppen\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: Ophalen van NZB door SABnzbd is mislukt\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Hierna komt het bericht, de lege regel is noodzakelijk!\n" "\n" "Hi,\n" "\n" "Het is SABnzbd niet gelukt om een NZB bestand op te halen van $url.\n" "De foutmelding was $msg\n" "\n" "Sorry\n" sabnzbd-develop/po/email/zh_CN.po0000600000175000017500000001307613642116632015012 0ustar jpjp# Chinese (Simplified) translation for sabnzbd # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2015-10-24 11:05+0000\n" "Last-Translator: shypike \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## SABnzbd 默认电å­é‚®ä»¶æ¨¡æ¿\n" "## 这是一款 Cheetah 模æ¿\n" "## 文档: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## æ–°è¡Œä¸Žç©ºæ ¼å‡æœ‰é‡è¦æ„义!\n" "##\n" "## 这些是电å­é‚®ä»¶å¤´\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd 已任务 $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## åˆ°ä¸»ä½“éƒ¨åˆ†æ—¶ï¼Œå¿…é¡»è¦æœ‰ç©ºè¡Œ!\n" "\n" "Hi,\n" "\n" "SABnzbd å·²å®Œæˆ \"$name\" 的下载 \n" "\n" "SABnzbd 下载 \"$name\" 失败 \n" "\n" "完æˆäºŽ $end_time\n" "已下载 $size\n" "\n" "任务结果:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "用户脚本 \"$script\" 输出内容 (é€€å‡ºä»£ç  = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "éžå¸¸æŠ±æ­‰!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## SABnzbd RSS 电å­é‚®ä»¶æ¨¡æ¿\n" "## 这是一款 Cheetah 模æ¿\n" "## 文档: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## 新行åŠç©ºæ ¼å‡æœ‰é‡è¦æ„义!\n" "##\n" "## 这些是电å­é‚®ä»¶å¤´\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd 已将 $amount 项任务加入队列\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## åˆ°ä¸»ä½“éƒ¨åˆ†æ—¶ï¼Œå¿…é¡»è¦æœ‰ç©ºè¡Œ!\n" "\n" "Hi,\n" "\n" "SABnzbd 已将 $amount 项任务加入队列。\n" "它们出自 RSS feed \"$feed\"。\n" "\n" " $job \n" "\n" "\n" "Bye\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## SABnzbd è£…å– URL 错误电å­é‚®ä»¶æ¨¡æ¿\n" "## 这是一款 Cheetah 模æ¿\n" "## 文档: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## æ–°è¡Œä¸Žç©ºæ ¼å‡æœ‰é‡è¦æ„义!\n" "##\n" "## 这些是电å­é‚®ä»¶å¤´\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd è£…å– NZB 失败\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## åˆ°ä¸»ä½“éƒ¨åˆ†æ—¶å¿…é¡»è¦æœ‰ç©ºè¡Œ!\n" "\n" "Hi,\n" "\n" "SABnzbd 从 $url 检索 NZB 失败。\n" "错误信æ¯ä¸º: $msg\n" "\n" "Bye\n" sabnzbd-develop/po/email/es.po0000600000175000017500000001361413642116632014416 0ustar jpjp# Spanish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: shypike \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## Plantilla de correo predeterminada para SABnzbd\n" "## This a Cheetah template\n" "## Documentación: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## !Los saltos de línea y espacios en blanco son significativos¡\n" "##\n" "## Cabeceras de correo electrónico\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## !Después de esto viene el cuerpo del mensaje, la línea en blanco es " "necesaria!\n" "\n" "Hola,\n" "\n" "SABnzbd he bajado \"$name\" \n" "\n" "SABnzbd fallo en bajar \"$name\" \n" "\n" "Terminado a las $end_time\n" "$size bajado\n" "\n" "Resultado de la transferencia:\n" "\n" "Etapa $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Producción desde el script de usuario \"$script\" (Exit code = " "$script_ret):\n" "$script_output\n" "\n" "\n" "Que lo disfrutes!\n" "\n" "Perdon!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## Plantilla de correo RSS para SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## !Los saltos de línea y espacios en blanco son significativos¡\n" "##\n" "## Cabeceras de correo electrónico\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd he añadido $amount transferencia(s) a la cola\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## !Después de esto viene el cuerpo del mensaje, la línea en blanco es " "necesaria!\n" "\n" "Hola,\n" "\n" "SABnzbd he añadido $amount transferencia(s) a la cola.\n" "Originaron desde el RSS \"$feed\".\n" "\n" "$job \n" "\n" "\n" "Adios\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Plantilla de correo para URLs incorrectas de SABnzbd\n" "## Esta es una plantilla Cheetah\n" "## Documentación: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Líneas nuevas y espacios en blanco IMPORTAN!\n" "##\n" "## Estas son las cabeceras del email\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd ha encontrado un error al recuperar un NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hola,\n" "\n" "SABnzbd ha encontrado un error al descargar un NZB desde $url.\n" "El error ha sido: $msg\n" "\n" "Un saludo\n" sabnzbd-develop/po/email/pt_BR.po0000600000175000017500000001362713642116632015021 0ustar jpjp# Brazilian Portuguese translation for sabnzbd # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: lrrosa \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## Template padrão de e-mail para SABnzbd\n" "## Este é um template Cheetah\n" "## Documentação: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Novas linhas e espaços em branco são significativos!\n" "##\n" "## Estes são os cabeçalhos de e-mail\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd a " "tarefa $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Depois daqui vem o corpo. A linha vazia é necessária!\n" "\n" "Olá,\n" "\n" "SABnzbd baixou \"$name\" \n" "\n" "SABnzbd falhou no download de \"$name\" \n" "\n" "Completado em $end_time\n" "Baixados $size\n" "\n" "Resultados da tarefa:\n" "\n" "Etapa $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Retorno do script de usuário \"$script\" (Código de retorno = $script_ret):\n" "$script_output\n" "\n" "\n" "Aproveite!\n" "\n" "Lamento!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## Template de e-mail RSS para SABnzbd\n" "## Este é um template Cheetah\n" "## Documentação: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Novas linhas e espaços em branco são significativos!\n" "##\n" "## Estes são os cabeçalhos de e-mail\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd adicionou $amount à fila\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Depois daqui vem o corpo. A linha vazia é necessária!\n" "\n" "Olá,\n" "\n" "SABnzbd adicionou $amount à fila.\n" "Elas são do feed RSS \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Tchau!\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Template de e-mail de busca em URL ruim para SABnzbd\n" "## Este é um template Cheetah\n" "## Documentação: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Novas linhas e espaços em branco são significativos!\n" "##\n" "## Estes são os cabeçalhos de e-mail\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd falhou ao buscar um NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Depois daqui vem o corpo. A linha vazia é necessária!\n" "\n" "Olá,\n" "\n" "SABnzbd não conseguiu obter o NZB de $url.\n" "A mensagem de erro foi: $msg\n" "\n" "Tchau!\n" sabnzbd-develop/po/email/en.po0000600000175000017500000000002313642116632014377 0ustar jpjp# Dummy en.po file sabnzbd-develop/po/email/de.po0000600000175000017500000001364213642116632014400 0ustar jpjp# German translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Thomas Lucke (Lucky) \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "#encoding UTF-8\n" "## Translation by Severin Heiniger\n" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd Auftrag " "$name \n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd hat \"$name\" heruntergeladen\n" "\n" "SABnzbd konnte \"$name\" nicht herunterladen\n" "\n" "Fertiggestellt: $end_time\n" "Heruntergeladen: $size\n" "\n" "Ergebnis des Auftrages:\n" "\n" "Stufe $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Ausgabe des Benutzerskripts \"$script\" (beendet mit Code $script_ret):\n" "$script_output\n" "\n" "\n" "Viel Spass!\n" "\n" "Entschuldigung!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd hat $amount Aufträge zur Warteschlange hinzugefügt\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hallo,\n" "\n" "SABnzbd hat $amount Aufträge zur Warteschlange hinzugefügt.\n" "Sie stammen vom RSS-Feed \"$feed\".\n" "\n" " $job \n" "\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "## Translation by Thomas Lucke (Lucky)\n" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd konnte eine NZB-Datei nicht herunterladen\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hallo,\n" "\n" "SABnzbd konnte die NZB-Datei von $url nicht herrunterladen.\n" "Die Fehlermeldung war: $msg\n" sabnzbd-develop/po/email/he.po0000600000175000017500000001357013642116632014404 0ustar jpjp# Hebrew translation for sabnzbd # Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2017. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2019-01-21 15:26+0000\n" "Last-Translator: Safihre \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## SABnzbd תבנית דו×\"ל ברירת מחדל עבור\n" "## ×–×ת תבנית ברדלס\n" "## http://sabnzbd.wikidot.com/email-templates :תיעוד\n" "##\n" "## !שורות חדשות ×•×¨×•×•×—×™× ×œ×‘× ×™× ×”× ×ž×©×ž×¢×•×ª×™×™×\n" "##\n" "## ×לו כותרות הדו×\"ל\n" "$to :×ל\n" "$from :מ×ת\n" "ת×ריך: $date\n" " $name יש עבודה ×שר " "SABnzbd-נוש×: ל\n" "## !×חרי ×–×” ×‘× ×”×’×•×£, השורה הריקה דרושה\n" "\n" ",×”×™×™\n" "\n" "SABnzbd הוריד ×ת \"$name\" \n" "\n" "SABnzbd נכשל להוריד ×ת \"$name\" \n" "\n" "×”×¡×ª×™×™× ×‘-$end_time\n" "הורדו $size\n" "\n" ":תוצ×ות העבודה\n" "\n" "שלב $stage \n" "\n" " $result \n" "\n" "\n" "\n" ":(קוד יצי××” = $script_ret) \"$script\" פלט מתסריט משתמש\n" "$script_output\n" "\n" "\n" "!תהנה\n" "\n" "!סליחה\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## SABnzbd עבור RSS תבנית דו×\"ל\n" "## ×–×ת תבנית ברדלס\n" "## http://sabnzbd.wikidot.com/email-templates :תיעוד\n" "##\n" "## !שורות חדשות ×•×¨×•×•×—×™× ×œ×‘× ×™× ×”× ×ž×©×ž×¢×•×ª×™×™×\n" "##\n" "## ×לו כותרות הדו×\"ל\n" "$to :×ל\n" "$from :מ×ת\n" "ת×ריך: $date\n" "הוסיף $amount עבודות לתור SABnzbd :נוש×\n" "## !×חרי ×–×” ×‘× ×”×’×•×£, השורה הריקה דרושה\n" "\n" ",×”×™×™\n" "\n" ".הוסיף $amount עבודות לתור SABnzbd\n" ".\"$feed\" ×‘×©× RSS ×”× ×ž×”×–× ×ª\n" "\n" " $job \n" "\n" "\n" "ביי\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## SABnzbd רעה עבור URL תבנית דו×\"ל של משיכת\n" "## ×–×ת תבנית ברדלס\n" "## http://sabnzbd.wikidot.com/email-templates :תיעוד\n" "##\n" "## !שורות חדשות ×•×¨×•×•×—×™× ×œ×‘× ×™× ×”× ×ž×©×ž×¢×•×ª×™×™×\n" "##\n" "## ×לו כותרות הדו×\"ל\n" "$to :×ל\n" "$from :מ×ת\n" "ת×ריך: $date\n" "NZB נכשל במשיכת SABnzbd :נוש×\n" "## !×חרי ×–×” ×‘× ×”×’×•×£, השורה הריקה דרושה\n" "\n" ",×”×™×™\n" "\n" ".$url מתוך NZB-נכשל ל×חזר ×ת ×” SABnzbd\n" "הודעת השגי××” הייתה: $msg\n" "\n" "ביי\n" sabnzbd-develop/po/email/fi.po0000600000175000017500000001356713642116632014414 0ustar jpjp# Finnish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Matti Ylönen \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## Oletus sähköpostipohja SABnzbd:lle\n" "## Tämä on Cheetah pohja\n" "## Dokumentaatio: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Rivinvaihdot ja välilyönnit ovat merkitseviä!\n" "##\n" "## Nämä ovat otsaketiedot. Rivien ensimmäisiä sanoja ei saa vaihtaa!\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd on työssä $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Tämän jälkeen tulee viestin runko, ensimmäinen rivinvaihto on " "pakollinen!\n" "\n" "Hei,\n" "\n" "SABnzbd on ladannut \"$name\" \n" "\n" "SABnzbd on epäonnistunut \"$name\" latauksessa\n" "\n" "Valmistui $end_time\n" "Ladattu $size\n" "\n" "Työn lopputulos:\n" "\n" "Tila $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Käyttäjän skriptin tuloste \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Nauti!\n" "\n" "Pahoittelut!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## RSS sähköpostipohja SABnzbd:lle\n" "## Tämä on Cheetah pohja\n" "## Dokumentaatio: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Rivinvaihdot ja välilyönnit ovat merkitseviä!\n" "##\n" "## Nämä ovat otsaketiedot. Rivien ensimmäisiä sanoja ei saa vaihtaa!\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd on lisännyt $amount työtä jonoon\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Tämän jälkeen tulee viestin runko, ensimmäinen rivinvaihto on " "pakollinen!\n" "\n" "Hei,\n" "\n" "SABnzbd on lisännyt $amount työtä jonoon.\n" "Ne ovat RSS syötteestä \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Heippa\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Virheellisen URL-noudon sähköpostin pohja SABnzbd ohjelmalle\n" "## Tämä on Cheetah pohja\n" "## Dokumentaatio: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Rivinvaihdot ja välilyönnit ovat merkitseviä!\n" "##\n" "## Tässä on sähköpostin otsikkotiedot\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd ei voinut hakea NZB tiedostoa\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Tämän jälkeen tulee viestin sisältö, tyhjä rivi on pakollinen!\n" "\n" "Hei,\n" "\n" "SABnzbd ei voinut hakea NZB tiedostoa osoitteesta $url.\n" "Virheviesti: $msg\n" sabnzbd-develop/po/email/ro.po0000600000175000017500000001351313642116632014425 0ustar jpjp# Romanian translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: nicusor \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## Șablon Email Original pentru SABnzbd\n" "## Acesta este un Șablon Cheetah\n" "## DocumentaÈ›ie: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "##Rândurile noi È™i caracterele spaÈ›iu sunt importante!\n" "##\n" "## Acestea sunt antetele email\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd \n" "SABnzbd a descărcat \"$name\" \n" "\n" "SABnzbd nu a reuÅŸit să descarce \"$name\" \n" "\n" "Terminat la $end_time\n" "Mărime $size\n" "\n" "Rezultatele sarcinii:\n" "\n" "Stagiu $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Rezultatul script-ului utilizatorului \"$script\" (Exit code = " "$script_ret):\n" "$script_output\n" "\n" "\n" "BucuraÅ£i-vă!\n" "\n" "Ne pare rau!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "## Åžablon Email RSS pentru SABnzbd\n" "## Acesta este un ÅŸablon Cheetah \n" "## DocumentaÅ£ie: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Rândurile noi È™i caracterele spaÈ›iu sunt importante!\n" "##\n" "## Acestea sunt antetele email\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd a adăugat $amount sarcini în coadă\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## După acesta urmează conÅ£inutul, este necesar o linie goală!\n" "\n" "Salut,\n" "\n" "SABnzbd a adăugat $amount sarcină(e) în coadă.\n" "Ele sunt din fluxuri RSS \"$feed\".\n" "\n" " $job \n" "\n" "\n" "La revedere !\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Adresă URL GreÅŸită ÅŸablon Email pentru SABnybd \n" "## Acesta este un ÅŸablon Cheetah\n" "## DocumentaÅ£ie : http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Liniile noi ÅŸi spaÅ£iile sunt importante!\n" "##\n" "## Acestea sunt headerele email\n" "Către: $to\n" "De la: $from\n" "Dată: $date\n" "Subiect: SABnzbd nu a reuÅŸit să descarce un NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## După aceasta urmează corpul email, linia goală e necesară !\n" "\n" "Salut,\n" "\n" "SABnzbd nu a putut descărca NZB-ul de la adresa $url.\n" "Mesajul de eroare a fost: $msg\n" "\n" "La revedere!\n" sabnzbd-develop/po/email/nb.po0000600000175000017500000001334713642116632014411 0ustar jpjp# Norwegian Bokmal translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "#encoding UTF-8\n" "## Translation by ProtX\n" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd har " "jobb $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hei,\n" "\n" "SABnzbd har lastet ned \"$name\" \n" "\n" "SABnzbd mislyktes med Ã¥ laste ned \"$name\" \n" "\n" "Ferdig $end_time\n" "Nedlastet $size\n" "\n" "Resultat av jobben:\n" "\n" "Steg $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Utskrift fra brukerskript \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Gratulerer!\n" "\n" "Synd!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd har lagt $amount jobber til køen\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Etter dette kommer meldingen, den tomme linjen er nødvendig!\n" "\n" "Hei,\n" "\n" "SABnzbd har lagt $amount jobb(er) til køen.\n" "Disse er fra RSS feeden \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Hade\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd ikke klarte Ã¥ hente en NZB fil\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Etter dette kommer meldingen, den tomme linjen er nødvendig!\n" "\n" "Hei,\n" "\n" "SABnzbd klarte ikke Ã¥ hente NZB fra $url.\n" "Feilmeldingen var: $msg\n" "\n" "Hade\n" sabnzbd-develop/po/email/fr.po0000600000175000017500000001345713642116632014423 0ustar jpjp# French translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Fox Ace \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "#encoding UTF-8\n" "##\n" "## Template Email pour SABnzbd\n" "## Ceci est un template Cheetah\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Les retours à la ligne et les espaces sont importants !\n" "##\n" "## Entêtes de l'email\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd SuccèsEchec " "du téléchargement $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Après cela vient le contenu, la ligne vide est nécessaire! \n" "\n" "Bonjour,\n" "\n" "SABnzbd a téléchargé avec succès \"$name\" \n" "\n" "SABnzbd a téléchargé sans succès \"$name\" \n" "\n" "Terminé à $end_time\n" "Téléchargé $size\n" "\n" "Résultat du téléchargement :\n" "\n" "Etape $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Sortie du script utilisateur \"$script\" (Code Retour = $script_ret):\n" "$script_output\n" "\n" "\n" "A bientôt !\n" "\n" "Désolé !\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## Template Email pour SABnzbd\n" "## Ceci est un template Cheetah\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Les retours à la ligne et les espaces sont importants !\n" "##\n" "## Entêtes de l'email\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd a ajouté $amount fichier(s) à la file d'attente\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Après cela vient le contenu, la ligne vide est nécessaire!\n" "\n" "Bonjour,\n" "\n" "SABnzbd a ajouté $amount fichier(s) à la file d'attente.\n" "Ils proviennent du Flux RSS \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Au Revoir\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" sabnzbd-develop/po/email/sv.po0000600000175000017500000001337213642116632014440 0ustar jpjp# Swedish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2017-06-24 19:50+0000\n" "Last-Translator: Safihre \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "## Translation by Andreas Lindberg andypandyswe@gmail.com\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hej,\n" "\n" "SABnzbd har laddat ned \"$name\" \n" "\n" "SABnzbd misslyckades med att ladda ned \"$name\" \n" "\n" "Färdig $end_time\n" "Nedladdat $size\n" "\n" "Resultat:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Utmatning frÃ¥n användarskript \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Lycka till!\n" "\n" "Beklagar!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd har lagt till $amount jobb i kön\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hej,\n" "\n" "SABnzbd har lagt till $amount jobb i kön.\n" "De kommer frÃ¥n RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Hej dÃ¥\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd misslyckades med att hämta en NZB -fil\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hej,\n" "\n" "SABnzbd har misslyckats med att hämta NZB -filen frÃ¥n $url.\n" "Felmeddelandet lyder: $msg\n" "\n" "Hej dÃ¥\n" sabnzbd-develop/po/email/sr.po0000600000175000017500000001475213642116632014437 0ustar jpjp# Serbian translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # МироÑлав Ðиколић , 2011. msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2017-06-24 19:51+0000\n" "Last-Translator: Safihre \n" "Language-Team: Launchpad Serbian Translators\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" "Language: sr\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## ОÑновни шаблон ел. поште за СÐБнзбд\n" "## Ово је Гепард шаблон\n" "## Документација: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Ðови редови и размаци Ñу важни!\n" "##\n" "## Ово Ñу заглавља ел. поште\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: СÐБнзбд је " "поÑао „$name“\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## ПоÑле тога долази разрада, празни редови Ñу потребни!\n" "\n" "Здраво,\n" "\n" "СÐБнзбд је преузео „$name“ \n" "\n" "СÐБнзбд није уÑпео да преузме „$name“ \n" "\n" "Завршено је у $end_time\n" "Преузето је $size\n" "\\n\n" "Резултат рада:\n" "\n" "Фаза $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Излаз кориÑничке Ñкрипте „$script“ (Шифра излаза = $script_ret):\n" "$script_output\n" "\n" "\n" "Уживајте!\n" "\n" "Жао ми је!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## РСС шаблон ел. поште за СÐБнзбд\n" "## Ово је Гепард шаблон\n" "## Документација: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Ðови редови и размаци Ñу важни!\n" "##\n" "## Ово Ñу заглавља ел. поште\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject СÐБнзбд је додао $amount поÑла у ред\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## ПоÑле тога долази разрада, празни редови Ñу потребни!\n" "\n" "Здраво,\n" "\n" "СÐБнзбд је додао $amount поÑао(ла) у ред.\n" "Долазе Ñа РСС довода „$feed“.\n" "\n" " $job \n" "\n" "\n" "Поздрав\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Шаблон ел. поште лошег набављања адреÑе за СÐБнзбд\n" "## Ово је Гепард шаблон\n" "## Документација: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Ðови редови и размаци Ñу важни!\n" "##\n" "## Ово Ñу заглавља ел. поште\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: СÐБнзбд није уÑпео да преузме ÐЗБ\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## ПоÑле тога долази разрада, празни редови Ñу потребни!\n" "\n" "Здраво,\n" "\n" "СÐБнзбд није уÑпео да преузме ÐЗБ Ñа „$url“.\n" "Порука грешке је: $msg\n" "\n" "Поздрав\n" sabnzbd-develop/po/email/ru.po0000600000175000017500000001542213642116632014434 0ustar jpjp# Russian translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Pavel Maryanov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## Стандартный шаблон ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñлектронной почты\n" "## Это шаблон Cheetah\n" "## ДокументациÑ: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Ðовые Ñтроки и пробелы имеют значение!\n" "##\n" "## Это заголовки Ñлектронной почты\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd: задание $name \n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Теперь Ñледует тело ÑообщениÑ. ПуÑÑ‚Ð°Ñ Ñтрока ÑвлÑетÑÑ Ð¾Ð±Ñзательной!\n" "\n" "Привет.\n" "\n" "СиÑтемой SABnzbd загружено задание «$name» \n" "\n" "СиÑтеме SABnzbd не удалоÑÑŒ загрузить «$name» \n" "\n" "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸: $end_time\n" "Загруженный размер: $size\n" "\n" "Результаты заданиÑ:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Результат Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑ†ÐµÐ½Ð°Ñ€Ð¸Ñ Â«$script» (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Удачи!\n" "\n" "Сожалеем.\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## Шаблон RSS Ð´Ð»Ñ Ñлектронной почты\n" "## Это шаблон Cheetah\n" "## ДокументациÑ: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Ðовые Ñтроки и пробелы имеют значение!\n" "##\n" "## Это заголовки Ñлектронной почты\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: Ð’ очередь загрузки SABnzbd добавлены заданиÑ: $amount \n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Теперь Ñледует тело ÑообщениÑ. ПуÑÑ‚Ð°Ñ Ñтрока ÑвлÑетÑÑ Ð¾Ð±Ñзательной!\n" "\n" "Привет.\n" "\n" "Ð’ очередь загрузки SABnzbd были добавлены заданиÑ: $amount.\n" "Они были получены из RSS-ленты «$feed».\n" "\n" " $job \n" "\n" "\n" "До ÑвиданиÑ\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Шаблон Ñлектронной почты Ð´Ð»Ñ Ð¸Ð·Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð³Ð¾ URL-адреÑа\n" "## Это шаблон Cheetah\n" "## ДокументациÑ: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Ðовые Ñтроки и пробелы имеют значение!\n" "##\n" "## Это заголовки Ñлектронной почты\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: Службе SABnzbd не удалоÑÑŒ загрузить NZB-файл\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Теперь Ñледует тело ÑообщениÑ. ПуÑÑ‚Ð°Ñ Ñтрока ÑвлÑетÑÑ Ð¾Ð±Ñзательной!\n" "\n" "Привет.\n" "\n" "Службе SABnzbd не удалоÑÑŒ загрузить NZB-файл по адреÑу $url.\n" "Сообщение об ошибке: $msg\n" "\n" "Конец ÑообщениÑ\n" sabnzbd-develop/po/email/pl.po0000600000175000017500000001335713642116632014426 0ustar jpjp# Polish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-02-21 15:43+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Tomasz 'Zen' Napierala \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:01+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: email/email.tmpl:1 msgid "" "##\n" "## Default Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has " "job $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has downloaded \"$name\" \n" "\n" "SABnzbd has failed to download \"$name\" \n" "\n" "Finished at $end_time\n" "Downloaded $size\n" "\n" "Results of the job:\n" "\n" "Stage $stage \n" "\n" " $result \n" "\n" "\n" "\n" "Output from user script \"$script\" (Exit code = $script_ret):\n" "$script_output\n" "\n" "\n" "Enjoy!\n" "\n" "Sorry!\n" "\n" msgstr "" "##\n" "## DomyÅ›lny szablon maila w SABnzbd\n" "## To jest szablon Cheetah\n" "## Dokumentacja: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Znak nowego wiersza i spacji ma znaczenie!\n" "##\n" "## To sÄ… nagÅ‚owki maila\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd zadanie $name\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## NastÄ™pnie treść maila, wymagana jest pusta linia!\n" "\n" "Cześć,\n" "\n" "SABnzbd pobraÅ‚ \"$name\" \n" "\n" "SABnzbd nie pobraÅ‚ \"$name\" \n" "\n" "ZakoÅ„czono o $end_time\n" "Pobrano $size\n" "\n" "Rezultat zadania:\n" "\n" "Etap $stage \n" "\n" "$result \n" "\n" "\n" "\n" "Odpowiedź od skryptu \"$script\" (kod wyjÅ›cia = $script_ret):\n" "$script_output\n" "\n" "\n" "Baw siÄ™ dobrze!\n" "\n" "Przykro mi!\n" "\n" #: email/rss.tmpl:1 msgid "" "##\n" "## RSS Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd has added $amount jobs to the queue\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has added $amount job(s) to the queue.\n" "They are from RSS feed \"$feed\".\n" "\n" " $job \n" "\n" "\n" "Bye\n" msgstr "" "##\n" "## Szablon wiadomoÅ›ci RSS dla SABnzbd\n" "## To jest szablon Cheetah\n" "## Dokumentacja: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Znak nowego wiersza i spacji ma znaczenie!\n" "##\n" "## To sÄ… nagÅ‚owki maila\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd dodaÅ‚ $amount zadaÅ„/zadania do kolejki\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## NastÄ™pnie treść maila, wymagana jest pusta linia!\n" "\n" "Cześć,\n" "\n" "SABnzbd dodaÅ‚ $amount zadanie/zadaÅ„ do kolejki.\n" "PochodzÄ… one z wiadomoÅ›ci RSS \"$feed\".\n" "\n" "$job \n" "\n" "\n" "Nara\n" #: email/badfetch.tmpl:1 msgid "" "##\n" "## Bad URL Fetch Email template for SABnzbd\n" "## This a Cheetah template\n" "## Documentation: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Newlines and whitespace are significant!\n" "##\n" "## These are the email headers\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd failed to fetch an NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## After this comes the body, the empty line is required!\n" "\n" "Hi,\n" "\n" "SABnzbd has failed to retrieve the NZB from $url.\n" "The error message was: $msg\n" "\n" "Bye\n" msgstr "" "##\n" "## Szablon wiadomoÅ›ci błędnego pobierania URL SABnzbd\n" "## To jest szablon Cheetah\n" "## Dokumentacja: http://sabnzbd.wikidot.com/email-templates\n" "##\n" "## Znaki nowego wiersza i biaÅ‚e znaki majÄ… znaczenie!\n" "##\n" "## To sÄ… nagłówki wiadomoÅ›ci\n" "To: $to\n" "From: $from\n" "Date: $date\n" "Subject: SABnzbd nie udaÅ‚o siÄ™ pobrać pliku NZB\n" "X-priority: 5\n" "X-MS-priority: 5\n" "## Po tym nastÄ™puje treść. Pusty wiersz jest wymagany!\n" "\n" "Cześć,\n" "\n" "SABnzbd nie udaÅ‚o siÄ™ pobrać pliku NZB z $url.\n" "Komunikat błędu: $msg\n" "\n" "Do usÅ‚yszenia.\n" sabnzbd-develop/po/main/0000700000175000017500000000000013642116632013275 5ustar jpjpsabnzbd-develop/po/main/da.po0000600000175000017500000043334213642116632014234 0ustar jpjp# Danish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # scootergrisen, 2018. msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2019-01-26 09:26+0000\n" "Last-Translator: B.E. \n" "Language-Team: Danish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:02+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" "Language: da\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Kunne ikke starte web-interface" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "Kan ikke finde webskabeloner: %s, forsøger med standardskabelon" #: SABnzbd.py 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 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 "par2 binary... NOT found!" msgstr "par2 binær... IKKE fundet!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "MultiPar binær... IKKE fundet!" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "Verificering og reparation er ikke muligt." #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "Din Unrar version er %s, vi anbefaler version %s eller højere.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "unrar binær... IKKE fundet" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "unzip binær... IKKE fundet!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "7za binær... IKKE fundet!" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Vær opmærksom pÃ¥ at 0.0.0.0 værtsnavn har brug for en IPv6-adresse for " "ekstern adgang" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "HTTP og HTTPS porte kan ikke være de samme" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" "SABnzbd blev startet med kodning %s, dette bør være UTF-8. Forvent problemer " "med Unicoded fil- og mappenavne i downloads." #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "HTTPS fejlede pÃ¥ grund af manglende CERT og KEY filer" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Kunne ikke starte web-grænseflade: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "Kan ikke nÃ¥ SABHelper tjeneste" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s startet" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Advarsel" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Fejl" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "SABnzbd lukning udført" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Værtsnavnet er ikke indstillet." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "Der er ingen forbindelser angivet. Angiv mindst én forbindelse." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Adgangskode maskeret med ******, forsøg igen" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Ugyldige serverdetaljer" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "Timeout: Forsøg at aktivere SSL eller tilslut via en anden port." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Timeout" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" "Ukendt SSL protokol: Prøv at deaktivere SSL eller forbinder pÃ¥ en anden port." #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Ugyldig server adresse." #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Server afslut under login-sekvens." #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Serveren kræver brugernavn og adgangskode." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Tilslutning lykkedes!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Godkendelse mislykkedes, kontrollere brugernavn/adgangskode." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "Alt for mange forbindelser, pause en download eller forsøg igen senere" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Det lykkedes ikke at tilslutte (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Signal %s modtaget, gemmer og lukker..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Fatal fejl ved lagring af state" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Forsøger at hente NZB fra %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Gemmes %s mislykkedes" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Kan ikke oprette temp fil for %s" #: sabnzbd/__init__.py [Warning message] 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 [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Fejl i tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Downloadning af %s mislykkedes" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "E-mail afsendelse mislykkedes" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Afprøv notifikation" #: sabnzbd/api.py msgid " Resolving address" msgstr "  Server løsning" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Standard" #: sabnzbd/api.py msgid "unknown" msgstr "ukendt" #: sabnzbd/api.py [Error message] 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" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Diskfejl ved oprettelse af fil %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Fatal fejl i Assembler" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "Advarsel: Pauset job \"%s\" pÃ¥ grund af krypterede RAR fil (hvis oplyst, " "alle adgangskoder blev forsøgt)" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "Advarsel: Afbrudt job \"%s\" pÃ¥ grund af krypterede RAR fil (hvis oplyst, " "alle adgangskoder blev forsøgt)" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Afbrudt, kryptering registreret" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "Advarsel: I \"%s\" uønsket extension i RAR fil. Uønsket fil er \"%s\" " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "Uønsket extension i rar fil %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Afbrudt, uønsket extension fundet" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "ADVARSEL: Pause job \"%s\" pÃ¥ grund af rating (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "ADVARSEL: Afbrudt job \"%s\" pÃ¥ grund af rating (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Afbrudt, rating filter matchede (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s mangler" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "video" #: sabnzbd/assembler.py msgid "audio" msgstr "lyd" #: sabnzbd/assembler.py msgid "spam" msgstr "spam" #: sabnzbd/assembler.py msgid "passworded" msgstr "beskyttet med adgangskode" #: sabnzbd/assembler.py msgid "downvoted" msgstr "downvoted" #: sabnzbd/assembler.py msgid "keywords" msgstr "nøgleord" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Kvote brugt, pause downloading" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s er ikke en godkendt e-mail adresse" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Kræver serveradresse" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Kan ikke oprette %s mappe %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Kan ikke skrive til INI fil %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Kan ikke oprette backup fil for %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Forkert kodet adgangskode%s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s er ikke et korrekt ciffer værdi" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "UNC søgning \"%s\" er ikke tilladt her" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Fejl: Sti længde bør være under %s." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Fejl: Køen er ikke tom, kan ikke skifte mappe." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" "Kan ikke skrive til historik database, kontroller adgangsrettigheder!" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "Beskadigede historik database, skabte tom udskiftning" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "SQL Kommando mislykkedes, se log" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "Det lykkedes ikke at lukke databasen, se log" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Forkert logning i historiken av %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Afkodning af %s mislykkedes" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "Dekoder fejl: Ikke mere hukommelse" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Forkert udformet yEnc artikel i %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Ukendt fejl under afkodning af %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => mangler fra alle servere, afviser" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Færdig" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "Udpakket %s filer/mapper i %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [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] msgid "Error while adding %s, removing" msgstr "Det lykkedes ikke at tilføje %s, slette" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Fejl ved fjernelse af %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Kan ikke læse overvÃ¥get mappe %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Genoptager" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "Sat pÃ¥ pause" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Du skal angive den maksimale bÃ¥ndbredde, før du kan angive en bÃ¥ndbredde " "begrænsning" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Kan ikke tilslutte til server %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Servernavnet løser ikke" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Server %s vil blive ignoreret for i %s minutter" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Det lykkedes ikke at initialisere %s@%s med begrundelse %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "Alt for mange forbindelser til serveren %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Sandsynligt delt konto" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Det lykkedes ikke at logge pÃ¥ serveren %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Forbindelse %s@%s mislykkedes, besked %s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Server %s kræver brugernavn/adgangskode" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Suspect fejl i downloader" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "PÃ¥begynder lukning af SABnzbd" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Det lykkedes ikke at tilslutte mailserver" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "Det lykkedes ikke at initialisere TLS tilslutning" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "Serveren svarede ikke korrekt til helo hilsen" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Godkendelse til mailserver mislykkedes" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Ingen egnet godkendelsesmetode blev fundet" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Ukendt godkendelsesfejl i mailserver" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Det lykkedes ikke at sende e-mail" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Det lykkedes ikke at lukke e-mail tilslutning" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Ingen modtagere givet, ingen e-mail sendt" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd rapportere Disk Fuld\n" "\n" "Hej,\n" "\n" "SABnzbd er stoppet med at downloade, fordi disken er næsten fuld.\n" "Vær venlig at give plads og genoptage SABnzbd manuelt.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Kan ikke oprette mappe %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "%s mappe: %s adgang mislykkedes" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Det lykkedes ikke at ændre rettigheder pÃ¥ %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Oprettelse af (%s) mislykkedes" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Det lykkedes ikke at flytte %s til %s" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "Bruger logget pÃ¥ webgrænsefladen" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "Bruger logget ind" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Mangler sessionsnøgle" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Fejl: Kræver sessionsnøgle" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Fejl: Forkert sessionsnøgle" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "API-nøgle mangler, indtast api-nøglen fra Konfiguration->Generelt i dit " "tredjepartsprogram:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "Forkert API-nøgle, anvend api-nøglen fra Konfiguration->Generelt i dit " "tredjepartsprogram:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Brugeroplysninger mangler, indtast brugernavn/adgangskode fra Konfiguration-" ">Generelt i dit tredjepartsprogram:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Prøv vores nye hud Glitter! Frisk nyt design, der er optimeret til " "stationære og mobile enheder. GÃ¥ til Konfiguration -> Generelt for at ændre " "din hud." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "Mislykkede login forsøg fra %s" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
SABnzbd genstart færdig.
Vent i ca 5 sekunder og klik " "derefter på knappen nedenunder..

Opdater
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Advarsel: Localhost er tvetydig, bruge numerisk IP-adresse." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "Serveradressen \"%s:%s\" er ikke gyldigt." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Feed" #: sabnzbd/interface.py msgid "Daily" msgstr "Dagligt" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "Mandag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Tirsdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Onsdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Torsdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Fredag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Lørdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Søndag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "slået fra" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Udefineret server!" #: 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 msgid "Back" msgstr "Tilbage" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "FEJL:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Fejl værdi før %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "d" #: sabnzbd/misc.py msgid "h" msgstr "h" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Fejl ved oprettelse af SSL-nøgle og certifikat" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Køre script" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Efterbehandling blev afbrudt (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Script" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Udpakning af nesting for dybt [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Sammenlægger" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Ufuldstændig sekvens af filsammenlægning" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Filsammenlægning af %s mislykkedes" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Fejl \"%s\" under filsammenlægning" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Fejl \"%s\" når du køre file_join på %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] Sammen lagte %s filer" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Udpakning mislykkedes, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Fejl \"%s\" under udpakning af RAR filer" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Fejl \"%s\" når du køre rar_unpack på %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Fjernelse af %s mislykkedes!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Forsøger unrar med adgangskode \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Udpakning mislykkedes, arkivet kræver adgangskode" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Udpakker" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Udpak" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Udpakning mislykkedes, kunne ikke finde %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "FEJL: lykkedes ikke at finde \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Udpakning mislykkedes, CRC-fejl" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "FEJL: CRC mislykkedes i \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "Udpakningen fejlede, da filen er for stor til filsystemet (FAT?)" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "FEJL: Fil for stor til filsystem (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "Udpakning mislykkedes, skrivefejl eller disken fuld?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "FEJL: skrivefejll (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Udpakningen mislykkedes, stien er for lang" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "FEJL: stien for lang (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Ubrugelig RAR fil" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "Ødelagt RAR fil" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s filer i %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Fejl \"%s\" når du køre unzip() på %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Forsøger 7zip med adgangskode \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "7ZIP sæt \"%s\" er ufuldstændig, kan ikke udpakke" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Kan ikke udpakke %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Hurtig kontrollerende" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Reparér" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Hurtig kontrol OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Starter reparation" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Reparation mislykkedes, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Fejl %s når du kører par2_repair på %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Fejl \"%s\" mens par2_repair kørte på %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2 modtog forkerte indstillinger, tjek din konfiguration->Skifter " "indstillinger" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Bekræftelse i %s, alle filer er ok" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Bekræftelse i %s, kræver reparation" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" "Invalide par2 filer eller invalide PAR2 parametre, kan ikke bekræfte eller " "reparere" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Henter %s block..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Henter" #: sabnzbd/newsunpack.py msgid "Repair failed, not enough repair blocks (%s short)" msgstr "Reparation mislykkedes, ikke nok reparation blokke (%s mangler)" #: sabnzbd/newsunpack.py msgid "Repairing" msgstr "Reparerer" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Repareret i %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Disk fuld" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Bekræfter" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "Tjekker ekstra filer" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Kontrollerer" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "Python script \"%s\" har ikke udfør (+x) tilladelsessæt" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Denne server tillader ikke SSL på denne port" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "Server %s bruger et upålidelig certifikat [%s]" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Start/lukning" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "Tilføjet NZB" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Efterbehandling i gang" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Job afsluttet" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Jobbet misllykedes" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Kø færdig" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Andre beskeder" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "Ikke tilgængelig" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Kunne ikke sende Prowl besked" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Dårlig respons fra pushover (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "Det lykkedes ikke at sende pushover besked" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Dårlig respons fra pushbullet (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Det lykkedes ikke at sende pushbullet besked" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "Script returnerede exit kode %s og output \"%s\"" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "Notification scriptet \"%s\" findes ikke" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "Det lykkedes ikke at sende Windows notification" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Det lykkedes ikke at importere %s filer fra %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Ødelagt kø-fil fundet, kan ikke fortsætte" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Downloadnings fejl %s, ødelagt fil fundet" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB tilføjet i køen" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Ukendt kodning" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Ufuldstændig NZB fil %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Ødelagt NZB fil %s, springer over (årsag=%s, linje=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Tom NZB fil %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "Før-kø script job markeret som mislykkedet" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Ignorerer identiske NZB \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "Fejler dublet NZB \"%s\"" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "Dublet NZB" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Pause duplikeret NZB \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Afbrudt, kan ikke afsluttes" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DUPLIKERE" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "KRYPTEREDE" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "FOR STOR" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "UFULDSTÆNDIG" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "UØNSKET" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "FILTERED" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "VENT %s sekunder" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "PROPAGATING %s min" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Hentede i %s med et gennemsnit på %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Alder" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s artikler misdannede" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s artikler manglede" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s artikler havde ikke-matchende dubletter" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s artikler blev fjernet" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Det lykkedes ikke at importere %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Advarsler" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Inaktiv" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Opsætning" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Kø" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Rens køen" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Historik" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Tøm historik" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Hastighedsbegrænsning" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Pause" #: sabnzbd/osxmenu.py msgid "min." msgstr "min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Genoptag" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Scan overvåget mappe" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Læs alle RSS feeds" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Færdig mappe" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Ufuldstændig mappe" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Fejlfinding" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Genstart" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Genstart uden login" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Afslut" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Kø (de første 10 poster)" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Tom" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Historik (de 10 seneste poster)" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Ny version tilgængelig" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Gå til guiden" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Standser..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Problem med" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd har brug for en ledig TCP-/IP-port til sine interne " "webserver.
\n" " Port %s på %s blev forsøgt, men den er ikke til rådighed .
\n" " Nogle andre programmer bruger porten eller SABnzbd kører allerede.
\n" "
\n" " Genstart venligst SABnzbd med et andet portnummer." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "Hvis du får denne fejlmeddelelse igen, prøv et andet portnummer.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd har brug for en gyldig vært adresse til intern webserver .
\n" " Du har angivet en ugyldig adresse.
\n" " Sikkert valg er localhost og 0.0.0.0
\n" "
\n" " Venligst genstart SABnzbd med en gyldig host adresse." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd har fundet gemt data fra en anden SABnzbd version
\n" " men kan ikke genbruge dataene fra det andet program.

\n" " Du ønsker måske at afslutte din kø først med det andet program.

\n" " Efter dette, start programmet med \"- rene\" valgmulighede.
\n" " Dette vil slette den nu værende kø og historik!
\n" " SABnzbd læser filen \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd kan ikke finde sin webgrænseflade filer i %s.
\n" " Venligst installer programmet igen.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd fandt en alvorlig fejl:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd opdagede, at filen sqlite3.dll mangler .

\n" " Nogle dårligt designet virus-scannere fjernede denne fil .
\n" " Tjek venligst din virus-scanner, du kan prøve at geninstallere SABnzbd " "og klage til din virus-scanner leverandør .
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Tryk Startkey + R og skriv linjen (eksempel):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Åben et terminalvindue og tast linjen (eksempel):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Programmet startede ikke!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "Alvorlig fejl" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Kan ikke starte browseren, sandsynligvis ikke fundet" #: sabnzbd/panic.py msgid "Access denied" msgstr "Adgang nægtet" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Fejl %s: Du skal angive et gyldigt brugernavn og adgangskode." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "Gamle kø opdaget, brug Status->Reparation for at konvertere kø" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" 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" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Download mislykkedes - ikke på din server (e)" #: sabnzbd/postproc.py msgid "Moving" msgstr "Flytter" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "Sendt %s til kø" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Det lykkedes ikke at omdøbe \"%s\" til \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Kunne ikke flytte filer" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Kør bruger script %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "Kørte %s" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Script exit kode er %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Mere" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Efterbehandling mislykkedes for %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "se logfil" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Download mislykkedes" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Fjernelse af %s mislykkedes." #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Overførsel fuldført" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Kan ikke oprette endelig mappe %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Efterbehandling" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Ingen par2 sæt" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Forsøger SFV verifikation" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Some files failed to verify against \"%s\"" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Kontrolleret korrekt ved hjælp af SFV filer" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "Forsøger RAR-baseret kontrol" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "[%s] RAR-baserede kontrollen mislykkedes: %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Behov adgangskode" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "RAR filer kontrolleres med succes" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "RAR filer kunne ikke bekræfte" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Fjernelse af %s mislykkedes" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Det lykkedes ikke systemet at gå i dvale" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Det lykkedes ikke systemet at gå i standby" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Fejl ved lukning af system" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Indexer id (%s) ikke fundet for ratings fil" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Serveradresse" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "API-nøgle" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" "Denne nøgle indeholder identitet indekseringen. Tjek din profil på " "indekseringens hjemmeside." #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Forkert RSS-feed beskrivelse \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Mislykkedes at hente RSS fra %s: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Har ikke gyldig godkendelse til feed %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "Server fejl (server kode %s); kunne ikke få %s på %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Server %s bruger et upålideligt HTTPS-certifikat" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "RSS Feed %s er tom" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Inkompatibel feed" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Tom RSS post blev fundet (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Vis grænseflade" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Åben færdig mappe" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Pause i" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Pause 5 minutter" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Pause 15 minutter" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Pause 30 minutter" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Pause 1 time" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Pause 3 timer" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Pause 6 timer" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Luk ned" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Tilbageværende" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Tilføj NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Forkert tidsplan %s ved %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Ukendt handling: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Tidsplan for ikke-eksisterende server %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Downloader" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Sammenlægger filer" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Kilde" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Server" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Mislykkedes" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Mislykkedes" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Venter" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Reparerer..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Udpakning..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Flytter..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Kør script..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Henter ekstra block..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Hurtig kontrol..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Bekræftelse..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Downloader" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "Propagation delay" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Opgave" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "deaktivere server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "aktivere server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Hastighedsbegrænsning" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Pause alt" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Pause efterbehandling" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Genoptag efterbehandling" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Læs RSS feeds" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Fjern mislykkede jobs" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Fjern fuldførte job" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Pause lav prioritets jobs" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Pause normal prioritets jobs" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Pause høj prioritets jobs" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Genoptag lav prioritets jobs" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Genoptag normal prioritets jobs" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Genoptag høj prioritets jobs" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Aktivere kvota styring" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Disable quota management" msgstr "Deaktivere kvota styring" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause jobs with category" msgstr "Pause jobs med kategori" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume jobs with category" msgstr "Genoptag jobs med kategori" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates] msgid "Off" msgstr "Slået fra" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Meget lav" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Moderat" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normal" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Høj" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Nødsituation" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Lav" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "time" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "timer" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "minut" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "minutter" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "sekund" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "sekunder" #: sabnzbd/skintext.py msgid "day" msgstr "dag" #: sabnzbd/skintext.py msgid "days" msgstr "dage" #: sabnzbd/skintext.py msgid "week" msgstr "uge" #: sabnzbd/skintext.py msgid "Month" msgstr "Måned" #: sabnzbd/skintext.py msgid "Year" msgstr "År" #: sabnzbd/skintext.py msgid "January" msgstr "januar" #: sabnzbd/skintext.py msgid "February" msgstr "februar" #: sabnzbd/skintext.py msgid "March" msgstr "marts" #: sabnzbd/skintext.py msgid "April" msgstr "april" #: sabnzbd/skintext.py msgid "May" msgstr "maj" #: sabnzbd/skintext.py msgid "June" msgstr "juni" #: sabnzbd/skintext.py msgid "July" msgstr "juli" #: sabnzbd/skintext.py msgid "August" msgstr "august" #: sabnzbd/skintext.py msgid "September" msgstr "september" #: sabnzbd/skintext.py msgid "October" msgstr "oktober" #: sabnzbd/skintext.py msgid "November" msgstr "november" #: sabnzbd/skintext.py msgid "December" msgstr "december" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Månedsdag" #: sabnzbd/skintext.py msgid "This week" msgstr "Denne uge" #: sabnzbd/skintext.py msgid "This month" msgstr "Denne måned" #: sabnzbd/skintext.py msgid "Today" msgstr "I dag" #: sabnzbd/skintext.py msgid "Total" msgstr "Totalt" #: sabnzbd/skintext.py msgid "on" msgstr "på" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parameter" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Python-version" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Startside" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "eller" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Vært" #: sabnzbd/skintext.py msgid "Comment" msgstr "Kommentar" #: sabnzbd/skintext.py msgid "Send" msgstr "Send" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Annullér" #: sabnzbd/skintext.py msgid "Other" msgstr "Andet" #: sabnzbd/skintext.py msgid "Report" msgstr "Rapportér" #: sabnzbd/skintext.py msgid "Video" msgstr "Video" #: sabnzbd/skintext.py msgid "Audio" msgstr "Lyd" #: sabnzbd/skintext.py msgid "Not used" msgstr "Bruges ikke" #: sabnzbd/skintext.py msgid "or less" msgstr "eller mindre" #: sabnzbd/skintext.py msgid "Log in" msgstr "Log in" #: sabnzbd/skintext.py msgid "Log out" msgstr "Log ud" #: sabnzbd/skintext.py msgid "Remember me" msgstr "Husk mig" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "Det automatiske usenet download værktøj" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Gem" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Gemmer.." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Er du sikker?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Slet alle hentede filer?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Hjem" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Konfiguration" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Status" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Hjælp" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Forum" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "Problemer" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "Støt projektet, donér!" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Generelt" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Mapper" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Parameter" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Planlægning" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Meddelelser" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "E-mail" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Kategorier" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Sortering" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Speciel" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Søg" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Download mappe" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "PAUSET" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "Cached %s artikler (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Sysload" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Ny version %s tilgængelig" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Er du sikker på du vil lukke SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Tilføj" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Tilføj fil" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Kategori" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Forløb" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Prioritet" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Reparere" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Udpakke" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Slette" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "P" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "T" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Tvinge" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Stop" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "Når køen er færdig" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Luk computer" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "Sæt computer i standby" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Sæt computer i dvale" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Afslut SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Hastighedsbegrænsning" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Rækkefølge" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Navn" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "Tid tilbage" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "ALDER" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Fjern" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Forsøg igen" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Handlinger" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Scripts" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Fjern alt fra køen?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Rens NZB'er" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Rens NZB'er & slet filer" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Prøv igen alle mislykkede job" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Fjern NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Fjern NZB & slet filer" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "fra" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Mangler artikler" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Kvota tilbage" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "manuelt" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Nulstil kvota nu" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Slet alle afsluttede emner fra historie?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Skjul detaljer" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Vis detaljer" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Vis mislykket" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Vis Alt" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Størrelse" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Rens mislykket NZB'er" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Rens mislykket NZB'er & slet filer" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Rens komplette NZB'er" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "Rens NZBs på den aktuelle side" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "Valgfri Supplerende NZB" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Sti" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Prøv igen alle mislykkede" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Prøv igen alle" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Udenfor retention" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Et andet problem" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Gennemtving afbrydelse" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Dette vil sende en test e-mail til din konto." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Vis log" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Test E-mail" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Logning" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Fejl/Advarsel" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Info" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Fejlfinding" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Forbindelser" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Seneste advarsler" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "ryd" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Ophæv blokering" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Artikel identifikator" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Fil sæt" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Når" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Type" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Aktiveret" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Oversigt" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Tilslutning mislykkedes!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Lokal IPv4 adressse" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Offentlig IPv4 adresse" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "IPv6 adresse" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Nameserver/DNS Lookup" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "CPU Model" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "System Performance (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Download mappe hastighed" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Komplet mappe hastighed" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Skrive hastighed" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "Kunne ikke skrive. Kontrollér, at mappen er skrivbar." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Klik på gentagelse testknappen nedenfor for at afgøre" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Gentagelse test" #: sabnzbd/skintext.py msgid "Test download" msgstr "Test overførsel" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "Konfigurations fil" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Brugt chace" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Knappen vil genstarte SABnzbd.
Andvend den hvis du oplever stabilitets " "problem.
Downlodning vil blive sat på pause før genstart og genoptages " "automatisk igen efter genstart." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "
Hvis godkendelse er aktiveret, skal du logge ind igen." #: sabnzbd/skintext.py msgid "Advanced" msgstr "Avanceret" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Der er forældreløse jobs i download mappen.
Du kan vælge at slette dem " "(herunder filer) eller sende dem tilbage til køen." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "\"Reparation\" knappen vil genstarte SABnzbd og lave en komplet
rekonstruktion af køens indhold, bevare allerede downloadede filer.
Dette vil ændre køens orden." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Ændringerne er ikke gemt og vil blive mistet." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" "Når din IP-adresse ændres eller SABnzbd genstarter, udløber sessionen." #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Aktivér Unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "Aktivere 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" "Fremskynde reparationer ved at installere multicopy Par2, det findes til " "mange platforme." #: sabnzbd/skintext.py msgid "Version" msgstr "Udgave" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Oppetid" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Sikkerhedskopi" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Læs mere om dette på Wiki Help!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Genstarter SABnzbd..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Ændringer kræver genstart af SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "SABnzbd Webserver" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "SABnzbd Adresse" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Adresse som SABnzbd ska lytte på." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "SABnzbd Port" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Port som SABnzbd ska lytte på." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Webgrænseflade" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Vælg et Web-grænseflade udseende." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "SABnzbd brugernavn" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Valgfrit brugernavn." #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "SABnzbd adgangskode" #: sabnzbd/skintext.py msgid "Optional authentication password." msgstr "Valgfrit adgangskode." #: 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" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "HTTPS Aktivering" #: sabnzbd/skintext.py msgid "not installed" msgstr "ikke installeret" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Aktiver adgang til interface fra en HTTPS-adresse." #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "HTTPS Port" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Hvis tom, vil standard-porten kun lytte til HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "HTTPS Certifikat" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Filnavn eller sti til HTTPS Certifikat." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" "Generer ny selvsigneret certifikat og nøgle. Kræver SABnzbd genstart!" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "HTTPS Nøgle" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Filnavn eller sti til HTTPS Nøgle." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "HTTPS kæde certifikater" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Filnavn eller sti til HTTPS kæde." #: sabnzbd/skintext.py msgid "Tuning" msgstr "Justering" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "RSS Opdaterings interval" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Kontrol af interval (i minutter, i hvert fald 15). Ikke aktiv, når du bruger " "skemaer!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Maksimal linje hastighed" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Procentvis af linje hastighed" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "Hvilken procentdel af linje hastighed bør SABnzbd bruge, fx 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Cache størrelse af artikler" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Cache artikler i hukommelsen for at reducere diskadgang.
I bytes, " "efterfulgt af K,M,G. For eksempel: \"64M\" eller \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Ryd listen" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Listen over filtypenavne, der skal slettes efter download.
For " "eksempel: nfo eller nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "Behold alle jobs" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "Behold maximal antal af gennemførte jobs" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "Behold gennemførte jobs maximal antal af dage" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "Behold ikke gennemførte jobs" #: sabnzbd/skintext.py msgid "Jobs" msgstr "Jobs" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Gem ændringer" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "Gendan standardværdier" #: sabnzbd/skintext.py msgid "Reset" msgstr "Nulstil" #: sabnzbd/skintext.py msgid "Language" msgstr "Sprog" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Vælg et web-grænseflade sprog." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" "Hjælp os med at oversætte SABnzbd på dit sprog!
Tilføj uoversatte " "tekster eller forbedrede eksisterende oversættelser her:" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "Denne nøgle vil give 3. parts programmer fuld adgang til SABnzbd." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "NZB nøgle" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Denne nøgle vil give 3. parts programmer til at tilføje NZBs til SABnzbd." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Generere Ny Nøgle" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "API nøgle QR kode" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Liste over lokale netværk intervaller" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Alle lokale netværksadresser starter med disse præfikser (ofte " "\"192.168.1.\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Eksterne internetadgang" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" "Du kan angive adgangsrettigheder for systemer uden for dit lokale netværk. " "Kræver liste over lokale netværks intervaller, skal defineres." #: sabnzbd/skintext.py msgid "No access" msgstr "Ingen adgang" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Tilføj NZB filer " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (ingen konfiguration)" #: sabnzbd/skintext.py msgid "Full API" msgstr "Fuld API" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Fuld webinterface" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "Kun ekstern adgang kræver login" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "OBS: Mapper vil blive oprettet automatisk, når du gemmer. Du kan " "bruge absolutte stier til at gemme uden for standardmapperne." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Brugermapper" #: sabnzbd/skintext.py msgid "Browse" msgstr "Gennemse" #: sabnzbd/skintext.py msgid "In" msgstr "Ligger i" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Midlertidig download mappe" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Sted at gemme uforarbejdede downloads.
Kan kun ændres, når køen er " "tom." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Minimum fri plads til midlertidige download mappe" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Auto-pause, når ledig plads kommer under denne værdi.
I bytes, evt. " "efterfulgt af K, M, G, T. For eksempel: '800M 'eller '8 G'" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Færdig download mappe" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Sted at opbevare færdige, fuldt forarbejdede downloads.
Kan " "tilsidesættes af bruger-definerede kategorier." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Tilladelser til fuldførte overførsler" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Angive tilladelses mønster for afsluttede filer.
Anvend ciffer. For " "eksempel: \"755\" eller \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Overvåget Mappe" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Mappe til at gennemsøge for. Nzb filer.
Skanner også for .zip .rar " "og .tar.gz arkiver efter .nzb filer." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Skannings interval for overvåget mappe" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Sekunder mellem skanninger for .nzb filer." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "Scripts mappe" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "Mappe, der indeholder bruger-scripts." #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "E-mail-mappe skabeloner" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Mappe, der indeholder brugerdefinerede e-mail-skabeloner." #: sabnzbd/skintext.py msgid "Password file" msgstr "Adgangskode-fil" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Fil, der indeholder alle adgangskoder. Vil blive brugt på adgangskode " "beskyttede RAR filer." #: sabnzbd/skintext.py msgid "System Folders" msgstr "Systemmapper" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Administrativ mappe" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Placering for kø administrativ og historik database.
Kan kun ændres, " "når køen er tom." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Data vil ikke blive flyttet. Kræver SABnzbd genstartet!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Log mappe" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Placering af logfiler for SABnzbd.
Kræver genstart af SABnzbd!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr ".nzb Backup mappe" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Sted hvor .nzb filer gemmes." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Standard Base Folder" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Download alle par2 filer" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" "Dette forhindrer flere reparationer kører ved at downloade alle par2 filer " "når det er nødvendigt." #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Aktivere rekursive udpakning" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Udpakke arkiver (rar, zip, 7z) i arkiver." #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Ignorere hvilken som helst mappe indeni arkiv" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Alle filer vil ligges ind i en enkelt mappe." #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Kun artiklerne fra starten af køen" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Aktiver til mindre brug af hukommelse. Deaktiver for at forhindre langsom " "job fra at blokerer køen." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Efterbehandling kun verificerede jobs" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "Kun udføre efterbehandling af jobs som har bestået PAR2 kontrollen." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Handling når krypteret RAR er downloadet" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "I tilfælde af \"Pause\", skal du angive en adgangskode og genoptage jobbet." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Find identiske downloads" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" "Fundet identiske NZB filer (baseret på elementer i din historik eller filer " "i. nzb Backup mappe)" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Opdage identiske episoder i serier" #: sabnzbd/skintext.py msgid "" "Detect identical episodes in series (based on \"name/season/episode\" of " "items in your History)" 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 "Tillad reelle udgivelser" #: 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" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "Mislykkes job (flyt til historik)" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "Marker job" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Afbryd" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Aktion når uønsket extension er fundet" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "Aktion når uønsket extension er fundet i RAR fil" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Uønsket extension" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Vis alle uønskede extensions. For eksempel: exe or exe, com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Aktiver SFV-baseret kontrol" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Udfør en ekstra kontrol baseret på SFV-filer." #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Bruger-script kan markere et job som mislykket" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Når bruger scriptet returnerer et non-zero exit code, vil jobbet blive " "markeret som mislykkedes." #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "Ved fejl, prøv alternativ NZB" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "Nogle servere levere en alternativ NZB når et download mislykkes." #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "Brug mærker fra indexer" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Aktiver mappe omdøbning" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Brug midlertidig navne under efterbehandling. Deaktiver når dit system ikke " "kan håndtere det ordentligt." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Før kø bruger script" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Brugt før, en NZB kommer ind i køen." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Ekstra PAR2 parameter" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "God parameter" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "IONice parametre" #: sabnzbd/skintext.py msgid "External process priority" msgstr "Ekstern proces prioritet" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Afbryd når køen er tom" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "Afbryd fra usenet-serverne når køen er tom eller sat på pause." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Sortere efter alder" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Sortere automatisk efter (gennemsnits) alder." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" "Indlæg vil blive sat på pause indtil de har mindst denne alder. Indstilling " "af job prioritet til Tvang vil springe forsinkelsen over." #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Kontroller for ny version" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Kontroller for ny version af SABnzbd hver uge." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "Test også udgivelser" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Erstat mellemrum i mappenavn" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Erstat mellemrum med understreg i mappenavn." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Erstat punktummer i mappenavn" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Erstat punktum med mellemrum i mappenavn." #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Gør Windows kompatibel" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "For servere: Kontroller navne er kompatibel med Windows." #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Start web browser ved opstart" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Starter standard web browser når SABnzbd starter." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Pause downloading under efterbehandling" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Pauser downloadet i begyndelsen af efterbehandling og igen når den er færdig." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Ignorer Sample-filer" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Filtrerer prøve filer (f.eks. video eksempler)." #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Fjern efter download" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "verifikation HTTPS certifikat" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" "Kontroller certifikater, når du opretter forbindelse til indeksører og RSS-" "kilder ved hjælp HTTPS." #: sabnzbd/skintext.py msgid "Server" msgstr "Server" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Efterbehandling" #: sabnzbd/skintext.py msgid "Naming" msgstr "Navngivning" #: sabnzbd/skintext.py msgid "Quota" msgstr "Kvota" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indeksering" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Hvor meget der kan downloades i denne måned (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Nulstil dag" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "På hvilken dag i måneden eller ugen (1 = mandag) nulstiller din " "internetudbyder kvota? (Valgfrit med tt: mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Automatisk genoptag" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "Skal download genoptages efter kvotaen er nulstillet?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Kvota periode" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "Bliver kvota nulstillet hver dag, uge ​​eller måned?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Tjek før download" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Prøv at forudsige en vellykket afslutning, før selve download (langsom!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "SSL-chifre" #: sabnzbd/skintext.py 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 msgid "Maximum retries" msgstr "Maksimalt antal forsøg" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Maksimalt antal forsøg per server" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Afbryd job, der ikke kan færdiggøres" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Når under download det bliver klart, at for meget data mangler, afbryd jobbet" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "Aktiver indekseringen Integration" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Aktivere filtrering" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Håndter downloads efter filtrering regler." #: sabnzbd/skintext.py msgid "Abort If" msgstr "Afbryd hvis" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Ellers pause hvis" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Video rating" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Lyd rating" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spam" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Bekræftet" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Flere thumbs ned end op" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Titel nøgleord" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Kommasepareret liste" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Nyttigt, hvis en newsserver har mere end én IPv4/IPv6-adresse" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Tilføj server" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Serverbeskrivelse" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Port" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Brugernavn" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Adgangskode" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Tidsudløb" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Tilgængelighed i dage" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "Sikker forbindelse til server" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "Certifikatkontrol" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "Deaktiveret" #: sabnzbd/skintext.py msgid "Minimal" msgstr "Minimal" #: sabnzbd/skintext.py msgid "Strict" msgstr "Streng" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 er højeste prioritet, 100 er den laveste prioritet" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Valgfri" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" "For upålidelige servere, vil blive ignoreret længere i tilfælde af fejl" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Aktivere" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Fjern server" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Testserver" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Nulstil tæller" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Tester serverdetaljer..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Båndbredde" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Send gruppe" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Send gruppe kommandoen, før du anmoder om artikler." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Personlige notater" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Opret planlægning" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Forekomst" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Udfør" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Argumenter" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Aktuel planlægning" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Afkrydsningsfeltet ud for feed navn skal afkrydses for at feeds vil være " "aktiveret og automatisk kontrolleres for nye emner.
Når et feed er " "tilføjet, vil det kun hente nye informationer og ikke noget, der allerede " "findes i RSS-feed, medmindre du trykker på \"Force Download\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "Adskil flere URL-adresser med komma" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Læs Feed" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Gennemtving download" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filter" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Acceptere" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Afvise" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Kræver" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "Kræver Cat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Mindst" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Højst" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "Fra SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "Fra Show SxxEyy" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Matchede" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Matchede ikke" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Hentet" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Læs alle Feeds nu" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "E-mail påmindelse når job er fuldført" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Aldrig" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Altid" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Kun ved fejl" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Påmindelse når harddisk er fyldt" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "Send e-mail når harddisken er fyldt og SABnzbd er pauset." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Send RSS meddelelser" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "Send e-mail når en RSS-feed tilføjer job i køen." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "SMTP-server" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Indtast ISP's server for udgående e-mail." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "E-mail modtagere" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "E-mail adresse hvor den skal sendes til." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "E-mail sendere" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Hvem skal vi sige sendte e-mailen?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "VALGFRIT konto brugernavn" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Brugernavn for e-mail som kræver godkendelse." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "VALGFRIT Brugeradgangskode" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Adgangskode for e-mail som kræver godkendelse." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Notifikation sendt!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Aktiver Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Bruges kun ved Growl fjern server (vært: port)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Serveradgangskode" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Valgfri adgangskode til Growl server" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "Aktiver NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Notification Center" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Aktiver Windows notifikationer" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Windows Notifikationer" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Aktivere Prowl notifikation" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Kræver en Prowl konto" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "API nøgle for Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Personlig API nøgle for Prowl (påkrævet)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Aktivere Pushover anmeldelser" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Kræver en Pushover konto" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Program token" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Program token (krævet)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Bruger nøgle" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Bruger nøgle (krævet)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Enhed(er)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Aktiver Pushbullet notifikationer" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Kæver en Pushbullet konto" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Personlig API nøgle" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Din personlige Pushbullet API nøgle (krævet)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Enhed" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Enhed som meddelse skal sendes til" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "Notification Script" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "Aktivere notification script" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "Udfører et brugerdefineret script" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "Hvilke script skal vi udføre for notification?" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" "Indeksatorer kan levere en kategori inde NZB som SABnzbd vil forsøge at " "matche de kategorier defineret nedenfor. Derudover kan du føje betingelser " "til ' indekseringen kategorier/grupper til at matche flere kategorier. Brug " "kommaer til at adskille vilkår. Jokertegn i vilkårene er understøttet. " "
Der findes mere information i wikien." #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Slutter stien med en stjerne *, vil forhindre oprettelse af ​​job mapper." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Relative mapper er baseret på" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Mappe/Søgesti" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "Indekseringen kategorier/grupper" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Serie sortering" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Aktivere TV sortering" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Hjælp til Sorteringsstræng" #: sabnzbd/skintext.py msgid "Clear" msgstr "Ryd" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "Anvend filtre" #: sabnzbd/skintext.py msgid "Presets" msgstr "Forudindstillinger" #: sabnzbd/skintext.py msgid "Example" msgstr "Eksempel" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "Film sortering" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Aktivere filmsortering" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Behold løse download i ekstra mapper" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Påvirkede Kategorier" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Betyder" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Mønster" #: sabnzbd/skintext.py msgid "Result" msgstr "Resultat" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Sæsonmappe" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Sæsonmappe" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Episodemappe" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 Episodemappe" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "Job Navn som Filnavn" #: sabnzbd/skintext.py msgid "Title" msgstr "Titel" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Film Navn" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Film.Navn" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Film_Navn" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Vis navn" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Vis.Navn" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Vis_Navn" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Sæsonnummer" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Episodenummer" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Episodenavn" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Episode.Navn" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Episode_Navn" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Filtype" #: sabnzbd/skintext.py msgid "Extension" msgstr "Endelse" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Delnummer" #: sabnzbd/skintext.py msgid "Decade" msgstr "Årti" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Originalfilnavn" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "Oprindelig Job Navn" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Små bogstaver" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEKST" #: sabnzbd/skintext.py msgid "text" msgstr "tekst" #: sabnzbd/skintext.py msgid "file" msgstr "fil" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Sorteringsstreng" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Multi-del etikette" #: sabnzbd/skintext.py msgid "In folders" msgstr "I mappe" #: sabnzbd/skintext.py msgid "No folders" msgstr "Ingen mappe" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Dato sortering" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Aktivere datosortering" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Vis Navn på mappe" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "År-Måned mapper" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Daglige mapper" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "sag-justeret" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Forarbejdede resultat" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Sjældent anvendte indstillinger. Deres betydning og forklaring, klik på " "knappen Hjælp for at gå til siden Wiki.
Ændre ikke disse uden at " "kontrollere wiki'en først, da disse kan give alvorlige side " "følger.
Standardværdierne er mellem parenteserne." #: sabnzbd/skintext.py msgid "Values" msgstr "Værdier" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Ændre NZB detaljer" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Slet" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Øverst" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Op" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Ned" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Bunden" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Alle" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Invertere" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Filnavn" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Emne" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Udvælgelse" #: sabnzbd/skintext.py msgid "left" msgstr "tilbage" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Ledig diskplads" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Midlertidig mappe" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Multi-operationer" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Hold Skiftetasten nede for at vælge et område" #: sabnzbd/skintext.py msgid "Check all" msgstr "Tjek alle" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Genstart SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Status og grænseflade indstillinger" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Eller trække og slippe filer i vinduet!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Mistet forbindelsen til SABnzbd.." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Opdateringsfrekvens" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Brug globale grænseflade indstillinger" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Køen elementbegrænsning" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Historik elementbegrænsning" #: sabnzbd/skintext.py msgid "Date format" msgstr "Datoformat" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Ekstra kø kolonne" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "Ekstra kolonne historie" #: sabnzbd/skintext.py msgid "page" msgstr "side" #: sabnzbd/skintext.py msgid "Loading" msgstr "Indlæser" #: sabnzbd/skintext.py msgid "articles" msgstr "artikler" #: sabnzbd/skintext.py msgid "Rename" msgstr "Omdøbe" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Kø reparation" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Vis aktive forbindelser" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Forældreløse jobs" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Send tilbage til køen" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Fjern alle" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Prøv igen alle" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Hent NZB fra URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "Upload NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Angiv et valgfrit filnavn" #: sabnzbd/skintext.py msgid "Submit" msgstr "Tilføj" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Åbn informations URL" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Tilføjet. Mange tak!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Intet er valgt!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Fjern alle valgte filer" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Skjul/vis komplette filer" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Vis scriptlog" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Opdatering tilgængelig!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" "LocalStorage (cookies) er deaktiveret i din browser, indstillinger for " "brugergrænsefladen vil gå tabt, når du lukker browseren!" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "Glitter har nogle (nye) egenskaber, du kan lide!" #: sabnzbd/skintext.py msgid "Custom" msgstr "Tilpasse" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "Kompakt layout" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "Tabbed layout
(separat kø og historie)" #: sabnzbd/skintext.py msgid "Speed" msgstr "Hastighed" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Bekræft Kø-fjernelse" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Bekræft Historik-fjernelse" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Hvor længe eller indtil hvornÃ¥r du vil standse? (pÃ¥ engelsk!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Vi kunne desværre ikke fortolke denne. Prøv igen." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Pause i..." #: 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 Oldest→Newest" msgstr "Sortere efter alder Ældst→Nyeste" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Sortere efter alder Nyeste→Ældst" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Sortere efter navn A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Sortere efter navn Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Sortere efter størrelse Mindst→Størst" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Sortere efter størrelse Størst→Mindst" #: sabnzbd/skintext.py msgid "Uploading" msgstr "Uploader" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "Tvinge afbrydelse" #: sabnzbd/skintext.py msgid "Removing job" msgstr "Fjernelse af job" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "Fjernelse af jobs" #: sabnzbd/skintext.py msgid "Prev" msgstr "ForegÃ¥ende" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Næste" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "Vil du virkelig tømme historiken?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Du skal aktivere JavaScript for at fÃ¥ Plush til virke!" #: sabnzbd/skintext.py msgid "Options" msgstr "Muligheder" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Pause i hvor mange minutter?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Topmenu" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Ved afslutning" #: sabnzbd/skintext.py msgid "Sort" msgstr "Sortere" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Sortere efter Alder (Ældst→Nyeste)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Sortere efter Alder (Nyeste→Ældst)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Sortere efter Navn (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Sortere efter Navn (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Sortere efter Størrelse (Mindst→Størst)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Sortere efter Størrelse (Størst→Mindst)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "Tøm køen?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Prøv igen alle mislykkede job i historien?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Ryd" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Max hastighed" #: sabnzbd/skintext.py msgid "Range" msgstr "Interval" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Anvend pÃ¥ markerede" #: sabnzbd/skintext.py msgid "Everything" msgstr "Alt" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Opdateringsinterval" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Beholder Bredde" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Dette vil forhindre indhold i at blive opdateret nÃ¥r musens markør kører hen " "over køen." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Bloker genopfriskninger ved at hænge over" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Upload" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Upload: .nzb .rar .zip .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Fremgang" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Ikke nok diskplads til at fuldføre downloads!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Ledig tempdiskplads" #: sabnzbd/skintext.py msgid "IDLE" msgstr "VENTER" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Hentede filer" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "SABnzbd Hurtigstart’s Guide" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "SABnzbd version" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Forrige" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Serverdetaljer" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Angiv detaljerne fra din primære usenet udbyder." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Antallet af forbindelser tilladt af din udbyder" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "F.eks. 8 eller 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Vælg kun hvis din udbyder tillader SSL-forbindelser." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Klik for at teste de indtastede informationer." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Eks." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "Installationen er nu fuldført!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd vil nu køre i baggrunden." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "Lukning af alle browservinduer/faneblade vil ikke lukke SABnzbd." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Det anbefales, at du højreklikker og bogmærker denne placering, og bruger " "dette bogmærke for at fÃ¥ adgang SABnzbd, nÃ¥r det kører i baggrunden." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Øvrig hjælp kan du finde pÃ¥ vores" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "GÃ¥ til SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "Afslut SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Start guide" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd kommer med ABSOLUT INGEN GARANTI. \n" "Det er gratis software, og du er velkommen til at videredistribuere det " "under visse betingelser. \n" "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] msgid "Error getting TV info (%s)" msgstr "Det lykkedes ikke at hente TV info (%s)" #: sabnzbd/sorting.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] msgid "Failed to rename similar file: %s to %s" msgstr "Kunne ikke omdøbe lignende fil: %s til %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Uautoriseret adgang" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "Fil ikke pÃ¥ server" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "Serveren kunne ikke fuldføre anmodningen" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "URLGRABBER CRASHED" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "Fejl, Ubrugelig arkivfil" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "URL hentning mislykkedes; %s" #~ msgid "_yenc module... NOT found!" #~ msgstr "_yenc modul... IKKE fundet!" #~ 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." #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Din unrar version kan ikke anbefales, hent UNRAR fra " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "Ingen unrar program fundet, udpakning RAR filer er ikke mulig
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "Ingen PAR2 program fundet, reparationer ikke muligt
" #~ msgid "Initiating restart...
" #~ msgstr "Forbereder genstart...
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "Job \"%s\" er genoptaget i køen" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "Jobs markeret med '*' vil ikke blive hentet automatisk." #~ msgid "Not matched" #~ msgstr "Matchede ikke" #~ msgid "Downloaded so far" #~ msgstr "Hentet indtil videre" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Kan ikke tilslutte til registreringsdatabasen HKEY_CURRENT_USER." #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Kan ikke Ã¥bne nøgle i registreringsdatabasen \"%s\"." #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Kunne ikke læse nøgler i registreringsdatabasen for specielle mapper" #~ msgid "You have no permisson to use port %s" #~ msgstr "Du har ingen tilladelse til at bruge port %s" #~ msgid "Try again" #~ msgstr "Forsøg igen" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "pyopenssl modul mangler, du skal installere for HTTPS-adgang" #~ msgid "ERROR: %s" #~ msgstr "FEJL: %s" #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "Manglede forventet fil: %s => unrar fejl?" #~ 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 "File %s is empty, skipping" #~ msgstr "Fil %s er tom, springer over" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "Det lykkedes ikke at fjerne nzo fra efterbehandlings køen (id)" #~ msgid "View script output" #~ msgstr "Vis script udlæsning" #~ msgid "Error removing workdir (%s)" #~ msgstr "Det lykkedes ikke at fjerne arbejdsmappen (%s)" #~ msgid "Queued" #~ msgstr "Køen" #~ msgid "Complete Dir" #~ msgstr "Færdig download mappe" #~ msgid "Download speed" #~ msgstr "Download hastighed" #~ msgid "WARNINGS" #~ msgstr "ADVARSLER" #~ msgid "Add new downloads" #~ msgstr "Tilføj nye downloads" #~ msgid " or Report ID" #~ msgstr " eller Report ID" #~ msgid "Hide files" #~ msgstr "Skjul filer" #~ msgid "Show files" #~ msgstr "Vis filer" #~ msgid "Remain/Total" #~ msgstr "Tilbage/Totalt" #~ msgid "History Size" #~ msgstr "Størrelse af Historik" #~ msgid "Show Weblogging" #~ msgstr "Vis webblog" #~ msgid "Thread" #~ msgstr "TrÃ¥d" #~ msgid "Email Test Result" #~ msgstr "E-mail testresultat" #~ msgid "General configuration" #~ msgstr "Generel konfiguration" #~ msgid "Activate an alternative skin." #~ msgstr "Aktivere et alternativ udseende." #~ msgid "Web server authentication" #~ msgstr "Webserver godkendelse" #~ msgid "Queue auto refresh interval:" #~ msgstr "Automatisk opdaterings interval af kø:" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "opdaterings interval af kø-siden (sek, 0= ingen)." #~ msgid "Disable API-key" #~ msgstr "Deaktivere API-nøgle" #~ msgid "Do not require the API key." #~ msgstr "Kræver ingen API-nøgle." #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "ANDVEND PÃ… EGEN RISIKO!" #~ msgid "Folder configuration" #~ msgstr "Mappe konfiguration" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Efterbehandlings scripts mappe" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "Mappe, der indeholder bruger scripts til efterbehandling." #~ msgid "Switches configuration" #~ msgstr "Parameterkonfiguration" #~ msgid "Processing Switches" #~ msgstr "Forløbs parameter" #~ msgid "Enable Quick Check" #~ msgstr "Aktiver hurtig tjek" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Spring par2 kontrol over, nÃ¥r filerne er 100% gyldige." #~ msgid "Enable built-in unzip functionality." #~ msgstr "Aktivere indbygget Unzip funktion." #~ msgid "Enable Filejoin" #~ msgstr "Aktiver Fil Sammenføjning (Filejoin)" #~ msgid "Enable TS Joining" #~ msgstr "Aktivere TS Sammenføjning (TS Joining)" #~ msgid "Enable Par Cleanup" #~ msgstr "Aktiver Par rensning (Par Cleanup)" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Oprydning af par filer (hvis kontrollerede / reparation lykkedes)." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Ved fejl pÃ¥ yEnc CRC" #~ msgid "Default Post-Processing" #~ msgstr "Standard efterbehandling" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "Anvedes nÃ¥r efterbehandlingen er bestemt efter kategori." #~ msgid "Default User Script" #~ msgstr "Standard bruger scripts" #~ msgid "Used when no user script is defined by the category." #~ msgstr "Anvendes nÃ¥r bruger scripts er bestemt efter kategori." #~ msgid "Default Priority" #~ msgstr "Standard prioritet" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Anvendes nÃ¥r ingen prioritet er bestemt af kategori." #~ msgid "Enable MultiCore Par2" #~ msgstr "Aktivere MultiCore Par2" #~ msgid "Other Switches" #~ msgstr "Andre parameter" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Erstat ugyldige tegn i mappenavn." #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "Erstat ugyldige tegn i mappenavn med modsvarende tegn (ellers fjern)." #~ msgid "Do not download" #~ msgstr "Download ikke." #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "Anvend V23 hvis ikke din leverandør (ISP) kræver andet!" #~ msgid "Server configuration" #~ msgstr "Serverkonfiguration" #~ msgid "Click below to test." #~ msgstr "Klik nedenfor for at teste." #~ msgid "Scheduling configuration" #~ msgstr "Planlægningskonfiguration" #~ msgid "RSS Configuration" #~ msgstr "RSS-konfiguration" #~ msgid "Delete Feed" #~ msgstr "Fjern Feeds" #~ msgid "Email Options" #~ msgstr "E-mail alternativ" #~ msgid "Email Account Settings" #~ msgstr "E-mail kontoinstillinger" #~ msgid "User-defined categories" #~ msgstr "Bruger definerede kategorier" #~ msgid "Defines post-processing and storage." #~ msgstr "Definerer post-behandling og opbevaring." #~ msgid "Sorting configuration" #~ msgstr "Sorteringskonfiguration" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Aktiverer sortering og omdøbning af episoder." #~ msgid "Generic Sorting" #~ msgstr "Almindelig sortering" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Aktiverer sortering og omdøbning af filer." #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "Aktivere hvis ikke download er flyttet til egen mappe." #~ msgid "Enable sorting and renaming of date named files." #~ msgstr "Aktiverer sortering og omdøbning af datomarkeret filer." #~ msgid "Are you sure you want to delete" #~ msgstr "Er du sikker pÃ¥ at du vil slette" #~ msgid "Page" #~ msgstr "Side" #~ msgid "Last" #~ msgstr "Sidste" #~ msgid "Close" #~ msgstr "Luk" #~ msgid "Pause for 12 hours" #~ msgstr "Pause 12 timer" #~ msgid "Pause for 24 hours" #~ msgstr "Pause 24 timer" #~ msgid "Open Source URL" #~ msgstr "Ã…bn kildekode URL" #~ msgid "Storage" #~ msgstr "Opbevaring" #~ msgid "Delete the all failed items from the history?" #~ msgstr "Slet alle mislykkedes emner fra historiken?" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Viser %s til %s af %s resultat" #~ msgid "Email Sent!" #~ msgstr "Sendt E-mail!" #~ msgid "Saved" #~ msgstr "Gemt" #~ msgid "Toggle Add NZB" #~ msgstr "Vis/Skjul Tilføj NZB" #~ msgid "DualView1" #~ msgstr "Flerskærme1" #~ msgid "DualView2" #~ msgstr "Flerskærme2" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "Er du sikker pÃ¥ at du vil genstarte SABnzbd?" #~ msgid "Hide Edit Options" #~ msgstr "Skjul Redigeringsalternativ" #~ msgid "Show Edit Options" #~ msgstr "Vis Redigeringsalternativ" #~ msgid "Edit" #~ msgstr "Rediger" #~ msgid "Timeleft" #~ msgstr "Resterende tid" #~ msgid "Access" #~ msgstr "Adgang" #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "Jeg ønsker at SABnzbd skal være synlige fra enhver pc pÃ¥ netværket." #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Jeg ønsker kun at SABnzbd skal være synlige fra min computer." #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Aktiver HTTPS-adgang til SABnzbd." #~ msgid "Misc" #~ msgstr "Diverse" #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "Start webbrowseren med SABnzbd's siden nÃ¥r programmet startes." #~ msgid "Please enter a whole number." #~ msgstr "Angiv et helt tal." #~ msgid "Step One" #~ msgstr "Trin et" #~ msgid "Step Two" #~ msgstr "Trin to" #~ msgid "Step Three" #~ msgstr "Trin tre" #~ msgid "Step Four" #~ msgstr "Trin fire" #~ msgid "Step Five" #~ msgstr "Trin fem" #~ msgid "KB/s" #~ msgstr "KB/s" #~ msgid " " #~ msgstr " " #~ msgid "Secondary Web Interface" #~ msgstr "Sekundær udseende" #~ msgid "HTTPS Support" #~ msgstr "HTTPS Support" #~ msgid "SSL type" #~ msgstr "SSL type" #~ msgid "Backup server" #~ msgstr "Backup server" #~ msgid "Remove" #~ msgstr "Slet" #~ msgid "Skip" #~ msgstr "Spring over" #~ msgid "New Feed URL" #~ msgstr "Ny Feed URL" #~ msgid "First" #~ msgstr "Først" #~ msgid "Set Pause Interval" #~ msgstr "Sæt pause interval" #~ msgid "Pause Interval" #~ msgstr "Pause interval" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Upload: .nzb .rar .zip .gz" #~ msgid "Links" #~ msgstr "Links" #~ msgid "Hour:Min" #~ msgstr "Time:Minut" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Efter SABnzbd har genstartet vil du være i stand til at fÃ¥ adgang til det pÃ¥ " #~ "følgende placering: %s" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd er ikke kompatibel med visse software firewalls.
\n" #~ " %s
\n" #~ " Beklager, men vi kan ikke løse denne uforenelighed lige nu.
\n" #~ " Du kan indsende en klage til din firewall leverandør.
\n" #~ "
\n" #~ msgid "OK" #~ msgstr "OK" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd brug for en ledig TCP / IP-port til sin intern webserver .
\n" #~ " Port %s på %s blev forsøgt , men den konto, der anvendes til SABnzbd har " #~ "ikke tilladelse til at bruge det.
\n" #~ " PÃ¥ OSX og Linux systemer, skal brugere normalt bruge porte over " #~ "1023.
\n" #~ "
\n" #~ " Venligst genstart SABnzbd med et andet port nummer." #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Det er sandsynligt, at du bruger ZoneAlarm på Vista .
" #~ msgid "Unpacking failed, these file(s) are missing:" #~ msgstr "Udpakning mislykkedes, disse fil (er) mangler:" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "Brug 12 timers ur (AM / PM)" #~ msgid "Showing one result" #~ msgstr "Viser et resultat" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Vis tider i AM / PM notation (påvirker ikke skemalægger)." #~ msgid "No results" #~ msgstr "Ingen resultater" #~ msgid "No email templates found" #~ msgstr "Ingen e-mail skabeloner fundet" #~ msgid "folder" #~ msgstr "mappe" #~ msgid "Original Foldername" #~ msgstr "Orginal Mappenavn" #~ msgid "Groups / Indexer tags" #~ msgstr "Gruppe / Index tags" #~ msgid "Server definition" #~ msgstr "Server definition" #~ msgid "Delete all failed items from History?" #~ msgstr "Slet alle mislykkedes emner fra historie?" #~ msgid "Purge Failed History" #~ msgstr "Rens mislykket historie" #~ msgid "Delete Failed" #~ msgstr "Slet mislykket" #~ msgid "Delete Completed" #~ msgstr "Slet komplette" #~ msgid "Feeds" #~ msgstr "Feeds" #~ msgid "Add Feed" #~ msgstr "Tilføj feed" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "Anvend backup-server ved yEnc CRC fejl." #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Læs Feedhenter det nuværende feed indholdet. Tving " #~ "hent vil hente alle matchende NZBs nu." #~ msgid "Settings" #~ msgstr "Indstillinger" #~ msgid "Get NZB" #~ msgstr "Hent NZB" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "F.eks. 119 eller 563 for SSL" #~ msgid "Filters" #~ msgstr "Filtre" #~ msgid "Check result of unpacking" #~ msgstr "Tjek resultat af udpakning" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Tjek resultat af udpakning (skal være slukket for nogle filsystemer)." #~ msgid "Invalid encoding of email template %s" #~ msgstr "Ugyldig kodning af e-mail skabelon %s" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "Sammenføjer filer, der ender med .001, .002 osv. til en fil." #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "Sammenføjer filer, der ender med, 001.ts, .002.ts osv. til en fil." #~ msgid "Send notifications to Growl" #~ msgstr "Send meddelelser til Growl" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Send meddelelser til NotifyOSD" #~ msgid "Only for optional servers" #~ msgstr "Kun for ekstra servere" #~ 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" #~ msgid "Notification classes" #~ msgstr "Notification klasser" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "" #~ "Aktiver klasser af meddelelser der skal indberettes (ingen, én eller flere)" #~ msgid "Send notifications to Notification Center" #~ msgstr "Send notifications to Notification Center" #~ msgid "Refer to https://www.oznzb.com/profile" #~ msgstr "Se https://www.oznzb.com/profile" #~ msgid "Site API Key" #~ msgstr "Sidens API nøgle" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Denne nøgle kobler profilen til indekseringen. Se " #~ "https://www.oznzb.com/profile." #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Udvidet funktioner inklusiv anmeldelser og ekstra status information bliver " #~ "tilgængelige hvis forbundet med OZnzb indekseringen." #~ msgid "Enable OZnzb Integration" #~ msgstr "Aktiver OZnzb integration" #~ msgid "OZnzb" #~ msgstr "OZnzb" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "" #~ "Send automatisk kalkuleret validerings resultater for downloads til " #~ "indekseringen." #~ msgid "Automatic Feedback" #~ msgstr "Automatisk tilbagemelding" #~ msgid "No post-processing because of failed verification" #~ msgstr "Ingen efterbehandling på grund af mislykket godkendelse" #~ msgid "Sort by name" #~ msgstr "Sortér efter navn" #~ msgid "Sort by age" #~ msgstr "Sortér efter alder" #~ msgid "Sort by size" #~ msgstr "Sortér efter størrelse" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Aktivér indbygget Unrar funktion." #~ msgid "Enable Unrar" #~ msgstr "Aktivér Unrar" #~ msgid "Left" #~ msgstr "Venstre" #~ msgid "Plush Options" #~ msgstr "Plush Indstillinger" #~ msgid "This field is required." #~ msgstr "Dette felt er påkrævet." #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "ADVARSEL: Jobbet er afbrudt \" %s\" på grund af krypteret RAR fil" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "" #~ "ADVARSEL: Jobbet er sat på pause \"%s\" på grund af krypteret RAR fil" #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Beskyt adgangen med kodeord til SABnzbd (anbefales)" #~ msgid "Unpacking failed, see log" #~ msgstr "Udpakning mislykkedes, se log" sabnzbd-develop/po/main/nl.po0000600000175000017500000044377013642116632014267 0ustar jpjp# Dutch translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2019-05-15 19:07+0000\n" "Last-Translator: Dennis Versteegen \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:02+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Webinterface kan niet gestart worden" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "Websjabloon %s niet te vinden; het standaardsjabloon wordt gebruikt." #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" "SABYenc uitgeschakeld, geen bruikbare versie gevonden! (V%s gevonden, V%s " "verwacht)" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" "SABYenc module... NIET gevonden! Verwacht V%s - https://sabnzbd.org/sabyenc" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "par2-programma niet gevonden." #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "MultiPar niet gevonden!" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "Verificatie en reparatie zal niet mogelijk zijn." #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "De UNRAR-versie is %s, we adviseren versie %s of hoger te gebruiken.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "unrar-programma niet gevonden." #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "unzip-programma niet gevonden." #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "7za-programma niet gevonden." #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Let op: als je 0.0.0.0 als hostnaam gebruikt, heb je voor externe toegang " "een IPv6-adres nodig" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "HTTP- en HTTPS-poort kunnen niet hetzelfde zijn" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" "SABnzbd is gestart met de codering %s, dit zou UTF-8 moeten zijn. Je kunt, " "bij het downloaden, problemen krijgen met Unicode namen van bestanden en " "mappen." #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "HTTPS is uitgeschakeld vanwege ontbrekende CERT- en KEY-bestanden" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Webinterface kon niet gestart worden: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "Geen verbinding mogelijk met de SABHelper-service" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s is gestart" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Waarschuwing" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Fout" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "SABnzbd is afgesloten" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Geen hostnaam opgegeven." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "" "Er zijn geen verbindingen opgegeven. Er is minimaal één verbinding nodig." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Wachtwoord gemaskeerd met ******, voer opnieuw in" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Ongeldige servergegevens" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "" "Tijdslimiet overschreden. Probeer met SSL aan of gebruik een andere poort." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Tijdslimiet overschreden" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" "Onbekend SSL protocol: probeer het zonder SSL of probeer een andere poort." #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Ongeldige servernaam" #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "De server stopte tijdens de login" #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Server heeft een gebruikersnaam en een wachtwoord nodig." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Succesvol verbonden!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Inloggen mislukt, controleer gebruikersnaam en wachtwoord." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "Te veel verbindingen, onderbreek het downloaden of probeer later nog eens." #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Kan verbindingsresultaat niet bepalen (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Signaal %s ontvangen, opslaan en afsluiten..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Onherstelbare fout bij opslaan status" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Probeer NZB op te halen van %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Opslaan van %s lukt niet" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Kan geen tijdelijk bestand maken voor %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Poging de status van niet-bestaande server %s in te stellen" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Probleem met tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Inlezen van %s mislukt" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "E-mail verzonden" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Test melding" #: sabnzbd/api.py msgid " Resolving address" msgstr " Adres opzoeken" #: sabnzbd/api.py # sabnzbd/skintext.py [No value, used in dropdown menus] # sabnzbd/skintext.py [Job details page, select no files] msgid "None" msgstr "Geen" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Standaard" #: sabnzbd/api.py msgid "unknown" msgstr "onbekend" #: sabnzbd/api.py [Error message] msgid "Failed to compile regex for search term: %s" msgstr "Het compileren van 'regex' voor de zoekterm lukt niet: %s" #: sabnzbd/assembler.py [Warning message] msgid "Too little diskspace forcing PAUSE" msgstr "Te weinig schijfruimte, pauze geforceerd" #: sabnzbd/assembler.py [Error message] msgid "Disk full! Forcing Pause" msgstr "Schijf is vol; gedwongen pauze" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Schrijffout bij opslaan van bestand %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Onherstelbare fout in de Assembler" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "WAARSCHUWING: Download \"%s\" is gepauzeerd vanwege een versleuteld RAR " "bestand (indien aanwezig, zijn alle wachtwoorden geprobeerd)" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "WAARSCHUWING: Download \"%s\" is afgebroken vanwege een versleuteld RAR " "bestand (indien aanwezig, zijn alle wachtwoorden" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Afgebroken, versleuteling ontdekt" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "WAARSCHUWING: Ongewenste extensie ontdekt in \"%s\". Het ongewenste bestand " "is \"%s\" " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "De ongewenste extensie zit in RAR-bestand %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Afgebroken, ongewenste extensie ontdekt" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "WAARSCHUWING: Download '%s' gepauzeerd vanwege rating (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "WAARSCHUWING: Download '%s' afgebroken vanwege rating (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Afgebroken, ratingfilter komt overeen (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s ontbreekt" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" "Download \"%s\" is waarschijnlijk versleuteld omdat en een RAR met dezelfde " "naam in de hoofd RAR zit." #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" "Download \"%s\" is waarschijnlijk versleuteld, omdat \"password\" in de naam " "\"%s\" voor komt." #: sabnzbd/assembler.py msgid "video" msgstr "video" #: sabnzbd/assembler.py msgid "audio" msgstr "audio" #: sabnzbd/assembler.py msgid "spam" msgstr "spam" #: sabnzbd/assembler.py msgid "passworded" msgstr "van wachtwoord voorzien" #: sabnzbd/assembler.py msgid "downvoted" msgstr "negatief beoordeeld" #: sabnzbd/assembler.py msgid "keywords" msgstr "trefwoorden" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Quotum verbruikt, download is gestopt" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s is geen geldig e-mailadres" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Serveradres verplicht" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Niet mogelijk %s map %s aan te maken" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Schrijven naar het INI-bestand %s lukt niet" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Backupbestand maken voor %s niet mogelijk" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Foutief gecodeerd wachtwoord %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s is geen correct octaal getal" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "UNC-pad '%s' hier niet toegestaan." #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Fout: het opgegeven pad mag niet langer zijn dan %s." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Fout: Wachtrij is niet leeg, andere map kiezen niet mogelijk." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" "Naar de geschiedenis-database schrijven niet mogelijk, controleer de " "toegangsrechten." #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "" "Beschadigde geschiedenis-database, is vervangen door een lege database" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "SQL-commando mislukt, zie logbestand" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "Het lukt niet om de database te sluiten, zie log" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Ongeldig loggen van fase in geschiedenis voor %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Decoderen van %s mislukt" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "Decoder fout: onvoldoende geheugen" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Slecht opgemaakt yEnc-artikel in %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Onbekende fout tijdens het decoderen van %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => ontbreekt op alle servers, overslaan" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "Direct Uitpakken" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Voltooid" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "%s bestanden/mappen uitgepakt in %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "Direct Uitpakken is automatisch ingeschakeld." #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py msgid "" "Jobs will start unpacking during the downloading to reduce post-processing " "time. Only works for jobs that do not need repair." msgstr "" "Het uitpakken van downloads wordt al gestart tijdens het downloaden. Dit " "verkort de tijd die nodig is voor het nabewerken. Dit werkt alleen als de " "download niet beschadigd is." #: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message] msgid "Cannot read %s" msgstr "%s kan niet gelezen worden" #: sabnzbd/dirscanner.py [Error message] msgid "Error while adding %s, removing" msgstr "Fout bij toevoegen van %s, wordt weer verwijderd" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Fout bij verwijderen van %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Bewaakte map %s kan niet gelezen worden" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Hervatten" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "Gepauzeerd" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Je moet eerst een maximumbandbreedte instellen voordat je een limiet kunt " "instellen" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Verbinding maken met server %s [%s] niet mogelijk" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Servernaam niet te vinden" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Server %s wordt gedurende %s minuten genegeerd" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Initialisatie van %s@%s mislukt, vanwege: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "Te veel verbindingen met server %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Mogelijk delen van account" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Aanmelden bij server %s mislukt" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Verbinding %s@%s mislukt, bericht=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Server %s heeft gebruikersnaam/wachtwoord nodig" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Vedachte fout in downloader" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Afsluiten" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Verbinding met e-mailserver mislukt" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "TLS-verbinding mislukt" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "De server reageerde niet op de 'helo'-begroeting" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Aanmelden bij e-mailserver mislukt" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Geen geschikte authenticatiemethode gevonden" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Onbekende authenticatiefout bij de e-mailserver" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Verzenden van e-mail is mislukt" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Beëindigen e-mailverbinding mislukt" #: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/rating.py msgid "Cannot send, missing required data" msgstr "Versturen kan niet, vereiste gegevens ontbreken" #: sabnzbd/emailer.py [Error message] msgid "Cannot find email templates in %s" msgstr "Geen e-mailsjablonen te vinden in %s" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Geen geadresseerden opgegeven, e-mail niet verstuurd" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd meldt een volle harde schijf\n" "\n" "Hallo,\n" "\n" "SABnzbd is gestopt met downloaden omdat de harde schrijf bijna vol is.\n" "Maak ruimte vrij en laat SABnzbd weer doorgaan.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Niet mogelijk directory %s aan te maken" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "%s directory: fout %s bij toegang" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Toegangsrechten van %s niet aan te passen" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Aanmaken (%s) mislukt" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Verplaatsen van %s naar %s mislukt" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "Verbinding met hostnaam \"%s\" geweigerd van:" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "Gebruiker heeft ingelogd" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "Gebruiker ingelogd" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Sessiesleutel ontbreekt" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Fout: Sessie sleutel nodig" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Fout: Sessiesleutel niet geldig" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "API-sleutel ontbreekt; vul de API-sleutel van 'Configuratie' => 'Algemeen' " "in bij het externe programma:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "API-sleutel incorrect; vul de API-sleutel van 'Configuratie' => 'Algemeen' " "in bij het externe programma:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Autenticatie ontbreekt; vul gebruikersnaam en wachtwoord van 'Configuratie' " "=> 'Algemeen' in bij het externe programma:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Probeer onze nieuwe skin Glitter. Compleet nieuw design, geoptimaliseerd " "voor desktops en mobiele apparaten. Ga naar Configuratie => Algemeen om de " "huidige skin te vervangen." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "Mislukte login progin bij %s" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
SABnzbd is nu afgesloten.
Wacht ongeveer 5 seconden en klik " "dan op onderstaande knop.

Verversen
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Let op: LOCALHOST is niet eenduidig, gebruik een numeriek IP-adres." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "Serveradres \"%s:%s\" is niet geldig." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Feed" #: sabnzbd/interface.py msgid "Daily" msgstr "dagelijks" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "maandag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Dinsdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Woensdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Donderdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Vrijdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Zaterdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Zondag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "uit" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Onbekende server." #: sabnzbd/interface.py msgid "Incorrect parameter" msgstr "Incorrecte parameter" #: sabnzbd/interface.py msgid "" "Category folder cannot be a subfolder of the Temporary Download Folder." msgstr "" "Een Categorie specifieke map mag niet een map in de Tijdelijke download map " "zijn." #: sabnzbd/interface.py msgid "Back" msgstr "Terug" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "FOUT:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Foute waarde voor %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "d" #: sabnzbd/misc.py msgid "h" msgstr "h" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Fout bij aanmaken SSL-sleutel en -certificaat" #: sabnzbd/misc.py 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 "" "Je wachtwoordenbestand bevat meer dan 30 wachtwoorden, het testen van al " "deze wachtwoorden kost heel veel tijd. Zorg ervoor dat je alleen maar " "nuttige wachtwoorden in dit bestand zet." #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Script uitvoeren" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Nabewerking is afgebroken (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Script" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Teveel niveaus om uit te pakken [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Samenvoegen" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Onvolledige reeks van samenvoegbare bestanden" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Samenvoegen van bestanden %s is mislukt" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Fout \"%s\" bij samenvoegen van bestanden" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Fout %s bij 'file_join' op %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] %s bestanden samengevoegd" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Uitpakken mislukt, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Fout \"%s\" bij het uitpakken van RAR-bestanden" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Fout \"%s\" bij uitvoeren van 'rar_unpack' op %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Verwijderen van %s mislukt." #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Unrar proberen met wachtwoord \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Uitpakken mislukt, archief vereist wachtwoord" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Uitpakken" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Uitpakken" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Uitpakken mislukt, kan %s niet vinden" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "FOUT: \"%s\" niet te vinden" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Uitpakken mislukt, CRC-fout" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "FOUT: onjuiste CRC in \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "Uitplakken mislukt, bestand te groot voor het bestandssysteem (FAT?)" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "FOUT: bestand te groot voor het bestandssysteem (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "Uitpakken mislukt, schrijffout of schijf vol?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "FOUT: schrijffout (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Uitpakken mislukt, bestandspad is te lang" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "FOUT: bestandspad is te lang (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Onbruikbaar RAR-bestand" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "Beschadigd RAR-bestand" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s bestanden in %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Fout '%s' bij uitvoeren van unzip() op %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Uitpakpoging met 7zip en wachtwoord '%s'" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "De 7Zip-set '%s' is incompleet, uitpakken is niet mogelijk" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Uitpakken %s niet mogelijk" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Snelle controle" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Reparatie" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Snelle Controle OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Reparatie starten" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Reparatie mislukt, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Fout %s bij uitvoeren van par2-reparatie op set %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Fout '%s' bij reparatie van set %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2-opties incorrect, controleer Configuratie=>Instellingen schakelaars" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] %s geverifieerd, alle bestanden zijn goed" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Geverifieerd in %s, reparatie is nodig" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" "Ongeldige par2 bestanden of ongeldige Par2 parameters, kan niet verifiëren " "en repareren." #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "%s herstelblokken downloaden..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Ophalen" #: sabnzbd/newsunpack.py msgid "Repair failed, not enough repair blocks (%s short)" msgstr "Reparatie mislukt, te weinig herstelblokken (%s tekort)" #: sabnzbd/newsunpack.py msgid "Repairing" msgstr "Repareren" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Gerepareerd in %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "Reparatie controleren" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Schijf is vol" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Verifiëren" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "Controleren van extra bestanden" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Controleren" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "Python-script '%s' heeft geen uitvoerpermissie (+x)" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "De server staat geen SSL toe op deze poort" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" "Servernaam komt niet overeen met de servernamen in het certificaat. Dit is " "een server-probleem." #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" "Certificaat niet geldig. Dit is hoogstwaarschijnlijk een server-probleem." #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "Server %s gebruikt een niet betrouwbaar certificaat [%s]" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Opstarten/Afsluiten" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "Download toegevoegd" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Nabewerken gestart" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Download voltooid" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Download mislukt" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Wachtrij voltooid" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Andere berichten" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "Niet beschikbaar" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Verzenden van Prowl-bericht mislukt" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Slecht antwoord van Pushover (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "Pushover-bericht sturen mislukt" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Slecht antwoord van Pushbullet (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Pushbullet-bericht sturen mislukt" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "Script gaf code %s en resultaat '%s'" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "Meldingsscript '%s' bestaat niet" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "Versturen Windows-melding mislukt" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Importeren van %s bestanden van %s mislukt" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Onbruikbaar wachtrij bestand gevonden, kan niet verder" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Fout bij inladen van %s, corrupt bestand gevonden" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "Download aan wachtrij toegevoegd" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Onbekende codering" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Onvolledig NZB-bestand %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Foutief NZB-bestand %s, overslaan (reden=%s, regel=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "NZB-bestand %s is leeg" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "Wachtrij filter script heeft de download afgekeurd" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Dubbele download \"%s\" overgeslagen" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "Download '%s' geweigerd omdat het een dubbele is" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "Dubbele download" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Dubbele download \"%s\" gepauzeerd" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Afgebroken, kan niet voltooid worden" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DUBBEL" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "VERSLEUTELD" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "TE GROOT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "ONVOLLEDIG" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "ONGEWENST" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "GEFILTERD" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "WACHT %s sec" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "VERSPREIDINGSWACHTTIJD %s min" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Gedownload in %s met een gemiddelde snelheid van %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Leeftijd" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s artikelen zijn misvormd" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s artikelen ontbreken" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s artikelen hadden afwijkende duplicaten" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s artikelen zijn verwijderd" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Fout bij importeren van %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Meldingen" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Rust" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Instellingen" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Wachtrij" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Wis wachtrij" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Geschiedenis" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Wis de volledige geschiedenis" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Beperk snelheid" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Pauze" #: sabnzbd/osxmenu.py msgid "min." msgstr "min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Doorgaan" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Bewaakte map uitlezen" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Lees alle RSS-feeds uit" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Map voltooid" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Tijdelijke download map" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Probleemoplosser" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Herstart" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Herstarten zonder login" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Afsluiten" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Wachtrij Eerste 10 Items" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Leeg" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Geschiedenis Laaste 10 Items" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Nieuwe versie beschikbaar" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Ga naar Wizard" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Afsluiten..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Probleem met" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd heeft een vrije TCP/IP poort nodig voor de interne " "webserver.
\n" "Poort %s op %s is geprobeerd, maar is niet beschikbaar.
\n" "Een ander programma gebruikt de poort al of SABnzbd is al actief.
\n" "
\n" "Start SABnzbd met een ander poort nummer." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "Als je dit bericht weer krijgt, probeer dan een ander nummer.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd heeft een geldig host adres voor de interne webserver.
\n" "Je hebt een onbruikbaar adres opgegeven.
\n" "Veilige waarden zijn localhost en 0.0.0.0
\n" "
\n" "Start SABnzbd met een geldig host adres." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd heeft opgeslagen data van een andere SABnzbd versie " "gevonden
\n" " maar kan de data van deze andere versie niet opnieuw gebruiken.

\n" " Rond zo nodig eerst je werk met de andere versie af.

\n" " Herstart daarna deze versie met de optie \"--clean\".
\n" " Dit zal de huidige downloads en geschiedenis wissen!
\n" " SABnzbd las het bestand \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd kan de web-interface bestanden niet vinden in %s.
\n" "Installeer het programma opnieuw.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd heeft een fatale fout ontdekt:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd heeft ontdekt dat het bestand sqlite3.dll " "ontbreekt.

\n" "Sommige slecht ontworpen virusscanners verwijderen dit bestand.
\n" "Controleer je virus scaner, probeer SABnzbd opnieuw te installeren en klaag " "bij je leverancier.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Gebruik Windowstoets-R en type deze regel in (voorbeeld):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Open een \"Terminal\" venster en type deze regel in (voorbeeld):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Programma is niet opgestart!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" "Kan niet binden aan poort %s van %s. Andere software gebruikt deze poort of " "SABnzbd is al actief." #: sabnzbd/panic.py msgid "Fatal error" msgstr "Fatale fout" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Kan de web-browser niet starten, geen gevonden" #: sabnzbd/panic.py msgid "Access denied" msgstr "Toegang geweigerd" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Fout %s: Je moet een geldige gebruikersnaam en wachtwoord invullen." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "Oude wachtrij gevonden, gebruik Status->Reparatie om te converteren" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" msgstr "" "De map voor voltooide downloads %s staat op een FAT systeem, de maximale " "file omvang is dan maar 4G" #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "" "Download mislukt waarschijnlijk, slechts %s van de benodigde %s beschikbaar" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Download mislukt - Niet meer op je server(s)" #: sabnzbd/postproc.py msgid "Moving" msgstr "Verplaatsen" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "%s naar de wachtrij gestuurd" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Fout bij hernoemen van \"%s\" tot \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Verplaatsen van bestanden mislukt" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Gebruiker script %s loopt" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "%s is klaar" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Exit code van het script is %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Meer" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Nabewerking van %s mislukt (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "zie logbestand" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Download mislukt" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Opschonen van %s mislukt" #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Download voltooid" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Kan bestemmingsmap %s niet maken" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Nabewerking" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Geen par2 groepen" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Probeer SFV-verificatie" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Sommige bestanden konden niet geverifieerd worden met \"%s\"" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Verificatie m.b.v. SFV-bestanden is gelukt" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "Probeer RAR-verificatie" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "[%s] RAR verificatie niet gelukt: %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Versleuteld" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "RAR bestanden zijn succesvol geverifieerd" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "RAR bestanden zijn niet verifieerbaar" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Verwijderen van %s mislukt" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Kan systeem niet in slaapstand krijgen" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Kan het systeem niet in standby krijgen" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Fout bij het afsluiten van het systeem" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Indexer id (%s) niet gevonden in het bestand met beoordelingen" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Server adres" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "API-sleutel" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" "Deze sleutel is voor je identificatie door de indexer. Kijk in je profiel op " "de website van de indexer." #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Foutieve RSS-feed definitie \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Kan RSS-feed \"%s\" niet lezen vanwege: \"%s\"" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Geen geldige inlog gegevens beschikbaar voor RSS-feed %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "Server fout (code is %s); kon geen %s van %s krijgen" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Server %s gebruikt een onbetrouwbaar HTTPS-certificaat" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "RSS-feed %s is leeg" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Ongeschikte RSS-feed" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Lege RSS-feed gevonden (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Toon webinterface" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Open map met voltooide downloads" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Pauzeer" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Pauzeer 5 minuten" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Pauzeer 15 minuten" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Pauzeer 30 minuten" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Pauzeer 1 uur" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Pauzeer 3 uur" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Pauzeer 6 uur" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Afsluiten" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Nog te doen" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "NZB toevoegen" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Foutieve taak %s om %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Onbekende actie: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Taak voor niet bestaande server %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Download" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Samenvoegen" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Bron" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Servers" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Mislukt" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Mislukt" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Wacht" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Repareren..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Uitpakken..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Verplaatsen..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Script uitvoeren..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Extra herstelblokken downloaden..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Snelle Controle..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Verificatie..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Downloaden" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "Verspreidingswachttijd" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Taak" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "Server uit:" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "Server aan:" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Maximum snelheid" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Alles pauzeren" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Pauzeer nabewerken" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Hervat nabewerken" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Uitlezen RSS-feeds" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Verwijder mislukte downloads" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Verwijder voltooide downloads" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Pauzeer downloads met prioriteit \"Laag\"" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Pauzeer downloads met prioriteit \"Normaal\"" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Pauzeer downloads met prioriteit \"Hoog\"" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Hervat downloads met prioriteit \"Laag\"" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Hervat downloads met prioriteit \"Normaal\"" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Hervat downloads met prioriteit \"Hoog\"" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Schakel quotum beheer in" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Disable quota management" msgstr "Schakel quotum beheer uit" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause jobs with category" msgstr "Pauzeer downloads met categorie" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume jobs with category" msgstr "Hervat downloads met categorie" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Three way switch for duplicates] msgid "Off" msgstr "Uit" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Zeer Laag" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Gematigd" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normaal" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Hoog" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Noodgeval" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Laag" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "uur" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "uren" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "min" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "min" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "sec" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "seconden" #: sabnzbd/skintext.py msgid "day" msgstr "dag" #: sabnzbd/skintext.py msgid "days" msgstr "dagen" #: sabnzbd/skintext.py msgid "week" msgstr "week" #: sabnzbd/skintext.py msgid "Month" msgstr "maand" #: sabnzbd/skintext.py msgid "Year" msgstr "jaar" #: sabnzbd/skintext.py msgid "January" msgstr "Januari" #: sabnzbd/skintext.py msgid "February" msgstr "Februari" #: sabnzbd/skintext.py msgid "March" msgstr "Maart" #: sabnzbd/skintext.py msgid "April" msgstr "April" #: sabnzbd/skintext.py msgid "May" msgstr "Mei" #: sabnzbd/skintext.py msgid "June" msgstr "Juni" #: sabnzbd/skintext.py msgid "July" msgstr "Juli" #: sabnzbd/skintext.py msgid "August" msgstr "Augustus" #: sabnzbd/skintext.py msgid "September" msgstr "September" #: sabnzbd/skintext.py msgid "October" msgstr "Oktober" #: sabnzbd/skintext.py msgid "November" msgstr "November" #: sabnzbd/skintext.py msgid "December" msgstr "December" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Dag van de maand" #: sabnzbd/skintext.py msgid "This week" msgstr "Deze Week" #: sabnzbd/skintext.py msgid "This month" msgstr "Deze Maand" #: sabnzbd/skintext.py msgid "Today" msgstr "Vandaag" #: sabnzbd/skintext.py msgid "Total" msgstr "Totaal" #: sabnzbd/skintext.py msgid "on" msgstr "aan" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parameters" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Python versie" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Startpagina" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "of" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Server" #: sabnzbd/skintext.py msgid "Comment" msgstr "Commentaar" #: sabnzbd/skintext.py msgid "Send" msgstr "Verzenden" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Annuleren" #: sabnzbd/skintext.py msgid "Other" msgstr "Overige" #: sabnzbd/skintext.py msgid "Report" msgstr "Overzicht" #: sabnzbd/skintext.py msgid "Video" msgstr "Video" #: sabnzbd/skintext.py msgid "Audio" msgstr "Audio" #: sabnzbd/skintext.py msgid "Not used" msgstr "Niet gebruikt" #: sabnzbd/skintext.py msgid "or less" msgstr "of minder" #: sabnzbd/skintext.py msgid "Log in" msgstr "Aanmelden" #: sabnzbd/skintext.py msgid "Log out" msgstr "Afmelden" #: sabnzbd/skintext.py msgid "Remember me" msgstr "Mij onthouden" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "De automatische Usenet downloader" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Opslaan" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Opslaan.." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Weet je het zeker?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Alle gedownloade bestanden verwijderen?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Startpagina" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Instellingen" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Status" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Hulp" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Forum" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "Problemen" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "Steun het project, doneer!" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Algemeen" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Mappen" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Opties" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Taakplanner" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Meldingen" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "E-mail" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Categorieën" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Sorteren" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Speciaal" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Zoeken" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Map voor verwerkte downloads" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "PAUZE" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "%s artikelen (%s) gebuffered" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Sysload" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Nieuwe versie %s beschikbaar op" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Weet je zeker dat je SABnzbd wilt afsluiten?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Toevoegen" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Bestand toevoegen" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Categorie" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Nabewerking" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Prioriteit" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Repareren" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Uitpakken" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Opschonen" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "U" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "O" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Forceren" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Stop" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "Na afronden wachtrij" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "PC afsluiten" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "PC standby" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "PC slapen" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "SABnzbd afsluiten" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Max. snelheid" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Volgorde" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Naam" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "Klaar om" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "Leeftijd" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Wis" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Opnieuw" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Acties" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Scripts" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Verwijder alle downloads uit de wachtrij?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Verwijder alle downloads" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Verwijderen incl. bestanden" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Probeer alle mislukte downloads opnieuw" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Verwijder download" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Verwijder download incl. bestanden" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "van" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Ontbrekende artikelen" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Quotum over" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "handmatig" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Quotum nu resetten" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Verwijder alle geslaagde items uit Geschiedenis?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Verberg details" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Toon details" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Toon mislukte" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Toon Alles" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Omvang" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Verwijder mislukte downloads" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Verwijder mislukte downloads incl. bestanden" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Verwijder voltooide downloads" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "Verwijder downloads op deze pagina" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "Eventuele extra NZB" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Pad" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Probeer alle mislukte" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Alles opnieuw proberen" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Buiten retentie" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Ander probleem" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Verbreek verbindingen" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" "Verbreek alle actieve verbindingen naar usenet servers. Verbindingen worden " "na een paar seconden weer geopend als er nog downloads in de wachtrij staan." #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Hiermee stuur je een test e-mail." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Download log" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "E-mail testen" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Loggen" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Fouten/Waarschuwingen" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+Info" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+Debug" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Verbindingen" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Recentste meldingen" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "Wissen" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Deblokkeren" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Artikelnummer" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Bestandsverzameling" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Wanneer" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Filter" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Actief" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Dashboard" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Verbinding mislukt!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Lokaal IPv4-adres" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Openbaar IPv4-adres" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "IPv6-adres" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Nameserver / DNS opzoeken" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "CPU-model" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Systeemprestaties (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Snelheid van download map" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Snelheid van verwerkte downloads map" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Schrijfsnelheid" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "Kan niet schrijven. Controleer of de map beschrijfbaar is." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Klik op de Herhaal Test knop om te meten" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Herhaal test" #: sabnzbd/skintext.py msgid "Test download" msgstr "Test download" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" "Voeg een test NZB (gevuld met willekeurige data) toe aan de wachtrij. " "Hiermee kan je controleren of alles goed werkt." #: sabnzbd/skintext.py msgid "Config File" msgstr "Instellingen bestand" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Gebruikte buffer" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Deze knop zal SABnzbd herstarten.
Dit kan nuttig zijn wanneer je " "vermoedt dat het programma niet stabiel is.
Het downloaden zal vóór de " "herstart gestopt worden en daarna weer doorgaan." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" "
Als authenticatie ingeschakeld is, zal je opnieuw moeten inloggen." #: sabnzbd/skintext.py msgid "Advanced" msgstr "Geavanceerd" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Er staan verweesde downloads in de download map.
Je kunt ze verwijderen " "(inclusief bestanden) of ze terug naar de wachtrij sturen." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "De \"Repareren\" knop herstart SABnzbd met een complete
\r\n" "reconstructie van de wachtrij, met behoud van al gedownloade " "bestanden.
\r\n" "Dit beïnvloedt wel de volgorde." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Wijzigingen niet opgeslagen en zullen verloren gaan." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" "Als je IP adres veranderd of SABnzbd opnieuw wordt opgestart, zal de sessie " "verlopen." #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Unzip toestaan" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "7Zip toestaan" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "Multicore Par2" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" "Versnel reparaties door multi-core par2 te installeren. Beschikbaar voor " "veel besturingssystemen." #: sabnzbd/skintext.py msgid "Version" msgstr "Versie" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Tijd in de lucht" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Reserve" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Lees de Wiki pagina over dit onderwerp" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "SABnzbd herstart nu..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Wijzigingen worden pas actief na herstart!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "Webserver" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "Host" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Host adres waar op SABnzbd luistert." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "Poort" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Poort waar op SABnzbd luistert." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Webinterface" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Kies een bedieningsstijl (herstart nodig)." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "Gebruikersnaam" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Gebruikersnaam voor web login." #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "Wachtwoord" #: sabnzbd/skintext.py msgid "Optional authentication password." msgstr "Wachtwoord voor web login." #: 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 "" "Als de Host of Poort open is gesteld naar het internet zorgen de huidige " "instellingen ervoor dat de webinterface volledig beschikbaar is voor " "externen." #: sabnzbd/skintext.py msgid "Security" msgstr "Beveiliging" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "Activeer HTTPS" #: sabnzbd/skintext.py msgid "not installed" msgstr "niet geinstalleerd" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Webinterface beschikbaar via HTTPS" #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "HTTPS Poort" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Indien leeg, werkt de standaard poort uitsluitend met HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "HTTPS-certificaat" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Naam of pad naar het HTTPS-Certificaatbestand." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" "Maak een nieuw zelf-ondertekend certificaat en sleutel. SABnzbd moet dan " "opnieuw gestart worden." #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "HTTPS-sleutelbestand" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Naam of pad van het HTTPS-sleutelbestand." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "HTTPS chain-bestand" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Bestandsnaam of padnaam van HTTPS chain-bestand" #: sabnzbd/skintext.py msgid "Tuning" msgstr "Afstelling" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "RSS-feed uitlees interval" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Minuten tussen het uitlezen (minimaal 15). Niet actief bij gebruik van de " "Taakplanner!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Maximale snelheid internetverbinding" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Percentage van snelheid internetverbinding" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "" "Welk percentage van de maximale internet snelheid mag SABnzbd gebruiken? " "B.v. 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Artikelbuffer grootte" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Bewaar de artikelen in het werkgeheugen (verminderd schijf gebruik).
In bytes, in K,M,G notatie. Bijvoorbeeld: \"64M\" of \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Opschoon lijst" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Lijst van extensies die na downloaden verwijderd moeten worden.
Voorbeeld: nfo of nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "Geschiedenis Bewaren" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" "Automatisch verwijderen van voltooide downloads. Let er op dat Dubbele " "Download Detectie en andere externe tools Geschiedenis informatie nodig " "hebben." #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "Behoud alle downloads" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "Maximum aantal voltooide downloads" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "Behoud voltooide downloads maximaal aantal dagen" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "Behoud geen enkele download" #: sabnzbd/skintext.py msgid "Jobs" msgstr "Downloads" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Opslaan" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "Beginwaarden terugzetten" #: sabnzbd/skintext.py msgid "Reset" msgstr "Herstel" #: sabnzbd/skintext.py msgid "Language" msgstr "Taal" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Kies een taal." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" "Help ons om SABnzbd in jouw taal te vertalen!
Met nieuwe vertalingen of " "verbeteringen kun je hier terecht:" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "" "Met deze sleutel heeft een extern programma volledige toegang tot SABnzbd." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "NZB-sleutel" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Met deze sleutel kan een extern programma NZB-bestanden naar SABnzbd sturen." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Maak een nieuwe sleutel" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "QR-code van de API-sleutel" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Lijst van lokale netwerk bereiken" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Alle lokale netwerk adressen die beginnen met deze reeks (vaak " "\"192.168.1.\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Externe toegang" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" "Je kunt toegangsrechten instellen voor systemen buiten je lokale netwerk. " "Hiervoor geef je een lijst van netwerk-bereiken in." #: sabnzbd/skintext.py msgid "No access" msgstr "Geen toegang" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Voeg NZB-bestanden toe " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (geen Configuratie)" #: sabnzbd/skintext.py msgid "Full API" msgstr "Volledige API" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Volledig webinterface" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "Alleen voor externe toegang is aanmelden nodig" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "Let op: mappen worden vanzelf aangemaakt bij \"Opslaan\"." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Gebruikersmappen" #: sabnzbd/skintext.py msgid "Browse" msgstr "Bladeren" #: sabnzbd/skintext.py msgid "In" msgstr "In" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Tijdelijke download map" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Map om onbewerkte downloads op te slaan
Kan alleen gewijzigd worden " "als de wachtrij leeg is." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Minimale vrije ruimte voor tijdelijke download map" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "Download wordt gepauzeerd als er te weinig ruimte vrij is" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Map voor verwerkte downloads" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "(kan aangepast worden door de categorieën)." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Toegangsrechten voor verwerkte downloads" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Zet toegangsrechten voor verwerkte bestanden/mappen, alleen octale notatie!" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Bewaakte map" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" ".NZB en .ZIP-bestanden in deze map worden automatisch toegevoegd aan de " "wachtrij." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Bewaakte map verversingsinterval" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Aantal seconden tussen het lezen van de bewaakte map." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "Map voor scripts" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "Map met scripts van de gebruiker" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Map met e-mailsjablonen" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Map met e-mailsjablonen." #: sabnzbd/skintext.py msgid "Password file" msgstr "Wachtwoordenbestand" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Bestand met alle wachtwoorden die uitgeprobeerd moeten worden op " "versleutelde RAR-bestanden." #: sabnzbd/skintext.py msgid "System Folders" msgstr "Systeemmappen" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Administratieve map" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Map waar de wachtrij en geschiedenisdatabase worden opgeslagen.
Kan " "alleen gewijzigd worden als de wachtrij leeg is." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "De bestanden worden niet verplaatst. SABnzbd moet herstart " "worden!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Map voor logging" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Map waarin de log bestanden worden opgeslagen
Vereist een " "herstart." #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "Map voor het bewaren van NZB-bestanden" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Map waar reserve kopieën opgeslagen worden." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Basis map" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Download alle PAR2-bestanden" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" "Dit voorkomt extra reparatie pogingen, doordat alle beschikbare par2 files " "direct worden gedownload." #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Recursief uitpakken toestaan" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Uitpakken van archieven (rar, zip, 7z) binnen archieven toestaan" #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Negeer mappen binnen archieven" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Alle bestanden gaan in één map" #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Download alleen artikelen van het begin van de wachtrij" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Aanzetten zal leiden tot minder geheugen gebruik.
Uitzetten om te " "voorkomen dat langzame downloads de wachtrij blokkeren." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Verwerk alleen correct geverifieerde downloads" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" "Voer de nabewerking alleen uit op downloads die de PAR2 controles hebben " "doorlopen." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Actie wanneer versleuteld RAR-bestand wordt gedownload" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "Als je \"Pause\" kiest, dan dien je een wachtwoord in te stellen en de " "download vrij te geven" #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Detecteer dubbele downloads" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" "Detecteer identieke downloads (op basis van downloads in je Geschiedenis of " "bestanden in je .nzb backup map)." #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Detecteer dubbele afleveringen in series" #: sabnzbd/skintext.py msgid "" "Detect identical episodes in series (based on \"name/season/episode\" of " "items in your History)" msgstr "" "Detecteer identieke afleveringen in series (gebaseerd op " "\"naam/seizoen/aflevering\" van downloads in je Geschiedenis)." #: sabnzbd/skintext.py msgid "Allow proper releases" msgstr "Sta verbeterde downloads toe" #: sabnzbd/skintext.py msgid "" "Bypass series duplicate detection if PROPER, REAL or REPACK is detected in " "the download name" msgstr "" "Sla dubbele download detectie over als er in de naam van de download PROPER, " "REAL of REPACK bevat" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Discard" msgstr "Verwerpen" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "Keur download af" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "Label download" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Afbreken" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Actie bij ontdekken van ongewenste extensie" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "" "Actie wanneer een ongewenste extensie wordt gevonden in een RAR-bestand" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Ongewenste extensies" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Lijst van alle ongewenste extensies. Voorbeeld: exe or exe, com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Voer SFV-gebaseerde controles uit" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Doe een extra verificatie m.b.v. SFV-bestanden" #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Een gebruikersscript kan een download afkeuren" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Wanneer het script een exit code anders dan 0 geeft, zal de download worden " "afgekeurd." #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "Bij mislukking: probeer alternatieve NZB" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" "Sommige indexers hebben een alternatieve NZB wanneer een download mislukt" #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "Gebruik indexer informatie" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" "Maak tijdens het sorteren gebruik van informatie van de indexer zoals titel, " "seizoen, aflevering, enz. Anders wordt alle informatie uit de naam van de " "download gehaald." #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Gebruik tijdelijke mapnamen" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Gebruik tijdelijke mapnamen tijdens de nabewerking. Zet dit uit wanneer je " "systeem daar problemen mee heeft." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Wachtrij-filter script" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Word uitgevoerd vóór een download aan de wachtrij word toegevoegd" #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Extra PAR2 parameters" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "\"Nice\" parameters" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "\"IONice\" parameters" #: sabnzbd/skintext.py msgid "External process priority" msgstr "Externe process prioriteit" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Verbreek verbindingen wanneer er niets te doen is" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "" "Verbreek verbindingen wanneer de wachtrij leeg is of er gepauzeerd wordt." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Sorteer op leeftijd" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Automatisch sorteren op basis van gemiddelde leeftijd." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" "Downloads zullen gepauzeerd worden tot ze minimaal deze leeftijd hebben. " "Instellen van prioriteit Forceren zal de download meteen starten." #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Periodieke controle voor nieuwe versies" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Controleer elke week of er een nieuwe SABnzbd versie beschikbaar is." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "Ook test versies" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Vervang spaties in mapnamen" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Vervang spaties door onderliggende streepjes in namen van mappen." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Vervang punten in mapnamen" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Vervang punten door spaties in namen van mappen." #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Maak compatibel met Windows" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "Voor opslag op servers: gebruik namen die werken op Windows" #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Start webbrowser bij opstarten" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Start de web browser wanneer SABnzbd opstart." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Onderbreek downloaden tijdens nabewerken" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "Onderbreek downloaden tijdens nabewerken." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Negeer samples" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Wat te doen met \"sample\"-bestanden?" #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Verwijderen na download" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "HTTPS certificaatverificatie" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" "Controleer certificaten bij beveiligde verbindingen met indexers en RSS-" "feeds." #: sabnzbd/skintext.py msgid "Server" msgstr "Server" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Nabewerking" #: sabnzbd/skintext.py msgid "Naming" msgstr "Naamgeving" #: sabnzbd/skintext.py msgid "Quota" msgstr "Quotum" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indexering" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Hoeval mag deze maand worden gedownload (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Reset dag" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "Op welke dag van de maand of week (1=maandag) wordt het quotum gereset? " "(Eventueel met hh:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Automatisch doorgaan" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "" "Moet het downloaden automatisch doorgaan bij het ingaan van het nieuwe " "quotum?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Quotum periode" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "Wordt het quotum elke dag, week of maand gereset?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Controle vóór downloaden" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Probeer de succes kans van een download van te voren in te schatten " "(langzamer!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "SSL-sleutels" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" "Verhoog de prestaties door een eenvoudigere SSL versleuteling toe te passen." #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "Maximum aantal pogingen" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Maximaal aantal pogingen per server" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Download afbreken als deze zeker niet kan worden voltooid" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Als tijdens het downloaden duidelijk wordt dat te veel data ontbreekt, breek " "dan de download af" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "Sta integratie met index websites toe" #: sabnzbd/skintext.py 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 "" "Indexers kunnen beoordelingen meesturen wanneer een download wordt " "toegevoegd en SABnzbd kan de indexer informeren wanneer een download niet " "slaagt." #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Filtering aan" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Verwerk downloads volgens de filter regels" #: sabnzbd/skintext.py msgid "Abort If" msgstr "Afbreken indien" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Anders pauzeren indien" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Video rating" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Audio rating" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spam" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Bevestigd" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Meer duimen omlaag dan omhoog" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Titel trefwoorden" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Door komma's gescheiden lijst" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "Server IP adres selectie" #: sabnzbd/skintext.py msgid "First IP address" msgstr "Eerste IP adres" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "willekeurig geselecteerd IP adres" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "Snelste IP adres, voorkeur voor IPv6" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Nuttig wanneer een server meer dan één IPv4 of IPv6-adres heeft" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Voeg server toe" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Servernaam" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Poort" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Gebruikersnaam" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Wachtwoord" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Tijdslimiet" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Bewaartijd" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "Beveiligde verbinding met de server" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "Certificaatverificatie" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" "Minimaal: wanneer SSL geactiveerd is, controleer de identiteit van de server " "m.b.v. de certificaten. Strikt: controleer en vereis dat het geldige " "certificaat bij deze servernaam hoort." #: sabnzbd/skintext.py msgid "Disabled" msgstr "Uit" #: sabnzbd/skintext.py msgid "Minimal" msgstr "Minimaal" #: sabnzbd/skintext.py msgid "Strict" msgstr "Strikt" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 is de hoogste en 99 de laagste prioriteit" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Optioneel" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" "Voor onbetrouwbare servers, deze zullen langer worden genegeerd wanneer ze " "fouten veroorzaken." #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Inschakelen" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Verwijder" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Test Server" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Tellers op nul" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Server instellingen aan het testen..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Bandbreedte" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Verzend groep" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Verzend de groepsnaam naar de server." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Persoonlijke aantekeningen" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Taak toevoegen" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Frequentie" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Actie" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Parameters" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Huidige taken" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Om de RSS-feed automatisch te verwerken, vink het selectievlakje bij de " "definitie naam aan.
Wanneer een nieuwe feed wordt gedefinieerd, zullen " "alleen nieuwe items gevonden worden en geen bestaande, behalve wanneer je de " "op \"Forceer download\" klikt." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "Zet komma's tussen de URLs" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Uitlezen" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Forceer download" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filter" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Accepteren" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Titel Bevat Niet" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Titel Bevat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "Categorie Is" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Minimaal" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Maximaal" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "Vanaf SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "Vanaf Serie SxxEyy" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Geselecteerd" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Verworpen" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Gedownload" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Alle feeds nu uitlezen" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Stuur een e-mail na het voltooien van elke download" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Nooit" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Altijd" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Alleen bij fouten" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Stuur een e-mail wanneer de harde schijf vol is" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "" "Stuur een e-mail wanneer SABnzbd gestopt is vanwege een volle harde schijf." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Verstuur een e-mail voor RSS" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "" "Verstuur een e-mail wanneer een RSS-feed downloads
aan de wachtrij " "heeft toevoegd." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "SMTP-server" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Het adres van de e-mailserver van je internet provider." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Ontvanger" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "Adres waarnaar de e-mail verstuurd wordt." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "Afzender" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Wie zou de email gestuurd moeten hebben?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "OPTIONEEL: Account gebruikersnaam" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Wanneer authenticatie nodig is, de gebruikersnaam." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "OPTIONEEL: Account wachtwoord" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Wanneer authenticatie nodig is, het wachtwoord." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Melding verzonden" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Growl meldingen activeren" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "" "Alleen gebruiken voor een Growl server op een ander systeem (server:poort)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Server wachtwoord" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Optioneel wachtwoord voor de Growl server" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "NotifyOSD activeren" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Berichtencentrum" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Windows meldingen activeren" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Windows Meldingen" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Prowl berichten activeren" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Een Prowl account is noodzakelijk" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "API-sleutel voor Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Persoonlijke API-sleutel voor Prowl (noodzakelijk)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Pushover meldingen activeren" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Hiervoor is een Pushover account nodig" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Applicatie token" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Applicatie token (verplicht)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Gebrukers sleutel" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Gebrukers sleutel (verplicht)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Apparaten" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s) to which message should be sent" msgstr "Apparaat of apparaten die het bericht moeten ontvangen" #: sabnzbd/skintext.py [Pushover settings] msgid "Emergency retry" msgstr "Noodgeval herhaling" #: sabnzbd/skintext.py [Pushover settings] msgid "How often (in seconds) the same notification will be sent" msgstr "Hoevaak moet de notification herhaald worden (in seconden)" #: sabnzbd/skintext.py [Pushover settings] msgid "Emergency expire" msgstr "Einde van noodgeval" #: sabnzbd/skintext.py [Pushover settings] msgid "How many seconds your notification will continue to be retried" msgstr "Hoeveel seconden moet de notificatie herhaald worden" #: sabnzbd/skintext.py [Header for Pushbullet notification section] msgid "Pushbullet" msgstr "Pushbullet" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Pushbullet meldingen activeren" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Hiervoor is een Pushbullet account nodig" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Persoonlijke API-sleutel" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Persoonlijke Pushbullet API-sleutel (verplicht)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Apparaat" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Apparaat dat de berichten moet ontvangen" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "Notificatie Script" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "Notificatie script activeren" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "Voer een zelfgemaakt script uit" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "Welk script moet uitgevoerd worden voor de notificatie?" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" "Indexers kunnen een categorie in de NZB plaatsen en SABnzbd zal die proberen " "toe te passen op onderstaande categorieën. Daarnaast kun je patronen " "invullen in de kolom \"Indexer Categorieën/Groepen\". Gebruik komma's om " "patronen te scheiden. Joker tekens (? en *) zijn toegestaan.
Meer " "informatie op de Wiki." #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Als het pad eindigt met een ster *, dan worden geen aparte download mappen " "gemaakt." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Maplocaties gebaseerd op" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Map/Pad" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "Indexer Categorieën / Groepen" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Serie sorteren" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Serie sorteren aan" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Uitleg" #: sabnzbd/skintext.py msgid "Clear" msgstr "Wissen" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "Filters toepassen" #: sabnzbd/skintext.py msgid "Presets" msgstr "Standaardinstellingen" #: sabnzbd/skintext.py msgid "Example" msgstr "Voorbeeld" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "Film sorteren" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Film sorteren aan" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Zet downloads in aparte mappen" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Beïnvloede categorieën" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Betekenis" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Patroon" #: sabnzbd/skintext.py msgid "Result" msgstr "Resultaat" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Seizoensmappen" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Seizoensmap" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Aflevering-map" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 Aflevering-map" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "Downloadnaam als Bestandsnaam" #: sabnzbd/skintext.py msgid "Title" msgstr "Titel" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Film Naam" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Film.Naam" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Film_Naam" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Serie Naam" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Serie.Naam" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Serie_Naam" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Seizoen Nummer" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Aflevering Nummer" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Aflevering Naam" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Aflevering.Naam" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Aflevering_Naam" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Bestandsextensie" #: sabnzbd/skintext.py msgid "Extension" msgstr "Extensie" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Volgnummer" #: sabnzbd/skintext.py msgid "Decade" msgstr "Decennium" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Originele bestandsnaam" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "Originele Downloadnaam" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Kleine letters" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEKST" #: sabnzbd/skintext.py msgid "text" msgstr "tekst" #: sabnzbd/skintext.py msgid "file" msgstr "bestand" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Sorteertekst" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Meervoudig label" #: sabnzbd/skintext.py msgid "In folders" msgstr "In mappen" #: sabnzbd/skintext.py msgid "No folders" msgstr "Geen mappen" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Datum sorteren" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Datum sorteren aan" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Toon Naam map" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "Jaar-Maand Mappen" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Dagelijkse Mappen" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "Aanpassen van hoofd- en kleine letters" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Bewerkt resultaat" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Zelden gebruikte opties. Voor betekenis en uitleg, klik op de Help knop om " "naar de Wiki te gaan.
Wijzig hier niet zonder eerst de uitleg op de Wiki " "te lezen. Er kunnen nadelige bijwerkingen optreden.
De standaard " "instellingen staan tussen haakjes." #: sabnzbd/skintext.py msgid "Values" msgstr "Waarden" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Bewerk download details" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Verwijder" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Boven" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Hoger" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Lager" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Onder" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "alles" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "omkeren" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Bestandsnaam" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Onderwerp" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Selectie" #: sabnzbd/skintext.py msgid "left" msgstr "over" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Vrije ruimte" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Tijdelijke map" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Meervoudige bewerking" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Houdt Shift toets ingedrukt om meer te selecteren" #: sabnzbd/skintext.py msgid "Check all" msgstr "Selecteer alles" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Start SABnzbd opnieuw" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Status en webinterface opties" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Of sleep bestanden in dit venster!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Verbinding met SABnzbd verbroken" #: sabnzbd/skintext.py msgid "In case of SABnzbd restart this screen will disappear automatically!" msgstr "Wanneer SABnzbd opnieuw is gestart, gaat dit venster vanzelf weg!" #: sabnzbd/skintext.py msgid "WARNING:" msgstr "WAARSCHUWING:" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box] msgid "Fetch" msgstr "Ophalen" #: sabnzbd/skintext.py msgid "Refresh rate" msgstr "Ververssnelheid" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Instellen voor alle sessies" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Items in wachtrij" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Items in geschiedenis" #: sabnzbd/skintext.py msgid "Date format" msgstr "Datumnotatie" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Extra kolom aan wachtrij toevoegen" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "Extra kolom aan geschiedenis toevoegen" #: sabnzbd/skintext.py msgid "page" msgstr "Pagina" #: sabnzbd/skintext.py msgid "Loading" msgstr "Laden" #: sabnzbd/skintext.py msgid "articles" msgstr "artikelen" #: sabnzbd/skintext.py msgid "Rename" msgstr "Naam" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Wachtrij reparatie" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Toon actieve verbindingen" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Verweesde downloads" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Stuur terug naar de wachtrij" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Alles wissen" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Alles opnieuw proberen" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Haal NZB op via URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "NZB uploaden" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Geef eventueel een andere naam" #: sabnzbd/skintext.py msgid "Submit" msgstr "Verstuur" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Open Informatie URL" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Ingediend. Bedankt!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Niets geselecteerd!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Verwijder alle geselecteerde bestanden" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Toon/verberg voltooide bestanden" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Toon Script resultaat" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Update beschikbaar!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" "\"Local Storage\" (cookies) is uitgeschakeld in je web browser, niet alle " "instellingen zullen worden onthouden." #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "Glitter heeft enkele (nieuwe) functies die je mogelijk aanspreken!" #: sabnzbd/skintext.py msgid "Custom" msgstr "Aangepast" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "Compacte weergave" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "Weergave in tabs
(wachtrij en geschiedenis apart weergeven)" #: sabnzbd/skintext.py msgid "Speed" msgstr "Snelheid" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Bevestig verwijderen uit wachtrij" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Bevestig verwijderen uit geschiedenis" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Voor hoe lang of tot wanneer wilt u pauzeren? (in het Engels!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Sorry, het opgegeven kunnen wij niet verwerken. Probeer nogmaals." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Pauzeer..." #: sabnzbd/skintext.py msgid "Refresh" msgstr "Ververs" #: sabnzbd/skintext.py msgid "" "All usernames, passwords and API-keys are automatically removed from the log " "and the included copy of your settings." msgstr "" "Alle gebruikersnamen, wachtwoorden en API-sleutels worden automatisch " "verwijderd uit het logbestand en de bijgevoegde kopie van je instellingen." #: sabnzbd/skintext.py msgid "Sort by Age Oldest→Newest" msgstr "Sorteer op Leeftijd Oud→Nieuw" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Sorteer op Leeftijd Nieuw→Oud" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Sorteer op Naam A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Sorteer op Naam Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Sorteer op Omvang Klein→Groot" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Sorteer op Omvang Groot→Klein" #: sabnzbd/skintext.py msgid "Uploading" msgstr "Uploaden" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "Verbinding verbreken" #: sabnzbd/skintext.py msgid "Removing job" msgstr "Item aan het verwijderen" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "Items aan het verwijderen" #: sabnzbd/skintext.py msgid "Prev" msgstr "Vorige" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Volgende" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "Wis de volledige geschiedenis?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "JavaScript is nodig voor de werking van Plush!" #: sabnzbd/skintext.py msgid "Options" msgstr "Opties" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Hoeveel minuten pauzeren?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Top menu aan/uit" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Bij lege wachtrij" #: sabnzbd/skintext.py msgid "Sort" msgstr "Sorteren" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Sorteer op Leeftijd (Oud→Nieuw)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Sorteer op Leeftijd (Nieuw→Oud)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Sorteer op Naam (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Sorteer op Naam (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Sorteer op Omvang (Klein→Groot)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Sorteer op Omvang (Groot→Klein)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "Verwijderen uit de wachtrij?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Alle mislukte downloads in Geschiedenis opnieuw proberen?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Opschonen" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Max Snelheid" #: sabnzbd/skintext.py msgid "Range" msgstr "Bereik" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Op selectie toepassen" #: sabnzbd/skintext.py msgid "Everything" msgstr "Alles" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Verversingstempo" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Breedte van kader" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Dit voorkomt pagina verversing wanneer de muis aanwijzer in de wachtrij is." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Geen verversing bij popups" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Ophalen" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Upload: .nzb, .rar, .zip, .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Voortgang" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Onvoldoende schijfruimte over!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Vrij (tijdelijke map)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "RUST" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Downloads" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "SABnzbd Snelstart Hulp" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "SABnzbd versie" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Vorige" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Server instellingen" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Vul hier de gegevens van je primaire Usenet server in." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Het aantal verbindingen dat je provider toestaat." #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "Bv. 8 of 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Vink dit alleen aan als je provider SSL-verbindingen toestaat." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Klik om de verbinding te testen." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Voorbeeld" #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "Alles ingesteld!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd is actief op de achtergrond." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "Afsluiten van het browservenster zal SABnzbd niet stoppen." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Tip: maak een \"Bladwijzer\" of \"Favoriet\" voor deze locatie, zodat je " "SABnzbd gemakkelijk terug kunt vinden." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Voor meer informatie bekijk de" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "Ga naar SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "Stop SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Wizard starten" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd wordt aangeboden ZONDER ENIGE VORM VAN GARANTIE.\n" "Het is vrije software en je mag het, onder bepaalde voorwaarden, verder " "verspreiden.\n" "De licentie is de GNU GENERAL PUBLIC LICENSE Versie 2 of (naar eigen keuze) " "een latere versie.\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 "" "Om te kunnen downloaden van Usenet, heb je een provider nodig. Je Internet " "bedrijf heeft misschien een server, maar we bevelen een betaalde server aan." #: sabnzbd/skintext.py msgid "Don't have a usenet provider? We recommend trying %s." msgstr "Heb je nog geen Usenet provider? Wij bevelen %s aan." #: sabnzbd/sorting.py [Error message] msgid "Error getting TV info (%s)" msgstr "Fout bij ophalen TV info (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "Hernoemen van %s tot %s mislukt" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "Hernoemen van gelijkaardig bestand %s naar %s mislukt" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Geen toegangsrechten" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "Bestand bestaat niet op de server" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "De server kon de opdracht niet uitvoeren" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "URLGRABBER FATALE FOUT" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "Onbruikbaar NZB-bestand" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "URL ophalen mislukt; %s" #~ msgid "Folder \"%s\" does not exist" #~ msgstr "Map \"%s\" bestaat niet." #~ msgid "Error: No secondary interface defined." #~ msgstr "Fout: geen secundaire interface ingesteld." #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Versie van UNRAR wordt niet aanbevolen, download UNRAR van " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "Initiating restart...
" #~ msgstr "Begin met herstart...
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "Opdracht \"%s\" terug naar de wachtrij" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "Items met een ster '*' worden niet automatisch gedownload." #~ msgid "Not matched" #~ msgstr "Niet geselecteerd" #~ msgid "Downloaded so far" #~ msgstr "Tot nu toe gedaan" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Kan geen verbinding maken met register deel HKEY_CURRENT_USER." #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Kan register sleutel \"%s\" niet lezen" #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Kan register sleutels voor speciale mappen niet lezen" #~ msgid "You have no permisson to use port %s" #~ msgstr "Je hebt geen toestemming om poort %s te gebruiken" #~ msgid "Try again" #~ msgstr "Opnieuw" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "Module \"pyopenssl\" ontbreekt, geen HTTPS mogelijk" #~ msgid "Unpacking failed, see log" #~ msgstr "Uitpakken mislukt, zie log" #~ msgid "ERROR: %s" #~ msgstr "FOUT: %s" #~ msgid "Main packet not found..." #~ msgstr "Hoofdpakket niet gevonden..." #~ msgid "File %s is empty, skipping" #~ msgstr "Bestand %s is leeg, overslaan" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "Verwijderen van nzo van nabewerkingswachtrij mislukt" #~ msgid "No post-processing because of failed verification" #~ msgstr "Geen nabewerking vanwege mislukte verificatie" #~ msgid "View script output" #~ msgstr "Toon script resultaat" #~ msgid "Error removing workdir (%s)" #~ msgstr "Fout bij verwijderen van werkmap %s" #~ msgid "Queued" #~ msgstr "Wacht" #~ msgid "Complete Dir" #~ msgstr "Map voltooid" #~ msgid "Download speed" #~ msgstr "Snelheid" #~ msgid "WARNINGS" #~ msgstr "MELDINGEN" #~ msgid "Add new downloads" #~ msgstr "Opdrachten toevoegen" #~ msgid " or Report ID" #~ msgstr " of Report ID" #~ msgid "Sort by name" #~ msgstr "Op naam" #~ msgid "Sort by age" #~ msgstr "Op leeftijd" #~ msgid "Sort by size" #~ msgstr "Op grootte" #~ msgid "Hide files" #~ msgstr "Verberg bestanden" #~ msgid "Show files" #~ msgstr "Toon bestanden" #~ msgid "Remain/Total" #~ msgstr "Te doen/Totaal" #~ msgid "History Size" #~ msgstr "Totaal" #~ msgid "Show Weblogging" #~ msgstr "Toon weblog info" #~ msgid "Thread" #~ msgstr "Verbinding" #~ msgid "General configuration" #~ msgstr "Algemene instellingen" #~ msgid "Web server authentication" #~ msgstr "Web server authenticatie" #~ msgid "HTTPS Support" #~ msgstr "HTTPS ondersteuning" #~ msgid "Queue auto refresh interval:" #~ msgstr "Verversingsinterval van de Wachtrij" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "Verversingsinterval van het de Wachtrij pagina (sec, 0= geen)." #~ msgid "Disable API-key" #~ msgstr "API-sleutel niet gebruiken" #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "GEBRUIK OP EIGEN RISICO!" #~ msgid "Folder configuration" #~ msgstr "Map instellingen" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Map met gebruikers scripts" #~ msgid "Switches configuration" #~ msgstr "Diverse instellingen" #~ msgid "Processing Switches" #~ msgstr "Nabewerking instellingen" #~ msgid "Enable Quick Check" #~ msgstr "Snelle controle toestaan" #~ msgid "Enable Unrar" #~ msgstr "Unrar toestaan" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Uitpakken van RAR archieven toestaan." #~ msgid "Enable built-in unzip functionality." #~ msgstr "Uitpakken van ZIP archieven toestaan." #~ msgid "Enable Filejoin" #~ msgstr "Samenvoegen van bestanden toestaan" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "Voeg bestanden eindigend met .001, .002 enz. samen tot één file." #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "" #~ "Voeg bestanden eindigend met .001.ts, .002.ts enz. samen tot één file." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Verwijder artikelen met yEnc crc fouten" #~ msgid "Default Post-Processing" #~ msgstr "Standaard nabewerking" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "Wordt gebruikt wanneer de categorie geen nabewerking opgeeft." #~ msgid "Default User Script" #~ msgstr "Standaard script" #~ msgid "Used when no user script is defined by the category." #~ msgstr "Wordt gebruikt wanneer de categorie geen script opgeeft." #~ msgid "Default Priority" #~ msgstr "Standaard prioriteit" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Wordt gebruikt wanneer de categorie geen prioriteit opgeeft." #~ msgid "Enable MultiCore Par2" #~ msgstr "MultiCore Par2 toestaan" #~ msgid "Other Switches" #~ msgstr "Diverse instellingen" #~ msgid "Do not download" #~ msgstr "Niet downloaden" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "Gebruik V23, behalve wanneer persé nodig voor je Internet provider!" #~ msgid "Server configuration" #~ msgstr "Usenet servers" #~ msgid "Backup server" #~ msgstr "Reserve server" #~ msgid "Scheduling configuration" #~ msgstr "Agenda instellen" #~ msgid "Remove" #~ msgstr "Verwijder" #~ msgid "Delete Feed" #~ msgstr "Verwijder" #~ msgid "Skip" #~ msgstr "Overslaan" #~ msgid "User-defined categories" #~ msgstr "Categorieën voor nabewerking" #~ msgid "Defines post-processing and storage." #~ msgstr "Bepalend voor nabewerking en opslag." #~ msgid "Sorting configuration" #~ msgstr "Sorteer instellingen" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Sta sorteren en hernoemen van afleveringen toe." #~ msgid "Generic Sorting" #~ msgstr "Algemeen sorteren" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Sta algemeen sorteren en hernoemen van bestanden toe." #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "Sta opslaan van downloads in een eigen map toe." #~ msgid "Enable sorting and renaming of date named files." #~ msgstr "Sta sorteren en hernoemen van datum-gebaseerde bestandsnamen toe." #~ msgid "Are you sure you want to delete" #~ msgstr "Weet u zeker dat u wilt verwijderen" #~ msgid "Page" #~ msgstr "Pagina" #~ msgid "First" #~ msgstr "Eerste" #~ msgid "Last" #~ msgstr "Laatste" #~ msgid "Close" #~ msgstr "Sluiten" #~ msgid "Set Pause Interval" #~ msgstr "Set Pauze Interval" #~ msgid "Pause Interval" #~ msgstr "Pauze Interval" #~ msgid "Pause for 12 hours" #~ msgstr "Pauzeer 12 uur" #~ msgid "Pause for 24 hours" #~ msgstr "Pauzeer 24 uur" #~ msgid "Left" #~ msgstr "Over" #~ msgid "Storage" #~ msgstr "Opslag" #~ msgid "Plush Options" #~ msgstr "Plush instellingen" #~ msgid "Hour:Min" #~ msgstr "Uur:Min" #~ msgid "Delete the all failed items from the history?" #~ msgstr "Verwijder alle mislukte items uit de Geschiedenis?" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Toon %s t/m %s van %s resultaten" #~ msgid "Saved" #~ msgstr "Opgeslagen" #~ msgid "DualView1" #~ msgstr "Dubbel1" #~ msgid "DualView2" #~ msgstr "Dubbel2" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "Weet je zeker dat je SABnzbd wilt herstarten?" #~ msgid "Hide Edit Options" #~ msgstr "Verberg Opties" #~ msgid "Show Edit Options" #~ msgstr "Toon Opties" #~ msgid "Edit" #~ msgstr "Bewerk" #~ msgid "Timeleft" #~ msgstr "Te gaan" #~ msgid "Access" #~ msgstr "Toegang" #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "" #~ "Ik wil SABnzbd kunnen gebruiken vanaf iedere PC in mijn thuisnetwerk." #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Ik wil SABnzbd alleen vanaf deze PC kunnen gebruiken." #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Wachtwoord beveiliging voor SABnzbd (aanbevolen)" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Maak HTTPS (beveiligd) verkeer mogelijk." #~ msgid "Misc" #~ msgstr "Diversen" #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "Start de web browser wanneer SABnzbd opstart." #~ msgid "This field is required." #~ msgstr "Verplicht veld" #~ msgid "Please enter a whole number." #~ msgstr "Vul hier een geheel getal in." #~ msgid "Step One" #~ msgstr "Stap Een" #~ msgid "Step Two" #~ msgstr "Stap Twee" #~ msgid "Step Three" #~ msgstr "Stap Drie" #~ msgid "Step Four" #~ msgstr "Stap Vier" #~ msgid "Step Five" #~ msgstr "Stap Vijf" #~ msgid "KB/s" #~ msgstr "KB/s" #~ msgid " " #~ msgstr " " #~ msgid "Open Source URL" #~ msgstr "Open Source URL" #~ msgid "Click below to test." #~ msgstr "Klik hier onder om te testen." #~ msgid "Links" #~ msgstr "Koppelingen" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Upload: .nzb .rar .zip .gz" #~ msgid "Unpacking failed, these file(s) are missing:" #~ msgstr "Uitpakken is mislukt, deze bestand(en) ontbreken:" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "Gebruik de 12-uren klok (AM/PM)" #~ msgid "Showing one result" #~ msgstr "Eén resultaat" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Toon tijden in AM/PM notatie (heeft geen invloed op de taakplanner)" #~ msgid "No results" #~ msgstr "Geen resultaten" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd werkt niet in combinatie met sommige firewall programma's.
\n" #~ "%s
\n" #~ "Het spijt ons, maar we kunnen dit probleem niet oplossen.
\n" #~ "Graag een klacht indienen bij je firewall leverancier.
\n" #~ "
\n" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd heeft een vrije TCP/IP poort nodig voor de interne web " #~ "server.
\n" #~ "Poort %s op %s is geprobeerd, maar het gebruikers account van SABnzbd heeft " #~ "geen toestemming.
\n" #~ "Op OSX en Linux systemen mogen standaard gebruikers alleen poorten boven " #~ "1023 gebruiken.
\n" #~ "
\n" #~ "Start SABnzbd met een ander poort nummer." #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Mogelijk gebruik je ZoneAlarm op Vista.
" #~ msgid "OK" #~ msgstr "OK" #~ msgid "folder" #~ msgstr "map" #~ msgid "Original Foldername" #~ msgstr "Oorspronkelijke mapnaam" #~ msgid "Groups / Indexer tags" #~ msgstr "Groepen / Indexer markeringen" #~ msgid "Server definition" #~ msgstr "Server definitie" #~ msgid "Delete Failed" #~ msgstr "Verwijder mislukte" #~ msgid "Delete Completed" #~ msgstr "Verwijder geslaagde" #~ msgid "Delete all failed items from History?" #~ msgstr "Verwijder alle mislukte items uit Geschiedenis?" #~ msgid "Purge Failed History" #~ msgstr "Verwijder mislukte items" #~ msgid "Settings" #~ msgstr "Instellingen" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "Probeer deze artikelen opnieuw te downloaden van een reserve server." #~ msgid "Activate an alternative skin." #~ msgstr "Aktiveer een tweede bedieningsstijl (herstart nodig)." #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Geen uitgebreide PAR2 controle als de bestanden 100% in orde zijn." #~ msgid "Get NZB" #~ msgstr "Ophalen" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "Bv. 119 of 563 voor SSL" #~ msgid "Filters" #~ msgstr "Filters" #~ msgid "Check result of unpacking" #~ msgstr "Controleer resultaat van uitpakken" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Controleer resultaat van uitpakken (moet \"uit\" staan voor sommige " #~ "bestandssystemen)." #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Zend meldingen naar NotifyOSD" #~ msgid "Send notifications to Growl" #~ msgstr "Zend meldingen naar Growl" #~ msgid "Add Feed" #~ msgstr "Feed toevoegen" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Uitlezen leest/ververst de huidige feed inhoud. " #~ "Forceer download zal alle geselecteerde NZBs nu downloaden." #~ msgid "RSS Configuration" #~ msgstr "RSS-feed Definities" #~ msgid "New Feed URL" #~ msgstr "URL van nieuwe RSS-feed" #~ msgid "Only for optional servers" #~ msgstr "Alleen voor optionele servers" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Stel alleen een maximaal aantal pogingen in voor optionele servers" #~ msgid "QR Code" #~ msgstr "QR Code" #~ msgid "Feeds" #~ msgstr "Feeds" #~ msgid "Notification classes" #~ msgstr "Bericht types" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "Kies welke bericht types verstuurd moeten worden (geen, één of meer)" #~ msgid "Refer to https://www.oznzb.com/profile" #~ msgstr "Kijk op https://www.oznzb.com/profile" #~ msgid "Automatic Feedback" #~ msgstr "Automatische terugkoppeling" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Deze sleutel is het toegangsbewijs voor de indexer. Kijk op " #~ "https://www.oznzb.com/profile." #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Uitgebreide functionaliteit met waarderingen en extra status informatie " #~ "wanneer gekoppeld aan OZnzb indexer." #~ msgid "Enable OZnzb Integration" #~ msgstr "OZnzb integratie inschakelen" #~ msgid "OZnzb" #~ msgstr "OZnzb" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "Verzend berekende validatie gegevens over downloads naar de indexer." #~ msgid "Toggle Add NZB" #~ msgstr "\"NZB toevoegen\" uitklappen" #~ msgid "Send notifications to Notification Center" #~ msgstr "Stuur meldingen naar het Berichtencentrum" #~ msgid "Invalid encoding of email template %s" #~ msgstr "Foutieve codering van e-mailsjabloon %s" #~ msgid "Email Test Result" #~ msgstr "Test resultaat e-mail" #~ msgid "Email Options" #~ msgstr "E-mailopties" #~ msgid "No email templates found" #~ msgstr "Geen e-mailsjablonen gevonden" #~ msgid "Email Account Settings" #~ msgstr "E-mail gegevens" #~ msgid "Email Sent!" #~ msgstr "E-mail verzonden!" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Als de SABnzbd opnieuw is opgestart, kun je de bediening via deze koppeling " #~ "bereiken: %s" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "Map waarin zich de nabewerkingsscripts bevinden." #~ msgid "Enable TS Joining" #~ msgstr "Samenvoegen van TS-bestanden toestaan" #~ msgid "Enable Par Cleanup" #~ msgstr "PAR-bestanden opruimen" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Ruim PAR-bestanden op (na succesvolle verificatie/reparatie)." #~ msgid "Do not require the API key." #~ msgstr "Gebruik van de API-sleutel niet afdwingen." #~ msgid "Site API Key" #~ msgstr "API-sleutel van indexer" #~ msgid "Secondary Web Interface" #~ msgstr "Tweede Gebruikersinterface" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Vervang verboden tekens in mapnamen" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "Vervang verboden tekens in mapnamen door gelijkende tekens (anders " #~ "verwijderen)." #~ msgid "SSL type" #~ msgstr "SSL-type" #~ msgid "_yenc module... NOT found!" #~ msgstr "_yenc-module niet gevonden." #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "" #~ "WAARSCHUWING: Taak '%s' gepauzeerd vanwege een versleuteld RAR-bestand" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "" #~ "WAARSCHUWING: Taak '%s' is afgebroken vanwege een versleuteld RAR-bestand" #~ msgid "CRC Error in %s (%s -> %s)" #~ msgstr "CRC-fout in %s (%s -> %s)" #~ msgid "SQL Commit Failed, see log" #~ msgstr "SQL-opslagopdracht mislukt, zie logbestand" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "" #~ "Geen UNRAR-programma gevonden, uitpakken van RAR-bestanden niet mogelijk
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "Geen PAR2-programma gevonden, reparaties niet mogelijk
" #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "Bestand %s ontbreekt => UNRAR-fout?" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "Uitpakken mislukt, een gewenst bestand is niet uitgepakt" #~ msgid "Invalid par2 files, cannot verify or repair" #~ msgstr "Ongeldige par2-bestanden, verificatie of reparatie niet mogelijk" #~ msgid "Error importing OpenSSL module. Connecting with NON-SSL" #~ msgstr "Fout bij importeren van OpenSSL-module, probeer NON-SSL" sabnzbd-develop/po/main/zh_CN.po0000600000175000017500000042322713642116632014652 0ustar jpjp# Chinese (Simplified) translation for sabnzbd # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2017-06-22 07:06+0000\n" "Last-Translator: Safihre \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:03+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "web 界é¢å¯åŠ¨å¤±è´¥" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "无法找到 web 模æ¿: %s,正在å°è¯•标准模æ¿" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "SABYenc å·²ç¦ç”¨ï¼šæœªæ‰¾åˆ°æ­£ç¡®çš„版本ï¼ï¼ˆæ‰¾åˆ° v%sï¼Œè¦æ±‚ v%s)" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "SABYenc 模å—... 未找到ï¼è¦æ±‚ v%s - https://sabnzbd.org/sabyenc" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "par2 坿‰§è¡Œç¨‹åº... *未* 找到!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "您的 UNRAR 程åºç‰ˆæœ¬ä¸º %s,我们建议使用 %s 或更高版本。
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "unrar 坿‰§è¡Œç¨‹åº... *未* 找到" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "unzip 坿‰§è¡Œç¨‹åº... *未* 找到!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "7za 坿‰§è¡Œç¨‹åº... *未*找到!" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "è¯·æ³¨æ„ 0.0.0.0 主机åéœ€è¦ IPv6 åœ°å€æ‰èƒ½ä»Žå¤–部访问" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "HTTP 与 HTTPS 端å£ä¸èƒ½ç›¸åŒ" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "SABnzbd 以 %s ç¼–ç å¯åŠ¨äº†ï¼Œæ­£å¸¸åº”è¯¥æ˜¯ UTF-8。会导致下载文件夹中统一标准编ç çš„æ–‡ä»¶å’Œæ–‡ä»¶å¤¹å称出现问题。" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "由于缺少 CERT åŠ KEY 文件,已ç¦ç”¨ HTTPS" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "无法å¯åЍ web 界é¢: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "无法连接 SABHelper æœåŠ¡" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s å·²å¯åЍ" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "警告" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "错误" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "SABnzbd 关闭完æˆ" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "ä¸»æœºåæœªè®¾ç½®ã€‚" #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "未设置连接。请设置至少一个连接。" #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "密ç ä¼šä»¥ ****** æ˜¾ç¤ºï¼Œè¯·é‡æ–°è¾“å…¥" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "æœåŠ¡å™¨ä¿¡æ¯æ— æ•ˆ" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "è¶…æ—¶: 请å°è¯•å¯ç”¨ SSL 或连接其他端å£ã€‚" #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "è¶…æ—¶" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "未知的 SSL å议:å°è¯•ç¦ç”¨ SSL 或者连接ä¸åŒçš„端å£ã€‚" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "æœåŠ¡å™¨åœ°å€æ— æ•ˆã€‚" #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "登录过程中æœåŠ¡å™¨é€€å‡ºã€‚" #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "æœåŠ¡å™¨éœ€è¦ç”¨æˆ·å与密ç ã€‚" #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "连接æˆåŠŸ!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "身份认è¯å¤±è´¥ï¼Œè¯·æ£€æŸ¥ç”¨æˆ·å/密ç ã€‚" #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "连接数过多,请先暂åœä¸‹è½½æˆ–ç¨åŽå†è¯•" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "无法判断连接结果 (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "æ•æ‰åˆ° %s ä¿¡å·ï¼Œæ­£åœ¨ä¿å­˜å¹¶é€€å‡º..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "ä¿å­˜çŠ¶æ€æ—¶é‡åˆ°è‡´å‘½é”™è¯¯" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "正在å°è¯•从 %s è£…å– NZB" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "ä¿å­˜ %s 失败" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "无法为 %s 创建临时文件" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "正在å°è¯•设置ä¸å­˜åœ¨çš„æœåŠ¡å™¨ %s 的状æ€" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "tempfile.mkstemp 出错" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "加载 %s 失败" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "æˆåŠŸå‘é€ç”µå­é‚®ä»¶" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "测试通知" #: sabnzbd/api.py msgid " Resolving address" 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 "æ— " #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "默认" #: sabnzbd/api.py msgid "unknown" msgstr "未知" #: sabnzbd/api.py [Error message] 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 "ç£ç›˜å·²æ»¡! 强制暂åœ" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "创建文件 %s æ—¶ç£ç›˜å‡ºé”™" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Assembler 出现致命错误" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "警告:\"%s\" 任务已暂åœï¼Œå› å…¶åŒ…å«åР坆 RAR 文件 (å·²å°è¯•所有的密ç ï¼Œå¦‚æžœæä¾›äº†çš„è¯)" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "警告:\"%s\" 任务已终止,因其包å«åР坆 RAR 文件 (å·²å°è¯•所有的密ç ï¼Œå¦‚æžœæä¾›äº†çš„è¯)" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "已中止,å‘现加密文件" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "*警告*: RAR 文件“%sâ€ä¸­å‡ºçްä¸éœ€è¦çš„æ‰©å±•å。ä¸éœ€è¦çš„æ–‡ä»¶å为 %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "rar 文件中出现ä¸éœ€è¦çš„æ‰©å±•å %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "已中止,侦测到ä¸éœ€è¦çš„æ‰©å±•å" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "*警告*: 任务“%sâ€å·²æš‚åœï¼Œç”±äºŽè¯„分过低 (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "*警告*: 任务“%sâ€å·²ä¸­æ­¢ï¼Œç”±äºŽè¯„分过低 (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "已中止,评分筛选器已命中 (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "缺少 %s" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "任务 \"%s\" å¯èƒ½å—åŠ å¯†ä¿æŠ¤ï¼ŒRAR 文件中存在相åŒåç§°çš„ RAR 文件。" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "任务 \"%s\" å¯èƒ½å—åŠ å¯†ä¿æŠ¤ï¼šæ–‡ä»¶å \"%s\" 中有 \"password\" 字符" #: sabnzbd/assembler.py msgid "video" msgstr "视频" #: sabnzbd/assembler.py msgid "audio" msgstr "音频" #: sabnzbd/assembler.py msgid "spam" msgstr "垃圾" #: sabnzbd/assembler.py msgid "passworded" msgstr "有密ç " #: sabnzbd/assembler.py msgid "downvoted" msgstr "å·²å‡åˆ†" #: sabnzbd/assembler.py msgid "keywords" msgstr "关键è¯" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "é…é¢å·²è€—尽,暂åœä¸‹è½½" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s 䏿˜¯æœ‰æ•ˆçš„电å­é‚®ç®±åœ°å€" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "æœåŠ¡å™¨åœ°å€å¿…å¡«" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "无法创建 %s 文件夹 %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "无法写入 INI 文件 %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "无法为 %s 创建备份文件" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "密ç ç¼–ç é”™è¯¯ %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s 䏿˜¯æœ‰æ•ˆçš„八进制值" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "此处ä¸å…许使用 UNC 路径 \"%s\"" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "错误: 路径长度应ä¸è¶…过 %s。" #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "错误: 队列éžç©ºï¼Œæ— æ³•å˜æ›´æ–‡ä»¶å¤¹ã€‚" #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "无法写入“历å²è®°å½•â€æ•°æ®åº“,请检查访问æƒé™!" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "“历å²è®°å½•â€æ•°æ®åº“å·²æŸå,已创建空数æ®åº“代替" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "SQL 命令执行失败,å‚è§æ—¥å¿—" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "无法关闭数æ®åº“,å‚è§æ—¥å¿—" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "%s 历å²ä¿¡æ¯ä¸­ stage 日志无效" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "%s è§£ç å¤±è´¥" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "è§£ç å™¨å¤±è´¥ï¼šå†…å­˜ä¸è¶³" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "yEnc 文章格å¼é”™è¯¯ï¼š%s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "è§£ç  %s æ—¶å‘生未知错误" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => 所有æœåС噍å‡ç¼ºå¤±ï¼Œæ­£åœ¨èˆå¼ƒ" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "完æˆ" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "已解压 %s 个文件/文件夹,耗时 %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message] msgid "Cannot read %s" msgstr "æ— æ³•è¯»å– %s" #: sabnzbd/dirscanner.py [Error message] msgid "Error while adding %s, removing" msgstr "加载 %s 出错,正在移除" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "移除 %s 时出错" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "无法读å–监视文件夹 %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "æ¢å¤ä¸­" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "已暂åœ" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "设置带宽é™åˆ¶å‰ï¼Œæ‚¨å¿…须设置最大带宽值" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "无法连接到æœåС噍 %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "æœåС噍志 æ³•è§£æž" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "æœåС噍 %s 将被忽略 %s 分钟" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "无法åˆå§‹åŒ– %s@%s,原因为: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "æœåС噍 %s 连接数过多" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "å¯èƒ½å­˜åœ¨è´¦å·å…±äº«" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "无法登录æœåС噍 %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "连接 %s@%s 失败,消æ¯=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "æœåС噍 %s 需è¦ç”¨æˆ·/密ç " #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "下载器疑似错误" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "正在关闭" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "无法连接到邮件æœåС噍" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "无法å‘èµ· TLS 连接" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "æœåŠ¡å™¨æœªæ­£ç¡®å›žå¤ helo 问候" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "无法在邮件æœåŠ¡å™¨ä¸ŠéªŒè¯èº«ä»½" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "未找到åˆé€‚çš„èº«ä»½éªŒè¯æ–¹æ³•" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "邮件æœåŠ¡å™¨å‡ºçŽ°æœªçŸ¥èº«ä»½éªŒè¯é”™è¯¯" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "无法å‘é€ e-mail" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "无法关闭邮件连接" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "未给定收件人,电å­é‚®ä»¶æœªå‘出" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd 报告ç£ç›˜å·²æ»¡\n" "\n" "Hi,\n" "\n" "由于ç£ç›˜å‡ ä¹Žå·²æ»¡ï¼ŒSABnzbd å·²åœæ­¢ä¸‹è½½ã€‚\n" "è¯·è…¾å‡ºç©ºé—´å†æ‰‹åŠ¨è®© SABnzbd 续传。\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "无法创建目录 %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "%s 目录: %s 访问出错" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "无法更改 %s çš„æƒé™" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "创建失败 (%s)" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "å°† %s 移动到 %s 失败" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "用户已在 web 界é¢ç™»å½•" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "用户已登录" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "ç¼ºä¼šè¯ key" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "错误: 需è¦ä¼šè¯ Key" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "错误: ä¼šè¯ Key 䏿­£ç¡®" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "缺 API Key,请将“é…ç½®â€->“常规â€ä¸­çš„ api key 输入到第三方程åºä¸­:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "API Key 䏿­£ç¡®ï¼Œè¯·åœ¨ç¬¬ä¸‰æ–¹ç¨‹åºä¸­ä½¿ç”¨â€œé…ç½®â€->“常规â€ä¸­çš„ api key:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "缺身份认è¯ä¿¡æ¯ï¼Œè¯·åœ¨ç¬¬ä¸‰æ–¹ç¨‹åºä¸­è¾“入“é…ç½®â€->“常规â€ä¸­çš„用户å/密ç :" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "请å°è¯•我们的新皮肤“Glitterâ€! 为桌é¢åŠç§»åŠ¨è®¾å¤‡ä¼˜åŒ–çš„å…¨æ–°è®¾è®¡ã€‚è¯·åˆ°â€œé…ç½®â€->â€œå¸¸è§„â€æ›´æ”¹çš®è‚¤ã€‚" #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "%s 中有失败的登陆请求" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
SABnzbd 关闭完æˆã€‚
请等待约 5 ç§’åŽç‚¹å‡»ä¸‹é¢çš„æŒ‰é’®ã€‚

刷新
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "警告: LOCALHOST 太å«ç³Šï¼Œè¯·ä½¿ç”¨æ•°å­— IP 地å€ã€‚" #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "æœåŠ¡å™¨åœ°å€ \"%s:%s\" 无效。" #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Feed" #: sabnzbd/interface.py msgid "Daily" msgstr "æ¯å¤©" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "周一" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "周二" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "周三" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "周四" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "周五" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "周六" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "周日" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "å…³" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "未定义æœåС噍!" #: 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 msgid "Back" msgstr "返回" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "错误:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "%s 值䏿­£ç¡®: %s" #: sabnzbd/misc.py msgid "d" msgstr "天" #: sabnzbd/misc.py msgid "h" msgstr "å°æ—¶" #: sabnzbd/misc.py msgid "m" msgstr "分钟" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "创建 SSL key åŠè¯ä¹¦å‡ºé”™" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "正在执行脚本" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "åŽæœŸå¤„ç†å·²ä¸­æ­¢ (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "脚本" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "解压嵌套层级过深 [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "正在åˆå¹¶" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "å¯åˆå¹¶çš„æ–‡ä»¶é˜Ÿåˆ—ä¸å®Œæ•´" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "%s 文件åˆå¹¶å¤±è´¥" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] \"%s\" åˆå¹¶æ–‡ä»¶æ—¶å‡ºé”™" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "\"%s\" 对 %s è¿è¡Œ file_join 时出错" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] å·²åˆå¹¶ %s 个文件" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "解压失败,%s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] \"%s\" 解压 RAR 文件时出错" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "出现错误 \"%s\",正对 %s 执行 rar_unpack æ“作" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "删除 %s 失败!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "正在å°è¯• unrarï¼Œä½¿ç”¨å¯†ç  \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "解压失败,压缩文件需è¦å¯†ç " #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "正在解压" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "解压" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "解压失败,找ä¸åˆ° %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "错误: 无法找到 \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "解压失败,CRC 错误" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "错误: \"%s\" CRC 失败" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "è§£åŽ‹å¤±è´¥ï¼Œæ–‡ä»¶å¤ªå¤§æ–‡ä»¶ç³»ç»Ÿä¸æ”¯æŒ (FAT?)" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "é”™è¯¯ï¼šæ–‡ä»¶å¤ªå¤§æ–‡ä»¶ç³»ç»Ÿä¸æ”¯æŒ (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "解压失败,写入出错或ç£ç›˜å·²æ»¡?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "错误: 写入出错 (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "解压失败,路径过长" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "*错误*: 路径过长 (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "无法使用的 RAR 文件" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "æŸåçš„ RAR 文件" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s 个文件,耗时 %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "\"%s\" 对 %s 执行 unzip() 时出错" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "正在å°è¯• 7zipï¼Œå¯†ç  \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "7ZIP 分å·ç»„ \"%s\" ä¸å®Œæ•´ï¼Œæ— æ³•解压" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "无法解压 %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "快速检查" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "ä¿®å¤" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] 快速检查 OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "正在开始修å¤" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "ä¿®å¤å¤±è´¥ï¼Œ%s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "%s å¯¹é›†åˆ %s 执行 par2_repair 时出错" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "\"%s\" å¯¹é›†åˆ %s 执行 par2_repair 时出错" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "[%s] PAR2 æ”¶åˆ°çš„é€‰é¡¹ä¸æ­£ç¡®ï¼Œè¯·æ£€æŸ¥æ‚¨çš„“é…ç½®â€->â€œå‚æ•°â€è®¾ç½®" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] 验è¯è€—æ—¶ %s,所有文件å‡å®Œå¥½æ— æŸ" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] 验è¯è€—æ—¶ %s,需è¦ä¿®å¤" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "æ­£åœ¨è£…å– %s å—..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "正在装å–" #: sabnzbd/newsunpack.py msgid "Repair failed, not enough repair blocks (%s short)" msgstr "ä¿®å¤å¤±è´¥ï¼Œä¿®å¤å—ä¸è¶³ (缺 %s å—)" #: sabnzbd/newsunpack.py msgid "Repairing" msgstr "正在修å¤" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] 已修å¤ï¼Œè€—æ—¶ %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "ç£ç›˜ç©ºé—´å·²æ»¡" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "正在验è¯" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "正在检查" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "Python 脚本 \"%s\" ä¸å…·æœ‰æ‰§è¡Œ (+x) æƒé™" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "该æœåС噍ä¸å…许在该端å£ä½¿ç”¨ SSL" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "%s æœåŠ¡å™¨ä½¿ç”¨äº†ä¸å—信任的è¯ä¹¦ [%s]" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "å¯åЍ/关闭" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "已添加 NZB" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "åŽæœŸå¤„ç†å·²å¼€å§‹" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "任务已完æˆ" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "任务失败" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "队列已完æˆ" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "å…¶ä»–ä¿¡æ¯" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "ä¸å¯ç”¨" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "无法å‘é€ Prowl 消æ¯" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Pushover å“应异常 (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "无法å‘é€ pushover ä¿¡æ¯" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Pushbullet å“应异常 (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "无法å‘é€ pushbullet ä¿¡æ¯" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "è„šæœ¬è¿”å›žé€€å‡ºä»£ç  %s åŠè¾“出内容 \"%s\"" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "通知脚本 \"%s\" ä¸å­˜åœ¨" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "无法å‘é€ Windows 通知" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "导入 %s 文件失败,æ¥è‡ª %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "å‘现ä¸å…¼å®¹çš„队列文件,无法继续处ç†" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "无法加载 %s,侦测到æŸå文件" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB 已添加到队列" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> 未知编ç " #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "NZB 文件 %s ä¸å®Œæ•´" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "无效 NZB 文件 %s,正在跳过 (原因=%s, 行=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "空 NZB 文件 %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "预队列脚本将任务标记为失败的" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "正在忽略é‡å¤ NZB \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "失败于é‡å¤çš„ NZB 文件 \"%s\"" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "é‡å¤çš„ NZB 文件" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "正在暂åœé‡å¤ NZB \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "已中止,无法完æˆ" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "*é‡å¤*" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "*加密*" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "*太大*" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "*ä¸å®Œæ•´*" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "ä¸éœ€è¦" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "已过滤" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "*等待* %s ç§’" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "传播延迟生效,等待 %s 分钟" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "已下载,耗时 %s,平å‡é€Ÿåº¦ %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "å‘布时间" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s 篇文章æŸå" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s 篇文章缺失" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s 篇文章存在未匹é…çš„é‡å¤" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "已移除 %s 篇文章" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "导入 %s 出错" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "警告信æ¯" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "空闲" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "é…ç½®" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "队列" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "清空队列" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "历å²" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "清空历å²" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "é™é€Ÿ" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "æš‚åœ" #: sabnzbd/osxmenu.py msgid "min." msgstr "分钟" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "ç»­ä¼ " #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "扫æç›‘视文件夹" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "è¯»å–æ‰€æœ‰ RSS feed" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "å®Œæˆæ–‡ä»¶å¤¹" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "æœªå®Œæˆæ–‡ä»¶å¤¹" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "疑难解决" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "é‡å¯" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "清除登录身份凭æ®è®¾ç½®å¹¶é‡æ–°å¯åЍ" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "退出" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "å°†å‰å项加入队列" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "清空" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "æœ€è¿‘åæ¡åŽ†å²è®°å½•" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "新版本å¯ç”¨" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "转到å‘导" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "æ­£åœ¨åœæ­¢..." #: sabnzbd/panic.py msgid "Problem with" msgstr "问题" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd 的内部 web æœåŠ¡å™¨éœ€è¦ä¸€ä¸ªç©ºé—²çš„ tcp/ip 端å£ã€‚
\n" " å·²å°è¯•ç«¯å£ %s(ä½äºŽ %s),但ä¸å¯ç”¨ã€‚
\n" " 有其他软件å ç”¨äº†è¯¥ç«¯å£ï¼Œæˆ–者 SABnzbd å·²ç»åœ¨è¿è¡Œï¼Œ
\n" "
\n" " 请使用其他端å£å·é‡å¯ SABnzbd。" #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "å¦‚æžœæ‚¨å†æ¬¡æ”¶åˆ°æœ¬é”™è¯¯ä¿¡æ¯ï¼Œè¯·å°è¯•其他数字。
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd 的内部 web æœåŠ¡å™¨éœ€è¦æœ‰æ•ˆçš„主机地å€ã€‚
\n" " æ‚¨æŒ‡å®šçš„åœ°å€æ— æ•ˆã€‚
\n" " 安全的值有 localhost 与 0.0.0.0
\n" "
\n" " 请使用适当的主机地å€é‡å¯ SABnzbd。" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd 侦测到其他 SABnzbd 版本已ä¿å­˜çš„æ•°æ®
\n" " ä½†æ— æ³•é‡æ–°ä½¿ç”¨å…¶ä»–程åºçš„æ•°æ®ã€‚

\n" " 您å¯èƒ½éœ€è¦å…ˆå®Œæˆå…¶ä»–程åºçš„队列。

\n" " 之åŽå†ä½¿ç”¨ \"--clean\" 选项å¯åŠ¨æœ¬ç¨‹åºã€‚
\n" " 该选项将清除当å‰é˜Ÿåˆ—åŠåކå²!
\n" " SABnzbd 读å–到的文件是 \"%s\"。" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd 无法找到ä½äºŽ %s çš„ web ç•Œé¢æ–‡ä»¶ã€‚
\n" " è¯·é‡æ–°å®‰è£…本程åºã€‚
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd 侦测到致命错误:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd 侦测å‘现缺少 sqlite3.dll 文件。

\n" " 一些很差劲的病毒扫æç¨‹åºä¼šç§»é™¤æ­¤æ–‡ä»¶ã€‚
\n" " 请检查您的病毒扫æç¨‹åºï¼Œå°è¯•釿–°å®‰è£… SABnzbd å¹¶å‘病毒扫æç¨‹åºåŽ‚å•†åæ˜ ã€‚
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "请按 开始èœå•é”®+R 并输入下é¢ä¸€è¡Œå‘½ä»¤ (例):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "请打开“终端â€çª—å£å¹¶è¾“入下é¢ä¸€è¡Œå‘½ä»¤ (例):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "ç¨‹åºæœªå¯åЍ!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "ç»‘å®šç«¯å£ %s 在 %s ä¸Šå¤±è´¥ã€‚å…¶å®ƒçš„ç¨‹åºæ­£åœ¨ä½¿ç”¨æ­¤ç«¯å£æˆ–者说 SABnzbd 正在è¿è¡Œã€‚" #: sabnzbd/panic.py msgid "Fatal error" msgstr "致命错误" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "无法å¯åЍæµè§ˆå™¨ï¼Œå¯èƒ½æœªæ‰¾åˆ°" #: sabnzbd/panic.py msgid "Access denied" msgstr "访问被拒ç»" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "错误 %s: æ‚¨éœ€è¦æä¾›æœ‰æ•ˆçš„ç”¨æˆ·å与密ç ã€‚" #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "侦测到旧版队列,请使用“状æ€â€â†’“修å¤â€è½¬æ¢é˜Ÿåˆ—" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" msgstr "å·²å®Œæˆæ–‡ä»¶å¤¹ %s ä½äºŽ FAT 文件系统上,这样会有最大文件为 4GB çš„é™åˆ¶ã€‚" #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "下载å¯èƒ½ä¼šå¤±è´¥ï¼Œåªæœ‰ %s å— (éœ€è¦ %s) å¯ç”¨" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "下载失败 - ä¸åœ¨è¯¥æœåŠ¡å™¨ä¸Š" #: sabnzbd/postproc.py msgid "Moving" msgstr "正在移动" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "已将 %s å‘é€åˆ°é˜Ÿåˆ—" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "å°† \"%s\" é‡å‘½å为 \"%s\" 出错" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "移动文件失败" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "正在执行用户脚本 %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "执行 %s" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "脚本退出代ç ä¸º %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "更多" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "åŽæœŸå¤„ç†å¤±è´¥ï¼š%s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "查看日志文件" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "下载失败" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "%s 清ç†å¤±è´¥ã€‚" #: sabnzbd/postproc.py msgid "Download Completed" msgstr "下载完æˆ" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "无法创建最终文件夹 %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "åŽæœŸå¤„ç†" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] æ—  par2 集åˆ" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "正在å°è¯• SFV 验è¯" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "部分文件的验è¯ç»“果与 \"%s\" ä¸ç¬¦" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "æˆåŠŸä½¿ç”¨ SFV 文件验è¯" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "正在å°è¯•基于 RAR 的验è¯" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "[%s] 基于 RAR 的验è¯å¤±è´¥: %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "有密ç " #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "RAR æ–‡ä»¶éªŒè¯æˆåŠŸ" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "RAR 文件验è¯å¤±è´¥" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "移除 %s 失败" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "系统休眠失败" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "系统待机失败" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "关闭系统时出错" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "评分文件的索引器 id (%s) 未找到" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "æœåŠ¡å™¨åœ°å€" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "API Key" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "这个密钥用æ¥å‘æœåŠ¡å™¨è¡¨æ˜Žèº«ä»½ã€‚æŸ¥çœ‹æ‚¨åœ¨ç´¢å¼•ç½‘ç«™ä¸Šçš„ä¸ªäººæ¡£æ¡ˆã€‚" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "RSS feed æè¿°ä¸æ­£ç¡® \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "无法检索 %s çš„ RSS: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "feed %s 无有效的身份认è¯å‡­æ®" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "æœåŠ¡å™¨ç«¯é”™è¯¯ (æœåŠ¡å™¨ä»£ç  %s)ï¼›æ— æ³•èŽ·å– %s (æœåС噍 %s)" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "æœåС噍 %s 使用的 HTTPS è¯ä¹¦ä¸å—ä¿¡ä»»" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "RSS Feed %s 为空" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "feed ä¸å…¼å®¹" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "å‘现空的 RSS æ¡ç›® (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "显示界é¢" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "æ‰“å¼€å®Œæˆæ–‡ä»¶å¤¹" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "æš‚åœ" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "æš‚åœ 5 分钟" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "æš‚åœ 15 分钟" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "æš‚åœ 30 分钟" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "æš‚åœ 1 å°æ—¶" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "æš‚åœ 3 å°æ—¶" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "æš‚åœ 6 å°æ—¶" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "关闭" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "剩余" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "添加 NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "定时任务 %s 存在问题,时间为 %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "未知æ“作: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "定时任务的æœåС噍ä¸å­˜åœ¨ %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "下载" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "åˆå¹¶æ–‡ä»¶" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "æ¥æº" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "æœåС噍" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "失败" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "失败" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "等待" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "正在修å¤..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "正在æå–..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "正在移动..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "正在执行脚本..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "正在装å–é¢å¤–å—..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "快速检查..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "正在验è¯..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "正在下载" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "传播延迟" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "任务" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "ç¦ç”¨æœåС噍" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "å¯ç”¨æœåС噍" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "é™é€Ÿ" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "全部暂åœ" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "æš‚åœåŽæœŸå¤„ç†" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "ç»§ç»­åŽæœŸå¤„ç†" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "è¯»å– RSS feed" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "移除失败任务" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "移除已完æˆä»»åŠ¡" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "æš‚åœä½Žä¼˜å…ˆçº§ä»»åŠ¡" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "æš‚åœå¸¸è§„优先级任务" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "æš‚åœé«˜ä¼˜å…ˆçº§ä»»åŠ¡" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "继续低优先级任务" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "继续常规优先级任务" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "继续高优先级任务" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "å¯ç”¨é…é¢ç®¡ç†" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "å…³" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "éžå¸¸ä½Ž" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "适中" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "常规" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "高" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "紧急" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "低" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "å°æ—¶" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "å°æ—¶" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "分钟" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "分钟" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "ç§’" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "ç§’" #: sabnzbd/skintext.py msgid "day" msgstr "天" #: sabnzbd/skintext.py msgid "days" msgstr "天" #: sabnzbd/skintext.py msgid "week" msgstr "周" #: sabnzbd/skintext.py msgid "Month" msgstr "月" #: sabnzbd/skintext.py msgid "Year" msgstr "å¹´" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "æ¯æœˆç‰¹å®šä¸€å¤©" #: sabnzbd/skintext.py msgid "This week" msgstr "本周" #: sabnzbd/skintext.py msgid "This month" msgstr "本月" #: sabnzbd/skintext.py msgid "Today" msgstr "今天" #: sabnzbd/skintext.py msgid "Total" msgstr "总计" #: sabnzbd/skintext.py msgid "on" msgstr "å¼€" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "傿•°" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Python 版本" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "主页" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "或" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "主机" #: sabnzbd/skintext.py msgid "Comment" msgstr "评论" #: sabnzbd/skintext.py msgid "Send" msgstr "å‘é€" #: sabnzbd/skintext.py msgid "Cancel" msgstr "å–æ¶ˆ" #: sabnzbd/skintext.py msgid "Other" msgstr "å…¶ä»–" #: sabnzbd/skintext.py msgid "Report" msgstr "报告" #: sabnzbd/skintext.py msgid "Video" msgstr "视频" #: sabnzbd/skintext.py msgid "Audio" msgstr "音频" #: sabnzbd/skintext.py msgid "Not used" msgstr "未使用" #: sabnzbd/skintext.py msgid "or less" msgstr "或更少" #: sabnzbd/skintext.py msgid "Log in" msgstr "登录" #: sabnzbd/skintext.py msgid "Log out" msgstr "注销" #: sabnzbd/skintext.py msgid "Remember me" msgstr "è®°ä½æˆ‘" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "usenet 自动下载工具" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "ä¿å­˜" #: sabnzbd/skintext.py msgid "Saving.." msgstr "正在ä¿å­˜.." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "是å¦ç¡®å®š?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "删除全部已下载文件?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "主页" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "é…ç½®" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "状æ€" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "帮助" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "论å›" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "问题" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "支æŒè¯¥é¡¹ç›®ï¼ŒæåŠ©!" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "常规" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "文件夹" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "傿•°" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "定时任务" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "通知" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "Email" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "分类" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "排åº" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "特殊" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "æœç´¢" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "下载目录" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "*已暂åœ*" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "已缓存 %s 篇文章 (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "系统负载" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "新版 %s å·²å‘布,下载:" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "是å¦ç¡®å®šè¦å…³é—­ SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "添加" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "添加文件" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "分类" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "处ç†" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "优先级" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+ä¿®å¤" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+解压" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+删除" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "ä¿®" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "è§£" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "删" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "强制" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "åœæ­¢" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "输入 URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "é˜Ÿåˆ—å®Œæˆæ—¶" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "电脑关闭" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "电脑待机" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "电脑休眠" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "关闭 SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "é™é€Ÿ" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "åºå·" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "åç§°" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "大约完æˆ" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "å‘布时间" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "删除" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "é‡è¯•" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "æ“作" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "脚本" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "删除队列中全部项?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "清空 NZB" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "清空 NZB 并删除文件" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "釿–°å°è¯•下载所有已失败任务" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "移除 NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "移除 NZB 并删除文件" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "/" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "缺失文章" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "剩余é…é¢" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "手动" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "ç«‹å³é‡ç½®é…é¢" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "从“历å²â€ä¸­åˆ é™¤æ‰€æœ‰å·²å®Œæˆé¡¹?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "éšè—详情" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "显示详情" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "åªæ˜¾ç¤ºå¤±è´¥é¡¹" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "显示全部项" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "尺寸" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "清除失败 NZB" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "清除失败 NZB 并删除文件" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "æ¸…é™¤å·²å®Œæˆ NZB" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "æ¸…ç†æœ¬é¡µçš„ NZB 文件" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "å¯é€‰è¡¥å…… NZB" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "路径" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "é‡è¯•所有失败任务" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "é‡è¯•所有" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "病毒/垃圾" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "超出ä¿ç•™æœŸ" #: sabnzbd/skintext.py msgid "Other problem" msgstr "其他问题" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "强制断开连接" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "这将å‘é€ä¸€å°æµ‹è¯•邮件到您的账å·å½“中。" #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "显示日志" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "测试邮件" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "日志" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "错误/警告" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ ä¿¡æ¯" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ 调试" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "连接" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "最新警告信æ¯" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "清除" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "è§£å°" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "文章 id" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "文件集" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "æ—¶é—´" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "类型" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "å¯ç”¨" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "控制å°" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "连接失败!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "本地 IPv4 地å€" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "公网 IPv4 地å€" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "IPv6 地å€" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "åŸŸåæœåŠ¡å™¨ / DNS 查询" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "CPU åž‹å·" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "系统性能 (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "下载文件夹读写速度" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "å®Œæˆæ–‡ä»¶å¤¹å†™å…¥é€Ÿåº¦" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "写入速度" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "无法写入。请确ä¿è¯¥ç›®å½•有写入æƒé™ã€‚" #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "点击下é¢çš„“é‡å¤â€æŒ‰é’®å¯å¼€å§‹æµ‹è¯•" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "é‡å¤æµ‹è¯•" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "é…置文件" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "已用缓存" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "è¿™å°†é‡æ–°å¯åЍ SABnzbd。
如果您认为程åºå­˜åœ¨ç¨³å®šæ€§é—®é¢˜ï¼Œè¯·ä½¿ç”¨è¯¥é¡¹ã€‚
é‡å¯å‰å°†æš‚åœä¸‹è½½ï¼Œä¹‹åŽå°†ç»§ç»­ä¸‹è½½ã€‚" #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "
è‹¥å¯ç”¨èº«ä»½è®¤è¯ï¼Œæ‚¨å°†éœ€è¦é‡æ–°ç™»å½•。" #: sabnzbd/skintext.py msgid "Advanced" msgstr "高级" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "下载目录中存在孤立任务。
您å¯ä»¥é€‰æ‹©åˆ é™¤ä»»åŠ¡ (åŠå…¶æ–‡ä»¶) 或将它们å‘回队列。" #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "“修å¤â€æŒ‰é’®å¯é‡å¯ SABnzbd 并执行完整的
队列内容é‡å»ºæ“ä½œï¼ŒåŒæ—¶å°†ä¿ç•™å·²ä¸‹è½½çš„æ–‡ä»¶ã€‚
队列的顺åºä¼šæœ‰æ‰€æ”¹å˜ã€‚" #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "更改未ä¿å­˜ï¼Œæ”¹åŠ¨å°†ä¸¢å¤±ã€‚" #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "æ¯å½“您的 IP 地å€å‘生å˜åŒ–,或当 SABnzbd é‡å¯ï¼Œç™»å½•会è¯å°†è‡ªåŠ¨è¿‡æœŸã€‚" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "å¯ç”¨ Unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "å¯ç”¨ 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "安装支æŒå¤šæ ¸å¿ƒçš„ Par2 以便加快修å¤é€Ÿåº¦ï¼Œæ”¯æŒå¤šå¹³å°ã€‚" #: sabnzbd/skintext.py msgid "Version" msgstr "版本" #: sabnzbd/skintext.py msgid "Uptime" msgstr "å¯åŠ¨æ—¶é—´" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "备份" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "关于该项请å‚阅 Wiki 帮助!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "æ­£åœ¨é‡æ–°å¯åЍ SABnzbd..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "å˜æ›´éœ€è¦é‡å¯ SABnzbd æ‰ä¼šç”Ÿæ•ˆ!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "SABnzbd Web æœåС噍" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "SABnzbd 主机" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "SABnzbd 应监å¬çš„主机。" #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "SABnzbd 端å£" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "SABnzbd 应监å¬çš„端å£ã€‚" #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Web 界é¢" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "选择皮肤。" #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "SABnzbd 用户å" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "å¯é€‰èº«ä»½éªŒè¯ç”¨æˆ·å。" #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "SABnzbd 密ç " #: sabnzbd/skintext.py 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 "安全" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "å¯ç”¨ HTTPS" #: sabnzbd/skintext.py msgid "not installed" msgstr "未安装" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "å¯ç”¨ HTTPS 地å€è®¿é—®ç•Œé¢ã€‚" #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "HTTPS 端å£" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "è‹¥ç•™ç©ºï¼Œåˆ™å°†ç›‘å¬ HTTPS 标准端å£ã€‚" #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "HTTPS è¯ä¹¦" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "HTTPS è¯ä¹¦æ–‡ä»¶å或路径。" #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "ç”Ÿæˆæ–°çš„自签åè¯ä¹¦å’Œå¯†é’¥ã€‚需è¦é‡å¯ SABnzbdï¼" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "HTTPS Key" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "HTTPS Key æ–‡ä»¶åæˆ–路径。" #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "HTTPS 链è¯ä¹¦" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "HTTPS é“¾æ–‡ä»¶åæˆ–路径。" #: sabnzbd/skintext.py msgid "Tuning" msgstr "调节" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "RSS 检查间隔" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "检查间隔 (分钟,最å°å€¼ä¸º 15)。若使用“定时任务â€åˆ™ä¸ä¼šæœ‰æ•ˆ!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "最大线路速度" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "线路速度的百分比" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "SABnzbd 应å ç”¨çš„线路速度的百分比,如 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "文章缓存é™åˆ¶" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "在内存中缓存文章,以å‡è½»ç¡¬ç›˜è®¿é—®åŽ‹åŠ›ã€‚
å•ä½ä¸ºå­—节,å¯ä»¥é€‰æ‹©åŠ ä¸Š Kã€Mã€G åŽç¼€ã€‚例如: \"64M\" 或 \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "清ç†åˆ—表" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "下载åŽåº”删除的文件扩展å列表。
例如: nfo 或 nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "ä¿å­˜æ›´æ”¹" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "æ¢å¤é»˜è®¤å€¼" #: sabnzbd/skintext.py msgid "Reset" msgstr "é‡ç½®" #: sabnzbd/skintext.py msgid "Language" msgstr "语言" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "选择 web 界é¢çš„语言。" #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "å¸®åŠ©æˆ‘ä»¬æ¥æœ¬åœ°åŒ– SABnzbd ï¼
您å¯ä»¥åœ¨è¿™é‡Œæ¥æ·»åŠ æœªè¢«ç¿»è¯‘çš„æ–‡å­—æˆ–è€…æ”¹è¿›çŽ°æœ‰çš„ç¿»è¯‘ï¼š" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "该 key å°†æŽˆäºˆç¬¬ä¸‰æ–¹ç¨‹åº SABnzbd 的完整æƒé™ã€‚" #: sabnzbd/skintext.py msgid "NZB Key" msgstr "NZB Key" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "该 key å°†å…许第三方程åºå°† NZB 添加到 SABnzbd 中。" #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "ç”Ÿæˆæ–°çš„ Key" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "API Key QR ç " #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "本地网段列表" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "本地网络地å€ä»¥è¿™äº›å‰ç¼€å¼€å¤´ (通常为“192.168.1.â€)" #: sabnzbd/skintext.py msgid "External internet access" msgstr "外部互è”网访问" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "您å¯ä»¥è®¾å®šéžæœ¬åœ°ç½‘络的访问æƒé™ã€‚è¦æ±‚定义本地网络列表。" #: sabnzbd/skintext.py msgid "No access" msgstr "æ— æƒè®¿é—®" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "添加 NZB 文件 " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (ä¸å…许é…ç½®)" #: sabnzbd/skintext.py msgid "Full API" msgstr "完整 API" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "完整 Web 界é¢" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "åªå¯¹å¤–éƒ¨è®¿é—®è¦æ±‚登录" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "注: ä¿å­˜æ—¶å°†è‡ªåŠ¨åˆ›å»ºæ–‡ä»¶å¤¹ã€‚æ‚¨å¯ä»¥ä½¿ç”¨ç»å¯¹è·¯å¾„以ä¿å­˜åˆ°é»˜è®¤æ–‡ä»¶å¤¹ä»¥å¤–的地方。" #: sabnzbd/skintext.py msgid "User Folders" msgstr "用户文件夹" #: sabnzbd/skintext.py msgid "Browse" msgstr "æµè§ˆ" #: sabnzbd/skintext.py msgid "In" msgstr "ä½äºŽ" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "临时下载文件夹" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "存储未处ç†ä¸‹è½½æ•°æ®çš„ä½ç½®ã€‚
仅当队列为空时å¯ä»¥æ›´æ”¹ã€‚" #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "临时下载文件夹的最å°å‰©ä½™ç©ºé—´" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "当剩余空间低于该值时自动暂åœã€‚
å•ä½ä¸ºå­—节,å¯é€‰æ·»åŠ  Kã€Mã€Gã€T åŽç¼€ã€‚例如: \"800M\" 或 \"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "完æˆä¸‹è½½æ–‡ä»¶å¤¹" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "存储完æˆä¸”已完全处ç†çš„下载数æ®çš„ä½ç½®ã€‚
å¯ä»¥é€šè¿‡ç”¨æˆ·å®šä¹‰åˆ†ç±»é¢å¤–调整。" #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "完æˆä¸‹è½½æƒé™" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "è®¾ç½®å®Œæˆæ–‡ä»¶/文件夹的æƒé™å€¼ã€‚
八进制记法。例如: \"755\" 或 \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "监视文件夹" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "è¦ç›‘视 .nzb 文件的文件夹。
ä¼šåŒæ—¶æ‰«æ .zip .rar åŠ .tar.gz 压缩文件中的 .nzb 文件。" #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "监视文件夹扫æé€Ÿåº¦" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "扫æ .nzb 文件的间隔时间。" #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "脚本文件夹" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "包å«ç”¨æˆ·è„šæœ¬çš„æ–‡ä»¶å¤¹ã€‚" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "é‚®ä»¶æ¨¡æ¿æ–‡ä»¶å¤¹" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "包å«ç”¨æˆ·å®šä¹‰çš„电å­é‚®ä»¶æ¨¡æ¿çš„æ–‡ä»¶å¤¹ã€‚" #: sabnzbd/skintext.py msgid "Password file" msgstr "å¯†ç æ–‡ä»¶" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "包å«è¦å¯¹åР坆 RAR 文件进行å°è¯•的所有密ç çš„æ–‡ä»¶ã€‚" #: sabnzbd/skintext.py msgid "System Folders" msgstr "系统文件夹" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "ç®¡ç†æ–‡ä»¶å¤¹" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "队列管ç†åŠåކ岿•°æ®åº“的存放ä½ç½®ã€‚
仅当队列为空时å¯ä»¥ä¿®æ”¹ã€‚" #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "æ•°æ®ä¸ä¼šè‡ªåŠ¨ç§»åŠ¨ã€‚éœ€è¦é‡å¯ SABnzbd æ‰èƒ½ç”Ÿæ•ˆ!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "日志文件夹" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "SABnzbd 日志文件的ä½ç½®ã€‚
需è¦é‡å¯ SABnzbd æ‰èƒ½ç”Ÿæ•ˆ!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr ".nzb 备份文件夹" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "存储 .nzb 文件的ä½ç½®ã€‚" #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "默认基本文件夹" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "下载所有 par2 文件" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "å½“éœ€è¦æ—¶ä¸‹è½½æ‰€æœ‰çš„ par2 文件以é¿å…多次è¿è¡Œä¿®å¤ã€‚" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "å¯ç”¨é€’归解压" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "解压压缩包内的压缩包 (rar, zip, 7z)。" #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "忽略压缩包中的文件夹结构" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "所有文件ä¿å­˜åˆ°å•个目录。" #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "åªèŽ·å–队列最顶端的文章" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "å¯ç”¨å¯å‡å°‘内存å ç”¨ã€‚ç¦ç”¨å¯é¿å…慢速任务拖慢队列进度。" #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "仅对ç»éªŒè¯çš„ä»»åŠ¡è¿›è¡ŒåŽæœŸå¤„ç†" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "仅对通过全部 PAR2 æ£€æŸ¥çš„ä»»åŠ¡æ‰§è¡ŒåŽæœŸå¤„ç†ã€‚" #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "下载到加密的 RAR 文件时采å–çš„æ“作" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "若选择“暂åœâ€ï¼Œæ‚¨å°†éœ€è¦è®¾ç½®å¯†ç å¹¶æ‰‹åŠ¨ç»­ä¼ å¯¹åº”ä»»åŠ¡ã€‚" #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "侦测é‡å¤ä¸‹è½½" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "检测相åŒçš„ NZB 文件 (基于您的历å²é¡¹ç›®æˆ– .nzb 备份文件夹中的文件)" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "侦测åŒå­£çš„é‡å¤å‰§é›†" #: sabnzbd/skintext.py msgid "" "Detect identical episodes in series (based on \"name/season/episode\" of " "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 "èˆå¼ƒ" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "失败的任务 (移动到历å²)" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "中止" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "侦测到ä¸éœ€è¦çš„æ‰©å±•åæ—¶çš„æ“ä½œ" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "RAR 文件中侦测到ä¸éœ€è¦çš„æ‰©å±•åæ—¶çš„æ“ä½œ" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "ä¸éœ€è¦çš„æ‰©å±•å" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "所有ä¸éœ€è¦æ‰©å±•å的列表。例如: exe 或 exe, com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "å¯ç”¨åŸºäºŽ SFV 的检查" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "æ ¹æ® SFV 文件进行é¢å¤–验è¯ã€‚" #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "用户脚本å¯å°†ä»»åŠ¡æ ‡è®°ä¸ºå¤±è´¥" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "用户脚本返回éžé›¶çš„é€€å‡ºä»£ç æ—¶ï¼Œå¯¹åº”的任务将被标记为失败。" #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "失败时,å°è¯•备用 NZB" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "部分æœåŠ¡å™¨åœ¨ä¸‹è½½å¤±è´¥æ—¶å¯æä¾›å¤‡ç”¨ NZB 文件。" #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "å¯ç”¨æ–‡ä»¶å¤¹é‡å‘½å" #: sabnzbd/skintext.py 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" msgstr "åŠ å…¥é˜Ÿåˆ—å‰æ‰§è¡Œçš„用户脚本" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "用于在 NZB è¿›å…¥é˜Ÿåˆ—å‰æ‰§è¡Œã€‚" #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "é¢å¤–çš„ PAR2 傿•°" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Nice 傿•°" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "IONice 傿•°" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "清空队列时断开" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "é˜Ÿåˆ—ä¸ºç©ºæˆ–æš‚åœæ—¶ä»Ž Usenet æœåŠ¡å™¨æ–­å¼€è¿žæŽ¥ã€‚" #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "按å‘布时间排列" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "自动按 (å¹³å‡) å‘布时间排列项目。" #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "在文章å‘布时长尚ä¸è¶³è¯¥å€¼æ—¶æš‚åœä¸‹è½½æ–‡ç« ã€‚将任务优先级设为“强制â€å¯è·³è¿‡æ­¤å»¶è¿Ÿã€‚" #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "检查新版本" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "æ¯å‘¨æ£€æŸ¥ SABnzbd 的新版本。" #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "åŒæ—¶æ£€ç´¢æµ‹è¯•版本信æ¯" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "æ›¿æ¢æ–‡ä»¶å¤¹å称中的空格" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "将文件夹åç§°ä¸­çš„ç©ºæ ¼æ›¿æ¢æˆä¸‹åˆ’线。" #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "æ›¿æ¢æ–‡ä»¶å¤¹å称中的点å·" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "将文件夹åç§°ä¸­çš„å°æ•°ç‚¹æ›¿æ¢æˆç©ºæ ¼ã€‚" #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "ç¡®ä¿ä¸Ž Windows 兼容" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "ä¾›æœåŠ¡å™¨ä½¿ç”¨: ç¡®ä¿å称与 Windows 系统兼容。" #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "å¯åŠ¨æ—¶å¯åЍæµè§ˆå™¨" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "å¯åЍ SABnzbd æ—¶å¯åŠ¨é»˜è®¤ web æµè§ˆå™¨ã€‚" #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "åŽæœŸå¤„ç†è¿‡ç¨‹ä¸­æš‚åœä¸‹è½½" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "å¼€å§‹åŽæœŸå¤„ç†æ—¶æš‚åœä¸‹è½½ï¼Œå®ŒæˆåŽç»­ä¼ ã€‚" #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "忽略样本文件" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "过滤样本文件 (如视频样本)。" #: sabnzbd/skintext.py msgid "Delete after download" msgstr "下载åŽåˆ é™¤" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "HTTPS è¯ä¹¦éªŒè¯" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "当用 HTTPS æ–¹å¼è¿žæŽ¥ç´¢å¼•å’ŒRSSæºæ—¶éªŒè¯è¯ä¹¦ã€‚" #: sabnzbd/skintext.py msgid "Server" msgstr "æœåС噍" #: sabnzbd/skintext.py msgid "Post processing" msgstr "åŽæœŸå¤„ç†" #: sabnzbd/skintext.py msgid "Naming" msgstr "命å" #: sabnzbd/skintext.py msgid "Quota" msgstr "é…é¢" #: sabnzbd/skintext.py msgid "Indexing" msgstr "正在索引" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "本月能下载多少数æ®é‡ (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "é‡ç½®æ—¶é—´" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "您的 ISP ä¼šåœ¨æ¯æœˆæˆ–æ¯å‘¨çš„哪天 (1=星期一) é‡ç½®é…é¢? (å¯é€‰åŠ ä¸Š hh:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "自动续传" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "é…é¢é‡ç½®åŽæ˜¯å¦è‡ªåŠ¨ç»­ä¼ ä¸‹è½½?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "é…é¢å‘¨æœŸ" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "é…é¢ä¼šæ¯å¤©ã€æ¯å‘¨æˆ–æ¯æœˆé‡ç½®å—?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "ä¸‹è½½å‰æ£€æŸ¥" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "在实际下载之å‰å°è¯•预测å¯ä»¥æˆåŠŸä¸‹è½½çš„å®Œæ•´ç¨‹åº¦ (ä¼šå‡æ…¢ä¸‹è½½è¿›åº¦!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "SSL 加密算法" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "é™ä½Ž SSL 的加密难度以便获得更高的性能。" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "最多é‡è¯•次数" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "儿œåС噍é‡è¯•的最多次数" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "中止无法完æˆçš„任务" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "下载时若å‘现缺失数æ®è¿‡å¤šï¼Œåˆ™ä¸­æ­¢å¯¹åº”任务" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "å¯ç”¨ç´¢å¼•集æˆ" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "å¯ç”¨è¿‡æ»¤" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "æ ¹æ®è¿‡æ»¤è§„则对下载任务执行æ“作" #: sabnzbd/skintext.py msgid "Abort If" msgstr "中止的æ¡ä»¶" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "å¦åˆ™æš‚åœçš„æ¡ä»¶" #: sabnzbd/skintext.py msgid "Video rating" msgstr "视频评分" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "音频评分" #: sabnzbd/skintext.py msgid "Spam" msgstr "垃圾" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "已确认" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "缩略图的å‡åˆ†æ¯”加分多" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "标题关键è¯" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "逗å·åˆ†éš”的列表" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "如果新闻æœåŠ¡å™¨æœ‰å¤šä¸ª IPv4/IPv6 地å€å°†éžå¸¸æœ‰ç”¨" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "添加æœåС噍" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "æœåС噍æè¿°" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "端å£" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "用户å" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "密ç " #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "è¶…æ—¶" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "ä¿å­˜æœŸé™" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "到æœåŠ¡å™¨çš„å®‰å…¨è¿žæŽ¥" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "è¯ä¹¦éªŒè¯" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "最å°ï¼šå¯åЍ SSL 时,使用æœåŠ¡å™¨è‡ªå·±çš„è¯ä¹¦æ¥éªŒè¯èº«ä»½ã€‚严格:验è¯å¹¶å¼ºåˆ¶ hostname 一致。" #: sabnzbd/skintext.py msgid "Disabled" msgstr "ç¦ç”¨" #: sabnzbd/skintext.py msgid "Minimal" msgstr "最å°" #: sabnzbd/skintext.py msgid "Strict" msgstr "严格" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 为最高优先级,100 为最低优先级" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "å¯é€‰" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "对于ä¸ç¨³å®šçš„æœåŠ¡å™¨ï¼Œåœ¨å¤±è´¥åŽå°†ä¼šè¢«å¿½ç•¥æ›´é•¿çš„æ—¶é—´" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "å¯ç”¨" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "移除æœåС噍" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "测试æœåС噍" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "清除统计" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "正在测试æœåŠ¡å™¨è¯¦ç»†æƒ…å†µ..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "带宽" #: sabnzbd/skintext.py msgid "Send Group" msgstr "å‘é€ Group 命令" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "请求文章之å‰å‘é€ group 命令。" #: sabnzbd/skintext.py msgid "Personal notes" msgstr "注释" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "添加定时任务" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "频率" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "动作" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "傿•°" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "当å‰å®šæ—¶ä»»åŠ¡" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "需è¦å‹¾é€‰ feed åç§°æ—边的å¤é€‰æ¡†æ‰èƒ½å¯ç”¨å¹¶è‡ªåŠ¨æ£€æŸ¥æ–°é¡¹ã€‚
添加 feed åŽï¼Œå®ƒå°†åªé€‰å–新项目,而ä¸é€‰å–å·²ç»å¤„于 RSS feed " "å½“ä¸­çš„é¡¹ï¼Œé™¤éžæ‚¨æŒ‰â€œå¼ºåˆ¶ä¸‹è½½â€ã€‚" #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "以逗巿¥åˆ†å¼€å¤šä¸ªé“¾æŽ¥" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "è¯»å– Feed" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "强制下载" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "过滤器" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "接å—" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "å¦å†³" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "需è¦" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "需è¦åˆ†ç±»" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "至少" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "至多" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "æ¥è‡ª SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "æ¥è‡ªå‰§ç›® SxxEyy" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "已匹é…" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "未匹é…" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "已下载" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "ç«‹å³è¯»å–全部 Feed" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "ä»»åŠ¡å®Œæˆ Email 通知" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "从ä¸" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "总是" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "仅当å‘生错误时" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "ç£ç›˜å·²æ»¡é€šçŸ¥" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "ç£ç›˜å·²æ»¡ã€SABnzbd æš‚åœæ—¶å‘é€ email。" #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "å‘é€ RSS 通知" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "RSS feed 添加任务到队列时å‘é€ email。" #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "SMTP æœåС噍" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "设为您 ISP çš„ email 出站æœåŠ¡å™¨ã€‚" #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Email 收件者" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "å‘é€ email 的目标电å­é‚®ç®±åœ°å€ã€‚" #: sabnzbd/skintext.py msgid "Email Sender" msgstr "Email å‘é€è€…" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "我们应该说是è°å‘é€äº†è¿™å° email?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "*å¯é€‰* è´¦å·ç”¨æˆ·å" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "email èº«ä»½è®¤è¯æ‰€ç”¨çš„è´¦å·å称。" #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "*å¯é€‰* è´¦å·å¯†ç " #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "email èº«ä»½è®¤è¯æ‰€ç”¨çš„密ç ã€‚" #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "通知已å‘é€!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "å¯ç”¨ Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "仅当使用远程 Growl æœåŠ¡å™¨æ—¶éœ€è¦ (主机:端å£)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "æœåС噍坆ç " #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Growl æœåС噍å¯é€‰å¯†ç " #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "å¯ç”¨NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "通知中心" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "å¯ç”¨ Windows 通知" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Windows" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "屿˜¾é€šçŸ¥" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "å¯ç”¨ Prowl 通知" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "éœ€è¦ Prowl è´¦å·" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "Prowl çš„ API 密钥" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Prowl 的个人 API 密钥 (å¿…å¡«)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "å¯ç”¨ Pushover 通知" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "éœ€è¦ Pushover è´¦å·" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "åº”ç”¨ç¨‹åº token" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "应用程åºä»¤ç‰Œ (å¿…å¡«)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "用户 key" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "用户密钥 (å¿…å¡«)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "设备" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "å¯ç”¨ Pushbullet 通知" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "éœ€è¦ Pushbullet è´¦å·" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "个人 API key" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "您自己的 Pushbullet API key (å¿…å¡«)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "设备" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "ä¿¡æ¯å‘é€çš„目标设备" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "通知脚本" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "å¯ç”¨é€šçŸ¥è„šæœ¬" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "执行自定义脚本" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "应该执行哪个脚本æ¥å‘出通知?" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" "索引å¯ä»¥åœ¨ NZB 文件中æä¾›åˆ†ç±»ä¿¡æ¯ï¼ŒSABnzbd 会å°è¯•在以下分类中匹é…。å¦å¤–,您å¯ä»¥åœ¨ \"索引 Categories / Groups\" " "ä¸­æ·»åŠ å…³é”®è¯æ¥åŒ¹é…æ›´å¤šçš„åˆ†ç±»ã€‚ä½¿ç”¨é€—å·æ¥åˆ†å¼€å…³é”®è¯ï¼Œå…³é”®è¯ä¸­å¯ä½¿ç”¨é€šé…符。
ä½ å¯ä»¥åœ¨ç»´åŸºä¸­æŸ¥çœ‹æ›´å¤šçš„相关信æ¯ã€‚" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "è·¯å¾„æœ«å°¾åŠ ä¸Šæ˜Ÿå· * å¯é¿å…创建任务文件夹。" #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "基于相对文件夹" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "文件夹/路径" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "索引 Categories / Groups" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "TV 排åº" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "å¯ç”¨ TV 排åº" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "匹é…符释义" #: sabnzbd/skintext.py msgid "Clear" msgstr "清除" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "应用过滤器" #: sabnzbd/skintext.py msgid "Presets" msgstr "预设" #: sabnzbd/skintext.py msgid "Example" msgstr "示例" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "电影排åº" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "å¯ç”¨ç”µå½±æŽ’åº" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "将下载内容ä¿ç•™åœ¨é¢å¤–文件夹" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "å½±å“分类" #: sabnzbd/skintext.py msgid "Meaning" msgstr "释义" #: sabnzbd/skintext.py msgid "Pattern" msgstr "匹é…" #: sabnzbd/skintext.py msgid "Result" msgstr "结果" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 季度文件夹" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 季度文件夹" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 剧集文件夹" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 剧集文件夹" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "" #: sabnzbd/skintext.py msgid "Title" msgstr "标题" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "影片 åç§°" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "影片.åç§°" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "影片_åç§°" #: sabnzbd/skintext.py msgid "Show Name" msgstr "节目 åç§°" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "节目.åç§°" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "节目_åç§°" #: sabnzbd/skintext.py msgid "Season Number" msgstr "季数" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "集数" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "集 å" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "集.å" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "集_å" #: sabnzbd/skintext.py msgid "File Extension" msgstr "文件扩展å" #: sabnzbd/skintext.py msgid "Extension" msgstr "扩展å" #: sabnzbd/skintext.py msgid "Part Number" msgstr "分段å·" #: sabnzbd/skintext.py msgid "Decade" msgstr "年代" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "原始文件å" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "大å°å†™" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEXT" #: sabnzbd/skintext.py msgid "text" msgstr "text" #: sabnzbd/skintext.py msgid "file" msgstr "文件" #: sabnzbd/skintext.py msgid "Sort String" msgstr "排åºå­—串" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "多段标记" #: sabnzbd/skintext.py msgid "In folders" msgstr "分文件夹" #: sabnzbd/skintext.py msgid "No folders" msgstr "ä¸åˆ†æ–‡ä»¶å¤¹" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "日期排åº" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "å¯ç”¨æ—¥æœŸæŽ’åº" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "节目å称文件夹" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "å¹´-月文件夹" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "æ¯å¤©æ–‡ä»¶å¤¹" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "大å°å†™å·²è°ƒæ•´" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "处ç†ç»“æžœ" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "æžå°‘用到的选项。è¦èŽ·å–å…¶å«ä¹‰åŠè§£é‡Šï¼Œè¯·ç‚¹å‡»â€œå¸®åŠ©â€æŒ‰é’®è®¿é—® Wiki 页é¢ã€‚
在查看 Wiki " "之å‰è¯·ä¸è¦æ›´æ”¹è¿™äº›é€‰é¡¹ï¼Œå®ƒä»¬ä¼šæœ‰å¾ˆä¸¥é‡çš„副作用。
括å·ä¸­ä¸ºé»˜è®¤å€¼ã€‚" #: sabnzbd/skintext.py msgid "Values" msgstr "值" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "编辑 NZB 详情" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "删除" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "置顶" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "上移" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "下移" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "置底" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "全部" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "å选" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "文件å" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "主题" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "选择" #: sabnzbd/skintext.py msgid "left" msgstr "剩余" #: sabnzbd/skintext.py msgid "Free Space" msgstr "剩余空间" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "临时文件夹" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "多选æ“作" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "按 shift é”®å¯é€‰æ‹©èŒƒå›´" #: sabnzbd/skintext.py msgid "Check all" msgstr "全选" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "釿–°å¯åЍ SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "状æ€ä¸Žç•Œé¢é€‰é¡¹" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "或将文件拖拽到本窗å£!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "失去与 SABnzbd 的连接.." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "刷新频率" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "使用全局界é¢è®¾ç½®" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "队列数目é™åˆ¶" #: sabnzbd/skintext.py msgid "History item limit" msgstr "åŽ†å²æ•°ç›®é™åˆ¶" #: sabnzbd/skintext.py msgid "Date format" msgstr "日期格å¼" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "队列显示更多列" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "é¢å¤–的历å²è®°å½•列" #: sabnzbd/skintext.py msgid "page" msgstr "页" #: sabnzbd/skintext.py msgid "Loading" msgstr "正在加载" #: sabnzbd/skintext.py msgid "articles" msgstr "篇文章" #: sabnzbd/skintext.py msgid "Rename" msgstr "é‡å‘½å" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "队列修å¤" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "显示活动连接" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "孤立任务" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "å‘回队列" #: sabnzbd/skintext.py msgid "Delete All" msgstr "全部删除" #: sabnzbd/skintext.py msgid "Retry all" msgstr "全部é‡è¯•" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "从 URL è£…å– NZB" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "上传 NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "å¯ä»¥é€‰æ‹©æŒ‡å®šæ–‡ä»¶å" #: sabnzbd/skintext.py msgid "Submit" msgstr "æäº¤" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "æ‰“å¼€ä¿¡æ¯ URL" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "å·²æäº¤ã€‚感谢!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "未选择任何内容!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "移除已选文件" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "éšè—/æ˜¾ç¤ºå·²å®Œæˆæ–‡ä»¶" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "查看脚本日志" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "有更新å¯ç”¨!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "您的æµè§ˆå™¨å·²ç¦ç”¨ LocalStorage (cookies)。界é¢è®¾ç½®å°†åœ¨æ‚¨å…³é—­æµè§ˆå™¨åŽä¸¢å¤±!" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "ä½ å¯èƒ½ä¼šå–œæ¬¢ä¸€äº› Glitter çš„(æ–°)功能ï¼" #: sabnzbd/skintext.py msgid "Custom" msgstr "自定义" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "精简外观" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "标签化外观
(分别显示队列与历å²è®°å½•)" #: sabnzbd/skintext.py msgid "Speed" msgstr "速度" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "确认队列删除" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "确认历å²åˆ é™¤" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "您希望在多久之åŽ/什么时候暂åœ? (用英语作答!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "抱歉,无法ç†è§£æ‚¨çš„输入。请é‡è¯•。" #: sabnzbd/skintext.py msgid "Pause for..." msgstr "æš‚åœ..." #: 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 Oldest→Newest" msgstr "按å‘å¸ƒæ—¶é—´æŽ’åº æœ€æ—©→最新" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "按å‘å¸ƒæ—¶é—´æŽ’åº æœ€æ–°→最早" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "按åç§°æŽ’åº A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "按åç§°æŽ’åº Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "æŒ‰å°ºå¯¸æŽ’åº æœ€å°→最大" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "æŒ‰å°ºå¯¸æŽ’åº æœ€å¤§→最å°" #: sabnzbd/skintext.py msgid "Uploading" msgstr "正在上传" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "正在强制断开连接" #: sabnzbd/skintext.py msgid "Removing job" msgstr "正在移除任务" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "正在移除任务" #: sabnzbd/skintext.py msgid "Prev" msgstr "å‰" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "åŽ" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "清空历å²?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "您必须å¯ç”¨ JavaScript æ‰èƒ½ä½¿ç”¨ Plush 模æ¿!" #: sabnzbd/skintext.py msgid "Options" msgstr "选项" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "æš‚åœå¤šå°‘分钟?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "顶部èœå•切æ¢" #: sabnzbd/skintext.py msgid "On Finish" msgstr "å®Œæˆæ—¶" #: sabnzbd/skintext.py msgid "Sort" msgstr "排åº" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "按å‘布时间排列 (最早→最新)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "按å‘布时间排列 (最新→最早)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "按å称排列 (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "按å称排列 (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "按尺寸排列 (最å°→最大)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "按尺寸排列 (最大→最å°)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "清除队列?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "é‡è¯•“历å²è®°å½•â€ä¸­æ‰€æœ‰å·²å¤±è´¥ä»»åŠ¡?" #: sabnzbd/skintext.py msgid "Purge" msgstr "清ç†" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "最高速度" #: sabnzbd/skintext.py msgid "Range" msgstr "范围" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "应用到所选项" #: sabnzbd/skintext.py msgid "Everything" msgstr "全部" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "刷新频率" #: sabnzbd/skintext.py msgid "Container Width" msgstr "容器宽度" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "这将在您的鼠标指针处于队列上方时阻止内容刷新。" #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "æŒ‡å‘æ—¶åœæ­¢åˆ·æ–°" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "上传" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "上传: .nzb .rar .zip .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "进度" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "ç£ç›˜ç©ºé—´ä¸è¶³ä»¥å®Œæˆä¸‹è½½!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "剩余 (临时)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "*空闲*" #: sabnzbd/skintext.py msgid "Downloads" msgstr "下载列表" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "SABnzbd 快速上手å‘导" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "SABnzbd 版本" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "上一步" #: sabnzbd/skintext.py msgid "Server Details" msgstr "æœåŠ¡å™¨è¯¦æƒ…" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "请输入您的主 usenet æä¾›å•†çš„详细信æ¯ã€‚" #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "æä¾›å•†æ‰€å…许的连接数" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "如 8 或 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "仅当您的æœåС商å…许 SSL 连接时选择。" #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "ç‚¹å‡»å¯æµ‹è¯•所输入的信æ¯ã€‚" #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "如" #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "设置完æˆ!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd 将在åŽå°è¿è¡Œã€‚" #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "关闭æµè§ˆå™¨çª—å£/标签页 *ä¸ä¼š* 导致 SABnzbd 关闭。" #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "建议您å³å‡»é¼ æ ‡å¹¶å°†è¯¥é“¾æŽ¥åŠ å…¥ä¹¦ç­¾ä»¥ä¾¿åœ¨ SABnzbd 在åŽå°è¿è¡Œæ—¶è®¿é—®å®ƒã€‚" #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "更详尽的帮助å¯ä»¥åœ¨æˆ‘们的网站上找到" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "转到 SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "退出 SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "å¯åЍå‘导" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd *ä¸è´Ÿä»»ä½•æ‹…ä¿è´£ä»»*。\n" "这是一款自由软件,欢迎您在约定的æ¡ä»¶ä¸‹ä¼ æ’­ã€‚\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] msgid "Error getting TV info (%s)" msgstr "èŽ·å– TV ä¿¡æ¯å‡ºé”™ (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "é‡å‘½å失败: %s 为 %s" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "é‡å‘½å相似文件失败: %s 为 %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "未授æƒè®¿é—®" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "æœåŠ¡å™¨ä¸Šæ— æ­¤æ–‡ä»¶" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "æœåŠ¡å™¨æ— æ³•å®Œæˆè¯·æ±‚" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "*URLGRABBER 已崩溃*" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "ä¸å¯ç”¨çš„ NZB 文件" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "URL 装å–失败; %s" #~ msgid "_yenc module... NOT found!" #~ msgstr "_yenc 模å—... *未* 找到!" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "警告: 由于检测到加密的 RAR 文件,任务 \"%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 "Invalid encoding of email template %s" #~ msgstr "email æ¨¡æ¿ %s ç¼–ç æ— æ•ˆ" #~ msgid "No email templates found" #~ msgstr "未找到 email 模æ¿" #~ msgid "Error: No secondary interface defined." #~ msgstr "错误: 未定义第二界é¢ã€‚" #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "您的 UNRAR 程åºä¸æ˜¯æŽ¨è版本,请从 http://www.rarlab.com/rar_add.htm 获å–
" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "未找到 UNRAR 程åºï¼Œæ‚¨å°†æ— æ³•解压 RAR 文件
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "未找到 PAR2 程åºï¼Œæ‚¨å°†æ— æ³•æ‰§è¡Œä¿®å¤æ“作
" #~ msgid "Initiating restart...
" #~ msgstr "正在åˆå§‹åŒ–é‡å¯åŠ¨ä½œ...
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "任务 \"%s\" å·²è¢«é‡æ–°æ·»åŠ åˆ°é˜Ÿåˆ—" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "标记有 '*' 的任务ä¸ä¼šè‡ªåŠ¨ä¸‹è½½ã€‚" #~ msgid "Not matched" #~ msgstr "未匹é…" #~ msgid "Downloaded so far" #~ msgstr "已下载" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "无法连接到注册表é…ç½®å•å…ƒ HKEY_CURRENT_USER。" #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "无法打开注册表键 \"%s\"。" #~ msgid "Failed to read registry keys for special folders" #~ msgstr "无法读å–特殊文件夹的注册表键" #~ msgid "Try again" #~ msgstr "é‡è¯•" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "缺 pyopenssl 模å—ï¼Œè¯·å®‰è£…è¯¥æ¨¡å—æ–¹å¯é€šè¿‡ https 访问" #~ msgid "Unpacking failed, see log" #~ msgstr "解压失败,å‚è§æ—¥å¿—" #~ msgid "ERROR: %s" #~ msgstr "错误: %s" #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "缺预期文件: %s => unrar 错误?" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "解压失败,有预期文件未能解压" #~ 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 "File %s is empty, skipping" #~ msgstr "文件 %s 为空,正在跳过" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd 与部分软件防ç«å¢™ä¸å…¼å®¹ã€‚
\n" #~ " %s
\n" #~ " 抱歉,我们目å‰è¿˜æ— æ³•解决这个ä¸å…¼å®¹çš„æƒ…况。
\n" #~ " 请咨询您的防ç«å¢™æä¾›å•†ã€‚
\n" #~ "
\n" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd 的内部 web æœåŠ¡å™¨éœ€è¦ä¸€ä¸ªç©ºé—²çš„ tcp/ip 端å£ã€‚
\n" #~ " å·²å°è¯•ç«¯å£ %s(ä½äºŽ %s),但 SABnzbd æ‰€ç”¨è´¦å·æ²¡æœ‰æƒé™ä½¿ç”¨è¯¥ç«¯å£ã€‚
\n" #~ " 在 OSX 与 Linux 系统中,普通用户åªèƒ½ä½¿ç”¨å¤§äºŽ 1023 的端å£ã€‚
\n" #~ "
\n" #~ " 请使用其他端å£å·é‡å¯ SABnzbd。" #~ msgid "OK" #~ msgstr "确定" #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "您似乎处于 Vista å¹³å°å¹¶ä¸”使用了 ZoneAlarm。
" #~ msgid "You have no permisson to use port %s" #~ msgstr "您没有æƒé™ä½¿ç”¨ç«¯å£ %s" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "æ— æ³•ä»ŽåŽæœŸå¤„ç†é˜Ÿåˆ—移除 nzo (id)" #~ msgid "No post-processing because of failed verification" #~ msgstr "由于验è¯å¤±è´¥ï¼Œæœªè¿›è¡ŒåŽæœŸå¤„ç†" #~ msgid "View script output" #~ msgstr "查看脚本输出" #~ msgid "Error removing workdir (%s)" #~ msgstr "移除工作目录出错 (%s)" #~ msgid "Get NZB" #~ msgstr "èŽ·å– NZB" #~ msgid "KB/s" #~ msgstr "KB/s" #~ msgid "Queued" #~ msgstr "在队列中" #~ msgid "Complete Dir" #~ msgstr "完æˆç›®å½•" #~ msgid "Download speed" #~ msgstr "下载速度" #~ msgid "Add new downloads" #~ msgstr "新增下载" #~ msgid " " #~ msgstr " " #~ msgid " or Report ID" #~ msgstr " æˆ–报告 ID" #~ msgid "Sort by name" #~ msgstr "按å称排列" #~ msgid "Sort by age" #~ msgstr "按å‘布时间排列" #~ msgid "Sort by size" #~ msgstr "按尺寸排列" #~ msgid "Hide files" #~ msgstr "éšè—文件列表" #~ msgid "Show files" #~ msgstr "显示文件列表" #~ msgid "Remain/Total" #~ msgstr "剩余/总计" #~ msgid "Purge Failed History" #~ msgstr "清除失败历å²" #~ msgid "Delete all failed items from History?" #~ msgstr "从“历å²â€ä¸­åˆ é™¤æ‰€æœ‰å¤±è´¥é¡¹?" #~ msgid "History Size" #~ msgstr "历å²å°ºå¯¸" #~ msgid "Show Weblogging" #~ msgstr "显示 web 日志" #~ msgid "Thread" #~ msgstr "线程" #~ msgid "Email Test Result" #~ msgstr "电å­é‚®ä»¶æµ‹è¯•结果" #~ msgid "General configuration" #~ msgstr "常规é…ç½®" #~ msgid "Secondary Web Interface" #~ msgstr "第二 Web 界é¢" #~ msgid "Activate an alternative skin." #~ msgstr "激活备选皮肤。" #~ msgid "Web server authentication" #~ msgstr "Web æœåŠ¡å™¨èº«ä»½éªŒè¯" #~ msgid "HTTPS Support" #~ msgstr "HTTPS 支æŒ" #~ msgid "Queue auto refresh interval:" #~ msgstr "队列自动刷新间隔:" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "队列 web 界é¢é¡µé¢çš„刷新间隔 (秒,0 = ä¸åˆ·æ–°)。" #~ msgid "Disable API-key" #~ msgstr "ç¦ç”¨ API-key" #~ msgid "Do not require the API key." #~ msgstr "ä¸è¦æ±‚æä¾› API key。" #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "*åŽæžœè‡ªè´Ÿ!*" #~ msgid "QR Code" #~ msgstr "QR ç " #~ msgid "Folder configuration" #~ msgstr "文件夹é…ç½®" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "åŽæœŸå¤„ç†è„šæœ¬æ–‡ä»¶å¤¹" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "包å«åŽæœŸå¤„ç†ç”¨æˆ·è„šæœ¬çš„æ–‡ä»¶å¤¹ã€‚" #~ msgid "Switches configuration" #~ msgstr "傿•°é…ç½®" #~ msgid "Processing Switches" #~ msgstr "处ç†å‚æ•°" #~ msgid "Enable Quick Check" #~ msgstr "å¯ç”¨å¿«é€Ÿæ£€æŸ¥" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "文件 100% 完好时跳过 par2 检查。" #~ msgid "Enable Unrar" #~ msgstr "å¯ç”¨ Unrar" #~ msgid "Enable built-in unrar functionality." #~ msgstr "å¯ç”¨å†…ç½® unrar 功能。" #~ msgid "Enable built-in unzip functionality." #~ msgstr "å¯ç”¨å†…ç½® unzip 功能。" #~ msgid "Enable Filejoin" #~ msgstr "å¯ç”¨æ–‡ä»¶åˆå¹¶" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "å°† .001ã€.002 等结尾的文件åˆå¹¶ä¸ºä¸€ä¸ªæ–‡ä»¶ã€‚" #~ msgid "Enable TS Joining" #~ msgstr "å¯ç”¨ TS åˆå¹¶" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "å°† .001.tsã€.002.ts 等结尾的文件åˆå¹¶ä¸ºä¸€ä¸ªæ–‡ä»¶ã€‚" #~ msgid "Enable Par Cleanup" #~ msgstr "å¯ç”¨ Par 清ç†" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "æ¸…ç† par 文件 (若验è¯/ä¿®å¤æˆåŠŸ)。" #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "yEnc CRC 错误时é‡è¯•" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "文章存在 CRC 错误时,å°è¯•从其他æœåŠ¡å™¨èŽ·å–。" #~ msgid "Check result of unpacking" #~ msgstr "检查解压结果" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "检查解压结果 (部分文件系统需è¦å…³é—­)。" #~ msgid "Default Post-Processing" #~ msgstr "é»˜è®¤åŽæœŸå¤„ç†" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "å½“åˆ†ç±»æœªå®šä¹‰åŽæœŸå¤„ç†é€‰é¡¹æ—¶ä½¿ç”¨ã€‚" #~ msgid "Default User Script" #~ msgstr "默认用户脚本" #~ msgid "Used when no user script is defined by the category." #~ msgstr "当分类未定义用户脚本时使用。" #~ msgid "Default Priority" #~ msgstr "默认优先级" #~ msgid "Used when no priority is defined by the category." #~ msgstr "当分类未定义优先级时使用。" #~ msgid "Enable MultiCore Par2" #~ msgstr "å¯ç”¨å¤šæ ¸ Par2" #~ msgid "Other Switches" #~ msgstr "其他傿•°" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "æ›¿æ¢æˆæ–‡ä»¶å¤¹åç§°ä¸­çš„éžæ³•字符" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "将文件夹åç§°ä¸­çš„éžæ³•字符替æ¢ä¸ºç­‰ä»·å­—符 (ä¸é€‰åˆ™ç›´æŽ¥ç§»é™¤)。" #~ msgid "Do not download" #~ msgstr "ä¸è¦ä¸‹è½½" #~ msgid "SSL type" #~ msgstr "SSL 类型" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "é™¤éžæ‚¨çš„æä¾›å•†è¦æ±‚选择其他类型,请使用 V23!" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "使用 12 å°æ—¶åˆ¶æ—¶é’Ÿ (AM/PM)" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "以 AM/PM 记法显示时间 (ä¸å½±å“定时任务)。" #~ msgid "Only for optional servers" #~ msgstr "仅应用到å¯é€‰æœåС噍" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "åªå¯¹å¯é€‰æœåŠ¡å™¨åº”ç”¨æœ€å¤šé‡è¯•次数é™åˆ¶" #~ msgid "Server configuration" #~ msgstr "æœåС噍é…ç½®" #~ msgid "Server definition" #~ msgstr "æœåŠ¡å™¨å®šä¹‰" #~ msgid "Backup server" #~ msgstr "备份æœåС噍" #~ msgid "Click below to test." #~ msgstr "点击下é¢çš„æŒ‰é’®å¼€å§‹æµ‹è¯•。" #~ msgid "Scheduling configuration" #~ msgstr "定时任务é…ç½®" #~ msgid "Remove" #~ msgstr "移除" #~ msgid "RSS Configuration" #~ msgstr "RSS é…ç½®" #~ msgid "New Feed URL" #~ msgstr "æ–° Feed URL" #~ msgid "Add Feed" #~ msgstr "添加 Feed" #~ msgid "Delete Feed" #~ msgstr "删除 Feed" #~ msgid "Skip" #~ msgstr "跳过" #~ msgid "Feeds" #~ msgstr "Feed 列表" #~ msgid "Settings" #~ msgstr "设置" #~ msgid "Filters" #~ msgstr "过滤器" #~ msgid "Email Options" #~ msgstr "Email 选项" #~ msgid "Email Account Settings" #~ msgstr "Email è´¦å·è®¾ç½®" #~ msgid "Send notifications to Growl" #~ msgstr "将通知å‘é€åˆ° Growl" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "将通知å‘é€åˆ° NotifyOSD" #~ msgid "User-defined categories" #~ msgstr "用户定义的分类" #~ msgid "Defines post-processing and storage." #~ msgstr "å®šä¹‰åŽæœŸå¤„ç†åŠå­˜å‚¨è¡Œä¸ºã€‚" #~ msgid "Groups / Indexer tags" #~ msgstr "群组 / 索引标记" #~ msgid "Sorting configuration" #~ msgstr "排åºé…ç½®" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "å¯ç”¨æŽ’åºåŠå‰§é›†é‡å‘½å。" #~ msgid "Generic Sorting" #~ msgstr "通用排åº" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "å¯ç”¨é€šç”¨æŽ’åºåŠæ–‡ä»¶é‡å‘½å。" #~ 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 "å¯ç”¨æŒ‰æ—¥æœŸå‘½å的文件的排åºä¸Žé‡å‘½å。" #~ msgid "Are you sure you want to delete" #~ msgstr "是å¦ç¡®å®šè¦åˆ é™¤" #~ msgid "Page" #~ msgstr "页é¢" #~ msgid "First" #~ msgstr "首" #~ msgid "Last" #~ msgstr "末" #~ msgid "Close" #~ msgstr "关闭" #~ msgid "Set Pause Interval" #~ msgstr "设置暂åœé—´éš”" #~ msgid "Pause Interval" #~ msgstr "æš‚åœé—´éš”" #~ msgid "Pause for 12 hours" #~ msgstr "æš‚åœ 12 å°æ—¶" #~ msgid "Pause for 24 hours" #~ msgstr "æš‚åœ 24 å°æ—¶" #~ msgid "Left" #~ msgstr "剩余" #~ msgid "Open Source URL" #~ msgstr "æ‰“å¼€æ¥æº URL" #~ msgid "Storage" #~ msgstr "存储" #~ msgid "Plush Options" #~ msgstr "Plush 选项" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "上传: .nzb .rar .zip .gz" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "è¯»å– Feed 将获å–å½“å‰ feed 内容。强制下载 将立å³ä¸‹è½½å…¨éƒ¨åŒ¹é…çš„ NZB。" #~ msgid "Hour:Min" #~ msgstr "å°æ—¶:分钟" #~ msgid "Delete Completed" #~ msgstr "删除完æˆé¡¹" #~ msgid "Delete the all failed items from the history?" #~ msgstr "从历å²ä¸­åˆ é™¤æ‰€æœ‰å¤±è´¥é¡¹?" #~ msgid "Delete Failed" #~ msgstr "删除失败项" #~ msgid "Links" #~ msgstr "链接" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "正显示第 %s ~ %s 项结果,共 %s 项" #~ msgid "No results" #~ msgstr "无结果" #~ msgid "Showing one result" #~ msgstr "正显示一项结果" #~ msgid "Email Sent!" #~ msgstr "邮件已å‘é€!" #~ msgid "Saved" #~ msgstr "å·²ä¿å­˜" #~ msgid "Toggle Add NZB" #~ msgstr "åˆ‡æ¢æ–°å¢ž NZB" #~ msgid "DualView1" #~ msgstr "åŒè§†å›¾1" #~ msgid "DualView2" #~ msgstr "åŒè§†å›¾2" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "是å¦ç¡®å®šè¦é‡æ–°å¯åЍ SABnzbd?" #~ msgid "Hide Edit Options" #~ msgstr "éšè—编辑选项" #~ msgid "Show Edit Options" #~ msgstr "显示编辑选项" #~ msgid "Edit" #~ msgstr "编辑" #~ msgid "Timeleft" #~ msgstr "剩余时间" #~ msgid "Access" #~ msgstr "访问" #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "我希望 SABnzbd 在所处网络的任æ„电脑中å¯è§ã€‚" #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "我希望 SABnzbd åªèƒ½åœ¨æˆ‘自己的电脑中å¯è§ã€‚" #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "SABnzbd 访问密ç ä¿æŠ¤ (推è)" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "å¯ç”¨ SABnzbd çš„ HTTPS 访问。" #~ msgid "Misc" #~ msgstr "æ‚项" #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "程åºå¯åŠ¨æ—¶å¯åŠ¨äº’è”网æµè§ˆå™¨æ‰“å¼€ SABnzbd 页é¢ã€‚" #~ msgid "This field is required." #~ msgstr "该字段必填。" #~ msgid "Please enter a whole number." #~ msgstr "请输入整数。" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "SABnzbd 完æˆé‡å¯åŽæ‚¨å¯ä»¥åœ¨ä¸‹é¢çš„ä½ç½®è®¿é—®å®ƒ: %s" #~ msgid "Step One" #~ msgstr "第一步" #~ msgid "Step Two" #~ msgstr "第二步" #~ msgid "Step Three" #~ msgstr "第三步" #~ msgid "Step Four" #~ msgstr "第四步" #~ msgid "Step Five" #~ msgstr "第五步" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "如 SSL 连接用 119 或 563" #~ msgid "WARNINGS" #~ msgstr "警告信æ¯" #~ msgid "Notification classes" #~ msgstr "通知分组" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "å¯ç”¨è¦æŠ¥å‘Šçš„æ¶ˆæ¯åˆ†ç»„ (æ— ã€ä¸€æˆ–多个)" #~ msgid "Send notifications to Notification Center" #~ msgstr "将通知å‘é€åˆ°â€œé€šçŸ¥ä¸­å¿ƒâ€" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "*警告*: 已中止任务 \"%s\",因为å‘现了加密的 RAR 文件" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "该 key å‘索引器标明身份。å‚è§ https://www.oznzb.com/profile 。" #~ msgid "Automatic Feedback" #~ msgstr "自动å馈" #~ msgid "Site API Key" #~ msgstr "网站 API Key" #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "连接到 OZnzb ç´¢å¼•å™¨å¯æä¾›å¢žå¼ºåŠŸèƒ½ï¼ŒåŒ…æ‹¬è¯„åˆ†ä¸Žé¢å¤–的状æ€ä¿¡æ¯ã€‚" #~ msgid "Enable OZnzb Integration" #~ msgstr "å¯ç”¨ OZnzb æ•´åˆ" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "自动将已下载文件计算完æˆçš„验è¯ç»“æžœå‘é€åˆ°ç´¢å¼•器。" #~ msgid "Refer to https://www.oznzb.com/profile" #~ msgstr "å‚è§ https://www.oznzb.com/profile" #~ msgid "OZnzb" #~ msgstr "OZnzb" sabnzbd-develop/po/main/SABnzbd.pot0000600000175000017500000027055013642116632015317 0ustar jpjp# # SABnzbd Translation Template file MAIN # Copyright 2011-2019 The SABnzbd-Team # team@sabnzbd.org # msgid "" msgstr "" "Project-Id-Version: SABnzbd-3.0.0-develop\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: shypike@sabnzbd.org\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 7bit\n" "POT-Creation-Date: 2020-02-26 13:46+0100\n" "Generated-By: pygettext.py 1.5\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "" #: SABnzbd.py [Error message] msgid "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" #: SABnzbd.py [Error message] msgid "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "" #: SABnzbd.py [Error message] msgid "MultiPar binary... NOT found!" msgstr "" #: SABnzbd.py [Error message] msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py [Warning message] msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external access" msgstr "" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "" #: SABnzbd.py [Warning message] msgid "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems with Unicoded file and directory names in downloads." msgstr "" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "" #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "" #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "" #: sabnzbd/api.py msgid " Resolving address" 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 "" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "" #: sabnzbd/api.py msgid "unknown" msgstr "" #: sabnzbd/api.py [Error message] msgid "Failed to compile regex for search term: %s" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Too little diskspace forcing PAUSE" msgstr "" #: sabnzbd/assembler.py [Error message] msgid "Disk full! Forcing Pause" msgstr "" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "" #: sabnzbd/assembler.py msgid "%s missing" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "" #: sabnzbd/assembler.py msgid "audio" msgstr "" #: sabnzbd/assembler.py msgid "spam" msgstr "" #: sabnzbd/assembler.py msgid "passworded" msgstr "" #: sabnzbd/assembler.py msgid "downvoted" msgstr "" #: sabnzbd/assembler.py msgid "keywords" msgstr "" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "" #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "" #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "" #: sabnzbd/decoder.py msgid "UUencode detected, only yEnc encoding is supported [%s]" msgstr "" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message] msgid "Cannot read %s" msgstr "" #: sabnzbd/dirscanner.py [Error message] msgid "Error while adding %s, removing" msgstr "" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "" #: sabnzbd/downloader.py msgid "Resuming" msgstr "" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "" #: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/rating.py msgid "Cannot send, missing required data" msgstr "" #: sabnzbd/emailer.py [Error message] msgid "Cannot find email templates in %s" msgstr "" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "" #: sabnzbd/interface.py msgid "API Key missing, please enter the api key from Config->General into your 3rd party program:" msgstr "" #: sabnzbd/interface.py msgid "API Key incorrect, Use the api key from Config->General in your 3rd party program:" msgstr "" #: sabnzbd/interface.py msgid "Authentication missing, please enter username/password from Config->General into your 3rd party program:" msgstr "" #: sabnzbd/interface.py [Warning message] msgid "Try our new skin Glitter! Fresh new design that is optimized for desktop and mobile devices. Go to Config -> General to change your skin." msgstr "" #: sabnzbd/interface.py # sabnzbd/newswrapper.py # sabnzbd/utils/servertests.py msgid "Authentication failed, check username/password." msgstr "" #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "" #: sabnzbd/interface.py msgid " 
SABnzbd shutdown finished.
Wait for about 5 second and then click the button below.

Refresh
" msgstr "" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "" #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "" #: sabnzbd/interface.py msgid "Daily" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "" #: 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 msgid "Back" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "" #: sabnzbd/misc.py msgid "d" msgstr "" #: sabnzbd/misc.py msgid "h" msgstr "" #: sabnzbd/misc.py msgid "m" msgstr "" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "" #: sabnzbd/newsunpack.py msgid "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "" #: sabnzbd/newsunpack.py msgid "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "" #: sabnzbd/newsunpack.py msgid "Repair failed, not enough repair blocks (%s short)" msgstr "" #: sabnzbd/newsunpack.py msgid "Repairing" msgstr "" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate hostname mismatch: the server hostname is not listed in the certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "" #: sabnzbd/notifier.py msgid "Failed to send macOS notification" msgstr "" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "" #: sabnzbd/osxmenu.py msgid "min." msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "" #: sabnzbd/panic.py msgid "Problem with" msgstr "" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" #: sabnzbd/panic.py msgid "If you get this error message again, please try a different number.
" msgstr "" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain to your virus-scanner vendor.
\n" "
\n" msgstr "" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "" #: sabnzbd/panic.py msgid "Unable to bind to port %s on %s. Some other software uses the port or SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "" #: sabnzbd/panic.py msgid "Access denied" msgstr "" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "" #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "" #: sabnzbd/postproc.py [Warning message] msgid "Completed Download Folder %s is on FAT file system, limiting maximum file size to 4GB" msgstr "" #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "" #: sabnzbd/postproc.py msgid "Moving" msgstr "" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "" #: sabnzbd/postproc.py msgid "Download Completed" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "" #: sabnzbd/rating.py msgid "Server address" msgstr "" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "This key provides identity to indexer. Check your profile on the indexer's website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "" #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "" #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "" #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "" #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "" #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "" #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "" #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "" #: sabnzbd/skintext.py msgid "day" msgstr "" #: sabnzbd/skintext.py msgid "days" msgstr "" #: sabnzbd/skintext.py msgid "week" msgstr "" #: sabnzbd/skintext.py msgid "Month" msgstr "" #: sabnzbd/skintext.py msgid "Year" msgstr "" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "" #: sabnzbd/skintext.py msgid "This week" msgstr "" #: sabnzbd/skintext.py msgid "This month" msgstr "" #: sabnzbd/skintext.py msgid "Today" msgstr "" #: sabnzbd/skintext.py msgid "Total" msgstr "" #: sabnzbd/skintext.py msgid "on" msgstr "" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "" #: sabnzbd/skintext.py msgid "Python Version" msgstr "" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "" #: sabnzbd/skintext.py msgid "Comment" msgstr "" #: sabnzbd/skintext.py msgid "Send" msgstr "" #: sabnzbd/skintext.py msgid "Cancel" msgstr "" #: sabnzbd/skintext.py msgid "Other" msgstr "" #: sabnzbd/skintext.py msgid "Report" msgstr "" #: sabnzbd/skintext.py msgid "Video" msgstr "" #: sabnzbd/skintext.py msgid "Audio" msgstr "" #: sabnzbd/skintext.py msgid "Not used" msgstr "" #: sabnzbd/skintext.py msgid "or less" msgstr "" #: sabnzbd/skintext.py msgid "Log in" msgstr "" #: sabnzbd/skintext.py msgid "Log out" msgstr "" #: sabnzbd/skintext.py msgid "Remember me" msgstr "" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "" #: sabnzbd/skintext.py msgid "Saving.." msgstr "" #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "" #: sabnzbd/skintext.py msgid "Sysload" msgstr "" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "" #: sabnzbd/skintext.py msgid "Other problem" msgstr "" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "" #: sabnzbd/skintext.py [Status page button text] msgid "Disconnect all active connections to usenet servers. Connections will be reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "" #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "" #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "Adds a verified test NZB of the specified size, filled with random data. Can be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "" #: sabnzbd/skintext.py msgid "This will restart SABnzbd.
Use it when you think the program has a stability problem.
Downloading will be paused before the restart and resume afterwards." msgstr "" #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "There are orphaned jobs in the download folder.
You can choose to delete them (including files) or send them back to the queue." msgstr "" #: sabnzbd/skintext.py msgid "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded files.
This will modify the queue order." msgstr "" #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "" #: sabnzbd/skintext.py msgid "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will be encrypted, however, validating a server's identity using its certificates is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates are required." msgstr "" #: sabnzbd/skintext.py msgid "Speed up repairs by installing multicore Par2, it is available for many platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "" #: sabnzbd/skintext.py msgid "Uptime" msgstr "" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "" #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "" #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "" #: sabnzbd/skintext.py msgid "Web Interface" msgstr "" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "" #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "" #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "" #: sabnzbd/skintext.py msgid "not installed" msgstr "" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "" #: sabnzbd/skintext.py msgid "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "" #: sabnzbd/skintext.py msgid "Tuning" msgstr "" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "" #: sabnzbd/skintext.py msgid "Checking interval (in minutes, at least 15). Not active when you use the Scheduler!" msgstr "" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "" #: sabnzbd/skintext.py msgid "Cache articles in memory to reduce disk access.
In bytes, optionally follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "" #: sabnzbd/skintext.py msgid "List of file extensions that should be deleted after download.
For example: nfo or nfo, sfv" msgstr "" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "Automatically delete completed jobs from History. Beware that Duplicate Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "" #: sabnzbd/skintext.py msgid "Reset" msgstr "" #: sabnzbd/skintext.py msgid "Language" msgstr "" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "" #: sabnzbd/skintext.py msgid "Help us translate SABnzbd in your language!
Add untranslated texts or improved existing translations here:" msgstr "" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "" #: sabnzbd/skintext.py msgid "NZB Key" msgstr "" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "" #: sabnzbd/skintext.py msgid "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" #: sabnzbd/skintext.py msgid "External internet access" msgstr "" #: sabnzbd/skintext.py msgid "You can set access rights for systems outside your local network. Requires List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "" #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "" #: sabnzbd/skintext.py msgid "Full API" msgstr "" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "" #: sabnzbd/skintext.py msgid "NOTE: Folders will be created automatically when Saving. You may use absolute paths to save outside of the default folders." msgstr "" #: sabnzbd/skintext.py msgid "User Folders" msgstr "" #: sabnzbd/skintext.py msgid "Browse" msgstr "" #: sabnzbd/skintext.py msgid "In" msgstr "" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "" #: sabnzbd/skintext.py msgid "Location to store unprocessed downloads.
Can only be changed when queue is empty." msgstr "" #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "" #: sabnzbd/skintext.py msgid "Auto-pause when free space is beneath this value.
In bytes, optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "" #: sabnzbd/skintext.py msgid "Location to store finished, fully processed downloads.
Can be overruled by user-defined categories." msgstr "" #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "" #: sabnzbd/skintext.py msgid "Set permissions pattern for completed files/folders.
In octal notation. For example: \"755\" or \"777\"" msgstr "" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz archives for .nzb files." msgstr "" #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "" #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "" #: sabnzbd/skintext.py msgid "Password file" msgstr "" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" #: sabnzbd/skintext.py msgid "System Folders" msgstr "" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "" #: sabnzbd/skintext.py msgid "Location for queue admin and history database.
Can only be changed when queue is empty." msgstr "" #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "" #: sabnzbd/skintext.py msgid "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "" #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "" #: sabnzbd/skintext.py msgid "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "" #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "" #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "" #: sabnzbd/skintext.py msgid "Enable for less memory usage. Disable to prevent slow jobs from blocking the queue." msgstr "" #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "" #: sabnzbd/skintext.py msgid "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "" #: sabnzbd/skintext.py msgid "Detect identical NZB files (based on items in your History or files in .nzb Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "" #: sabnzbd/skintext.py msgid "List all unwanted extensions. For example: exe or exe, com" msgstr "" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "" #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "" #: sabnzbd/skintext.py msgid "When the user script returns a non-zero exit code, the job will be flagged as failed." msgstr "" #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "When sorting, use tags from indexer for title, season, episode, etc. Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "" #: sabnzbd/skintext.py 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" msgstr "" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "" #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "" #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "" #: sabnzbd/skintext.py msgid "Posts will be paused untill they are at least this age. Setting job priority to Force will skip the delay." msgstr "" #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "" #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "" #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "" #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "" #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "" #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "" #: sabnzbd/skintext.py msgid "Pauses downloading at the start of post processing and resumes when finished." msgstr "" #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "" #: sabnzbd/skintext.py msgid "Delete after download" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" #: sabnzbd/skintext.py msgid "Server" msgstr "" #: sabnzbd/skintext.py msgid "Post processing" msgstr "" #: sabnzbd/skintext.py msgid "Naming" msgstr "" #: sabnzbd/skintext.py msgid "Quota" msgstr "" #: sabnzbd/skintext.py msgid "Indexing" msgstr "" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "" #: sabnzbd/skintext.py msgid "On which day of the month or week (1=Monday) does your ISP reset the quota? (Optionally with hh:mm)" msgstr "" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "" #: sabnzbd/skintext.py msgid "Check before download" msgstr "" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "" #: sabnzbd/skintext.py msgid "When during download it becomes clear that too much data is missing, abort the job" msgstr "" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "" #: sabnzbd/skintext.py msgid "Abort If" msgstr "" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "" #: sabnzbd/skintext.py msgid "Video rating" msgstr "" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "" #: sabnzbd/skintext.py msgid "Spam" msgstr "" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "Minimal: when SSL is enabled, verify the identity of the server using its certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "" #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Send Group" msgstr "" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "" #: sabnzbd/skintext.py msgid "Personal notes" msgstr "" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "" #: sabnzbd/skintext.py msgid "The checkbox next to the feed name should be ticked for the feed to be enabled and be automatically checked for new items.
When a feed is added, it will only pick up new items and not anything already in the RSS feed unless you press \"Force Download\"." msgstr "" #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "" #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "" #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "" #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "" #: sabnzbd/skintext.py msgid "Email Sender" msgstr "" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "" #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "" #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "" #: sabnzbd/skintext.py [Pushover settings] 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 "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "" #: sabnzbd/skintext.py msgid "Indexers can supply a category inside the NZB which SABnzbd will try to match to the categories defined below. Additionally, you can add terms to \"Indexer Categories / Groups\" to match more categories. Use commas to separate terms. Wildcards in the terms are supported.
More information can be found on the Wiki." msgstr "" #: sabnzbd/skintext.py msgid "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "" #: sabnzbd/skintext.py msgid "Clear" msgstr "" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "" #: sabnzbd/skintext.py msgid "Example" msgstr "" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "" #: sabnzbd/skintext.py msgid "Meaning" msgstr "" #: sabnzbd/skintext.py msgid "Pattern" msgstr "" #: sabnzbd/skintext.py msgid "Result" msgstr "" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "" #: sabnzbd/skintext.py msgid "Title" msgstr "" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "" #: sabnzbd/skintext.py msgid "Show Name" msgstr "" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "" #: sabnzbd/skintext.py msgid "Season Number" msgstr "" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "" #: sabnzbd/skintext.py msgid "File Extension" msgstr "" #: sabnzbd/skintext.py msgid "Extension" msgstr "" #: sabnzbd/skintext.py msgid "Part Number" msgstr "" #: sabnzbd/skintext.py msgid "Decade" msgstr "" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "" #: sabnzbd/skintext.py msgid "TEXT" msgstr "" #: sabnzbd/skintext.py msgid "text" msgstr "" #: sabnzbd/skintext.py msgid "file" msgstr "" #: sabnzbd/skintext.py msgid "Sort String" msgstr "" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "" #: sabnzbd/skintext.py msgid "In folders" msgstr "" #: sabnzbd/skintext.py msgid "No folders" msgstr "" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "" #: sabnzbd/skintext.py msgid "Rarely used options. For their meaning and explanation, click on the Help button to go to the Wiki page.
Don't change these without checking the Wiki first, as some have serious side-effects.
The default values are between parentheses." msgstr "" #: sabnzbd/skintext.py msgid "Values" msgstr "" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "" #: sabnzbd/skintext.py msgid "left" msgstr "" #: sabnzbd/skintext.py msgid "Free Space" msgstr "" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "" #: sabnzbd/skintext.py msgid "Check all" msgstr "" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "" #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "" #: sabnzbd/skintext.py msgid "History item limit" msgstr "" #: sabnzbd/skintext.py msgid "Date format" msgstr "" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "" #: sabnzbd/skintext.py msgid "page" msgstr "" #: sabnzbd/skintext.py msgid "Loading" msgstr "" #: sabnzbd/skintext.py msgid "articles" msgstr "" #: sabnzbd/skintext.py msgid "Rename" msgstr "" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "" #: sabnzbd/skintext.py msgid "Delete All" msgstr "" #: sabnzbd/skintext.py msgid "Retry all" msgstr "" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "" #: sabnzbd/skintext.py msgid "Submit" msgstr "" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "LocalStorage (cookies) are disabled in your browser, interface settings will be lost after you close the browser!" msgstr "" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" #: sabnzbd/skintext.py msgid "Custom" msgstr "" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "" #: sabnzbd/skintext.py msgid "Speed" msgstr "" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "" #: sabnzbd/skintext.py msgid "Pause for..." msgstr "" #: 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 Oldest→Newest" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "" #: sabnzbd/skintext.py msgid "Uploading" msgstr "" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "" #: sabnzbd/skintext.py msgid "Removing job" msgstr "" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "" #: sabnzbd/skintext.py msgid "Prev" msgstr "" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "" #: sabnzbd/skintext.py msgid "Options" msgstr "" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "" #: sabnzbd/skintext.py msgid "On Finish" msgstr "" #: sabnzbd/skintext.py msgid "Sort" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "" #: sabnzbd/skintext.py msgid "Purge" msgstr "" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "" #: sabnzbd/skintext.py msgid "Range" msgstr "" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "" #: sabnzbd/skintext.py msgid "Everything" msgstr "" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "" #: sabnzbd/skintext.py msgid "Container Width" msgstr "" #: sabnzbd/skintext.py msgid "This will prevent refreshing content when your mouse cursor is hovering over the queue." msgstr "" #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "" #: sabnzbd/skintext.py msgid "Progress" msgstr "" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "" #: sabnzbd/skintext.py msgid "IDLE" msgstr "" #: sabnzbd/skintext.py msgid "Downloads" msgstr "" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "" #: sabnzbd/skintext.py msgid "Server Details" msgstr "" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "" #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "" #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "" #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "" #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "" #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "" #: sabnzbd/skintext.py [Wizard tip] msgid "It is recommended you right click and bookmark this location and use this bookmark to access SABnzbd when it is running in the background." msgstr "" #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your option) any later version.\n" 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." msgstr "" #: sabnzbd/skintext.py msgid "Don't have a usenet provider? We recommend trying %s." msgstr "" #: sabnzbd/sorting.py [Error message] msgid "Error getting TV info (%s)" msgstr "" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "" #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "" #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "" #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "" #: sabnzbd/utils/servertests.py msgid "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "" #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "" #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "" #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "" #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "" sabnzbd-develop/po/main/es.po0000600000175000017500000043676613642116632014274 0ustar jpjp# Spanish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2018-02-14 14:18+0000\n" "Last-Translator: Safihre \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:03+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Error al iniciar la interfaz web" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "" "No se puede encontrar la plantilla web: %s, intentando con la plantilla " "estandar" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "par2 binario... NO encontrado!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "Su versión UnRAR es %s, recomendamos la versión %s o superior.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "unrar binario... NO encontrado" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "unzip binario... NO encontrado!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "No se encontró el binario de 7za" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Tenga en cuenta que el nombre de equipo 0.0.0.0 necesitará una dirección " "IPv6 para el acceso externo" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "Los puertos de HTTP y de HTTPS no pueden ser iguales" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "HTTPS deshabilitado debido a la falta de archivos CERT y KEY" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Error al iniciar la interfaz web: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "No se ha podido conectar con el servicio SABHelper" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s comenzó" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Advertencia" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Se ha producido un error" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "Cierre de SABnzbd terminado" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "El hostname no está definido." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "No se han configurado conexiones. Configure al menos una conexión." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Contraseña protejido por ******, favor reingresar" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Detalles de servidor invalidos" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "Tiempo agotado: Trate conectar en puerto diferente o encender SSL." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Tiempo agotado" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Dirección del servidor no válida." #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "El servidor se ha cerrado durante el login" #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "El servidor necesita usuario y contraseña." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "¡Conexión exitosa!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Autenticación fallida, compruebe el usuario o la contraseña." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "Demasiadas conexiones; pause las descargas o inténtelo de nuevo más tarde" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "No se pudo determinar el resultado de la conexión (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Señal %s capturado, guardando y saliendo..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Error grave al guardar estado" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Tratando de buscar NZB de %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Guardar de %s no se pudo completar." #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "No se puede crear el archivo temporal para %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Intentando cambiar el estado de servidor inexistente %s" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Fallo en tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Cargar de %s no se pudo completar." #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "Email exitoso" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Notificación de prueba" #: sabnzbd/api.py msgid " Resolving address" msgstr " Resolviendo sitio" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Predeterminado" #: sabnzbd/api.py msgid "unknown" msgstr "desconocido" #: sabnzbd/api.py [Error message] 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" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Error de disco al crear el archivo %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Error grave en el ensamblador" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Abortado, detectamos cifrados" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "ADVERTENCIA: Se ha encontrado una extensión no deseada en el fichero RAR " "\"%s\". El fichero no deseado es %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "Se ha encontrado una extensión desconocida en el fichero rar %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Se interrumpió la acción porque se detectó una extensión no deseada" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "" "ADVERTENCIA: Se ha pausado el trabajo \"%s\" debido a su puntuación (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "" "ADVERTENCIA: Se ha abortado el trabajo \"%s\" debido a su puntuación (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Abortado, se ha encontrado un filtro de calificación (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "Falta %s" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "vídeo" #: sabnzbd/assembler.py msgid "audio" msgstr "audio" #: sabnzbd/assembler.py msgid "spam" msgstr "correo basura" #: sabnzbd/assembler.py msgid "passworded" msgstr "protegidos por contraseña" #: sabnzbd/assembler.py msgid "downvoted" msgstr "votados negativamente" #: sabnzbd/assembler.py msgid "keywords" msgstr "palabras clave" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Quota gastado, pausando cola" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s no es una dirección de correo electrónico válida." #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Se necesita la dirección del servidor" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "No se puede crear %s la carpeta %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "No se puede escribir al archivo INI %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "No se puede crear copia de seguridad del archivo %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Contraseña incorrectamente codificado %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s no es un valor octal correcto" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "Ruta de acceso UNC \"%s\" no permitido aqui" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Error: La longitud de ruta debería ser menor que %s." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Error: Cola no esta vacía, no se puede cambiar el directorio" #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" "No se puede escribir en la base de datos de historia, compruebe los derechos " "de acceso !" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "" "La base de datos del Historial está dañada, se ha reemplazado vaciándola" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "Comando 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" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Registro de etapa invalido para transferencia terminada %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Descodificación %s fallo" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Articulo yEnc corrupto en %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Error inespecifico mientras descodificando %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => faltando de todos servidores, desechando" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Completado" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "Descompresos %s archivos/directorios en %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [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] msgid "Error while adding %s, removing" msgstr "Error al añadir %s, eliminando" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Error al quitar %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Directorio Watched %s no se puede leer" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Reanudando" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "En pausa" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Debe establecer un ancho de banda máximo antes de poder establecer un límite " "de ancho de banda" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Error en inicio de conexion a servidor %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "No se puede resolver el nombre de servidor" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "El servidor %s se ignorará por %s minutos" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Error al inicializar %s@%s con la razón: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "Demasiadas conexiones con el servidor %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Compartiendo de cuenta probable" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Registraccion fallo para servidor %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Ha fallado la conexión a %s@%s, el mensaje=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "El servidor %s requiere usuario/contraseña" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Error sospechoso en downloader" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Apagando" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "No se pudo conectar al servidor de correo" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "No se pudo inicializar la conexión TLS" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "El servidor no respondió adecuadamente al saludo helo" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "No se pudo autenticar con el servidor de correo" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "No se ha encontrado ningún método de autenticación adecuado" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "" "Se produjo un fallo de autenticación desconocido en el servidor de correo" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "No se pudo enviar correo electrónico" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "No se pudo cerrar la conexión de correo" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Sin destinatarios no se pudo enviar el email" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "Para: %s\n" "De: %s\n" "Fecha: %s\n" "Asunto: SABnzbd informa de un disco lleno\n" "\n" "Hola:\n" "\n" "SABnzbd ha detenido las descargas porque casi se ha llenado el disco.\n" "Haga algo de espacio y reanude SABnzbd manualmente.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "No se pudo crear el directorio %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "Directorio %s: Error al acceder a %s" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "No se puede cambiar los permisos de %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Error al crear (%s)" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Error al mover %s a %s" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "Usuario conectado a la interfaz web" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "Usuario conectado" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Falta clave de sesión" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Error: Clave de sesión requerido" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Error: Clave de sesión erróneo" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "Falta clave de API, favor ingresar la clave desde Config->General en tu " "aplicacion externa:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "Clave de API erróneo, favor ingresar la clave correcta desde Config->General " "en tu aplicacion externa:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Faltaron datos de cuenta, favor ingresar usuario/contraseña desde Config-" ">General en tu aplicacion externa:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "¡Prueba nuestra nueva skin Glitter! Un nuevo diseño recién salido del horno, " "optimizado para dispositivos de sobremesa y móviles. Ves a Configuración -> " "General para cambiar la skin." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
Apago de SABnzbd exitoso.
Espere unos 5 segundos y entonces " "seleccione el boton abajo.

Refrescar
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Alerta: LOCALHOST es ambiguo, use dirección de IP numérica" #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "La dirección del servidor «%s:%s» no es válida." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Canal" #: sabnzbd/interface.py msgid "Daily" msgstr "Diariamente" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "Lunes" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Martes" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Miércoles" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Jueves" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Viernes" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Sábado" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Domingo" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "desactivado" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "¡Servidor no definido!" #: 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 msgid "Back" msgstr "Atrás" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "ERROR:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Valor incorrecto para %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "d" #: sabnzbd/misc.py msgid "h" msgstr "h" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Error al crear la llave SSL y el certificado" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Ejecutando script" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Se ha abortado el PostProcesamiento (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Script" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "" "El anidamiento de descompresiones ha resultado demasiado profundo [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Uniendo" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Secuencia incompleta de archivos a unir" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Error al unir el fichero %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Error \"%s\" al unir archivos" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Error \"%s\" al ejecutar file_join en %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] %s ficheros unidos." #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Error al descomprimir, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Error \"%s\" al descomprimir ficheros RAR" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Error \"%s\" al ejecutar rar_unpack sobre %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "¡Error al eliminar %s!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Intentado descomprimir rar con contraseña \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Error al descomprimir; El archivo está protegido por contraseña" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Descomprimiendo" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Descomprimir" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Error al descomprimir; Imposible encontrar %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "ERROR: Imposible encontrar \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Error de CRC al descomprimir" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "ERROR: Ha fallado la comprobación CRC sobre \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "" "Error al descomprimir; ¿Error de escritura, o tal vez el disco está lleno?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "ERROR: Error de escritura (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Aperture de archivo fallo, la via es muy larga" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "ERROR: via es muy larga (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Archivo RAR inutilizable" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "Fichero RAR corrupto" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s archivos en %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Error \"%s\" al ejecutar unzip() sobre %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Tratando 7zip con la contraseña \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "7ZIP conjunto \"%s\" es incompleta, no puede desempaquetar" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "No se pudo descomprimir %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Chequeo Rápido" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Reparar" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Chequeo Rápido OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Iniciando reparación" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "La reparación ha fallado, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Error %s al ejecutar par2_repair en el conjunto %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Error %s al ejecutar par2_repair en el conjunto %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2 ha recibido opciones incorrectas, chequea tus ajustes en " "Preferencias->Switches" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Verificado en %s, todos los archivos correctos" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Verificado en %s, se necesita reparar" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Recuperando %s bloques..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Recuperando" #: 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 msgid "Repairing" msgstr "Reparando" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Reparado en %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Disco lleno" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Verificando" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Verificando" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Este servidor no permite SSL en este puerto" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Inicio/Apagado" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "NZB añadido" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Procesamiento posterior empezado" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Tarea finalizada" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Trabajo fallido" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Cola terminada" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Otros mensajes" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "No disponible" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "No se pudo enviar el mensaje de Prowl" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Mala respuesta de Pushover (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "No se pudo enviar el mensaje de Pushover" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Mala respuesta de Pushbullet (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "No se updo enviar el mensaje de Pushbullet" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "El script de notificación \"%s\" no existe" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "Fallo al mandar la notificación de Windows" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Error al importar %s ficheros desde %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "" "Se ha encontrado un fichero de cola incompatible, no se puede continuar" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Error al cargar %s, archivo corrupto" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB añadido a la cola" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Codificación desconocida" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Fichero NZB %s incompleto" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Fichero NBZ inválido: %s, omitiendo (razón=%s, línea=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Fichero NZB vacío: %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Ignorando NZB Duplicado \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Pausando NZB duplicados \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Abortado, No puede ser completado" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DUPLICADO" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "ENCRIPTADO" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "DEMASIADO GRANDE" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "INCOMPLETO" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "NO DESEADO" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "FILTRADO" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "ESPERAR %s seg" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "PROPAGANDO %s min" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Descargado en %s a una media de %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Edad" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s artículos estaban mal formados." #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s artículos no encontrados" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s artículos contenían duplicados inconexos" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s articulos removidos" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Error importando %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Advertencias" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Inactivo" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Configuración" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Cola" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Limpiar Cola" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Historial" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Purgar historial" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Limitar Velocidad" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Pausar" #: sabnzbd/osxmenu.py msgid "min." msgstr "mín." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Reanudar" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Escanear directorio bajo observación" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Leer todos los canales RSS" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Carpeta Completa" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Carpeta Incompleta" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Resolver un problema" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Reiniciar" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Reiniciar sin sesión iniciada" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Salir" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Encolar los primeros 10 elementos" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Vacía" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Histórico últimos 10 elementos" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Nueva versión disponible" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Ir al Asistente" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Deteniendo..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Problema con" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd necesita un puerto tcp/ip libre para su servidor web " "interno.
\n" " Se ha intentado en el puerto %s en %s, pero no está disponible.
\n" " Puede que otro software ya esté utilizando este puerto, o que SABnzbd ya " "esté en ejecución.
\n" "
\n" " Por favor reinicia SABnzbd indicando un número de puerto diferente." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "" "Si obtiene este mensaje de error consecutivamente, por favor inténtelo de " "nuevo con otro número.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd necesita una dirección IP para su servidor web interno.
\n" " Has especificado una dirección inválida.
\n" " Valores seguros son localhost y 0.0.0.0
\n" "
\n" " Por favor reinicia SABnzbd con una dirección o nombre de host correctos." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd ha detectado información guardada de otra versión de " "SABnzbd
\n" " pero no puede ser reutilizada por la otra versión.

\n" " Tal vez quieras finalizar primero tu cola actual con la otra " "versión.

\n" " Tras ello, ejecuta este programa con la opción \"--clean\".
\n" " Esto eliminará la cola e historial actuales!.
\n" " SABnzbd leer el archivo \"%s\"" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd no puede encontrar sus ficheros de la interfaz web en %s.
\n" " Por favor instala el programa de nuevo.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd ha detectado un error grave:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd ha detectado que el fichero sqlite3.dll no existe.

\n" " Algunos virus de de pésima calidad eliminan este fichero.
\n" " Por favor revisa la configuración de tu antivirus y quéjate a tu " "proveedor del AntiVirus. Tras ello reinstala SABnzbd.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Presiona la Tecla de Windows+R y teclea la línea (ejemplo)" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Apre una ventana de Consola y teclea la línea (ejemplo)" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "El programa no ha arrancado!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "Error grave" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "" "Imposible iniciar el navegador, probablemente no se le haya encontrado" #: sabnzbd/panic.py msgid "Access denied" msgstr "Acceso denegado" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Error %s: Necesitas introducir un usuario y contraseña válidos." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "" "Se ha encontrado una cola antigua, utilice Estado->Reparar para convertir la " "cola" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" 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" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Descarga fallida - No está en tu(s) servidor(es)" #: sabnzbd/postproc.py msgid "Moving" msgstr "Moviendo" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "Enviado(s) %s a la cola" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Error al renombrar \"%s\" a \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Error al mover ficheros" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Ejecutando script de usuario %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "Se ejecutó %s" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "El código de retorno del Script es %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Más" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Error al post-procesar %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "ver fichero de log" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "La descarga falló" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Ha fallado la limpieza de %s" #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Descarga Completada" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Imposible crear directorio final %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Post-Procesado" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] No hay conjuntos par2" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Intentando verificación por SFV" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Han fallado algunos ficheros al verificarse \"%s\"" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Se ha verificado correctamente utilizando ficheros SFV" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Con contraseña" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Error al eliminar %s" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Error al hibernar el sistema" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Error al suspender el sistema" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Error al apagarel sistema" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "" "Identificación del indexador (%s) no encontrado para archivo de " "calificaciones" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Dirección del Servidor" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "Clave API" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "iaDescripción de canal RSS incorrecta \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Error al recuperar RSS desde %s: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "No se encontró autenticación válida para el feed %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "" "Error del lado servidor (código enviado por el servidor: %s); no se ha " "podido conseguir %s en %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "El servidor %s utiliza un certificado HTTPS no fiable" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "El canal RSS %s estaba vacío" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Canal Incorrecto" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Entrada RSS vacía (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Mostrar interfaz" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Abrir todo el folder" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Pausar durante" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Pausar 5 minutos" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Pausar 15 minutos" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Pausar 30 minutos" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Pausar 1 hora" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Pausar 3 horas" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Pausar 6 horas" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Apagar" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Restante" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Añadir NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Planificación incorrecta %s a las %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Acción desconocida: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Planificación para servidor %s inexistente" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Descargar" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Unir ficheros" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Fuente" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Servidores" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Fallo" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Fallido" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "En espera" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Reparando..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Extrayendo..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Moviendo..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Ejecutando script..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Recuperando bloques extra..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Chequeo Rápido..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Verificando..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Descargando" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "Demora de la propagación" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Tarea" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "deshabilitar servidor" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "habilitar servidor" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Límite de Velocidad" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Pausar todo" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Pausar post-procesamiento" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Reanudar post-procesamiento" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Leer entradas RSS" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Eliminar trabajos fallidos" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Eliminar trabajos completados" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Pausar trabajos de prioridad baja" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Pausar trabajos de prioridad normal" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Pausar trabajos de prioridad alta" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Reanudar trabajos de prioridad baja" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Reanudar trabajos de prioridad normal" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Reanudar trabajos de prioridad alta" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Habilitar la administración de cuota" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Apagado" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Muy baja" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Moderada" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normal" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Alta" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Emergencia" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Baja" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "hora" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "horas" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "mín" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "mins" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "seg" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "segundos" #: sabnzbd/skintext.py msgid "day" msgstr "día" #: sabnzbd/skintext.py msgid "days" msgstr "días" #: sabnzbd/skintext.py msgid "week" msgstr "semana" #: sabnzbd/skintext.py msgid "Month" msgstr "Mes" #: sabnzbd/skintext.py msgid "Year" msgstr "Año" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Día del mes" #: sabnzbd/skintext.py msgid "This week" msgstr "Esta semana" #: sabnzbd/skintext.py msgid "This month" msgstr "Este mes" #: sabnzbd/skintext.py msgid "Today" msgstr "Hoy" #: sabnzbd/skintext.py msgid "Total" msgstr "Total" #: sabnzbd/skintext.py msgid "on" msgstr "activado" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parametros" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Version de Python" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Pagina principal" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "o" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Equipo" #: sabnzbd/skintext.py msgid "Comment" msgstr "Comentar" #: sabnzbd/skintext.py msgid "Send" msgstr "Enviar" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Cancelar" #: sabnzbd/skintext.py msgid "Other" msgstr "Otro" #: sabnzbd/skintext.py msgid "Report" msgstr "Denunciar" #: sabnzbd/skintext.py msgid "Video" msgstr "Vídeo" #: sabnzbd/skintext.py msgid "Audio" msgstr "Audio" #: sabnzbd/skintext.py msgid "Not used" msgstr "No usado" #: sabnzbd/skintext.py msgid "or less" msgstr "o menos" #: sabnzbd/skintext.py msgid "Log in" msgstr "Iniciar sesión" #: sabnzbd/skintext.py msgid "Log out" msgstr "Cerrar sesión" #: sabnzbd/skintext.py msgid "Remember me" msgstr "Mantenerme conectado" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "La herramienta de descarga automática para usenet" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Guardar" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Guardando..." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "¿Estás seguro?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "¿Elimiar todos los ficheros descargados?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Inicio" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Config." #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Estado" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Ayuda" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Foro" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "Problemas" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "¡Apoye el proyecto, haga una donación!" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "General" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Directorios" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Switches" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Planificación" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Notificaciones" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "Correo" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Categorías" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "OrdenacioÌn" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Especial" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Buscar" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Dir de Descarga" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "PAUSADO" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "%s artículos cacheados (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Carga del Sistema" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Nueva versión %s disponible en" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "¿Seguro que deseas detener SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Añadir" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Añadir fichero" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Categoría" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "En proceso" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Prioridad" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Reparar" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Descomprimir" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Eliminar" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "U" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "D" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Forzar" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Parar" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "Introduzca la URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "Al finalizar cola" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Apagar PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "Suspender PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Hibernar PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Apagar SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Límite de velocidad" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Orden" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Nombre" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "Tiempo estimado" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "ANTIGÜEDAD" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Borrar" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Reintentar" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Acciones" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Scripts" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "¿Eliminar todos los elementos de la cola?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Purgar NZBs" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Purgar NZBs y Eliminar Ficheros" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Vuelva a intentar todos los trabajos con errores" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Eliminar NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Eliminar NZB y Eliminar Ficheros" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "de" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Artículos no encontrados" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Quota disponible" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "manual" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Reinicializar Quota ahora" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "¿Eliminar todos los elementos completados del Historial?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Ocultar detalles" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Mostrar detalles" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Mostrar los Fallidos" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Mostrar Todo" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Tamaño" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Purgar los NZBs fallidos" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Purgar NZBs fallidos y sus ficheros" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Purgar NZBs completados" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "NZB Suplementario Opcional" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Ruta" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Re-intentar todos los fallados" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Re-intentar todo" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus / spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Fuera de retención" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Otro problema" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Forzar desconexión" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Se enviará un email de prueba a tu cuenta" #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Ver Logging" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Email de prueba" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Registros de sucesos" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Errores/Advertencias" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+Info" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+Depuración" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Conexiones" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Últimas advertencias" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "limpiar" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Desbloquear" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Identificador de artículo" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Conjunto de ficheros" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Cuando" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Tipo" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Habilitado" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Tablero" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "¡Ha fallado la conexión!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Dirección IPv4 local" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Dirección IPv4 pública" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "Dirección IPv6" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Nombre del servidor / Búsqueda de DNS" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "Modelo de CPU" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Rendimiento del sistema ( Pystone )" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "La velocidad de descarga carpeta" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Velocidad completa carpeta" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "velocidad de escritura" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "" "No se pudo escribir . Compruebe que el directorio tiene permisos de " "escritura ." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "" "Haga clic en el botón de prueba Repita a continuación para determinar" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Repita la prueba" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "Fichero de Config" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Caché utilizada" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Esto reiniciará SABnzbd.
Usalo cuando creas que el programa está " "colgado.
Las descargas se pausarán antes de reiniciar, y se reanudarán " "a continuación." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "Si la autenticación esta activada, tendrás que conectarte de nuevo." #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Existen trabajos huérfanos en la carpeta de descarga.
Puedes escoger " "por eliminarlos (incluyendo los ficheros) o enviarlos de nuevo a la cola." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "El botón \"Reparar\" reiniciará SABnzbd y hará una reconstrucción
completa del contenido de la cola, preservando las descargas ya " "terminadas.
Esto modificará el orden de la cola." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "No se han guardado los cambios, y se perderán." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "Cuando tu dirección IP cambie o reinicies SABnzbd, la sesión caduca." #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Habilitar Unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "Habilitar 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "Versión" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Tiempo en Activo" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Copia de seguridad" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Lee la ayuda en la Wiki (inglés) acerca de esto!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Reiniciando SABnzbd..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Los cambios requieren reiniciar SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "Servidor web de SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "Host de SABnzbd" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Dónde debería escuchar el Host de SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "Puerto de SABnzbd" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Puerto en que SABnzbd debería escuchar" #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Interfaz web" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Elije una piel" #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "Usuario SABnzbd" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Nombre de usuario opcional" #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "Contraseña de SABnzbd" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "Habilitar HTTPS" #: sabnzbd/skintext.py msgid "not installed" msgstr "no instalado" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Habilia el acceso a la interfaz con una dirección HTTPS" #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "Puerto HTTPS" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Si se deja vacío, el puerto estándar escuchará por HTTPS" #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "Certificado HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Nombre de archivo o ruta al Certificado SSL" #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "Clave privada SSL" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Nombre de archivo o ruta a la clave privada SSL" #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "Cadena de Certificados HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Nombre de archivo o ruta de acceso a la cadena de HTTPS." #: sabnzbd/skintext.py msgid "Tuning" msgstr "Ajustes" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "Intervalo de chequeo RSS" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Intervalo de Chequeo (en minutos, mínimo 15). No toma efecto si utilizas el " "Planificador!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Velocidad máxima de línea" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Porcentaje de velocidad de línea" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "" "Porcentaje de la velocidad de la línea que SABnzbd debería utilizar, por " "ejemplo 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Límite de cacheo de artículos" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Cachear artículos en memoria para reducir el acceso a disco.
En " "bytes, opcionalmente seguido de K,M,G. Por ejemplo: \"64M\" o \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Lista de elementos a limpiar" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Lista de extensiones de archivo que se deben eliminar después de la descarga " "
Por ejemplo : . nfo o nfo, sfv < /b>" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Guardar cambios" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "Restaurar valores por defecto" #: sabnzbd/skintext.py msgid "Reset" msgstr "Reiniciar" #: sabnzbd/skintext.py msgid "Language" msgstr "Idioma" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Selecciona un idioma para la interfaz web." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" "¡Ayúdanos a traducir SABnzbd en tu idioma!
Traduce textos que aun no " "tienen ninguna traducción o mejora los que ya lo están traducidos aquí:" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "" "Esta clave le permitirá a programas de terceros acceso completo a SABnzbd." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "Clave NZB" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Esta clave permitirá acceso a programas de terceros para añadir NZBs a " "SABnzbd." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Generar nueva clave" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "Código QR de la clave API" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Lista de rangos de red local" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Todas las direcciones de red locales comienzan con estos prefijos (a menudo " "\" 192.168.1 . \" )" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Acceso a internet externa" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "Acceso denegado" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Añadir archivos NZB " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (sin Config)" #: sabnzbd/skintext.py msgid "Full API" msgstr "API completa" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Interfaz web completa" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "Solo acceso externo requieren conexión de usuario" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "NOTA: Los directorios se crean automáticamente al guardar. Puedes " "usar una ruta absoluta, exterior a los directorios predefinidos." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Directorios del usuario" #: sabnzbd/skintext.py msgid "Browse" msgstr "Examinar" #: sabnzbd/skintext.py msgid "In" msgstr "En" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Directorio de descarga temporal" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Localización donde guardar descargas incompletas.
Sólo se puede " "cambiar si la cola est&aa; vací" #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Espacio libre mínimo para el directorio de descargas temporales" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Parar automáticamente cuando el espacio libre esté por debajo de este " "valor.
En bytes, opcionalmente seguido de K,M,G,T. Por ejemplo: " "\"800M\" ó \"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Directorio de descargas completadas" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Ubicación donde guardar descargas finalizadas, totalmente procesaddas.
Puede ser obviado debido a categorías definidas por el usuario." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Permisos para descargas completadas" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Ajustar patrón de permisos para ficheros/directorios completados.
En " "notación ocal. Por ejemplo:\"755\" ó \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Directorio a vigilar" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Directorio a monitorizar en busca de ficheros .nzb.
También escanea " "ficheros .zip .rar y .tar.gz en busca de ficheros .nzb." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Velocidad de escaneo de la carpeta vigilada" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Número de segundos entre pasadas en busca de ficheros .nzb." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Directorio de plantillas de Email" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "" "Directorio que contiene plantillas de email definidas por el usuario." #: sabnzbd/skintext.py msgid "Password file" msgstr "Archivo de contraseñas" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Fichero que contiene todas las contraseñas a usar en ficheros RAR protegidos." #: sabnzbd/skintext.py msgid "System Folders" msgstr "Directorios del sistema" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Directorio de administración" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Ubicación de la base de datos de historial y administración.
Sólo se " "puede cambiar si la cola está vacía." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Los datos no se moverán. Requiere queu SABnzbd sea reiniciado!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Directorio de Historial" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Ubicación de los ficheros de log para SABnzbd.
Requiere reiniciar " "SABnzbd!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "Directorio de Backups de .nzbs" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Ubicación donde se guardarán los ficheros .nzb." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Directorio base por defecto" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Descargar todos los archivos PAR2" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Activar descompresión recursiva" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Descomprimir archivos (rar,zip,7z) dentro de otros archivos." #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Ignorar cualquier carpeta dentro de archivos" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Todos los archivos irán en una sola carpeta ." #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Sólo obtener artículos para el primer elemento de la Cola" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Habilitar para usar menos memoria. Deshabilitar para prevenir que trabajos " "que se ralentizen bloqueen la cola." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Post-procesar sólo trabajos verificados" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" "Sólo realiza el post-procesado en trabajos que han pasado todos los chequeos " "PAR2." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Accion cuando un archivo RAR cifrado es bajado" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "In caso de PAUSA, necesitara escribir una contrasena para continuar el " "trabajo." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Detectar descargas duplicadas" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Detectar episodios duplicadas en serie" #: sabnzbd/skintext.py 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 "Descartar" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Abortar" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Acción al detectar extensiones no deseadas" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "Acción cuando se detecta una extensión no deseada en archivos RAR" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "extensiones no deseadas" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Enumerar todas las extensiones no deseadas . Por ejemplo : < b> exe < / b > " "o < b> exe, com < / b >" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Habilitar verificacion basada en SFV" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Realiza una verificación extra basada en ficheros SFV." #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Script de usuario puede marcar un trabajo como fallado" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Cuando la secuencia de comandos de usuario devuelve un código de salida " "distinto de cero, el trabajo se marca como fallido ." #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "En caso de fallo, intentar con un NZB alternativo" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" "Algunos servidores ofrecen una NZB alternativa cuando falla una descarga ." #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Habilitar renombrado de directorios" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Usa nombres temporales durante el procesado. Deshabilitalo si tu sistema se " "vuelve inestable con ello habilitado." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Script de usuario Pre-cola" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Se usa precediendo a la entrada de un NZB en la cola del sistema." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Parámetros PAR2 extra" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Parámetros Nice" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "Parámetros IONice" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Desconectar si la cola está vacía" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "" "Desconecta del servidor de Usenet cuando la cola está vacía, o pausada." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Ordenar por antigüedad" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Automáticamente ordenar elementos por antigüedad (promedio)." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" "Los mensajes serán pausados hasta que alcancen al menos esta edad. Esta " "espera puede evitarse si se le da el valor Forzar a la prioridad de la " "tarea." #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Buscar Nva Versión" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Chequear semanalmente por nuevas versiones de SABnzbd." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "También libera de prueba" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Reemplazar espacios en el nombre de directorio" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "" "Reemplaza los espacios con guiones bajos en los nombres de directorio." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Reemplazar puntos en los directorios" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Reemplaza los puntos con espacios en los nombres de directorio." #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Hacer compatible con Windows" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "" "Para los servidores : asegúrese de que los nombres son compatibles con " "Windows ." #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Lanzar navegador al Arrancar" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Ejecuta el navegador por defecto del sistema al arrancar SABnzbd." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Pausar Descargas Durante el Post-Procesado" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Pausa las descargas al principio del post-procesado, y reanuda al terminar." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Ignorar Samples" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Filtra la descarga de ficheros de ejemplo (e.g. un sample de vídeo)." #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Eliminar tras descargar" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "Validación del certificado HTTPS" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" "Verificar certificados al conectarse a indexadores y fuentes RSS usando " "HTTPS." #: sabnzbd/skintext.py msgid "Server" msgstr "Servidor" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Post procesado" #: sabnzbd/skintext.py msgid "Naming" msgstr "Nombrado" #: sabnzbd/skintext.py msgid "Quota" msgstr "Cuota" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indexación" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Cantidad de descarga permitida este mes (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Día de reinicio del conteo" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "En qué día del mes o semana (1=Lunes) resetea tu proveedor la cuota mensual? " "(Opcional con hh:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Auto reanudar" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "¿Deberían las descargas resumirse tras reiniciarse la cuota?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Periodo de la cuota" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "¿Cada cuánto se resetea la cuota?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Chequear antes de descargar" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Intenta predecir si la descarga actual se completará con éxito (ojo, esto " "tarda!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "Reintentos máximos" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Máximo número de reintentos por servidor" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Trabajos abortados no pueden ser completados" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Cuando este bajando, si es claro que mucha data esta faltando, aborte el " "trabajo." #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Habilitar Filtrado" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Acciones de descarga acordes a las reglas de filtrado." #: sabnzbd/skintext.py msgid "Abort If" msgstr "Abortar si" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "sino pausar si" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Puntuación" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Valoración de Audio" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spam" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Confirmado" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Más votos negativos que positivos" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Palabras clave" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Lista separada por comas" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "" "Útil si un servidor de noticias tiene más de una dirección IPv4 / IPv6" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Añadir servidor" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Descripción del servidor" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Puerto" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Nombre de usuario" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Contraseña" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Expiración del plazo (Timeout)" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Periodo de retención" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "Deshabilitado" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 El prioridad más alta, 99 es la prioridad más baja" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Opcional" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Habilitar" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Eliminar servidor" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Probar Servidor" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Resetear contadores" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Testeando información del servidor" #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Ancho de Banda" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Enviar Group" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Enviar comando group antes de solicitar los artículos." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Notas personales" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Añadir planificación" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Frecuencia" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Acción" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Argumentos" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Tareas Programadas Actuales" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "La casilla junto al nombre de la fuente debería marcarse para habilitar la " "fuente y que se marquen automáticamente los nuevos elementos.
Cuando " "una fuente se añade, sólo se cogerán los elementos nuevos y nada de lo que " "ya exista, salvo que presiones \"Forzar Descarga\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Leer Fuente" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Forzar Descarga" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filtrar" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Aceptar" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Rechazar" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Necesita" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "RequiereCat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Al menos" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Como máximo" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "De SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Encontrado(s)" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "No encontrado" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Descargado" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Leer todas las fuentes ahora" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Notificación por email al terminar" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Nunca" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Siempre" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Sólo Errores" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Notificaciones de Disco Lleno" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "" "Envía un email cuando el disco se ha llenado y SABnzbd se ha tenido que " "parar." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Enviar notificaciones RSS" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "Enviar email cuando una fuente RSS añade un trabajo a la cola." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "Servidor SMTP" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Indica los ajustes de tu correo electrónico saliente." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Destinatario" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "Dirección de correo electrónico a la que enviar el mensaje." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "Remitente" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "¿Quién quieres que aparezca como remitente?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "Nombre de usuario OPCIONAL" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "" "Para correos electrónicos con autentificación, poner el nombre de usuario." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "Contraseña de usuario OPCIONAL" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Para correos electrónicos con autentificación, poner la contraseña." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "¡Notificación enviada!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Habilitar Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Usar sólo para un servidor Growl remoto (servidor:puerto)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Contraseña de servidor" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Contraseña opcional para el servidor Growl" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "Habilitar NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Centro de Notificación" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Activar notificaciones Windows" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Notificaciones Windows" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Activar notificaciones Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Necesitas una cuenta Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "Clave API de Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Clave privada de la API de Prowl" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Activar notificaciones Pushover" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Necesitas una cuenta Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Token de aplicación" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Token de aplicación (obligatorio)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Clave de usuario" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Clave de usuario (obligatoria)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Dispositivo(s)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Activar notificaciones Pushbullet" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Necesitas una cuenta en Pushbullet" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Clave API personal" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Tu clave API personal de Pushbullet (obligatoria)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Dispositivo" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Dispositivo al que enviar el mensaje" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "Script de notificación" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "Activar script de notificación" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "Ejecutar un script personalizado" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "¿Que script deberíamos ejecutar para notificaciones?" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Terminar la ruta con un * previene que se creen directorios de trabajo." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Los directorios relativos, lo son a" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Directorio/Ruta" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Ordenación de Series" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Habilitar la ordenación de Series de TV" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Patrón" #: sabnzbd/skintext.py msgid "Clear" msgstr "Limpiar" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "Preajustes" #: sabnzbd/skintext.py msgid "Example" msgstr "Ejemplo" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Habilitar Ordenado de Películas" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Mantener descargas en directorios extra." #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Categorías Afectadas" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Significado" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Patrón" #: sabnzbd/skintext.py msgid "Result" msgstr "Resultado" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Temporada Directorio" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Temporada Directorio" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Episodio Directorio" #: sabnzbd/skintext.py 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" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Nombre de Película" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Nombre.de.pelicula" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Nombre_de_pelicula" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Nombre de la Serie" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Nombre.serie" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Nombre_serie" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Número de la temporada" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Número del capítulo" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Nombre del capítulo" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Nombre.capítulo" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Nombre_capítulo" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Extensión de archivo" #: sabnzbd/skintext.py msgid "Extension" msgstr "Extensión" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Numero de Parte" #: sabnzbd/skintext.py msgid "Decade" msgstr "Década" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Nombre fichero original" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Minúsculas" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEXTO" #: sabnzbd/skintext.py msgid "text" msgstr "texto" #: sabnzbd/skintext.py msgid "file" msgstr "archivo" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Ordenar cadena" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Etiqueta" #: sabnzbd/skintext.py msgid "In folders" msgstr "En directorios" #: sabnzbd/skintext.py msgid "No folders" msgstr "Sin Directorios" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Ordenar por fecha" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Habilitar ordenar por fecha" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Carpeta de la serie" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "Directorios Año-Mes" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Directorios diarios" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "ajustado a mayus-minus" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Resultado del procesado" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Opciones usadas raramente. Para su significado y explicación, haga clic en " "el botón de Ayuda para ir al Wiki.
No cambie esto sin chequear primero en " "la wiki,ya que algunos ajustes tienen severas consecuencias.
Los valores " "por defecto se muestran entre paréntesis." #: sabnzbd/skintext.py msgid "Values" msgstr "Valores" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Editar Detalles de NZB" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Eliminar" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Superior" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Encima" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Abajo" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Último" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Todos" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Invertir" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Nombre de archivo" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Asunto" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Selección" #: sabnzbd/skintext.py msgid "left" msgstr "Restante" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Espacio libre" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Carpeta temporal" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Op.Múltiples" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Mantén presionada la tecla shift para seleccionar un rango" #: sabnzbd/skintext.py msgid "Check all" msgstr "Marcar todo" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Reiniciar SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Opciones de estado e interfaz" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "¡ó arrastra y suelta ficheros en la propia ventana!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Se ha perdido la conexión con SABnzbd.." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Frecuencia de actualización" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Usar ajustes de la interfaz global" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Límite de elementos encolables" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Límite del historial" #: sabnzbd/skintext.py msgid "Date format" msgstr "Formato de fecha" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Columna de cola extra" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "Columna de historia adicional" #: sabnzbd/skintext.py msgid "page" msgstr "página" #: sabnzbd/skintext.py msgid "Loading" msgstr "Cargando" #: sabnzbd/skintext.py msgid "articles" msgstr "artículos" #: sabnzbd/skintext.py msgid "Rename" msgstr "Renombrar" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Reparar cola" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Mostrar conexiones activas" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Trabajos descolgados" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Enviar de nuevo a la cola" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Eliminar todo" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Re-intentar todo" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Descargar NZB desde URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "Subir NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Opcionalmente especificar un nombre de fichero" #: sabnzbd/skintext.py msgid "Submit" msgstr "Enviar" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Abrir URL de informacion" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Enviado. ¡Muchas gracias!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "¡No hay nada seleccionado!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Eliminar todos los ficheros seleccionados" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Ocultar/Mostrar ficheros completados" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Ver bitacora de Scripts" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "¡Actualización Disponible!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" "Tu buscador de internet tiene las cookies desactivadas, la configuración de " "la interfaz se perderá si cierras el explorador." #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "¡Glitter tiene alguna nueva funcionalidad que puede gustarte!" #: sabnzbd/skintext.py msgid "Custom" msgstr "Personalizar" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "Diseño compacto" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "Diseño de pestañas
(separa la cola de espera y la historia)" #: sabnzbd/skintext.py msgid "Speed" msgstr "Velocidad" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Confirmar eliminación de la cola" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Confirmar eliminación del historial" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "¿Durante cuánto tiempo quieres dejarlo pausado?" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "" "Lo siento, no hemos podido interpretar eso. Vuelve a intentarlo de nuevo." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Pausar durante..." #: 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 Oldest→Newest" msgstr "Ordenar por Fecha Más viejo→Más nuevo" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Ordenar por Fecha Más nuevo→Más viejo" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Ordenar por nombre A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Ordenar por nombre Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Ordenar por Tamaño Más pequeño→Más grande" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Ordenar por Tamaño Más grande→Más pequeño" #: sabnzbd/skintext.py msgid "Uploading" msgstr "Subiendo" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "Forzar la desconexión" #: sabnzbd/skintext.py msgid "Removing job" msgstr "Eliminar tarea" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "Eliminar tareas" #: sabnzbd/skintext.py msgid "Prev" msgstr "Anterior" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Siguiente" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "¿Vaciar el historial?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Debes activar JavaScript para que pueda funcionar Plush!" #: sabnzbd/skintext.py msgid "Options" msgstr "Opciones" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "¿Por cuántos minutos realizar la pausa?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Menú superior" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Al terminar" #: sabnzbd/skintext.py msgid "Sort" msgstr "Ordenar" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Ordenar por Fecha (Más viejo→Más nuevo)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Ordenar por Fecha (Más nuevo→Más viejo)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Ordenar por nombre (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Ordenar por nombre (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Ordenar por Tamaño (Más pequeño→Más grande)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Ordenar por Tamaño (Más grande→Más pequeño)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "¿Limpiar la Cola?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "¿Re-intentar todos los trabajos con errores del Historial?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Purgar" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Velocidad máx." #: sabnzbd/skintext.py msgid "Range" msgstr "Intervalo" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Aplicar a seleccionados" #: sabnzbd/skintext.py msgid "Everything" msgstr "Todo" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Frecuencia de actualización" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Ancho del contenedor" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Esto evitará que se actualizen los contenidos cuando el cursor del ratón " "esté sobre la cola." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Bloquear actualizaciones al pasar por encima" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Subir" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Subir: .nzb .rar .zip .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Progreso" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "¡No hay espacio suficiente para completar las descargas!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Libre (Temp)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "INACTIVO" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Descargas" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "Asistente de Configuración de SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "Versión de SABnzbd" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Anterior" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Detalles del servidor" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Por favor introduce los datos de tu proveedor principal de Usenet." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Número de conexiones permitidas a tu proveedor" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "P.ej. 8 ó 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Selecciona sólo si tu proveedor permite conexiones SSL." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Haz clic para probar los detalles introducidos." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Por ej." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "¡La configuración ha terminado!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd ahora quedará ejecutando en segundo plano." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "Si cierras las pestañas o el navegador, SABnzbd NO se cerrará." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Se recomienda que guardes esta ubicación como favorito y la añadas a tu " "navegador para acceder a SABnzbd cuando quieras." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Puedes encontrar más ayuda en nuestro" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "Ir a SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "Salir SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Iniciar Asistente" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd se entrega SIN NINGUNA GARANTÃA.\n" "Este es un software libre, y eres bienvenido a redistribuirlo bajo " "determinadas condiciones.\n" "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] msgid "Error getting TV info (%s)" msgstr "Error al recuperar info de la serie (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "Error al renombrar: %s a %s" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "Error al renombrar ficheros similares: %s a %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Acceso no autorizado" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "El fichero no se encuentra en el servidor" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "EL URLGRABBER HA FALLADO" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "Archivo NZB inusable" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "Error al recuperar la URL; %s" #~ msgid "Folder \"%s\" does not exist" #~ msgstr "La carpeta «%s» no existe" #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Su versión de UNRAR no está recomendada, obténgalo desde " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "Downloaded so far" #~ msgstr "Descargado hasta ahora" #~ 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 "_yenc module... NOT found!" #~ msgstr "módulo _yenc... NO encontrado!" #~ msgid "Invalid encoding of email template %s" #~ msgstr "Codificación de plantilla invalido %s" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "" #~ "Programa Unrar no encontrado, descomprimir de archivos RAR no posible
" #~ msgid "Initiating restart...
" #~ msgstr "Reiniciando...
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "Programa Par2 no encontrado, reparacion no posible
" #~ msgid "Error: No secondary interface defined." #~ msgstr "Error: Interfaz secundario no iniciado" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "Tareas marcadas con un '*' no serán descargadas automaticamente." #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "La tarea \"%s\" ha sido re-agregada a la cola" #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "No se puede abrir la llave de registro \"%s\"." #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Falla al leer las llaves de registro para los directorios especiales" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "Falta el módulo pyopensll, favor de instalarlo para acceso https" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "" #~ "Imposible conectar a la clave HKEY_CURRENT_USER del registro de Windows" #~ msgid "Not matched" #~ msgstr "No encontrado(s)" #~ msgid "Unpacking failed, these file(s) are missing:" #~ msgstr "Error al descomprimir, faltan este(os) archivo(s):" #~ msgid "Unpacking failed, see log" #~ msgstr "Error al descomprimir, chequea el log" #~ msgid "ERROR: %s" #~ msgstr "ERROR: %s" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "" #~ "Error al descomprimir; se esperaba un archivo que no se ha podido " #~ "descomprimir" #~ 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 "File %s is empty, skipping" #~ msgstr "El fichero%s está vacío, omitiendo" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABNZBD no es compatible con algunos cortafuegos.
\n" #~ " %s
\n" #~ " Lo sentimos, pero no se puede resolver esta incompatibilidad en este " #~ "momento.
\n" #~ " Por favor contacta con el proveedor de tu cortafuegos.
\n" #~ "
\n" #~ msgid "OK" #~ msgstr "Aceptar" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd necesita un puerto tcp/ip libre para su servidor web " #~ "interno.
\n" #~ " Se ha intentado con el puerto %s en %s, pero la cuenta utilizada por " #~ "SABnzbd no tiene permisos para usarlo.
\n" #~ " En equipos OSX y Linux, los usuarios normales han de usar puertos por " #~ "encima de 1023.
\n" #~ "
\n" #~ " Por favor reinicie SABnzbd con un número de puerto diferente." #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Parece que estás usando ZoneAlarm con Windows Vista.
" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "Error al eliminar nzo desde la cola de postprocesado (id)" #~ msgid "You have no permisson to use port %s" #~ msgstr "No tienes permisos para usar el puerto %s" #~ msgid "No post-processing because of failed verification" #~ msgstr "No se ha podido post-procesar debido a un fallo en la verificación" #~ msgid "View script output" #~ msgstr "Ver salida del script" #~ msgid "Error removing workdir (%s)" #~ msgstr "Error al eliminar el directorio de trabajo (%s)" #~ msgid "Get NZB" #~ msgstr "Obtener NZB" #~ msgid "KB/s" #~ msgstr "KB/s" #~ msgid "Queued" #~ msgstr "En cola" #~ msgid "Complete Dir" #~ msgstr "Dir para completados" #~ msgid "Download speed" #~ msgstr "Velocidad de Descarga" #~ msgid "Add new downloads" #~ msgstr "Añadir nuevas descargas" #~ msgid "WARNINGS" #~ msgstr "AVISOS" #~ msgid " " #~ msgstr " " #~ msgid "Sort by name" #~ msgstr "Ordenar por nombre" #~ msgid "Sort by age" #~ msgstr "Ordenar por antigüedad" #~ msgid "Sort by size" #~ msgstr "Ordenar por tamaño" #~ msgid "Hide files" #~ msgstr "Ocultar Ficheros" #~ msgid "Show files" #~ msgstr "Mostrar archivos" #~ msgid "Remain/Total" #~ msgstr "Restante/Total" #~ msgid "Purge Failed History" #~ msgstr "Purgar historial de errores" #~ msgid "History Size" #~ msgstr "Tamaño del Historial" #~ msgid "Delete all failed items from History?" #~ msgstr "¿Eliminar todos los elementos que han fallado del Historial?" #~ msgid "Show Weblogging" #~ msgstr "Mostrar Logging de la web" #~ msgid "Thread" #~ msgstr "Hilo" #~ msgid "Email Test Result" #~ msgstr "Resultado del email de prueba" #~ msgid "General configuration" #~ msgstr "Configuración general" #~ msgid "Secondary Web Interface" #~ msgstr "Interfaz web secundaria" #~ msgid "HTTPS Support" #~ msgstr "Soporte HTTPS" #~ msgid "Activate an alternative skin." #~ msgstr "Habilitar una piel alternativa" #~ msgid "Web server authentication" #~ msgstr "Identificación contra el Servidor Web" #~ msgid "Queue auto refresh interval:" #~ msgstr "Intervalo automático de refresco de la cola" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "" #~ "Intervalo de refresco de la página web de la cola (en segundos, 0= ninguno)" #~ msgid "Do not require the API key." #~ msgstr "No solicitar clave API." #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "USALO BAJO TU RESPONSABILIDAD" #~ msgid "Disable API-key" #~ msgstr "Desactivar Clave-API" #~ msgid "QR Code" #~ msgstr "Codigo QR" #~ msgid "Folder configuration" #~ msgstr "Configuración Directorios" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Directorio de Scripts de post-procesado" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "" #~ "Directorio que contiene los scripts de usuario para el post-procesado." #~ msgid "Other Switches" #~ msgstr "Otros parámetros" #~ msgid "Server configuration" #~ msgstr "Configuración del servidor" #~ msgid "Remove" #~ msgstr "Eliminar" #~ msgid "Add Feed" #~ msgstr "Añadir una fuente" #~ msgid "Skip" #~ msgstr "Omitir" #~ msgid "RSS Configuration" #~ msgstr "Configuración de RSS" #~ msgid "Delete Feed" #~ msgstr "Borrar fuente" #~ msgid "Feeds" #~ msgstr "Fuentes" #~ msgid "Filters" #~ msgstr "Filtros" #~ msgid "Settings" #~ msgstr "Preferencias" #~ 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?" #~ msgid "Page" #~ msgstr "Página" #~ msgid "Last" #~ msgstr "Último" #~ msgid "First" #~ msgstr "Primero" #~ msgid "Close" #~ msgstr "Cerrar" #~ msgid "Storage" #~ msgstr "Almacenamiento" #~ msgid "Links" #~ msgstr "Enlaces" #~ msgid "Edit" #~ msgstr "Modificar" #~ msgid "Access" #~ msgstr "Acceso" #~ msgid "Misc" #~ msgstr "Miscelánea" #~ msgid "This field is required." #~ msgstr "Este campo es obligatorio" #~ msgid " or Report ID" #~ msgstr "  ó ID de Reporte" #~ msgid "Switches configuration" #~ msgstr "Configuración de Switches" #~ msgid "Processing Switches" #~ msgstr "Procesando Switches" #~ msgid "Enable Quick Check" #~ msgstr "Habilitar Chequeo Rápido" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Ignorar chequeo de par2 cuando los ficheros son 100% correctos." #~ msgid "Enable Unrar" #~ msgstr "Habilitar Unrar" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Habilitar funcionalidad nativa de unrar" #~ msgid "Enable built-in unzip functionality." #~ msgstr "Habilitar funcionalidad nativa de unzip." #~ msgid "Enable Filejoin" #~ msgstr "Habilitar Filejoin" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "Une los ficheros terminados en .001, .002 etc en un sólo fichero." #~ msgid "Enable TS Joining" #~ msgstr "Habilitar Unión TS" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "" #~ "Une los ficheros terminados en .001.ts, .002.ts etc en un sólo fichero." #~ msgid "Enable Par Cleanup" #~ msgstr "Habilitar limpieza Par" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Limpiar ficheros par (si la reparación/verificación es correcta)." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Fallar si hay errores de CRC en yEnc" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "" #~ "Cuando un artículo tiene un error de CRC, intentar conseguirle desde otro " #~ "servidor." #~ msgid "Check result of unpacking" #~ msgstr "Chequear el resultado de la descompresión" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Chequea el resultado de la descompresión (necesita deshabilitarse si tienes " #~ "un sistema de ficheros muy grande)." #~ msgid "Default Post-Processing" #~ msgstr "Post-Procesado por defecto" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "" #~ "Este es el post-procesado a utilizar cuando no se ha definido nada especial " #~ "según la categoría de la descarga." #~ msgid "Default User Script" #~ msgstr "Script de Usuario predefinido" #~ msgid "Used when no user script is defined by the category." #~ msgstr "Usado cuando la categoría no imponte ningún script de usuario." #~ msgid "Default Priority" #~ msgstr "Prioridad Predefinida" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Se usa cuando la categoría no impone ninguna prioridad." #~ msgid "Enable MultiCore Par2" #~ msgstr "Habilitar Par2 Multi-núcleo" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Reemplazar caracteres no admitidos en los directorios" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "Reemplaza los caracteres inválidos del nombre del directorio por lso " #~ "equivalentes (si no puede los elimina)." #~ msgid "Do not download" #~ msgstr "No descargar" #~ msgid "SSL type" #~ msgstr "Tpo de SSL" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "¡sa V23 salvo que tu proveedor indique lo contrario!" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "Usar reloj de 12 horas (AM/PM)" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Muestra las horas en notación AM/PM (no afecta al planificador)." #~ msgid "Only for optional servers" #~ msgstr "Sólo para servidores opcionales/alternativos" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Aplica un máximo de reintentos a los servidores opcionales" #~ msgid "Server definition" #~ msgstr "Definición de Servidor" #~ msgid "Backup server" #~ msgstr "Servidor de Backup" #~ msgid "Click below to test." #~ msgstr "Haga clic debajo para testear." #~ msgid "Scheduling configuration" #~ msgstr "Config. de Planificación" #~ msgid "New Feed URL" #~ msgstr "URL de la fuente RSS" #~ msgid "Email Account Settings" #~ msgstr "Ajustes de E-Mail" #~ msgid "Send notifications to Growl" #~ msgstr "Enviar notificaciones a Growl" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Enviar notificaciones a NotifyOSD" #~ msgid "User-defined categories" #~ msgstr "Categorías definidas por el usuario" #~ msgid "Defines post-processing and storage." #~ msgstr "Define tareas de post-procesado y el almacenamiento." #~ msgid "Groups / Indexer tags" #~ msgstr "Grupos / Etiquetas del indizador" #~ msgid "Sorting configuration" #~ msgstr "Preferencias de ordenación" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Habilitar ordenación y renombrado de episodios." #~ msgid "Generic Sorting" #~ msgstr "Ordenado Genérico" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Habilitar ordenado y renombrado genérico de los ficheros." #~ 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." #~ msgid "Set Pause Interval" #~ msgstr "Ajustar Intervalo de Parada" #~ msgid "Pause Interval" #~ msgstr "Intervalo de Parada" #~ msgid "Pause for 12 hours" #~ msgstr "Pausar 12 horas" #~ msgid "Pause for 24 hours" #~ msgstr "Pausar 24 horas" #~ msgid "Plush Options" #~ msgstr "Opciones de Plush" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Subir: .nzb .rar .zip .gz" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Leer Fuente recogerá los contenidos actuales de la fuente. " #~ "Forzar Descarga para descargar ahora cualquier NZB " #~ "coincidente." #~ msgid "Hour:Min" #~ msgstr "Hora:Minuto" #~ msgid "Delete Completed" #~ msgstr "Eliminar completados" #~ msgid "Delete the all failed items from the history?" #~ msgstr "¿eliminar los elementos fallidos del historial?" #~ msgid "Delete Failed" #~ msgstr "Eliminar Fallidos" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Mostrando %s a %sde %s resultados" #~ msgid "No results" #~ msgstr "Sin resultados" #~ msgid "Showing one result" #~ msgstr "Mostrando un resultado" #~ msgid "Email Sent!" #~ msgstr "¡Email enviado!" #~ msgid "Saved" #~ msgstr "Guardado" #~ msgid "Toggle Add NZB" #~ msgstr "Activar-desactivar Añadir NZB" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "¿Seguro que desea reiniciar SABnzbd?" #~ msgid "Hide Edit Options" #~ msgstr "Ocultar opciones de edición" #~ msgid "Show Edit Options" #~ msgstr "Mostrar opciones de edición" #~ msgid "Timeleft" #~ msgstr "TiempoRestante" #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "Quiero que SABnzbd sea visible para cualquier ordenador en mi red." #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Quiero que SABnzbd sólo sea visible desde este ordenador." #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Proteger el acceso a SABnzbd con contraseña (recomendado)" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Habilitar HTTPS para acceder a SABnzbd." #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "" #~ "Lanzar mi navegador de interner con la página de SABnzbd al arrancar el " #~ "programa." #~ msgid "Please enter a whole number." #~ msgstr "Por favor introduzca un número completo." #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Después de que se reinicie SABnzbd, podrás acceder a él en la siguiente " #~ "dirección: %s" #~ msgid "Step One" #~ msgstr "Primer Paso" #~ msgid "Step Two" #~ msgstr "Segundo Paso" #~ msgid "Step Three" #~ msgstr "Tercer Paso" #~ msgid "Step Four" #~ msgstr "Cuarto Paso" #~ msgid "Step Five" #~ msgstr "Quinto Paso" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "P.ej. 119 ó 563 si es SSL" #~ msgid "Open Source URL" #~ msgstr "Abrir URL Fuente" #~ msgid "DualView1" #~ msgstr "Vista Dual 1" #~ msgid "DualView2" #~ msgstr "Vista Dual 2" #~ msgid "Left" #~ msgstr "Restante" #~ msgid "Notification classes" #~ msgstr "Clases de notificación" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "" #~ "Activar clases de mensajes que deben notificarse (ninguno, uno o múltiples)" #~ msgid "Send notifications to Notification Center" #~ msgstr "Envía notificaciones al Centro de Notificación" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "AVISO: Abortadeo el trabajo \"%s\" por un archivo RAR cifrado" #~ msgid "No email templates found" #~ msgstr "No se encontraron plantillas de correo electrónico" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "" #~ "Enviar resultados de la validación calculados automáticamente descargas " #~ "hasta indexador ." #~ msgid "Automatic Feedback" #~ msgstr "Regeneración automática" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Esta clave proporciona identidad al indexador . Consulte " #~ "https://www.oznzb.com/profile ." #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Funcionalidad mejorada incluyendo calificaciones e información de estado " #~ "adicional está disponible cuando se conecta a OZnzb indexador ." #~ msgid "Enable OZnzb Integration" #~ msgstr "Habilitar Integración OZnzb" #~ msgid "Site API Key" #~ msgstr "Clave API del sitio" sabnzbd-develop/po/main/pt_BR.po0000600000175000017500000043152613642116632014660 0ustar jpjp# Brazilian Portuguese translation for sabnzbd # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2018-02-14 14:16+0000\n" "Last-Translator: Safihre \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:03+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Falha ao iniciar a interface web" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "" "Não foi possível encontrar o template web: %s. Tentando o template padrão" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "aplicativo par2... NÃO encontrado!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "Sua versão UNRAR é %s, nós recomendamos a versão %s ou superior.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "aplicativo unrar... NÃO encontrado!" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "aplicativo unzip... NÃO encontrado!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "aplicativo 7za... NÃO encontrado!" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Esteja ciente de que o nome de host 0.0.0.0 vai precisar de um endereço IPv6 " "para acesso externo" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "Portas HTTP e HTTPS não podem ser iguais" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "HTTPS desabilitado pela falta de arquivos CERT e KEY" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Falha ao iniciar a interface web " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "Não foi possível localizar o serviço SABHelper" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s iniciado" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Alerta" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Erro" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "Encerramento do SABnzbd concluído" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "O nome do host não foi definido." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "Não há conexões definidas. Por favor, defina pelo menos uma conexão." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Senha mascarada em ******, digite novamente" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Detalhes inválidos do servidor" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "" "Tempo esgotado: Tente habilitar o SSL ou conectar em uma porta diferente." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Tempo esgotado" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Endereço do servidor inválido." #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Servidor parou durante a sequência de login." #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Servidor requer usuário e senha." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Conexão com Sucesso!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Falha de autenticação, verifique usuário / senha." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "Excesso de conexões, por favor pause o download ou tente novamente mais tarde" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Não foi possível determinar o resultado da conexão (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Sinal %s encontrado. Salvando e saindo..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Erro fatal ao salvar estado" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Tentando obter NZB de %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Falha ao salvar %s" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Não é possível criar um arquivo temporário para %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Tentando definir o status do servidor inexistente %s" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Falha em tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Falha ao carregar %s" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "E-mail enviado com sucesso" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Notificação de teste" #: sabnzbd/api.py msgid " Resolving address" msgstr " Resolvendo endereço" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Padrão" #: sabnzbd/api.py msgid "unknown" msgstr "desconhecido" #: sabnzbd/api.py [Error message] 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" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Erro de disco na criação do arquivo %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Erro fatal no Assembler" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Cancelado, criptografia detectada" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "ATENÇÃO: Extensão indesejada no arquivo RAR em \"%s\". O arquivo não " "desejado é %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "A extensão indesejada está no arquivo rar %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Cancelado, extensão indesejada detectada" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "ATENÇÃO: Tarefa \"%s\" em pausa em razão de pontuação (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "ATENÇÃO: Tarefa \"%s\" interrompida em razão de pontuação (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Interrompido, filtro de pontuação encontrado (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "faltando %s" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "vídeo" #: sabnzbd/assembler.py msgid "audio" msgstr "áudio" #: sabnzbd/assembler.py msgid "spam" msgstr "spam" #: sabnzbd/assembler.py msgid "passworded" msgstr "protegido por senha" #: sabnzbd/assembler.py msgid "downvoted" msgstr "votos negativos recebido" #: sabnzbd/assembler.py msgid "keywords" msgstr "palavras chave" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Quota esgotada, pausando o download" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s não é um endereço de e-mail válido" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Endereço do servidor necessário" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Não foi possível criar %s pasta %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Não é possível gravar no arquivo INI %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Não é possível criar um arquivo de backup para %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Senha %s codificada incorretamente" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s não é um valor octal correto" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "O caminho UNC \"%s\" não é permitido aqui" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Erro: Tamanho do caminho deve ser menor que %s." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Erro: A fila não está vazia. Não será possível mudar de pasta." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" "Não é possível gravar os dados de histórico, verifique as permissões de " "acesso!" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "Dados de histórico danificados, criado um substituto vazio" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "O comando 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" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Registro inválido de etapa no histórico para %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Falha ao decodificar %s" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Artigo yEnc mal formado em %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Erro desconhecido ao decodificar %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => faltando em todos os servidores. Descartando" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Concluído" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "Descompactados %s arquivos/pastas em %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [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] msgid "Error while adding %s, removing" msgstr "Erro ao adicionar %s. Removendo" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Erro ao remover %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Não é possível ler a Pasta de Assistidos %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Continuar" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "Pausado" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Você deve definir a largura de banda máxima antes de definir um limite de " "banda" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Não é possível conectar ao servidor %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Nome de servidor não encontrado" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "O servidor %s será ignorado por %s minutos" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Falha ao iniciar %s@%s devido as seguintes razões: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "Excesso de conexões ao servidor %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Provável compartilhamento de conta" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Falha de logon ao servidor %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "A conexão a %s@%s falhou. Mensagem=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Servidor %s requer usuário/senha" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Erro suspeito no downloader" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Encerrando" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Falha ao conectar ao servidor de e-mail" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "Falha ao iniciar a conexão TLS" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "O servidor não respondeu propriamente a chamada de reconhecimento" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Falha ao autenticar com o servidor de e-mail" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Nenhum método de autenticação apropriado foi encontrado" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Falha de autenticação desconhecida no servidor de e-mail" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Falha ao enviar o e-mail" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Falha ao fechar a conexão de e-mail" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Nenhum destinário fornecido, e-mail não enviado" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "Para: %s\n" "De: %s\n" "Data: %s\n" "Assunto: SABnzbd informa Disco Cheio\n" "\n" "Olá,\n" "\n" "SABnzbd parou de baixar porque o disco está quase cheio.\n" "Por favor, arrume espaço e continue SABnzbd manualmente.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Não é possível criar a pasta %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "pasta %s: %s erro de acesso" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Não é possível alterar permissões de %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Falha ao criar (%s)" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Falha ao mover %s para %s" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Faltando chave de sessão" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Erro: chave de sessão obrigatória" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Erro: chave de sessão incorreta" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "Chave de API faltando. Por favor insira a chave de API de Configuração-" ">Geral em seu programa de terceiros:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "Chave de API incorreta. Use a chave de API de Configuração->Geral em seu " "programa de terceiros:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Autenticação faltando. Por favor insira usuário/senha de Configuração->Geral " "em seu programa de terceiros:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Teste a nossa nova skin Glitter! Novo design otimizado para desktop e " "aparelhos móveis. Vá em Configurações -> Geral para mudar a sua skin" #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
Encerramento do SABnzbd concluído.
Espere cerca de 5 " "segundos e, em seguida, clique no botão abaixo.

Atualizar
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Atenção: LOCALHOST é ambíguo, use endereço IP numérico." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "Endereço de servidor \"%s:%s\" não é válido." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Feed" #: sabnzbd/interface.py msgid "Daily" msgstr "Diariamente" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "segunda-feira" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "terça-feira" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "quarta-feira" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "quinta-feira" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "sexta-feira" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "sábado" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "domingo" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "desligado" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Servidor não definido!" #: 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 msgid "Back" msgstr "Voltar" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "ERRO:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Valor incorreto para %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "d" #: sabnzbd/misc.py msgid "h" msgstr "h" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Erro ao criar chave SSL e certificado" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Executando script" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "O pós-processamento foi cancelado (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Script" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Aninhamento de descompactação com muitos níveis [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Unindo" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Sequência de arquivos multiparte incompleta" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "A união de arquivos de %s falhou" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Erro \"%s\" na união de arquivos" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Erro \"%s\" ao executar file_join em %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] Unidos %s arquivos" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "A descompactação falhou. %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Erro \"%s\" ao descompactar os arquivos RAR" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Erro \"%s\" ao executar rar_unpack em %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "A exclusão de %s falhou!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Tentando descompactar com a senha \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "A descompactação falhou. O arquivo exige uma senha" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Descompactando" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Descompactar" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "A descompactação falhou. Não foi possível encontrar %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "ERRO: Não foi possível encontrar \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "A descompactação falhou. Erro de CRC" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "ERRO: CRC falhou em \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "A descompactação falhou. Erro de escrita ou disco cheio?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "ERRO: erro de escrita (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Descompactação falhou, o caminho é muito extenso" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "ERRO: caminho muito extenso (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Arquivo RAR inutilizável" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s arquivos em %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Erro \"%s\" ao executar unzip() em %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Testando 7zip com a senha \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "O arquivo 7ZIP \"%s\" está incompleto, impossível descompactar" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Não foi possível descompactar %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Verificação Rápida" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Reparar" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Verificação Rápida OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Iniciando reparação" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Reparação falhou, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Erro %s ao executar par2_repair no conjunto %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Erro \"%s\" ao executar par2_repair no conjunto %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2 recebeu opções incorretas. Verifique em Configuração->Opções" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Verificado em %s. Todos os arquivos corretos" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Verificado em %s. É necessário reparar" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Obtendo %s blocos..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Obtendo" #: 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 msgid "Repairing" msgstr "Reparando" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Reparado em %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Disco cheio" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Verificando" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Verificando" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Este servidor não permite SSL nesta porta" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Inicialização/Encerramento" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "NZB Adicionado" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Pós-processamento iniciado" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Tarefa concluída" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Tarefa com falha" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Fila concluída" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Outras Mensagens" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "Não disponível" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Falha ao enviar mensagem Prowl" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Resposta incorreta do Pushover (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "Falha ao enviar mensagem pushover" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Resposta incorreta do Pushbullet (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Falha ao enviar mensagem pushbullet" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Falha ao importar %s arquivos de %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Encontrado arquivo de fila incompatível. Não é possível continuar" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Erro ao carregar %s. Arquivo corrompido detectado" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB adicionado à fila" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Codificação desconhecida" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Arquivo NZB incompleto %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Arquivo NZB %s inválido. Pulando (razão=%s, linha=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Arquivo NZB %s vazio" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Ignorando NZB duplicado \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Pausando NZB duplicado \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Cancelado, não é possível concluir" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DUPLICADO" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "CRIPTOGRAFADO" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "MUITO GRANDE" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "INCOMPLETO" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "INDESEJADO" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "FILTRADO" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "Espere %s segundo(s)" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Baixado em %s a uma média de %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Idade" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s artigos estavam malformados" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s artigos estavam faltando" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s artigos tinham duplicatas não-correspondentes" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s artigos foram removidos" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Erro ao importar %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Alertas" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Inativo" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Configuração" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Fila" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Limpar Fila" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Histórico" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Limpar Histórico" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Limitar Velocidade" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Pausar" #: sabnzbd/osxmenu.py msgid "min." msgstr "min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Continuar" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Varrer pasta de assistidos" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Ler todos os feeds RSS" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Pasta de Finalizados" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Pasta de Não-Finalizados" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Resolução de problemas" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Reiniciar" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Reinicie sem login" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Sair" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Fila dos primeiros 10 items" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Esvaziar" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Histórico dos últimos 10 items" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Nova versão disponível" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Ir para o assistente" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Parando..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Problema com" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd precisa de uma porta tcp/ip livre para seu servidor web " "interno.
\n" " A porta %s em %s foi tentada, mas não está disponível.
\n" " Algum outro software usa a porta ou o SABnzbd já está rodando.
\n" "
\n" " Por favor reinicie o SABnzbd com um número de porta diferente." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "" "Se você receber esta mensagem de erro outra vez, tente um número " "diferente.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd precisa de um endereço de host válido para seu servidor web " "interno.
\n" " Você especificou um endereço inválido.
\n" " Valores seguros são localhost e 0.0.0.0
\n" "
\n" " Por favor reinicie o SABnzbd com um endereço de host correto." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd detectou dados salvos de outra versão do SABnzbd
\n" " mas não pode reutilizar os dados do outro programa.

\n" " Você pode querer terminar sua fila antes com o outro programa.

\n" " Após isso inicie este programa com a opção \"--clean\".
\n" " Isto irá apagar a fila atual e histórico!
\n" " SABnzbd leu o arquivo \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd não pode encontrar seus arquivos da interface web em %s.
\n" " Por favor instale o programa novamente.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd detectou um erro fatal:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd detectou que o arquivo sqlite3.dll está faltando.

\n" " Alguns anti-vírus mal projetados removem este arquivo.
\n" " Por favor, verifique o seu anti-vírus, tente reinstalar o SABnzbd e " "reclame com o seu fornecedor de anti-vírus.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Aperte a tecla Windows+R e digite a linha (exemplo):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Abra uma janela de terminal e digite a linha (exemplo):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "O programa não iniciou!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "Erro fatal" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Não é possível iniciar o navegador. Provavelmente não foi encontrado" #: sabnzbd/panic.py msgid "Access denied" msgstr "Acesso negado" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Erro %s: Você precisa fornecer um nome de usuário e senha válidos." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "" "Fila antiga detectada, use \"Situação -> Reparação da fila\" para converter " "a fila" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" msgstr "" #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "" "O download pode falhar. Somente %s de %s necessários estão disponíveis" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "O download falhou - Não está em seu(s) servidor(s)" #: sabnzbd/postproc.py msgid "Moving" msgstr "Movendo" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "Enviados %s para a fila" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Erro ao renomear \"%s\" para \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Falha ao mover arquivos" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Executando script de usuário %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "%s executado" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Código de saída do script é %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Mais" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "O pós-processamento falhou para %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "veja o arquivo de log" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "O download falhou" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "A limpeza de %s falhou." #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Download concluído" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Não é possível criar a pasta final %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Pós-processamento" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Nenhum conjunto par2" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Tentando verificação SFV" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Alguns arquivos falharam na verificação de \"%s\"" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Verificado com sucesso. Usando arquivos SFV." #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "com senha" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "A remoção de %s falhou" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Falha ao hibernar o sistema" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Falha ao colocar o sistema em espera" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Erro ao desligar o sistema" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Indexador id (%s) não foi encontrador para avaliar arquivos" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Endereço do servidor" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "Chave API" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Descrição de feed RSS incorreta \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Falha ao obter RSS de %s: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Não há autenticação válida para o feed %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "" "Erro do servidor (código do servidor %s); não foi possível obter %s de %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Servidor %s usa um certificado HTTPS não confiável" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "O feed RSS %s estava vazio" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Feed incompatível" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Entrada RSS vazia encontrada (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Exibir interface" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Abrir pasta de finalizados" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Pausa de" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Pausar por 5 minutos" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Pausar por 15 minutos" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Pausar por 30 minutos" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Pausar por 1 hora" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Pausar por 3 horas" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Pausar por 6 horas" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Encerrar" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Restante" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Adicionar NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Agendamento %s incorreto em %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Ação desconhecida: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Agendamento para um servidor inexistente %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Download" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Unir arquivos" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Código fonte" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Servidores" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Falha" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Falhou" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Aguardando" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Reparando..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Extraindo..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Movendo..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Executando script..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Obtendo blocos extras..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Verificação Rápida..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Verificando..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Baixando" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Tarefa" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "desativar o servidor" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "ativar o servidor" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Limite de velocidade" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Pausar Todos" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Pausar o pós-processamento" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Continuar o pós-processamento" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Ler feeds RSS" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Remover tarefas com falha" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Remover trabalhos encerrados" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Pausa tarefas de baixa prioridade" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Pausa tarefas de prioridade normal" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Pausa tarefas de alta prioridade" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Continua tarefas de baixa prioridade" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Continua tarefas de prioridade normal" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Continua tarefas de alta prioridade" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Ativar gerenciamento de cota" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Desligado" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Muito Baixa" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Moderada" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normal" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Alta" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Emergencial" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Baixa" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "hora" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "horas" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "min" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "min" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "seg" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "segundos" #: sabnzbd/skintext.py msgid "day" msgstr "dia" #: sabnzbd/skintext.py msgid "days" msgstr "dias" #: sabnzbd/skintext.py msgid "week" msgstr "semana" #: sabnzbd/skintext.py msgid "Month" msgstr "Mês" #: sabnzbd/skintext.py msgid "Year" msgstr "Ano" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Dia do mês" #: sabnzbd/skintext.py msgid "This week" msgstr "Esta semana" #: sabnzbd/skintext.py msgid "This month" msgstr "Este mês" #: sabnzbd/skintext.py msgid "Today" msgstr "Hoje" #: sabnzbd/skintext.py msgid "Total" msgstr "Total" #: sabnzbd/skintext.py msgid "on" msgstr "ligado" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parâmetros:" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Versão do Python" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Página inicial" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "ou" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Host" #: sabnzbd/skintext.py msgid "Comment" msgstr "Comentário" #: sabnzbd/skintext.py msgid "Send" msgstr "Enviar" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Cancelar" #: sabnzbd/skintext.py msgid "Other" msgstr "Outros" #: sabnzbd/skintext.py msgid "Report" msgstr "Informar" #: sabnzbd/skintext.py msgid "Video" msgstr "Vídeo" #: sabnzbd/skintext.py msgid "Audio" msgstr "Ãudio" #: sabnzbd/skintext.py msgid "Not used" msgstr "Não utilizado" #: sabnzbd/skintext.py msgid "or less" msgstr "ou menos" #: sabnzbd/skintext.py msgid "Log in" msgstr "" #: sabnzbd/skintext.py msgid "Log out" msgstr "" #: sabnzbd/skintext.py msgid "Remember me" msgstr "" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "A ferramenta de download automático da usenet" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Gravar" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Salvando..." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Você tem certeza?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Excluir todos os arquivos baixados?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Início" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Configuração" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Situação" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Ajuda" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Fórum" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Gerais" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Pastas" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Opções" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Agendamento" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Notificações" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "E-mail" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Categorias" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Ordenação" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Especial" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Busca" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Pasta de Download" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "EM PAUSA" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "%s artigos em cache (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Carga do sistema" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Nova versão %s disponível em" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Tem certeza de que quer encerrar o SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Adicionar" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Adicionar Arquivo" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Categoria" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Processamento" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Prioridade" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Reparar" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Descompactar" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Excluir" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "U" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "D" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Forçar" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Parar" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "Digite a URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "Ao terminar a fila" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Desligar o PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "PC em espera" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Hibernar o PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Encerrar o SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Limite de velocidade" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Ordem" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Nome" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "Estimado" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "IDADE" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Apagar" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Repetir" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Ações" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Scripts" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Eliminar todos os itens da fila?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Limpar NZBs" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Limpar NZBs & Excluir Arquivos" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Atualizar todos os trabalhos com falha" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Remover NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Remover NZB & Excluir Arquivos" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "de" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Artigos faltando" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Quota restante" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "manual" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Redefinir Quota agora" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Eliminar do histórico todos os itens concluídos?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Ocultar detalhes" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Mostrar detalhes" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Mostrar Falhados" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Mostrar Todos" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Tamanho" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Limpar NZBs Falhados" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Limpar NZBs Falhados & Excluir Arquivos" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Limpar NZBs Terminados" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "NZB Suplementar Opcional" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Caminho" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Atualizar todos com falha" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Atualizar todos" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Fora da retenção" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Outro problema" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Forçar Desconexão" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Isto irá enviar um e-mail de teste para sua conta." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Mostrar Logs" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Testar E-mail" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Logs" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Erros/Avisos" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Info" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Debug" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Conexões" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Últimos Alertas" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "limpar" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Desbloquear" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Identificador de artigo" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Conjunto de arquivos" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Quando" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Tipo" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Ativo" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Painel de controle" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Conexão falhou!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Enderaço IPv4 local" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Endereço IPv4 público" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "Endereço IPv6" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Nome do servidor / DNS Lookup" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "Modelo da CPU" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Performance do Sistema (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Velocidade de download da pasta" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Completar velocidade da pasta" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Velocidade de escrita" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "" "Não foi possível escrever. Verifique se o diretória tem permissão de escrita." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Clique no botão de Repetir abaixo para determinar" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Repetir teste" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "Arquivo de Configuração" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Cache utilizado" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Isto irá reiniciar o SABnzbd.
Use-o quando você achar que o programa " "tem um problema de estabilidade.
Os downloads serão pausados antes de " "reiniciar e retomados depois." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Existem tarefas órfãs na pasta de downloads.
Você pode optar por excluí-" "las (incluindo arquivos) ou enviá-las de volta para a fila." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "O botão \"Reparar\" irá reiniciar o SABnzbd e fazer uma reconstrução
completa do conteúdo da fila, preservando arquivos já baixados.
Isto " "modificará a ordem da fila." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "As alterações não foram salvas e serão perdidas." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Habilitar Unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "Ativar 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "Versão" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Tempo ativo" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Backup" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Leia a sessão ajuda no Wiki sobre isso!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Reiniciando SABnzbd..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Mudanças exigirão um reinício do SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "Servidor Web do SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "Host do SABnzbd" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Computador onde o SABnzbd ficará ativo." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "Porta do SABnzbd" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Porta onde o SABnzbd será ativado." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Interface Web" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Escolha uma skin." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "Usuário do SABnzbd" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Usuário de autenticação opcional." #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "Senha do SABnzbd" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "Habilitar HTTPS" #: sabnzbd/skintext.py msgid "not installed" msgstr "não instalado" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Ativar acesso à interface por um endereço HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "Porta HTTPS" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Se estiver vazio, a porta padrão só irá funcionar com HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "Certificado HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Nome do arquivo ou caminho para o certificado HTTPS." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "Chave HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Nome do arquivo ou caminho para a chave HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "Cadeia de Certificados HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Nome de arquivo ou caminho da Cadeia HTTPS." #: sabnzbd/skintext.py msgid "Tuning" msgstr "Ajustes finos" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "Intervalo de verificação de RSS" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Intervalo de verificação (em minutos, ao menos 15). Inativo quando você usar " "o Agendador!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Velocidade máxima da linha" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Percentual de velocidade da linha" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "" "Qual percentual de velocidade da linha o SABnzbd deve utilizar, por exemplo, " "50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Limite de Cache de Artigos" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Manter artigos em memória para reduzir o acesso a disco.
Em bytes, " "opcionalmente seguido de K,M,G. Por exemplo: \"64M\" ou \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Lista de Limpeza" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Lista de extensões de arquivo que devem ser excluídos após o download.
Por exemplo: nfo ou nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Salvar Alterações" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "" #: sabnzbd/skintext.py msgid "Reset" msgstr "Reiniciar" #: sabnzbd/skintext.py msgid "Language" msgstr "Idioma" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Selecione um idioma para a interface web." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "Esta chave dará a programas de terceiros pleno acesso ao SABnzbd." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "Chave NZB" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Esta chave permitirá que programas de terceiros adicionem NZBs ao SABnzbd." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Gerar Nova Chave" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "API Key QR Code" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Lista de intervalos de rede local" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Todas os endereços da rede local começam com esse prefixo (geralmente " "\"192.168.1.\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Acesso externo da Internet" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "Sem acesso" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Adicionar arquivos NZB " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (sem Configuração)" #: sabnzbd/skintext.py msgid "Full API" msgstr "API completa" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Interface Web completa" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "NOTA: Pastas serão criadas automaticamente ao salvar. Você pode " "usar caminhos absolutos para salvar fora das pastas padrão." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Usar Pastas" #: sabnzbd/skintext.py msgid "Browse" msgstr "Navegar" #: sabnzbd/skintext.py msgid "In" msgstr "Em" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Pasta Temporária de Downloads" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Local para armazenar downloads não processados.
Só pode ser alterado " "quando a fila estiver vazia." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Espaço livre mínimo para a pasta temporária de downloads" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Pausar automaticamente quando o espaço livre estiver abaixo deste valor.
Em bytes, opcionalmente seguido de K,M,G,T. Por exemplo: \"800M\" ou " "\"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Pasta de Downloads Concluídos" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Local para armazenar downloads concluídos, totalmente processados​​.
Pode ser anulado por categorias definidas pelo usuário." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Permissões para downloads concluídos" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Definir padrão de permissões para arquivos/pastas concluídos.
Em " "notação octal. Por exemplo: \"755\" ou \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Pasta de Assistidos" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Pasta para monitorar por arquivos .nzb.
Também procura arquivos .nzb " "em arquivos .zip, .rar e .tar.gz." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Velocidade de Varredura na Pasta de Assistidos" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Quantidade de segundos entre as varreduras de arquivos .nzb." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Pasta de Modelos de E-mail" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Pasta contendo modelos de e-mail definidos pelo usuário" #: sabnzbd/skintext.py msgid "Password file" msgstr "Arquivo de senhas" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Arquivo contendo todas as senhas que serão testadas em arquivos RAR " "criptografados." #: sabnzbd/skintext.py msgid "System Folders" msgstr "Pastas de Sistema" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Pasta Administrativa" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Localização do banco de dados de histórico e administrador de fila.
Só pode ser alterado quando a fila estiver vazia." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Dados não serão movidos. Será necessário reiniciar o SABnzbd!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Pasta de Log" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Local dos arquivos de log do SABnzbd.
Será necessário reiniciar o " "SABnzbd!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "Pasta de Backup de .nzb" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Local onde os arquivos .nzb serão armazenados." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Pasta Inicial Padrão" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Baixar todos os arquivos PAR2" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Ativa descompactação recursiva" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Descompacta os arquivos (rar, zip, 7z) dentro de arquivos." #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Ignorar qualquer pasta arquivada" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Todos os arquivos irão em uma única pasta." #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Apenas Obter Artigos para o Topo da Fila" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Ative para menor uso de memória. Desative para impedir que trabalhos lentos " "bloqueiem a fila." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Pós-processar apenas os trabalhos verificados" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" "Realizar pós-processamento apenas em trabalhos que passaram todas as " "verificações PAR2." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Ação quando RAR criptografado é baixado" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "Em caso de \"Pausa\", você precisa definir uma senha e retomar a tarefa." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Detectar Downloads Duplicados" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Detecta episódios duplicados em séries" #: sabnzbd/skintext.py 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 "Descartar" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Cancelar" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Ação quando extensão indesejada for detectada" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "Ação quando uma extensão indesejada é detectada em arquivos RAR" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Extensões indesejadas" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Lista todas as extensões indesejadas. Por exemplo: exe ou exe, " "com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Habilitar verificações baseadas em SFV" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Fazer uma verificação extra baseada em arquivos SFV." #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "O script do usuário pode marcar um trabalho como falho" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Quando um script do usuário retornar um código de saída diferente de zero, o " "trabalho será marcado como falho" #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "Em caso de falha, tente um NZB alternativo" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" "Alguns servidores fornecem um NZB alternativo quando um download falha." #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Habilitar renomeação de pasta" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Usar nomes temporários durante o pós-processamento. Desative quando seu " "sistema não lidar com isso corretamente." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Script de usuário de pré-fila" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Utilizado antes de um NZB entrar na fila." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Parâmetros Extras PAR2" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Parâmetros Nice" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "Parâmetros IONice" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Desconecte quando fila vazia" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "" "Desconecte do(s) servidor(es) Usenet quando a fila estiver vazia ou pausada." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Ordernar por Idade" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Classificar automaticamente os itens por (média de) idade." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Procurar por nova versão" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Checar semanalmente por nova versão do SABnzbd." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "Também versões de testes" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Substituir espaços no nome da pasta" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Substituir espaços por sublinhado no nome das pastas." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Substituir pontos no nome da pasta" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Substituir pontos por espaços no nome da pasta." #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Tornar Windows compatível" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "" "Para servidores: tenha certeza que os nomes são compatíveis com o Windows." #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Abrir navegador ao iniciar" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Abrir o navegador padrão ao iniciar o SABnzbd." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Pausar o download durante o pós-processamento." #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Pausar o download no início do pós-processamento e retomar quando concluído." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Ignorar amostras" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Exclui arquivos de amostra. Exemplo: amostras de vídeo." #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Excluir após download" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" #: sabnzbd/skintext.py msgid "Server" msgstr "Servidor" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Pós-processamento" #: sabnzbd/skintext.py msgid "Naming" msgstr "Nomeando" #: sabnzbd/skintext.py msgid "Quota" msgstr "Quota" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indexação" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Quanto pode ser baixado neste mês (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Primeiro dia do ciclo" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "Em que dia do mês ou da semana (1 = segunda-feira) seu provedor de Internet " "redefine sua quota? (Opcionalmente com hh: mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Retomar automaticamente" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "O download deve retomar quando a quota for restabelecida?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Período da quota" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "A quota é restabelecida a cada dia, semana ou mês?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Verifique antes de baixar" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Tentar prever a conclusão bem sucedida de um futuro download? (lento!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "Máximo de tentativas" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Número máximo de tentativas por servidor." #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Cancela tarefas que não podem ser concluídas" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Quando durante o download ficar claro que muitos dados estão faltando, " "cancela a tarefa" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Habilitar filtros" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Ação faz o download de acordo com as regras de filtro" #: sabnzbd/skintext.py msgid "Abort If" msgstr "Interrompa se" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Ou então pause se" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Pontuação do vídeo" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Pontuação do áudio" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spam" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Confirmado" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Mais votos negativos do que positivos" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Palavras chave do título" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Lista separada por vírgulas" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Útil se um newsserver tem mais de um endereço IPv4/IPv6" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Adicionar Servidor" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Descrição do servidor" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Porta" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Usuário" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Senha" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Tempo limite" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Tempo de retenção" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "Desativado" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 é a prioridade mais alta, 99 é a prioridade mais baixa" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Opcional" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Habilitar" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Remover servidor" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Testar Servidor" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Limpar Contadores" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Testando detalhes do servidor..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Largura de banda" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Enviar Grupo" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Enviar comando do grupo antes de solicitar artigos." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Notas pessoais" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Adicionar Agendamento" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Frequência" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Ação" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Parâmetros" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Agendamentos Atuais" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "A caixa de seleção ao lado do nome do feed deve ser assinalada para que o " "feed seja ativado e automaticamente verificado por novos itens.
Quando " "um feed é adicionado, ele só vai pegar novos itens e não algo que já esteja " "no feed RSS a menos que você pressione \"Forçar Download\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Ler Feed" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Forçar Download" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filtro" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Aceitar" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Recusar" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Requer" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "RequiresCat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "No mínimo" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "No máximo" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "De SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Correspondido" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Não Encontrado" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Baixados" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Ler Todos os Feeds Agora" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Notificar por e-mail na conclusão da tarefa" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Nunca" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Sempre" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Somente para erros" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Notificações de Disco Cheio" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "" "Enviar e-mail quando o disco estiver cheio e SABnzbd estiver pausado." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Enviar notificações RSS" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "Enviar e-mail quando um feed RSS adicionar tarefas à fila." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "Servidor SMTP" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Define o servidor para envio de e-mails." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Destinatário do E-mail" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "Endereço de e-mail para receber os e-mails." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "E-mail do Remetente" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Quem devemos dizer que enviou o e-mail?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "Nome de usuário OPCIONAL da conta" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Nome da conta, para e-mails com autenticação." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "Senha OPCIONAL da conta" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Senha, para e-mails com autenticação." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Notificação Enviada!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Habilitar Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Utilize apenas para servidor remoto Growl (host: porta)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Senha do servidor" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Senha opcional para o servidor Growl" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "Habilitar NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Centro de Notificações" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Habilitar notificações Windows" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Notificações Windows" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Ativar notificações Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Requer uma conta Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "Chave API para Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Chave API pessoal para Prowl (obrigatório)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Habilitar notificações Pushover" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Necessário uma conta Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Token da aplicação" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Token da aplicação (obrigatório)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Chave do usuário" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Chave do usuário (obrigatório)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Dispositivo(s)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Habilitar notificações Pushbullet" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Necessária uma conta Pushbullet" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Chave API pessoal" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Chave Pushbullet API pessoal (necessária)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Dispositivo" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Dispositivo para qual a mensagem deve ser enviada" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Para evitar a criação de pastas de trabalho, adicione um asterisco (*) " "depois do caminho." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Caminho base das pastas relativas" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Pasta/Caminho" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Ordenação de Séries" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Ativar a ordenação de TV" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Modelo do padrão" #: sabnzbd/skintext.py msgid "Clear" msgstr "Limpar" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "Predefinições" #: sabnzbd/skintext.py msgid "Example" msgstr "Exemplo" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Ativar a ordenação de filmes" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Manter em pastas separadas os downloads soltos" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Categorias Afetadas" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Significado" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Modelo" #: sabnzbd/skintext.py msgid "Result" msgstr "Resultado" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Pasta Da Temporada" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Pasta Da Temporada" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Pasta Do Episódio" #: sabnzbd/skintext.py 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" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Nome Filme" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Nome.Filme" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Nome_Filme" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Nome do Show" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Nome.do.Show" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Nome_do_Show" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Número da Temporada" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Número do Episódio" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Nome do Episódio" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Nome.Episódio" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Nome_Episódio" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Extensão do arquivo" #: sabnzbd/skintext.py msgid "Extension" msgstr "Extensão" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Número do Episódio" #: sabnzbd/skintext.py msgid "Decade" msgstr "Década" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Nome do arquivo original" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Minúsculas" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEXTO" #: sabnzbd/skintext.py msgid "text" msgstr "texto" #: sabnzbd/skintext.py msgid "file" msgstr "arquivo" #: sabnzbd/skintext.py msgid "Sort String" msgstr "String de ordenação" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Rótulo multi-parte" #: sabnzbd/skintext.py msgid "In folders" msgstr "Em pastas" #: sabnzbd/skintext.py msgid "No folders" msgstr "Sem pastas" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Ordenação por data" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Ativar a ordenação por data" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Pasta do Nome do Show" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "Pastas Ano-Mês" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Pastas Diárias" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "ajuste de maiúsculas" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Resultado Processado" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Opções raramente utilizadas. Para seu significado e explicação, clique no " "botão Ajuda para ir para a página Wiki.
Não altere estas sem checar o " "Wiki em primeiro lugar, já que algumas têm sérios efeitos colaterais.
Os " "valores padrão estão entre parênteses." #: sabnzbd/skintext.py msgid "Values" msgstr "Valores" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Editar Detalhes do NZB" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Eliminar" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Topo" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Para cima" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Para baixo" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Base" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Todos" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Inverter" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Nome do arquivo" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Assunto" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Seleção" #: sabnzbd/skintext.py msgid "left" msgstr "restantes" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Espaço Disponível" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Pasta temporária" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Multi-Operações" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Segure a tecla shift para selecionar um intervalo" #: sabnzbd/skintext.py msgid "Check all" msgstr "Selecionar todos" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Reiniciar SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Estado e opções de interface" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Ou arraste e solte arquivos na janela!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Conexão perdida com SABnzbd.." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Taxa de atualização" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Usar configurações globais de interface" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Limite de itens na fila" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Limite de itens no histórico" #: sabnzbd/skintext.py msgid "Date format" msgstr "Formato da data" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Coluna extra da fila" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "" #: sabnzbd/skintext.py msgid "page" msgstr "página" #: sabnzbd/skintext.py msgid "Loading" msgstr "Carregando" #: sabnzbd/skintext.py msgid "articles" msgstr "artigos" #: sabnzbd/skintext.py msgid "Rename" msgstr "Renomear" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Reparação da fila" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Exibir conexões ativas" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Trabalhos órfãos" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Enviar de volta para a fila" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Excluir Todos" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Repetir todos" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Buscar NZB de uma URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "Enviar NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Opcionalmente, especifique um nome de arquivo" #: sabnzbd/skintext.py msgid "Submit" msgstr "Enviar" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Abrir URL Informativa" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Enviado. Obrigado!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Nada selecionado!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Remover todos os arquivos selecionados" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Esconder/Exibir arquivos completos" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Exibir Log do Script" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Atualização Disponível!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" #: sabnzbd/skintext.py msgid "Custom" msgstr "Personalizado" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "" #: sabnzbd/skintext.py msgid "Speed" msgstr "Velocidade" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Confirmar Exclusões da Fila" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Confirmar Exclusões do Histórico" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Por quanto tempo ou até quando você quer pausar? (em Inglês!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Perdão, não conseguimos interpretar isso. Tente novamente." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Pausar por..." #: 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 Oldest→Newest" msgstr "Ordenar por Idade Mais antigo→Mais novo" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Ordenar por Idade Mais novo→Mais antigo" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Ordenar por Nome A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Ordenar por Nome Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Ordenar por Tamanho Menor→Maior" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Ordenar por Tamanho Maior→Menor" #: sabnzbd/skintext.py msgid "Uploading" msgstr "" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "" #: sabnzbd/skintext.py msgid "Removing job" msgstr "" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "" #: sabnzbd/skintext.py msgid "Prev" msgstr "Ant" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Próx" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "Limpar o Histórico?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Você deve habilitar o JavaScript para Plush funcionar!" #: sabnzbd/skintext.py msgid "Options" msgstr "Opções" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Pausar por quantos minutos?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Menu Superior" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Ao Concluir" #: sabnzbd/skintext.py msgid "Sort" msgstr "Ordenar" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Ordenar por Idade (Mais antigo→Mais novo)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Ordenar por Idade (Mais novo→Mais antigo)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Ordenar por Nome (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Ordenar por Nome (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Ordenar por Tamanho (Menor→Maior)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Ordenar por Tamanho (Maior→Menor)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "Limpar a fila?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Repetir todos os trabalhos com falha no Histórico?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Eliminar" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Velocidade Máx" #: sabnzbd/skintext.py msgid "Range" msgstr "Intervalo" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Aplicar aos Selecionados" #: sabnzbd/skintext.py msgid "Everything" msgstr "Tudo" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Taxa de Atualização" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Largura do Contêiner" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Isso irá impedir que o conteúdo seja atualizado quando o cursor do mouse " "estiver sobre a fila." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Impedir Atualizações no Foco" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Enviar" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Enviar: .nzb .rar .zip .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Progresso" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Não há espaço em disco suficiente para completar os downloads!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Disponível (Temporário)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "OCIOSO" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Downloads" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "Assistente de Início Rápido do SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "Versão do SABnzbd" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Anterior" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Detalhes do Servidor" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Por favor insira os detalhes de seu provedor de usenet primário." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "O número de conexões permitidas por seu provedor" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "Ex: 8 ou 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Selecione somente se seu provedor permitir conexões SSL." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Clique para testar os detalhes informados." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Ex." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "A configuração está completa!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd agora será executado em segundo plano." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "Fechar qualquer janela/aba do navegador NÃO vai fechar o SABnzbd." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Recomenda-se que você adicione este local como favorito para acessar o " "SABnzbd quando ele estiver sendo executado em segundo plano." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Mais ajuda pode ser encontrada em nosso" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "Ir para o SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "Sair do SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Iniciar o Assistente" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd não possui QUALQUER GARANTIA.\n" "É software livre, e você está convidado a redistribuí-lo sob certas " "condições.\n" "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] msgid "Error getting TV info (%s)" msgstr "Erro ao obter informações de TV (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "Falha ao renomear: %s para %s" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "Falha ao renomear arquivo similar: %s para %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Acesso não autorizado" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "URLGRABBER PAROU DE FUNCIONAR" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "Arquivo NZB inutilizável" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "A busca da URL falhou; %s" #~ msgid "_yenc module... NOT found!" #~ msgstr "módulo _yenc... NÃO encontrado!" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ 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
" #~ msgstr "" #~ "Sua versão do UNRAR não é recomendada. Pegue-a de " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "Error: No secondary interface defined." #~ msgstr "Erro: Nenhuma interface secundária definida." #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "" #~ "Nenhum programa UNRAR foi encontrado. Não será possível descompactar " #~ "arquivos RAR
" #~ msgid "Initiating restart...
" #~ msgstr "Fazendo o reinício...
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "" #~ "Nenhum programa PAR2 foi encontrado. Reparos não serão possíveis
" #~ msgid "Not matched" #~ msgstr "Não correspondido" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "As tarefas marcadas com um '*' não serão baixadas automaticamente." #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "A tarefa \"%s\" foi adicionada novamente à fila" #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Falha ao ler chaves de registro para pastas especiais" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Não é possível conectar à seção de registro HKEY_CURRENT_USER." #~ msgid "Downloaded so far" #~ msgstr "Baixados até agora" #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Não é possível abrir a chave de registro \"%s\"." #~ msgid "Try again" #~ msgstr "Tente novamente" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "Módulo pyOpenSSL ausente. Instale-o para obter acesso https" #~ msgid "ERROR: %s" #~ msgstr "ERRO: %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:" #~ msgid "Unpacking failed, see log" #~ msgstr "A descompactação falhou. Veja o log" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "A descompactação falhou. Um arquivo esperado não foi descompactado" #~ msgid "Error importing OpenSSL module. Connecting with NON-SSL" #~ msgstr "Erro ao importar o módulo OpenSSL. Conectando-se sem SSL" #~ msgid "File %s is empty, skipping" #~ msgstr "Arquivo %s está vazio. Pulando" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd precisa de uma porta tcp/ip livre para seu servidor web " #~ "interno.
\n" #~ " A porta %s em %s foi tentada, mas a conta usada para o SABnzbd não tem " #~ "permissão para usá-la.
\n" #~ " Nos sistemas OSX e Linux, usuários normais devem usar portas acima de " #~ "1023.
\n" #~ "
\n" #~ " Por favor reinicie o SABnzbd com um número de porta diferente." #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd não é compatível com alguns softwares de firewall.
\n" #~ " %s
\n" #~ " Lamentamos, mas não podemos resolver esta incompatibilidade no " #~ "momento.
\n" #~ " Por favor, registre uma reclamação com seu fornecedor de firewall.
\n" #~ "
\n" #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "É provável que você esteja usando o ZoneAlarm no Vista.
" #~ msgid "OK" #~ msgstr "OK" #~ msgid "You have no permisson to use port %s" #~ msgstr "Você não tem permissão para usar a porta %s" #~ msgid "No post-processing because of failed verification" #~ msgstr "Sem pós-processamento por causa de falha na verificação" #~ msgid "View script output" #~ msgstr "Ver saída do script" #~ msgid "Error removing workdir (%s)" #~ msgstr "Erro ao remover a pasta de trabalho (%s)" #~ msgid "Get NZB" #~ msgstr "Obter NZB" #~ msgid "KB/s" #~ msgstr "KB/s" #~ msgid "Queued" #~ msgstr "Na fila" #~ msgid "WARNINGS" #~ msgstr "AVISOS" #~ msgid "Complete Dir" #~ msgstr "Pasta Completados" #~ msgid "Download speed" #~ msgstr "Velocidade de download" #~ msgid "Add new downloads" #~ msgstr "Adicionar novos downloads" #~ msgid " " #~ msgstr " " #~ msgid " or Report ID" #~ msgstr " ou Report ID" #~ msgid "Sort by name" #~ msgstr "Ordenar pelo nome" #~ msgid "Sort by age" #~ msgstr "Ordenar por idade" #~ msgid "Sort by size" #~ msgstr "Ordenar por tamanho" #~ msgid "Hide files" #~ msgstr "Ocultar arquivos" #~ msgid "Show files" #~ msgstr "Exibir arquivos" #~ msgid "Remain/Total" #~ msgstr "Restante/Total" #~ msgid "History Size" #~ msgstr "Tamanho do histórico" #~ msgid "Delete all failed items from History?" #~ msgstr "Eliminar do histórico todos os itens falhados?" #~ msgid "Purge Failed History" #~ msgstr "Limpar Histórico de Falhas" #~ msgid "Show Weblogging" #~ msgstr "Mostrar Logs da Web" #~ msgid "Thread" #~ msgstr "Tópico" #~ msgid "Email Test Result" #~ msgstr "Resultado do Teste de E-mail" #~ msgid "General configuration" #~ msgstr "Configuração geral" #~ msgid "Secondary Web Interface" #~ msgstr "Interface Web Secundária" #~ msgid "Web server authentication" #~ msgstr "Autenticação do servidor web" #~ msgid "Activate an alternative skin." #~ msgstr "Ativar uma skin alternativa." #~ msgid "HTTPS Support" #~ msgstr "Suporte HTTPS" #~ msgid "Queue auto refresh interval:" #~ msgstr "Intervalo de atualização da fila:" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "" #~ "Intervalo de atualização da página da interface web da fila (em segundos, 0 " #~ "= nenhum)." #~ msgid "Folder configuration" #~ msgstr "Configuração de pasta" #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "USE POR SUA CONTA E RISCO!" #~ msgid "Disable API-key" #~ msgstr "Desabilitar Chave API" #~ msgid "Do not require the API key." #~ msgstr "Não requer a chave API." #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "Pasta contendo scripts de usuário para pós-processamento" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Pasta de Arquivos de Pós-Processamento" #~ msgid "Switches configuration" #~ msgstr "Configuração de opções" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Pular verificação par2 quando os arquivos forem 100% válidos." #~ msgid "Processing Switches" #~ msgstr "Opções de Processamento" #~ msgid "Enable Quick Check" #~ msgstr "Habilitar Verificação Rápida" #~ msgid "Enable Filejoin" #~ msgstr "Habilitar Filejoin" #~ msgid "Enable TS Joining" #~ msgstr "Habilitar União TS" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "Unir arquivos terminando em .001, .002, etc. em um arquivo." #~ msgid "Enable Par Cleanup" #~ msgstr "Habilitar Limpeza de Par" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Limpar arquivos par (se a verificação/reparo for bem sucedida)." #~ msgid "Enable Unrar" #~ msgstr "Habilitar Unrar" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "Unir arquivos terminando em .001.ts, .002.ts, etc. em um arquivo." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Falhar em erros CRC yEnc" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "" #~ "Quando o artigo possuir um erro de CRC, tentar obtê-lo de outro servidor." #~ msgid "Default Post-Processing" #~ msgstr "Pós-processamento Padrão" #~ msgid "Check result of unpacking" #~ msgstr "Verificar o resultado da descompactação" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Verificar o resultado da descompactação (precisa ficar desativado em alguns " #~ "sistemas de arquivos)." #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "" #~ "Usado quando nenhum pós-processamento estiver definido pela categoria." #~ msgid "Used when no user script is defined by the category." #~ msgstr "Usado quando nenhum script de usuário é definido pela categoria." #~ msgid "QR Code" #~ msgstr "QR Code" #~ msgid "Default User Script" #~ msgstr "Script de usuário padrão" #~ msgid "Default Priority" #~ msgstr "Prioridade Padrão" #~ msgid "Enable MultiCore Par2" #~ msgstr "Habilitar MultiCore Par2" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Utilizado quando nenhuma prioridade é definida pela categoria." #~ msgid "Other Switches" #~ msgstr "Outras Opções" #~ msgid "Do not download" #~ msgstr "Não baixar" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "Utilizar relógio com 12 horas (AM/PM)" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Exibir horas na notação AM/PM (não afeta o agendador)." #~ msgid "Only for optional servers" #~ msgstr "Apenas para servidores opcionais" #~ msgid "SSL type" #~ msgstr "Tipo SSL" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Aplicar o máximo de tentativas somente com servidores opcionais" #~ msgid "Server definition" #~ msgstr "Definições do servidor" #~ msgid "Server configuration" #~ msgstr "Configurações do servidor" #~ msgid "Backup server" #~ msgstr "Servidor backup" #~ msgid "Click below to test." #~ msgstr "Clique abaixo para testar." #~ msgid "Scheduling configuration" #~ msgstr "Configuração de agendamentos" #~ msgid "Add Feed" #~ msgstr "Adicionar Feed" #~ msgid "RSS Configuration" #~ msgstr "Configuração de RSS" #~ msgid "Remove" #~ msgstr "Remover" #~ msgid "Delete Feed" #~ msgstr "Remover Feed" #~ msgid "New Feed URL" #~ msgstr "Nova URL de Feed" #~ msgid "Feeds" #~ msgstr "Feeds" #~ msgid "Skip" #~ msgstr "Pular" #~ msgid "Filters" #~ msgstr "Filtros" #~ msgid "Settings" #~ msgstr "Configurações" #~ msgid "Email Options" #~ msgstr "Opções de e-mail" #~ msgid "Email Account Settings" #~ msgstr "Configurações da Conta de E-mail" #~ msgid "Send notifications to Growl" #~ msgstr "Enviar notificações ao Growl" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Enviar as notificações a NotifyOSD." #~ msgid "User-defined categories" #~ msgstr "Categorias do usuário" #~ msgid "Defines post-processing and storage." #~ msgstr "Define os métodos de pós-processamento e de armazenamento." #~ msgid "Sorting configuration" #~ msgstr "Configuração de classificação" #~ msgid "Groups / Indexer tags" #~ msgstr "Indexador Grupos/Etiquetas" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Ativar a ordenação e a renomeação genérica dos Filmes" #~ 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." #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "Ativar se os downloads não são colocados em suas próprias pastas." #~ msgid "Enable sorting and renaming of date named files." #~ msgstr "Ativar classificação e renomeação de arquivos nomeados com datas." #~ msgid "Are you sure you want to delete" #~ msgstr "Você tem certeza que quer apagar?" #~ msgid "Page" #~ msgstr "Página" #~ msgid "Last" #~ msgstr "Última" #~ msgid "First" #~ msgstr "Primeira" #~ msgid "Close" #~ msgstr "Fechar" #~ msgid "Set Pause Interval" #~ msgstr "Definir Intervalo de Pausa" #~ msgid "Pause for 12 hours" #~ msgstr "Pausar por 12 horas" #~ msgid "Pause for 24 hours" #~ msgstr "Pausar por 24 horas" #~ msgid "Pause Interval" #~ msgstr "Intervalo de Pausa" #~ msgid "Left" #~ msgstr "Restantes" #~ msgid "Open Source URL" #~ msgstr "Abrir URL de Origem" #~ msgid "Storage" #~ msgstr "Armazenamento" #~ msgid "Plush Options" #~ msgstr "Opções Plush" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Enviar: .nzb .rar .zip .gz" #~ msgid "Delete the all failed items from the history?" #~ msgstr "Excluir do histórico todos os itens com falha?" #~ msgid "Delete Completed" #~ msgstr "Exclusão Concluída" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Ler Feed vai pegar o conteúdo do feed atual. Forçar " #~ "Download irá baixar todos os NZBs correspondentes agora." #~ msgid "Delete Failed" #~ msgstr "Falha na Exclusão" #~ msgid "Hour:Min" #~ msgstr "Hora:Min" #~ msgid "Links" #~ msgstr "Atalhos" #~ msgid "Email Sent!" #~ msgstr "Email Enviado!" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Mostrando %s a %s de %s resultados" #~ msgid "Toggle Add NZB" #~ msgstr "Alternar Adição de NZB" #~ msgid "Saved" #~ msgstr "Salvo" #~ msgid "Showing one result" #~ msgstr "Mostrando um resultado" #~ msgid "No results" #~ msgstr "Sem resultados" #~ msgid "Show Edit Options" #~ msgstr "Mostrar Opções de Edição" #~ msgid "Edit" #~ msgstr "Editar" #~ msgid "Hide Edit Options" #~ msgstr "Ocultar Opções de Edição" #~ msgid "DualView2" #~ msgstr "DualView2" #~ msgid "DualView1" #~ msgstr "DualView1" #~ msgid "Timeleft" #~ msgstr "Tempo restante" #~ msgid "Access" #~ msgstr "Acesso" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Habilitar acesso HTTPS ao SABnzbd." #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Proteger o acesso ao SABnzbd com senha (recomendado)" #~ msgid "Misc" #~ msgstr "Diversos" #~ msgid "This field is required." #~ msgstr "Este campo é necessário." #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "" #~ "Abrir meu navegador de internet com a página do SABnzbd quando o programa " #~ "for iniciado." #~ msgid "Please enter a whole number." #~ msgstr "Por favor insira um número inteiro." #~ msgid "Step One" #~ msgstr "Primeiro Passo" #~ msgid "Step Two" #~ msgstr "Segundo Passo" #~ msgid "Step Three" #~ msgstr "Terceiro Passo" #~ msgid "Step Four" #~ msgstr "Quarto Passo" #~ msgid "Step Five" #~ msgstr "Quinto Passo" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "Ex. 119 ou 563 para SSL" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "Falha ao remover nzb da fila de pós-processamento (id)" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "Utilize V23 a não ser que o seu provedor exija outro!" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "Substituir caracteres inválidos em nomes de pastas por equivalentes (caso " #~ "contrário, removê-los)." #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Substituir caracteres inválidos em nomes de pastas" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "Tem certeza que deseja reiniciar o SABnzbd?" #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Quero que o SABnzbd seja acessado somente pelo meu computador." #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "" #~ "Quero que o SABnzbd seja acessado de qualquer computador em minha rede." #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Após o SABnzbd ter reiniciado você será capaz de acessá-lo no seguinte " #~ "local: %s" #~ msgid "Notification classes" #~ msgstr "Classes de notificação" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "" #~ "Habilita classes de mensagens a serem relatadas (nenhuma, uma, ou múltiplas)" #~ msgid "Send notifications to Notification Center" #~ msgstr "Envia notificações para o Centro de Notificações" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "" #~ "ATENÇÃO: Tarefa \"%s\" cancelada por causa de arquivo RAR criptografado" #~ msgid "OZnzb" #~ msgstr "OZnzb" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "" #~ "Enviar ao indexador resultados de validação dos downloads calculados " #~ "automaticamente." #~ msgid "Refer to https://www.oznzb.com/profile" #~ msgstr "Consulte https://www.oznzb.com/profile" #~ msgid "Site API Key" #~ msgstr "Chave API do site" #~ msgid "Automatic Feedback" #~ msgstr "Feedback Automático" #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Funcionalidades aprimoradas incluindo avaliações e informações extras de " #~ "status estão disponíveis quando conectado ao indexador OZnzb." #~ msgid "Enable OZnzb Integration" #~ msgstr "Ativar integração OZnzb" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Esta chave fornece a identidade ao indexador. Consulte " #~ "https://www.oznzb.com/profile." #~ msgid "Enable built-in unrar functionality." #~ msgstr "Ativa funcionalidade unrar interna." #~ msgid "Enable built-in unzip functionality." #~ msgstr "Ativa funcionalidade unzip interna." #~ msgid "No email templates found" #~ msgstr "Nenhum modelo de e-mail encontrado" #~ msgid "Invalid encoding of email template %s" #~ msgstr "Codificação inválida do modelo de e-mail %s" sabnzbd-develop/po/main/en.po0000600000175000017500000001003413642116632014237 0ustar jpjp# English corrections for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-07-04 10:12+0000\n" "PO-Revision-Date: 2015-07-04 12:26+0000\n" "Last-Translator: shypike \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Pause low prioirty jobs" msgstr "Pause low priority jobs" msgid "Pause normal prioirty jobs" msgstr "Pause normal priority jobs" msgid "Pause high prioirty jobs" msgstr "Pause high priority jobs" msgid "Resume low prioirty jobs" msgstr "Resume low priority jobs" msgid "Resume normal prioirty jobs" msgstr "Resume normal priority jobs" msgid "Resume high prioirty jobs" msgstr "Resume high priority jobs" msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
SABnzbd shutdown finished.
Wait for about 5 seconds and then " "click the button below.

Refresh
" msgid "Retry all failed" msgstr "Retry All Failed" msgid "disable server" msgstr "Disable server:" msgid "enable server" msgstr "Enable server:" msgid "The server didn't reply properly to the helo greeting" msgstr "The server didn't reply properly to the hello greeting" msgid "API Key missing, please enter the api key from Config->General into your 3rd party program:" msgstr "API key missing, please enter the API key from Config->General into your 3rd party program:" msgid "API Key incorrect, Use the api key from Config->General in your 3rd party program:" msgstr "API key incorrect, Use the API key from Config->General in your 3rd party program:" msgid "HTTPS Chain Certifcates" msgstr "HTTPS Chain Certificates" msgid "Replace Spaces in Foldername" msgstr "Replace spaces in folder name" msgid "Replace dots in Foldername" msgstr "Replace dots in 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!)" msgid "Timeleft" msgstr "Time left" msgid "Optionally specify a filename" msgstr "Optionally specify a name" msgid "Confirm Queue Deletions" msgstr "Confirm queue deletions" msgid "Confirm History Deletions" msgstr "Confirm history deletions" msgid "System Performance (Pystone)" msgstr "System performance (Pystone)" msgid "Web Interface" msgstr "Web interface" msgid "Script returned exit code %s and output \"%s\"" msgstr "Notification script returned exit code %s and output \"%s\"" msgid "If empty, the standard port will only listen to HTTPS." msgstr "If empty, the SABnzbd Port set above will listen to HTTPS." msgid "Posts will be paused untill they are at least this age. Setting job priority to Force will skip the delay." msgstr "Posts will be paused until they are at least this age. Setting job priority to Force will skip the delay." msgid "Support the project, Donate!" msgstr "Support the project, donate!" 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" msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 is highest priority, 99 is the lowest priority" msgid "Filter out sample files (e.g. video samples)." msgstr "Filter out sample files (e.g. video samples/proofs)."sabnzbd-develop/po/main/de.po0000600000175000017500000045736313642116632014251 0ustar jpjp# German translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2020-01-13 14:32+0000\n" "Last-Translator: TBSniller \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:02+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Fehler beim Starten der Weboberfläche." #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "" "Konnte Web-Vorlage nicht finden: %s Versuche die Standard-Vorlage zu " "verwenden." #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" "SABYenc deaktiviert: Keine korrekte Version gefunden! (Gefunden v%s, " "Erwartet v%s)" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" "SABYenc Modul... Nicht gefunden! Erwarte v%s - https://sabnzbd.org/sabyenc" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "par2-Programmdatei nicht gefunden!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "MultiPar binary... NICHT gefunden!" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "Überprüfung und Reparatur sind nicht möglich." #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "Deine UNRAR-Version ist %s, Wir empfehlen Version %s oder höher.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "unrar-Programmdatei nicht gefunden!" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "unzip-Programmdatei nicht gefunden!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "7za-Programmdatei nicht gefunden" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Bitte beachten Sie, dass der 0.0.0.0-Hostname eine IPv6-Adresse benötigen " "wird für den externen Zugriff." #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "HTTP und HTTPS Ports dürfen nicht Identisch sein!" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" "SABnzbd wurde mit Encoder/Zeichensatz %s gestartet, Dieser sollte UTF-8 " "sein. Es werden Probleme mit Unicode codierten Dateien und " "Ordnerbezeichnungen in Downloads erwartet." #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "HTTPS wegen fehlenden Zertifikats- und Schlüsseldateien deaktiviert." #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Fehler beim Starten der Web-Oberfläche " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "SABHelper-Dienst kann nicht erreicht werden" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s gestartet" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Achtung" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Fehler" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "SABnzbd wurde beendet" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Der Hostname wurde nicht angegeben" #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "" "Keine Verbindungen angegeben. Bitte geben Sie mindestens eine Verbindung ein." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Passwort ist als ****** maskiert. Bitte erneut eingeben." #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Ungültige Server-Angaben" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "" "Zeitüberschreitung: Versuchen Sie, SSL oder einen anderen Port zu verwenden." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Zeitüberschreitung" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" "Unbekanntes SSL-Protokoll: SSL deaktivieren oder alternativen Port versuchen." #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Ungültige Server-Adresse." #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Sever beendet beim Anmeldeverlauf." #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Server benötigt ein Benutzername und ein Passwort." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Verbindung erfolgreich hergestellt!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "" "Authentifizierung fehlgeschlagen. Überprüfen Sie Benutzername und Passwort." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "Zu viele Verbindungen. Bitte halten Sie die Downloads an oder versuchen Sie " "es später erneut." #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Die Verbindung konnte nicht überprüft werden. (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Signal %s erkannt. Wird gespeichert und beendet …" #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Schwerer Fehler beim Speichern des Zustands" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "NZB-Datei wird versucht von %s abzurufen" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Fehler beim Speichern von %s" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Temporäre Datei für %s konnte nicht angelegt werden" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Status für nicht vorhandenen Server wird versucht %s einzustellen" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Fehler in tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Fehler beim Laden von %s" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "E-Mail erfolgreich versendet" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Benachrichtigungen testen" #: sabnzbd/api.py msgid " Resolving address" msgstr " Adresse wird aufgelöst …" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Standard" #: sabnzbd/api.py msgid "unknown" msgstr "unbekannt" #: sabnzbd/api.py [Error message] 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." #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Festplattenfehler beim Anlegen der Datei %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Schwerer Fehler im Assembler" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "ACHTUNG: \"%s\" wurde angehalten, da es ein verschlüsseltes RAR Archiv " "enthält (falls unterstützt, wurden alle Passwörter ausprobiert)" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "ACHTUNG: \"%s\" wurde abgebrochen, da es ein verschlüsseltes RAR Archiv " "enthält (falls unterstützt, wurden alle Passwörter ausprobiert)" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Abgebrochen, Verschlüsselung vorhanden" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "WARNUNG: Unerwünschter Typ \"%s\" in RAR Datei. Unerwünschte Datei ist %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "Unerwünschter Dateityp in rar-Archiv %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Abgebrochen, unerwünschte Dateieindung gefunden" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "WARNUNG: Aufgabe \"%s\" aufgrund der Bewertung (%s) pausiert." #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "Warnung: Aufgabe \"%s\" aufgrund der Bewertung (%s) abgebrochen" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Abbruch, Bewertungsfilter stimmt überein (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s fehlt" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" "Aufgabe \"%s\" ist wahrscheinlich verschlüsselt, RAR hat den gleichen Namen " "wie das gepackte RAR-Archiv" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" "Aufgabe \"%s\" ist wahrscheinlich verschlüsselt: \"Passwort\" im Dateiname " "\"%s\"" #: sabnzbd/assembler.py msgid "video" msgstr "Video" #: sabnzbd/assembler.py msgid "audio" msgstr "Audio" #: sabnzbd/assembler.py msgid "spam" msgstr "Spam" #: sabnzbd/assembler.py msgid "passworded" msgstr "passwortgeschützt" #: sabnzbd/assembler.py msgid "downvoted" msgstr "als schlecht bewertet" #: sabnzbd/assembler.py msgid "keywords" msgstr "Schlüsselwörter" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Kontingent aufgebraucht, Downloads werden angehalten" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s ist keine gültige E-Mail-Adresse" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Server-Adresse wird benötigt" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Kann kein %s Ordner %s erstellen" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Kann INI-Datei %s nicht schreiben" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Kann keine Sicherungsdatei erstellen für %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Ungültig kodiertes Passwort %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s ist kein gültiger Oktal-Wert" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "UNC-Pfad \"%s\" ist hier nicht erlaubt" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Fehler: Dateipfadlänge sollte kürzer als %s sein." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "" "Fehler: Ordner kann nicht geändert werden, da die Warteschlange nicht leer " "ist." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" "Kann nicht in die Verlaufsdatenbank schreiben, überprüfe die Zugriffsrechte!" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "Verlaufsdatenbank geschädigt, eine leere neue wurde erstellt" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "SQL-Befehl fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll." #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "" "Fehler beim Schliessen der Datenbank. Beachten Sie das Nachrichtenprotokoll." #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Ungültiges Stufen-Protokoll im Verlauf für %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Fehler beim Dekodieren von %s." #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "Decoder Fehler: Nicht genügend Speicher" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Ungültiger yEnc-Artikel in %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Unbekannter Fehler %s beim Dekodieren" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s wurde auf keinem Server gefunden und daher übersprungen" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "Direkt entpacken" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Fertiggestellt" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "%s Datei(en)/Ordner entpackt in %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "Direkt entpacken wurde automatisch aktiviert" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py msgid "" "Jobs will start unpacking during the downloading to reduce post-processing " "time. Only works for jobs that do not need repair." msgstr "" "Aufträge werden bereits während des Download-Vorgangs entpackt, um die " "Nachbearbeitungszeit zu verkürzen. Nur für Aufträge, die nicht repariert " "werden müssen." #: 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] msgid "Error while adding %s, removing" msgstr "Fehler beim Hinzufügen von %s. Entferne." #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Fehler beim Entfernen von %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Überwachter Ordner %s kann nicht gelesen werden" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Fortgesetzt" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "Angehalten" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Bevor ein Bandbreitenlimit gesetzt werden kann, muss die maximale Bandbreite " "festgelegt werden" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Verbindung zum Server %s kann nicht hergestellt werden. %s" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Konnte Servernamen nicht auflösen" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Server %s wird für %s Minuten ignoriert" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Fehler %s@%s zu initialisieren, aus folgendem Grund: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "Zu viele Verbindungen zu Server %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Möglicherweise wird das Konto geteilt" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Anmelden beim Server fehlgeschlagen. %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Fehler beim Verbinden mit %s@%s, Meldung = %s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Server %s benötigt ein Benutzername und ein Passwort" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Vermute Fehler im Downloader" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Wird beendet …" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Verbindung zum Mail-Server konnte nicht hergestellt werden" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "Aufbau der TLS-Verbindung fehlgeschlagen" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "Keine korrekte Server-Antwort auf den HELO/EHLO-Check" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Authentifizierung beim Mail-Server fehlgeschlagen" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Keine passende Authentifizierungsmethode gefunden" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Unbekannter Authentifizierungsfehler des E-Mail-Servers" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Senden des E-Mails fehlgeschlagen" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Schliessen der Mail-Verbindung fehlgeschlagen" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Keine E-Mail gesendet da keine Empfänger angegeben" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd meldet eine volle Festplatte\n" "\n" "Hallo,\n" "\n" "SABnzbd hat mit dem Herunterladen aufgehört, da die Festplatte fast voll \"\n" "ist.\n" "Bitte geben Sie manuell Speicherplatz frei und setzen Sie die Downloads \"\n" "danach fort.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Verzeichnis %s konnte nicht angelegt werden" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "Zugriff auf das Verzeichnis %s fehlgeschlagen: %s" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Rechte von %s konnten nicht geändert werden" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Erstellen von %s fehlgeschlagen" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Verschieben von %s nach %s fehlgeschlagen" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "Verbindung vom Host \"%s\" abgelehnt von:" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "Benutzer im Web-Interface angemeldet" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "Benutzer angemeldet" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Sitzungs-Schlüssel fehlt" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Fehler: Sitzungsschlüssel wird benötigt" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Fehler: Sitzungsschlüssel ungültig" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "API-Schlüssel fehlt. Bitte API-Schlüssel aus Einstellungen->Allgemein in die " "externe Anwendung eingeben:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "API-Schlüssel ungültig. Bitte API-Schlüssel aus Einstellungen->Allgemein in " "die externe Anwendung eingeben:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Authentifizierung fehlt. Bitte Benutzernamen und Passwort aus Einstellungen-" ">Allgemein in die externe Anwendung eingeben:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Probier' den neuen Skin Glitter! Er bietet ein frisches, für PC und " "Mobilgeräte optimiertes Erlebnis. Einstellen über Konfiguration -> Allgemein." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "Fehlerhafter Login Versuch von %s" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
SABnzbd wurde beendet.
Warten Sie 5 Sekunden und klicken Sie " "danach auf folgenden Knopf.

Aktualisieren
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "" "Warnung: localhost ist mehrdeutig. Verwenden Sie eine numerische IP-Adresse." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "Server-Adresse \"%s:%s\" ist ungültig." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Feed" #: sabnzbd/interface.py msgid "Daily" msgstr "Täglich" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "Montag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Dienstag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Mittwoch" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Donnerstag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Freitag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Samstag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Sonntag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "Aus" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Undefinierter Server!" #: 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 "" "Der Category-Ordner darf kein Unterordner des Temporärer Download-Ordners " "sein." #: sabnzbd/interface.py msgid "Back" msgstr "Zurück" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "FEHLER:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Fehlerhafter Wert für %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "t" #: sabnzbd/misc.py msgid "h" msgstr "h" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Fehler beim Anlegen des SSL-Schlüssels und -Zertifikats." #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Ausführen des Skripts" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Nachbearbeitung wurde abgebrochen (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Skript" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Entpacken zu tief verschachtelt [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Zusammenfügen" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Unvollständiger Ablauf beim zusammenführen von Dateien" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Fehler beim Zusammenfügen von %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Fehler \"%s\" beim Zusammenfügen der Dateien" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Fehler \"%s\" beim Ausführen von file_join auf %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] %s Dateien zusammengefügt" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Entpacken fehlgeschlagen. %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Fehler \"%s\" beim Entpacken der RAR-Dateien" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Fehler \"%s\" beim Ausführen von rar_unpack auf %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Löschen von %s fehlgeschlagen!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Versuche entpacken mit Passwort \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Entpacken fehlgeschlagen. Archiv benötigt ein Passwort." #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Entpacken" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Entpacken" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Entpacken fehlgeschlagen. Konnte %s nicht finden." #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "FEHLER: »%s« kann nicht gefunden werden." #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Entpacken fehlgeschlagen. CRC-Fehler" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "FEHLER: CRC in »%s« fehlgeschlagen." #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" "Entpacken fehlgeschlagen - Datei zu groß für Dateisystem (Formatierung FAT?)" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "Fehler: Datei zu groß für Dateisystem (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "" "Entpacken fehlgeschlagen. Fehler beim Schreiben oder volle Festplatte?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "FEHLER: Schreibfehler %s" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Entpacken fehlgeschlagen, Pfad ist zu lang" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "FEHLER: Pfad ist zu lang (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "RAR-Datei beschädigt" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "Defekte RAR Datei" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s Dateien in %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Fehler \"%s\" beim Ausführen von unzip auf %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Versuche 7zip mit Passwort \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "Das 7zip-Set \"%s\" ist unvollständig, kann nicht entpackt werden" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Konnte nicht entpacken %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Schnelle Überprüfung" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Reparieren" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Schnelle Überprüfung erfolgreich" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Beginn der Reparatur" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Reparatur fehlgeschlagen. %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Fehler \"%s\" beim Ausführen von par2_repair auf %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Fehler \"%s\" beim Ausführen von par2_repair auf dem Satz %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] Ungültige PAR2-Optionen. Überprüfen Sie die Angaben in Einstellungen -> " "Schalter." #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Überprüft in %s. Alle Dateien fehlerfrei." #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Überprüft in %s. Reparatur wird benötigt." #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" "Ungültige par2-Dateien oder ungültige PAR2-Parameter, Auftrag konnte nicht " "überprüft oder repariert werden" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "%s Blöcke werden abgerufen …" #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Abrufen" #: 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 msgid "Repairing" msgstr "Reparieren" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Repariert in %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "Überprüfe Reparatur" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Festplatte voll" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Überprüfen" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "Überprüfe zusätzliche Dateien" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Wird überprüft" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: 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)" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Dieser Server erlaubt kein SSL auf diesem Port" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" "Zertifikat ungültig: Der Server-Host ist nicht im angegeben Zertifikat " "enthalten. Dies ist ein Serverproblem." #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" "Zertifikat ist nicht gültig. Dies ist wahrscheinlich ein Serverproblem." #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "Der Server %s verwendet ein nicht vertrauenswürdiges Zertifikat [%s]" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Starten/Beenden" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "Hinzugefügte NZB" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Nachbearbeitung gestartet" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Auftrag ausgeführt" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Auftrag fehlgeschlagen" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Warteschlange abgearbeitet" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Andere Nachrichten" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "Nicht verfügbar" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Konnte Prowl-Nachricht nicht versenden" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Fehlerhafte Antwort von Pushbullet (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "Konnte Pushover-Nachricht nicht versenden" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Fehlerhafte Antwort von Pushbullet (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Konnte Pushbullet-Nachricht nicht versenden" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "Skript gab Fehlercode %s und Ausgabe \"%s\" zurück" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "Benachrichtigungsskript \"%s\" existiert nicht" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "Windows Benachrichtigung konnte nicht gesendet werden" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Importieren von %s Dateien von %s fehlgeschlagen" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "" "Inkompatible Warteschlangen-Datei gefunden. Fortsetzen nicht möglich." #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Fehler beim Laden von %s. Beschädigte Datei gefunden." #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB zur Warteschlange hinzugefügt" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Unbekannte Kodierung" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Unvollständige NZB-Datei %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Ungültige NZB-Datei %s wird übersprungen: %s auf Zeile %s" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Leere NZB-Datei %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" "Das Vorwarteschlangen (pre-queue) Skript hat die Downloadaufgabe als " "gescheitert markiert" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Doppelte NZB \"%s\" wird ignoriert" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "kopieren der NZB \"%s\" fehlgeschlagen" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "Doppelte NZB" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Doppelt vorhandene NZB \"%s\" angehalten" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Abgebrochen, kann nicht fertiggestellt werden" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DUPLIKAT" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "VERSCHLÜSSELT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "ZU GROSS" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "UNVOLLSTÄNDIG" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "UNERWÜNSCHT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "GEFILTERT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "WARTE %s Sek" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "AUSBREITUNG %s min" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "" "Heruntergeladen in %s mit einer Durchschnittsgeschwindigkeit von %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Alter" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s Artikel hatten ein ungültiges Format" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s Artikel fehlten" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s Artikel hatten nicht übereinstimmende Duplikate" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s Artikel wurden entfernt" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Fehler beim Importieren von %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Warnungen" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Leerlauf" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Einstellungen" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Warteschlange" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Warteschlange leeren" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Verlauf" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Verlauf leeren" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Geschwindigkeit begrenzen" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Anhalten" #: sabnzbd/osxmenu.py msgid "min." msgstr "Min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Fortsetzen" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Überwachter Ordner lesen" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Alle RSS-Feeds lesen" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Fertige Downloads" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Unfertige Download" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Fehler suchen" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Neu starten" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Neustart ohne Anmeldung" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Beenden" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Warteschlange mit den 10 obersten Einträgen" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Leer" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Verlauf mit den letzten 10 Einträgen" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Neue Version verfügbar" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Assistent öffnen" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Wird angehalten …" #: sabnzbd/panic.py msgid "Problem with" msgstr "Problem mit" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " Für seinen internen Web-Server benötigt SABnzbd einen freien TCP/IP-" "Port.
\n" " Port %s auf %s wurde probiert, ist aber nicht verfügbar.
\n" " Entweder verwendet eine andere Software den Port oder SABnzbd läuft " "bereits.
\n" "
\n" " Starten Sie SABnzbd bitte mit einer anderen Portnummer neu." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "" "Wenn Sie diesen Fehler wieder erhalten, probieren Sie eine andere Nummer.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " Für seinen internen Web-Server benötigt SABnzbd eine gültige Rechner-" "Adresse.
\n" " Sie haben eine ungültige Adresse angegeben.
\n" " Sichere Werte sind localhost und 0.0.0.0
\n" "
\n" " Starten Sie SABnzbd bitte mit einer gültigen Rechner-Adresse neu." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd hat die gespeicherten Daten einer anderen SABnzbd-Version " "erkannt,
\n" " kann diese aber nicht wiederverwenden.

\n" " Es wird empfohlen, die ausstehenden Downloads mit der anderen Version " "fertigzustellen.

\n" " Starten Sie dieses Programm danach mit der \"--clean\"-Option.
\n" " Dies löscht die Download-Warteschlange und den Download-Verlauf!
\n" " SABnzbd hat die Datei \"%s\" gelesen." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd kann die Dateien für die Web-Oberfläche in %s nicht finden.
\n" " Installieren Sie bitte das Programm erneut.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd hat einen schwerwiegenden Fehler erkannt:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd hat erkannt, dass die Datei sqlite3.dll fehlt.

\n" " Manche unausgereiften Viren-Scanner löschen diese Datei.
\n" " Bitte überprüfen Sie den Viren-Scanner, versuchen Sie eine " "Neuinstallation von SABnzbd und beschweren Sie sich beim Hersteller des " "Viren-Scanners.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Drücken Sie Start+R und geben Sie folgenden Zeile ein (Beispiel):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Öffnen Sie ein Terminal und geben Sie folgende Zeile ein (Beispiel):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Programm wurde nicht gestartet!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" "Konnte nicht an Port %s auf %s starten. Eine andere Software nutzt diesen " "Port oder SABnzbd läuft bereits." #: sabnzbd/panic.py msgid "Fatal error" msgstr "Schwerwiegender Fehler" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "" "Der Standard-Browser konnte nicht gestartet werden, da er wahrscheinlich " "nicht gefunden wurde." #: sabnzbd/panic.py msgid "Access denied" msgstr "Zugriff verweigert" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "" "Fehler %s: Sie müssen einen gültigen Benutzername und ein Passwort angeben." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "" "Alte Warteschlangen-Version erkannt, über Status->Reparieren ins neue Format " "konvertieren" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" msgstr "" "Download-Ordner %s für abgeschlossene Downloads auf FAT Dateisystem, ist " "auf maximale Dateigröße von 4GB begrenzt." #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "" "Download wahrscheinlich fehlgeschlagen, nur %s von benötigten %s verfügbar" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Download fehlgeschlagen - Nicht auf deinem/n Server/n vorhanden" #: sabnzbd/postproc.py msgid "Moving" msgstr "Verschiebevorgang" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "%s wurde an die Warteschlange gesendet" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Fehler beim Umbenennen von \"%s\" nach \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Dateien verschieben fehlgeschlagen" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Ausführen des Benutzer-Skripts %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "%s ausgeführt" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Exit-Code des Skripts ist %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Mehr" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Nachbearbeitung von %s fehlgeschlagen (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "Beachten Sie die Protokolldatei" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Download Fehlgeschlagen" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Aufräumen von %s fehlgeschlagen" #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Download fertig" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Konnte Download-Ordner %s nicht anlegen" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Nachbearbeitung" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Keine PAR2-Sätze" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Versuche SFV-Überprüfung" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Überprüfung einiger Dateien mittels %s fehlgeschlagen" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Überprüfung mit SFV-Datei(en) erfolgreich" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "RAR-basierte Überprüfung versuchen" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "[%s] RAR-basierte Überprüfung ist fehlgeschlagen: %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "passwortgeschützt" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "RAR-Datei erfolgreich überprüft" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "RAR-Datei konnten nicht überprüft werden" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Entfernen von %s fehlgeschlagen" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Fehler beim Wechsel in den Ruhezustand" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Fehler beim Wechsel in den Bereitschaftsmodus" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Fehler beim Herunterfahren des Systems" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Indexer ID (%s) für Bewertung nicht gefunden" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Server-Adresse" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "API-Schlüssel" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" "Der Schlüssel liefert die Identität des Indexers. Prüfe dein Profil auf der " "indexer Webseite." #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Ungültige RSS-Feed-Beschreibung \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Abrufen des RSS-Feeds von %s fehlgeschlagen: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Keine gültige Berechtigung für Feed %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "Server-Fehler (Code %s); konnte %s von %s nicht laden" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Der Server %s nutzt ein nicht vertrauenswürdiges HTTPS-Zertifikat" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "RSS-Feed %s war leer" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Inkompatibeler RSS-Feed" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Leerer RSS-Feed gefunden: %s" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Interface anzeigen" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Öffne Zielverzeichnis" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Anhalten für" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "5 Minuten anhalten" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "15 Minuten anhalten" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "30 Minuten anhalten" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Eine Stunde anhalten" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "3 Stunden anhalten" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "6 Stunden anhalten" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Beenden" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Verbleibend" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "NZB hinzufügen" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Ungültige Regel %s um %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Unbekannte Aktion: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Regel für nicht existierenden Server %s." #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Herunterladen" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Dateien zusammenfügen" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Quelle" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Server" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Fehler" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Fehlgeschlagen" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Warten" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Wird repariert …" #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Wird entpackt …" #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Wird verschoben …" #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Skripts wird ausgeführt …" #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Zusätzliche Blöcke werden abgerufen …" #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Schnelle Überprüfung …" #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Überprüfung läuft …" #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Am herunterladen" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "Ausbreitungsverzögerung" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Aufgabe" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "Server deaktivieren" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "Server aktivieren" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Geschwindigkeitsbegrenzung" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Alle anhalten" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Nachbearbeiten anhalten" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Nachbearbeiten fortsetzen" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "RSS-Feeds lesen" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Entferne fehlgeschlagene Aufträge" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Abgeschlossene Aufträge entfernen" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Aufträge mit niedriger Priorität pausieren" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Aufträge mit normaler Priorität pausieren" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Aufträge mit hoher Priorität pausieren" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Aufträge mit niedriger Priorität fortsetzen" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Aufträge mit normaler Priorität fortsetzen" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Aufträge mit hoher Priorität fortsetzen" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Quoten-Management einschalten" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Nein" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Sehr niedrig" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Mittel" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normal" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Hoch" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Notfall" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Gering" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "Stunde" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "Stunden" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "Minuten" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "Minuten" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "Sekunde" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "Sekunden" #: sabnzbd/skintext.py msgid "day" msgstr "Tag" #: sabnzbd/skintext.py msgid "days" msgstr "Tage" #: sabnzbd/skintext.py msgid "week" msgstr "Woche" #: sabnzbd/skintext.py msgid "Month" msgstr "Monat" #: sabnzbd/skintext.py msgid "Year" msgstr "Jahr" #: sabnzbd/skintext.py msgid "January" msgstr "Januar" #: sabnzbd/skintext.py msgid "February" msgstr "Februar" #: sabnzbd/skintext.py msgid "March" msgstr "März" #: sabnzbd/skintext.py msgid "April" msgstr "April" #: sabnzbd/skintext.py msgid "May" msgstr "Mai" #: sabnzbd/skintext.py msgid "June" msgstr "Juni" #: sabnzbd/skintext.py msgid "July" msgstr "Juli" #: sabnzbd/skintext.py msgid "August" msgstr "August" #: sabnzbd/skintext.py msgid "September" msgstr "September" #: sabnzbd/skintext.py msgid "October" msgstr "Oktober" #: sabnzbd/skintext.py msgid "November" msgstr "November" #: sabnzbd/skintext.py msgid "December" msgstr "Dezember" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Tag im Monat" #: sabnzbd/skintext.py msgid "This week" msgstr "Diese Woche" #: sabnzbd/skintext.py msgid "This month" msgstr "Dieser Monat" #: sabnzbd/skintext.py msgid "Today" msgstr "Heute" #: sabnzbd/skintext.py msgid "Total" msgstr "Gesamt" #: sabnzbd/skintext.py msgid "on" msgstr "An" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parameter" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Python Version" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Startseite" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "oder" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Adresse" #: sabnzbd/skintext.py msgid "Comment" msgstr "Kommentar" #: sabnzbd/skintext.py msgid "Send" msgstr "Absenden" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Abbrechen" #: sabnzbd/skintext.py msgid "Other" msgstr "Andere" #: sabnzbd/skintext.py msgid "Report" msgstr "Bericht" #: sabnzbd/skintext.py msgid "Video" msgstr "Video" #: sabnzbd/skintext.py msgid "Audio" msgstr "Audio" #: sabnzbd/skintext.py msgid "Not used" msgstr "Nicht verwendet" #: sabnzbd/skintext.py msgid "or less" msgstr "oder weniger" #: sabnzbd/skintext.py msgid "Log in" msgstr "Anmelden" #: sabnzbd/skintext.py msgid "Log out" msgstr "Abmelden" #: sabnzbd/skintext.py msgid "Remember me" msgstr "Automatische Anmeldung" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "Automatisiertes Programm für Usenet-Downloads" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Speichern" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Speichervorgang …" #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Sind Sie sicher?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Alle heruntergeladenen Dateien löschen?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Startseite" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Einstellungen" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Status" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Hilfe" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Forum" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "Probleme" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "Bitte unterstützen Sie das Projekt durch eine Spende!" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Allgemein" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Ordner" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Schalter" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Planung" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Benachrichtigungen" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "E-Mail" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Kategorien" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Sortierung" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Spezial" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Suchen" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Downloads" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "ANGEHALTEN" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "%s Artikel im Cache (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Systemlast" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Neue Version %s verfügbar unter" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Möchten Sie SABnzbd wirklich beenden?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Hinzufügen einer" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Datei hinzufügen" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Kategorie" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Verarbeiten" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Priorität" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Reparieren" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Entpacken" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Löschen" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "E" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "L" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Erzwingen" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Anhalten" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "Wenn fertig" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Rechner ausschalten" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "Rechner in Bereitschaft versetzen" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Rechner in den Ruhezustand versetzen" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "SABnzbd beenden" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Geschwindigkeitsbegrenzung" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Reihenfolge" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Name" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "ETA" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "Alter" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Löschen" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Erneut versuchen" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Aktionen" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Skripte" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Alle Elemente in der Warteschlange löschen?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "NZBs löschen" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "NZBs und Dateien löschen" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Fehlgeschlagene Aufträge neustarten" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "NZB löschen" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "NZBs und Dateien löschen" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "von" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Fehlende Artikel" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Verbleibendes Kontingent" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "Manuell" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Kontingent jetzt zurücksetzen" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Alle fertigen Downloads aus dem Verlauf entfernen?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Details verbergen" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Details anzeigen" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Nur Fehlgeschlagene" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Alle anzeigen" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Grösse" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Fehlgeschlagene NZBs löschen" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Fehlgeschlagene NZBs und Dateien löschen" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Fertige NZBs löschen" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "Lösche NZBs auf der aktuellen Seite" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "Optionale ergänzende NZB-Datei" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Pfad" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Alle fehlgeschlagenen neustarten" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Alle neustarten" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/Spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Außerhalb der Serverretention" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Anderes Problem" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Verbindung trennen" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" "Alle aktiven Verbindungen zu Usenet-Servern trennen. Verbindungen werden " "nach ein paar Sekunden wiederhergestellt, falls sich noch Artikel in der " "Warteschlange befinden." #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Sendet eine Test-E-Mail an Ihr Konto." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Protokoll anzeigen" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "E-Mail testen" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Protokoll" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Fehler/Warnungen" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Info" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Fehlersuche" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Verbindungen" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Neuste Warnungen" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "Leeren" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Freigeben" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Artikelbezeichner" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Dateimenge" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Wann" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Typ" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Aktiv" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Übersichtsseite" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Verbindung fehlgeschlagen!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Lokale IPv4-Adresse" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Öffentliche IPv4-Adresse" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "IPv6-Adresse" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "DNS-Server" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "CPU-Modell" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "System Performance" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Zielverzeichnis Geschwindigkeit" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Zielverzeichnis Geschwindigkeit" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Schreibgeschwindigkeit" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "Konnte nicht schreiben. Überprüfe, ob der Ordner beschreibbar ist." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Klick auf \"Test wiederholen\" um es festzustellen" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Test wiederholen" #: sabnzbd/skintext.py msgid "Test download" msgstr "Test Download" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" "Fügt eine verifizierte NZB-Testdatei mit der angegebenen Dateigröße hinzu. " "Die Datei ist zufallsgeneriert und dient dem Prüfen der Einstellungen." #: sabnzbd/skintext.py msgid "Config File" msgstr "Konfigurationsdatei" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Verwendeter Cache" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Ein Klick auf den Knopf \\\"Neu starten\\\" startet SABnzbd neu.
\r\n" "Benutzen Sie ihn, falls ein Stabilitätsproblem vorliegt.
\r\n" "Die Downloads werden vor dem Neustart angehalten und danach fortgesetzt." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" "
Wenn Anmeldung aktiviert ist, müssen sie sich danach noch mal anmelden." #: sabnzbd/skintext.py msgid "Advanced" msgstr "Erweitert" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Der Download-Ordner enthält verwaiste Aufträge.
Diese können gelöscht " "(zusammen mit den Dateien) oder zurück in die Warteschlange verschoben " "werden." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "Ein Klick auf den Knopf \"Reparieren\" startet SABnzbd neu
und baut die " "Warteschlange neu auf, wobei bereits
heruntergeladene Dateien bestehen " "bleiben. Die Reihenfolge
der Warteschlange wird dabei verändert." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Die Änderungen wurden nicht gespeichert und werden verloren gehen." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" "Falls sich deine IP Adresse ändert oder SABnzbd neu startet, wird deine " "Session ungültig" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "unzip aktivieren" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "7zip aktivieren" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "Multicore Par2" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" "Erhöhe Reparaturgeschwindigkeit durch installation von Multicore Par2, " "verfügbar auf vielen Plattformen." #: sabnzbd/skintext.py msgid "Version" msgstr "Version" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Zeit seit Start" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Sicherheitskopie" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Lesen Sie dazu die Hilfe im Wiki!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "SABnzbd wird neu gestartet …" #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Änderungen benötigen einen Neustart von SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "SABnzbd-Webserver" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "SABnzbd-Host" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Host, auf dem SABnzbd auf Anfragen warten soll." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "SABnzbd-Port" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Port, auf dem SABnzbd auf Anfragen warten soll." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Web-Oberfläche" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Gestaltung der Web-Oberfläche verändern." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "SABnzbd-Benutzername" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Optionale Anmeldung mit Benutzername" #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "SABnzbd-Passwort" #: sabnzbd/skintext.py 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" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "HTTPS aktivieren" #: sabnzbd/skintext.py msgid "not installed" msgstr "nicht installiert" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Zugriff auf die Oberfläche über HTTPS-Adressen erlauben" #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "HTTPS-Port" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Wenn leer, hört der Standard-Port nur auf HTTPS-Anfragen." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "HTTPS-Zertifikat" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Dateiname oder Pfad des HTTPS-Zertifikats." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" "Neues selbstzertifiziertes Zertifikat und Schlüssel generieren. SABnzbd muss " "neugestartet werden!" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "HTTPS-Schlüssel" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Dateiname oder Pfad des HTTPS-Schlüssels." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "HTTPS-Kette Zertifikat" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Dateiname oder Pfad zur HTTPS-Kette." #: sabnzbd/skintext.py msgid "Tuning" msgstr "Feinabstimmung" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "RSS-Überprüfung" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Überprüfungs-Intervall (in Minuten, mindestens 15). Nicht aktive wenn Regeln " "aktiv sind!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Maximale Downloadgeschwindigkeit" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Prozentsatz der Downloadgeschwindigkeit" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "" "Welchen Prozentsatz deiner Downloadgeschwindigkeit SABnzbd nutzen soll, z.B. " "50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Begrenzung des Artikel-Caches" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Artikel werden zwischengespeichert, um die Anzahl der Zugriffe auf die " "Festplatte zu reduzieren.
In Bytes, gefolgt von einem optionalen K, " "M oder G. Zum Beispiel: \"64M\" oder \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Unerwünschte Dateien" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Liste der Dateiendungen, die nach dem Download gelöscht werden sollen.
Zum Beispiel:nfo or nfo,sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "Verlaufsgröße" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" "Fertige Aufträge automatisch aus dem Verlauf entfernen. Duplikatserkennung " "und manche externe Skripte benötigen Informationen aus dem Verlauf." #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "Alle Aufträge behalten" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "Behalte maximale Anzahl an abgeschlossenen Aufträgen" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "Behalte abgeschlossene Aufträge maximal X Tage" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "Fertige Aufträge nicht behalten" #: sabnzbd/skintext.py msgid "Jobs" msgstr "Aufträge" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Änderungen speichern" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "Werkseinstellung wiederherstellen" #: sabnzbd/skintext.py msgid "Reset" msgstr "Zurücksetzen" #: sabnzbd/skintext.py msgid "Language" msgstr "Sprache" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Wählen Sie die Sprache der Weboberfläche." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" "Hilf uns beim Übersetzen von SABnzbd in deiner Sprache!
Neue " "Übersetzungen hinzufügen oder bestehende verbessern kannst du hier:" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "" "Dieser Schlüssel gibt Drittprogrammen uneingeschränkten Zugriff auf SABnzbd." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "NZB-Schlüssel" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Dieser Schlüssel erlaubt Drittprogrammen das Hinzufügen von NZB-Dateien zu " "SABnzbd." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Neuen Schlüssel generieren" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "API-Key OR-Code" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Liste der lokalen Netzwerkadressenbereiche" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Alle lokalen Netzwerkadressen starten mit diesen Präfixen (oft " "\"192.168.1.1\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Externer Internetzugriff" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" "Du kannst Zugriffsrechte für Systeme ausserhalb deines Netzwerkes setzen. " "Benötigt die Definition einer Liste von lokalen Netzwerkbereichen." #: sabnzbd/skintext.py msgid "No access" msgstr "Kein Zugriff" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "NZB Dateien hinzufügen " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (kein Einstellungen)" #: sabnzbd/skintext.py msgid "Full API" msgstr "Ganze API" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Volles Webinterface" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "Nur externer Zugriff benötigt eine Anmeldung" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "HINWEIS: Ordner werden beim Speichern automatisch erstellt. Sie " "können absolute Pfade angeben, um Ordner ausserhalb der standardmässigen " "Ordner zu verwenden." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Benutzer-Ordner" #: sabnzbd/skintext.py msgid "Browse" msgstr "Durchsuchen" #: sabnzbd/skintext.py msgid "In" msgstr "In" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Temporärer Download-Ordner" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Hier werden noch nicht verarbeitete Downloads abgelegt.
Kann nur " "geändert werden wenn die Warteschlange leer ist." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Minimaler freier Speicherplatz im temporären Ordner" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "SABnzbd hält automatisch an, wenn der freie Speicherplatz unter diesen Wert " "fällt.
In Bytes, gefolgt von einem optionalen K, M oder G. Zum " "Beispiel: \"800M\" or \"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Ordner für fertige Downloads" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Hier werden fertige, verarbeitete Downloads abgelegt.
Kann von " "benutzerdefinierten Kategorien ausser Kraft gesetzt werden." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Rechte für fertige Downloads" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Rechte für Dateien und Ordner festlegen.
In oktaler Notation. Zum " "Beispiel: \"755\" oder \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Überwachter Ordner" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Ordner, der auf neue NZB-Dateien überwacht werden soll.
Erkennt auch " "ZIP-, RAR- und TAR.GZ-Archive mit NZB-Dateien." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Geschwindigkeit der Ordner-Überwachung" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Anzahl der Sekunden zwischen zwei Überprüfungen." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "Skript Ordner" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "Ordner enthält Benutzer Skripte" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Ordner mit E-Mail-Vorlagen" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Ordner, der benutzerdefinierte E-Mail-Vorlagen enthält." #: sabnzbd/skintext.py msgid "Password file" msgstr "Passwortdatei" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Datei mit allen Passwörtern, die bei verschlüsselten RAR-Dateien probiert " "werden sollen." #: sabnzbd/skintext.py msgid "System Folders" msgstr "System-Ordner" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Administrativer Ordner" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Ordner, der die für die Warteschlange und den Verlauf verwendeten " "Datenbanken enthält.
Kann nur geändert werden, wenn die " "Warteschlange leer ist." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Es werden keine Dateien entfernt. Benötigt einen Neustart von " "SABnzbd!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Protokoll-Ordner" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Hier werden Protokoll-Dateien von SABnzbd abgelegt.
Benötigt einen " "Neustart von SABnzbd!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "NZB-Backup-Ordner" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Hier werden NZB-Dateien abgelegt." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Standardmässiger Basis-Ordner" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Alle Par2-Dateien herunterladen" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" "Dies verhindert mehrfache Reparaturversuche, durch herunterladen aller par2 " "Dateien, wenn notwendig." #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Rekursives Entpacken aktivieren" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Archive (rar, zip, 7z) innerhalb von Archiven entpacken." #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Alle Ordner innerhalb Archiven ignorieren" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Alle Dateien werden in einen einzelnen Ordner gespeichert." #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Nur Artikel für obersten Warteschlangen-Eintrag herunterladen" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Für geringere Speicher-Verwendung aktivieren.
Deaktivieren, um zu " "verhindern, dass langsame Aufträge
die anderen Einträge in der " "Warteschlange blockieren." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Nur überprüfte Aufträge nachbearbeiten" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" "Die Nachbearbeitung nur für Aufträge durchführen,
die alle PAR2-" "Überprüfungen bestanden haben." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Aktion wenn eine verschlüsselte RAR Datei geladen wird" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "Im Fall von \"Pause\" müssen Sie ein Kennwort setzen und den Aufgabe " "fortsetzen." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Doppelte Downloads erkennen" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" "Doppelte NZB Datei entdeckt (basierend auf den Eintragungen in der Historie " "oder den .nzb Dateien im NZB-Backup-Ordner)" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Doppelte Episoden in Serien erkennen" #: sabnzbd/skintext.py msgid "" "Detect identical episodes in series (based on \"name/season/episode\" of " "items in your History)" 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" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "Aufgabe abgebrochen (verschoben in die Historie)" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "Markiere Auftrag" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Abbrechen" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Aktion bei ungewollter Dateienendung" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "Aktion bei ungewollter Dateiendung innerhalb RAR-Archiven" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Ungewollte Dateiendungen" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Liste aller ungewollter Dateiendungen. Zum Beispiel: exe or exe, " "com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "SFV-basierte Überprüfung aktivieren" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Zusätzliche Überprüfung mittels SFV-Dateien durchführen" #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Benutzerskript kann Auftrag als fehlgeschlagen markieren" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Wenn das Benutzerskript einen Exit-Code ausgibt, der nicht \"0\" ist, wird " "der Auftrag als fehlgeschlagen markiert." #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "Nach einem Fehler ein alternatives NZB laden" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" "Manche Server stellen ein alternatives NZB zur Verfügung, falls ein Download " "fehlschlägt." #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "Übernehme Markierungen vom Indexer" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" "Beim Sortieren, verwende Tags aus Indexer für Titel, Saison, Episode, usw. " "Andernfalls wird alle Namensgebung aus dem NZB-Namen abgeleitet." #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Ordner-Umbenennung aktivieren" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Temporäre Namen während der Nachbearbeitung verwenden. Deaktivieren, wenn " "das System nicht damit klar kommt." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Benutzer-Skript vor Warteschlange" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "" "Wird verwendet, bevor eine NZB-Datei zur Warteschlange hinzugefügt wird." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Zusätzliche PAR2-Parameter" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Nice-Parameter" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "IONice-Parameter" #: sabnzbd/skintext.py msgid "External process priority" msgstr "Priorität von externem Prozess" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Bei leerer Warteschlange Verbindung trennen" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "" "Verbindung zu Usenet-Servern trennen,
wenn die Warteschlange leer ist " "oder SABnzbd angehalten wurde." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Nach Alter sortieren" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "" "Einträge automatisch nach ihrem (durchschnittlichen) Alter sortieren." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" "Artikel werden angehalten bis sie mindestens das gewählte alter erreicht " "haben. Ändern der Job Priorität auf Erzwingen wird die Verzögerung " "überspringen." #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Auf neue Version prüfen" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Wöchentlich überprüfen, ob eine neue SABnzbd-Version verfügbar ist." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "Auch Test-Veröffentlichungen" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Leerzeichen in Ordnernamen ersetzen" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Leerzeichen in Ordnernamen durch Unterstriche ersetzen." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Punkte in Ordner-Namen ersetzen" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Punkte in Ordner-Namen durch Leerzeichen ersetzen." #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Für Windows kompatibel machen" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "" "Für Server: stell sicher, dass die Dateinamen mit Windows kompatibel sind." #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Browser beim Start öffnen" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Den Standard-Browser öffnen, wenn SABnzbd gestartet wird." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Downloads während der Nachbearbeitung anhalten" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Hält die Downloads zu Beginn der Nachbearbeitung an
und setzt sie " "danach fort." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Beispieldateien ignorieren" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Beispieldateien herausfiltern (z.B. Videoausschnitte)" #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Nach dem Download löschen" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "HTTPS Zertifikat Überprüfung" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" "Überprüfe Zertifikate bei Verbindungen zu Indexern und RSS-Quellen über " "HTTPS." #: sabnzbd/skintext.py msgid "Server" msgstr "Server" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Nachbearbeitung" #: sabnzbd/skintext.py msgid "Naming" msgstr "Benennung" #: sabnzbd/skintext.py msgid "Quota" msgstr "Kontingent" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indexierung" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Wie viel kann in diesem Monat heruntergeladen werden (K/M/G)?" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Tag zurücksetzen" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "An welchem Tag des Monats oder der Woche (1=Montag) setzt Ihr ISP das " "Kontingent zurück (optional mit hh:mm)?" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Automatisch fortsetzen" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "" "Soll wieder Heruntergeladen werden, nachdem das Kontingent zurückgesetzt " "wurde?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Kontingents-Periode" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "" "Wird das Kontingent jeden Tag, jede Woche oder jeden Monat zurückgesetzt?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Vor dem Herunterladen überprüfen" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Versuche die erfolgreiche Fertigstellung noch vor dem Herunterladen " "vorherzusagen (langsamer!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "SSL-Verschlüsselung" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" "Die Performanz verbessern, indem eine schwächere SSL-Verschlüsselung " "erzwungen wird." #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "Maximale Wiederholungen" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Maximale Anzahl wiederholter Versuche pro Server" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Aufträge abbrechen, die nicht abgeschlossen werden können" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Job abbrechen falls während des Downloads klar wird, dass zuviele Daten " "fehlen" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "Indexer Integration eingeschaltet" #: sabnzbd/skintext.py 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" msgstr "Filter aktivieren" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Action-Downloads nach Filterregeln." #: sabnzbd/skintext.py msgid "Abort If" msgstr "Abbrechen wenn" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Andererseits pausieren wenn" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Videobewertung" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Audiobewertung" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spam" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Bestätigt" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Mehr Daumen-Hoch als -Runter" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Titel-Schlüsselwörter" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Durch Komma getrennte Liste" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "Auswahl der Server-IP-Adresse" #: sabnzbd/skintext.py msgid "First IP address" msgstr "Erste IP-Adresse" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "Zufällig ausgewählte IP-Adresse" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "Schnellste IP-Adresse, IPv6 bevorzugt" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Nützlich, wenn ein Newsserver mehr als eine IPv4/IPv6-Adresse hat" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Server hinzufügen" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Serverbeschreibung" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Port" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Benutzername" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Passwort" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Zeitüberschreitung" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Rückhaltezeit" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "Sichere Verbindung zum Server" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "Zertifikat überprüfung" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" "Minimum: Wenn SSL aktiviert, prüft die Serveridentität und Benutzung seiner " "Zertifikate. Strikt: Prüft und stelle sicher das der Hostname stimmt." #: sabnzbd/skintext.py msgid "Disabled" msgstr "Deaktiviert" #: sabnzbd/skintext.py msgid "Minimal" msgstr "Minimum" #: sabnzbd/skintext.py msgid "Strict" msgstr "Strikt" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 ist die höchste, 99 die niedrigste Priorität" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Optional" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "Für unzuverlässige Server, wird bei Fehlern länger ignoriert" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Aktivieren" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Server entfernen" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Server überprüfen" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Zähler zurücksetzen" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Server-Angaben werden überprüft …" #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Bandbreite" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Gruppe senden" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Gruppen-Befehl senden, bevor Artikeln angefordert werden." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Persönliche Notizen" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Regel hinzufügen" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Häufigkeit" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Aktion" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Argumente" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Aktuelle Regeln" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Aktivieren Sie das Feld neben dem Feed-Namen, wenn automatisch auf neue " "Einträge geprüft werden soll.
Wenn ein Feed hinzugefügt wird, werden " "nur neue Einträge verarbeitet und nicht diejenigen, die bereits im RSS-Feed " "enthalten waren, ausser Sie klicken \"Download erzwingen\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "Trenne verschiedene URLs mit Komma" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Feed lesen" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Download erzwingen" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filter" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Akzeptieren" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Verwerfen" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Benötigt" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "Benötigt Kategorie" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Mindestens" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Höchstens" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "Von SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "Von Show SxxEyy" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Entspricht" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Entspricht nicht" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Heruntergeladen" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Jetzt alle Feeds lesen" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Email-Benachrichtigung beim Fertigstellen von Aufträgen" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Nie" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Immer" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Nur bei Fehlern" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Benachrichtigung bei voller Festplatte" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "" "E-Mail senden, wenn die Festplatte voll ist und SABnzbd angehalten wird." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "RSS-Benachrichtigungen senden" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "" "E-Mail senden, wenn ein RSS-Feed einen Auftrag zur Warteschlange hinzufügt." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "SMTP-Server" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "ISP-Server für ausgehende E-Mails angeben." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "E-Mail-Empfänger" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "E-Mail-Adresse, an die die E-Mails gesendet werden." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "E-Mail-Absender" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Wer soll die E-Mail versandt haben?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "Optionaler Konto-Benutzername" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Für authentifizierte E-Mails wird der Kontoname benötigt." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "Optionales Konto-Passwort" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Für authentifizierte E-Mails wird das Passwort benötigt." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Benachrichtigung gesendet!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Growl aktivieren" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Nur für entfernten Growl-Server verwenden (Rechnername:Port)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Server-Passwort" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Optionales Passwort für den Growl-Server" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "NotifyOSD aktivieren" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Benachrichtigungscenter" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Windows-Benachrichtigungen aktivieren" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Windows-Benachrichtigungen" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Prowl-Benachrichtigungen aktivieren" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Benötigt einen Prowl-Account" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "API-Schlüssel für Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Dein API-Key für Prowl (benötigt)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Pushover-Benachrichtungen aktivieren" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Benötigt einen Pushover-Account" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Applikationstoken" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Applikationstoken (benötigt)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Benutzer-Schlüssel" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Benutzer-Schlüssel (benötigt)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Gerät(e)" #: sabnzbd/skintext.py [Pushover settings] 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 "Notfall Wiederanlauf" #: 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 "Notfall Verfall" #: sabnzbd/skintext.py [Pushover settings] msgid "How many seconds your notification will continue to be retried" msgstr "" "Wieviele Sekunden soll versucht werden deine Nachricht erneut zu versenden" #: sabnzbd/skintext.py [Header for Pushbullet notification section] msgid "Pushbullet" msgstr "Pushbullet" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Pushbullet-Benachrichtigungen aktivieren" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Benötigt einen Pushbullet-Account" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Persönlicher API-Key" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Dein Pushbullet API-Key (benötigt)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Gerät" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Geräte, welche die Benachrichtigungen empfangen sollen" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "Benachrichtigungs-Skript" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "Aktiviere Benachrichtigungs-Skript" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "Führt ein benutzerdefiniertes Skript aus" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "Welches Skript sollte für die Benachrichtigung ausgeführt werden" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
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.
Weitere Informationen " "können im Wiki gefunden werden." #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Ein Sternchen * am Pfad-Ende verhindert die Erzeugung von Auftrags-Ordnern." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Relative Ordner basieren auf" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Ordner/Pfad" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "Indexer Kategorien/Gruppen" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Sortieren von TV-Serien" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "TV-Sortierung aktivieren" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Muster-Schlüssel" #: sabnzbd/skintext.py msgid "Clear" msgstr "Löschen" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "Filter übernehmen" #: sabnzbd/skintext.py msgid "Presets" msgstr "Voreinstellungen" #: sabnzbd/skintext.py msgid "Example" msgstr "Beispiel" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "Film Sortierung" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Film-Sortierung aktivieren" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Unbestimmte Downloads in einem zusätzlichen Ordner speichern." #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Betroffene Kategorien" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Bedeutung" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Muster" #: sabnzbd/skintext.py msgid "Result" msgstr "Resultat" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Staffel-Ordner" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Staffel-Ordner" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Episoden-Ordner" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 Episoden-Ordner" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "Aufgabe Name als Ordnername" #: sabnzbd/skintext.py msgid "Title" msgstr "Titel" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Film Name" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Film.Name" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Film_Name" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Sendungs Name" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Sendungs.Name" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Sendungs_Name" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Staffel-Nummer" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Episoden-Nummer" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Episoden-Name" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Episoden.Name" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Episoden_Name" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Dateiendung" #: sabnzbd/skintext.py msgid "Extension" msgstr "Endung" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Teilnummer" #: sabnzbd/skintext.py msgid "Decade" msgstr "Jahrzehnt" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Ursprünglicher Dateiname" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "Ursprünglicher Aufgabe Name" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Kleinschreibung" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEXT" #: sabnzbd/skintext.py msgid "text" msgstr "text" #: sabnzbd/skintext.py msgid "file" msgstr "Datei" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Sortieranweisung" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Markierung für mehrere Teile" #: sabnzbd/skintext.py msgid "In folders" msgstr "In Ordnern" #: sabnzbd/skintext.py msgid "No folders" msgstr "Keine Ordner" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Sortieren nach Datum" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Sortieren nach Datum aktivieren" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Ordner mit Name der Sendung" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "Jahr-Monat-Ordner" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Tägliche Ordner" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "Groß- / Kleinschreibung berücksichtigen" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Ergebnis" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Selten genutzte Funktionen. Bedeutung und Erklärungen finden Sie per klick " "auf den Hilfe-Button um auf die Wiki-Seite zu gelangen.
Änder nichts ohne " "vorher das Wiki gelesen zu haben, da sonst schwerwiegende Nebeneffekte " "auftreten können.
Die Ursprungswerte stehen zwischen den runden Klammern." #: sabnzbd/skintext.py msgid "Values" msgstr "Werte" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "NZB-Details bearbeiten" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Löschen" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Ganz nach oben" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Nach oben" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Nach unten" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Ganz nach unten" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Alle" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Invertieren" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Dateiname" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Betreff" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Auswahl" #: sabnzbd/skintext.py msgid "left" msgstr "rest" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Freier Speicherplatz" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Temporärer Ordner" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Mehrfach-Funktionen" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Shift-Taste gedrückt halten, um einen ganzen Bereich auszuwählen" #: sabnzbd/skintext.py msgid "Check all" msgstr "Alle auswählen" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "SABnzbd neustarten" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Status und Interface-Optionen" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Oder Dateien per Drag-und-Drop ins Fenster ziehen!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Verbindung zu SABnzbd verloren.." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Aktualisierungsrate" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "die globalen Interface-Einstellungen verwenden" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Limit der Objekte in der Warteschlange" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Limit der Objekte im Verlauf" #: sabnzbd/skintext.py msgid "Date format" msgstr "Datumsformat" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Extra Warteschlangen-Spalte" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "Extra Verlauf-Spalte" #: sabnzbd/skintext.py msgid "page" msgstr "Seite" #: sabnzbd/skintext.py msgid "Loading" msgstr "Wird geladen..." #: sabnzbd/skintext.py msgid "articles" msgstr "Artikel" #: sabnzbd/skintext.py msgid "Rename" msgstr "Umbenennen" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Reparatur der Warteschlange" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Aktive Verbindungen anzeigen" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Verwaiste Aufträge" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Zurück in die Warteschlange schicken" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Alle löschen" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Alle wiederholen" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "NZB aus URL laden" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "NZB hochladen" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Wahlweise einen Dateinamen angeben:" #: sabnzbd/skintext.py msgid "Submit" msgstr "Senden" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Open Informational-URL" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Versendet. Danke!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Nichts ausgewählt!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Alle ausgewählten Dateien entfernen" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Vollendete Dateien anzeigen/verstecken" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Skript-Protokoll anzeigen" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Neue Version verfügbar!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" "Lokale Speicherung (cookies) sind in ihrem Browser Deaktiviert, Oberflächen " "Einstellungen gehen Verloren wenn sie den Browser schließen." #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "Glitter hat ein paar (neue) Feature die du bestimmt magst!" #: sabnzbd/skintext.py msgid "Custom" msgstr "Benutzerdefiniert" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "Kompaktes Layout" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "Tab Layout
(separate Warteschlange und Verlauf)" #: sabnzbd/skintext.py msgid "Speed" msgstr "Geschwindigkeit" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Löschen von Downloads bestätigen" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Löschen von Verlaufeinträgen bestätigen" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Wie lange oder bis wann möchtest du pausieren? (in Englisch!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Sorry, damit konnten wir nichts anfangen. Versuchs nochmal." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Anhalten für …" #: 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 "" "Alle Benutzernamen, Passwörter und API-Schlüssel werden automatisch aus dem " "Log und der darin enthaltenen Kopie deiner Einstellungen entfernt." #: sabnzbd/skintext.py msgid "Sort by Age Oldest→Newest" msgstr "Sortieren nach Alter Älteste→Neuste" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Sortieren nach Alter Neuste→Älteste" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Sortieren nach Name A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Sortieren nach Name Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Sortieren nach Grösse Kleinste→Grösste" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Sortieren nach Grösse Grösste→Kleiste" #: sabnzbd/skintext.py msgid "Uploading" msgstr "Wird hochgeladen" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "Erzwinge Trennung" #: sabnzbd/skintext.py msgid "Removing job" msgstr "Entferne Job" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "Entferne Jobs" #: sabnzbd/skintext.py msgid "Prev" msgstr "Zurück" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Weiter" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "Verlauf wirklich leeren?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Sie müssen JavaScript aktivieren, damit Plush funktioniert!" #: sabnzbd/skintext.py msgid "Options" msgstr "Optionen" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Wie viele Minuten angehalten werden soll." #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Hauptmenü" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Wenn fertig" #: sabnzbd/skintext.py msgid "Sort" msgstr "Sortieren" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Sortieren nach Alter Älteste→Neuste" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Sortieren nach Alter Neuste→Älteste" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Sortieren nach Name A→Z" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Sortieren nach Name Z→A" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Sortieren nach Grösse Kleinste→Grösste" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Sortieren nach Grösse Grösste→Kleiste" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "Warteschlange leeren?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Alle fehlgeschlagenen Aufträge im Verlauf wiederholen?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Leeren" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Maximale
Geschwindigkeit" #: sabnzbd/skintext.py msgid "Range" msgstr "Bereich" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Auf Auswahl anwenden" #: sabnzbd/skintext.py msgid "Everything" msgstr "Alles" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Aktualisierungsrate" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Breite" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Verhindert, dass die Inhalte aktualisiert werden, wenn sich der Mauszeiger " "über der Warteschlange befindet." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Aktualisierung durch Mauszeiger verhindern" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Hochladen" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Hochladen: .nzb .rar .zip .gz .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Fortschritt" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Nicht genug freier Speicherplatz für fertige Downloads!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Freier Speicherplatz (Ordner mit temporären Dateien)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "LEERLAUF" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Downloads" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "SABnzbd-Einrichtungsassistent" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "SABnzbd-Version" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Zurück" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Server-Details" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Geben Sie bitte die Informationen zu Ihrem Usenet-Provider an." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Die Anzahl der Verbindungen, die der Provider erlaubt." #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "Z.B. 8 oder 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Nur auswählen, wenn der Provider SSL-Verbindungen erlaubt." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Klicken um die eingegebenen Informationen zu überprüfen." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Z. B." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "Die Einrichtung ist nun abgeschlossen." #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd läuft nun im Hintergrund." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "" "Das Schliessen des Browser-Fensters oder -Tabs beendet SABnzbd NICHT." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Es ist empfehlenswert, diese Seite mit einem Lesezeichen zu versehen und " "dieses verwenden, um SABnzbd aufzurufen, wenn es im Hintergrund läuft." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Weiterführende Informationen finden Sie in unserem" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "SABnzbd anzeigen" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "SABnzbd beenden" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Assistenten starten" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "Für SABnzbd besteht KEINERLEI GARANTIE.\n" "SABnzbd ist freie Software, die Sie unter bestimmten Bedingungen weitergeben " "dürfen.\n" "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] msgid "Error getting TV info (%s)" msgstr "Fehler beim Abrufen der TV-Informationen: %s" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "Umbenennen von %s nach %s fehlgeschlagen." #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "Umbenennen der gleichen Datei von %s nach %s fehlgeschlagen." #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Unerlaubter Zugriff" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "Datei nicht auf dem Server" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "Server konnte nicht vollständig antworten" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "URLGRABBER abgestürzt" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "Ungültige NZB-Datei." #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "Abrufen der URL fehlgeschlagen; %s" #~ msgid "_yenc module... NOT found!" #~ msgstr "_yenc-Modul nicht gefunden!" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ 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." #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Das verwendete UNRAR-Programm wird nicht empfohlen. Laden Sie UNRAR " #~ "stattdessen herunter von http://www.rarlab.com/rar_add.htm
" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "" #~ "Kein UNRAR-Programm gefunden. Das Entpacken von RAR-Dateien ist nicht " #~ "möglich
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "Kein PAR2-Programm gefunden. Eine Reparatur ist nicht möglich
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "Auftrag \"%s\" wurde wieder zur Warteschlange hinzugefügt" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "" #~ "Aufträge, die mit '*' markiert sind, werden nicht automatisch " #~ "heruntergeladen." #~ msgid "Not matched" #~ msgstr "Entspricht nicht" #~ msgid "Downloaded so far" #~ msgstr "Bis jetzt heruntergeladen" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "" #~ "Verbindung zu Registry-Umgebung HKEY_CURRENT_USER konnte nicht hergestellt " #~ "werden." #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Registry-Schlüssel %s konnte nicht geöffnet werden." #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Lesen der Registry-Schlüssel für spezielle Ordner fehlgeschlagen." #~ msgid "You have no permisson to use port %s" #~ msgstr "Sie haben nicht die Berechtigung, Port %s zu verwenden" #~ msgid "Try again" #~ msgstr "Erneut versuchen" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "pyopenssl-Modul fehlt. Bitte installieren für SSL-Unterstützung." #~ msgid "Unpacking failed, see log" #~ msgstr "Entpacken fehlgeschlagen. Beachten Sie das Protokoll." #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "Erwartete Datei %s nicht gefunden. Unrar-Fehler?" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "Entpacken fehlgeschlagen. Eine erwartete Datei wurde nicht entpackt." #~ msgid "Error importing OpenSSL module. Connecting with NON-SSL" #~ msgstr "" #~ "Fehler beim Importieren des OpenSSL-Moduls. Stelle Verbindung ohne SSL her." #~ msgid "File %s is empty, skipping" #~ msgstr "Die Datei %s ist leer und wird daher übersprungen" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "" #~ "Fehler beim Entfernen der NZB-Datei von der Nachbearbeitungs-Warteschlange " #~ "(id)" #~ msgid "No post-processing because of failed verification" #~ msgstr "Keine Nachbearbeitung wegen fehlgeschlagener Überprüfung" #~ msgid "View script output" #~ msgstr "Skript-Ausgabe anzeigen" #~ msgid "Error removing workdir (%s)" #~ msgstr "Fehler beim Entfernen des Arbeitsverzeichnisses %s." #~ msgid "Queued" #~ msgstr "In der Warteschlange" #~ msgid "Complete Dir" #~ msgstr "Fertige Downloads" #~ msgid "Download speed" #~ msgstr "Geschwindigkeit" #~ msgid "WARNINGS" #~ msgstr "WARNUNGEN" #~ msgid "Add new downloads" #~ msgstr "Neue Downloads hinzufügen" #~ msgid " or Report ID" #~ msgstr " oder Report-ID" #~ msgid "Sort by name" #~ msgstr "Nach Name sortieren" #~ msgid "Sort by age" #~ msgstr "Nach Alter sortieren" #~ msgid "Hide files" #~ msgstr "Dateien verbergen" #~ msgid "Show files" #~ msgstr "Dateien anzeigen" #~ msgid "Remain/Total" #~ msgstr "Verbleibend/Insgesamt" #~ msgid "History Size" #~ msgstr "Grösse des Verlaufs" #~ msgid "Show Weblogging" #~ msgstr "Web-Protokoll anzeigen" #~ msgid "Email Test Result" #~ msgstr "Resultat des E-Mail-Tests" #~ msgid "General configuration" #~ msgstr "Allgemeine Einstellungen" #~ msgid "Secondary Web Interface" #~ msgstr "Sekundäre Weboberfläche" #~ msgid "Activate an alternative skin." #~ msgstr "Gestaltung der sekundären Web-Oberfläche verändern." #~ msgid "Web server authentication" #~ msgstr "Authentifizierung für Web-Server" #~ msgid "HTTPS Support" #~ msgstr "HTTPS-Unterstützung" #~ msgid "Queue auto refresh interval:" #~ msgstr "Warteschlange automatisch neu laden" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "" #~ "Zeitintervall zwischen dem erneuten Laden der Warteschlange (in Sekunden). 0 " #~ "schaltet die Funktion ab." #~ msgid "Disable API-key" #~ msgstr "API-Key deaktivieren" #~ msgid "Do not require the API key." #~ msgstr "Keinen API-Schlüssel verwenden." #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "AUF EIGENE GEFAHR VERWENDEN!" #~ msgid "Folder configuration" #~ msgstr "Ordner-Einstellungen" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Ordner mit Nachbearbeitungs-Skripts" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "" #~ "Ordner, der benutzerdefinierte Skripts für die Nachbearbeitung von Downloads " #~ "enthält." #~ msgid "Switches configuration" #~ msgstr "Verschiedene Schalter" #~ msgid "Processing Switches" #~ msgstr "Verarbeitungs-Schalter" #~ msgid "Enable Quick Check" #~ msgstr "Schnelle Überprüfung aktivieren" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "PAR2-Überprüfung überspringen, wenn die Dateien 100% korrekt sind." #~ msgid "Enable Unrar" #~ msgstr "unrar aktivieren" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Eingebaute Entpack-Funktion für RAR-Archive aktivieren." #~ msgid "Enable built-in unzip functionality." #~ msgstr "Eingebaute Entpack-Funktion für ZIP-Archive aktivieren." #~ msgid "Enable Filejoin" #~ msgstr "Zusammenfügen von Dateien aktivieren" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "" #~ "Dateien, die mit .001, .002 usw. enden, zu einer Datei zusammenfügen." #~ msgid "Enable TS Joining" #~ msgstr "Zusammenfügen von TS-Dateien aktivieren" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "" #~ "Dateien, die mit .001.ts, .002.ts usw. enden, zu einer Datei zusammenfügen." #~ msgid "Enable Par Cleanup" #~ msgstr "PAR-Dateien aufräumen" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "" #~ "PAR-Dateien entfernen, wenn die Überprüfung und Reparatur erfolgreich war." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "yEnc-CRC-Fehler nicht ignorieren" #~ msgid "Default Post-Processing" #~ msgstr "Standardmässige Nachbearbeitung" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "" #~ "Wird verwendet, wenn die Kategorie keine Nachbearbeitung vorschreibt." #~ msgid "Default User Script" #~ msgstr "Standardmässiges Benutzer-Skript" #~ msgid "Used when no user script is defined by the category." #~ msgstr "Wird verwendet, wenn die Kategorie kein Benutzer-Skript vorschreibt." #~ msgid "Default Priority" #~ msgstr "Standardmässige Priorität" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Wird verwendet, wenn die Kategorie keine Priorität vorschreibt." #~ msgid "Enable MultiCore Par2" #~ msgstr "Mehrkernprozessor-Unterstützung von PAR2 verwenden" #~ msgid "Other Switches" #~ msgstr "Andere Schalter" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Ungültige Zeichen in Ordnernamen ersetzen" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "Ungültige Zeichen in Ordnernamen durch äquivalente Zeichen ersetzen
(oder ansonsten entfernen)." #~ msgid "Do not download" #~ msgstr "Nicht herunterladen" #~ msgid "SSL type" #~ msgstr "SSL-Typ" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "V23 verwenden, ausser wenn der Provider etwas anderes benötigt." #~ msgid "Server configuration" #~ msgstr "Server-Einstellungen" #~ msgid "Backup server" #~ msgstr "Ersatz-Server" #~ msgid "Click below to test." #~ msgstr "Unten Klicken zum Überprüfen." #~ msgid "Scheduling configuration" #~ msgstr "Planung" #~ msgid "Remove" #~ msgstr "Entfernen" #~ msgid "RSS Configuration" #~ msgstr "RSS-Einstellungen" #~ msgid "New Feed URL" #~ msgstr "Neue Feed-URL" #~ msgid "Delete Feed" #~ msgstr "Feed löschen" #~ msgid "Email Options" #~ msgstr "Email-Optionen" #~ msgid "Email Account Settings" #~ msgstr "E-Mail-Kontoeinstellungen" #~ msgid "User-defined categories" #~ msgstr "Benutzerdefinierte Kategorien" #~ msgid "Defines post-processing and storage." #~ msgstr "Beeinflusst die Nachbearbeitung und Speicherung von Downloads." #~ msgid "Sorting configuration" #~ msgstr "Sortier-Einstellungen" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Sortieren und Umbenennen von Episoden aktivieren." #~ msgid "Generic Sorting" #~ msgstr "Allgemeines Sortieren" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Allgemeines Sortieren und Umbenennen von Dateien aktivieren." #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "" #~ "Aktivieren, wenn Downloads nicht in ihre eigenen Ordner abgelegt werden." #~ msgid "Enable sorting and renaming of date named files." #~ msgstr "" #~ "Sortieren und Umbenennen von Dateien mit Daten im Dateinamen aktivieren." #~ msgid "Are you sure you want to delete" #~ msgstr "Möchten Sie wirklich löschen" #~ msgid "Page" #~ msgstr "Seite" #~ msgid "First" #~ msgstr "Anfang" #~ msgid "Last" #~ msgstr "Ende" #~ msgid "Close" #~ msgstr "Schliessen" #~ msgid "Set Pause Interval" #~ msgstr "Eine bestimmte Zeit lang anhalten" #~ msgid "Pause Interval" #~ msgstr "Anhalten" #~ msgid "Pause for 12 hours" #~ msgstr "12 Stunden anhalten" #~ msgid "Pause for 24 hours" #~ msgstr "24 Stunden anhalten" #~ msgid "Left" #~ msgstr "Verbleibend" #~ msgid "Open Source URL" #~ msgstr "Open Source-URL" #~ msgid "Storage" #~ msgstr "Speicherort" #~ msgid "Plush Options" #~ msgstr "Plush-Einstellungen" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Hochladen: .nzb .rar .zip .gz" #~ msgid "Hour:Min" #~ msgstr "Stunde:Min" #~ msgid "Delete the all failed items from the history?" #~ msgstr "" #~ "Möchten Sie alle fehlergeschlagenen Downloads aus dem Verlauf löschen?" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Einträge %s bis %s von insgesamt %s werden angezeigt" #~ msgid "Email Sent!" #~ msgstr "E-Mail gesendet!" #~ msgid "Saved" #~ msgstr "Gespeichert" #~ msgid "Toggle Add NZB" #~ msgstr "NZB hinzufügen" #~ msgid "DualView1" #~ msgstr "DualView 1" #~ msgid "DualView2" #~ msgstr "DualView 2" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "Möchten Sie SABnzbd wirklich neu starten?" #~ msgid "Hide Edit Options" #~ msgstr "Bearbeitungs-Einstellungen verbergen" #~ msgid "Show Edit Options" #~ msgstr "Bearbeitungs-Einstellungen anzeigen" #~ msgid "Edit" #~ msgstr "Bearbeiten" #~ msgid "Timeleft" #~ msgstr "Verbleibend" #~ msgid "Access" #~ msgstr "Zugriff" #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "Alle Rechner in meinem Netzwerk sollen auf SABnzbd zugreifen können." #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Passwortgeschützter Zugriff auf SABnzbd (empfohlen)" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Zugriff auf SABnzbd über HTTPS ermöglichen" #~ msgid "Misc" #~ msgstr "Verschiedenes" #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "SABnzbd in meinem Webbrowser öffnen, wenn es gestartet wird." #~ msgid "This field is required." #~ msgstr "Dieses Feld wird benötigt." #~ msgid "Please enter a whole number." #~ msgstr "Bitte geben Sie eine ganze Zahl ein." #~ msgid "Step One" #~ msgstr "Schritt 1" #~ msgid "Step Two" #~ msgstr "Schritt 2" #~ msgid "Step Three" #~ msgstr "Schritt 3" #~ msgid "Step Four" #~ msgstr "Schritt 4" #~ msgid "Step Five" #~ msgstr "Schritt 5" #~ msgid "KB/s" #~ msgstr "KB/s" #~ msgid " " #~ msgstr " " #~ msgid "Thread" #~ msgstr "Thread" #~ msgid "Skip" #~ msgstr "Überspringen" #~ msgid "Links" #~ msgstr "Links" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd funktioniert nicht in Kombination mit manchen Software-" #~ "Firewalls.
\n" #~ " %s
\n" #~ " Dieses Problem können Sie zur Zeit nicht selber lösen.
\n" #~ " Beschweren Sie sich bitte beim Hersteller der Firewall.
\n" #~ "
\n" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " Für seinen internen Web-Server benötigt SABnzbd einen freien TCP/IP-" #~ "Port.
\n" #~ " Port %s auf %s wurde probiert, aber das für SABnzbd verwendete Konto " #~ "darf ihn nicht verwenden.
\n" #~ " Auf OS X und Linux-Systemen müssen normale Benutzer Ports über 1023 " #~ "verwenden.
\n" #~ "
\n" #~ " Starten Sie SABnzbd bitte mit einer anderen Portnummer neu." #~ msgid "No email templates found" #~ msgstr "Keine E-Mail-Vorlagen gefunden" #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Sie verwenden wahrscheinlich ZoneAlarm auf Vista.
" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Unpacking failed, these file(s) are missing:" #~ msgstr "Entpacken fehlgeschlagen. Diese Dateien fehlten:" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "12-Stunden-Uhr verwenden (AM/PM)" #~ msgid "Showing one result" #~ msgstr "Ein Resultat wird angezeigt" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Zeiten in der AM/PM-Notation anzeigen (betrifft die Regeln nicht)." #~ msgid "No results" #~ msgstr "Keine Ergebnisse" #~ msgid "folder" #~ msgstr "Ordner" #~ msgid "Original Foldername" #~ msgstr "Ursprünglicher Ordnername" #~ msgid "Groups / Indexer tags" #~ msgstr "Gruppen/Indexer-Tags" #~ msgid "Invalid encoding of email template %s" #~ msgstr "Ungültige Kodierung der E-Mail-Vorlage %s" #~ msgid "Server definition" #~ msgstr "Server-Definition" #~ msgid "Delete Completed" #~ msgstr "Fertige entfernen" #~ msgid "Delete Failed" #~ msgstr "Fehlgeschlagene entfernen" #~ msgid "Delete all failed items from History?" #~ msgstr "Alle fehlgeschlagenen Downloads aus dem Verlauf entfernen?" #~ msgid "Purge Failed History" #~ msgstr "Fehlgeschlagene aus Verlauf entfernen" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "Bei yEnc-CRC-Fehlern Ersatz-Server verwenden." #~ msgid "Feeds" #~ msgstr "Feeds" #~ msgid "Add Feed" #~ msgstr "Feed hinzufügen" #~ msgid "Settings" #~ msgstr "Einstellungen" #~ msgid "Get NZB" #~ msgstr "NZB abrufen" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Feed lesen ruft den momentanen Inhalt des Feeds ab. " #~ "Download erzwingen lädt sogleich alle passenden NZB-Dateien " #~ "herunter." #~ 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" #~ msgid "Only for optional servers" #~ msgstr "Nur für optionale Server" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Die Anzahl Wiederholungen nur auf optionale Server anwenden" #~ msgid "Send notifications to Growl" #~ msgstr "Benachrichtigungen an Growl senden" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Benachrichtigungen an NotifyOSD senden" #~ msgid "Check result of unpacking" #~ msgstr "Resultat des Entpackens überprüfen" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Resultat des Entpackens überprüfen (muss bei manchen Dateisystemen " #~ "deaktiviert sein)." #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Nur mein Rechner soll auf SABnzbd zugreifen können." #~ msgid "Sort by size" #~ msgstr "Nach Größe sortieren" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Nach dem Neustart von SAbnzbd können Sie über folgende Adresse darauf " #~ "zugreifen: %s" #~ msgid "QR Code" #~ msgstr "QR-Code" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "WARNUNG: Job \"%s\" abgebrochen wegen verschlüsselter RAR Datei" #~ msgid "Notification classes" #~ msgstr "Benachrichtigungsarten" #~ msgid "Send notifications to Notification Center" #~ msgstr "Benachrichtigung an Benachrichtigungscenter schicken" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "" #~ "Benachrichtigung für Nachrichtengruppen aktivieren (keine, eine oder " #~ "mehrere)" #~ msgid "Main packet not found..." #~ msgstr "Hauptpaket nicht gefunden …" #~ msgid "Initiating restart...
" #~ msgstr "Neustart wird durchgeführt …
" #~ msgid "ERROR: %s" #~ msgstr "FEHLER: %s" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "" #~ "Automatisch berechnete Validierungsergebnisse deiner Downloads zum Indexer " #~ "übermitteln." #~ msgid "Automatic Feedback" #~ msgstr "Automatisches Feedback" #~ msgid "Site API Key" #~ msgstr "API-Schlüssel deines OZnzb-Accounts" #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Der OZnzb-Indexer stellt erweiterte Funktionalitäten inkl. Bewertungen und " #~ "extra Statusinformationen zur Verfügung." #~ msgid "Enable OZnzb Integration" #~ msgstr "OZnzb-Integration aktivieren" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Dieser Schlüssel identifiziert dich gegenüber des Indexers. Siehe auch " #~ "https://www.oznzb.com/profile." sabnzbd-develop/po/main/he.po0000600000175000017500000043307713642116632014251 0ustar jpjp# Hebrew translation for sabnzbd # Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2017. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2020-02-22 22:41+0000\n" "Last-Translator: ION IL \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-23 06:05+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "נכשל בהתחלת ממשק רשת" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "מנסה תבנית תקנית ,%s :×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×ª×‘× ×™×•×ª רשת" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "מושבת: ×œ× × ×ž×¦××” גרסה נכונה! (נמצ××” %s מצפה ×ל %s) SABYenc" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "%s - https://sabnzbd.org/sabyenc ×œ× × ×ž×¦×! מצפה ×ל ...SABYenc פירקן" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "!בינ×רי... ×œ× × ×ž×¦× par2" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "!בינ×רי... ×œ× × ×ž×¦× MultiPar" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr ".×•×™×“×•× ×•×ª×™×§×•×Ÿ ×œ× ×™×”×™×• ×פשריי×" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr ".שלך ×”×™× %s ×נו ×ž×ž×œ×™×¦×™× ×¢×œ גרסה %s ×ו גבוהה יותר UNRAR גרסת
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "בינ×רי... ×œ× × ×ž×¦× unrar" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "!בינ×רי... ×œ× × ×ž×¦× unzip" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "!בינ×רי... ×œ× × ×ž×¦× za7" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr ".×¤×™×¨×§× ×™× ×—×™×•× ×™×™× ×—×¡×¨×™×, הורדה ××™× ×” יכולה להתחיל" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "עבור גישה חיצונית IPv6 ×× × ×”×™×” מודע ×©×©× ×”×ž×רח 0.0.0.0 יצטרך כתובת" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "×ינן יכולות להיות ×ותו דבר HTTPS-ו HTTP פתחות של" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" ".של ×§×‘×¦×™× ×•×¡×¤×¨×™×•×ª בהורדות Unicode צפה לבעיות ×¢× ×©×ž×•×ª .UTF-8 ×”×™× ×מורה להיות " ",%s הותחל ×¢× ×”×¦×¤× ×ª SABnzbd" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "KEY-ו CERT בגלל ×§×‘×¦×™× ×—×¡×¨×™× ×©×œ HTTPS השבית ×ת" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "נכשל בהתחלת ממשק-רשת: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "SABHelper ×œ× × ×™×ª×Ÿ לגשת ×ל השירות" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "התחיל SABnzbd %s" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "×זהרה" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "שגי××”" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "×”×¡×ª×™×™× SABnzbd כיבוי" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr ".×©× ×”×ž×רח ×œ× × ×§×‘×¢" #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr ".×ין ×—×™×‘×•×¨×™× ×©× ×§×‘×¢×•. ×× × ×§×‘×¢ לפחות חיבור ×חד" #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "סיסמ×ות מוסוות ב-******, ×× × ×”×›× ×¡ מחדש" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "פרטי שרת בלתי תקפי×" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr ".×ו להתחבר על פתחה שונה SSL ×זל הזמן: נסה ל×פשר" #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "×זל הזמן" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr ".×ו להתחבר על פתחה שונה SSL בלתי ידוע: נסה להשבית SSL פרוטוקול" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr ".כתובת שרת בלתי תקפה" #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr ".שרת ×™×¦× ×‘×ž×”×œ×š רצף כניסות" #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr ".השרת דורש ×©× ×ž×©×ª×ž×© וסיסמה" #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "!חיבור מוצלח" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr ".×ימות נכשל, בדוק ×©× ×ž×©×ª×ž×©/סיסמה" #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "יותר מדי חיבורי×, ×× × ×”×©×”×” הורדה ×ו נסה שוב מ×וחר יותר" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "(%s) ×œ× ×”×™×” ניתן לקבוע תוצ×ת חיבור" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "...נתפס, שומר ×•×™×•×¦× %s ×ות" #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "שגי××” חמורה במצב שמירה" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "%s-מ NZB מנסה למשוך" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "שמירת %s נכשלה" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "%s ×œ× × ×™×ª×Ÿ ליצור קובץ זמני עבור" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "%s מנסה לקבוע מעמד של שרת בלתי ×§×™×™×" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "tempfile.mkstemp-כישלון ב" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "נכשלה %s טעינת" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "דו×\"ל הצליח" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "בחן התר××”" #: sabnzbd/api.py msgid " Resolving address" 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 "×ין" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "ברירת מחדל" #: sabnzbd/api.py msgid "unknown" msgstr "בלתי ידוע" #: sabnzbd/api.py [Error message] 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 "דיסק מל×! מ×לץ השהיה" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "%s שגי×ת דיסק ביצירת קובץ" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Assembler-שגי××” חמורה ב" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "(מוצפן (במקרה שסופקה, כל הסיסמ×ות נוסו RAR בגלל קובץ \"%s\" ×זהרה: השהה ×ת " "העבודה" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "(מוצפן (במקרה שסופקה, כל הסיסמ×ות נוסו RAR בגלל קובץ \"%s\" ×זהרה: ביטל ×ת " "העבודה" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "בוטל, הצפנה התגלתה" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "%s קובץ בלתי רצוי ×”×•× .RAR סיומת בלתי רצויה בקובץ \"%s\"-×זהרה: ב " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "%s rar סיומת בלתי רצויה בקובץ" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "בוטל, סיומת בלתי רצויה התגלתה" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "(%s) בגלל מידרג \"%s\" ×זהרה: השהה ×ת העבודה" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "(%s) בגלל מידרג \"%s\" ×זהרה: ביטל ×ת העבודה" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "(%s) בוטל, מסנן מידרג הות××" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s חסרי×" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "×–×” RAR ×¢× ×ותו ×”×©× ×‘×ª×•×š RAR כנר××” מוצפנת עקב \"%s\" העבודה" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "\"%s\" כנר××” מוצפנת: \"סיסמה\" ×‘×©× ×”×§×•×‘×¥ \"%s\" העבודה" #: sabnzbd/assembler.py msgid "video" msgstr "וידי×ו" #: sabnzbd/assembler.py msgid "audio" msgstr "שמע" #: sabnzbd/assembler.py msgid "spam" msgstr "זבל" #: sabnzbd/assembler.py msgid "passworded" msgstr "מוגן בסיסמה" #: sabnzbd/assembler.py msgid "downvoted" msgstr "הוצבע נגד" #: sabnzbd/assembler.py msgid "keywords" msgstr "מילות מפתח" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "מיכסה נוצלה, משהה הורדה" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "××™× ×” כתובת דו×\"ל תקפה %s" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "כתובת שרת דרושה" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "%s תיקייה %s ×œ× ×™×›×•×œ ליצור" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "%s קובץ INI ×œ× × ×™×ª×Ÿ לכתוב ×ל" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "%s ×œ× × ×™×ª×Ÿ ליצור קובץ גיבוי עבור" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "%s סיסמה מוצפנת ב×ופן שגוי" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s ×ינו ערך ×וקטלי נכון" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "×ינו מותר ×›×ן \"%s\" UNC נתיב" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr ".שגי××”: ×ורך הנתיב צריך להיות מתחת ×ל %s" #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr ".שגי××”: התור ×ינו ריק, ×œ× ×™×›×•×œ לשנות תיקייה" #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "!×œ× × ×™×ª×Ÿ לכתוב במסד-× ×ª×•× ×™× ×©×œ היסטוריה, בדוק זכויות גישה" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "מסד-× ×ª×•× ×™× ×”×™×¡×˜×•×¨×™×” פגו×, נוצר תחליף ריק" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "נכשלה, ר××” יומן SQL פקודת" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "נכשל בסגירת מסד-נתוני×, ר××” יומן" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "%s התחברות שלב בלתי תקפה בהיסטוריה עבור" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "נכשל %s פענוח" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "כישלון מפענח: ×ין זיכרון" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "%s-נוצר ב×ופן גרוע ב yEnc מ×מר" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "%s שגי××” בלתי ידועה בעת פענוח" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "חסר מכל השרתי×, משליך <= %s" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "פריקה ישירה" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "הושל×" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "פורקו %s קבצי×/תיקיות תוך %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr ".פריקה ישירה ×ופשרה ב×ופן ×וטומטי" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message] msgid "Cannot read %s" msgstr "×œ× ×™×›×•×œ ×œ×§×¨×•× ×ת %s" #: sabnzbd/dirscanner.py [Error message] msgid "Error while adding %s, removing" msgstr "מסיר ,%s שגי××” בזמן הוספת" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "%s שגי××” בהסרת" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "%s ×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ת התיקייה המושגחת" #: sabnzbd/downloader.py msgid "Resuming" msgstr "ממשיך" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "מושהה" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "×תה חייב לקבוע רוחב פס מרבי לפני ש×תה קובע מגבלת רוחב פס" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "%s [%s] ×œ× × ×™×ª×Ÿ להתחבר לשרת" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "×©× ×”×©×¨×ª ×ינו פותר" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "ייתקל בהתעלמות למשך %s דקות %s השרת" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "%s :מהסיבה %s@%sנכשל ב×תחול" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "%s יותר מדי ×—×™×‘×•×¨×™× ×œ×©×¨×ª" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "שיתוף סביר של חשבון" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "%s נכשל בכניסה לשרת" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "%s=נכשלה, הודעה %s@%s התחברות ×ל" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "דורש ×©× ×ž×©×ª×ž×©/סיסמה %s השרת" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "הורדה חשודה במורידן" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "מכבה" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "נכשל בהתחברות לשרת דו×\"ל" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "TLS נכשל ביזימת חיבור" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "השרת ×œ× ×”×’×™×‘ כר×וי לברכת השלו×" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "נכשל ב×ימות שרת הדו×\"ל" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "×œ× × ×ž×¦××” שיטת ×ימות הולמת" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "כישלון בלתי ידוע של ×ימות בשרת דו×\"ל" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "נכשל בשליחת דו×\"ל" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "נכשל בסגירת חיבור דו×\"ל" #: sabnzbd/emailer.py # sabnzbd/notifier.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-×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×ª×‘× ×™×•×ª דו×\"ל" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "×œ× × ×™×ª× ×• נמעני×, ×œ× × ×©×œ×— דו×\"ל" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "%s :×ל\n" "%s :מן\n" "ת×ריך: %s\n" "מדווח על דיסק ×ž×œ× SABnzbd :נוש×\n" "\n" ",×”×™×™\n" "\n" ".הפסיק להוריד, מ×חר שהדיסק כמעט מל×\n" ".ב×ופן ידני SABnzbd ×× × ×¤× ×” ×ž×§×•× ×•×”×ž×©×š ×ת\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "%s ×œ× ×™×›×•×œ ליצור ×ת הספרייה" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "%s שגי×ת גישה :%s ספרייה" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "%s ×œ× ×™×›×•×œ לשנות הרש×ות של" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "(%s) נכשל בעשיה" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "%s ×ל %s נכשל בהעברת" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr ":מן \"%s\" חיבור מסורב ×¢× ×ž×רח" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "משתמש התחבר לממשק הרשת" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "משתמש התחבר" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "מפתח חסר של שיח" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "שגי××”: מפתח דרוש של שיח" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "שגי××”: מפתח ×œ× × ×›×•×Ÿ של שיח" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "מתצורה->כללי לתוך תוכנית הצד השלישי שלך api-חסר, ×× × ×”×›× ×¡ ×ת מפתח ×” API מפתח:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "מתצורה->כללי בתוכנית הצד השלישי שלך api-×ינו נכון, השתמש במפתח ×” API מפתח:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" ":×ימות חסר, ×× × ×”×›× ×¡ ×©× ×ž×©×ª×ž×©/סיסמה מתוך תצורה->כללי לתוך תוכנית הצד השלישי " "שלך" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "עיצוב חדש רענן המיועל עבור שולחן עבודה ×•×”×ª×§× ×™× × ×™×™×“×™×. לך ×ל תצורה -> כללי " "כדי לשנות ×ת עורך !Glitter נסה ×ת העור החדש שלנו" #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "%s-ניסיון כניסה בלתי מוצלחת מ" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "ב" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
.×”×¡×ª×™×™× SABnzbd כיבוי
.המתן בערך 5 שניות ו××– לחץ על הכפתור " "למטה

רענן
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr ".מספרית IP ×”×•× ×“×•-משמעי, השתמש בכתובת LOCALHOST :×זהרה" #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr ".××™× ×” תקפה \"%s:%s\" כתובת השרת" #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "×”×–× ×”" #: sabnzbd/interface.py msgid "Daily" msgstr "יומי" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "×™×•× ×©× ×™" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "×™×•× ×©×œ×™×©×™" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "×™×•× ×¨×‘×™×¢×™" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "×™×•× ×—×ž×™×©×™" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "×™×•× ×©×™×©×™" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "שבת" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "×™×•× ×¨×שון" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "כבוי" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "!שרת בלתי מוגדר" #: 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 msgid "Back" msgstr "הקוד×" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "שגי××”:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "%s: %s ערך ×œ× × ×›×•×Ÿ עבור" #: sabnzbd/misc.py msgid "d" msgstr "×™" #: sabnzbd/misc.py msgid "h" msgstr "ש" #: sabnzbd/misc.py msgid "m" msgstr "ד" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "SSL נכשל ביצירה של מפתח ו×ישור של" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "מריץ תסריט" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "(%s) בתר־עיבוד בוטל" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "תסריט" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "[%s] פריקת קינון ×רוכה מדי" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "מ×חד" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "רצף בלתי ×©×œ× ×©×œ ×§×‘×¦×™× ×‘×¨×™-×יחוד" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "נכשל %s ×יחוד ×§×‘×¦×™× ×©×œ" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "שגי××” \"%s\" בזמן ×יחוד ×§×‘×¦×™× [%s]" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "%s שגי××” \"%s\" בזמן הרצת ×יחוד_×§×‘×¦×™× ×‘" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] ×יחד %s קבצי×" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "%s ,פריקה נכשלה" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "RAR [%s] שגי××” \"%s\" בזמן פריקת קבצי" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "%s על rar_unpack שגי×ת \"%s\" בזמן הרצת" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "!נכשלה %s מחיקת" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "\"%s\" מנסה לחלץ ×¢× ×”×¡×™×¡×ž×”" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "פריקה נכשלה, ×רכיון דורש סיסמה" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "פורק" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "פרוק" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "%s פריקה נכשלה, ×œ× ×”×™×” ניתן ×œ×ž×¦×•× ×ת" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "\"%s\" שגי××”: ×œ× ×”×™×” ניתן ×œ×ž×¦×•× ×ת" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "פריקה נכשלה ,CRC שגי×ת" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "\"%s\"-נכשל ב CRC :שגי××”" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "(FAT?) פריקה נכשלה, קובץ גדול מדי עבור מערכת קבצי×" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "(%s) שגי××”: קובץ גדול מדי עבור מערכת הקבצי×" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "?פריקה נכשלה, שגי×ת כתיבה ×ו דיסק מל×" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "(%s) שגי××”: שגי×ת כתיבה" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "פריקה נכשלה, נתיב ×רוך מדי" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "(%s) שגי××”: נתיב ×רוך מדי" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "בלתי שמיש RAR קובץ" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "×¤×’×•× RAR קובץ" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s ×§×‘×¦×™× ×‘ %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "%s על unzip() שגי×ת \"%s\" בזמן הרצת" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "\"%s\" ×œ× × ×ž×¦×, ×œ× × ×™×ª×Ÿ לפרוק ×ת za7 בינ×רי" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "\"%s\" ×¢× ×”×¡×™×¡×ž×” 7zip מנסה" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "××™× ×” שלמה, ×œ× ×™×›×•×œ לפרוק \"%s\" ZIP7 ערכת" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "%s ×œ× ×”×™×” ניתן לפרוק ×ת" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "בדיקה זריזה" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "תיקון" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] בדיקה זריזה בסדר" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "מתחיל תיקון" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "%s ,תיקון נכשל" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "%s על ערכת par2_repair בזמן הרצת %s שגי×ת" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "%s על ערכת par2_repair בזמן הרצת \"%s\" שגי××”" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "קיבל ×פשרויות שגויות, בדוק ×ת הגדרות תצורה->×ž×ª×’×™× ×©×œ×š PAR2 [%s]" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "כל ×”×§×‘×¦×™× × ×›×•× ×™× ,%s-[%s] ווד×ו ב" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "תיקון דרוש ,%s-[%s] ווד×ו ב" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" "בלתי תקפי×, ×œ× ×™×›×•×œ ×œ×•×•×“× ×ו לתקן PAR2 בלתי ×ª×§×¤×™× ×ו פרמטרי par2 קבצי" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "...מושך %s גושי×" #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "מושך" #: sabnzbd/newsunpack.py msgid "Repair failed, not enough repair blocks (%s short)" msgstr "(קצר %s) תיקון נכשל, ×ין מספיק גושי תיקון" #: sabnzbd/newsunpack.py msgid "Repairing" msgstr "מתקן" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "%s-תוקן ב [%s]" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "×ž×•×•×“× ×ª×™×§×•×Ÿ" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "דיסק מל×" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "מווד×" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "בודק קבצי תוספת" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "בודק" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "××™× ×” מוגדרת build_command הפקודה ב [%s]" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "(+x) ×ין ערכת הרש×ות ביצוע \"%s\" לתסריט פייתון" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "בפתחה זו SSL שרת ×–×” ×ינו מתיר" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" ".×©× ×ž×רח של ×”×ישור ×ינו תו××: ×©× ×”×ž×רח של השרת ×ינו מופיע ברשימה ב×ישור. זו " "סוגית שרת" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr ".×ישור ×ינו תקף. קרוב לווד××™ שזו סוגית שרת" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "[%s] משתמש ב×ישור בלתי מהימן %s השרת" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "וויקי" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "×”×–× ×§/כיבוי" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "התווסף NZB" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "בתר־עיבוד התחיל" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "עבודה הסתיימה" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "עבודה נכשלה" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "תור הסתיי×" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "הודעות ×חרות" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "×œ× ×–×ž×™×Ÿ" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Prowl נכשל בשליחת הודעת" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Pushover (%s): %s-תגובה רעה מ" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "pushover נכשל בשליחת הודעת" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Pushbullet (%s): %s-תגובה רעה מ" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "pushbullet נכשל בשליחת הודעת" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "\"%s\" תסריט החזיר קוד יצי××” %s ופלט" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "×ינו ×§×™×™× \"%s\" תסריט התר×ות" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "Windows נכשל בשליחת התר×ת" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "%s נכשל ×‘×™×‘×•× %s ×§×‘×¦×™× ×ž" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "קובץ תור בלתי תו×× × ×ž×¦×, ×œ× ×™×›×•×œ להמשיך" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "התגלה קובץ ×¤×’×•× ,%s שגי××” בטעינת" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "התווסף לתור NZB" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "הצפנה בלתי ידועה <- %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "%s בלתי ×©×œ× NZB קובץ" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "מדלג ,%s בלתי תקף NZB קובץ (סיבה=%s שורה=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "%s ריק NZB קובץ" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "תסריט קד×־תור סומן כנכשל" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "\"%s\" כפול NZB-×ž×ª×¢×œ× ×ž" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "\"%s\" NZB נכשל בשכפול" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "NZB שכפל" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "\"%s\" NZB משהה שכפול" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "בוטל, ×œ× ×™×›×•×œ להיות של×" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "כפול" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "מוצפן" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "גדול מדי" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "בלתי של×" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "בלתי רצוי" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "מסונן" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "המתן %s שניות" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "מפיץ %s דקות" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "לשנייה %sB הורד תוך %s בממוצע של" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "גיל" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s מ××ž×¨×™× ×¢×•×•×ª×•" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s מ××ž×¨×™× ×”×™×• חסרי×" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "ל-%s מ××ž×¨×™× ×™×© כפילויות בלתי-תו×מות" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s מ××ž×¨×™× ×”×•×¡×¨×•" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "%s שגי××” ביבו×" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "×זהרות" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "מנוחה" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "תצורה" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "תור" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "טהר תור" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "היסטוריה" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "טהר היסטוריה" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "הגבל מהירות" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "השהה" #: sabnzbd/osxmenu.py msgid "min." msgstr "דק." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "המשך" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "סרוק תיקייה מושגחת" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "RSS ×§×¨× ×ת כל הזנות" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "תיקייה שלמה" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "תיקייה בלתי שלמה" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "פתור בעיות" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "הפעל מחדש" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "הפעל מחדש ×œ×œ× ×›× ×™×¡×”" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "צ×" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "הוסף לתור 10 ×¤×¨×™×˜×™× ×¨×שוני×" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "ריק" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "העבר להיסטוריה 10 ×¤×¨×™×˜×™× ×חרוני×" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "שחרור חדש זמין" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "לך ל×שף" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "עוצר..." #: sabnzbd/panic.py msgid "Problem with" msgstr "בעיה ×¢×" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " .עבור שרת הרשת הפנימי שלו tcp/ip צריך פתחה חופשית של SABnzbd
\n" " .פתחה %s על %s נוסתה, ×ך ×”×™× ××™× ×” זמינה
\n" " .כבר רץ SABnzbd ×יזשהי תוכנה ×חרת משתמשת בפתחה ×ו
\n" "
\n" " .×¢× ×ž×¡×¤×¨ פתחה ×חר SABnzbd ×× × ×”×¤×¢×œ מחדש ×ת" #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr ".×× ×תה מקבל ×ת הודעת השגי××” הזו שוב, ×× × × ×¡×” מספר שונה
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " .צריך כתובת מ×רח תקפה עבור שרת הרשת הפנימי שלו SABnzbd
\n" " .ציינת כתובת בלתי תקפה
\n" " ו-0.0.0.0 localhost ×¢×¨×›×™× ×‘×˜×•×—×™× ×”×
\n" "
\n" " .×¢× ×›×ª×•×‘×ª מ×רח תקינה SABnzbd ×× × ×”×¤×¢×œ מחדש ×ת" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " ×חרת SABnzbd גילה × ×ª×•× ×™× ×©×ž×•×¨×™× ×ž×’×¨×¡×ª SABnzbd
\n" " .×בל ×ינו יכול להשתמש מחדש ×‘× ×ª×•× ×™× ×©×œ התוכנית ×”×חרת

\n" " .×תה ×ולי תרצה ×œ×¡×™×™× ×ת התור שלך תחילה ×¢× ×”×ª×•×›× ×™×ª ×”×חרת

\n" " .\"--clean\" ל×חר מכן, התחל תוכנית זו ×¢× ×”×פשרות
\n" " !×–×” ימחק ×ת התור וההיסטוריה הנוכחיי×
\n" " .\"%s\" ×§×¨× ×ת הקובץ SABnzbd" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " .%s-×ינו יכול ×œ×ž×¦×•× ×ת קבצי ממשק הרשת שלו ב SABnzbd
\n" " .×× × ×”×ª×§×Ÿ ×ת התוכנית שוב
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr ":גילה שגי××” חמורה SABnzbd" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " .חסר sqlite3.dll גילה שהקובץ SABnzbd

\n" " .מספר סורקי-× ×’×™×¤×™× ×™×¨×•×“×™× ×ž×¡×™×¨×™× ×§×•×‘×¥ ×–×”
\n" " .והתלונן למוכר סורק-×”× ×’×™×¤×™× ×©×œ×š SABnzbd ×× × ×‘×“×•×§ ×ת סורק-×”× ×’×™×¤×™× ×©×œ×š, " "נסה להתקין מחדש ×ת
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "והקלד ×ת הקו (דוגמה): R+לחץ על מקש התחל" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "פתח חלון מסוף והקלד ×ת הקו (דוגמה):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "!התוכנית ×œ× ×”×ª×—×™×œ×”" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" ".כבר רץ SABnzbd ×יזשהי תוכנה ×חרת משתמשת בפתחה ×ו %s ×œ× ×”×™×” ניתן לקשר ×ת " "פתחה %s על" #: sabnzbd/panic.py msgid "Fatal error" msgstr "שגי××” חמורה" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "×œ× ×”×™×” ניתן להפעיל ×ת הדפדפן, כנר××” ×©×”×•× ×œ× × ×ž×¦×" #: sabnzbd/panic.py msgid "Access denied" msgstr "גישה נדחתה" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr ".שגי××” %s: ×תה צריך לספק ×©× ×ž×©×ª×ž×© וסיסמה תקפי×" #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "תור ישן התגלה, השתמש במעמד->תיקון כדי להמיר ×ת התור" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" msgstr "" "המגבילה גודל מרבי של קובץ ×ל 4 ×’\"ב ,FAT ×”×™× ×‘×ž×¢×¨×›×ª ×§×‘×¦×™× %s תיקיית ההורדות " "השלמות" #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "הורדה עשויה להיכשל, רק %s מתוך %s ×“×¨×•×©×™× ×–×ž×™× ×™×" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "הורדה נכשלה - ×œ× ×‘×©×¨×ª(×™×) שלך" #: sabnzbd/postproc.py msgid "Moving" msgstr "מעביר" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "לתור %s שלח ×ת" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "\"%s\" ×ל \"%s\" שגי××” בשינוי ש×" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "נכשל בהעברת קבצי×" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "%s מריץ תסריט משתמש" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "%s הריץ ×ת" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "קוד יצי×ת תסריט ×”×•× %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "עוד" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "%s (%s) בתר־עיבוד נכשל עבור" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "ר××” קובץ יומן" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "הורדה נכשלה" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr ".נכשל %s ניקוי של" #: sabnzbd/postproc.py msgid "Download Completed" msgstr "הורדה הושלמה" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "%s ×œ× ×™×›×•×œ ליצור תיקייה סופית" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "בתר־עיבוד" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "par2 [%s] ×ין ערכות" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "SFV מנסה וידו×" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "\"%s\" מספר ×§×‘×¦×™× × ×›×©×œ×• ×‘×•×™×“×•× ×ž×•×œ" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "SFV-×•×•×“× ×‘×”×¦×œ×—×” ×¢\"×™ שימוש ב" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "RAR מנסה ×•×™×“×•× ×ž×‘×•×¡×¡" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "%s :נכשל RAR ×•×™×“×•× ×ž×‘×•×¡×¡ [%s]" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "מוגן בסיסמה" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "קבצי RAR ווד×ו בהצלחה" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "נכשלו ×‘×•×™×“×•× RAR קבצי" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "נכשלה %s הסרת" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "נכשל בחריפת מערכת" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "נכשל בהיכוננות מערכת" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "שגי××” בזמן כיבוי מערכת" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "×œ× × ×ž×¦××” עבור קובץ ×ž×™×“×¨×’×™× (%s) זהות מדדן" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "כתובת שרת" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "API מפתח" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr ".מפתח ×–×” מספק זהות למדדן. בדוק ×ת המת×ר שלך ב×תר של המדדן" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "\"%s\" ×œ× × ×›×•×Ÿ RSS תי×ור הזנת" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "%s: %s-מ RSS נכשל ב×חזור" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "%s ×ין ×ימות תקף עבור ×”×”×–× ×”" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "%s על %s שגי××” צדדית של שרת (קוד שרת %s); ×œ× ×”×™×” ניתן להשיג ×ת" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "בלתי מהימן HTTPS משתמש ב×ישור %s השרת" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "הייתה ריקה %s RSS הזנת" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "×”×–× ×” בלתי תו×מת" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "(%s) ריקה נמצ××” RSS כניסת" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "הר××” ממשק" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "פתח תיקיית השלמה" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "השהה למשך" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "השהה למשך 5 דקות" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "השהה למשך 15 דקות" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "השהה למשך 30 דקות" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "השהה למשך שעה" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "השהה למשך 3 שעות" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "השהה למשך 6 שעות" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "כבה" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "נותר" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "NZB הוסף" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "ב-%s:%s %s תזמון גרוע" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "פעולה בלתי ידועה: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "%s תזמן עבור שרת בלתי-×§×™×™×" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "הורדה" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "×חד קבצי×" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "מקור" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "שרתי×" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "כישלון" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "נכשל" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "ממתין" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "מתקן..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "מחלץ..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "מעביר..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "מריץ תסריט..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "...מושך ×’×•×©×™× × ×•×¡×¤×™×" #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "...בדוק זריז" #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "...מווד×" #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "מוריד" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "עיכוב רביה" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "מטלה" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "השבת שרת" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "×פשר שרת" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "מגבלת מהירות" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "השהה הכל" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "השהה בתר־עיבוד" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "המשך בתר־עיבוד" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "RSS ×§×¨× ×”×–× ×•×ª" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "הסר עבודות נכשלות" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "הסר עבודות נשלמות" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "השהה עבודות ×¢× ×¢×“×™×¤×•×ª נמוכה" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "השהה עבודות ×¢× ×¢×“×™×¤×•×ª רגילה" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "השהה עבודות ×¢× ×¢×“×™×¤×•×ª גבוהה" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "המשך עבודות ×¢× ×¢×“×™×¤×•×ª נמוכה" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "המשך עבודות ×¢× ×¢×“×™×¤×•×ª רגילה" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "המשך עבודות ×¢× ×¢×“×™×¤×•×ª גבוהה" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "×פשר ניהול מיכסה" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "כבוי" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "נמוכה מ×וד" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "בינונית" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "רגילה" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "גבוהה" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "חירו×" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "נמוכה" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "מ\"ב" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "×’''ב" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "שעה" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "שעות" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "דקה" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "דקות" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "שניה" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "שניות" #: sabnzbd/skintext.py msgid "day" msgstr "יו×" #: sabnzbd/skintext.py msgid "days" msgstr "ימי×" #: sabnzbd/skintext.py msgid "week" msgstr "שבוע" #: sabnzbd/skintext.py msgid "Month" msgstr "חודש" #: sabnzbd/skintext.py msgid "Year" msgstr "שנה" #: sabnzbd/skintext.py msgid "January" msgstr "ינו×ר" #: sabnzbd/skintext.py msgid "February" msgstr "פברו×ר" #: sabnzbd/skintext.py msgid "March" msgstr "מרץ" #: sabnzbd/skintext.py msgid "April" msgstr "×פריל" #: sabnzbd/skintext.py msgid "May" msgstr "מ××™" #: sabnzbd/skintext.py msgid "June" msgstr "יוני" #: sabnzbd/skintext.py msgid "July" msgstr "יולי" #: sabnzbd/skintext.py msgid "August" msgstr "×וגוסט" #: sabnzbd/skintext.py msgid "September" msgstr "ספטמבר" #: sabnzbd/skintext.py msgid "October" msgstr "×וקטובר" #: sabnzbd/skintext.py msgid "November" msgstr "נובמבר" #: sabnzbd/skintext.py msgid "December" msgstr "דצמבר" #: sabnzbd/skintext.py msgid "Day of month" msgstr "×™×•× ×‘×—×•×“×©" #: sabnzbd/skintext.py msgid "This week" msgstr "השבוע ×”×–×”" #: sabnzbd/skintext.py msgid "This month" msgstr "החודש ×”×–×”" #: sabnzbd/skintext.py msgid "Today" msgstr "היו×" #: sabnzbd/skintext.py msgid "Total" msgstr "סה''×›" #: sabnzbd/skintext.py msgid "on" msgstr "פועל" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "משתני×" #: sabnzbd/skintext.py msgid "Python Version" msgstr "גרסת פייתון" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "דף הבית" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "×ו" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "מ×רח" #: sabnzbd/skintext.py msgid "Comment" msgstr "הער" #: sabnzbd/skintext.py msgid "Send" msgstr "שלח" #: sabnzbd/skintext.py msgid "Cancel" msgstr "ביטול" #: sabnzbd/skintext.py msgid "Other" msgstr "×חר" #: sabnzbd/skintext.py msgid "Report" msgstr "דווח" #: sabnzbd/skintext.py msgid "Video" msgstr "וידי×ו" #: sabnzbd/skintext.py msgid "Audio" msgstr "שמע" #: sabnzbd/skintext.py msgid "Not used" msgstr "×œ× ×‘×©×™×ž×•×©" #: sabnzbd/skintext.py msgid "or less" msgstr "×ו פחות" #: sabnzbd/skintext.py msgid "Log in" msgstr "התחבר" #: sabnzbd/skintext.py msgid "Log out" msgstr "התנתק" #: sabnzbd/skintext.py msgid "Remember me" msgstr "זכור ×ותי" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "×וטומטי usenet כלי הורדות" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "שמור" #: sabnzbd/skintext.py msgid "Saving.." msgstr "שומר.." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "×”×× ×תה בטוח?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "למחוק ×ת כל ×”×§×‘×¦×™× ×©×”×•×¨×“×•?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "בית" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "הגדר" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "מעמד" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "עזרה" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "פורו×" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "סוגיות" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "!תמוך במיז×, תרו×" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "כללי" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "תיקיות" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "מתגי×" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "תזמון" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "התר×ות" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "דו×\"ל" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "קטגוריות" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "מיון" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "מיוחד" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "חיפוש" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "תיקיית הורדות" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "מושהה" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "(%s) מ××ž×¨×™× %s מוטמני×" #: sabnzbd/skintext.py msgid "Sysload" msgstr "עומס מערכת" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "שחרור חדש %s זמין ב" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "?SABnzbd ×”×× ×תה בטוח ש×תה רוצה לכבות ×ת" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "הוסף" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "הוסף קובץ" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "קטגוריה" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "מעבד" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "עדיפות" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+תיקון" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+פריקה" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+מחיקה" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "ת" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "×—" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "מ" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "×ילוץ" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "עצירה" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "הכנס כתובת" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "×‘×¡×™×•× ×ª×•×¨" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "כבה מחשב" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "היכון מחשב" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "חרוף מחשב" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "SABnzbd כבה ×ת" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "מגבלת מהירות" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "סידור" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "ש×" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "זמן משוער" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "גיל" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "מחק" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "נסה שוב" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "פעולות" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "תסריטי×" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "למחוק ×ת כל ×”×¤×¨×™×˜×™× ×ž×”×ª×•×¨?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "NZB טהר" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "ומחק ×§×‘×¦×™× NZB טהר" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "נסה שוב ×ת כל העבודות הנכשלות" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "NZB הסר" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "ומחק ×§×‘×¦×™× NZB הסר" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "מתוך" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "מ××ž×¨×™× ×—×¡×¨×™×" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "מיכסה שנותרה" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "ידני" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "×פס מיכסה כעת" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "?למחוק ×ת כל ×”×¤×¨×™×˜×™× ×”×©×œ×ž×™× ×ž×”×”×™×¡×˜×•×¨×™×”" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "הסתר פרטי×" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "הר××” פרטי×" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "הר××” נכשלי×" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "הר××” הכל" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "גודל" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "× ×›×©×œ×™× NZB טהר" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "× ×›×©×œ×™× ×•×ž×—×§ ×§×‘×¦×™× NZB טהר" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "שהושלמו NZB טהר" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "בדף הנוכחי NZB טהר" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "×ž×©×œ×™× ×¨×©×•×ª×™ NZB" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "נתיב" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "נסה שוב כל הנכשלי×" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "נסה שוב הכל" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "× ×’×™×£/דו×ר זבל" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "×ין שימור" #: sabnzbd/skintext.py msgid "Other problem" msgstr "בעיה ×חרת" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "×לץ ניתוק" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" "×—×™×‘×•×¨×™× ×™×™×¤×ª×—×• מחדש ל×חר מספר שניות ×× ×™×© ×¤×¨×™×˜×™× ×‘×ª×•×¨ .usenet נתק ×ת כל " "×”×—×™×‘×•×¨×™× ×”×¤×¢×™×œ×™× ×ל שרתי" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr ".×–×” ישלח דו×\"ל בדיקה לחשבונך" #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "הר××” יומן ×ירועי×" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "בחן דו×\"ל" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "×¨×•×©× ×‘×™×•×ž×Ÿ" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "שגי×ות/×זהרות" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ מידע" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ ניפוי תקלי×" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "חיבורי×" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "×זהרות ×חרונות" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "× ×§×”" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "בטל חסימה" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "מזהי מ×מר" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "ערכת קבצי×" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "מתי" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "סוג" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "מ×ופשר" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "לוח מחווני×" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "!חיבור נכשל" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "מקומית IPv4 כתובת" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "ציבורית IPv4 כתובת" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "IPv6 כתובת" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "DNS ×©× ×©×¨×ª / חיפוש" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "×“×’× ×™×¢''×" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "(Pystone) ביצועי מערכת" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "מהירות תיקיית הורדות" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "מהירות תיקיית שלמי×" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "מהירות כתיבה" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr ".×œ× ×”×™×” יכול לכתוב. בדוק שהספרייה ניתנת לכתיבה" #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "רוחב־פס ×ינטרנט" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "לחץ על הכפתור חזור על בחינה למטה כדי לקבוע" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "חזור על בחינה" #: sabnzbd/skintext.py msgid "Test download" msgstr "בחן הורדה" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" "מוסיף בחינה מווד×ת של הגודל המצוין, ×ž×ž×•×œ× ×‘× ×ª×•× ×™× ×קר××™×™×. יכול לשמש כדי " "×œ×•×•×“× ×”×”×’×“×¨×” שלך" #: sabnzbd/skintext.py msgid "Config File" msgstr "קובץ תצורה" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "מטמון בשימוש" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" ".SABnzbd ×–×” יפעיל מחדש ×ת
השתמש בזה כש×תה חושב שלתוכנית יש בעית " "יציבות.
הורדה תושהה לפני ההפעלה מחדש ותומשך ל×חר מכן." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "
×× ×ימות מ×ופשר, תצטרך להיכנס שוב." #: sabnzbd/skintext.py msgid "Advanced" msgstr "מתקד×" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" ".ישנן עבודות יתומות בתיקיית ההורדות
.×תה יכול לבחור למחוק ×ותן (כולל " "קבצי×) ×ו לשלוח ×ותן חזרה לתור" #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "ויעשה בניה מחדש מל××” של SABnzbd כפתור התיקון יפעיל מחדש ×ת
.תוכן התור, " "תוך שימור ×§×‘×¦×™× ×©×”×•×¨×“×• כבר. ×–×” ישנה ×ת סדר התור" #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "×©×™× ×•×™×™× ×œ× × ×©×ž×¨×•, וי×בדו." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr ".מופעל מחדש, השיח יפוג SABnzbd שלך משתנה ×ו IP-×›×שר כתובת ×”" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "zip ×פשר חילוץ" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "7zip ×פשר" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "Par2 מרובה-ליבות" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" ".יוצפנו, ×מנ×, ×•×™×“×•× ×–×”×•×ª של שרת ×¢×´×™ שימוש ב××™×©×•×¨×™× ×©×œ×• ×”×•× ×‘×œ×ª×™ ×פשרי HTTPS " "×ל שרתי חדשות ו×ל ×תרי SABnzbd מן (SSL) ×—×™×‘×•×¨×™× ×ž×ובטחי×\r\n" ".×ž×¢×•×“×›× ×™× ×ž×§×•×ž×™×™× ×“×¨×•×©×™× CA ומעלה ו×ישורי OpenSSL 1.0.2" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" ".מרובה-ליבות, ×”×•× ×–×ž×™×Ÿ עבור פלטפורמות רבות Par2 ×”××¥ ×ª×™×§×•× ×™× ×¢\"×™ התקנת" #: sabnzbd/skintext.py msgid "Version" msgstr "גרסה" #: sabnzbd/skintext.py msgid "Uptime" msgstr "זמן פעולה" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "גיבוי" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "!×§×¨× ×ת עזרת וויקי על ×–×”" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "מפעיל מחדש ×ת SABnzbd..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "!SABnzbd ×©×™× ×•×™×™× ×™×“×¨×©×• הפעלה מחדש של" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "SABnzbd שרת רשת" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "SABnzbd מ×רח" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr ".צריך לה×זין ×ליו SABnzbd-מ×רח ש" #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "SABnzbd פתחת" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr ".צריך לה×זין ×ליה SABnzbd-פתחה ש" #: sabnzbd/skintext.py msgid "Web Interface" msgstr "ממשק רשת" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr ".בחר עור" #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "SABnzbd ×©× ×ž×©×ª×ž×©" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "×©× ×ž×©×ª×ž×© רשותי של ×ימות" #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "SABnzbd סיסמת" #: sabnzbd/skintext.py 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 "×בטחה" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "HTTPS ×פשר" #: sabnzbd/skintext.py msgid "not installed" msgstr "×œ× ×ž×•×ª×§×Ÿ" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr ".HTTPS ×פשר מתן גישה ×ל הממשק מכתובת" #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "HTTPS פתחת" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr ".HTTPS ×× ×¨×™×§, הפתחה התקנית ת×זין רק ×ל" #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "HTTPS ×ישור" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr ".HTTPS ×©× ×§×•×‘×¥ ×ו נתיב ×ל ×ישור" #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "!SABnzbd חולל ×ישור ומפתח ×—×“×©×™× ×—×ª×•×ž×™×-עצמית. דורש הפעלה מחדש של" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "HTTPS מפתח" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr ".HTTPS ×©× ×§×•×‘×¥ ×ו נתיב ×ל מפתח" #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "HTTPS ×ישורי שרשרת" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr ".HTTPS ×©× ×§×•×‘×¥ ×ו נתיב ×ל שרשרת" #: sabnzbd/skintext.py msgid "Tuning" msgstr "כוונון" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "RSS מרווח בדיקת" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "!מרווח בדיקה (בדקות, לפחות 15). ×ינו פעיל כש×תה משתמש במתזמן" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "מהירות קו מרבית" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "×חוז של מהירות קו" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "להשתמש, לדוגמה 50 SABnzbd ××™×–×” ×חוז ממהירות הקו צריך" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "מגבלת מטמון מ×מרי×" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" ".הטמן מ××ž×¨×™× ×‘×–×™×›×¨×•×Ÿ כדי להפחית גישת דיסק
\"בבתי×, עקוב ב×ופן רשותי " "×חר ×§,מ,×’'. לדוגמה: \"64מ\" ×ו \"128מ" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "רשימת ניקוי" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" ".רשימת סיומות של ×§×‘×¦×™× ×©×¦×¨×™×›×™× ×œ×”×™×ž×—×§ ל×חר הורדה
nfo, sfv ×ו " "nfo :לדוגמה" #: sabnzbd/skintext.py msgid "History Retention" msgstr "שימור היסטוריה" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" ".מחק ב×ופן ×וטומטי עבודות שלמות מההיסטוריה. ×©×™× ×œ×‘ ששימור כפול ומספר ×›×œ×™× " "×—×™×¦×•× ×™×™× ×ž×¡×ª×ž×›×™× ×¢×œ מידע היסטוריה" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "שמור ×ת כל העבודות" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "שמור מספר מרבי של עבודות שלמות" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "שמור מספר ×™×ž×™× ×ž×¨×‘×™ של עבודות שלמות" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "×ל תשמור עבודות שלמות כלשהן" #: sabnzbd/skintext.py msgid "Jobs" msgstr "עבודות" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "שמור שינויי×" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "שחזר ברירות מחדל" #: sabnzbd/skintext.py msgid "Reset" msgstr "×פס" #: sabnzbd/skintext.py msgid "Language" msgstr "שפה" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr ".בחר שפת ממשק רשת" #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" "!לעברית SABnzbd עזור לנו ×œ×ª×¨×’× ×ת
הוסף מלל ×œ× ×ž×ª×•×¨×’× ×ו שפר ×ª×¨×’×•×ž×™× " "×§×™×™×ž×™× ×›×ן:" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr ".SABnzbd מפתח ×–×” יתן לתוכניות צד שלישי גישה מל××” ×ל" #: sabnzbd/skintext.py msgid "NZB Key" msgstr "NZB מפתח" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr ".SABnzbd ×ל NZB מפתח ×–×” יתיר לתוכניות צד שלישי להוסיף קבצי" #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "חולל מפתח חדש" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "API של מפתח QR קוד" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "רשימה של טווחי רשת מקומית" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr ".(\"כל כתובות הרשת המקומית מתחילות ×‘×ž×§×“×ž×™× ×לו (×œ×¢×™×ª×™× \"192.168.1" #: sabnzbd/skintext.py msgid "External internet access" msgstr "גישת ×ינטרנט חיצונית" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" ".×תה יכול לקבוע זכויות גישה עבור מערכות מחוץ לרשת המקומית שלך. דורש שרשימה " "של טווחי רשת מקומית תהיה מוגדרת" #: sabnzbd/skintext.py msgid "No access" msgstr "×ין גישה" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "NZB הוסף קבצי " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "(×œ×œ× ×ª×¦×•×¨×”) API" #: sabnzbd/skintext.py msgid "Full API" msgstr "API מל×" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "ממשק רשת מל×" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "רק גישה חיצונית דורשת כניסה" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "הערה: תיקיות יווצרו ב×ופן ×וטומטי בעת שמירה. ×תה יכול להשתמש " "×‘× ×ª×™×‘×™× ×ž×•×—×œ×˜×™× ×›×“×™ לשמור מחוץ לתיקיות ברירת המחדל" #: sabnzbd/skintext.py msgid "User Folders" msgstr "תיקיות משתמש" #: sabnzbd/skintext.py msgid "Browse" msgstr "עיין" #: sabnzbd/skintext.py msgid "In" msgstr "ב" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "תיקיית הורדות זמניות" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" ".×ž×™×§×•× ×œ×חסון הורדות בלתי מעובדות
.ניתן לשינוי ×›×שר התור ריק" #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "שטח פנוי מזערי עבור תיקיית הורדות זמניות" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" ".השהה ב×ופן ×וטומטי כששטח פנוי ×”×•× ×ž×ª×—×ª לערך ×–×”
\"בבתי×, עקוב ב×ופן " "רשותי ×חר ×§,מ,×’',ט. לדוגמה: \"800מ\" ×ו \"8×’" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "תיקיית הורדות שלמות" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" ".×ž×™×§×•× ×œ×חסון הורדות שהסתיימו, מעבודות במלו×ן
.ניתן להשתלט ×¢\"×™ " "קטגוריות מוגדרות ×¢\"×™ משתמש" #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "הרש×ות עבור הורדות שלמות" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" ".קבע דפוס הרש×ות עבור ×§×‘×¦×™× ×•×ª×™×§×™×•×ª שלמי×
בסימון ×וקטלי. לדוגמה: 755 " "×ו 777" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "תיקייה מושגחת" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" ".nzb תיקייה לניטור ×חר קבצי
.nzb ×חר קבצי tar.gz-ו rar, zip סורק ×’× " "×רכיוני" #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "מהירות סריקה של תיקייה מושגחת" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr ".nzb מספר שניות בין סריקות עבור קבצי" #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "תיקיית תסריטי×" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr ".תיקייה המכילה תסריטי משתמש" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "תיקיית תבניות דו×\"ל" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr ".תיקייה המכילה תבניות דו×\"ל מוגדרות ×¢\"×™ משתמש" #: sabnzbd/skintext.py msgid "Password file" msgstr "קובץ סיסמה" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr ".×ž×•×¦×¤× ×™× RAR קובץ המכיל ×ת כל הסיסמ×ות שינוסו על קבצי" #: sabnzbd/skintext.py msgid "System Folders" msgstr "תיקיות מערכת" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "תיקייה מינהלית" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" ".×ž×™×§×•× ×¢×‘×•×¨ מסד-× ×ª×•× ×™× ×”×™×¡×˜×•×¨×™×” ומנהלן תור
.ניתן לשינוי רק ×›×שר התור " "ריק" #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "!SABnzbd × ×ª×•× ×™× ×œ× ×™×•×¢×‘×¨×•. דורש הפעלה מחדש של" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "תיקיית יומן" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" ".SABnzbd ×ž×™×§×•× ×©×œ קבצי יומן עבור
!SABnzbd דורש הפעלה מחדש של" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr ".nzb תיקיית גיבוי" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr ".×™×וחסנו .nzb ×ž×™×§×•× ×©×‘×• קבצי" #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "תיקיית יסוד ברירת מחדל" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "par2 הורד ×ת כל קבצי" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr ".בעת הצורך par2 ×–×” מונע הרצות תיקון מרובות ×¢\"×™ הורדת כל קבצי" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "×פשר פריקה נסיגתית" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr ".בתוך ××¨×›×™×•× ×™× (rar, zip, 7z) פרוק ×רכיוני×" #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "×”×ª×¢×œ× ×ž×ª×™×§×™×•×ª כלשהן בתוך ×רכיוני×" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr ".כל ×”×§×‘×¦×™× ×™×¢×‘×¨×• לתוך תיקייה יחידה" #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "השג מ××ž×¨×™× ×¨×§ עבור ר×ש התור" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" ".×פשר עבור פחות שימוש בזיכרון. השבת כדי למנוע מעבודות ×יטיות ×œ×—×¡×•× ×ת התור" #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "בצע בתר־עיבוד רק על עבודות שווד×ו" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr ".PAR2-בצע בתר־עיבוד רק בעבודות שעברו ×ת כל בדיקות ×”" #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "מוצפן מורד RAR פעולה ×›×שר קובץ" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr ".במקרה של \"השהיה\", תצטרך לקבוע סיסמה ולהמשיך ×ת העבודה" #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "גלה הורדות כפולות" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" "(.nzb ×–×”×™× (על סמך ×¤×¨×™×˜×™× ×‘×”×™×¡×˜×•×¨×™×” שלך ×ו ×§×‘×¦×™× ×‘×ª×™×§×™×™×ª ×’×™×‘×•×™×™× ×©×œ NZB גלה " "קבצי" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "גלה ×¤×¨×§×™× ×›×¤×•×œ×™× ×‘×¡×“×¨×•×ª" #: sabnzbd/skintext.py 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 "" ".×ž×ª×’×œ×™× ×‘×©× ×”×”×•×¨×“×” REPACK ×ו PROPER, REAL עקוף גילוי כפילויות סדרה ××" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Discard" msgstr "השלך" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "הכשל עבודה (העבר להיסטוריה)" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "הצמד תג לעבודה" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "בטל" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "פעולה ×›×שר סיומת בלתי רצויה מתגלה" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "RAR פעולה ×›×שר סיומת בלתי רצויה מתגלה בקבצי" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "סיומות בלתי רצויות" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "exe, com ×ו exe :×¨×©×•× ×ת כל הסיומות הבלתי רצויות. לדוגמה" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "SFV ×פשר בדיקות מבוססות" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr ".SFV בצע ×•×™×“×•× × ×•×¡×£ המבוסס על קבצי" #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "תסריט משתמש יכול לסמן בדגל עבודה כנכשלה" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" ".×›×שר תסריט המשתמש מחזיר קוד יצי××” בלתי-×פסי, העבודה תסומן בדגל כנכשלה" #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "חלופי NZB בכישלון, נסה" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr ".חלופי ×›×שר הורדה נכשלת NZB מספר ×©×¨×ª×™× ×ž×¡×¤×§×™×" #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "השתמש ×‘×ª×’×™× ×ž×ž×“×“×Ÿ" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" ".בעת מיון, השתמש ×‘×ª×’×™× ×ž×ž×“×“×Ÿ עבור כותרת, עונה, פרק וכדומה\r\n" ".NZB-×חרת כל מתן השמות נגזר ×ž×©× ×”" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "×פשר שינוי ×©× ×ª×™×§×™×™×”" #: sabnzbd/skintext.py 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" msgstr "תסריט משתמש של קד×־תור" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr ".נכנס לתור NZB-בשימוש לפני ש" #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "× ×•×¡×¤×™× PAR2 משתני" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Nice משתני" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "IONice משתני" #: sabnzbd/skintext.py msgid "External process priority" msgstr "עדיפות תהליך חיצוני" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "התנתק בתור ריק" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr ".×›×שר התור ריק ×ו מושהה Usenet התנתק משרת(×™)" #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "מיין לפי גיל" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr ".(מיין ×¤×¨×™×˜×™× ×‘×ופן ×וטומטי לפי גיל (ממוצע" #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" ".רשומות יושהו עד שהן לפחות בגיל ×–×”. הגדרת עדיפות עבודה ×ל ×ילוץ תדלג על " "העיכוב" #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "בדוק ×חר שחרור חדש" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr ".חדש SABnzbd בדוק ×¤×¢× ×‘×©×‘×•×¢ ×חר שחרור" #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "×’× ×©×—×¨×•×¨×™ בחינה" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "החלף ×¨×•×•×—×™× ×‘×©×ž×•×ª תיקיות" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr ".החלף ×¨×•×•×—×™× ×‘×§×•×•×™× ×ª×—×ª×•× ×™× ×‘×©×ž×•×ª תיקיות" #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "החלף נקודות בשמות תיקיות" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr ".החלף נקודות ×‘×¨×•×•×—×™× ×‘×©×ž×•×ª תיקיות" #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Windows עשה תו××" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr ".Windows עבור שרתי×: ×•×•×“× ×©×”×©×ž×•×ª תו××ž×™× ×¢×" #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "הפעל דפדפן בהזנק" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr ".SABnzbd הפעל ×ת דפדפן ברירת המחדל בעת התחלת" #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "השהה הורדה במהלך בתר־עיבוד" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr ".משהה הורדה בתחילת בתר־עיבוד וממשיך בסיו×" #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "×”×ª×¢×œ× ×ž×“×•×’×ž×ות" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "(סנן החוצה קבצי דוגמית (לדוגמה, דוגמיות וידי×ו" #: sabnzbd/skintext.py msgid "Delete after download" msgstr "מחק ל×חר הורדה" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "HTTPS ×•×™×“×•× ×ישור" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr ".HTTPS-×¢\"×™ שימוש ב RSS ×•×•×“× ××™×©×•×¨×™× ×‘×¢×ª התחברות ×ל ×ž×“×“× ×™× ×•×ž×§×•×¨×•×ª" #: sabnzbd/skintext.py msgid "Server" msgstr "שרת" #: sabnzbd/skintext.py msgid "Post processing" msgstr "בתר־עיבוד" #: sabnzbd/skintext.py msgid "Naming" msgstr "מתן שמות" #: sabnzbd/skintext.py msgid "Quota" msgstr "מיכסה" #: sabnzbd/skintext.py msgid "Indexing" msgstr "×חסון במדד" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "('כמה ניתן להוריד החודש (×§/מ/×’" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "×™×•× ×יפוס" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "(ב××™×–×” ×™×•× ×©×œ החודש ×ו השבוע (1=×™×•× ×©× ×™) ספק ×”×ינטרנט שלך מ×פס ×ת המיכסה? " "(×œ× ×—×•×‘×” ×¢× ×©×©:דד" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "המשך ב×ופן ×וטומטי" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "?×”×× ×”×”×•×¨×“×” תמשיך ל×חר שהמיכסה ×ופסה" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "תקופת מיכסה" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "?×”×× ×”×ž×™×›×¡×” מת×פסת כל יו×, שבוע ×ו חודש" #: sabnzbd/skintext.py msgid "Check before download" msgstr "בדוק לפני הורדה" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "(!נסה לחזות השלמה מוצלחת לפני הורדה ממשית (×יטי יותר" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "SSL צפני" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr ".חלש יותר SSL הגבר ×‘×™×¦×•×¢×™× ×¢\"×™ ×ילוץ חוזק הצפנת" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "ניסיונות ×—×•×–×¨×™× ×ž×¨×‘×™×™×" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "מספר מרבי של ניסיונות ×—×•×–×¨×™× ×œ×©×¨×ª" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "בטל עבודות ש×ינן יכולות להיות שלמות" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "×›×שר במהלך הורדה מתבהר שיותר מדי × ×ª×•× ×™× ×—×¡×¨×™×, בטל ×ת העבודה" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "×פשר מיזוג מדדן" #: sabnzbd/skintext.py 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 "" "יכול לדווח למדדן במקרה שעבודה ×œ× ×™×›×œ×” ×œ×”×™×©×œ× SABnzbd-×ž×“×“× ×™× ×™×›×•×œ×™× ×œ×¡×¤×§ מידע " "מידרג ×›×שר עבודה מתווספת ו" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "×פשר סינון" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr ".הורדה בהת×× ×œ×›×œ×œ×™ הסינון" #: sabnzbd/skintext.py msgid "Abort If" msgstr "בטל ××" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "×•×œ× ×”×©×”×” ××" #: sabnzbd/skintext.py msgid "Video rating" msgstr "מידרג וידי×ו" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "מידרג שמע" #: sabnzbd/skintext.py msgid "Spam" msgstr "זבל" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "מ×ושר" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "יותר ××’×•×“×œ×™× ×œ×ž×˜×” מ×שר למעלה" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "מילות מפתח של כותרת" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "רשימה מופרדת בפסיקי×" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "של שרת IP בחירת כתובת" #: sabnzbd/skintext.py msgid "First IP address" msgstr "ר×שונה IP כתובת" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "נבחרת ב×ופן ×קר××™ IP כתובת" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "IPv6 הזריזה ביותר, העדפה ×ל IP כתובת" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "×חת IPv4/IPv6 שימושי ×× ×œ×©×¨×ª חדשות יש יותר מכתובת" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "הוסף שרת" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "תי×ור שרת" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "פתחה" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "×©× ×ž×©×ª×ž×©" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "סיסמה" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "פסק זמן" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "זמן שימור" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "חיבור מ×ובטח לשרת" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "×•×™×“×•× ×ישור" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" "מ×ופשר, ×•×•×“× ×ת זהות השרת ×¢\"×™ שימוש ב×ישוריו. קפדני: ×•×•×“× ×•×כוף ×©× ×ž×רח " "תו×× SSL מזערי: ×›×שר" #: sabnzbd/skintext.py msgid "Disabled" msgstr "מושבת" #: sabnzbd/skintext.py msgid "Minimal" msgstr "מזערי" #: sabnzbd/skintext.py msgid "Strict" msgstr "קפדני" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 ×”×•× ×”×¢×“×™×¤×•×ª הגבוהה ביותר, 99 ×”×•× ×”×¢×“×™×¤×•×ª הנמוכה ביותר" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "רשותי" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "עבור ×©×¨×ª×™× ×‘×œ×ª×™ מהימני×, ייתקל בהתעלמות במקרה של כישלונות" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "×פשר" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "הסר שרת" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "בחן שרת" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "× ×§×” מוני×" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "...בוחן פרטי שרת" #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "רוחב פס" #: sabnzbd/skintext.py msgid "Send Group" msgstr "שלח קבוצה" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr ".פקודת שלח קבוצה לפני בקשת מ×מרי×" #: sabnzbd/skintext.py msgid "Personal notes" msgstr "הערות ×ישיות" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "הוסף תזמון" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "תדירות" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "פעולה" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "טיעוני×" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "×ª×–×ž×•× ×™× × ×•×›×—×™×™×" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" ".תיבת הסימון ליד ×©× ×”×”×–× ×” צריכה להיות מסומנת כדי שההזנה תהיה מ×ופשרת ותסומן " "ב×ופן ×וטומטי עבור ×¤×¨×™×˜×™× ×—×“×©×™×
.\"××œ× ×× ×ª×œ×—×¥ \"×לץ הורדה RSS-×›×שר " "×”×–× ×” מתווספת, ×”×™× ×ª×סוף רק ×¤×¨×™×˜×™× ×—×“×©×™× ×•×œ× ×©×•× ×“×‘×¨ ×©× ×ž×¦× ×›×‘×¨ בהזנת ×”" #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "הפרד כתובות רבות ×¢\"×™ פסיק" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "×§×¨× ×”×–× ×”" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "×לץ הורדה" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "מסנן" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "קבל" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "סרב" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "דורש" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "RequiresCat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "לפחות" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "לכל היותר" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "SxxEyy-מ" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "Show SxxEyy-מ" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "תו××" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "בלתי תו××" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "הוּרד" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "×§×¨× ×ת כל ההזנות כעת" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "התר×ת דו×\"ל בעת השלמת עבודה" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "××£ פע×" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "תמיד" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "שגי××” בלבד" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "התר×ות דיסק מל×" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr ".מושהה SABnzbd-שלח דו×\"ל כשהדיסק ×ž×œ× ×•" #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "RSS התר×ות שליחת" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr ".מוסיפה עבודות לתור RSS שלח דו×\"ל ×›×שר הזנת" #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "SMTP שרת" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr ".קבע ×ת השרת של ספק ×”×ינטרנט שלך עבור דו×\"ל יוצ×" #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "מקבל דו×\"ל" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr ".כתובת דו×\"ל לשלוח ×ליה ×ת הדו×\"ל" #: sabnzbd/skintext.py msgid "Email Sender" msgstr "שולח דו×\"ל" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "?מי עלינו לומר ששלח ×ת הדו×\"ל" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "×©× ×ž×©×ª×ž×© רשותי של חשבון" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr ".עבור דו×\"ל מ×ומת, ×©× ×—×©×‘×•×Ÿ" #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "סיסמת חשבון רשותית" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr ".עבור דו×\"ל מ×ומת, סיסמה" #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "!התר××” נשלחה" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Growl ×פשר" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "מרוחק (מ×רח:פתחה) Growl השתמש רק עבור שרת" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "סיסמת שרת" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "שרת Growl סיסמה רשותית עבור" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "NotifyOSD ×פשר" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "מרכז ההתר×ות" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Windows ×פשר התר×ות" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Windows התר×ות" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Prowl ×פשר התר×ות" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Prowl דורש חשבון" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "Prowl עבור API מפתח" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "(דרוש) Prowl ×ישי עבור API מפתח" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Pushover ×פשר התר×ות" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Pushover דורש חשבון" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "×סימון יישו×" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "(×סימון ×™×™×©×•× (דרוש" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "מפתח משתמש" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "מפתח משתמש (דרוש)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "התקן(×™×)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Pushbullet ×פשר התר×ות" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Pushbullet דורש חשבון" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "×ישי API מפתח" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "×”×ישי שלך (דרוש) Pushbullet API מפתח" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "התקן" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "התקן ×ליו הודעה תישלח" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "תסריט התר×ות" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "×פשר תסריט התר×ות" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "מבצע תסריט מות×× ×ישית" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "?××™×–×” תסריט עלינו לבצע עבור התר×ות" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" "ינסה להת××™× ×œ×§×˜×’×•×¨×™×•×ª המוגדרות למטה. בנוסף, ×תה יכול להוסיף תנ××™× ×ל " "\"קטגוריות/קבוצות של מדדן\" כדי להת××™× ×¢×•×“ קטגוריות. השתמש ×‘×¤×¡×™×§×™× ×›×“×™ " "SABnzbd ×שר NZB-×ž×“×“× ×™× ×™×›×•×œ×™× ×œ×¡×¤×§ קטגוריה בתוך ×”\r\n" ".להפריד תנ××™×. ×ª×•×•×™× ×›×œ×œ×™× × ×ª×ž×›×™× ×‘×ª× ××™×
.עוד מידע יכול ×œ×”×™×ž×¦× ×‘×•×•×™×§×™" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr ".×¡×™×•× ×”× ×ª×™×‘ ×¢× ×›×•×›×‘×™×ª * תמנע יצירת תיקיות עבודה" #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "תיקיות קרובות משפחה מבוססות על" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "תיקייה/נתיב" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "קטגוריות / קבוצות של מדדן" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "מיון סדרות" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "×פשר מיון טלוויזיה" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "מפתח דפוס" #: sabnzbd/skintext.py msgid "Clear" msgstr "× ×§×”" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "החל מסנני×" #: sabnzbd/skintext.py msgid "Presets" msgstr "קד×־קביעות" #: sabnzbd/skintext.py msgid "Example" msgstr "דוגמה" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "מיון סרטי×" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "×פשר מיון סרטי×" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "שמור הורדות רפויות בתיקיות נוספות" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "קטגוריות מושפעות" #: sabnzbd/skintext.py msgid "Meaning" msgstr "משמעות" #: sabnzbd/skintext.py msgid "Pattern" msgstr "דפוס" #: sabnzbd/skintext.py msgid "Result" msgstr "תוצ××”" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 תיקיית עונה" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 תיקיית עונה" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 תיקיית פרק" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 תיקיית פרק" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "×©× ×¢×‘×•×“×” בתור ×©× ×§×•×‘×¥" #: sabnzbd/skintext.py msgid "Title" msgstr "כותר" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "×©× ×¡×¨×˜" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "ש×.סרט" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "ש×_סרט" #: sabnzbd/skintext.py msgid "Show Name" msgstr "הר××” ש×" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "הר××”.ש×" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "הר××”_ש×" #: sabnzbd/skintext.py msgid "Season Number" msgstr "מספר עונה" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "מספר פרק" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "×©× ×¤×¨×§" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "ש×.פרק" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "ש×_פרק" #: sabnzbd/skintext.py msgid "File Extension" msgstr "סיומת קובץ" #: sabnzbd/skintext.py msgid "Extension" msgstr "סיומת" #: sabnzbd/skintext.py msgid "Part Number" msgstr "מספר חלקי" #: sabnzbd/skintext.py msgid "Decade" msgstr "עשור" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "×©× ×ž×§×•×¨×™ של קובץ" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "×©× ×¢×‘×•×“×” מקורי" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "רישיות קטנה" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEXT" #: sabnzbd/skintext.py msgid "text" msgstr "text" #: sabnzbd/skintext.py msgid "file" msgstr "קובץ" #: sabnzbd/skintext.py msgid "Sort String" msgstr "מיין מחרוזת" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "תווית מרובת-חלקי×" #: sabnzbd/skintext.py msgid "In folders" msgstr "בתיקיות" #: sabnzbd/skintext.py msgid "No folders" msgstr "×ין תיקיות" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "מיון ת×ריכי×" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "×פשר מיון ת×ריכי×" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "הר××” ×©× ×ª×™×§×™×™×”" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "תיקיות שנה-חודש" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "תיקיות יומיות" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "רישיות-מות×מת" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "תוצ××” מעובדת" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" ".×פשרויות הנמצ×ות בשימוש ×œ×¢×™×ª×™× ×¨×—×•×§×•×ª. עבור משמעותן והסברן, לחץ על כפתור " "העזרה ולך ×ל דף הוויקי
.×ל תשנה ×ותן ×œ×œ× ×‘×“×™×§×ª הוויקי תחילה, מ×חר שלכמה " "מהן יש תופעות לוו××™ רציניות
.ערכי ברירת המחדל ×”× ×‘×™×Ÿ הסוגריי×" #: sabnzbd/skintext.py msgid "Values" msgstr "ערכי×" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "NZB ערוך פרטי" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "מחק" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "ר×ש" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "למעלה" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "למטה" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "תחתית" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "הכל" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "הפוך" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "×©× ×§×•×‘×¥" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "נוש×" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "בחירה" #: sabnzbd/skintext.py msgid "left" msgstr "נותר" #: sabnzbd/skintext.py msgid "Free Space" msgstr "שטח פנוי" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "תיקייה זמנית" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "רב-תפעולי×" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "כדי לבחור טווח shift ×”×—×–×§ ×ת מקש" #: sabnzbd/skintext.py msgid "Check all" msgstr "סמן הכל" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "SABnzbd הפעל מחדש ×ת" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "×פשרויות של מעמד וממשק" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "!×ו גרור ושחרר ×§×‘×¦×™× ×‘×—×œ×•×Ÿ" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "..SABnzbd ×בד חיבור ×ל" #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "קצב רענון" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "השתמש בהגדרות ממשק עולמיות" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "מגבלת פריטי תור" #: sabnzbd/skintext.py msgid "History item limit" msgstr "מגבלת פריטי היסטוריה" #: sabnzbd/skintext.py msgid "Date format" msgstr "תסדיר ת×ריך" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "עמודת תור נוספת" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "עמודה נוספת של היסטוריה" #: sabnzbd/skintext.py msgid "page" msgstr "דף" #: sabnzbd/skintext.py msgid "Loading" msgstr "טוען" #: sabnzbd/skintext.py msgid "articles" msgstr "מ×מרי×" #: sabnzbd/skintext.py msgid "Rename" msgstr "שנה ש×" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "תיקון תור" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "הר××” ×—×™×‘×•×¨×™× ×¤×¢×™×œ×™×" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "עבודות יתומות" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "שלח חזרה לתור" #: sabnzbd/skintext.py msgid "Delete All" msgstr "מחק הכל" #: sabnzbd/skintext.py msgid "Retry all" msgstr "נסה שוב הכל" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "מכתובת NZB משוך" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "NZB העלה" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "ציין ב×ופן רשותי ×©× ×§×•×‘×¥" #: sabnzbd/skintext.py msgid "Submit" msgstr "הגש" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "פתח כתובת של מידע" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "הוגש. תודה!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "×œ× × ×‘×—×¨ ×©×•× ×“×‘×¨!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "הסר ×ת כל ×”×§×‘×¦×™× ×©× ×‘×—×¨×•" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "הסתר/הר××” ×§×‘×¦×™× ×©×œ×ž×™×" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "הצג יומן תסריטי×" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "עדכון זמין!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" "!×חסון מקומי (עוגיות) מושבת בדפדפן שלך, הגדרות ממשק ×™×בדו ל×חר שתסגור ×ת " "הדפדפן" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "!יש מספר מ××¤×™×™× ×™× (חדשי×) ש×תה עשוי ל×הוב Glitter-ל" #: sabnzbd/skintext.py msgid "Custom" msgstr "מות××" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "פריסה צמומה" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "פריסה בלשוניות
(תור והיסטוריה נפרדי×)" #: sabnzbd/skintext.py msgid "Speed" msgstr "מהירות" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "×שר מחיקות תור" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "×שר מחיקות היסטוריה" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "(!כמה זמן ×ו עד מתי תרצה להשהות? (ב×נגלית" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr ".סליחה, ×œ× ×™×›×•×œ× ×• לפרש ×ת ×–×”. נסה שוב" #: sabnzbd/skintext.py msgid "Pause for..." msgstr "...השהה למשך" #: 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 Oldest→Newest" msgstr "מיין לפי גיל החדש ביותר→הישן ביותר" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "מיין לפי גיל הישן ביותר→החדש ביותר" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "מיין לפי ×©× ×→ת" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "מיין לפי ×©× ×ª→×" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "מיין לפי גודל הקטן ביותר→הגדול ביותר" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "מיין לפי גודל הגדול ביותר→הקטן ביותר" #: sabnzbd/skintext.py msgid "Uploading" msgstr "מעלה" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "מ×לץ ניתוק" #: sabnzbd/skintext.py msgid "Removing job" msgstr "מסיר עבודה" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "מסיר עבודות" #: sabnzbd/skintext.py msgid "Prev" msgstr "הקוד×" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "הב×" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "?לטהר ×ת ההיסטוריה" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "!יתפקד Plush-כדי ש JavaScript ×תה חייב ל×פשר" #: sabnzbd/skintext.py msgid "Options" msgstr "×פשרויות" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "?לכמה דקות להשהות" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "תפריט עליון" #: sabnzbd/skintext.py msgid "On Finish" msgstr "בסיו×" #: sabnzbd/skintext.py msgid "Sort" msgstr "מיין" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "מיין לפי גיל (הישן ביותר→החדש ביותר)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "מיין לפי גיל (החדש ביותר→הישן ביותר)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "מיין לפי ×©× (×→ת)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "מיין לפי ×©× (ת→×)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "מיין לפי גודל (הקטן ביותר→הגדול ביותר)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "מיין לפי גודל (הגדול ביותר→הקטן ביותר)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "?לטהר ×ת התור" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "לנסות שוב ×ת כל העבודות הנכשלות בהיסטוריה?" #: sabnzbd/skintext.py msgid "Purge" msgstr "טהר" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "מהירות מרבית" #: sabnzbd/skintext.py msgid "Range" msgstr "טווח" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "החל לנבחרי×" #: sabnzbd/skintext.py msgid "Everything" msgstr "הכל" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "קצב רענון" #: sabnzbd/skintext.py msgid "Container Width" msgstr "רוחב מכל" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "×–×” ימנע רענון תוכן כשסמן העכבר שלך מרחף מעל התור" #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "×—×¡×•× ×¨×¢× ×•× ×™× ×‘×¨×™×—×•×£" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "העלה" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr ".nzb .rar .zip .gz, .bz2 :העלה" #: sabnzbd/skintext.py msgid "Progress" msgstr "התקדמות" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "!×ין מספיק שטח פנוי כדי ×œ×”×©×œ×™× ×”×•×¨×“×•×ª" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "פנוי (זמני)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "מנוחה" #: sabnzbd/skintext.py msgid "Downloads" msgstr "הורדות" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "SABnzbd ×שף התחלה זריזה של" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "SABnzbd גרסת" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "הקוד×" #: sabnzbd/skintext.py msgid "Server Details" msgstr "פרטי שרת" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr ".העיקרי שלך usenet ×× × ×”×›× ×¡ ×ת ×”×¤×¨×˜×™× ×©×œ ספק" #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "מספר ×”×—×™×‘×•×¨×™× ×”×ž×•×ª×¨×™× ×¢\"×™ הספק שלך" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "לדוגמה 8 ×ו 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr ".SSL בחר רק ×× ×”×¡×¤×§ שלך מתיר חיבורי" #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr ".לחץ כדי לבחון ×ת ×”×¤×¨×˜×™× ×©×”×•×›× ×¡×•" #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "לדוגמה" #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "!ההתקנה שלמה כעת" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr ".ירוץ כעת ברקע SABnzbd" #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr ".SABnzbd סגירה של חלונות/לשוניות כלשה×/כלשהן ×œ× ×ª×¡×’×•×¨ ×ת" #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" ".×›×שר ×”×•× ×¨×¥ ברקע SABnzbd מומלץ ללחוץ לחיצה ימנית וליצור סימנייה ×œ×ž×™×§×•× ×–×” " "ולהשתמש בסימנייה זו כדי להשיג גישה ×ל" #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "עזרה נוספת יכולה ×œ×”×™×ž×¦× ×‘" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "SABnzbd עבור ×ל" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "SABnzbd-×¦× ×ž" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "התחל ×שף" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" ".גרסה 2 ×ו (לבחירתך) כל גרסה ×©×”×™× ×ž×וחרת יותר GNU מגיע בהחלט ×œ×œ× ×חריות. זו " "תוכנה חינמית, ו×תה מוזמן להפיצה מחדש תחת תנ××™× ×ž×¡×•×™×ž×™×. ×”×™× ×‘×¨×©×™×•×Ÿ תחת רשיון " "ציבורי כללי של 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] msgid "Error getting TV info (%s)" msgstr "(%s) שגי××” בהשגת מידע טלוויזיה" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "%s ×ל %s:נכשל בשינוי ש×" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "%s ×ל %s :נכשל בשינוי ×©× ×©×œ קובץ דומה" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "גישה בלתי מורשת" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "קובץ ×œ× ×¢×œ השרת" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "השרת ×œ× ×”×™×” יכול ×œ×”×©×œ×™× ×‘×§×©×”" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "תופס כתובות קרס" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "בלתי שמיש NZB קובץ" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "%s ;משיכת כתובת נכשלה" #~ msgid "WARNINGS" #~ msgstr "×זהרות" #~ msgid "Hide files" #~ msgstr "הסתר קבצי×" #~ msgid "HTTPS Support" #~ msgstr "תמיכת HTTPS" #~ msgid "Skip" #~ msgstr "דלג" #~ msgid "folder" #~ msgstr "תיקייה" #~ msgid "Delete Failed" #~ msgstr "מחק נכשלי×" #~ msgid "Links" #~ msgstr "קישורי×" #~ msgid "No results" #~ msgstr "×ין תוצ×ות" #~ msgid "First" #~ msgstr "ר×שון" #~ msgid "Last" #~ msgstr "×חרון" #~ msgid "Edit" #~ msgstr "ערוך" #~ msgid "Timeleft" #~ msgstr "זמן שנותר" #~ msgid "OK" #~ msgstr "×ישור" #~ msgid "Queued" #~ msgstr "בתור" #~ msgid "Delete Completed" #~ msgstr "מחק שלמי×" #~ msgid "Saved" #~ msgstr "נשמר" #~ msgid "DualView1" #~ msgstr "תצוגה כפולה 1" #~ msgid "DualView2" #~ msgstr "תצוגה כפולה 2" #~ msgid "Hide Edit Options" #~ msgstr "הסתר ×פשרויות עריכה" #~ msgid "Email Sent!" #~ msgstr "!דו×\"ל נשלח" #~ msgid "Email Test Result" #~ msgstr "תוצ×ת בחינת דו×\"ל" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "NotifyOSD שלח התר×ות ×ל" #~ msgid "Send notifications to Notification Center" #~ msgstr "שלח התר×ות ×ל מרכז ההתר×ות" #~ msgid "Send notifications to Growl" #~ msgstr "Growl שלח התר×ות ×ל" #~ msgid "Show files" #~ msgstr "הר××” קבצי×" #~ msgid "Show Edit Options" #~ msgstr "הר××” ×פשרויות עריכה" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "מר××” %s עד %s מתוך %s תוצ×ות" #~ msgid "Showing one result" #~ msgstr "מר××” תוצ××” ×חת" #~ msgid "Enable MultiCore Par2" #~ msgstr "מרובה ליבות Par2 ×פשר" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "החל ניסיונות ×—×•×–×¨×™× ×ž×¨×‘×™×™× ×¨×§ על ×©×¨×ª×™× ×¨×©×•×ª×™×™×" #~ msgid "Only for optional servers" #~ msgstr "רק עבור ×©×¨×ª×™× ×¨×©×•×ª×™×™×" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "החלף ×ª×•×•×™× ×‘×œ×ª×™ ×—×•×§×™×™× ×‘×©×ž×•×ª תיקיות" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr ".(החלף ×ª×•×•×™× ×‘×œ×ª×™ ×—×•×§×™×™× ×‘×©×ž×•×ª תיקיות בשווי ערך (×חרת יימחקו" #~ msgid "Unpacking failed, see log" #~ msgstr "פריקה נכשלה, ר××” יומן ×ירועי×" #~ msgid "No email templates found" #~ msgstr "×œ× × ×ž×¦×ו תבניות דו×\"ל" #~ msgid "Original Foldername" #~ msgstr "×©× ×§×•×‘×¥ מקורי" #~ msgid "_yenc module... NOT found!" #~ msgstr "!×œ× × ×ž×¦× ..._yenc פירקן" #~ msgid "Folder \"%s\" does not exist" #~ msgstr "××™× ×” קיימת \"%s\" התיקייה" #~ msgid "Invalid encoding of email template %s" #~ msgstr "%s הצפנה בלתי תקפה של תבניות דו×\"ל" #~ msgid "Invalid par2 files, cannot verify or repair" #~ msgstr "בלתי תקפי×, ×œ× ×™×›×•×œ ×œ×•×•×“× ×ו לתקן par2 קבצי" #~ msgid "ERROR: %s" #~ msgstr "%s :שגי××”" #~ msgid "File %s is empty, skipping" #~ msgstr "ריק, מדלג %s הקובץ" #~ msgid "Toggle Add NZB" #~ msgstr "NZB עורר הוספת" #~ msgid "Error removing workdir (%s)" #~ msgstr "(%s) שגי××” בהסרת תיקיית עבודה" #~ msgid "CRC Error in %s (%s -> %s)" #~ msgstr "%s (%s -> %s)-ב CRC שגי×ת" #~ msgid "Main packet not found..." #~ msgstr "...חפיסה ר×שית ×œ× × ×ž×¦××”" #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr ".Vista על ZoneAlarm-סביר להניח ש×תה משתמש ב
" #~ msgid "SQL Commit Failed, see log" #~ msgstr "נכשל, ר××” יומן SQL חיוב" #~ msgid "Delete the all failed items from the history?" #~ msgstr "למחוק ×ת כל ×”×¤×¨×™×˜×™× ×”× ×›×©×œ×™× ×ž×”×”×™×¡×˜×•×¨×™×”?" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "?SABnzbd ×”×× ×תה בטוח ש×תה רוצה להפעיל מחדש ×ת" #~ msgid "No post-processing because of failed verification" #~ msgstr "×ין בתר־עיבוד בגלל ×•×™×“×•× ×›×•×©×œ" sabnzbd-develop/po/main/fi.po0000600000175000017500000044135513642116632014251 0ustar jpjp# Finnish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2020-02-10 09:27+0000\n" "Last-Translator: tuomass \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:02+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Web-käyttöliittymän käynnistys epäonnistui" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "Web-mallia %s ei löydy, yritetään käyttää oletusmallia" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "par2 ohjelmaa... EI löydy!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "MultiPar-ohjelmaa... EI löydy!" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "UNRAR-versiosi on %s, suosittelemme käyttämään versiota %s tai uudempaa.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "unrar-ohjelmaa... EI löydy!" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "unzip-ohjelmaa... EI löydy!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "7za-ohjelmaa... EI löydy!" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Huomioithan, että 0.0.0.0 isäntänimi vaatii IPv6 osoitteen jotta pääset " "ulkoverkkoon" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "HTTP- ja HTTPS-portit eivät voi olla samoja" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" "SABnzbd käynnistettiin %s merkistökoodauksella. Tämän pitäisi olla UTF-8. " "Unicode-merkkejä tiedosto- ja kansionimissä sisältävät lataukset voivat " "aiheuttaa ongelmia." #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "" "HTTPS on poistettu käytöstä puuttuvien CERT- ja KEY-tiedostojen vuoksi" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Web-käyttöliittymän käynnistys epäonnistui : " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "SABHelper palvelua ei voitu tavoittaa" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s käynnistetty" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Varoitus" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Virhe" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "SABnzbd sammutus valmis" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Isäntänimeä ei ole asetettu." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "Yhteyksiä ei ole asetettu. Aktivoi ainakin yksi yhteys." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Salasana on piilotettu ******, syötä uudelleen" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Virheelliset palvelimen tiedot" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "" "Aikakatkaistu: Yritä laittaa SSL päälle tai yhdistä toiseen porttiin." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Aikakatkaistiin" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" "Tuntematon SSL protokolla: Kokeile ottaa SSL käytöstä tai vaihda porttia." #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Virheellinen palvelimen osoite." #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Palvelin lopetettiin kesken kirjautumisen" #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Palvelin vaatii käyttäjänimen ja salasanan." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Yhdistäminen onnistui!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Varmennus epäonnistui, tarkista käyttäjänimi/salasana." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "Liikaa yhteyksiä, keskeytä lataaminen tai yritä myöhemmin uudelleen" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Yhteystestin lopputulosta ei voitu määrittää (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Signaali %s kaapattu, tallennetaan ja lopetetaan..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Vakava virhe tallennettaessa tilaa" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Yritetään noutaa NZB osoitteesta %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Kohteen %s tallentaminen epäonnistui" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Väliaikaistiedostoa ei voida luoda kohteelle %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Yritettiin asettaa tila ei olemassa olevalle palvelimelle %s" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Virhe tiedostossa tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Kohteen %s lataaminen epäonnistui" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "Sähköpostitus onnistui" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Testaa ilmoitusta" #: sabnzbd/api.py msgid " Resolving address" msgstr " Selvitetään osoitetta" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Oletus" #: sabnzbd/api.py msgid "unknown" msgstr "tuntematon" #: sabnzbd/api.py [Error message] 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" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Levyvirhe luotaessa tiedostoa %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Vakava virhe kohteessa Assembler" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Peruutettu, salattu arkisto tunnistettu" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "Varoitus: Latauksessa \"%s\" ei toivottu tiedostopääte RAR arkistossa. Ei " "toivottu tiedosto on %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "Ei toivottu tiedostopääte on rar arkistossa %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Peruutettu, ei toivottu tiedostopääte havaittu" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "VAROITUS : Keskeytetty lataus \"%s\", koska luokituksena (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "VAROITUS : Peruutettiin lataus \"%s\", koska luokituksena on (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Peruutettu, luokituksessa esiintyi suodatinosuma (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s puuttuu" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "video" #: sabnzbd/assembler.py msgid "audio" msgstr "ääni" #: sabnzbd/assembler.py msgid "spam" msgstr "roskaposti" #: sabnzbd/assembler.py msgid "passworded" msgstr "salasanasuojattu" #: sabnzbd/assembler.py msgid "downvoted" msgstr "epäsuosittu" #: sabnzbd/assembler.py msgid "keywords" msgstr "avainsanat" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Latausrajoitus saavutettu, keskeytetään lataukset" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s ei ole kelvollinen sähköpostiosoite" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Palvelimen osoite vaaditaan" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Ei voitu luoda %s kansiota %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Ei voitu kirjoittaa INI tiedostoa %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Ei voitu luoda varmuuskopiotiedostoa kohteelle %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Virheellisesti koodattu salasana %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s ei ole oikea oktaalinen arvo" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "TUNT polku \"%s\" ei ole sallittu" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Virhe: Polun pituus täytyy olla alle %s." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Virhe: Jono ei ole tyhjä, kansiota ei voida vaihtaa." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "Historian tietokantaan ei voida kirjoittaa, tarkista käyttöoikeudet!" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "" "Historian tietokanta on vahingoittunut, luotiin uusi tyhjä tietokanta" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "SQL komento epäonnistui, katso loki" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "Tietokannan sulkeminen epäonnistui, katso loki" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Virheellinen tila lokihistoriassa kohteelle %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Kohteen %s dekoodaus epäonnistui" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Huonosti muotoiltu yEnc artikkeli %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Tuntematon virhe dekoodattaessa %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => puuttuu kaikilta palvelimilta, hylätään" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Valmistunut" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "Purettiin %s tiedostoa/kansiota kohteeseen %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [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] msgid "Error while adding %s, removing" msgstr "Virhe lisättäessä %s, poistetaan" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Virhe poistettaessa %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Vahdittua kansiota %s ei voida lukea" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Jatketaan" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "Keskeytetty" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Sinun täytyy määrittää enimmäiskaista ennen kaistarajoituksen käyttöönottoa." #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Palvelimeen %s ei voida yhdistää [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Palvelimen osoitetta ei voitu selvittää" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Palvelin %s ohitetaan %s minuutiksi" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Alustaminen epäonnistui kohteessa %s@%s syy: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "Liikaa yhteyksiä palvelimelle %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Mahdollinen tilin jakaminen" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Kirjautuminen palvelimelle %s epäonnistui" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Yhdistäminen %s@%s epäonnistui, viesti=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Palvelin %s vaatii käyttäjänimen/salasanan" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Mahdollinen virhe lataajassa" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Sammutetaan" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Postipalvelimeen yhdistäminen epäonnistui" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "TLS yhteyden aloittaminen epäonnistui" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "Palvelin ei vastannut oikein hello-pyyntöön." #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Postipalvelimen varmennus epäonnistui" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Yhteensopivan varmennustavan löytäminen epäonnistui" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Tuntematon varmennusvirhe sähköpostipalvelimelta." #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Sähköpostin lähetys epäonnistui" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Sähköpostiyhteyden sulkeminen epäonnistui" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Vastaanottajaa ei määritelty, sähköpostia ei lähetetty" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd raportoi levy täynnä\n" "\n" "Hei,\n" "\n" "SABnzbd on lopettanut lataamasta, koska levy on lähes täynnä.\n" "Ole hyvä ja tee lisää tilaa ja jatka SABnzbd käsin.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Ei voi luoda kansiota %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "%s kansio: %s virhe käytettäessä" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Käyttöoikeuksien muuttaminen epäonnistui kohteelle %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Kohteen (%s) luominen epäonnistui" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Kohteen %s siirtäminen kohteeseen %s epäonnistui" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "Käyttäjä kirjautui sisään web-käyttöliittymään" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "Käyttäjä kirjautui sisään" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Istuntoavain puuttuu" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Virhe: Istuntoavain vaaditaan" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Virhe: Istuntoavain on virheellinen" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "API avain puuttuu, ole hyvä ja syötä Asetukset->Yleiset löytyvä api avain " "käyttämääsi kolmannen osapuolen ohjelmaan:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "API avain virheellinen, käytä Asetukset->Yleiset löytyvää api avainta " "käyttämääsi kolmannen osapuolen ohjelmaan:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Authentikointi puuttuu, ole hyvä ja syötä käyttäjänimi/salasana Asetukset-" ">Yleiset kolmannen osapuolen ohjelmaasi:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Kokeile uutta Glitter teemaa! Uusittu design on optimoitu työpöytä- ja " "mobiilikäyttäjille. Mene Asetukset -> Yleiset muuttaaksesi teemaa." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
SABnzbd sammutus valmis.
Odota noin 5 sekuntia ja paina " "sitten alapuolella olevaa nappia.

Päivitä
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Varoitus: LOCALHOST on hämärä, käytä numeerista IP-osoitetta." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "Palvelimen osoite \"%s:%s\" ei ole kelvollinen." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Syöte" #: sabnzbd/interface.py msgid "Daily" msgstr "Päivittäin" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "Maanantai" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Tiistai" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Keskiviikko" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Torstai" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Perjantai" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Lauantai" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Sunnuntai" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "ei käytössä" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Määrittämätön palvelin!" #: 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 msgid "Back" msgstr "Takaisin" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "VIRHE:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Virheellinen arvo %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "pv" #: sabnzbd/misc.py msgid "h" msgstr "t" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Virhe luotaessa SSL avainta ja sertifikaattia" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Ajetaan skripti" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Jälkikäsittely peruutettiin (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Skripti" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Purkaessa havaittiin liikaa pakkauskerroksia [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Yhdistetään" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Puutteellinen joukko yhdistettäviä tiedostoja" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Tiedostoliitos %s epäonnistui" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Virhe \"%s\" yhdistettäessä tiedostoja" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Virhe \"%s\" ajettaessa file_join kohteelle %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] Liitetty %s tiedostoa" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Purkaminen epäonnistui, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Virhe \"%s\" purettaessa RAR tiedostoja" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Virhe \"%s\" ajettaessa rar_unpack kohteelle %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Kohteen %s poisto epäonnistui!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Yritetään purkaa rar arkistoa salasanalla \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Purkaminen epäonnistui, arkisto vaatii salasanan" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Puretaan" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Pura" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Purkaminen epäonnistui, %s ei löydy" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "VIRHE: kohdetta \"%s\" ei löydy" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Purkaminen epäonnistui, CRC virhe" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "VIRHE: CRC epäonnistui kohteessa \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "Purkaminen epäonnistui, kirjoitusvirhe tai levy täynnä?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "VIRHE: kirjoitusvirhe (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Purkaminen epäonnistui, polku on liian pitkä" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "VIRHE: polku liian pitkä (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Käyttökelvoton RAR arkisto" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "Korruptoitunut RAR arkisto" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s tiedostoa kohteessa %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Virhe \"%s\" ajettaessa unzip() kohteelle %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Yritetään purkaa 7zip arkistoa salasanalla \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "7ZIP setti \"%s\" on puutteellinen, ei voida purkaa" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Ei voitu purkaa %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Pikatarkistetaan" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Korjaa" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Pikatarkistus OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Aloitetaan korjaus" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Korjaus epäonnistui, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Virhe %s ajettaessa par2_repair setille %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Virhe \"%s\" ajettaessa par2_repair setille %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2 vastaanotti vääränlaiset asetukset, tarkista Asetukset->Muuttujat" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Varmennettiin ajassa %s, kaikki tiedostot kelvollisia" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Varmennetiin ajassa %s, vaatii korjauksen" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Noudetaan %s lohkoa..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Noudetaan" #: sabnzbd/newsunpack.py msgid "Repair failed, not enough repair blocks (%s short)" msgstr "Korjaaminen epäonnistui, ei tarpeeksi korjauslohkoja (%s puuttuu)" #: sabnzbd/newsunpack.py msgid "Repairing" msgstr "Korjataan" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Korjattiin ajassa %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Levy täynnä" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Varmennetaan" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Tarkistetaan" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Tämä palvelin ei salli SSL yhteyksiä tähän porttiin" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "Palvelin %s käyttää epäluotettavaa sertifikaattia [%s]" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Käynnistys/Sammutus" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "Lisätty NZB" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Jälkikäsittely aloitettu" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Lataus valmistunut" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Lataus epäonnistui" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Jono valmistunut" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Muut viestit" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "Ei saatavilla" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Prowl viestin lähetys epäonnistui" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Virheellinen vastaus Pushoverilta (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "Pushover viestin lähetys epäonnistui" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Virheellinen vastaus Pushbulletilta (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Pushbullet viestin lähetys epäonnistui" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "Skripti palautti lopetuskoodin %s ja tulosteen \"%s\"" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "Ilmoitusskriptiä \"%s\" ei ole olemassa" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "Windows-ilmoituksen lähetys epäonnistui" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Virhe tuotaessa %s tiedostoa kohteesta %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Ei-tuettu jonotiedosto löytyi, ei voida jatkaa" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Virhe ladattaessa %s, korruptoitunut tiedosto havaittu" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB lisätty jonoon" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Tuntematon koodaus" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Keskeneräinen NZB tiedosto %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Virheellinen NZB tiedosto %s, ohitetaan (syy=%s, rivi=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Tyhjä NZB tiedosto %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Ohitetaan kaksoiskappale NZB \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Keskeytetään kaksoiskappale NZB \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Peruutettu, ei voi valmistua" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "KAKSOISKAPPALE" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "SALATTU" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "LIIAN SUURI" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "KESKENERÄINEN" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "EI TOIVOTTU" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "SUODATETTU" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "ODOTA %s sekuntia" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "LEVITETÄÄN %s min" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Ladattiin ajassa %s keskilatausnopeudella %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Ikä" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s artikkelia oli väärin muotoiltuja" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s artikkelia puuttui" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s artikkelissa oli ei-vastaavia kaksoiskappaleita" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s artikkelia poistettiin" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Virhe tuotaessa %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Varoitukset" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Toimeton" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Asetukset" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Jono" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Tyhjennä jono" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Historia" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Tyhjennä historia" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Nopeusrajoitus" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Keskeytä" #: sabnzbd/osxmenu.py msgid "min." msgstr "min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Jatka" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Tarkista vahdittu kansio" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Lue kaikki RSS syötteet" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Valmistuneet-kansio" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Lataukset-kansio" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Vianmääritys" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Käynnistä uudelleen" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Käynnistä uudelleen ilman kirjautumista" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Lopeta" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Vie ensimmäiset 10 kohdetta jonoon" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Tyhjä" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Vie viimeiset 10 kohdetta historiaan" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Uusi versio saatavilla" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Mene velhoon" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Pysäytetään..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Ongelma" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd tarvitsee vapaan tcp/ip portin sisäiselle web-" "palvelimelleen.
\n" " Porttia %s kohteessa %s yritettiin käyttää , mutta se ei ollut " "vapaana.
\n" " Jokin toinen ohjelmisto käyttää porttia tai SABnzbd on jo " "käynnissä.
\n" "
\n" " Ole hyvä ja uudelleenkäynnistä SABnzbd toisella porttinumerolla." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "Jos saat tämän virhesanoman uudestaan, kokeile toista numeroa.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd tarvitsee vapaan tcp/ip portin sisäiselle web-" "palvelimelleen.
\n" " Olet määritellyt epäkelvon osoitteen.
\n" " Turvalliset arvot ovat localhost ja 0.0.0.0
\n" "
\n" " Ole hyvä ja uudelleenkäynnistä SABnzbd kunnollisella isäntäosoitteella." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd havaitsi tallennettua tietoa toisesta SABnzbd versiosta
\n" " mutta ei voi uudelleenkäyttää tietoja toisesta ohjelmasta.

\n" " Haluat ehkä ladata jonon loppuun toisella ohjelmallasi.

\n" " Tämän jälkeen, käynnistä ohjelma \"--clean\" muuttujalla.
\n" " Tämä tyhjentää nykyisen jonon ja historiasi!
\n" " SABnzbd luki tiedostoa \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd ei löydä sen web-käyttöliittymän tiedostoja polusta %s.
\n" " Ole hyvä ja asenna ohjelma uudelleen.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd havaitsi vakavan virheen:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd havaitsi, että tiedosto sqlite3.dll puuttuu.

\n" " Jotkin huonosti suunnitellut viruksentorjunta ohjelmistot poistavat " "tämän tiedoston.
\n" " Tarkista virustorjunta ohjelmistosi, yritä asentaa SABnzbd uudelleen ja " "valita virustorjunta ohjelmistosi valmistajalle.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Paina Windows-nappia+R ja kirjoita seuraava rivi (esimerkki):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Avaa pääte ja kirjoita rivi (esimerkki):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Ohjelma ei käynnistynyt!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "Vakava virhe" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Selainta ei voida käynnistää, todennäköisesti ei löydy" #: sabnzbd/panic.py msgid "Access denied" msgstr "Ei käyttöoikeutta" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Virhe %s: Syötä kelvollinen käyttäjänimi ja salasana." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "" "Vanhan version jono havaittiin, käytä Tila->Korjaa muuntaaksesi jonon" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" 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" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Lataus epäonnistui - Ei ole palvelimilla" #: sabnzbd/postproc.py msgid "Moving" msgstr "Siirretään" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "Lähetettiin %s jonoon" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Virhe uudelleennimettäessä \"%s\" nimelle \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Tiedostojen siirto epäonnistui" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Ajetaan käyttäjän skripti %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "Ajettiin %s" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Skriptin lopetuskoodi on %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Lisää" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Jälkikäsittely epäonnistui kohteelle %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "katso lokitiedosto" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Lataus epäonnistui" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "%s puhdistaminen epäonnistui." #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Lataus valmistui" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Ei voitu luoda lopullista kansiota %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Jälkikäsittely" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Ei par2 arkistoja" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Yritetään SFV varmennusta" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Jotkin tiedostot eivät varmentuneet \"%s\" kanssa" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Varmennettiin onnistuneesti SFV tiedostojen avulla." #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "Yritetään RAR-pohjaista varmennusta" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "[%s] RAR-pohjainen varmennus epäonnistui: %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Salasanasuojattu" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "RAR arkistot varmennettiin onnistuneesti" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "RAR arkistoja ei voitu varmentaa" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "%s poistaminen epäonnistui" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Järjestelmän lepotilaan laittaminen epäonnistui" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Järjestelmän valmiustilaan laittaminen epäonnistui" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Virhe sammutettaessa järjestelmää" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Indeksoijan id:tä (%s) ei löydetty arviointitiedostolle" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Palvelimen osoite" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "API avain" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Virheellinen RSS syötteen kuvaus \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "RSS noutaminen epäonnistui kohteesta %s: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Ei ole käyttöoikeutta syötteeseen %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "Palvelinpään virhe (virhekoodi %s); ei voitu noutaa %s kohteesta %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Palvelin %s käyttää epäluotettavaa HTTPS sertifikaattia" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "RSS syöte %s oli tyhjä" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Puutteellinen syöte" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Tyhjä RSS kohde löytyi (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Näytä käyttöliittymä" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Avaa valmistuneet-kansio" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Keskeytä ajaksi" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Keskeytä 5:ksi minuutiksi" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Keskeytä 15:ksi minuutiksi" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Keskeytä 30:ksi minuutiksi" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Keskeytä tunniksi" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Keskeytä 3:ksi tunniksi" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Keskeytä 6:ksi tunniksi" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Sammuta" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Jäljellä" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Lisää NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Virheellinen ajastus %s kohteessa %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Tuntematon toiminto: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Ajastettu tuntemattomalle palvelimelle %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Lataa" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Yhdistä tiedostot" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Lähde" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Palvelimet" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Epäonnistui" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Epäonnistunut" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Odotetaan" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Korjataan..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Puretaan..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Siirretään..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Ajetaan skripti..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Noudetaan ylimääräiset lohkot..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Pikatarkistus..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Varmennetaan..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Ladataan" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "Levitysviive" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Tehtävä" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "poista palvelin käytöstä" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "ota palvelin käyttöön" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Nopeusrajoitus" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Keskeytä kaikki" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Keskeytä jälkikäsittely" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Jatka jälkikäsittelyä" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Lue RSS syötteet" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Poista epäonnistuneet lataukset" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Poista valmistuneet lataukset" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Keskeytä alhaisen prioriteetin lataukset" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Keskeytä normaalin prioriteetin lataukset" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Keskeytä korkean prioriteetin lataukset" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Jatka alhaisen prioriteetin lataukset" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Jatka normaalin prioriteetin lataukset" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Jatka korkean prioriteetin lataukset" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Ota latausrajoituksen hallinta käyttöön" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Ei käytössä" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Erittäin vähäinen" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Kohtalainen" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normaali" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Korkea" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Hälytys" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Matala" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "Mt" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "Gt" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "tunti" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "tuntia" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "minuutti" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "minuuttia" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "sekunti" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "sekuntia" #: sabnzbd/skintext.py msgid "day" msgstr "päivä" #: sabnzbd/skintext.py msgid "days" msgstr "päivää" #: sabnzbd/skintext.py msgid "week" msgstr "viikko" #: sabnzbd/skintext.py msgid "Month" msgstr "Kuukausi" #: sabnzbd/skintext.py msgid "Year" msgstr "Vuosi" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Kuukauden päivä" #: sabnzbd/skintext.py msgid "This week" msgstr "Tällä viikolla" #: sabnzbd/skintext.py msgid "This month" msgstr "Tässä kuussa" #: sabnzbd/skintext.py msgid "Today" msgstr "Tänään" #: sabnzbd/skintext.py msgid "Total" msgstr "Yhteensä" #: sabnzbd/skintext.py msgid "on" msgstr "käytössä" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parametrit" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Python versio" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Kotisivu" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "tai" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Isäntä" #: sabnzbd/skintext.py msgid "Comment" msgstr "Kommentti" #: sabnzbd/skintext.py msgid "Send" msgstr "Lähetä" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Peruuta" #: sabnzbd/skintext.py msgid "Other" msgstr "Muu" #: sabnzbd/skintext.py msgid "Report" msgstr "Ilmoita" #: sabnzbd/skintext.py msgid "Video" msgstr "Video" #: sabnzbd/skintext.py msgid "Audio" msgstr "Ääni" #: sabnzbd/skintext.py msgid "Not used" msgstr "Ei käytössä" #: sabnzbd/skintext.py msgid "or less" msgstr "tai vähemmän" #: sabnzbd/skintext.py msgid "Log in" msgstr "Kirjaudu sisään" #: sabnzbd/skintext.py msgid "Log out" msgstr "Kirjaudu ulos" #: sabnzbd/skintext.py msgid "Remember me" msgstr "Muista minut" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "Automaattinen usenet lataustyökalu" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Tallenna" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Tallennetaan..." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Oletko varma?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Poistetaanko kaikki ladatut tiedostot?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Alkuun" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Asetukset" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Tila" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Ohje" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Foorumi" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "Ongelmat" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "Tue projektia, lahjoita!" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Yleiset" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Kansiot" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Muuttujat" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Ajastus" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Ilmoitukset" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "Sähköposti" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Kategoriat" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Lajittelu" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Erikoisasetukset" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Etsi" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Lataukset-kansio" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "KESKEYTETTY" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "%s artikkelia välimuistitettu (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Kuorma" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Uusi versio %s saatavilla osoitteesta" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Oletko varma, että haluat sammuttaa SABnzbdn?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Lisää" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Lisää tiedostosta" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Kategoria" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Käsitellään" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Prioriteetti" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Korjaa" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Pura" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Poista" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "U" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "D" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Pakota" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Pysäytä" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "Syötä osoite" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "Kun jono on tyhjä" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Sammuta tietokone" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "Lepotila" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Horrostila" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Sammuta SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Nopeusrajoitus" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Järjestys" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Nimi" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "Aikaa jäljellä" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "IKÄ" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Poista" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Yritä uudelleen" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Toiminnot" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Skriptit" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Poistetaanko kaikki kohteet jonosta?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Puhdista NZBt" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Puhdista NZBt & poista tiedostot" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Yritä uudelleen kaikki epäonnistuneet lataukset" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Poista NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Poista NZB ja tiedostot" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "/" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Puuttuvat artikkelit" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Latausrajoitusta jäljellä" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "käsikäyttöinen" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Resetoi latausrajoitus nyt" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Poistetaanko kaikki valmistuneet kohteet historiasta?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Piilota yksityiskohdat" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Näytä yksityiskohdat" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Näytä epäonnistuneet" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Näytä kaikki" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Koko" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Puhdista epäonnistuneet NZBt" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Puhdista epäonnistuneet NZBt & poista tiedostot" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Puhdista valmistuneet NZBt" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "Puhdista NZBt nykyiseltä sivulta" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "Vaihtoehtoinen täyte-NZB" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Polku" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Yritä uudelleen kaikki epäonnistuneet" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Yritä uudelleen kaikki" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/roskaposti" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Säilytyksen ulkopuolella" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Muu ongelma" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Pakota yhteyden katkaisu" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Tämä lähettää testiviestin sähköpostiosoitteeseesi." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Näytä loki" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Testaa sähköpostia" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Lokiinkirjaus" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Virheet/varoitukset" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Tiedot" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Debug" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Yhteydet" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Viimeisimmät varoitukset" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "tyhjennä" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Poista esto" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Artikkelin tunniste" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Tiedostojoukko" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Milloin" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Tyyppi" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Käytössä" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Hallintapaneeli" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Yhteys epäonnistui!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Paikallinen IPv4 osoite" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Julkinen IPv4 osoite" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "IPv6 osoite" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Nimipalvelin / DNS-selvitys" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "Prosessorin malli" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Järjestelmän suorituskyky (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Latauskansion nopeus" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Valmistuneet-kansion nopeus" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Kirjoitusnopeus" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "" "Ei voitu kirjoittaa. Varmista, että sinulla on kirjoitusoikeus kansioon." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Paina Toista testi -painiketta alapuolella määrittääksesi" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Toista testi" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "Asetustiedosto" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Käytetty välimuisti" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Tämä uudelleenkäynnistää SABnzbdn.
Käytä sitä kun luulet ohjelman " "toimivan epävakaasti.
Lataaminen keskeytyy uudelleenkäynnistyksen " "ajaksi ja jatkuu ohjelman käynnistyttyä." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" "
Jos tunnistautuminen on käytössä, sinun täytyy kirjautua sisään " "uudestaan." #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Latauskansiossa on orpoja latauksia.
Voit valita niiden poistamisen " "(sisältäen tiedostot) tai voit lähettää ne takaisin jonoon." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "\"Korjaa\" painike käynnistää SABnzbd uudelleen ja luo jonon
sisällön " "täydellisesti uudelleen, säilyttäen jo ladatut tiedostot.
Tämä muuttaa " "jonon järjestystä." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Muutoksia ei ole tallennettu ja ne menetetään." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" "Istunto vanhenee kun IP-osoite vaihtuu tai SABnzbd käynnistetään uudelleen." #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Unzip käytössä" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "7zip käytössä" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "Versio" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Käynnissäoloaika" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Varmuuskopioi" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Lue Wikin ohjeet tähän!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Käynnistetään SABnzbd uudelleen..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Muutokset vaativat SABnzbdn uudelleenkäynnistyksen!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "SABnzbd web-palvelin" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "SABnzbd isäntä" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Osoite jota SABnzbdn tulisi kuunnella." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "SABnzbd portti" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Portti jota SABnzbdn tulisi kuunnella." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Web-käyttöliittymä" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Valitse teema." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "SABnzbd käyttäjänimi" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Vaihtoehtoinen käyttäjänimi todennukseen." #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "SABnzbd salasana" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "HTTPS käytössä" #: sabnzbd/skintext.py msgid "not installed" msgstr "ei asennettu" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Ota käyttöön käyttöliittymän käyttäminen HTTPS-osoitteesta." #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "HTTPS portti" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Jos tyhjä, oletusportti kuuntelee ainoastaan HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "HTTPS sertifikaatti" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Tiedostonimi tai polku HTTPS sertifikaattiin." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" "Luo uusi itse allekirjoitettu sertifikaatti ja avain. Vaatii SABnzbd " "uudelleenkäynnistyksen!" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "HTTPS avain" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Tiedostonimi tai polku HTTPS avaimeen." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "HTTPS ketjun sertifikaatit" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Tiedostonimi tai polku HTTPS ketjuun." #: sabnzbd/skintext.py msgid "Tuning" msgstr "Hienosäätö" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "RSS tarkistusväli" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Tarkistusväli (minuutteina, vähintään 15). Ei ole aktiivinen jos käytät " "Ajastinta!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Suurin latausnopeus" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Latausnopeuden prosenttiosuus" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "" "Kuinka monta prosenttia latausnopeudesta SABnzbd saa käyttää, esim. 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Välimuistirajoitus artikkeleille" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Välimuistita artikkelit muistissa levytapahtumien vähentämiseksi.
Tavuina, vaihtoehtoisesti lisää pääte K,M,G. Esimerkiksi: \"64M\" tai " "\"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Puhdistuslista" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Lista tiedostopäätteistä jotka poistetaan latauksen valmistuttua.
Esimerkiksi: nfo tai nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Tallenna muutokset" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "Palauta oletusasetukset" #: sabnzbd/skintext.py msgid "Reset" msgstr "Nollaa" #: sabnzbd/skintext.py msgid "Language" msgstr "Kieli" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Valitse web-käyttöliittymän kieli." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" "Auta meitä kääntämään SABnzbd sinun kielellesi!
Käännä tai muokkaa " "olemassaolevia käännöksiä täällä:" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "" "Tämä avain antaa kolmannen osapuolen ohjelmille täyden pääsyn SABnzbd-" "ohjelmaan." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "NZB avain" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Tämä avain antaa kolmannen osapuolen ohjelmille oikeudet lisätä NZB-" "tiedostoja SABnzbd-ohjelmaan." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Luo uusi avain" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "API avaimen QR-koodi" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Lista paikallisista verkko-osoitealueista" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Kaikki paikalliset verkko-osoitteet alkavat näillä etuliitteillä (yleensä " "\"192.168.1.\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Ulkoinen ohjelman käyttö" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "Ei pääsyä" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Lisää NZB tiedostot " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (ei asetuksia)" #: sabnzbd/skintext.py msgid "Full API" msgstr "Täysi API" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Täysi Web-käyttöliittymä" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "Vain ulkoinen käyttö vaatii kirjautumisen" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "HUOM: Kansiot luodaan automaattisesti tallennuksen yhteydessä. Voit " "käyttää täydellisiä polkuja jos haluat tallentaa oletuskansioiden " "ulkopuolelle." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Käyttäjähakemistot" #: sabnzbd/skintext.py msgid "Browse" msgstr "Selaa" #: sabnzbd/skintext.py msgid "In" msgstr "Kohteessa" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Väliaikaiset lataukset kansio" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Sijainti jonne tallennetaan latauksessa olevat kohteet ennen käsittelyä.
Voidaan muuttaa vain kun jono on tyhjä." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Pienin vapaan tilan määrä väliaikaisille latauksille" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Keskeytä automaattisesti kun vapaan tilan määrä on vähemmän kuin tämä " "arvo.
Tavuina, mutta voit laittaa perään K,M,G,T kirjaimen. " "Esimerkiksi: \"800M\" tai \"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Valmistuneet kansio" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Sijainti jonne tallennetaan valmistuneet ja täysin käsitellyt ladatut " "kohteet.
Käyttäjän asettamat kategoriat voivat kumota tämän." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Käyttöoikeudet valmistuneille latauksille" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Aseta käyttöoikeusmalli valmistuneille tiedostoille/kansioille.
Oktaalilukuna. Esimerkiksi: \"755\" tai \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Vahdittu kansio" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Kansio jota vahditaan .nzb tiedostojen varalta.
Etsii .nzb " "tiedostoja myös .zip .rar ja .tar.gz arkistojen sisältä." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Vahditun kansion tarkistusväli" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Skannausväli sekunteina .nzb tiedostoille." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Sähköpostipohjien kansio" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Kansio joka sisältää käyttäjän luomat sähköpostipohjat." #: sabnzbd/skintext.py msgid "Password file" msgstr "Salasanatiedosto" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Tiedosto joka sisältää kaikki salasanat joita kokeillaan salattuihin RAR " "tiedostoihin." #: sabnzbd/skintext.py msgid "System Folders" msgstr "Järjestelmäkansio" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Hallinnollinen kansio" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Sijainti jonne tallennetaan jonon hallinnan ja historian tietokannat.
Voidaan muuttaa vain jonon ollessa tyhjä." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Tiedostoja ei tulla siirtämään. Vaatii SABnzbd " "uudelleenkäynnistyksen!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Lokikansio" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Sijainti jonne SABnzbd ohjelman lokitiedostot tallennetaan.
Vaatii " "SABnzbd uudelleenkäynnistyksen!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr ".nzb varmuuskopiokansio" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Sijainti jonne .nzb tiedostot tallennetaan." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Oletuskansio" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Lataa kaikki par2 tiedostot" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Rekursiivinen purkaminen käytössä" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Purkaa arkistot (rar, zip, 7z) arkistojen sisältä." #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Ohita kansiot arkistojen sisällä" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Kaikki tiedostot menevät yhteen kansioon." #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Hae artikkelit vain jonon huipulta" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Laita päälle jos haluat ohjelman käyttävän vähemmän muistia. Ota pois päältä " "jos haluat estää hitaiden latauksien aiheuttavan ruuhkaa jonossa." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Jälkikäsittele vain onnistuneet lataukset" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" "Suorittaa jälkikäsittelyn vain niille latauksille jotka läpäisevät kaikki " "PAR2 tarkistukset." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Toiminto kun salattu RAR havaitaan" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "Jos valitsit \"Keskeytä\", sinun täytyy antaa salasana ja jatkaa sen jälkeen " "lataamista." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Tunnista päällekkäiset lataukset" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Tunnista identtiset jaksot sarjassa" #: sabnzbd/skintext.py 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 "Hylkää" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Peruuta" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Toiminto kun havaitaan ei toivottu tiedostopääte" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "Toiminto kun ei toivottu tiedostopääte havaitaan RAR arkistossa" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Ei toivotut tiedostopäätteet" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Lista ei toivotuista tiedostopäätteistä. Esimerkiksi: exe tai exe, " "com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "SFV-pohjaiset tarkistukset käytössä" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Suorittaa ylimääräisen varmennuksen SFV tiedostojen avulla." #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Käyttäjän skripti voi merkitä latauksen epäonnistuneeksi" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Kun käyttäjän skripti palauttaa nollasta poikkeavan koodin, lataus merkitään " "epäonnistuneeksi." #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "Epäonnistuessa, kokeile vaihtoehtoista NZB:tä" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" "Jotkin palvelimet tarjoavat vaihtoehtoisen NZB:n kun lataus epäonnistuu." #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Kansion uudelleennimeäminen käytössä" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Käyttää väliaikaisia nimiä kun jälkikäsittely on käynnissä. Poista käytöstä " "jos järjestelmäsi ei toimi oikein asetuksen ollessa päällä." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Esijonon käyttäjän skripti" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Käytetään ennen NZB lisäämistä jonoon." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Ylimääräiset PAR2 parametrit" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Nice muuttujat" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "IONice muuttujat" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Katkaise yhteys kun jono on tyhjä" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "" "Katkaise yhteys Usenet palvelimeen/palvelimiin kun jono on tyhjä tai tila on " "keskeytetty." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Järjestä iän mukaan" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Järjestelee kohteet (keskimääräisen) iän mukaan." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" "Lähetykset tauotetaan kunnes ne ovat vähintään näin vanhoja. Prioriteetin " "asettaminen pakottamiselle ohittaa asetetun viiveen." #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Tarkista uusi versio" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Tarkistaa viikottain uusimman SABnzbd version." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "Myös testiversiot" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Korvaa välilyönnit kansionimessä" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Korvaa välilyönnit alaviivoilla kansionimissä." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Korvaa pisteet kansionimessä" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Korvaa pisteet välilyönneillä kansionimissä." #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Windows yhteensopivuus" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "Palvelimille: varmistaa että nimet ovat Windows yhteensopivia." #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Käynnistä selain käynnistyksen yhteydessä" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Käynnistää oletusselaimen kun SABnzbd käynnistetään." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Keskeytä lataus jälkikäsittelyn ajaksi" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Keskeyttää lataamisen kun jälkikäsittely alkaa ja jatkaa lataamista kun se " "lopetetaan." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Ohita näytteet" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Ohittaa näytetiedostot (esim. videonäytteet)." #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Poista lataamisen jälkeen" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "HTTPS sertfikaatin varmennus" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" "Varmenna sertifikaatit yhdistettäessä indeksoijiin ja RSS-lähteisiin HTTPS " "protokollan avulla." #: sabnzbd/skintext.py msgid "Server" msgstr "Palvelin" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Jälkikäsittely" #: sabnzbd/skintext.py msgid "Naming" msgstr "Nimeäminen" #: sabnzbd/skintext.py msgid "Quota" msgstr "Latausrajoitus" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indeksoidaan" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Kuinka paljon voidaan ladata tässä kuussa (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Resetointipäivä" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "Minä päivänä kuusta tai viikosta (1=Maanantai) palveluntarjoajasi resetoi " "rajoituksen? (Voit syöttää kellonajan perään hh:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Jatka automaattisesti" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "Pitäisikö latauksia jatkaa kun latausrajoitus on resetoitu?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Latausrajoituksen pituus" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "Resetoidaanko rajoitus joka päivä, viikko vai kuukausi?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Tarkista ennen lataamista" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "Yritä ennustaa latauksen valmistuminen ennen lataamista (hitaampi!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "SSL-salaus" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "Lisää suorituskykyä pakottamalla alhaisempi SSL-suojaustaso." #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "Enimmäismäärä uudelleenyrityksille" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Enimmäismäärä uudelleenyrityksiä yksittäiselle palvelimelle." #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Peruuta lataukset jotka eivät voi valmistua" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Peruutetaan lataus, jos ladattaessa huomataan liikaa tiedostoja puuttuvan" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Suodatus päälle" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Latauksien toiminto suodatinsääntöjen mukaan." #: sabnzbd/skintext.py msgid "Abort If" msgstr "Peruuta jos" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Muutoin keskeytä jos" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Videon suosio" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Äänen suosio" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spämmi" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Vahvistettu" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Enemmän alapeukkuja kuin yläpeukkuja" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Nimen avainsanat" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Pilkulla erotettu lista" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "" "Hyödyllinen jos uutispalvelimella on enemmän kuin yksi IPv4/IPv6 osoite" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Lisää palvelin" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Palvelimen kuvaus" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Portti" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Käyttäjänimi" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Salasana" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Aikakatkaisu" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Säilytysaika" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "Sertifikaatin varmennus" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "Ei käytössä" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "Tiukka" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 on suurin prioriteetti, 99 on pienin prioriteetti" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Vaihtoehtoinen" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Ota käyttöön" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Poista palvelin" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Testaa palvelinta" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Nollaa laskurit" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Testataan pavelimen tietoja..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Kaista" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Lähetä ryhmä" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Lähettää ryhmäkomennon ennen artikkeleiden pyytämistä." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Henkilökohtaiset huomautukset" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Lisää ajastus" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Toisto" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Toiminto" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Parametrit" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Nykyiset ajastukset" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Valintaruutu syötteen nimen vieressä täytyy olla valittuna jotta syöte on " "päällä ja uusia kohteita tarkistetaan automaattisesti.
Kun syöte " "lisätään, siitä lisätään vain uusia kohteita eikä niitä jotka ovat jo " "julkaistu syötteessä ellet paina \"Pakota lataus\" -painiketta." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Lue syöte" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Pakota lataus" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Suodata" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Hyväksy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Hylkää" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Vaatii" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "VaadittuCat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Vähintään" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Enintään" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "Alkaen SxxExx" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Vastaa" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Ei vastaavuutta" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Ladattu" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Lue kaikki syötteet nyt" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Sähköposti-ilmoitus onnistuneesta latauksesta" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Ei koskaan" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Aina" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Vain virheet" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Levy täynnä ilmoitukset" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "Lähetä sähköposti kun levy on täynnä ja SABnzbd on keskeytetty." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Lähetä RSS ilmoitukset" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "Lähetä sähköpostia kun RSS syötteestä lisätään latauksia jonoon." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "SMTP-palvelin" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Sähköpostin lähtevän postin palvelimen osoite." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Sähköpostin vastaanottaja" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "Sähköpostiosoite johon viestit lähetetään." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "Sähköpostin lähettäjä" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Kuka näytetään viestin lähettäjänä?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "VAIHTOEHTOINEN tilin käyttäjänimi" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Kirjautumisen vaativalle sähköpostille, tilin käyttäjänimi." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "VAIHTOEHTOINEN tilin salasana" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Kirjautumisen vaativalle sähköpostille, tilin salasana." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Ilmoitus lähetetty!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Growl käytössä" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Käytä vain Growl etäpalvelimelle (isäntä:portti)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Palvelimen salasana" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Vaihtoehtoinen salasana Growl palvelimelle" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "NotifyOSD käytössä" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Ilmoituskeskus" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Windows-ilmoitukset käytössä" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Windows-ilmoitukset" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "IlmoitusOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Prowl ilmoitukset käytössä" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Vaatii Prowl-tilin" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "Prowl API avain" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Prowlin henkilökohtainen API avain (pakollinen)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Pushover ilmoitukset käytössä" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Vaatii Pushover tilin" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Ohjelman token" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Ohjelman token (pakollinen)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Käyttäjän avain" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Käyttäjän avain (pakollinen)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Laitteet" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Pushbullet ilmoitukset käytössä" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Vaatii Pushbullet tilin" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Henkilökohtainen API avain" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Henkilökohtainen Pushbullet API avain (pakollinen)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Laite" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Laite johon viesti lähetetään" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "Ilmoitusskripti" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "Ilmoitusskripti päällä" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "Suorittaa käyttäjän skriptin" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "Mikä skripti suoritetaan ilmoitukselle?" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" "Indeksoijat voivat tarjota kategorian NZB tiedoston sisällä jonka SABnzbd " "yrittää vastata johonkin esimääriteltyyn kategoriaan. Voit lisäksi lisätä " "sanoja \"Indeksoijan kategoriat / ryhmä\" -kohtaan vastaamaan useampia " "kategorioita. Käytä pilkkuja sanojen erottamiseen. Jokerimerkit ovat " "tuettuna.
Lisätietoja löytyy Wikistä." #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Polun päättäminen tähteen * estää latauskohtaisten kansioiden luomisen." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Suhteelliset kansiot jotka perustuvat" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Kansio/Polku" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "Indeksoijan kategoriat / ryhmä" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Sarjojen lajittelu" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "TV lajittelu käytössä" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Mallin avain" #: sabnzbd/skintext.py msgid "Clear" msgstr "Tyhjennä" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "Esiasetukset" #: sabnzbd/skintext.py msgid "Example" msgstr "Esimerkki" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Elokuvien lajittelu käytössä" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Pidä irralliset lataukset ylimääräisissä kansioissa" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Kategoriat joita koskee" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Merkitys" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Malli" #: sabnzbd/skintext.py msgid "Result" msgstr "Tulos" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Tuotantokausi kansio" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Tuotantokausi kansio" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Jakso kansio" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 Jakso kansio" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "" #: sabnzbd/skintext.py msgid "Title" msgstr "Nimi" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Elokuvan nimi" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Elokuvan.nimi" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Elokuvan_nimi" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Ohjelman nimi" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Ohjelman.nimi" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Ohjelman_nimi" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Tuotantokauden numero" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Jakson numero" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Jakson nimi" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Jakson.nimi" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Jakson_nimi" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Tiedostotunniste" #: sabnzbd/skintext.py msgid "Extension" msgstr "Tunniste" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Osan numero" #: sabnzbd/skintext.py msgid "Decade" msgstr "Vuosikymmen" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Alkuperäinen tiedostonimi" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Pienaakkoset" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEKSTI" #: sabnzbd/skintext.py msgid "text" msgstr "teksti" #: sabnzbd/skintext.py msgid "file" msgstr "tiedosto" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Lajittelumerkkijono" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Moniosainen selite" #: sabnzbd/skintext.py msgid "In folders" msgstr "Kansioissa" #: sabnzbd/skintext.py msgid "No folders" msgstr "Ei kansioita" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Päivämäärän lajittelu" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Päivämäärän lajittelu käytössä" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Ohjelman nimi kansio" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "Vuosittaiset-Kuukausittaiset kansiot" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Päivittäiset kansiot" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "kirjainkokoa säätävä" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Käsitellyt tulokset" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Harvoin käytetyt asetukset. Paina Ohje-painiketta Wiki-sivustolle " "päästäksesi, jotta saat tietää näiden tarkoituksen ja ohjeet " "käyttöön.
Älä muuta ennen Wikin lukemista, koska näiden muuttamisella voi " "olla vakavia sivuvaikutuksia.
Oletusarvot ovat kirjoitettuna sulkeiden " "sisään." #: sabnzbd/skintext.py msgid "Values" msgstr "Arvot" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "NZB tietojen muokkaus" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Poista" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Ylin" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Ylös" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Alas" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Alin" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Kaikki" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Käänteinen" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Tiedostonimi" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Otsikko" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Valinta" #: sabnzbd/skintext.py msgid "left" msgstr "jäljellä" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Vapaa tila" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Väliaikaiskansio" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Monioperaatiot" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Paina vaihto-näppäintä pohjassa valitaksesi alueen" #: sabnzbd/skintext.py msgid "Check all" msgstr "Valitse kaikki" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Uudelleenkäynnistä SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Tilan ja käyttöliittymän asetukset" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Tai vedä ja pudota tiedostot tähän ikkunaan!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Menetettiin yhteys SABnzbd:hen..." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Päivitysväli" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Käytä yleisiä käyttöliittymän asetuksia" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Jonon pituusrajoitus" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Historian pituusrajoitus" #: sabnzbd/skintext.py msgid "Date format" msgstr "Päivämäärän muoto" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Ylimääräisen jonon sarake" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "Ylimääräinen historiasarake" #: sabnzbd/skintext.py msgid "page" msgstr "sivu" #: sabnzbd/skintext.py msgid "Loading" msgstr "Ladataan" #: sabnzbd/skintext.py msgid "articles" msgstr "artikkeleita" #: sabnzbd/skintext.py msgid "Rename" msgstr "Uudelleennimeä" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Jonon korjaus" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Näytä aktiiviset yhteydet" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Orvot lataukset" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Lähetä takaisin jonoon" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Poista kaikki" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Yritä uudelleen kaikki" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Nouda NZB osoitteesta" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "Lähetä NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Vaihtoehtoisesti anna tiedostonimi" #: sabnzbd/skintext.py msgid "Submit" msgstr "Lähetä" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Avaa tietoja sisältävä osoite" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Lähetetty. Kiitos!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Ei mitään valittuna!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Poista kaikki valitut tiedostot" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Piilota/näytä valmistuneet tiedostot" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Näytä skriptien loki" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Päivitys saatavilla!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" "LocalStorage (evästeet) on pois käytöstä selaimen asetuksista. " "Käyttöliittymän asetukset menetetään kun selain suljetaan!" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" "Glitter-teemassa on muutamia (uusia) ominaisuuksia joista saatat pitää!" #: sabnzbd/skintext.py msgid "Custom" msgstr "Mukautettu" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "Tiivis käyttöliittymä" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "Välilehditetty käyttöliittymä
(erillinen jono ja historia)" #: sabnzbd/skintext.py msgid "Speed" msgstr "Nopeus" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Varmista jonon poistot" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Varmista historian poistot" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Kuinka pitkään tai mihin asti haluat keskeyttää? (englanniksi!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Valitettavasti emme ymmärtäneet tuota. Yritä uudelleen." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Keskeytä ajaksi..." #: 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 Oldest→Newest" msgstr "Järjestä iän mukaan Vanhin→Uusin" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Järjestä iän mukaan Uusin→Vanhin" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Järjestä nimen mukaan A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Järjestä nimen mukaan Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Järjestä koon mukaan Pienin→Suurin" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Järjestä koon mukaan Suurin→Pienin" #: sabnzbd/skintext.py msgid "Uploading" msgstr "Lähetetään" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "Pakotetaan yhteyden katkaisu" #: sabnzbd/skintext.py msgid "Removing job" msgstr "Poistetaan lataus" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "Poistetaan lataukset" #: sabnzbd/skintext.py msgid "Prev" msgstr "Edellinen" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Seuraava" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "Puhdistetaanko historia?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Ota JavaScript käyttöön, jotta Plush toimii oikein!" #: sabnzbd/skintext.py msgid "Options" msgstr "Asetukset" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Keskeytetään kuinka moneksi minuutiksi?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Päävalikko" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Valmistuessa" #: sabnzbd/skintext.py msgid "Sort" msgstr "Lajittele" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Järjestä iän mukaan(Vanhin→Uusin)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Järjestä iän mukaan(Uusin→Vanhin)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Järjestä nimen mukaan (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Järjestä nimen mukaan (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Järjestä koon mukaan (Pienin→Suurin)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Järjestä koon mukaan (Suurin→Pienin)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "Puhdistetaanko jono?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Yritetäänkö uudelleen kaikki epäonnistuneet lataukset Historiassa?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Puhdista" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Enimmäisnopeus" #: sabnzbd/skintext.py msgid "Range" msgstr "Väli" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Käytä valittuihin" #: sabnzbd/skintext.py msgid "Everything" msgstr "Kaikki" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Päivitysväli" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Säiliön leveys" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Tämä estää sisällön päivittämisen kun hiiren kursori on jonon päällä." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Estä päivitykset kun hiiri on päällä" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Lähetä" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Lähetä: .nzb .rar .zip .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Edistyminen" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Ei tarpeeksi levytilaa latauksien valmistumiseen!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Vapaana (Temp)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "EI TÖITÄ" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Lataukset" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "SABnzbd pika-aloitus velho" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "SABnzbd versio" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Edellinen" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Palvelimen tiedot" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Syötä pääasiallisen usenet tarjoajasi tiedot." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Tarjoajasi sallimien yhteyksien lukumäärä." #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "Esim. 8 tai 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Valitse vain jos tarjoajasi sallii SSL yhteydet." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Klikkaa testataksesi syötettyjä tietoja." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Esim." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "Asennus on nyt valmis!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd on nyt käynnissä taustalla." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "Selaimen tai sen välilehtien sulkeminen EI sammuta SABnzbd:tä." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "On suositeltavaa, että painat linkistä hiiren oikealla ja lisäät sen " "kirjanmerkkeihin. Sitten voit käyttää kirjanmerkkiä kun haluat käyttää " "SABnzbd ohjelmaa sen ollessa käynnissä taustalla." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Lisää ohjeita löytyy" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "Siirry SABnzbd:hen" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "Poistu SABnzbd:stä" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Käynnistä velho" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd ohjelmalla EI OLE MINKÄÄNLAISTA TAKUUTA.\n" "Tämä on ilmainen ohjelma ja olet vapaa levittämään sitä tiettyjen ehtojen " "ollessa voimassa.\n" "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] msgid "Error getting TV info (%s)" msgstr "Virhe noudettaessa TV tietoja (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "Virhe uudelleennimettäessä: %s %s" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "Samankaltaisen tiedoston uudelleennimeäminen epäonnistui: %s %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Luvaton käyttö" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "Tiedostoa ei ole palvelimella" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "OSOITTEENNOUTAJA KAATUI" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "NZB tiedostoa ei voida käyttää" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "Osoitteen nouto epäonnistui; %s" #~ msgid "_yenc module... NOT found!" #~ msgstr "_yenc moduulia... EI löydy!" #~ 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" #~ msgid "Initiating restart...
" #~ msgstr "Aloitetaan uudelleenkäynnistys...
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "PAR2 ohjelmaa ei löydy, korjaukset eivät ole mahdollista
" #~ msgid "Not matched" #~ msgstr "Ei vastaa" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "" #~ "Töitä jotka ovat merkitty '*' merkillä ei ladata automaattisesti uudelleen." #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "Työ \"%s\" lisättiin uudelleen jonoon" #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Erikoiskansioiden rekisteriavainten lukeminen epäonnistui" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Ei voida yhdistää rekisteripolkuun HKEY_CURRENT_USER." #~ msgid "Downloaded so far" #~ msgstr "Ladattu tähän mennessä" #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Ei voida avata rekisteriavainta \"%s\"." #~ msgid "Try again" #~ msgstr "Yritä uudelleen" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "" #~ "pyopenssl moduuli puuttuu, ole hyvä ja asenna se https käyttöä varten" #~ msgid "Unpacking failed, these file(s) are missing:" #~ msgstr "Purkaminen epäonnistui, nämä tiedostot puuttuvat:" #~ msgid "Unpacking failed, see log" #~ msgstr "Purkaminen epäonnistui, katso loki" #~ msgid "ERROR: %s" #~ msgstr "VIRHE: %s" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "Purkaminen epäonnistui, odotettua tiedostoa ei purettu" #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "Odotettu tiedosto: %s puuttuu => purkuvirhe?" #~ msgid "Error importing OpenSSL module. Connecting with NON-SSL" #~ msgstr "Virhe tuotaessa OpenSSL moduulia. Yhdistetään EI-SSL kautta." #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Käyttämäsi UNRAR versio ei ole suositeltu, nouda oikea osoitteesta " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "Invalid par2 files, cannot verify or repair" #~ msgstr "Virheelliset par2 arkistot, varmennus ja korjaus ei mahdollista" #~ msgid "File %s is empty, skipping" #~ msgstr "Tiedosto %s on tyhjä, ohitetaan" #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "" #~ "On todennäköistä, että käytössäsi on ZoneAlarm ja käyttöjärjestelmäsi on " #~ "Vista.
" #~ msgid "OK" #~ msgstr "OK" #~ msgid "You have no permisson to use port %s" #~ msgstr "Sinulla ei ole käyttöoikeuksia porttiin %s" #~ msgid "Error removing workdir (%s)" #~ msgstr "Virhe poistettaessa työkansiota (%s)" #~ msgid "Get NZB" #~ msgstr "Nouda NZB" #~ msgid "KB/s" #~ msgstr "kt/s" #~ msgid "Queued" #~ msgstr "Jonossa" #~ msgid "Complete Dir" #~ msgstr "Valmistuneet-kansio" #~ msgid "WARNINGS" #~ msgstr "VAROITUKSET" #~ msgid "Download speed" #~ msgstr "Latausnopeus" #~ msgid " " #~ msgstr " " #~ msgid " or Report ID" #~ msgstr " tai Raportti ID" #~ msgid "Sort by age" #~ msgstr "Lajittele iän mukaan" #~ msgid "Sort by name" #~ msgstr "Lajittele nimen mukaan" #~ msgid "Sort by size" #~ msgstr "Lajittele koon mukaan" #~ msgid "Hide files" #~ msgstr "Piilota tiedostot" #~ msgid "Show files" #~ msgstr "Näytä tiedostot" #~ 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
" #~ msgstr "" #~ "UNRAR ohjelmaa ei löydy, RAR-tiedostojen purkaminen ei ole mahdollista
" #~ msgid "No email templates found" #~ msgstr "Sähköpostipohjia ei löydy" #~ msgid "Error: No secondary interface defined." #~ msgstr "Virhe: Toissijaista käyttöliittymää ei ole määritelty." #~ msgid "Invalid encoding of email template %s" #~ msgstr "Virheellinen koodaus sähköpostipohjassa %s" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd ei ole yhteensopiva kaikkien ohjelmistopalomuurien kanssa.
\n" #~ " %s
\n" #~ " Pahoittelumme, mutta emme voi ratkaista tätä yhteensopivuusongelmaa " #~ "juuri nyt.
\n" #~ " Ole hyvä ja lähetä valitus palomuurin toimittajallesi.
\n" #~ "
\n" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd tarvitsee vapaan tcp/ip portin sisäiselle web-" #~ "palvelimelleen.
\n" #~ " Porttia %s kohteessa %s yritettiin käyttää , mutta tilillä jolla SABnzbd " #~ "käynnistettiin ei ollut oikeuksia käyttää sitä.
\n" #~ " OSX ja Linux järjestelmissä normaalien käyttäjien tulee käyttää portteja " #~ "jotka ovat suurempia kuin 1023.
\n" #~ "
\n" #~ " Ole hyvä ja uudelleenkäynnistä SABnzbd toisella porttinumerolla." #~ msgid "No post-processing because of failed verification" #~ msgstr "Jälkikäsittelyä ei suoritettu, koska varmennus epäonnistui" #~ msgid "Add new downloads" #~ msgstr "Lisää uusia latauksia" #~ msgid "Purge Failed History" #~ msgstr "Tyhjennä epäonnistuneiden historia" #~ msgid "View script output" #~ msgstr "Näytä skriptin tuloste" #~ msgid "History Size" #~ msgstr "Historian koko" #~ msgid "Show Weblogging" #~ msgstr "Näytä webloki" #~ msgid "Secondary Web Interface" #~ msgstr "Toissijainen web-käyttöliittymä" #~ msgid "Activate an alternative skin." #~ msgstr "Aktivoi toissijainen teema." #~ msgid "HTTPS Support" #~ msgstr "HTTPS-tuki" #~ msgid "Queue auto refresh interval:" #~ msgstr "Jonon automaattinen päivitysväli:" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "Jonon päivitysväli web-käyttöliittymässä(sek, 0= ei päivitä)." #~ msgid "Do not require the API key." #~ msgstr "Älä vaadi API avainta." #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "KÄYTÄ OMALLA VASTUULLA!" #~ msgid "Step One" #~ msgstr "Vaihe yksi" #~ msgid "Step Two" #~ msgstr "Vaihe kaksi" #~ msgid "Step Three" #~ msgstr "Vaihe kolme" #~ msgid "Step Four" #~ msgstr "Vaihe neljä" #~ msgid "Step Five" #~ msgstr "Vaihe viisi" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "Esim. 119 tai 563 SSL yhteyksille" #~ msgid "Please enter a whole number." #~ msgstr "Syötä kokonaisluku." #~ msgid "This field is required." #~ msgstr "Tämä kenttä on pakollinen." #~ msgid "Misc" #~ msgstr "Muut" #~ msgid "Access" #~ msgstr "Pääsy" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Aktivoi HTTPS pääsy SABnzbd-ohjelmaan." #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Tahdon, että SABnzbd on käytettävissä vain omalta PC:ltäni." #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "" #~ "Tahdon, että SABnzbd on käytettävissä jokaiselta verkossani olevalta PC:ltä." #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "Käynnistä internet selaimeni SABnzbd-sivulle kun ohjelma käynnistyy." #~ msgid "General configuration" #~ msgstr "Yleisasetukset" #~ msgid "Email Test Result" #~ msgstr "Sähköpostitestin tulokset" #~ msgid "Web server authentication" #~ msgstr "Web-palvelimen todennus" #~ msgid "QR Code" #~ msgstr "QR-koodi" #~ msgid "Folder configuration" #~ msgstr "Kansion asetukset" #~ msgid "Switches configuration" #~ msgstr "Parametrien asetukset" #~ msgid "Processing Switches" #~ msgstr "Käsittelyparametrit" #~ msgid "Edit" #~ msgstr "Muokkaa" #~ msgid "Timeleft" #~ msgstr "Aikaa jäljellä" #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Suojaa SABnzbd käyttö salasanalla (suositeltavaa)" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "" #~ "Yhdistää tiedostot jotka päättyvät .001.ts,.002.ts jne. yhdeksi tiedostoksi." #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "" #~ "Yhdistää tiedostot jotka päättyvät .001,.002 jne. yhdeksi tiedostoksi." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Huomioi yEnc CRC virheet" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Puhdistaa par tiedostot (jos varmennus/korjaus onnistui)." #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "" #~ "Jos artikkelissa on CRC virhe, yritetään hakea se toiselta palvelimelta." #~ msgid "Default Priority" #~ msgstr "Oletusprioriteetti" #~ msgid "Default Post-Processing" #~ msgstr "Oletus jälkikäsittely" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "" #~ "Käytetään kun mitään jälkikäsittelyä ei ole määriteltynä kategorialle." #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Korvaa kielletyt merkit kansionimissä" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "Korvaa kielletyt merkit kansionimissä vastaavalla merkillä (jos ei " #~ "vastaavaa, poistaa)." #~ msgid "Do not download" #~ msgstr "Älä lataa" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "Käytä 12-tuntista kelloa (AM/PM)" #~ msgid "SSL type" #~ msgstr "SSL tyyppi" #~ msgid "Server configuration" #~ msgstr "Palvelinasetukset" #~ msgid "Check result of unpacking" #~ msgstr "Tarkista purkamisen lopputulos" #~ msgid "Scheduling configuration" #~ msgstr "Ajastimen asetukset" #~ msgid "Click below to test." #~ msgstr "Klikkaa alapuolelta testataksesi." #~ msgid "Remove" #~ msgstr "Poista" #~ msgid "RSS Configuration" #~ msgstr "RSS asetukset" #~ msgid "Add Feed" #~ msgstr "Lisää syöte" #~ msgid "Skip" #~ msgstr "Ohita" #~ msgid "Delete Feed" #~ msgstr "Poista syöte" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Näyttää ajat AM/PM muodossa (ei vaikuta ajastuksiin)" #~ msgid "Feeds" #~ msgstr "Syötteet" #~ msgid "Settings" #~ msgstr "Asetukset" #~ msgid "Email Options" #~ msgstr "Sähköpostiasetukset" #~ msgid "Filters" #~ msgstr "Suodattimet" #~ msgid "Email Account Settings" #~ msgstr "Sähköpostitilin asetukset" #~ msgid "Thread" #~ msgstr "Ketju" #~ msgid "Other Switches" #~ msgstr "Muut valinnat" #~ msgid "Only for optional servers" #~ msgstr "Vain valinnaisille palvelimille" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Käytä uudelleenyritysten määrää vain valinnaisille palvelimille" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "Käytä V23 ellei tarjoajasi vaadi toisin!" #~ msgid "Backup server" #~ msgstr "Varapalvelin" #~ msgid "Server definition" #~ msgstr "Palvelimen tyyppi" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Jälkikäsittelyskriptien kansio" #~ msgid "Folder containing user scripts for post-processing." #~ 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 "Are you sure you want to restart SABnzbd?" #~ msgstr "Oletko varma, että haluat käynnistää SABnzbd uudelleen?" #~ msgid "Email Sent!" #~ msgstr "Sähköposti lähetetty!" #~ msgid "Saved" #~ msgstr "Tallennettu" #~ msgid "Showing one result" #~ msgstr "Näytetään yksi tulos" #~ msgid "No results" #~ msgstr "Ei tuloksia" #~ msgid "Links" #~ msgstr "Linkit" #~ msgid "Hour:Min" #~ msgstr "Tunti:Min" #~ msgid "Delete the all failed items from the history?" #~ msgstr "Poistetaanko kaikki epäonnistuneet historiasta?" #~ msgid "Delete Completed" #~ msgstr "Poista valmistuneet" #~ msgid "Delete Failed" #~ msgstr "Poista epäonnistuneet" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Näytetään %s - %s tulosta %s tuloksesta" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Lähetä: .nzb .rar .zip .gz" #~ msgid "Left" #~ msgstr "Jäljellä" #~ msgid "Pause for 12 hours" #~ msgstr "Keskeytä 12:ksi tunniksi" #~ msgid "Pause for 24 hours" #~ msgstr "Keskeytä 24:ksi tunniksi" #~ msgid "Close" #~ msgstr "Sulje" #~ msgid "Last" #~ msgstr "Viimeinen" #~ msgid "First" #~ msgstr "Ensimmäinen" #~ msgid "Page" #~ msgstr "Sivu" #~ msgid "Are you sure you want to delete" #~ msgstr "Oletko varma, että haluat poistaa" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Lähetä ilmoitukset NotifyOSD:hen" #~ msgid "Send notifications to Growl" #~ msgstr "Lähetä ilmoitukset Growliin" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "Ei voitu poistaa nzo:ta jälkikäsittelyn jonosta (id)" #~ msgid "User-defined categories" #~ msgstr "Käyttäjän määrittämät kategoriat" #~ msgid "Set Pause Interval" #~ msgstr "Aseta keskeytysväli" #~ msgid "Open Source URL" #~ msgstr "Avaa lähdeosoite" #~ msgid "Storage" #~ msgstr "Tallennusasema" #~ msgid "Pause Interval" #~ msgstr "Keskeytysväli" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Kun SABnzbd on käynnistynyt uudelleen, voit käyttää sitä seuraavasta " #~ "osoitteesta: %s" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Lue syöte hakee vain syötteen uuden sisällön. " #~ "Pakota lataus hakee kaikki vastaavat NZB:t heti." #~ msgid "New Feed URL" #~ msgstr "Uuden syötteen osoite" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Käytetään kun mitään prioriteettiä ei ole määritettynä kategorialle." #~ msgid "Defines post-processing and storage." #~ msgstr "Määrittää jälkikäsittelyn ja tallennuksen." #~ msgid "Sorting configuration" #~ msgstr "Lajittelun asetukset" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Ottaa jaksojen lajittelun ja uudelleennimeämisen käyttöön." #~ msgid "Generic Sorting" #~ msgstr "Yleinen lajittelu" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Ottaa yleisen lajittelun ja uudelleennimeämisen käyttöön." #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "Ota käyttöön jos latauksia ei ole laitettu omiin kansioihinsa." #~ msgid "Plush Options" #~ msgstr "Plush asetukset" #~ msgid "Enable sorting and renaming of date named files." #~ msgstr "" #~ "Ottaa päivämäärän mukaan nimettyjen tiedostojen lajittelun ja " #~ "uudelleennimeämisen käyttöön." #~ msgid "Enable Filejoin" #~ msgstr "Tiedostojen yhdistäminen käytössä" #~ msgid "Enable built-in unzip functionality." #~ msgstr "Ottaa käyttöön sisäänrakennetun unzip toiminnon." #~ msgid "Enable built-in unrar functionality." #~ msgstr "Ottaa käyttöön sisäänrakennetun unrar toiminnon." #~ msgid "Enable Unrar" #~ msgstr "Unrar käytössä" #~ msgid "Enable Quick Check" #~ msgstr "Pikatarkistus käytössä" #~ msgid "Enable MultiCore Par2" #~ msgstr "Moniydin Par2 käytössä" #~ msgid "Enable TS Joining" #~ msgstr "TS-tiedostojen yhdistäminen käytössä" #~ msgid "Enable Par Cleanup" #~ msgstr "Par puhdistus käytössä" #~ msgid "Used when no user script is defined by the category." #~ msgstr "" #~ "Käytetään kun mitään käyttäjän skriptiä ei ole määritettynä kategorialle." #~ msgid "Default User Script" #~ msgstr "Käyttäjän oletusskripti" #~ msgid "Notification classes" #~ msgstr "Ilmoituksien luokat" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "" #~ "Ottaa luokat käyttöön viesteille joita raportoidaan (ei mitään, yksi tai " #~ "monta)" #~ msgid "Send notifications to Notification Center" #~ msgstr "Lähetä ilmoitukset ilmoituskeskukseen" #~ msgid "Show Edit Options" #~ msgstr "Näytä muokkausvalinnat" #~ msgid "Hide Edit Options" #~ msgstr "Piilota muokkausvalinnat" #~ msgid "Toggle Add NZB" #~ msgstr "Päälle/Pois Lisää NZB" #~ msgid "DualView1" #~ msgstr "Kaksoisnäkymä1" #~ msgid "DualView2" #~ msgstr "Kaksoisnäkymä2" #~ msgid "Groups / Indexer tags" #~ msgstr "Ryhmien / Indeksoijan tunnisteet" #~ msgid "Delete all failed items from History?" #~ msgstr "Poistetaanko kaikki epäonnistuneet kohteet historiasta?" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Tarkistaa purkamisen lopputulokset (täytyy olla pois päältä joissain " #~ "tiedostojärjestelmissä)." #~ msgid "Disable API-key" #~ msgstr "Poista käytöstä API avain" #~ msgid "Site API Key" #~ msgstr "Sivuston API avain" #~ msgid "Automatic Feedback" #~ msgstr "Automaattinen palaute" #~ msgid "Enable OZnzb Integration" #~ msgstr "OZnzb integraatio käytössä" #~ msgid "OZnzb" #~ msgstr "OZnzb" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "" #~ "Lähetä automaattisesti laskettu latauksen vahvistustulos indeksoijalle." #~ msgid "Refer to https://www.oznzb.com/profile" #~ msgstr "Tarkista osoitteesta https://www.oznzb.com/profile" #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Lisää enemmän toimintoja, kuten arvostelut ja lisätiedot jotka saadaan kun " #~ "yhdistetään OZnzb indeksointiin." #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Tämän avaimen avulla indeksoija tietää kuka olet. Tarkista avain osoitteesta " #~ "https://www.oznzb.com/profile." #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "VAROITUS: Keskeytetty lataus \"%s\" salatun RAR tiedoston vuoksi" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "VAROITUS: Peruutettiin lataus \"%s\" salatun RAR arkiston vuoksi" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Ohita par2 tarkistus kun tiedostot ovat 100% ladattuja." sabnzbd-develop/po/main/ro.po0000600000175000017500000043314413642116632014270 0ustar jpjp# Romanian translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2018-02-14 14:18+0000\n" "Last-Translator: Safihre \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:03+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Pornirea interfeţei-web nereuşită" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "Nu se poate găsi şablon web:%s, se încearcă şablon standard" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "binar par2 ... Negăsit!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "Versiunea ta de UNRAR este %s, noi recomandăm versiunea %s sau mai mare.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "binar unrar... Negăsit!" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "binar unzip... Negăsit!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "FiÅŸier executabil 7za ... Indisponibil!" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Vă rugăm să fiÅ£i conÅŸtienÅ£i că numele gazdei 0.0.0.0 va avea nevoie de o " "adresa IPv6 pentru acces extern" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "Porturile HTTP È™i HTTPS nu pot fi aceleaÈ™i" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "Dezactivează HTTPS din cauza lipsei fiÅŸierelor CERT ÅŸi KEY" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Nu am putu porni interfaÈ›a web: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "Nu pot contacta serviciul SABHelper" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s pornit" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Avertisment" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Eroare" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "ÃŽnchidere SABnzbd terminată" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Numele gazdei nu este setat." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "" "Nu sunt conexiuni stabilite. Vă rugăm să stabiliÅ£i cel puÅ£in o conexiune." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Parolă ascunsă în ******, Vă rugăm să re-introduceÅ£i" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Detalii server invalide" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "" "A depăşit timpul alocat : ÃŽncercaÅ£i să activaÅ£i SSL sau conectarea pe un " "port diferit." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "A depăşit timpul alocat" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Adresă server invalidă" #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Serverul a renunÅ£at în timpul logării." #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Serverul necesită nume utilizator ÅŸi parolă" #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Conexiune ReuÅŸită!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Autentificare nereuÅŸită, verifică nume utilizator/parolă." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "Prea multe conexiuni, vă rugăm să întrerupeÅ£i descărcarea sau să încercaÅ£i " "din nou mai târziu" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Nu pot determina reultatul conexiunii (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Semnal %s prins, salvez ÅŸi ies..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Eroare fatală la salvare" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "ÃŽncerc să descarc NZB de la %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Salvarea %s nereuÅŸită" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Nu pot crea fiÅŸier temporar pentru %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "ÃŽncerc să setez starea unui server nexistent %s" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Eroare în tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "ÃŽncărcarea %s nereuÅŸită" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "Email reuÅŸit" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Notificări Test" #: sabnzbd/api.py msgid " Resolving address" msgstr " Reolvare adresă" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Implicit" #: sabnzbd/api.py msgid "unknown" msgstr "necunoscut" #: sabnzbd/api.py [Error message] 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ă" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Eroare disc la crearea fiÅŸierului %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Eroare fatală în Assembler" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Terminat, encriptare detectată" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "ATENÈšIE: ÃŽn fiÈ™ierul RAR \"%s\" sunt extensii nedorite. FiÈ™ierul nedorit " "este %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "Extensii fiÈ™ier nedorite în fiÈ™ierul rar %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Oprit, extensii nedorite detectate" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "ATENÈšIE: Sarcina \"%s\" întrearuptă datorită ratingului (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "ATENÈšIE: Sarcina \"%s\" anulată datorită ratingului (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Abandonat, filtru de rating potrivit (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s lipsă" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "video" #: sabnzbd/assembler.py msgid "audio" msgstr "audio" #: sabnzbd/assembler.py msgid "spam" msgstr "spam" #: sabnzbd/assembler.py msgid "passworded" msgstr "parolat" #: sabnzbd/assembler.py msgid "downvoted" msgstr "vot negativ" #: sabnzbd/assembler.py msgid "keywords" msgstr "cuvinte cheie" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Cotă epuizată, întrerupem descărcarea" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s nu este o adresă email validă" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Adresă server necesară" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Nu pot crea %s dosar %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Nu pot scrie în fiÅŸierul INI %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Nu pot crea copie de rezervă pentru %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Parolă %s codificată greÅŸit" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s nu este o valoare octală corectă" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "cale UNC \"%s\" nu este premisă aici" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Eroare: Lungimea cale ar trebuie să fie sub %s." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Eroare: Coada nu este goală, nu pot schimba dosar." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" "Nu pot scrie în baza de date ISTORIC, verificaÅ£i permisiunile de acces." #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "Bază de date Istoric coruptă, creat un nou fiÅŸier gol" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "Comandă 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" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Jurnal istoric stagii invalid pentru %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Decodarea %s nereuÅŸită" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Articoul yEnc invalid în %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Eroare Necunoscută în timpul decodării %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => lipsă de pe toate serverele, ignorare" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Finalizat" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "Dezarhivat %s fiÅŸierele/dosarele în %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [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] msgid "Error while adding %s, removing" msgstr "Eroare adăugare %s, ÅŸtergem" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Eroare ÅŸtergere %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Nu pot citi Dosar Urnărire %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Reluare" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "ÃŽntrerupt" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Trebuie să seta-Å£i lățimea de bandă maximă înainte de a seta o limită de " "viteză." #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Nu mă pot conecta la serverul %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Numele de server nu se rezolvă la DNS" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Serverul %s va fi ignorat pentru %s minute" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Nu am putu iniÈ›ializa %s@%s din cauza următorului motiv: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "Prea multe conexiuni la serverul %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Partajare cont probabilă" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Autentificare nereuÅŸită la serverul %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Conectare %s@%s eÈ™uată, mesaj=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Serverul %s necesită utilizator/parolă" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Eroare suspectă în sistemul de descprcare" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "ÃŽnchidere" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Conectare server mail nereuÅŸită" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "IniÅ£ializare conexiune TLS nereuÅŸită" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "Serverul nu a răspuns în mod corect la cererea de iniÈ›iere" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Autentificare server mail nereuÅŸită" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Nu am găsit nici o metodă potrivită de autentificare" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Eroare necusnoscută la autentificarea la serverul de mail" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Trimitere email nereuÅŸiă" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "ÃŽnchidere conexiune mail nereuÅŸită" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Destinatar necunoscut, niciun email trimis" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "From: %s\n" "To: %s\n" "Date: %s\n" "Subject: SABnzbd raporteaza Disc Plin\n" "\n" "Salut,\n" "\n" "SABnzbd sa oprit din descarcare, deoarece discul este aproape plin.\n" "Va rugam sa faceti loc si reluati SABnzbd manual.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Nu pot crea dosarul %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "dosarul %s: eroare accesare %s" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Nu pot schimba permisiunile lui %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Facere nereuÅŸită (%s)" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Mutare %s în %s nereuÅŸită" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "Utilizatorul s-a autentificat în interfaÈ›a web" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "Utilizator logat" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Cheie Sesiune lipsă" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Eroare: Cheie Sesiune Necesară" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Eroare: Cheie Sesiune Incorectă" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "Cheie API lipsă, vă rugăm să introduceÅ£i cheia api de la Configurare-" ">General în programul dumneavoastră terÅ£" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "Cheie API incorectă, FolosiÅ£i cheia api din Configurare->General în " "programul dumneavoastră terÅ£:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Autentificare lipsă, vă rugăm să introduceÅ£i numele de utilizator/parola de " "la Configurare->General în programul dumneavoastră terÅ£:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "ÃŽncearcă noua noastră interfață Glitter! Un design nou È™i optimizat pentru " "modul desktop È™i dispozitive mobile . Dute în Configurare -> General È™i " "modifică tipul de interfață." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
Închidere SABnzbd terminată.
Aşteptaţi timp de aproximativ 5 " "secunde şi apoi faceţi clic pe butonul de mai jos.

Reîmprospătează
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Atenţie:LOCALHOST este ambiguu, folosiţi o adresă IP numerică" #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "Adresa server \"%s:%s\" nu este validă" #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Flux" #: sabnzbd/interface.py msgid "Daily" msgstr "Zilnic" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "Luni" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Marţi" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Miercuri" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Joi" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Vineri" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Sâmbătă" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Duminică" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "dezactivat" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Server nedefinit!" #: 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 msgid "Back" msgstr "Înapoi" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "EROARE:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Valoare incorectă pentru %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "d" #: sabnzbd/misc.py msgid "h" msgstr "h" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Eroare la crearea cheiei şi certificatlui SSL" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Rulare script" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Post-Procesarea a fost abandonată (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Script" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Numărul de arhive încorporate este prea mare [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Unim" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Secvenţă incompletă de unire fişiere" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Unirea fişierului %s nereuşită" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Eroare \"%s\" în timpul unirii fişierelor" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Eroare \"%s\" în timpul file_join a %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] Unit %s fişierele" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Dezarhivare nereuşită, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Eroare \"%s\" în timpul dezarhivării fişierelor RAR" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Eroare \"%s\" în timpul rar_unpack a %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Ştergere %s nereuşită!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Încerc unrar cu parola \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Dezarhivare nereuşită, arhiva necesită o parolă" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Dezarhivare" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Dezarhivează" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Dezarhivare nereuşită, nu pot găsi %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "EROARE: nu pot găsi \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Dezarhivare nereuşită, eroare CRC" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "EROARE: CRC nereuşit în \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "Dezarhivare nereuşită, eroare scriere sau disc plin?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "EROARE: eroare scriere (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Dezarhivare eșuată, calea este prea lungă" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "EROARE: calea este prea lungă (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Fișier RAR ce poate fi folosit" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s fişiere în %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Eroare \"%s\" în timpul rulării unzip() pe %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Încerc 7zip cu parola \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "Setul 7ZIP \"%s\" este incomplet, nu pot dezarhiva" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Nu pot dezarahiva %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Verificare Rapidă" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Repară" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Verficare Rapidă OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Pornire Reparare" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Reparare nereuşită, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Eroare %s în timpul rulării par2_repair pe setul %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Eroare \"%s\" în timpul rulării par2_repair pe setul %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2 a primit opţiuni incorecte, verifică setările Configurare-" ">Comutatoare" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Verificat în %s, toate fişierele sunt corecte" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Verificat în %s, reparare necesară" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Descărcare %s blocuri..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Descărcare" #: 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 msgid "Repairing" msgstr "Se repară" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Reparat în %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Disc plin" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Se verifică" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Se verifică" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Acest server nu permite SSL pe acest port" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Pornire/Închidere" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "NZB-uri Adăugate" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Post-procesare pornită" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Sarcină terminată" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Sarcină eșuată" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Coadă finalizată" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Alte Mesaje" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "Indisponibil" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Nu am putu trimite mesajul Prowl" #: sabnzbd/notifier.py [Error message] 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] msgid "Failed to send pushover message" msgstr "Nu am putut trimite mesajul de pushover" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Răspuns greșit de la Pushbullet (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Nu am putu trimite mesajul pushbullet" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "" "Scriptul a returnat codul de ieșire %s și rezultatele următoare \"%s\"" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "Scriptul de notificare \"%s\" nu există" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "Nu am putut trimite notificări în Fereastră" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Importare %s a fişierelor de la %s nereuşită" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Fişier coadă găsit incompatibil, nu pot înainta" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Eroare încărcare %s, fişier corupt detectat" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB adăugat în coadă" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Codificare Necunoscută" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Fişier NZB incomplet %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Fişier NZB invalid %s, ignorăm (motiv=%s, line=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Fişier NZB gol %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Ignorăm duplicat NZB \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Întrerupem duplicat NZB \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Anulat nu poate fi finalizat" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DUPLICAT" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "ENCRIPTAT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "PREA MARE" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "INCOMPLET" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "NEDORIT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "FLTRAT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "AŞTEAPTĂ %s sec" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "SE PROPAGHEAZĂ %s min" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Descărcat în %s cu o medie de %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Vârsta" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s articolele au fost incorecte" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s articolele au fost lipsă" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s articolele au avut duplicate diferite" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "Articolele %s au fost eliminate" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Eroare importare %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Atenționări" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Inactiv" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Configurare" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Coadă" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Goleşte Coadă" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Istoric" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Şterge Istoricul" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Limitare de Viteză" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Pauză" #: sabnzbd/osxmenu.py msgid "min." msgstr "min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Reia" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Scanează dosar urmărire" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Citește toate feed-urile RSS" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Dosar Complet" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Dosar Incomplet" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Depanare" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Repornește" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Reporneşte fără autorizare" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Ieșire" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Pune la Coadă Primele 10 Obiecte" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Gol" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Istoric Ultimele 10 Obiecte" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Versiune nouă disponibilă" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Dute la vrăjitor" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Se oprește..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Problemă cu" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd are nevoie de un tcp/ip port liber pentru serverul său " "intern.
\n" " Portul %s de pe %s a fost încercat , dar nu este disponibil.
\n" " Alt program foloseÅŸte portul sau SABnzbd este deja pornit.
\n" "
\n" " Vă rugăm să reporniţi SABnzbd cu un număr de port diferit." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "" "Dacă primiţi acest mesaj de eroare din nou, vă rugăm să încercaţi un alt " "număr.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd are nevoie de o adresă gazdă validă pentru serverul său " "intern.
\n" " Dvs. a-ţi specificat o adresă invalidă.
\n" " Valori sigure sunt localhost ÅŸi 0.0.0.0
\n" "
\n" " Vă rugăm să reporniţi SABnzbd cu o adresă gazdă bună." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd a detectat informaţii salvate de la o altă versiune SABnzbd
\n" " dar nu poate să refolosească informaţiile de la cealaltă versiune de " "program.

\n" " Ar fi bine să terminaţi coada mai întâi cu cealaltă versiune de " "program.

\n" " După aceia , porniţi programul cu opţiunea \"--clean\".
\n" " Aceasta va şterge coada curentă şi istoricul!
\n" " SABnzbd citeÅŸte fiÅŸierul \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd nu poate găsi fişierele de la interfaţa-web %s.
\n" " Vă rugăm să reinstalaţi programul din nou.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd a detectat o eroare fatală:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd a detectat că fişierul sqlite3.dll lipseşte.

\n" " Unele antivirusuri ÅŸterg acest fiÅŸier.
\n" " Vă rugăm să verificaţi antivirusul , încercaţi să reinstalaţi SABnzbd şi " "plângeţivă autorului antivirusului.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Apasă Start+R şi scrie linia (exemplu):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Deschide fereastra Terminal şi scrie linia (exemplu):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Aplicaţia nu a pornit!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "Eroare fatală" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Nu pot porni navigatorul web, probabil nu a fost găsit" #: sabnzbd/panic.py msgid "Access denied" msgstr "Acces interzis" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Eroare %s: Trebuie să furnizaţi un nume utilizator şi parolă valid" #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "" "Coadă de descărcare veche detectată, utilizează Stare->Reparare pentru a " "converti coada" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" 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" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Descărcare euată, - Nu este pe serverul(ele) dumneavoastră" #: sabnzbd/postproc.py msgid "Moving" msgstr "Mutare" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "Trimis %s în coadă" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Eroare redenumire \"%s\" în \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Nu am putu muta fişier" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Rulare script utilizator %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "Durată %s" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Codul de ieșire a scriptului este %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Mai mult" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Post Procesare Nereuşită pentru %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "vezi fişier jurnal" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Descărcarea a eșuat" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Ştergerea lui %s nereuşită." #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Descărcare terminată" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Nu pot crea dosar final %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Post-procesare" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Niciun set par2" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Încerc verificare SFV" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Unele fişiere nu au fost verificate corect cu \"%s\"" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Verificare reuşită cu fişierele SFV" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Parolat" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Ştergerea %s nereuşită" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Punere sistem în hibernare nereuşită" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Punere sistem în aşteptare nereuşită" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Eroare la oprirea sistemului" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Id-ul indexului (%s) nu a fost găsit pentru fișierul de rating" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Adresă server" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "Cheie API" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Descriere flux RSS incorectă \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Descărcare %s: %s din RSS nereuşită" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Autentificare invalida pentru flux %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "Eroare la server (codul server %s); nu am putu lua %s în data de %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Serverul %s utilizează un certificat HTTPS nesigur" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "Fluxul RSS %s a fost gol" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Fulx RSS incompatibil" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Valoare RSS gasită a fost goală (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Arată interfața" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Deschide dosar descărcări complete" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Pauză timp de" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Pauză timp de 5 minute" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Pauză timp de 15 minute" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Pauză timp de 30 minute" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Pauză timp de o oră" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Pauză timp de 3 ore" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Pauză timp de 6 ore" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Închidere" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Rămas" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Adaugă NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Programator Greşit %s la %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Acţiune necunoscută: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Planificare pentru un server inexistent %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Descarcă" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Uneşte fişierele" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Sursă" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Servere" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Nereuşit" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Nereuşit" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Se așteaptă" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Reparare..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Dezarhivare..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Mutare..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Rulare script..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Descărcare blocuri extra..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Verificare Rapidă..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Verificare..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Descărcare" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "Întârziere de propagare" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Sarcină" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "dezactivează server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "activează server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Limitare de Viteză" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Pauză Toate" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Pauză post-procesare" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Reia post-procesare" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Citeşte fluxuri RSS" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Elimină sarcini nereuşite" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Elimină sarcinile finalizate" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Întrerupte sarcinile cu prioritate redusă" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Întrerupe sarcinile cu prioritate normală" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Întrerupe sarcinile cu prioritate ridicată" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Reia sarcinile cu prioritate redusă" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Reia sarcinile cu prioritate normală" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Reia sarcinile cu prioritate ridicată" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Activează gestionarea cotelor" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Oprit" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Foarte scăzută" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Moderat" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normal" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Ridicată" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Urgență" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Scăzută" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "oră" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "ore" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "min" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "minute" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "sec" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "secunde" #: sabnzbd/skintext.py msgid "day" msgstr "zi" #: sabnzbd/skintext.py msgid "days" msgstr "zile" #: sabnzbd/skintext.py msgid "week" msgstr "săptămână" #: sabnzbd/skintext.py msgid "Month" msgstr "Lună" #: sabnzbd/skintext.py msgid "Year" msgstr "An" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Zi din lună" #: sabnzbd/skintext.py msgid "This week" msgstr "Săptămâna aceasta" #: sabnzbd/skintext.py msgid "This month" msgstr "Luna aceasta" #: sabnzbd/skintext.py msgid "Today" msgstr "Azi" #: sabnzbd/skintext.py msgid "Total" msgstr "Total" #: sabnzbd/skintext.py msgid "on" msgstr "activat" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parametrii" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Versiune Python" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Pagină de pornire" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "sau" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Gazdă" #: sabnzbd/skintext.py msgid "Comment" msgstr "Comentariu" #: sabnzbd/skintext.py msgid "Send" msgstr "Trimite" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Anulează" #: sabnzbd/skintext.py msgid "Other" msgstr "Altele" #: sabnzbd/skintext.py msgid "Report" msgstr "Raportează" #: sabnzbd/skintext.py msgid "Video" msgstr "Video" #: sabnzbd/skintext.py msgid "Audio" msgstr "Audio" #: sabnzbd/skintext.py msgid "Not used" msgstr "Neutilizat" #: sabnzbd/skintext.py msgid "or less" msgstr "sau mai puțin" #: sabnzbd/skintext.py msgid "Log in" msgstr "Autentificare" #: sabnzbd/skintext.py msgid "Log out" msgstr "Deconectare" #: sabnzbd/skintext.py msgid "Remember me" msgstr "Ține-mă minte" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "Instrumentul de descărcare automată usenet" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Salvează" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Salvăm.." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Sunteţi sigur?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Ştergeţi toate fişierele descărcate?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Pagina de pornire" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Configurare" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Stare" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Ajutor" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Forum" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "Probleme" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "General" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Directoare" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Comutatoare" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Planificare" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Notificări" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "Email" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Categorii" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Sortare" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Special" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Caută" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Dosar Descărcare" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "ÎNTRERUPT" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "Articole %s în cache (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Încărcare sistem" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Versiune nouă %s disponibilă la" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Sunteţi sigur că doriţi să inchideţi SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Adaugă" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Adaugă fişier" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Categorie" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "În curs de procesare" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Prioritate" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Reparare" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Dezarhivare" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Ştergere" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "U" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "D" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Forțează" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Stop" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "Introdu URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "La terminarea coadei de descărcare" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Închide PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "Repaus PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Hibernare PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Închide SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Limită de Viteză" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Ordine" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Nume" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "Timp Estimat" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "Vârstă" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Şterge" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Reîncearcă" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Acțiuni" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Script-uri" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Ştergeţi toate obiectele din coadă?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Şterge NZB-uri" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Şterge NZB-uri & Fişiere Şterse" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Reîncearcă toate sarcinile eșuate" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Şterge NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Şterge NZB & Fişiere Şterse" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "din" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Articole lipsă" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Cotă rămasă" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "manual" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Resetează Cota acum" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Ştergeţi toate obiectele complete din Istoric?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Ascunde detaliile" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Arată detalii" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Arată Nereuşite" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Arată toate" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Mărime" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Şterge NZB-uri nereuşite" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Şterge NZB-uri Nereuşite & Fişiere Şterse" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Şterge NZB-uri Complete" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "NZB Suplimentar Opţional" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Cale" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Reîncearcă toate eșuate" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Reîncearcă toate" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Dincolo de retenție" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Altă problemă" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Forţează Deconectarea" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Acesta va trimite un email test către contul dvs." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Arată Jurnalizarea" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Email Test" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Jurnalizare" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Erori/Avertismente" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Info" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Depanare" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Conexiuni" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Ultimele Avertizări" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "Şterge" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Deblochează" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Identificator Articol" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Set fişiere" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Când" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Tip" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Activat" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Panou de Control" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Conectare eșuată!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Adresa IPv4 locală" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Adresa IPv4 publică" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "Adresa IPv6" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Server de nume/Căutare DNS" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "Model CPU" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Perfromanță Sistem (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Viteză de descărcare director" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Vitează completă director" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Viteză de scriere" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "Nu am putut scrie. Verifică dacă director poate fi modificat." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Click pe butonul de Repetare test pentru a determina" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Repetă test" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "Fişier Configurare" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Cache Folosit" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Acest lucru va reporni SABnzbd.
Folosiţi-l atunci când credeţi că " "programul are o problemă de stabilitate.
Descărcarea va fi oprită " "înainte de repornire şi reluată ulterior." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" "
Dacă este activată autentificarea v-a trebuie să vă logați din nou." #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Sunt sarcini orfane în dosarul de descărcare.
Puteţi alege în a le " "şterge (inclusiv fişierele) sau a le trimite înapoi în coadă." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "Butonul \"Reparare\" va reporni SABnzbd şi face o reconstrucţie completă
a conţinutului coadei de descărcare , menţinând fişierele deja " "descărcate.
Acest lucru va modifica ordinea în coada de descărcare." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Modificările nu au fost salvate, şi vor fi pierdute." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" "Atunci când modificați adresa IP sau dacă SABnzbd este repornit sesiunea " "dumneavoastră va expira." #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Activează Unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "Activează 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "Versiune" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Durata Funcţionării" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Server Secundar" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Citeşte Ajutorul Wiki despre asta !" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Repornim SABnzbd..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Modificările vor necesita repornirea SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "Server Web SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "Gazdă SABnzbd" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Nume Gazdă unde SABnzbd va asculta." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "Port SABnzbd" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Portul pe care SABnzbd îl va asculta." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Interfață Web" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Alege o temă." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "Nume Utilizator SABnzbd" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Nume Utilizator autentificare opţional" #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "Parolă SABnzbd" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "Activează HTTPS" #: sabnzbd/skintext.py msgid "not installed" msgstr "neinstalat" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Permite acesarea interfeţei de la o adresă HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "Port HTTPS" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Dacă e gol, portul standard va asculta doar în HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "Certificat HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Nume fişier sau cale Certificat HTTPS." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "Cheie HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Nume fişier sau cale Cheie HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "Certificate Cheie HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Nume fişier sau cale cheie HTTPS." #: sabnzbd/skintext.py msgid "Tuning" msgstr "Optimizări" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "Interval Verficare RSS" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Interval verificare (în minute, cel puţin 15). Inactiv când se foloseşte " "Planificatorul!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Viteză maximă a conexiunii" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Procent din viteza conexiunii" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "Ce procent din viteza conexiuni poate fi utilizat de SABnzbd, ex. 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Limită Cache Articole" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Stochează articolele în memorie pentru a reduce acesul disc.
În " "octeţi, opţional urmaţi de K,M,G. De exemplu : \"64M\" sau\"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Listă Curăţenie" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Listă de extensii fișiere ce trebuie să fie șterse după descărcare.
De " "exemplu: nfo or nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Salvează Modificările" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "" #: sabnzbd/skintext.py msgid "Reset" msgstr "Resetează" #: sabnzbd/skintext.py msgid "Language" msgstr "Limbă" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Alegeţi o limbă interfaţă web." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "Această cheie va oferi programelor terţe acces deplin la SABnzbd." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "Cheie NZB" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Această cheie va permite programelor terţe să adauge NZB-uri în SABnzbd." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Generează o Cheie Nouă" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "Cheie API sau Cod QR" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Listă de rețele locale" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Toate rețelele locale încep cu acest prefixe (de regulă \"192.168.1.\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Acces extern la internet" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "Fără acces" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Adaugă fișiere NZB " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (fără Configurare)" #: sabnzbd/skintext.py msgid "Full API" msgstr "API Complet" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Interfață Web completă" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "Doar accesul extern necesităr autentificare" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "NOTĂ:Dosarele vor fi create automat când se Salvează. Puteţi " "utiliza căi absolute pentru a salva în afara dosarelor implicite." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Dosare Utilizator" #: sabnzbd/skintext.py msgid "Browse" msgstr "Răsfoire" #: sabnzbd/skintext.py msgid "In" msgstr "În" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Dosar Descărcare Temporar" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Locaţie de stocare a descărcărilor neprelucrate.
Poate fi schimbată " "doar atunci când coada este goală." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Minim de Spaţiu Liber pentru Dosar Descărcare Temporar" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Auto-pauză când spaţiul liber este sub această valoare.
În octeţi, " "urmaţi opţional de K, M, G, T. De exemplu: \"800M\" sau \"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Dosar Descărcări Finalizate" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Locație pentru stocare , a descărcărilor procesate complet.
Poate fi " "suprascris de categoriile definite de utilizator." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Permisiuni pentru descărcări finalizate" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Setează permisiunile pentru fişierele/directoarele finalizate.
ÃŽn " "valori octale. De exemplu: \"755\" sau \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Dosar Monitorizat" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Dosar pentru supraveghere fiÅŸiere .nzb.
Scanează de asemenea şi " "arhivele .zip .rar .tar.gz de fişiere .nzb." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Viteză Scanare Dosar Monitorizat" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Numărul de secunde între scanarea de fişiere .nzb." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Dosar Şabloane Email" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Dosar ce conţine şabloane email utilizator." #: sabnzbd/skintext.py msgid "Password file" msgstr "Fișier parole" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "Fişier ce conţine parole pentru fişiere RAR encriptate." #: sabnzbd/skintext.py msgid "System Folders" msgstr "Dosare Sistem" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Dosar Administrativ" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Locaţia coadei admin şi istoricul bazei de date.
Poate fi folosit " "doar când coada e goală." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Informaţiile vor nu vor fi mutate. Necesită repornire SABnzbd!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Dosar Jurnal" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Locaţie a fişierelor jurnal ale SABnzbd.
Necesită repornire " "SABnzbd!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "Dosar Copie de Siguranţă .nzb" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Locaţie unde fişierele .nzb vor fi stocate." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Dosar de Bază Implicit" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Descarcă toate fișierele par2" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Activează dezarhivarea recursivă" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Dezarhivează arhivele (rar, zip, 7z) conținute în alte arhive." #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Ignoră orice director din interiorul arhivelor" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Toate fișierele merg într-un singur director" #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Ia Articole doar din Vârful Coadei" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Activează pentru folosire de memorie mai puţină. Dezactivaţi pentru a " "preveni ca sarcinile lente să blocheze coada." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Post-Procesează Doar Sarcinile Verificate" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" "Execută post-procesarea doar dacă sarcina a trecut toate verificările PAR2." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Acțiuni când se descarcă un RAR encriptat" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "În cazul \"Întrerupere\", dumneavoastră trebuie să introduceți parola și să " "reluați sarcina." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Detectează Descărcări Duplicate" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Detectează episoade duplicate în seriale" #: sabnzbd/skintext.py 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 "Ignoră" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Renunță" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Acțiune când se detectează o extensie nedorită" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "Acțiune când se detectează extensie nedorită într-un fișier RAR" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Extensii nedorite" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Listă cu toate extensiile nedorite. De exemplu: exe or exe, com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Activează verficări SFV" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Fă o verificare extra bazată pe fişiere SFV" #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Sarcina cu script a utilizatorului a eșuat" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Când un script de utilizator returnează o ieșire diferit de codul de ieșire, " "sarcina v fi marcată ca fiind nereușită." #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "La eroare, încearcă NZB alternativ" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "Unele server oferă o alternativă dacă un NZB eșuează." #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Activează redenumire dosar" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Foloseşte nume temporare în timpul post procesării. Dezactivaţi când " "sistemul dvs. nu gestionează aceasta corect." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Script utilizator Pre-Coadă" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Folosit înainte ca un NZB să intre în coadă." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Parametri Extra PAR2" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Parametri Nice" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "Parametri IONice" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Deconectează când Coada e Goală" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "" "Deconectează de la serverul(ele) Usenet când coada e goală sau în pauză." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Sortează după Vârstă" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Sortează automat obiectele dupa vârstă (medie)." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" "Articolele vor fi întrerupte până ce vor avea cel puțin vechimea aceasta. " "Dacă setați prioritatea descărcării ca Forțat evitați această întârziere." #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Verifică Versiuni Noi" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Verificare săptămânală versiuni noi SABnzbd." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "Testeaza şi versiuni de încercare" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Înlocuieşte Spaţiile din Numele Dosarelor" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Înlocuieşte spaţiile cu _ în numele dosarelor." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Înlocuieşte punctele din Numele Dosarelor" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Înlocuieşte puntele cu spaţii în numele dosarelor." #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Fă Windows compatibil" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "Pentru servere: asigurați-vă că numele sun comparibile cu Windows" #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Porneşte Navigator Web la Pornire" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Porneşte navigatorul web implicit când se porneşte SABnzbd." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Întrerupe Descărcarea în Timpul Post-Procesare" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Întrerupe descărcare la începerea post procesării şi reporneşte când e " "terminată." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Ignoră Monstre" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Ignoră fişiere monstră (de ex. monstre video)" #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Şterge după descărcare" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" #: sabnzbd/skintext.py msgid "Server" msgstr "Server" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Post procesare" #: sabnzbd/skintext.py msgid "Naming" msgstr "Redenumire" #: sabnzbd/skintext.py msgid "Quota" msgstr "Cotă" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indexare" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Cât de mult poate fi descărcat în acestă lună (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Zi resetare" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "În ce zi a lunii sau săptămână (1=Luni) ISP dumneavoastră resetează cota? " "(Opțional cu hh:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Auto repornire" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "Se reia descărcarea după resetarea cotei?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Perioadă Cotă" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "Cota se resetează în fiecare zi, săptămână sau lună ?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Verifică înainte de descărcare" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Încearcă să prezici decărcarea cu succes înaintea descărcării reale (mai " "lent!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "Număr Maxim reîncercări" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Număr Maxim reîncercări pe server" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Anulează sarcini care nu pot fi terminate" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Atunci când e clar că o sarcină va eșua din cauza lipsei de date pe " "server(e), anulează sarcina" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Activează Filtrare" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Acțiune când se descarcă în baza de reguli de filtrare." #: sabnzbd/skintext.py msgid "Abort If" msgstr "Renunță Dacă" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Altfel Întrerupe Dacă" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Rating Video" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Rating Audio" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spam" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Confirmat" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Mai multe voturi pozitive ca negative" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Cuvinte cheie din Titlu" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Listă separată prin virgulă" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Util dacă un server de știri are mai mult decât o adresă IPv4/IPv6" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Adaugă Server" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Descriere server" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Port" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Nume de Utilizator" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Parolă" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Timp Expirare" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Timp Retenţie" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "Dezactivat" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "" "0 este prioritatea cea mai ridicată, 99 este prioritatea cea mai scăzută" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Opţional" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Activează" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Şterge Server" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Test Server" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Resetează Statistici" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Testez detalii server..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Descărcat" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Trimite Grup" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Trimite comanda group înainte de a cere articole." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Note personale" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Adaugă Planificare" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Frecvenţă" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Acțiune" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Argumente" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Planificări Curente" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Caseta de lângă numele fluxului trebuie să fie selectată pentru ca fluxul să " "fie verificat de obiecte noi automat.
Când un flux este adăugat , el va " "lua doar obiectele noi şi nu cele deja existente, cu excepţia când apăsaţi " "\"Descărcare Forţată\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Citeşte Flux" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Descărcare Forţată" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filtru" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Acceptă" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Respinge" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Necesită" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "NecesităCategoria" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Cel puțin" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Cel mult" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "De la SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Potrivite" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Nepotrivit" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Descărcate" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Citeşte Toate Fluxurile Acum" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Notificări Email Sarcină Terminată" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Niciodată" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Întotdeauna" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Doar-erori" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Notificări Disc Plin" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "Trimite email când discul este plin şi SABnzbd este întrerupt." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Trimite notificări RSS" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "Trimite email când un flux RSS adaugă sarcini în coadă." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "Server SMTP" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Setează serverul dvs. ISP pentru trimitere email." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Destinatar Email" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "Adresă de email către care se trimite email." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "Expeditor Email" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Cine ar trebui să spunem că a trimis email?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "Nume Cont OPŢIONAL" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Pentru email autentificat, nume cont." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "Parolă Cont OPŢIONAL" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Pentru email autentificat, parola." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Notificare Trimisă!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Activează Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Foloseşte doar pentru server Growl de la distanţă (gazdă:port)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Parolă server" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Parolă opţională server Growl" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "Activează NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Centru Notificări" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Activează notificări Windows" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Notificări Windows" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotificăOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Activează notificări Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Necesită cont Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "Cheie API pentru Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Cheie API personală pentru Prowl (necesară)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Activează notificări Pushover" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Necesită cont Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Token de Aplicație" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Token de Aplicație (necesar)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Cheie Utilizator" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Cheie Utilizator (necesară)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Dispozitiv(e)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Activează notificare Pushbullet" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Necesită un cont Pushbullet" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Cheie API personală" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Cheie personală API Pushbullet (necesară)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Dispozitiv" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Dispozitiv la care să se trimită mesajul" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "Scipt de Notificare" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "Activează scriptul de notificare" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "Execută script personalizat" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "Ce script să fie executat pentru notificări?" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Finalizarea unei căi cu un asterix * va preveni crearea de dosare sarcini." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Dosarele relative se bazează pe" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Dosar/Cale" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Sortare Seriale" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Activează Sortare TV" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Model Cheie" #: sabnzbd/skintext.py msgid "Clear" msgstr "Şterge" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "Presetări" #: sabnzbd/skintext.py msgid "Example" msgstr "Exemplu" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Activează Sortare Filme" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Păstrează descărcările suplimentare în dosare extra" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Categorii Afectate" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Semnificaţie" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Șablon" #: sabnzbd/skintext.py msgid "Result" msgstr "Rezultat" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Dosar Sezon" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Dosar Sezon" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Dosar Episod" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 Dosar Episod" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "" #: sabnzbd/skintext.py msgid "Title" msgstr "Titlu" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Nume Film" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Nume.Film" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Nume_Film" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Nume Serial" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Nume.Serial" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Nume_Serial" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Număr Sezon" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Număr Episod" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Nume Episod" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Nume.Episod" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Nume_Episod" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Extensie fișier" #: sabnzbd/skintext.py msgid "Extension" msgstr "Extensie" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Număr Parte" #: sabnzbd/skintext.py msgid "Decade" msgstr "Deceniu" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Nume de Fişier Original" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Litere Mici" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEXT" #: sabnzbd/skintext.py msgid "text" msgstr "text" #: sabnzbd/skintext.py msgid "file" msgstr "fișier" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Şir Caractere Sortare" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Etichetă Multi-părţi" #: sabnzbd/skintext.py msgid "In folders" msgstr "În dosare" #: sabnzbd/skintext.py msgid "No folders" msgstr "Fără dosare" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Sortare Dată" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Activează Sortare Dată" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Arată Nume dosar" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "Dosar An-Lună" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Dosare Zilnice" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "ajustare nume fişier" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Rezultat Procesat" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Opţiuni folosite rar. Pentru explicaţiile şi semnificaţia lor, click pe " "meniul Ajutor şi vizitează pagina Wiki.
Nu modificaţi aceste setări fără " "a verifica mai întâi pagina Wiki , pentru că unele pot cauza probleme " "serioase .
Valorile originale sunt în paranteze ." #: sabnzbd/skintext.py msgid "Values" msgstr "Valori" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Editează Detalii NZB" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Şterge" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Vârf" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Sus" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Jos" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Coadă" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Toate" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Inversează" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Nume de fișier" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Subiect" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Selecţie" #: sabnzbd/skintext.py msgid "left" msgstr "rămas" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Spațiu liber" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Dosar Temporar" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Operaţii-Multiple" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Ține-ți tasta shift pentru a selecta un interval" #: sabnzbd/skintext.py msgid "Check all" msgstr "Selectează tot" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Repornește SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Opțiuni stare și interfață" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Sau trage fișierele în fereastră!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Am pierdut conexiunea cu SABnzbd.." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Rată actualizare" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Folosește setările globale de interfață" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Limită maximă la coadă" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Limită maximă la Istoric" #: sabnzbd/skintext.py msgid "Date format" msgstr "Format dată" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Coloană extra la Coadă" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "Coloană extra de istoric" #: sabnzbd/skintext.py msgid "page" msgstr "pagină" #: sabnzbd/skintext.py msgid "Loading" msgstr "Se încarcă" #: sabnzbd/skintext.py msgid "articles" msgstr "articole" #: sabnzbd/skintext.py msgid "Rename" msgstr "Redenumește" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Coadă reparare" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Arată conexiuni active" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Sarcini orfane" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Trimite înapoi la coadă" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Șterge tot" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Reîncearcă toate" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Descarcă NZB din URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "Încarcă NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Opţional specifică un nume de fişier" #: sabnzbd/skintext.py msgid "Submit" msgstr "Trimite" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Dechide URL Informaţii" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Trimis. Vă mulțumim!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Nimic selectat!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Elimină toate fișierele selectate" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Ascunde/arată fișierele finalizate" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Vezi Jurnal Script" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Actualizare Disponibilă!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" "Stocarea locală (module cookie) sunt dezactivate în browserul dumneavoastră, " "setările de interfață vor fi pierdute la încridegea browserului!" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" #: sabnzbd/skintext.py msgid "Custom" msgstr "Personalizat" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "Aspect compact" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "Interfață tabelară
(coadă È™i istoric separate)" #: sabnzbd/skintext.py msgid "Speed" msgstr "Viteză" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Confirmă Åžtergere Coadă" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Confirmă Åžtergere Istoric" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Cât timp sau până când doriÈ›i să întrerupeÈ›i? (în Engleză!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Ne pare rău, nu am putut interpreta informaÈ›iile. ÃŽncearcă din nou." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Pauză timp de..." #: 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 Oldest→Newest" msgstr "Sortează după Vârstă Cel mai Vechi→Cel mai Nou" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Sortează după Vârstă Cel mai Nou→Cel mai Vechi" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Sortează după Nume A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Sortează după Nume Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Sortează după Mărime Cel mai Mic→Cel mai Mare" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Sortează după Mărime Cel mai Mare→Cel mai Mic" #: sabnzbd/skintext.py msgid "Uploading" msgstr "ÃŽncărcare" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "ForÈ›ează deconectarea" #: sabnzbd/skintext.py msgid "Removing job" msgstr "Elimin sarcina" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "Elimin sarcinile" #: sabnzbd/skintext.py msgid "Prev" msgstr "Precedent" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Următorul" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "GoliÅ£i Istoricul?" #: sabnzbd/skintext.py 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 "Options" msgstr "OpÈ›iuni" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Pauză pentru câte minute?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Meniu Top" #: sabnzbd/skintext.py msgid "On Finish" msgstr "La Terminare" #: sabnzbd/skintext.py msgid "Sort" msgstr "Sortează" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Sortează după Vârstă (Cel mai Vechi→Cel mai Nou)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Sortează după Vârstă (Cel mai Nou→Cel mai Vechi)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Sortează după Nume (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Sortează după Nume (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Sortează după Mărime (Cel mai Mic→Cel mai Mare)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Sortează după Mărime (Cel mai Mare→Cel mai Mic)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "GoliÅ£i Coada?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Reîncerc toate sarcinile eÈ™uate din Istoric?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Șterge" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Viteză Maximă" #: sabnzbd/skintext.py msgid "Range" msgstr "Interval" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Aplică la SelecÅ£ie" #: sabnzbd/skintext.py msgid "Everything" msgstr "Tot" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Rata de Reîmprospătare" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Lăţime Container" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Acest lucru va preveni reîmprospătarea când cursorul mouse-ului este " "deasupra coadei." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Blochează Reîmprospătarea Hover" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "ÃŽncarcă" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "ÃŽncarcă: .nzb .rar .zip .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Progres" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "SpaÅ£iul liber insuficient pe disc pentru finalizarea descărcărilor !" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Gol (Temp)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "INACTIV" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Descărcări" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "Vrăjitor Pornire-Rapidă SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "Versiune SABnzbd" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Precedent" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Detalii Server" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "" "Vă rugăm să introduceÅ£i detaliile furnizorului dvs principal de usenet." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Numărul de conexiuni permis de furnizor" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "De ex. 8 sau 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Selectează doar dacă furnizorul dvs. permite conexiuni SSL." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Clic pentru a testa detaliile introduse." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "De ex." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "Instalarea este acum completă!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd va rula acum în fundal." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "ÃŽnchidere a oricărei ferestrele browser/file NU va închide SABnzbd." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Este recomandat să faceÅ£i clic dreapta ÅŸi să faceÅ£i o scurtatură , pe care " "să o folosiÅ£i pentru a accesa SABnzbd când rulează în fundal." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Ajutor suplimentar poate fi găsit pe pagina noastră" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "Du-te la SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "ÃŽnchide SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "PorneÅŸte Vrăjitor" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd vine cu ABSOLUT NICI O GARANÅ¢IE.\n" "Acesta este software gratis, ÅŸi sunteÅ£i binevenit să-l redistribuiÅ£i în " "anumite condiÅ£ii.\n" "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] msgid "Error getting TV info (%s)" msgstr "Eroare obÅ£inere info TV (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "Redenumire:%s în %s nereuÅŸită" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "Redenumire fiÅŸiere similare : %s în %s nereuÅŸită" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Acces neautorizat" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "FiÈ™ierul nu este pe server" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "URLGRABBER S-A BLOCAT" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "FiÅŸier NZB Inutilizabil" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "Descărcare URL nereuÅŸită; %s" #~ msgid "_yenc module... NOT found!" #~ msgstr "modulul _yenc ... Negăsit!" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ 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 email templates found" #~ msgstr "Åžabloane email negăsite" #~ msgid "Invalid encoding of email template %s" #~ msgstr "Codificare invalidă a ÅŸablonului email %s" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "" #~ "Nici un program UNRAR găsit, dezarhivarea fişierelor RAR imposibilă
" #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Versiunea dvs. UNRAR nu este recomandată, luaţi-o de la " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "Initiating restart...
" #~ msgstr "Iniţializare repornire...
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "Nici un program PAR2 găsit, repararea imposibilă
" #~ msgid "Error: No secondary interface defined." #~ msgstr "Eroare: Nici o interfaţă secundară definită." #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "Sarcina \"%s\" a fost re-adăugată în coadă" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Nu mă pot conecta la registru HKEY_CURRENT_USER." #~ msgid "Not matched" #~ msgstr "Nepotrivite" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "Sarcinile selectate cu '*' vor fi descărcate automat" #~ msgid "Downloaded so far" #~ msgstr "Decărcat până acum" #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Nu pot deschide cheie registru \"%s\"." #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Citire valoare registru pentru dosare speciale nereuşită" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd nu este compatibil cu unele programe firewall
\n" #~ " %s
\n" #~ " Ne pare rău, dar noi nu putem rezolva această incompatibilitate " #~ "acum.
\n" #~ " Vă rugăm să vă plângeţi producătorului dvs. de firewall.
\n" #~ "
\n" #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Este posibil că folosiţi ZoneAlarm în Vista.
" #~ msgid "OK" #~ msgstr "OK" #~ msgid "You have no permisson to use port %s" #~ msgstr "Nu ai permisiunea să foloseÅŸti acest port %s" #~ msgid "Try again" #~ msgstr "ÃŽncercaÈ›i din nou" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "modul pyopenssl lipsă, instalaÅ£i-l pentru acces https" #~ msgid "Unpacking failed, see log" #~ msgstr "Dezarhivare nereuÅŸită, vezi jurnal" #~ msgid "Unpacking failed, these file(s) are missing:" #~ msgstr "Dezarhivare nereuÅŸită, acest(e) fiÅŸier(e) sunt lipsă:" #~ msgid "ERROR: %s" #~ msgstr "EROARE: %s" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "Dezarhivare nereuÅŸită, un fiÅŸier aÅŸteptat nu a fost dezarhivat" #~ 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 "Failed to remove nzo from postproc queue (id)" #~ msgstr "Åžtergere nzo din coadă post-procesare nereuÅŸită (id)" #~ msgid "No post-processing because of failed verification" #~ msgstr "Nici o post-procesare din cauza verificării nereuÅŸite" #~ msgid "View script output" #~ msgstr "Vezi rezultat script" #~ msgid "Error removing workdir (%s)" #~ msgstr "Eroare ÅŸtergere dosar curent (%s)" #~ msgid "Get NZB" #~ msgstr "Descarcă NZB" #~ msgid "KB/s" #~ msgstr "KB/s" #~ msgid "Queued" #~ msgstr "Pus în coadă" #~ msgid "Complete Dir" #~ msgstr "Dosar Complete" #~ msgid "Download speed" #~ msgstr "Viteză de descărcare" #~ msgid "WARNINGS" #~ msgstr "AVERTIZÄ‚RI" #~ msgid " " #~ msgstr " " #~ msgid " or Report ID" #~ msgstr " sau Report ID" #~ msgid "Sort by name" #~ msgstr "Sortează după nume" #~ msgid "Sort by age" #~ msgstr "Sortează după vârstă" #~ msgid "Sort by size" #~ msgstr "Sortează după mărime" #~ msgid "Hide files" #~ msgstr "Ascunde fiÅŸiere" #~ msgid "Show files" #~ msgstr "Arată fiÅŸiere" #~ msgid "Remain/Total" #~ msgstr "Rămas/Total" #~ msgid "History Size" #~ msgstr "Mărime Istoric" #~ msgid "Delete all failed items from History?" #~ msgstr "ÅžtergeÅ£i toate obiectele nereuÅŸite din Istoric?" #~ msgid "Show Weblogging" #~ msgstr "Arată Jurnal Web" #~ msgid "Thread" #~ msgstr "Proces" #~ msgid "Email Test Result" #~ msgstr "Rezultat Test Email" #~ msgid "General configuration" #~ msgstr "ConfiguraÅ£ie Generală" #~ msgid "Secondary Web Interface" #~ msgstr "Interfaţă Web Secundară" #~ msgid "Web server authentication" #~ msgstr "Autentificare server web" #~ msgid "Activate an alternative skin." #~ msgstr "Activează o temă alternativă." #~ msgid "HTTPS Support" #~ msgstr "Suport HTTPS" #~ msgid "Queue auto refresh interval:" #~ msgstr "Interval reîmprospătare automată coadă:" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "" #~ "Interval reîmprospătare a coadei din pagina interfeÅ£ei web(sec, 0= niciunul)." #~ msgid "Disable API-key" #~ msgstr "Dezactivează cheie-API" #~ msgid "Folder configuration" #~ msgstr "Configurare Dosare" #~ msgid "Do not require the API key." #~ msgstr "Nu necesită cheie API." #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "UTILIZAÅ¢I PE RISCUL DVS. !" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Director Script-uri Post-Procesare" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "Dosar ce conÅ£ine script-uri de post-procesare." #~ msgid "Enable built-in unrar functionality." #~ msgstr "Activează funcÅ£ionalitatea inclusă unrar." #~ msgid "Switches configuration" #~ msgstr "Configurare Comutatoare" #~ msgid "Enable Unrar" #~ msgstr "Activează Unrar" #~ msgid "Processing Switches" #~ msgstr "Comutatoare Procesare" #~ msgid "Enable Quick Check" #~ msgstr "Activează Verificare Rapidă" #~ msgid "Enable Filejoin" #~ msgstr "Activează Unire FiÅŸiere" #~ msgid "Enable built-in unzip functionality." #~ msgstr "Activează funcÅ£ionalitatea inclusă unzip ." #~ msgid "Enable TS Joining" #~ msgstr "Activează Unire TS" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "" #~ "UneÅŸte fiÅŸierele care se termină în .001, .002 etc. într-un singur fiÅŸier." #~ msgid "Enable Par Cleanup" #~ msgstr "Activează Åžterge Par" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "" #~ "UneÅŸte fiÅŸierele care se termină în .001.ts, .002.ts etc. într-un singur " #~ "fiÅŸier." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "NereuÅŸit din cauza Erorilor CRC yEnc" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "" #~ "Când un articol are o eroare CRC , încearcă să-l iei de pe un alt server." #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Åžterge fiÅŸierele par (dacă verificarea/repararea este cu succes)" #~ msgid "Default Priority" #~ msgstr "Prioritate Implicită" #~ msgid "Used when no user script is defined by the category." #~ msgstr "Folosit când nu este definit nici un script de categorie." #~ msgid "Default Post-Processing" #~ msgstr "Post-Procesare Implicită" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "Folosit când nu este definit nici o post-procesare de categorie." #~ msgid "Default User Script" #~ msgstr "Script Utilizator Implicit" #~ msgid "Enable MultiCore Par2" #~ msgstr "Activează Par2 MultiCore" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Folosit când nu este definit nici o prioritate de categorie." #~ msgid "Other Switches" #~ msgstr "Alte Comutatoare" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "ÃŽnlocuieÅŸte Caracterle Ilegale din Numele Dosarelor" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "ÃŽnlocuieÅŸte caracterele ilegale din numele dosarelor cu echivalente (altfel " #~ "ÅŸterge)." #~ msgid "Do not download" #~ msgstr "Nu descărca" #~ msgid "SSL type" #~ msgstr "Tip SSL" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "FolosiÅ£i V23 doar dacă furnizorul dumneavoastră necesită altfel!" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "FolosiÅ£i sitemul 12 ore (AM/PM)" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "AfiÅŸaÅ£i timpii în notaÅ£ia AM/PM (nu afectează planificatorul)" #~ msgid "Server configuration" #~ msgstr "Configurare Server" #~ msgid "Server definition" #~ msgstr "DefiniÅ£ie Server" #~ msgid "Scheduling configuration" #~ msgstr "Configurare Planificator" #~ msgid "Backup server" #~ msgstr "Server Secundar" #~ msgid "Click below to test." #~ msgstr "Clic mai jos pentru a testa." #~ msgid "Add Feed" #~ msgstr "Adaugă flux" #~ msgid "Delete Feed" #~ msgstr "Șterge flux" #~ msgid "RSS Configuration" #~ msgstr "Configurare RSS" #~ msgid "Remove" #~ msgstr "Șterge" #~ msgid "New Feed URL" #~ msgstr "Flux URL Nou" #~ msgid "Feeds" #~ msgstr "Fluxuri" #~ msgid "Skip" #~ msgstr "Omite" #~ msgid "Settings" #~ msgstr "Setări" #~ msgid "Email Options" #~ msgstr "OpÅ£iuni Email" #~ msgid "User-defined categories" #~ msgstr "Categorii definite de utilizator" #~ msgid "Sorting configuration" #~ msgstr "Configurare Sortare" #~ msgid "Defines post-processing and storage." #~ msgstr "DefineÅŸte post-procesarea ÅŸi stocarea." #~ msgid "Groups / Indexer tags" #~ msgstr "Grupuri / Taguri Indexer" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Permite sortarea ÅŸi redenumirea de episoade." #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Activează sortarea ÅŸi redenumirea generică a fiÅŸierelor." #~ msgid "Generic Sorting" #~ msgstr "Sortare Generică" #~ 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ă." #~ msgid "Are you sure you want to delete" #~ msgstr "Sigur doriÈ›i să È™tergeÈ›i" #~ msgid "Page" #~ msgstr "Pagină" #~ msgid "Last" #~ msgstr "Ultimul" #~ msgid "First" #~ msgstr "Primul" #~ msgid "Close" #~ msgstr "ÃŽnchide" #~ msgid "Set Pause Interval" #~ msgstr "Setează Interval Pauză" #~ msgid "Pause Interval" #~ msgstr "Interval Pauză" #~ msgid "Pause for 24 hours" #~ msgstr "Pauză timp de 24 ore" #~ msgid "Pause for 12 hours" #~ msgstr "Pauză timp de 12 ore" #~ msgid "Left" #~ msgstr "Stânga" #~ msgid "Open Source URL" #~ msgstr "Deschide URL Sursă" #~ msgid "Storage" #~ msgstr "Stocare" #~ msgid "Plush Options" #~ msgstr "OpÅ£iuni Plush" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "ÃŽncarcă: .nzb .rar .zip .gz" #~ msgid "Hour:Min" #~ msgstr "Ore:Min" #~ msgid "Delete the all failed items from the history?" #~ msgstr "ÅžtergeÅ£i toate fiÅŸierele nereuÅŸite din istoric?" #~ msgid "Delete Completed" #~ msgstr "Åžtergere Finalizată" #~ msgid "Links" #~ msgstr "Legături" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "CiteÅŸte Flux va descărca conÅ£inutul fluxului curent. " #~ "Descărcare ForÅ£ată va descărca toate NZB-urile " #~ "corespunzătoare acum." #~ msgid "Delete Failed" #~ msgstr "Åžterge NereuÅŸite" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "AfiÅŸare %s până la %s din totalul %s rezultate" #~ msgid "Email Sent!" #~ msgstr "Email Trimis!" #~ msgid "DualView2" #~ msgstr "VedereDuală2" #~ msgid "DualView1" #~ msgstr "VedereDuală1" #~ msgid "Toggle Add NZB" #~ msgstr "Comută Adaugă NZB" #~ msgid "Saved" #~ msgstr "Salvat" #~ msgid "Showing one result" #~ msgstr "Afişăm un rezultat" #~ msgid "No results" #~ msgstr "Fără rezultate" #~ msgid "Show Edit Options" #~ msgstr "Arată OpÅ£iuni Editare" #~ msgid "Timeleft" #~ msgstr "Timp rămas" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "SunteÅ£i sigur că doriÅ£i să reporniÅ£i SABnzbd?" #~ msgid "Hide Edit Options" #~ msgstr "Ascunde OpÅ£iuni Editare" #~ msgid "Edit" #~ msgstr "Editează" #~ msgid "Access" #~ msgstr "Acces" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Permite acces HTTPS la SABnzbd." #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Acces SABnzbd protejat cu parolă (recomandat)" #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Vreau SABnzbd să fie vizibilă numai de pe PC-ul meu." #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "" #~ "Vreau SABnzbd să fie vizibil de către orice calculator din reÅ£eaua mea." #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "Lansează navigatorul meu web la pornirea SABnzbd ." #~ msgid "Misc" #~ msgstr "Diverse" #~ msgid "Please enter a whole number." #~ msgstr "Vă rugăm să introduceÅ£i un număr întreg." #~ msgid "This field is required." #~ msgstr "Acest câmp este obligatoriu." #~ msgid "Step One" #~ msgstr "Pasul Unu" #~ msgid "Step Two" #~ msgstr "Pasul Doi" #~ msgid "Step Three" #~ msgstr "Pasul Trei" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "După repornire SABnzbd ,îl veÅ£i putea acesa la următoarea locaÅ£ie: %s" #~ msgid "Step Four" #~ msgstr "Pasul Patru" #~ msgid "Step Five" #~ msgstr "Pasul Cinci" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd are nevoie de un port tcp/ip liber pentru serverul său " #~ "intern.
\n" #~ " Portul %s de pe %s a fost încercat , dar contul folosit de SABnzbd nu " #~ "are permisiunea de a-l folosi.
\n" #~ " În sisteme OSX şi Linux , utilizatori normali trebuie să folosească " #~ "porturi peste 1023.
\n" #~ "
\n" #~ " Vă rugăm să reporniţi SABnzbd cu un număr de port diferit." #~ msgid "File %s is empty, skipping" #~ msgstr "Fişierul %s este gol , ignorăm" #~ msgid "Add new downloads" #~ msgstr "Adaugă descărcări noi" #~ msgid "Purge Failed History" #~ msgstr "Goleşte Istoric Descărcări Nereuşite" #~ msgid "Email Account Settings" #~ msgstr "Setări Cont Email" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Ignoră verificarea par2 când fişierele sunt complete 100%%." #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "De ex. 119 sau 563 pentru SSL" #~ msgid "Filters" #~ msgstr "Filtre" #~ msgid "Check result of unpacking" #~ msgstr "Verifică rezultatul dezarhivării" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Verifică rezultatul dezarhivării ( trebuie să fie dezactivat pentru unele " #~ "sisteme de fișiere )" #~ msgid "Send notifications to Growl" #~ msgstr "Trimite notificări Growl" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Trimite notificări către NotifyOSD" #~ 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" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Aplică numărul maxim de reîncercări la serverele opționale" #~ msgid "QR Code" #~ msgstr "Cod QR" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "" #~ "Activează clasă mesaje ce vor fi raportate (niciunul, unul sau mai multe)" #~ msgid "Notification classes" #~ msgstr "Clase notificări" #~ msgid "Send notifications to Notification Center" #~ msgstr "Trimite notificări la Centru Notificări" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "" #~ "ATENŢIE: Sarcină \"%s\" abandonată deoarce conţine un fişier RAR ecriptat" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "Trimite în mod automat rezultatele validate de descărcare la index." #~ msgid "Automatic Feedback" #~ msgstr "Feedback Automat" #~ msgid "Site API Key" #~ msgstr "Cheie API Site" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Această cheie are rol de identificare la index. Informații suplimentare pe " #~ "https://www.oznzb.com/profile." #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Funcționalitate suplimentară inclusiv ratinguri și alte informații " #~ "suplimentare sunt disponibile dacă se conectează la indexul OZnzb." #~ msgid "Enable OZnzb Integration" #~ msgstr "Activează Integrarea OZnzb" #~ msgid "Refer to https://www.oznzb.com/profile" #~ msgstr "Vezi informații în https://www.oznzb.com/profile" #~ msgid "OZnzb" #~ msgstr "OZnzb" sabnzbd-develop/po/main/nb.po0000600000175000017500000042261713642116632014252 0ustar jpjp# Norwegian Bokmal translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2018-02-14 14:18+0000\n" "Last-Translator: Safihre \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:02+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Kunne ikke starte webgrensesnittet" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "Kan ikke finne webmal: %s, prøver standardmal" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" "SABYenc deaktivert: Fant ikke korrekt versjon! (Fant v%s, forventet v%s)" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" "SABYenc modul... IKKE funnet! Forventet v%s - https://sabnzbd.org/sabyenc" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "par2-binærfil... IKKE funnet!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "MultiPar-binærfil... IKKE funnet!" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "Verifikasjon og reparasjon vil ikke være mulig." #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "Din Unrar-versjon er %s, vi anbefaler versjon %s eller høyere.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "unrar-binærfil... IKKE funnet!" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "unzip-binærfil... IKKE funnet!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "7za-binærfil... IKKE funnet!" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Husk at vertsnavnet 0.0.0.0 krever en IPv6-adresse for ekstern tilgang" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "HTTP og HTTPS-portene kan ikke være det samme" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" "SABnzbd ble startet med koding %s, dette burde være UTF-8. Forvent problemer " "med Unicode filer- og katalognavn i nedlastinger." #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "Deaktiverte HTTPS pÃ¥ grunn av manglende CERT- og KEY-filer." #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Kunne ikke starte webgrensesnittet: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "Kan ikke nÃ¥ SABHelper-tjenesten" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s startet" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Advarsel" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Feil" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "SABnzbd er nÃ¥ avsluttet" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Du har ikke stilt inn vertsnavn." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "Ingen tilkoblinger er aktivert. Du mÃ¥ aktivere minst en tilkobling." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Passordet er skjult med ******, prøv igjen" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Ugyldige server-innstillinger" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "Tidsavbrudd: Prøv Ã¥ aktivere SSL eller bruk en annen port." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Tidsavbrudd" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" "Ukjent SSL-protokoll: Prøv Ã¥ deaktivere SSL eller koble til pÃ¥ en annen port." #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Ugyldig server-adresse." #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Server avbrøt undet innloggingssekvens" #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Server krever brukernavn og passord." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Tilkobling lyktes!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Godkjenning mislyktes, kontroller brukernavn og passord." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "For mange tilkoblinger, sett nedlasting pÃ¥ pause eller prøv igjen senere" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Kunne ikke koble til (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Signal %s mottatt, lagrer og avslutter..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Kritisk feil ved lagring av tilstand" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Forsøker Ã¥ hente NZB fra %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Lagring av %s mislyktes" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Kan ikke lage midlertidig fil for %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Forsøker Ã¥ sette status pÃ¥ ikke-eksisterende server %s" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Feil i tempfil.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Lasting av %s mislyktes" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "E-post sendning lykkes" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Test varslingen" #: sabnzbd/api.py msgid " Resolving address" msgstr " Løs adresse" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Standard" #: sabnzbd/api.py msgid "unknown" msgstr "ukjent" #: sabnzbd/api.py [Error message] 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..." #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Diskfeil under opprettelse av fil %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Kritisk feil i Assembler" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Avbrutt, kryptering funnet" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "ADVARSEL: I \"%s\" uønsket filtype i RAR fil. Uønsket fil er %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "Uønsket forlenging finnes i rar fil %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Avbryt, uønsket forlenging oppdaget" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "ADVARSEL: Pauset jobb \"%s\" grunnet rangeringen (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "ADVARSEL: Avbrøt jobb \"%s\" grunnet rangering (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Avbrøt, rangeringsfilter var lik (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s mangler" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "video" #: sabnzbd/assembler.py msgid "audio" msgstr "lyd" #: sabnzbd/assembler.py msgid "spam" msgstr "søppel" #: sabnzbd/assembler.py msgid "passworded" msgstr "passordbeskyttet" #: sabnzbd/assembler.py msgid "downvoted" msgstr "nedstemt" #: sabnzbd/assembler.py msgid "keywords" msgstr "nøkkelord" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Kvote oppbrukt, setter nedlasting pÃ¥ pause" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s er ikke en godkjent e-post-adresse" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Krever server-adresse" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Kan ikke opprette %s mappe %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Kan ikke skrive til INI-fil %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Kan ikke sikkerhetskopiere fil %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Feil kodet passord %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s er ikke en korrekt oktal verdi" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "UNC-sti \"%s\" er ikke tillatt her" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Feil: Fillengde bør være kortere enn %s." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Feil: Køen er ikke tom, kan ikke bytte mappe." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "Kan ikke skrive til historikkdatabase, sjekk filrettigheter" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "Skadet historikkdatabase, opprettet ny database" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "SQL-kommando mislyktes, se logg" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "Kunne ikke stenge databasen, se logg" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Ugyldig scenen logging i historien for %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Dekoding av %s mislyktes" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Feilaktigt utformet yEnc artikkel i %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Ukjent feil oppstod under dekoding av %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => mangler pÃ¥ alle servere, fjerner" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Ferdig" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "Utpakket %s filer/mapper pÃ¥ %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [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] msgid "Error while adding %s, removing" msgstr "Kunne ikke legge til %s, tar bort" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Feil ved fjerning av %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Kan ikke lese den overvÃ¥kede mappen %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Gjenopptar" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "Pauset" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Du mÃ¥ sette maks bÃ¥ndbredde før du kan sette en bÃ¥ndbreddebegrensning" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Kan ikke koble til server %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Kunne ikke finne servernavn" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Server %s vil bli ignorert i løpet av %s minutter" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Feilet Ã¥ starte %s@%s grunnet: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "For mange tilkoblinger til server %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Mistenkt kontodeling" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Kunne ikke logge inn pÃ¥ server %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Kontaker %s@%s feilet, feilmelding=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Server %s krever brukernavn/passord" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Mistenker feil i nedlaster" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Starter avslutning av SABnzbd.." #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Kunne ikke koble til mailserver" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "Kunne ikke starte TLS-tilkobling" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "Serveren svarte ikke ordentlig til helo hilsen" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Autentisering mot mailserveren mislyktes" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Ingen passende autentiseringsmetode ble funnet" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Ukjent godkjenningsfeil i e-postserveren" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Kunne ikke sende e-post" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Kunne ikke stenge e-post-tilkobling" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Ingen mottaker oppgitt, e-post ikke sendt" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd rapporterer at disken er full\n" "\n" "Hei,\n" "\n" "SABnzbd har stoppet all nedlasting da lagringsdisken nesten er full.\n" "Frigjør mer diskplass og gjenoppta nedlasting manuelt.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Kan ikke opprette mappe %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "%s mappe: %s tilgang mislyktes" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Kunne ikke endre rettigheter pÃ¥ %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Opprettelse av (%s) mislyktes" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Kunne ikke flytte %s til %s" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "Bruker logget inn i webgrensesnitt" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "Bruker pÃ¥logget" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Mangler sesjonsnøkkel" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Feil: Krever sesjonsnøkkel" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Feil: Feil sesjonsnøkkel" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "API-nøkkel mangler, skriv inn API-nøkkelen fra Konfigurasjon->Generelt i " "ditt tredjepartsprogram:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "API-nøkkel er feil, bruk API-nøkkel fra Konfigurasjon->Generelt i ditt " "tredjepartsprogram:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Autentisering mangler, angi brukernavn/passord fra Konfigurasjon->Generelt i " "ditt tredjepartsprogram:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Prøv vÃ¥r nye skin Glitter! Nytt og friskt design som er optimalisert for " "stasjonære og mobile enheter. GÃ¥ til Konfig -> Generelt for Ã¥ endre ditt skin" #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "Mislykket pÃ¥loggingsforsøk fra %s" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
SABnzbd er avsluttet.
Vent rundt 5 sekunder og klikk " "deretter på knappen under.

Last på " "nytt
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Advarsel: LOCALHOST er tvetydig, bruk numerisk IP-adresse." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "Serveradressen \"%s:%s\" er ikke gyldig." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "RSS-kilde" #: sabnzbd/interface.py msgid "Daily" msgstr "Daglig" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "Mandag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Tirsdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Onsdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Torsdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Fredag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Lørdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Søndag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "av" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Udefinert server!" #: 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 msgid "Back" msgstr "Tilbake" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "FEIL:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Feil verdi for %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "d" #: sabnzbd/misc.py msgid "h" msgstr "h" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Kunne ikke lage SSL-nøkkel eller sertifikat." #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Kjører skript" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Etterbehandling ble avbrutt (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Skript" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Utpakking nestet for dypt [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Slår sammen filer" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Ufullstendig sekvens av oppdelte filer" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Filsammenslåing av %s mislyktes" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Feil \"%s\" under filsammenslåing" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Feil \"%s\" under kjøring av file_join på %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] Slår sammen %s filer" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Utpakking mislyktes, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Feil \"%s\" under utpakking av RAR fil(er)" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Feil \"%s\" under kjøring av rar_unpack på %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Fjerning av %s mislyktes!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Prøver unrar med passord \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Utpakking mislyktes, arkivet krever passord" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Utpakker" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Utpakking" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Utpakking mislyktes, kunne ikke finne %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "FEIL: kunne ikke finne \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Utpakking mislyktes, CRC-feil" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "FEIL: CRC mislyktes i \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "Utpakking feilet, filen er for stor for filsystemet (FAT?)" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "FEIL: Filen er for stor for filsystemet (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "Utpakking mislyktes, skrivefeil eller er disken full?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "FEIL: skrive feil (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Utpakking feilet, stien er for lang" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "FEIL: sti er for lang (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Ubrukelig RAR-fil" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s filer på %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Feil \"%s\" under kjøring av unzip() på %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Prøver 7zip med password \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "7ZIP set \"%s\" er ikke komplett, kan ikke pakke ut" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Kunne ikke pakke ut %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Hurtigkontrollerer" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Reparerer" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Hurtigkontroll OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Starter reparasjon" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Reparasjon mislyktes, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Feil %s under kjøring av par2_repair på %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Feil \"%s\" under kjøring av par2_repair på %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2 mottok feil kommandoer, undersøk brytere i Konfigurasjon->Brytere" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Verifiseing tok %s, alle filer er ok" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Verifisering tok %s, krever reparasjon" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Henter %s blokker..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Henter" #: 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 msgid "Repairing" msgstr "Reparerer" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Reparert på %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Harddisken er full" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Verifiserer" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Undersøker" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Denne serveren tillater ikke SSL på denne porten" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Oppstart/avsluttning" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "La til NZB-fil" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Etterbehandling startet" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Jobb fullført" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Jobb mislyktes" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Køen er ferdig" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Andre meldinger" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "Ikke tilgjengelig" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Klarte ikke å sende Prowl melding" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Ukorrekt svar fra Pushover (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "Klarte ikke å sende pushover-melding" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Ukorrekt svar fra Pushbullet (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Klarte ikke å sende pushbullet-melding" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "Klarte ikke å sende Windows melding" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Kunne ikke importere %s filer fra %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Feilaktig kø-fil funnet, kan ikke fortsette" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Lastingsfeil %s, feilaktig fil oppdaget" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB er lagt til i køen" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Ukjent koding" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Ufullstendig NZB-fil %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Feilaktig NZB fil %s, hopper over (årsak=%s, linje=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Tom NZB-fil %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Ignorerer duplikatfil \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Stanser duplikatfil \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Avbrutt, kan ikke fullføres" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DUPLIKAT" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "KRYPTERT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "FOR STOR" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "UFULLSTENDIG" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "UØNSKET" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "FILTRERT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "VENT %s sek" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Hentet filer på %s med gjenomsnitts hastighet på %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Tid" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s artikler var korrupte" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s artikler manglet" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s artikler hadde ulike duplikater" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s artikler ble slettet" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Kunne ikke importere %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Advarsler" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Ledig" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Konfigurasjon" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Kø" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Slett kø" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Historikk" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Slett historikk" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Hastighetsbegrensning" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Stans midlertidig" #: sabnzbd/osxmenu.py msgid "min." msgstr "min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Gjenoppta" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Sjekk overvåkingsmappe" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Les alle RSS-kanaler" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Ferdig mappe" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Ufullstendig mappe" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Feilsøking" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Starte på nytt" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Restart uten å logge inn" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Avslutte" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Kø (10 første)" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Tom" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Historikk (10 siste)" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Ny utgave er tilgjengelig" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Gå til guiden" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Avslutter..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Problem med" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd trenger en ledig TCP/IP-port for sin interne webserver.
\n" " Port %s på %s ble forsøkt brukt, men er utilgjengelig.
\n" " Enten er porten allerede i bruk av et annet program, eller så kjører " "SABnzbd fra før av.
\n" "
\n" " Start SABnzbd på nytt med et annet portnummer." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "Prøv et annet nummer hvis du får denne feilmeldingen på nytt.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd krever en gyldig adresse for sin interne webserver.
\n" " Du har spesifisert en ugyldig adresse.
\n" " Korrekte verdier er localhost og 0.0.0.0
\n" "
\n" " Vennligst start SABnzbd på ny med en gyldig adresse." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd oppdaget instillinger fra en annen SABnzbd-versjon
\n" " men kan ikke bruke disse.

\n" " Kanskje vil du fullføre nedlastingskøen i det gamle programmet " "først?

\n" " Etter det kan du starte dette programmet med \"--clean\"-" "parameteren.
\n" " Dette vil slette nedlastingskø og historie!
\n" " SABnzbd leste filen \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd kan ikke finne filene for webgrensesnittet i %s.
\n" " Vennligst installer programmet på nytt.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd oppdaget en kritisk feil:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd oppdaget at filen sqlite3.dll is mangler.

\n" " Enkelte antivirus-programmer fjerner denne filen.
\n" " Vennligst sjekk ditt antivirusprogram og forsøk å installer SABnzbd på " "nytt.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Trykk Start+R og skriv inn linjen (eksempel):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Åpne et terminalvindu og skriv inn linjen (eksempel):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Programmet startet ikke!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "Kritisk feil" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Kan ikke starte webserveren, ble sannsynlig vis ikke funnet" #: sabnzbd/panic.py msgid "Access denied" msgstr "Ingen tilgang" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Feil %s: Du må oppgi et gyldig brukernavn og passord." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "Gammel kø oppdaget. Bruk Status -> Reparer for å konvertere køen" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" 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" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Nedlastning feilet - Finnes ikke på din(e) server(e)" #: sabnzbd/postproc.py msgid "Moving" msgstr "Flytter" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "Sendte %s til køen" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Kunne ikke endre navn fra \"%s\" til \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Klarte ikke å flytte filer" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Kjør brukerskript %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "Kjørte i %s" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Skript-avsluttingskode er %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Mer" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Etterbehandling mislyktes for %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "se loggfil" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Nedlasting mislyktes" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Rensning av %s mislyktes" #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Nedlasting ferdig" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Kan ikke opprette mappe %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Etterbehandling" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Ingen par2 deler" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Prøver SFV-verifisering" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Some files failed to verify against \"%s\"" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Verifisering med SFV-filer var vellykket" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Passord" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Fjerning av %s mislyktes" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Dvalemodus feilet" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Kunne ikke sette systemet i ventemodus" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Feil under avslutting av systemet" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Fant ikke indekser id (%s) for rangeringsfil." #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Tjeneradresse" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "API-nøkkel" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Feilaktig RSS-kilde beskrivelse \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Kunne ikke hente RSS-kilde fra %s: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Ugyldig autentisering for nyhetsstrøm %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "Serverside-feil (serverkode %s); kunne ikke hente %s på %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Server %s bruker et usikkert HTTP sertifikat" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "RSS-kilde %s var tom" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Ukompatibel nyhetsstrøm" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Tom RSS post funnet (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Vis grensesnitt" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Åpne fullført mappe" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Pause for" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Pause 5 minutter" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Pause 15 minutter" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Pause 30 minutter" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Pause 1 time" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Pause 3 timer" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Pause 6 timer" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Avslutt" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Gjenstår" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Legg til NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Feil skjema %s ved %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Ukjent handling: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Skjema for ikke eksisterende server %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Nedlastning" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Slå sammen filer" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Kilde" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Servere" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Feil" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Mislyktes" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Venter" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Reparerer..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Trekker ut..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Flytter..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Kjører skript..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Henter ektra blokk..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Hurtigkontroll..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Verifserer..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Laster ned" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Oppgave" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "Deaktiver server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "Aktiver server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Hastighetsgrense" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Pause Allt" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Pause etterbehandling" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Gjenoppta etterbehandling" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Les RSS-kilde" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Fjerne mislykkede jobber" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Fjern ferdige jobber" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Pause jobber med lav prioritet" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Pause jobber med normal prioritet" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Pause jobber med høy prioritet" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Gjenoppta jobber med lav prioritet" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Gjenoppta jobber med normal prioritet" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Gjenoppta jobber med høy prioritet" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Aktiver kvotebegrensninger" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Av" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Veldig lav" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Moderer" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normal" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Høy" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Nødssituasjon" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Lav" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "time" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "timer" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "minutt" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "minutter" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "sekund" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "sekunder" #: sabnzbd/skintext.py msgid "day" msgstr "dag" #: sabnzbd/skintext.py msgid "days" msgstr "døgn" #: sabnzbd/skintext.py msgid "week" msgstr "uke" #: sabnzbd/skintext.py msgid "Month" msgstr "Måned" #: sabnzbd/skintext.py msgid "Year" msgstr "År" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Dag i måneden" #: sabnzbd/skintext.py msgid "This week" msgstr "Denne uken" #: sabnzbd/skintext.py msgid "This month" msgstr "Denne måneden" #: sabnzbd/skintext.py msgid "Today" msgstr "I dag" #: sabnzbd/skintext.py msgid "Total" msgstr "Totalt" #: sabnzbd/skintext.py msgid "on" msgstr "på" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parametere" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Python-versjon" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Startside" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "eller" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Adresse" #: sabnzbd/skintext.py msgid "Comment" msgstr "Kommentar" #: sabnzbd/skintext.py msgid "Send" msgstr "Send" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Avbryt" #: sabnzbd/skintext.py msgid "Other" msgstr "Andre" #: sabnzbd/skintext.py msgid "Report" msgstr "Rapport" #: sabnzbd/skintext.py msgid "Video" msgstr "Video" #: sabnzbd/skintext.py msgid "Audio" msgstr "Lyd" #: sabnzbd/skintext.py msgid "Not used" msgstr "Ubrukt" #: sabnzbd/skintext.py msgid "or less" msgstr "eller mindre" #: sabnzbd/skintext.py msgid "Log in" msgstr "Logg på" #: sabnzbd/skintext.py msgid "Log out" msgstr "Logg av" #: sabnzbd/skintext.py msgid "Remember me" msgstr "Husk meg" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "Det automatiske usenet nedlastnings verktøyet" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Lagre" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Lagrer.." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Er du sikker?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Slett alle nedlastninger?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Hjem" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Konfigurasjon" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Status" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Hjelp" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Forum" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Generelt" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Mapper" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Svitsjer" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Nedlastingsplan" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Varsler" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "E-Post" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Kategorier" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Sortering" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Spesiell" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Søk" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Midlertidig nedlastingsmappe" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "Pause" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "Lagret %s artikler (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Systemlast" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Ny utgave %s tilgjengelig" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Er sikker på at du vil slå av SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Legg-til" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Legg til fil" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Kategori" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Bearbeidinger" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Prioritet" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Reparere" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Pakker opp" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Fjern" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "P" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "T" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Tving" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Stopp" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "Når køen er ferdig" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Slå av PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "Ventemodus PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Dvalemodus PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Avslutning av SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Hastighetsgrense" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Sortering" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Navn" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "Tid igjen" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "Alder" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Fjern" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Prøv igjen" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Hendelser" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Skripts" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Slett alt fra køen?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Slett NZB-filer" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Slett NZB & tilhørende filer" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Prøv alle mislykkede jobber på nytt" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Fjern NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Fjern NZB & slett filer" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "av" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Manglende artikler" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Gjenværende kvote" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "manuelt" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Nullstill kvote nå" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Slett alle fullførte nedlastinger fra historie?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Skjul detaljer" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Vis detaljer" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Vis Mislykkede" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Vis alle" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Størrelse" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Fjern Mislykkede NZBer" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Fjern Mislykkede NZBer & Slett Filer" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Fjern Ferdige NZBer" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "Alternativ tilleggs NZB" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Snarvei" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Prøv alle mislykkede på nytt" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Prøv alle på nytt" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "" "Det du prøver å laste ned er eldre enn hva usenet leverandøren din har lagret" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Andre problemer" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Tving frakobling" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Dette vil sende en test e-post til din konto." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Logg" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Test E-post" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Logging" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Feil/Advarsel" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Info" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Feilsøking" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Tilkoblinger" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Seneste Advarsler" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "slette" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Fjern blokkering" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Artikkel-id" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Filsett" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Når" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Type" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Aktivert" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Kontrollpanel" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Tilkobling mislykket!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Lokal IPv4-adresse" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Offentlig IPv4 adresse" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "IPv6-adresse" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Navnserver / DNS oppslag" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "CPU-modell" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Systemytelse (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Nedlastingsmappe-hastighet" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Ferdig mappe-hastighet" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Skrivehastighet" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "Kunne ikke skrive. Sjekk skrive rettigheter til mappen." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Klikk på gjenta test knappen under for å bestemme." #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Gjenta test" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "Konfig fil" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Brukt hurtigbuffer" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Dette vil starte om SABnzbd.
Brukes når du tror programmet er " "ustabilt.
Nedlastning vil bli satt på pause før omstarten og gjenoppta " "etterpå." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Det finnes foreldreløse jobber i nedlastningsmappen.
Du kan velge å " "slette disse (filene vil også bli slettet) eller sende dem tilbake i " "nedlastningskøen." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Endringer som ikke er lagret vil gå tapt." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Aktiver Unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "Aktiver 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "Versjon" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Oppetid" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Sikkerhetskopi" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Les Wiki Help fer dette!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Starter SABnzbd på nytt..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Endringer krever omstart av SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "SABnzbd Webbserver" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "SABnzbd Adresse" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Adressen som SABnzbd skal bruke." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "SABnzbd-port" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Porten som SABnzbd skal bruke." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Webgrensesnitt" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Velg et skall." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "SABnzbd Brukernavn" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Kan velge autentiserings brukernavn." #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "SABnzbd Passord" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "HTTPS Aktivere" #: sabnzbd/skintext.py msgid "not installed" msgstr "(ikke installert)" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Aktiverer tilgangen til webgrensesnittet med HTTPS adresse." #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "HTTPS-port" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Om tom, så vil standardporten bare lytte til HTTPS" #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "HTTPS Sertifikat" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Filnavn eller søkesti til HTTPS Sertifikat." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "HTTPS Nyckel" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Filnavn eller søkesti til HTTPS Nøkkel." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "HTTPS-lenke sertificater" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Filnavn eller sti til HTTPS-lenke" #: sabnzbd/skintext.py msgid "Tuning" msgstr "Justeringer" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "RSS Oppdateringsintervall" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Sjekk intervall (i minutter, minst 15). Ikke aktiv når du bruker " "nedlastingsplan!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Maks linje-hastighet" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Prosent av linjehastighet" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "Hvor mange prosent av linjehastigheten skal SABnzbd bruke, feks. 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Cachestørrelse for artikkler" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Lagrer artikler i minnet for å redusere diskaktivitet.
I bytes, " "fulgt av K,M,G. For eksempel: \"64M\" eller \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Rens liste" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Liste over filtyper som skal slettes etter nedlasting.
For eksempel: " "nfo eller nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Lagre endringer" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "" #: sabnzbd/skintext.py msgid "Reset" msgstr "Nullstill" #: sabnzbd/skintext.py msgid "Language" msgstr "Språk" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Velg språket til Webgrensesnittet." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "Denne nøkkelen vil gi tredjepartsprogrammer full tilgang til SABnzbd" #: sabnzbd/skintext.py msgid "NZB Key" msgstr "NZB-nøkkel" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Denne nøkkelen vil gi tredjepartsprogrammer lov til å legge til NZBer til " "SABnzbd" #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Generer Ny Nøkkel" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "API-nøkkel QR-kode" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Liste over lokale nettverksområder" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Alle lokale nettverksadresser starter med disse prefix (ofte \"192.168.1.\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Ekstern internettilgang" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "Ingen tilgang" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Legg til NZB filer " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (Ingen konfigurasjon)" #: sabnzbd/skintext.py msgid "Full API" msgstr "Full API" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Fullt webgrensesnitt" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "OBS: Mapper kommer til å bli opprettet automatiskt når du Lagrer. " "Du må angi korrekte søkestier til din mapper for å kunne lagre utenfor " "standardmappene." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Brukermapper" #: sabnzbd/skintext.py msgid "Browse" msgstr "Bla gjennom" #: sabnzbd/skintext.py msgid "In" msgstr "Hvor:" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Midlertidig nedlastingsmappe" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Plass for å lagre ikke bearbeidede nedlastinger.
Kan kun endres når " "køen er tom." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Minimal fri plass for midlertidig nedlastingsmappe" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Auto-pause når fri plass er nærme grensen.
I bytes, fulgt av " "K,M,G,T. For eksempel: \"800M\" eller \"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Ferdig nedlastingsmappe" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Plass for å lagre bearbeidede og ferdige nedlastinger.
Kan " "overstyres av brukerdefinerte kategorier." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Rettigheter for ferdige nedlastinger" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Sett rettigheter for ferdige filer og mapper.
Bruk tall. For " "eksempel: \"755\" or \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Overvåket Mappe" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Mappe som automatiskt søkes igjennom etter .nzb filer.
Skanner også " "igjennom .zip .rar og .tar.gz arkiver etter .nzb filer." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Skanningsintervall for Overvåkede mappar" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Sekunder mellom skanninger for .nzb filer." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Mappe for E-post maler" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Mappe som inneholder brukerdefinerte e-post maler." #: sabnzbd/skintext.py msgid "Password file" msgstr "Passordfil" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Fil som inneholder alle passordene som skal forsøkes på krypterte RAR filer." #: sabnzbd/skintext.py msgid "System Folders" msgstr "Systemmapper" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Administrativ Mappe" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Lokasjon for køadmin og historikkdatabase.
Kan bare endres når køen " "er tom." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "Data vil ikke bli flyttet. Krever SABnzbd restart!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Loggmappe" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Plass for lagrede loggfiler fran SABnzbd.
Krever omstart av " "SABnzbd!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr ".nzb Reservemappe" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Plass der .nzb filer lagres." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Standard base filsti" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Last ned alle par2 filer" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Aktiver rekursiv utpakking" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Pakk ut arkiver (rar, zip, 7z) inne i arkiver" #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Ignorer alle mapper inne i arkiver" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Alle filer vil bli lagt til samme mappe" #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Bara artiklene fra begynnelsen av køen" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Aktiveres for mindre minneforbruk. Deaktiver for å forhindre langsom jobb da " "køen blokkeres." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Etterbehandle kun verifiserte nedlastinger" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "Etterbehandle kun nedlastinger som har passert PAR2 kontrollen." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Reaksjon når kryptert RAR fil lastes ned" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "I tilfelle \"Pause\", så trenger du å sette et passord og gjenoppta jobben." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Oppdag duplikatnedlastinger" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Oppdag duplikat episoder i serie" #: sabnzbd/skintext.py 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 "Forkast" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Avbryt" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Handling når uønsket filtype oppdaget" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "Handling når uønsket filtype blir oppdaget i RAR filer." #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Uønsket filtyper" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Skriv alle uønskende filtyper. For eksempel: exe eller exe, " "com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Aktiver SFV-baserte sjekker" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Utfør ekstra verifisering basert på SFV filer" #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Brukerskript kan flagge jobb som mislykket" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Når brukerskriptet returnerer en ikke-null exit kode, vil jobben bli flagget " "som mislykket." #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "Når den feiler, prøv alternativ NZB-fil" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "Noen servere vil gi en alternativ NZB når en nedlasting mislykkes." #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Aktiver omdøping av mappe" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Bruk midlertidige navn under postprosessering. Deaktiver når systemet ditt " "ikke håndtere dette skikkelig." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Før-kø bruker skript" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Brukes før en NZB blir lagt til kø" #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Ekstra PAR2 parametere" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Nice parametere" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "IONice parametere" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Koble fra når køen er tom" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "Kople fra usenet serverne når køen er tom eller pauset." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Sortere etter alder" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Sortere automatisk etter(midt) alder." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Se etter ny utgave" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Se etter ny utgave av SABnzbd hver uke." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "Også nye utgivelser" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Erstatt mellomrom i mappenavn" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Erstatt mellomrom med understrek i mappenavn." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Erstatt punktum i mappenavn" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Erstatt punktum med mellomrom i mappenavn" #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Gjør Windows-kompatibel" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "For servere: sørg for at navn er kompatibel med Windows." #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Starter webleseren ved oppstart" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Starter standard webleser når SABnzbd starter." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Pause nedlasting under etterbehandling" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Pauser nedlasting når etterbehandling begynner og gjenopptar nedlasting når " "etterbehandling er ferdig." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Ignorer Sample-filer" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Filtrere ut sample-filer (ex. video samplinger)." #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Fjern etter nedlasting" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" #: sabnzbd/skintext.py msgid "Server" msgstr "Server" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Postprosessering" #: sabnzbd/skintext.py msgid "Naming" msgstr "Filnavn" #: sabnzbd/skintext.py msgid "Quota" msgstr "Kvote" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indeksering" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Hvor mye can lastes ned denne måneden (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Nullstillingsdag" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "På hvilken dag i måneden eller uken (1=mandag) resetter til nettilbyder " "kvoten? (Valgfritt med tt:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Gjenoppta automatisk" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "Skal nedlasting starte på nytt etter at kvoten er resatt?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Kvoteperiode" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "Blirkvoten resatt hver dag, uke, eller måned?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Sjekk før nedlasting" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Prøve å beregne om ferdigstillelse er mulig før selve nedlastingen (tregere!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "Maksimum antall forsøk" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Maksimum antall forsøk per server" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Avbryt jobber som ikke kan fullføres" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Avbryt jobben om det blir klart under nedlasting at for mye data mangler" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Aktiver filtrering" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Bruk nedlastinghandlinger ifølge filtreringsreglene." #: sabnzbd/skintext.py msgid "Abort If" msgstr "Avbryt Hvis" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Ellers Pause Hvis" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Video-rangering" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Audio-rangering" #: sabnzbd/skintext.py msgid "Spam" msgstr "Søppelpost" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Bekreftet" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Flere tommeler ned enn opp" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Tittel-nøkkelord" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Kommaseparert liste" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Nyttig hvis en newsserver har mer enn en IPv4/IPv6-adresse" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Legg til server" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Serverbeskrivelse" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Port" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Brukernavn" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Passord" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Tidsavbrudd" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Tidsrom for liggefrist" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "Deaktivert" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 er høyeste prioritet, 99 er laveste prioritet" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Valgfritt" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Aktivere" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Ta bort server" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Testserver" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Nullstill Tellere" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Tester serverinstillinger..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Båndbredde" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Send gruppe" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Send gruppekommando før du ber om artikler." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Persolige notater" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Legg til nedlastingsplan" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Hyppighet" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Handling" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Argument" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Aktuelle nedlastingsplaner" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Avkrysningsboksen ved kildenavnet må aktiveres for at kilden automatiskt " "skal kontrolleres for nye objekt.
Når en kilde legges til, legges det " "kun til nye objekt(ikke objekt som allerede finnes). Alle objekter i kilden " "vises når du klikker på \"Tving nedlastning\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Les kilde" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Tving nedlasting" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filter" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Akseptere" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Avvise" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Krever" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "KreverKat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Minst" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Høyst" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "Fra SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Like" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Ingen treff" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Nedlastet" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Les alle kilder nå" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "E-Post varsling når nedlasting er ferdig" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Aldri" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Alltid" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Bara ved feil" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Full harddisk varsling" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "Send e-post når harddisken er full og SABnzbd har pauset." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Send RSS varsler" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "Send e-post nå en RSS feed legger til en nedlasting til køen." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "SMTP-tjener" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Still inn din ISP's server for utgående e-post." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "E-post mottaker" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "E-post adresse til mottaker." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "E-post avsender" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Hvem skal vi sende e-posten fra?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "VALGFRITT Brukernavn" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Brukernavn for e-post som krever autentisering." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "VALGFRITT Passord" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Passord for e-post som krever autentisering." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Varsel sendt!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Aktiver Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Brukes kun for fjerntliggende Growl tjener (vert:port)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Passord for tjener" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Valgfritt passord for Growl tjener" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "Aktiver NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Varselsenter" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Windows-varslinger" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Aktiver Windows-varslinger" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Aktiver Prowl-varslinger" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Krever en Prowl-konto" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "API-nøkkel for Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Personlig API-nøkkel for Prowl (påkrevd)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Aktiver Pushover-varslinger" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Krever en Pushover-konto" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Program-token" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Program-token (påkrevd)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Brukernøkkel" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Brukernøkkel (påkrevd)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Enhet(er)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Aktiver Pushbullet-varslinger" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Krever en Pushbullet-konto" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Personlig API-nøkkel" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Din personlige Pushbullet API-nøkkel (påkrevd)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Enhet" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Enheten meldingen skal sendes til" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Ved å avslutte filstien med en asterisk * vil arbeidsmapper ikke bli " "opprettet" #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Relative mapper er basert på" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Mappe/Søkesti" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Seriesortering" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Aktiverer TV sortering" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Hjelp til Sorteringsstreng" #: sabnzbd/skintext.py msgid "Clear" msgstr "Rens" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "For innstillinger" #: sabnzbd/skintext.py msgid "Example" msgstr "Eksempel" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Aktiver filmsortering" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "La nedlastningen i ekstramappe være" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Påvirkede kategorier" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Betyr" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Mønster" #: sabnzbd/skintext.py msgid "Result" msgstr "Resultat" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Sesongmappe" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Sesongmappe" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Episodemappe" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 Episodemappe" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "" #: sabnzbd/skintext.py msgid "Title" msgstr "Tittel" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Film Navn" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Film.Navn" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Film_Navn" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Show Navn" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Show.Navn" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Show_Navn" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Sesongnummer" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Episodenummer" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Episodenavn" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Episode.Navn" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Episode_Navn" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Filendelse" #: sabnzbd/skintext.py msgid "Extension" msgstr "endelse" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Delnummer" #: sabnzbd/skintext.py msgid "Decade" msgstr "Titall" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Originalfilnavn" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Små bokstaver" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEKST" #: sabnzbd/skintext.py msgid "text" msgstr "tekst" #: sabnzbd/skintext.py msgid "file" msgstr "fil" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Sorteringsstreng" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Multi-del etikett" #: sabnzbd/skintext.py msgid "In folders" msgstr "I mappe" #: sabnzbd/skintext.py msgid "No folders" msgstr "Ingen mappe" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Dato sortering" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Aktiver datosortering" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Vis Navn på mappe" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "År-Måneds mapper" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Daglige mapper" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "justert for store og små bokstaver" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Prosesser resultat" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Sjeldent brukte valg. for å finne forklaring og betydning, klikk på " "hjelpknappen for å gå til Wiki siden.
Ikke endre på disse uten å sjekke " "Wiki først, siden noen av dem har alvorlige bieffekter.
Standardverdiene " "står i parantes." #: sabnzbd/skintext.py msgid "Values" msgstr "Verdier" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Endre NZB detaljer" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Fjern" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Topp" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Opp" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Ned" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Bunn" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Alle" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Invertere" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Filnavn" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Emvne" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Utvalg" #: sabnzbd/skintext.py msgid "left" msgstr "gjenstår" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Ledig plass" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Midlertidig Mappe" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Multioperasjoner" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Hold shift-tasten for å velge et område" #: sabnzbd/skintext.py msgid "Check all" msgstr "Merk alle" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Start SABnzbd på nytt" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Status og grensesnittalternativer" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Eller dra og slipp filer i vinduet!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Mistet tilkobling til SABnzbd.." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Oppdateringsfrekvens" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Bruk globale grensesnittinnstillinger" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Kø-grense" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Historikk-grense" #: sabnzbd/skintext.py msgid "Date format" msgstr "Datoformat" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Ekstra kø-kolonne" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "" #: sabnzbd/skintext.py msgid "page" msgstr "side" #: sabnzbd/skintext.py msgid "Loading" msgstr "Laster" #: sabnzbd/skintext.py msgid "articles" msgstr "artikler" #: sabnzbd/skintext.py msgid "Rename" msgstr "Endre navn" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Reparer Kø" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Vis aktive tilkoblinger" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Etterlatte jobber" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Send tilbake til kø" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Ta bort alle" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Prøv alle på nytt" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Hent NZB fra URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "Last opp NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Valgfritt spesifiser filnavn" #: sabnzbd/skintext.py msgid "Submit" msgstr "Send" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Åpne informasjons-URL" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Sendt. Takk!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Ingenting er valgt!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Fjern alle valgte filer" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Skjul/vis fullførte filer" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Se skriptlogg" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Oppdatering tilgjengelig" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" #: sabnzbd/skintext.py msgid "Custom" msgstr "Tilpasse" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "" #: sabnzbd/skintext.py msgid "Speed" msgstr "Hastighet" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Bekreft Sletting av Kø" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Bekreft Sletting av Historie" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Hvor lenge ønsker du Ã¥ pause? (skriv pÃ¥ engelsk!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Beklager, vi kunne ikke finne ut av det. Prøv igjen." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Pause i..." #: 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 Oldest→Newest" msgstr "Sorter etter alder Eldst→Ny" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Sorter etter alder Ny→Eldst" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Sorter etter navn A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Sorter etter navn Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Sorter etter størrelse Minst→Størst" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Sorter etter størrelse Størst→Minst" #: sabnzbd/skintext.py msgid "Uploading" msgstr "" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "" #: sabnzbd/skintext.py msgid "Removing job" msgstr "" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "" #: sabnzbd/skintext.py msgid "Prev" msgstr "Forrige" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Neste" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "Vil du virkelig slette historikken?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Du mÃ¥ aktivere Javaskript for at Plush skal fungere!" #: sabnzbd/skintext.py msgid "Options" msgstr "Alternativer" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Pause i hvor mange minutter?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Toppmeny" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Ved avslutning" #: sabnzbd/skintext.py msgid "Sort" msgstr "Sortere" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Sorter pÃ¥ Alder (Eldst%rarr;Yngst)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Sorter pÃ¥ Alder (Yngst%rarr;Eldst)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Sorter pÃ¥ Navn (A%rarr;Ã…)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Sorter pÃ¥ Navn (Ã…%rarr;A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Sorter pÃ¥ Størrelse (Minst→Størst)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Sorter pÃ¥ Størrelse (Størst→Minst)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "Vil du virkelig slette køen?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Prøv alle mislykkede jobber i historikken pÃ¥ nytt?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Slett og rydd" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Maks. hastighet" #: sabnzbd/skintext.py msgid "Range" msgstr "Intervall" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Bruk pÃ¥ Valgte" #: sabnzbd/skintext.py msgid "Everything" msgstr "Alt" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Oppdateringsfrekvens" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Kontainer bredde" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "Dette vil hindre oppfrisking av innhold nÃ¥r muspekeren er over køen" #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Blokker oppfrisking nÃ¥r musen svever over" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Last Opp" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Last Opp: .nzb .rar .zip .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Jobb" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Ikke nok diskplass for Ã¥ fullføre nedlastingen." #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Ledig (midlertidig)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "INAKTIV" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Nedlastinger" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "SABnzbd Hurtigstart Guide" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "SABnzbd Versjon" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Forrige" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Serverinstillinger" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Skriv inn opplysningene om din primære usenet leverandør." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Antallet tilkoblinger som er tillatt av din leverandør" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "F.eks 8 eller 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Velges kun om din leverandør tillater SSL-tilkoblinger." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Klikk her for Ã¥ teste serverinstillingene." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Eks." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "Installasjonen er nÃ¥ ferdig!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd kommer nÃ¥ Ã¥ kjøres i bakgrunnen." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "" "SABnzbd kommer ikke til Ã¥ avsluttes om du lukker vinduet eller fanen i " "webleseren." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Det er anbefalt at du lagrer denne siden som et bokmerke for Ã¥ treffe " "SABnzbd nÃ¥r det kjøres i bakgrunnen." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Øvrig hjelp kan du finne pÃ¥ vÃ¥r" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "GÃ¥ til SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "Avslutt SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Start Veiviser" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd kommer HELT UTEN GARANTI.\n" "Dette er fri programvare, og du kan redistribuere det under visse vilkÃ¥r.\n" "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] msgid "Error getting TV info (%s)" msgstr "Kunne ikke hente TV info (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "Kunne ikke endre navn fra: %s til %s" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "Kunne ikke endre navn pÃ¥ lik fil: %s til %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Uautorisert tilgang" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "URLGRABBER KRASJET" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "Feil, Ubrukelig akrivfil" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" 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
" #~ msgstr "Kunne ikke finne noen UNRAR program, utpakking er ikke mulig
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "Kunne ikke finne noen PAR2 program, reparasjon er ikke mulig
" #~ msgid "Initiating restart...
" #~ msgstr "Forbereder omstart...
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "\"%s\" jobber er igjen i køen" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "Nedlasting markert med '*' kommer ikke Ã¥ bli lastet ned automatisk." #~ msgid "Not matched" #~ msgstr "Ulike" #~ msgid "Downloaded so far" #~ msgstr "Nedlastet en sÃ¥ lenge" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Kan ikke koble til registret HKEY_CURRENT_USER." #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Kan ikke Ã¥pne registernøkkel \"%s\"." #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Kunne ikke lese registernøkkel for spesialmapper" #~ msgid "You have no permisson to use port %s" #~ msgstr "Du har ikke tilgang for Ã¥ bruke port %s" #~ msgid "Try again" #~ msgstr "Forsøk igjen" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "pyopenssl modul mangler, vennligst installer den for https tilgang" #~ msgid "Unpacking failed, see log" #~ msgstr "Utpakking mislyktes, se logg" #~ msgid "ERROR: %s" #~ msgstr "FEIL: %s" #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "Mangler forventet fil: %s => unrar feil?" #~ 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 "File %s is empty, skipping" #~ msgstr "Fil %s er tom, hopper over" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "Kunne ikke fjerne nzo fra etterbehandlings køen (id)" #~ msgid "No post-processing because of failed verification" #~ msgstr "Ingen etterbehandling, pÃ¥ grunn av misslykket verifisering" #~ msgid "View script output" #~ msgstr "Vis skript kjøringen" #~ msgid "Error removing workdir (%s)" #~ msgstr "Kunne ikke fjerne arbeidsmappe (%s)" #~ msgid "Queued" #~ msgstr "Satt i kø" #~ msgid "Complete Dir" #~ msgstr "Ferdig nedlastingsmappe" #~ msgid "Download speed" #~ msgstr "Nedlastingshastighet" #~ msgid "WARNINGS" #~ msgstr "ADVARSLER" #~ msgid "Add new downloads" #~ msgstr "Legg til ny nedlasting" #~ msgid " or Report ID" #~ msgstr " eller Rapport ID" #~ msgid "Sort by name" #~ msgstr "Sortere etter navn" #~ msgid "Sort by age" #~ msgstr "Sortere etter alder" #~ msgid "Sort by size" #~ msgstr "Sortere etter størrelse" #~ msgid "Hide files" #~ msgstr "Skjul filer" #~ msgid "Show files" #~ msgstr "Vis filer" #~ msgid "Remain/Total" #~ msgstr "GjenstÃ¥r/Totalt" #~ msgid "History Size" #~ msgstr "Historikk størrelse" #~ msgid "Show Weblogging" #~ msgstr "Weblogg" #~ msgid "Thread" #~ msgstr "TrÃ¥d" #~ msgid "Email Test Result" #~ msgstr "E-post testresultat" #~ msgid "General configuration" #~ msgstr "Generell konfigurasjon" #~ msgid "Secondary Web Interface" #~ msgstr "Endre utseende til Webgrensesnittet." #~ msgid "Activate an alternative skin." #~ msgstr "Aktiver ett alternativt skin." #~ msgid "Web server authentication" #~ msgstr "Webserver autentisering" #~ msgid "HTTPS Support" #~ msgstr "HTTPS Støtte" #~ msgid "Queue auto refresh interval:" #~ msgstr "Automatisk oppdateringsintervall av kø:" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "Oppdateringsintervall av kø-siden (sek, 0= ingen)." #~ msgid "Disable API-key" #~ msgstr "SlÃ¥ av API-nøkkel" #~ msgid "Do not require the API key." #~ msgstr "Ikke krev API-nøkkel." #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "BRUK PÃ… EGET ANSVAR!" #~ msgid "Folder configuration" #~ msgstr "Mappekonfigurasjon" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Etterbehandlings skriptmappe" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "Mappe inneholder skript for etterbehandling." #~ msgid "Switches configuration" #~ msgstr "Parameterkonfigurasjon" #~ msgid "Processing Switches" #~ msgstr "Bearbeider parameter" #~ msgid "Enable Quick Check" #~ msgstr "Aktiver Hurtigsjekk" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Ikke kjør par2 kontroll nÃ¥r filene er 100% korrekte." #~ msgid "Enable Unrar" #~ msgstr "Aktiver Unrar" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Aktiverer den innbyggde Unrar funksjonen." #~ msgid "Enable built-in unzip functionality." #~ msgstr "Aktiverer den inbyggde Unzip funktionen." #~ msgid "Enable Filejoin" #~ msgstr "Aktiver FilsammenslÃ¥ing (Filejoin)" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "SlÃ¥r sammen filer med filendelsene .001, .002 etc. til en fil." #~ msgid "Enable TS Joining" #~ msgstr "Aktiver TS SammenslÃ¥ing (TS Joining)" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "SlÃ¥r sammen filer med filendelsene .001.ts, .002.ts etc. til en fil." #~ msgid "Enable Par Cleanup" #~ msgstr "Aktiver Par rensing (Par Cleanup)" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Renser bort par filer (om verifisering/reperasjon var vellykket)." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Ved feil pÃ¥ yEnc CRC" #~ msgid "Default Post-Processing" #~ msgstr "Standard etterbehandling" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "Brukes nÃ¥r etterbehandlingen er bestemt etter kategori." #~ msgid "Default User Script" #~ msgstr "Standard brukerskript" #~ msgid "Used when no user script is defined by the category." #~ msgstr "Brukes nÃ¥r brukerskript er bestemt etter kategori." #~ msgid "Default Priority" #~ msgstr "Standard prioritet" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Brukes nÃ¥r ingen prioritet er bestemt av kategori." #~ msgid "Enable MultiCore Par2" #~ msgstr "Aktiver MultiCore Par2" #~ msgid "Other Switches" #~ msgstr "Andre parametre" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Erstatt ulovlige tegn i mappenavn." #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "Erstatt ulovlige tegn i mappenavn med tilsvarende tegn(ellers fjernes de)." #~ msgid "Do not download" #~ msgstr "Last ikke ned." #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "Bruk V23 om ikke din leverandør krever noe annet!" #~ msgid "Server configuration" #~ msgstr "Serverkonfigurasjon" #~ msgid "Backup server" #~ msgstr "Reserve server" #~ msgid "Click below to test." #~ msgstr "Klikk nedenfor for Ã¥ teste." #~ msgid "Scheduling configuration" #~ msgstr "Nedlastingsplan konfiguration" #~ msgid "Remove" #~ msgstr "Fjern" #~ msgid "RSS Configuration" #~ msgstr "RSS-konfigurasjon" #~ msgid "Delete Feed" #~ msgstr "Fjern feed" #~ msgid "Email Options" #~ msgstr "E-Post alternativer" #~ msgid "Email Account Settings" #~ msgstr "E-post konto innstillinger" #~ msgid "User-defined categories" #~ msgstr "Brukerdefinerte kategorier" #~ msgid "Defines post-processing and storage." #~ msgstr "Definierer etterbehandling og lagring." #~ msgid "Sorting configuration" #~ msgstr "Sorteringskonfigurasjon" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Aktiverer sortering endring av episodenavn." #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Aktiverer sortering og endring av filnavn." #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "Aktiver om nedlastning ikke er flyttet til egen mappe." #~ msgid "Enable sorting and renaming of date named files." #~ msgstr "Aktiverer sortering og endring av navn pÃ¥ datomerkede filer." #~ msgid "Are you sure you want to delete" #~ msgstr "Er du sikker pÃ¥ at du vil fjerne" #~ msgid "Page" #~ msgstr "Side" #~ msgid "First" #~ msgstr "Første" #~ msgid "Last" #~ msgstr "Siste" #~ msgid "Close" #~ msgstr "Steng" #~ msgid "Set Pause Interval" #~ msgstr "Sett pauseintervall" #~ msgid "Pause Interval" #~ msgstr "Pauseintervall" #~ msgid "Pause for 12 hours" #~ msgstr "Pause 12 timme" #~ msgid "Pause for 24 hours" #~ msgstr "Pause 24 timer" #~ msgid "Left" #~ msgstr "Venstre" #~ msgid "Hour:Min" #~ msgstr "Time:Minutt" #~ msgid "Delete the all failed items from the history?" #~ msgstr "Ta bort alle feilmeldinger fra historikken?" #~ msgid "Links" #~ msgstr "Lenker" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Viser %s til %s av %s resultat" #~ msgid "Email Sent!" #~ msgstr "Sendte E-post!" #~ msgid "Saved" #~ msgstr "Lagret" #~ msgid "Toggle Add NZB" #~ msgstr "Vis/Skjul Legg til NZB" #~ msgid "DualView1" #~ msgstr "Visning 1" #~ msgid "DualView2" #~ msgstr "Visning 2" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "Er du sikker pÃ¥ at du vil omstarte SABnzbd?" #~ msgid "Hide Edit Options" #~ msgstr "Skjul redigeringsalternativer" #~ msgid "Show Edit Options" #~ msgstr "Vis redigeringsalternativer" #~ msgid "Edit" #~ msgstr "Endre" #~ msgid "Timeleft" #~ msgstr "GjenstÃ¥r" #~ msgid "Access" #~ msgstr "Tilgang" #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "" #~ "Jeg vil at SABnzbd skal kunne brukes fra alle datamaskiner i mitt nettverk." #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Jeg vil at SABnzbd kun skal kunne brukes fra min datamaskin." #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Passordbeskytte tilgangen til SABnzbd (anbefales)" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Aktiver HTTPS protokoll for tilgang til SABnzbd." #~ msgid "Misc" #~ msgstr "Diverse" #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "Start webleseren med SABnzbd's side nÃ¥r programmet startes." #~ msgid "This field is required." #~ msgstr "Detta feltet kreves." #~ msgid "Please enter a whole number." #~ msgstr "Bruk et heltall." #~ msgid "Step One" #~ msgstr "Steg en" #~ msgid "Step Two" #~ msgstr "Steg to" #~ msgid "Step Three" #~ msgstr "Steg tre" #~ msgid "Step Four" #~ msgstr "Steg fire" #~ 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:" #~ msgid "_yenc module... NOT found!" #~ msgstr "_yenc-modul... IKKE funnet!" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd har problemer med visse programvare-baserte brannmurer.
\n" #~ " %s
\n" #~ " Uheldigvis kan ikke dette problemet løses akkurat nå.
\n" #~ " Forhør deg med leverandøren av brannmuren din for støtte.
\n" #~ "
\n" #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Du bruker mest sannsynlig ZoneAlarm under Vista." #~ msgid "OK" #~ msgstr "OK" #~ msgid "Get NZB" #~ msgstr "Hent NZB" #~ msgid "KB/s" #~ msgstr "KB/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 "No email templates found" #~ msgstr "Ingen e-post-mal funnet" #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Din versjon av UNRAR er ikke anbefalt, hent en ny versjon fra " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "Error: No secondary interface defined." #~ msgstr "Feil: Sekundært grensesnitt er ikke definert." #~ msgid " " #~ msgstr " " #~ msgid "Delete all failed items from History?" #~ msgstr "Vil du slette alle feilete nedlastinger fra historien?" #~ msgid "Purge Failed History" #~ msgstr "Slett feil-historie" #~ msgid "QR Code" #~ msgstr "QR-kode" #~ msgid "Generic Sorting" #~ msgstr "Generell sortering" #~ msgid "Invalid encoding of email template %s" #~ msgstr "Ugyldig koding av e-post mal %s" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd trenger en ledig TCP/IP-port for sin interne webserver.
\n" #~ " Port %s på %s ble forsøkt brukt, men kontoen brukt av SABnzbd har ikke " #~ "tilgang til å bruke den.
\n" #~ " På OSX og Linux-systemer må standardbrukere benytte seg av port 1023 " #~ "eller høyere.
\n" #~ "
\n" #~ " Start SABnzbd på nytt med et annet portnummer." #~ msgid "New Feed URL" #~ msgstr "Ny RSS-kilde adresse" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "ADVARSEL: Avbrutt jobb \"%s\" grunnet kryptert RAR fil" #~ msgid "Feeds" #~ msgstr "Kilder" #~ msgid "Add Feed" #~ msgstr "Legg til kilde" #~ msgid "Skip" #~ msgstr "Hopp over" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "Hvis artikkelen har CRC feil, prøv å hent den fra en annen server." #~ msgid "Check result of unpacking" #~ msgstr "Sjekk utpakkingsresultat" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "Sjekk utpakkingsresultat (må være av for noen filsystemer)." #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "Bruk 12 timers klokke (AM/PM)" #~ msgid "SSL type" #~ msgstr "SSL type" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Vis tider i AM/PM (påvirker ikke kjøreplanen)" #~ msgid "Only for optional servers" #~ msgstr "Kun for valgfrie servere" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Bruke maksimum forsøk kun på valgfrie servere" #~ msgid "Server definition" #~ msgstr "Server definisjon" #~ msgid "Send notifications to Growl" #~ msgstr "Send varsler til Growl" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "" #~ "Aktiver hvilke meldingsklasser som skal rapporteres (ingen, en eller flere)" #~ msgid "Notification classes" #~ msgstr "Varselklasser" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Send varsler til NotifyOSD" #~ msgid "Send notifications to Notification Center" #~ msgstr "Send varsler til Varselsenter" #~ msgid "Open Source URL" #~ msgstr "Åpen kildekode URL" #~ msgid "Original Foldername" #~ msgstr "Originalt mappenavn" #~ msgid "Groups / Indexer tags" #~ msgstr "Grupper / Indeks etiketter" #~ msgid "Plush Options" #~ msgstr "Plush Valg" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Last opp: .nzb .rar .zip .gz" #~ msgid "Delete Completed" #~ msgstr "Slett Ferdige" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Les kildestrøm vil hente gjeldende kildestrømsinnhold. " #~ "Tving Nedlasting Vil laste ned alle samsvarende NZB'er nå." #~ msgid "Delete Failed" #~ msgstr "Slett Mislykkede" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Etter at SABnzbd har startet på nytt får du tilgang på følgende adresse: %s" #~ msgid "Showing one result" #~ msgstr "Viser et resultat" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "F.eks 199 eller 563 for SSL" #~ msgid "Filters" #~ msgstr "Filtere" #~ msgid "Settings" #~ msgstr "Innstillinger" #~ msgid "Storage" #~ msgstr "Lagring" #~ msgid "OZnzb" #~ msgstr "OZnzb" #~ msgid "Site API Key" #~ msgstr "Sidens API Key" #~ msgid "Automatic Feedback" #~ msgstr "Automatisk Tilbakemelding" #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Forbedret funksjonalitet inkludert karakterer og ekstra statusinformasjon er " #~ "tilgjengelig når du er koblet til OZnzb-indekserer." #~ msgid "Enable OZnzb Integration" #~ msgstr "Aktiver OZnzb-Integrasjon" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Denne nøkkelen gir identitet til indekserer. Referer til " #~ "https://www.oznzb.com/profile." #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "" #~ "Send automatisk beregnet valideringsresultater for nedlastinger til " #~ "indekserer." #~ msgid "folder" #~ msgstr "mappe" #~ msgid "No results" #~ msgstr "Ingen resultater" sabnzbd-develop/po/main/fr.po0000600000175000017500000046412113642116632014256 0ustar jpjp# French translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2020-02-21 19:51+0000\n" "Last-Translator: Fred <88com88@gmail.com>\n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:02+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Impossible de démarrer l'interface web" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "" "Impossible de trouver le template de l'interface web : %s, nouvelle " "tentative avec le template standard" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" "SABYenc désactivé: aucune version correcte n'a été trouvée ! (v%s trouvée, " "v%s attendue)" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" "Module SABYenc... NON trouvé ! v%s attendue - https://sabnzbd.org/sabyenc" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "binaire par2... Introuvable!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "Fichier binaire MultiPar... NON trouvé !" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "La vérification et la réparation ne seront pas possibles." #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "Votre version de UNRAR est %s, nous recommandons la version %s ou plus.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "binaire unrar... Introuvable!" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "binaire unzip... Introuvable!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "Binaire 7za ... Introuvable!" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" "Des modules essentiels sont manquants, le téléchargement ne peut démarrer." #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "S'il vous plaît soyez conscient que l'Hôte 0.0.0.0 aura besoin d'une adresse " "IPv6 pour les accès externes" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "Les ports HTTP et HTTPS ne peuvent pas être identiques" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" "SABnzbd a été démarré avec l'encodage %s, celui-ci devrait être UTF-8. " "Attendez-vous à des problèmes avec les noms de fichiers et de répertoires " "Unicode dans les téléchargements." #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "HTTPS désactivé car le certificat et la clé n'ont pas été trouvés" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Impossible de démarrer l'interface web : " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "Impossible d'accéder au service SABHelper" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s démarré" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Avertissement" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Erreur" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "Arrêt de SABnzbd terminé" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Le nom d'hôte n'est pas défini." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "" "Aucune connexion n'est configurée. Veuillez définir au moins une connexion." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Mot de passe masqué en ******, veuillez le ressaisir." #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Paramètres serveur incorrects" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "" "Délai dépassé : essayez d'activer SSL ou de vous connecter sur un port " "différent." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Délai dépassé" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" "Protocole SSL inconnu: essayez de désactiver SSL ou de vous connecter sur un " "autre port." #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Adresse du serveur erronée" #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Le serveur a interrompu l'ouverture de session." #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Le serveur requiert un identifiant et un mot de passe." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Connexion réussie!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Echec d'authentification, vérifiez les identifiant/mot de passe." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "Trop de connexions, veuillez mettre en pause le téléchargement ou essayer " "plus tard" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Impossible de déterminer le résultat de la connexion (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Signal %s intercepté, enregistrement et fermeture en cours..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Erreur fatale lors de l'enregistrement" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Essai de récupération du NZB depuis %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "L'enregistrement de %s a échoué" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Impossible de créer le fichier temporaire pour %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Test de l'état du serveur inexistant %s" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Échec dans tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Echec du chargement de %s" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "L'envoi de l'e-mail a réussi" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Test de Notification" #: sabnzbd/api.py msgid " Resolving address" msgstr " Résolution de l'adresse" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Par défaut" #: sabnzbd/api.py msgid "unknown" msgstr "inconnu" #: sabnzbd/api.py [Error message] 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" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Erreur de disque lors de la création du fichier %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Erreur fatale dans l'assembleur" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "ATTENTION : la tâche \"%s\" a été mise en pause à cause d'un fichier RAR " "chiffré (tous les mots de passe fournis ont été essayés)" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" "ATTENTION : la tâche \"%s\" a été abandonnée à cause d'un fichier RAR " "chiffré (tous les mots de passe fournis ont été essayés)" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Interrompu, cryptage détecté" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "AVERTISSEMENT : Le fichier RAR\"%s\" contient une extension indésirable. Le " "fichier indésirable est %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "L'extension indésirable est dans le fichier rar %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Interrompu, extension indésirable détectée" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "" "AVERTISSEMENT : Tâche \"%s\" mise en pause à cause du classement (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "AVERTISSEMENT : tâche \"%s\" annulée à cause du classement (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Tâche annulée, le filtre de classement a été vérifié (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s manquant(s)" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" "La tâche \"%s\" est probablement chiffrée en raison d'un RAR ayant le même " "nom à l'intérieur de ce RAR" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" "La tâche \"%s\" est probablement chiffrée : \"password\" dans le nom de " "fichier \"%s\"" #: sabnzbd/assembler.py msgid "video" msgstr "vidéo" #: sabnzbd/assembler.py msgid "audio" msgstr "audio" #: sabnzbd/assembler.py msgid "spam" msgstr "spam" #: sabnzbd/assembler.py msgid "passworded" msgstr "protégé par mot de passe" #: sabnzbd/assembler.py msgid "downvoted" msgstr "rejeté" #: sabnzbd/assembler.py msgid "keywords" msgstr "mots-clés" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Quota atteint, téléchargement mis en pause" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s n'est pas une adresse email valide" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Adresse du serveur requise" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Impossible de créer %s dossier %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Impossible d'écrire dans le fichier INI %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Impossible de créer le fichier de sauvegarde pour %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Encodage mot de passe incorrect %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s n'est pas une valeur octale correcte" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "Le chemin UNC \"%s\" n'est pas autorisé ici" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Erreur : la longueur du chemin doit être inférieure à %s." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "" "Erreur : La file d'attente n'est pas vide, impossible de changer le dossier." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" "Impossible d'écrire dans la base de données de l'historique, vérifier les " "droits d'accès !" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "" "Base de données d'historique endommagée, création d'une nouvelle base" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "Echec de la commande 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" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Étape de journalisation invalide dans l'historique pour %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Échec du décodage de %s" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "Échec du décodeur : mémoire insuffisante" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Article yEnc mal construit dans %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Erreur inconnue lors du décodage de %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => absent de tous les serveurs, rejeté" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "Décompression Directe" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Terminé" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "%s fichiers/dossiers extraits dans %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "La Décompression Directe a été activée automatiquement." #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py msgid "" "Jobs will start unpacking during the downloading to reduce post-processing " "time. Only works for jobs that do not need repair." msgstr "" "Les tâches seront décompréssées pendant le téléchargement pour réduire le " "temps de post-traitement. Fonctionne uniquement pour les tâches qui ne " "nécessitent aucune réparation." #: 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] msgid "Error while adding %s, removing" msgstr "Erreur lors de l'ajout de %s, suppression" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Erreur lors de la suppression de %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Impossible de lire le dossier surveillé %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Reprise en cours" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "En pause" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Vous devez définir une bande passante maximale avant de pouvoir définir une " "limite de bande passante" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Impossible de se connecter au serveur %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Resolution du nom de serveur impossible" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Le serveur %s sera ignoré pendant %s minutes" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Échec d'initialisation de %s@%s pour la raison suivante : %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "Trop de connexions au serveur %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Partage de compte probable" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Échec de la connexion au serveur %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "La connexion à %s@%s a échoué, message=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Le serveur %s requiert un identifiant/mot de passe" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Erreur suspecte dans le téléchargeur" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Arrêt en cours..." #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Échec de connexion au serveur de messagerie" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "Échec de l'initialisation de la connexion TLS" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "" "Le serveur n'a pas répondu correctement au protocole d'identification " "\"hello\"" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Échec de l'authentification au serveur de messagerie" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Aucune méthode d'authentification appropriée n'a été trouvé" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Échec d'authentification inconnu dans le serveur de messagerie" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Échec de l'envoi de l'e-mail" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Échec de la fermeture de la connexion à la messagerie" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Aucun destinataire déterminé, aucun email envoyé" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "A : %s\n" "De : %s\n" "Date : %s\n" "Sujet : Alerte SABnzbd : disque plein\n" "\n" "Salut,\n" "\n" "SABnzbd a arrêté le téléchargement car le disque est presque plein.\n" "Merci de faire de la place avant de reprendre manuellement le téléchargement " "sous SABnzbd.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Impossible de créer le dossier %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "%s dossier : %s erreur d'accès" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Impossible de changer les permissions pour %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Échec lors de la création de (%s)" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Échec lors du déplacement de %s vers %s" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "Connexion refusée avec le nom d'hôte \"%s\" à partir de :" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "Utilisateur connecté à l'interface web" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "Utilisateur connecté" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Clé de session manquante" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Erreur : Clé de session requise" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Erreur : Clé de session incorrecte" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "Clé API manquante, entrez la clé API de la configuration générale dans votre " "application tierce :" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "Clé API incorrecte, utilisez la clé API de la configuration générale dans " "votre application tierce :" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Authentification manquante, entrez vos identifiant/mot de passe de la " "configuration générale dans votre application tierce :" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Essayez notre nouveau thème Glitter ! Nouveau design optimisé pour les " "ordinateurs et les appareils mobiles. Aller dans Config - > Général pour " "changer le thème." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "Echec de la tentative de connexion de %s" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
Arrêt de SABnzbd terminé.
Veuillez attendre environ 5 " "secondes avant de cliquer sur le bouton ci-dessous.

Rafraîchir
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "" "Avertissement: LOCALHOST est ambigü, utilisez une adresse IP numérique." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "L' adresse du serveur \"%s:%s\" n'est pas valide." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Flux RSS" #: sabnzbd/interface.py msgid "Daily" msgstr "Quotidien" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "Lundi" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Mardi" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Mercredi" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Jeudi" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Vendredi" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Samedi" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Dimanche" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "non" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Serveur non défini !" #: 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 msgid "Back" msgstr "Retour" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "ERREUR:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Valeur incorrecte pour %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "j" #: sabnzbd/misc.py msgid "h" msgstr "h" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Erreur lors de la création de la clé et du certificat SSL" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Exécution du script" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Post-traitement interrompu (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Script" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Arborescence trop profonde dans le fichier compressé [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Concaténation" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Séquence incomplète des fichiers à fusionner" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "La concaténation du fichiers %s a échoué" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Erreur \"%s\" lors de la concaténation des fichiers" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Erreur \"%s\" lors de l'exécution de file_join sur %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] %s fichiers fusionnés" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Échec de l'extraction, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Erreur \"%s\" lors de l'extraction des fichiers RAR" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Erreur \"%s\" lors de l'exécution de rar_unpack sur %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Impossible de supprimer %s !" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Tentative d'extraction avec le mot de passe \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Échec de l'extraction, l'archive nécessite un mot de passe" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Extraction" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Décompresser" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Échec de l'extraction, %s n'a pas été trouvé" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "ERREUR : impossible de trouver \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Échec de l'extraction, erreur CRC" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "ERREUR : échec CRC pour \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" "La décompression a échoué, le fichier est trop volumineux pour le système de " "fichiers (FAT ?)" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" "ERREUR : le fichier est trop volumineux pour le système de fichiers (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "" "Échec de l'extraction, erreur d'écriture ou espace disque insuffisant ?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "ERREUR : erreur d'écriture (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Extraction échoué, le chemin est trop long" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "ERREUR : chemin trop long (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Fichier RAR inutilisable" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "Fichier RAR corrompu" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s fichiers dans %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Erreur \"%s\" lors de l'exécution de unzip() sur %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "Aucun binaire 7za trouvé, impossible de décompresser \"%s\"" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Tentative 7zip avec le mot de passe \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "" "La collection 7ZIP \"%s\" est incomplète, impossible d'extraire les fichiers" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Impossible de décompresser %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Contrôle rapide" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Réparation" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Contrôle rapide OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Réparation en cours" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Échec de la réparation, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Erreur %s lors de l'exécution de par2_repair sur la collection %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "" "Erreur \"%s\" lors de l'exécution de par2_repair sur la collection %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2 a reçu des paramètres incorrects, vérifiez dans Configuration-> " "Paramètres Switches" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Vérifié dans %s, tous les fichiers sont corrects" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Vérifié dans %s, réparation nécessaire" #: 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." #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Récupération de %s blocs..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Récupération en cours" #: 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 msgid "Repairing" msgstr "Réparation en cours" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Réparé(s) dans %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "Vérification de la réparation" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Disque plein" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Vérification en cours" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "Vérification des fichiers supplémentaires" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Vérification" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "[%s] La commande dans build_command n'est pas définie." #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" "Le script Python \"%s\" n'est pas configuré avec les permissions d’exécution " "(+x)" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Ce serveur n'authorise pas de connexion SSL sur ce port" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" "Incompatibilité du nom d'hôte du certificat : le nom d'hôte du serveur n'est " "pas répertorié dans le certificat. Il s'agit d'un problème de serveur." #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" "Le certificat n'est pas valide. C'est probablement un problème de serveur." #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "Le serveur %s utilise un certificat peu fiable [%s]" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Démarrage/Arrêt" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "NZB ajouté" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Post-traitement démarré" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Tâche terminé" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "La tâche a échoué" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "File d'attente terminée" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Autres messages" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "Non disponible" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Echec d'envoi du message Prowl" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Mauvaise réponse de Pushover (%s) : %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "Échec de l'envoi du message Pushover" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Mauvaise réponse de Pusbullet (%s) : %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Échec de l'envoi du message Pushbullet" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "Le script a renvoyé le code de sortie %s et le résultat \"%s\"" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "Le script de notification \"%s\" est introuvable" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "Echec d'envoi de la notification Windows" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Echec de l'importation des fichiers %s depuis %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Fichier de file d'attente incompatible, impossible de continuer" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Erreur lors du chargement de %s, fichier corrompu détecté" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB ajouté à la file d'attente" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Encodage inconnu" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Fichier NZB %s incomplet" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Fichier NZB invalide %s, ignoré (raison=%s, ligne=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Fichier NZB %s vide" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "Le script de pré-file d'attente a marqué la tâche comme échouée" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Doublon NZB ignoré \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "Échec de duplication du NZB \"%s\"" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "Dupliquer NZB" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Mise en pause du doublon NZB \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Interrompu, ne peut être achevé" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DOUBLON" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "CHIFFRÉ" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "TROP VOLUMINEUX" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "INCOMPLET" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "INDÉSIRABLE" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "FILTRÉ" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "PATIENTER %s sec" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "PROPAGATION %s min" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Téléchargé en %s à %sB/s de moyenne" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Âge" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s articles malformés" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s articles manquants" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s articles avec doublons sans correspondance" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s articles ont été retirés" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Erreur lors de l'importation de %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Avertissements" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "A l'arrêt" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Configuration" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "File d'attente" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Vider la file d'attente" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Historique" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Vider l'historique" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Limiter la vitesse" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Mettre en pause" #: sabnzbd/osxmenu.py msgid "min." msgstr "min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Reprendre" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Analyser le dossier surveillé" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Lire tous les flux RSS" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Dossier complet" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Dossier incomplet" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Résoudre les problèmes" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Redémarrer" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Redémarrer sans se connecter" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Quitter" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Mettre en file d'attente les 10 premiers articles" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Vide" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Historique des 10 derniers articles" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Nouvelle version disponible" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Aller à l'assistant" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Arrêt en cours..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Problème avec" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd a besoin d'un port tcp/ip libre pour le serveur Web " "interne.
\n" " La plage de ports %s à %s a été essayée mais elle n'est pas " "disponible.
\n" " Un autre logiciel utilise ce port ou SABnzbd est déjà en cours " "d'exécution.
\n" "
\n" " Veuillez redémarrer SABnzbd avec un port différent." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "" "Si vous obtenez ce message d'erreur à nouveau, veuillez essayer un nombre " "différent.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd a besoin d'une adresse hôte valide pour son serveur Web " "interne.
\n" " Vous avez spécifié une adresse non valide.
\n" " Les valeurs sûres sont localhost et 0.0.0.0
\n" "
\n" " Veuillez redémarrer SABnzbd avec une adresse hôte correcte." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd a détecté des données sauvegardées avec une autre version de " "SABnzbd
\n" " mais ne peut réutiliser les données de l'autre programme.

\n" " Vous voudrez peut-être terminer votre première file d'attente avec " "l'autre programme.

\n" " Après cela, lancez ce programme avec l'option \"--clean\".
\n" " Cette opération effacera la file d'attente actuelle et l'historique " "!
\n" " SABnzbd a lu le fichier \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd ne peut pas trouver ses fichiers d'interface web dans %s.
\n" " Veuillez réinstaller le programme.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd a détecté une erreur fatale :" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd a détecté que le fichier sqlite3.dll est manquant.

\n" " Certains antivirus mal conçu peuvent supprimer ce fichier.
\n" " S'il vous plaît vérifier votre antivirus, essayez de ré-installer " "SABnzbd et plaignez vous à l'éditeur de l'antivirus.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Appuyez sur la touche Drapeau+R et tapez la ligne (exemple) :" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Ouvrez une fenêtre de Terminal et tapez la ligne (exemple) :" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Le programme n'a pas démarré !" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" "Impossible de lier le port %s sur %s. Un autre logiciel utilise le port ou " "SABnzbd est déjà en cours d'exécution." #: sabnzbd/panic.py msgid "Fatal error" msgstr "Erreur fatale" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Impossible de lancer le navigateur web, probablement pas trouvé" #: sabnzbd/panic.py msgid "Access denied" msgstr "Accès refusé" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "" "Erreur %s: vous devez fournir un nom d'utilisateur et un mot de passe valide." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "" "Ancienne file d'attente détectée, utiliser Statut-> Réparation pour " "convertir la file d'attente" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" msgstr "" "Le système de fichiers du dossier de téléchargements terminés %s est au " "format FAT, limitant la taille maximale d'un fichier à 4 Go" #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "" "Le téléchargement pourrait échouer, seulement %s des %s requis sont " "disponibles" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Le téléchargement a échoué - absent de vos serveur(s)" #: sabnzbd/postproc.py msgid "Moving" msgstr "Déplacement" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "%s envoyé dans la file d'attente" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Erreur lors du renommage de \"%s\" en \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Impossible de déplacer les fichiers" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Exécution du script utilisateur %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "%s exécuté" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Le code script de sortie est %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Plus" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Échec du post-traitement pour %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "voir le journal" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Échec du téléchargement" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Échec du nettoyage de %s." #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Téléchargement terminé" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Impossible de créer le dossier final %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Post-traitement" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Pas de fichiers par2" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Essai vérification SFV" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Certains fichiers n'ont pas pu être vérifiés \"%s\"" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Vérifié avec succès en utilisant des fichiers SFV" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "Tentative de vérification RAR" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "[%s] La vérification RAR a échoué: %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Protégé par un mot de passe" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "Fichiers RAR vérifiés avec succès" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "Echec lors de la vérification des fichiers RAR" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Échec de la suppression de %s" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Échec de la mise en hibernatation" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Échec de la mise en veille" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Erreur lors de l'arrêt du système" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "id de l'Indexer (%s) non trouvé pour le fichier des classements" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Adresse du serveur" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "Clé API" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" "Cette clé fournit l'identité à l'indexeur. Vérifiez votre profil sur le site " "web de l'indexeur." #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Description du flux RSS incorrecte \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Échec de la récupération RSS de %s : %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Vous n'avez pas d'authentification valide pour ce flux %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "" "Erreur du côté serveur (code serveur %s) ; n'a pas pu obtenir %s sur %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "" "Le serveur %s utilise un certificat de sécurité HTTPS non authentifié" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "Le flux RSS %s était vide" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Flux incompatible" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Entrée vide de flux RSS trouvée (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Afficher l’interface" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Ouvrir le dossier des complets" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Pause de" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Mettre en pause pendant 5 minutes" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Mettre en pause pendant 15 minutes" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Mettre en pause pendant 30 minutes" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Mettre en pause pendant 1 heure" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Mettre en pause pendant 3 heures" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Mettre en pause pendant 6 heures" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Arrêter" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Restant" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Ajouter NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Mauvaise planification %s à %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Action inconnue : %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Planification pour un serveur non existant %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Télécharger" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Concaténer" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Source" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Serveurs" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Échec" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Échoué" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "En attente" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Réparation en cours..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Décompression en cours..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Déplacement en cours..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Exécution de script en cours..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Récupération des blocs supplémentaires ..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Vérification rapide..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Vérification..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Téléchargement" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "Délai de propagation" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Tâche" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "désactiver le serveur" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "activer le serveur" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Limite de vitesse" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Suspendre tout" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Mettre en pause le post-traitement" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Reprendre le post-traitement" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Lire les flux RSS" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Retirer les tâches échouées" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Effacer les tâches terminées" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Mettre en pause les tâches de priorité faible" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Mettre en pause les tâches de priorité normale" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Mettre en pause les tâches de priorité haute" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Reprendre les tâches de priorité faible" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Reprendre les tâches de priorité normale" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Reprendre les tâches de priorité haute" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Activer la gestion de quota" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Désactivé" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Très basse" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Modéré" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normale" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Haute" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Urgence" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Basse" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "Mo" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "Go" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "heure" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "heures" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "min" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "mins" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "sec" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "secondes" #: sabnzbd/skintext.py msgid "day" msgstr "jour" #: sabnzbd/skintext.py msgid "days" msgstr "jours" #: sabnzbd/skintext.py msgid "week" msgstr "semaine" #: sabnzbd/skintext.py msgid "Month" msgstr "Mois" #: sabnzbd/skintext.py msgid "Year" msgstr "Année" #: sabnzbd/skintext.py msgid "January" msgstr "Janvier" #: sabnzbd/skintext.py msgid "February" msgstr "Février" #: sabnzbd/skintext.py msgid "March" msgstr "Mars" #: sabnzbd/skintext.py msgid "April" msgstr "Avril" #: sabnzbd/skintext.py msgid "May" msgstr "Mai" #: sabnzbd/skintext.py msgid "June" msgstr "Juin" #: sabnzbd/skintext.py msgid "July" msgstr "Juillet" #: sabnzbd/skintext.py msgid "August" msgstr "Août" #: sabnzbd/skintext.py msgid "September" msgstr "Septembre" #: sabnzbd/skintext.py msgid "October" msgstr "Octobre" #: sabnzbd/skintext.py msgid "November" msgstr "Novembre" #: sabnzbd/skintext.py msgid "December" msgstr "Décembre" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Jour du mois" #: sabnzbd/skintext.py msgid "This week" msgstr "Cette semaine" #: sabnzbd/skintext.py msgid "This month" msgstr "Ce mois" #: sabnzbd/skintext.py msgid "Today" msgstr "Aujourd'hui" #: sabnzbd/skintext.py msgid "Total" msgstr "Total" #: sabnzbd/skintext.py msgid "on" msgstr "oui" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Paramètres" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Version de Python" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Page d'accueil" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "ou" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Hôte" #: sabnzbd/skintext.py msgid "Comment" msgstr "Commentaire" #: sabnzbd/skintext.py msgid "Send" msgstr "Envoyer" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Annuler" #: sabnzbd/skintext.py msgid "Other" msgstr "Autre" #: sabnzbd/skintext.py msgid "Report" msgstr "Signaler" #: sabnzbd/skintext.py msgid "Video" msgstr "Vidéo" #: sabnzbd/skintext.py msgid "Audio" msgstr "Audio" #: sabnzbd/skintext.py msgid "Not used" msgstr "Non utilisé" #: sabnzbd/skintext.py msgid "or less" msgstr "ou moins" #: sabnzbd/skintext.py msgid "Log in" msgstr "Se connecter" #: sabnzbd/skintext.py msgid "Log out" msgstr "Se déconnecter" #: sabnzbd/skintext.py msgid "Remember me" msgstr "Se souvenir de moi" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "L'outil de téléchargement usenet automatique" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Enregistrer" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Enregistrement.." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Êtes-vous sûr ?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Supprimer tous les fichiers téléchargés ?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Accueil" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Configuration" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Statut" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Aide" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Forum" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "Incidents" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "Soutenez le projet, faites un don !" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Général" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Répertoires" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Switches" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Planification" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Notifications" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "Email" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Catégories" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Triage" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Spécial" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Rechercher" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Dossier de téléchargement" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "EN PAUSE" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "%s articles mis en cache (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Sysload" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Une nouvelle version %s est disponible" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Etes-vous sûr de vouloir arrêter SABnzbd ?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Ajouter" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Ajouter un fichier" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Catégorie" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Traitement en cours" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Priorité" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Réparer" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Décompresser" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Supprimer" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "D" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "S" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Forcer" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Arrêter" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "Saisir une URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "En fin de file d'attente" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Éteindre le PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "Mettre le PC en veille" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Mettre le PC en hibernation" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Arrêter SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Vitesse limite" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Ordre" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Nom" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "TRE" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "ÂGE" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Suppr." #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Réessayer" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Actions" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Scripts" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Supprimer tous les éléments de la file d'attente ?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Vider les NZB" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Purger les NZB & supprimer les fichiers" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Réessayez toutes les tâches échouées" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Supprimer NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Supprimer le NZB & supprimer les fichiers" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "de" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Articles manquants" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Quota restant" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "manuel" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Réinitialiser le quota maintenant" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Supprimer tous les éléments terminés de l'historique ?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Masquer les détails" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Afficher les détails" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Afficher les échoués" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Afficher Tout" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Taille" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Purger les NZB échoués" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Purger les NZBs échoués & supprimer les fichiers" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Vider les NZB terminés" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "Purger les NZBs de la page en cours" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "NZB supplémentaire optionnel" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Chemin d'accès" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Relancer toutes les tâches échouéés" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Réessayer tous" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "En dehors du délai de rétention" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Autre problème" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Forcer la déconnexion" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" "Déconnecte toutes les connexions actives aux serveurs Usenet. Les connexions " "seront rouvertes après quelques secondes si des éléments sont présents dans " "la file d'attente." #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Ceci enverra un email de test sur votre compte." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Afficher le journal" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Email de test" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Journalisation" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Erreurs/Avertissements" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Info" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Debug" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Connections" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Avertissements récents" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "éffacer" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Débloquer" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Identifiant de l'article" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Collection de fichiers" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Quand" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Type" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Activé" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Tableau de bord" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Echec de connexion !" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Adresse IPv4 locale" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Adresse IPv4 publique" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "Adresse IPv6" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Nameserver / DNS Lookup" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "Modèle de CPU" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Performance du système ( Pystone )" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Vitesse du dossier \"Download\"" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Vitesse du dossier \"Complete\"" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Vitesse d'écriture" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "" "Impossible d'écrire. Vérifiez que le répertoire est accessible en écriture." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "Bande passante Internet" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Cliquez sur le bouton de test \"Répéter\" ci-dessous pour déterminer" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Refaire le test" #: sabnzbd/skintext.py msgid "Test download" msgstr "Tester le téléchargement" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" "Ajoute un fichier test NZB, de la taille spécifiée, rempli de données " "aléatoires. Peut être utilisé pour vérifier votre configuration." #: sabnzbd/skintext.py msgid "Config File" msgstr "Fichier de configuration" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Cache utilisé" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Ceci redémarrera SABnzbd.
\r\n" "Utilisez cette fonction si vous pensez avoir un problème de stabilité.
\r\n" "Les téléchargements en cours seront mis en pause puis repris." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" "
Si l'authentification est activée, vous devrez vous identifier à " "nouveau." #: sabnzbd/skintext.py msgid "Advanced" msgstr "Options avancées" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Il y a des dossiers orphelins dans le répertoire de téléchargement.
Vous pouvez choisir de les supprimer (y compris les fichiers) ou de les " "renvoyer dans la file d'attente." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "Ceci redémarre SABnzbd et fait une complète reconstruction
de la file " "d'attente, tout en conservant les fichiers déjà téléchargés.
Ceci " "modifiera l'ordre de la file d'attente." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Les modifications n'ont pas été enregistrées et seront perdues." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" "La session expirera quand votre adresse IP changera ou quand SABnzbd sera " "redémarré." #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Activer Unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "Activer 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "Par2 multi-cœur" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" "Les connexions sécurisées (SSL) de SABnzbd aux serveurs de news et aux sites " "web HTTPS seront cryptées, cependant, la validation de l'identité d'un des " "serveur à l'aide de ses certificats n'est pas possible. OpenSSL 1.0.2, ou " "supérieur, et des certificats locaux AC à jour sont requis." #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" "Accélérez les réparations en installant Par2 multi-coeur, disponible sous de " "nombreuses plateformes." #: sabnzbd/skintext.py msgid "Version" msgstr "Version" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Temps de fonctionnement" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Secours" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Consultez le Wiki pour plus d'info à ce sujet (en anglais) !" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Redémarrage de SABnzbd en cours..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Les modifications nécessiteront un redémarrage de SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "Serveur web SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "Hôte SABnzbd" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Hôte sur lequel SABnzbd doit attendre les connexions." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "Port SABnzbd" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Port que SABnzbd doit surveiller." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Interface Web" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Choisissez un thème." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "Identifiant SABnzbd" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Nom d'utilisateur pour l'authentification (facultatif)." #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "Mot de passe SABnzbd" #: sabnzbd/skintext.py 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é" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "Activer HTTPS" #: sabnzbd/skintext.py msgid "not installed" msgstr "non installé" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Active l'accès à l'interface via une adresse HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "Port HTTPS" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Si vide, le port standard écoutera seulement le HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "Certificat HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Nom du fichier ou chemin du certificat HTTPS." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" "Générer à nouveau les certificat et clé auto-signés. Nécessite le " "redémarrage de SABnzbd !" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "Clé HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Nom du fichier ou chemin de la clé HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "Certificats de chaîne HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Nom du fichier ou chemin d'accès de la chaîne HTTPS." #: sabnzbd/skintext.py msgid "Tuning" msgstr "Réglages" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "Invervalle de vérification RSS" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Intervalle de vérification (en minutes, au moins 15). Inactif quand vous " "utilisez le Planificateur !" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Vitesse maximale de la ligne" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Pourcentage de la vitesse de la ligne" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "" "Quel est le pourcentage de la vitesse de la ligne que SABnzbd doive " "utiliser, par exemple 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Limite du cache d'articles" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Mettre les articles en cache pour réduire les accès disque.
En " "Octets, peut être suivi de K,M,G. Par exemple : \"64M\" ou \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Nettoyer la liste" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Liste des extensions de fichiers qui doivent être supprimés après le " "téléchargement.
nfo
ou nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "Conservation de l'historique" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" "Supprimer automatiquement les tâches terminées de l'historique. Attention, " "la Détection des Doublons et certains outils externes s'appuient sur les " "informations de l'historique." #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "Conserver toutes les tâches" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "Nombre maximum de tâches complétées historisées" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "Durée maximale d'historisation des tâches complétées" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "Ne conserver aucune tâche terminée" #: sabnzbd/skintext.py msgid "Jobs" msgstr "Tâches" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Enregistrer les modifications" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "Rétablir les valeurs par défaut" #: sabnzbd/skintext.py msgid "Reset" msgstr "Réinitialiser" #: sabnzbd/skintext.py msgid "Language" msgstr "Langue" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Choisir la langue de l'interface web." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" "Aidez-nous à traduire SABnzbd dans votre langue !
Améliorez les " "traductions existantes ou ajoutez celles qui manquent ici :" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "" "Cette clé permettra aux programmes tiers d'avoir un accès complet à SABnzbd." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "Clé NZB" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Cette clé permettra aux programmes tiers de pouvoir ajouter des NZB à " "SABnzbd." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Générer une nouvelle clé" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "Clé API code QR" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Liste des plages de réseau local" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Toutes les adresses de réseau local commencent par ces préfixes (souvent " "\"192.168.1.\" )" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Accès Internet externe" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" "Vous pouvez définir les droits d'accès pour les systèmes en dehors de votre " "réseau local. Requiert la liste des plages de réseaux locaux à définir." #: sabnzbd/skintext.py msgid "No access" msgstr "Aucun accès" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Ajouter des fichiers NZB " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (aucune configuration)" #: sabnzbd/skintext.py msgid "Full API" msgstr "API complète" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Interface Web complète" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "Seul l'accès extérieur nécessite un identifiant" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "NOTE: Les dossiers seront créés automatiquement lors de " "l'enregistrement. Il est possible d'utiliser des chemins absolus pour " "sauvegarder en dehors du répertoire par défaut." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Dossiers utilisateur" #: sabnzbd/skintext.py msgid "Browse" msgstr "Parcourir" #: sabnzbd/skintext.py msgid "In" msgstr "Dans" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Dossier temporaire de téléchargement" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Emplacement de stockage des téléchargements non-traités.
Modifiable " "uniquement si la file d'attente est vide." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Espace disque minimum pour le dossier de téléchargement temporaire" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Mettre en pause lorsque l'espace libre est en-dessous de cette valeur.
En octets, peut être suivi de O,M,G,T. Par exemple : \"800M\" ou " "\"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Dossier de téléchargements terminés" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Emplacement des téléchargements terminés et post-traités.
Peut être " "outrepassé par les catégories définies par l'utilisateur." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Permissions pour le dossier de téléchargements terminés" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Appliquer ce modèle de permissions aux fichiers/dossiers téléchargés.
En notation octale. Par exemple : \"755\" ou \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Dossier à surveiller" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Dossier d'import automatique des fichiers .nzb.
Prends en compte " "également les nzb contenus dans les fichiers .zip, .rar et .tar.gz." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Intervalle de scan" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "" "Nombre de secondes entre chaque scan du dossier pour vérifier la présence de " "fichiers .nzb." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "Dossier des scripts" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "Dossier contenant les scripts utilisateurs." #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Dossier des modèles d'email" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Dossier contenant les modèles d'email définis par l'utilisateur." #: sabnzbd/skintext.py msgid "Password file" msgstr "Fichier de mot de passe" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Le fichier contenant tous les mots de passe sera testé sur les fichiers RAR " "chiffrés." #: sabnzbd/skintext.py msgid "System Folders" msgstr "Dossiers système" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Dossier administrateur" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Emplacement de la file d'attente et de la base de données d'historique.
Ne peut être changé que lorsque la file d'attente est vide." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Les données ne seront pas déplacées. Requiert un redémarrage de " "SABnzbd !" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Dossier du fichier journal" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Emplacement des fichiers journaux de SABnzbd.
Redémarrage requis " "!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "Dossier de sauvegarde des fichiers .nzb" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Emplacement où les fichier .nzb seront archivés." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Dossier racine par défaut" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Télécharger tous les fichiers par2" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" "Ceci évite les réparations multiples en téléchargeant tous les fichiers par2 " "nécessaires." #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Activer l'extraction récursive" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Décompresser les archives (rar, zip, 7z) à l'intérieur des archives." #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Ignorer tous les dossiers à l'intérieur des archives" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Tous les fichiers iront dans un seul dossier." #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Télécharger uniquement les articles en tête de file d'attente" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Activer pour moins d'utilisation de la RAM. Désactiver pour éviter que les " "téléchargements lents bloquent la file d'attente." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Ne post-traiter que les tâches vérifiées" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" "Limite le post-traitement aux tâches qui ont passé avec succès toutes les " "vérifications PAR2." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Action quand un RAR chiffré est téléchargé" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "En cas de \"Pause\", vous devrez mettre un mot de passe pour reprendre la " "tâche." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Détecter les doublons de téléchargement" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" "Détecter les fichiers NZB identiques (en fonction des éléments de votre " "historique ou des fichiers .nzb du dossier de backup)" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Détecter les doublons d'épisodes de séries" #: sabnzbd/skintext.py msgid "" "Detect identical episodes in series (based on \"name/season/episode\" of " "items in your History)" 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" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "Faire échouer la tâche (déplacer vers l'historique)" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "Taguer la tâche" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Annuler" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Action si une extension indésirable est détecté" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "" "Action si une extension indésirable est détecté dans les fichiers RAR" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Extensions indésirables" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Afficher toutes les extensions indésirables. Par exemple : exe or " "exe, com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Activer les contrôles SFV" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Fait une vérification supplémentaire basée sur les fichiers SFV." #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Le script utilisateur peut signaler la tâche comme échouée" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Lorsque le script de l'utilisateur renvoie un code de sortie \"non-zéro\", " "la tâche sera signalée comme échouée." #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "En cas d'échec, essayer avec un NZB alternatif" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" "Certains serveurs proposent un NZB alternatif lorsqu'un téléchargement " "échoue." #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "Utiliser les tags de l'indexeur" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" "Lors du tri, utiliser les tags de l'indexeur pour le titre, la saison, " "l'episode, etc. Sinon, toutes les dénominations seront dérivées du fichier " "NZB." #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Activer le renommage du dossier" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Utiliser des noms temporaires pendant le post-traitement. Désactiver lorsque " "votre système ne le gère pas correctement." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Script utilisateur de pré-file d'attente" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Utilisé avant qu'un NZB n'entre dans la file d'attente." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Paramètres PAR2 supplémentaires" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Paramètres 'Nice'" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "Paramètres 'IONice'" #: sabnzbd/skintext.py msgid "External process priority" msgstr "Priorité de processus externe" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Se déconnecter lorsque la file d'attente est vide" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "" "Se déconnecter du serveur(s) Usenet lorsque la file d'attente est vide ou en " "pause" #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Trier par âge" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Trier automatiquement les fichiers par âge (moyen)." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" "Les publications seront mises en pause jusqu'à ce qu'elles aient au moins " "cet âge. La tâche commence immédiatement si elle est passée en priorité " "Forcée." #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Vérifier les mises à jour" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Vérifier chaque semaine les mises à jour de SABnzbd." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "Versions de test également" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Remplacer les espaces dans les noms de dossier" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "" "Remplace les espaces par des underscores ( _ ) dans les noms de dossiers." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Remplacer les points dans les noms de dossier" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Remplace les points par des espaces dans les noms de dossier" #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Rendre Windows compatible" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "" "Pour les serveurs : assurez-vous que les noms soient compatibles avec " "Windows." #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Lancer le navigateur web au démarrage" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Lance le navigateur web par défaut au démarrage de SABnzbd." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Mettre en pause les téléchargements lors du post-traitement" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Met en pause les téléchargements au début du post-traitement et les reprend " "à la fin." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Ignorer les échantillons (Samples)" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Exclure les fichiers échantillons (par ex. les samples vidéo)." #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Supprimer après téléchargement" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "Vérification du certificat HTTPS" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" "Vérifier les certificats lors de la connexion aux indexeurs et sources RSS " "utilisant HTTPS." #: sabnzbd/skintext.py msgid "Server" msgstr "Serveur" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Post-traitement" #: sabnzbd/skintext.py msgid "Naming" msgstr "Appellation" #: sabnzbd/skintext.py msgid "Quota" msgstr "Quota" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indexation" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Combien peut-être télécharger ce mois (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Jour de RAZ" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "A quel jour du mois ou de la semaine (1=lundi) votre fournisseur " "réinitialise le quota ? (Optionnel avec hh:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Reprise auto" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "" "Le téléchargement devrait-il reprendre après que le quota soit réinitialisé ?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Période du quota" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "Est-ce que le quota se réinitialise chaque jour, semaine ou mois ?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Vérifiez avant de télécharger" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Tente de prédire la réussite de la tâche avant le téléchargement complet " "(plus lent !)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "Chiffrements SSL" #: sabnzbd/skintext.py 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 msgid "Maximum retries" msgstr "Nombre de tentatives maximum" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Nombre maximal de tentatives par serveur" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Interrompre les tâches qui ne peuvent être terminées" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "S'il apparait clairement pendant le téléchargement qu'il manque trop de " "données, annuler la tâche" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "Activer l'intégration de l'indexeur" #: sabnzbd/skintext.py 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 "" "Les indexeurs peuvent fournir des informations de notation lorsqu'une tâche " "est ajoutée, et SABnzbd peut signaler à l'indexeur si une tâche n'a pas pu " "être terminée." #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Activer le filtrage" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Activer les téléchargements selon les règles de filtrage." #: sabnzbd/skintext.py msgid "Abort If" msgstr "Abandonner si" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Sinon, mettre en pause si" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Classement vidéo" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Classement audio" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spam" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Confirmé" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Plus de mauvais votes que de bons" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Mots-clés titre" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Liste séparée par des virgules" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "Sélection de l'adresse IP du serveur" #: sabnzbd/skintext.py msgid "First IP address" msgstr "Première adresse IP" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "Adresse IP sélectionnée au hasard" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "Adresse IP la plus rapide, IPv6 de préférence" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Utile si un serveur de news a plus d'une adresse IPv4/IPv6" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Ajouter un serveur" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Description du serveur" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Port" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Nom d'utilisateur" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Mot de passe" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Délai d'expiration" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Délai de rétention" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "Connexion sécurisée au serveur" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "Vérification du certificat" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" "Minimal: lorsque SSL est activé, vérifier l'identité du serveur à l'aide de " "ses certificats. Strict: vérifier et imposer le nom d'hôte correspondant." #: sabnzbd/skintext.py msgid "Disabled" msgstr "Désactivé" #: sabnzbd/skintext.py msgid "Minimal" msgstr "Minimal" #: sabnzbd/skintext.py msgid "Strict" msgstr "Strict" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 est la priorité la plus élevée, 99 est la priorité la plus faible" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Optionnel" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" "Pour les serveurs non fiables, sera ignorée plus longtemps en cas de " "défaillances" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Activer" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Supprimer le serveur" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Tester le serveur" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "RAZ des compteurs" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Test des détails du serveur en cours..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Bande passante" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Envoyer 'Group'" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Envoyer la commande 'group' avant la demande des articles." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Notes personnelles" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Ajouter une planification" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Fréquence" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Action" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Arguments" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Planifications actuelles" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "La case à cocher à coté du nom du flux doit être cochée pour que le flux " "soit activé et qu'il soit pris en compte dans la vérification des nouveaux " "téléchargements.
Quant un flux est ajouté, seuls les nouveaux " "téléchargements seront pris en compte à moins de cliquer sur \"Forcer " "téléchargements\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "Séparez les URL multiples par une virgule" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Lire le flux RSS" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Forcer le téléchargement" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filtre" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Accepter" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Rejeter" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Obligatoire" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "CatObligatoire" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Au moins" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Au plus" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "Depuis SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "À partir de la Série SxxEyy" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Correspond" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Ne correspond pas" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Téléchargé" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Lire tous les flux maintenant" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Notification par email lorsque des téléchargements sont terminés" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Jamais" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Toujours" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Erreurs uniquement" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Notifications de disque dur plein" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "" "Envoie un email lorsque le disque dur est plein et que SABnzbd a été mis en " "pause." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Envoyer les notifications RSS" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "" "Envoie un email quand un flux RSS ajoute un fichier dans la file d'attente." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "Serveur SMTP" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Entrez le serveur de courrier sortant de votre FAI." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Email du destinataire" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "Adresse email à laquelle seront envoyées les notifications." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "Email de l'expéditeur" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Qui doit-on indiquer comme expéditeur de l'email ?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "Identifiant (facultatif)" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Identifiant du compte pour les envois authentifiés." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "Mot de passe du compte (facultatif)" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Mot de passe du compte pour les envois authentifiés." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Notification envoyée !" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Activer Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Utiliser seulement pour le serveur Growl à distance (hôte:port)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Mot de passe du serveur" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Mot de passe optionnel pour le serveur Growl" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "Activer NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Centre de notification" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Activer les notifications Windows" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Notifications Windows" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Activer les notifications Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Nécessite un compte Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "Clé API pour Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Clé API personnelle pour Prowl (obligatoire)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Activer les notifications Pushover" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Nécessite un compte Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Jeton (token) d'application" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Jeton (token) d'application (obligatoire)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Clé de l'utilisateur" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Clé de l'utilisateur (obligatoire)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Appareil(s)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Activer les notifications Pushbullet" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Nécessite un compte Pushbullet" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Clé API personnelle" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Votre clé API Pushbullet personnelle (obligatoire )" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Appareil" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Appareil sur lequel le message doit être envoyé" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "Script de notification" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "Activer le script de notification" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "Exécute un script personnalisé" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "Quel script devons-nous utiliser pour les notifications ?" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" "Les indexeurs peuvent fournir une catégorie à l'intérieur du NZB que SABnzbd " "tentera de faire correspondre aux catégories définies ci-dessous. En outre, " "vous pouvez ajouter des termes à \"Catégories de l'indexeur / Groupes\" pour " "faire correspondre plus de catégories. Utilisez des virgules pour séparer " "les termes. Les caractères génériques sont pris en charge.
Plus " "d'informations peuvent être trouvées sur le Wiki." #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Terminer le chemin avec une étoile * empêche la création des dossiers de la " "tâche." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Les chemins relatifs des dossiers sont basés sur" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Dossier/Chemin" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "Catégories de l'indexeur / Groupes" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Tri des séries" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Activer le tri TV" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Modèle de clé" #: sabnzbd/skintext.py msgid "Clear" msgstr "Effacer" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "Appliquer les filtres" #: sabnzbd/skintext.py msgid "Presets" msgstr "Modèles prédéfinis" #: sabnzbd/skintext.py msgid "Example" msgstr "Exemple" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "Tri des films" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Activer le tri des films" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "" "Conserver les téléchargements disséminés dans des dossiers supplémentaires" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Catégories affectées" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Signification" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Modèle" #: sabnzbd/skintext.py msgid "Result" msgstr "Résultat" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Dossier Saison" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Dossier Saison" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Dossier Épisode" #: sabnzbd/skintext.py 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" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Nom du film" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Nom.Film" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Nom_Film" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Nom de la série" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Nom.Série" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Nom_Série" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Numéro de la saison" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Numéro de l'épisode" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Nom de l'épisode" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Nom.Épisode" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Nom_Épisode" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Extension du fichier" #: sabnzbd/skintext.py msgid "Extension" msgstr "Extension" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Numéro de bloc" #: sabnzbd/skintext.py msgid "Decade" msgstr "Décennie" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Nom de fichier originel" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "Nom d'origine de la tâche" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Minuscule" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEXTE" #: sabnzbd/skintext.py msgid "text" msgstr "texte" #: sabnzbd/skintext.py msgid "file" msgstr "fichier" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Chaîne de caractères de tri" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Étiquette multi-bloc" #: sabnzbd/skintext.py msgid "In folders" msgstr "Dans les dossiers" #: sabnzbd/skintext.py msgid "No folders" msgstr "Pas de dossiers" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Tri par date" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Activer le tri par date" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Dossier du nom de série" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "Dossiers Année-Mois" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Dossiers Quotidiens" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "Lettre Capitale" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Résultat traité" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Options rarement utilisées. Pour leur sens et leur explication, cliquez sur " "le bouton Aide pour accéder à la page Wiki.
Ne pas les modifier sans " "consulter le wiki en premier, car certaines ont de graves effets " "secondaires.
Les valeurs par défaut sont indiquées entre parenthèses." #: sabnzbd/skintext.py msgid "Values" msgstr "Valeurs" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Éditer les détails du NZB" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Supprimer" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Tout en haut" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Monter" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Descendre" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Tout en bas" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Tous" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Inverser" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Nom de fichier" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Sujet" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Sélection" #: sabnzbd/skintext.py msgid "left" msgstr "restant" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Espace libre" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Dossier temporaire" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Multi-Operations" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Maintenez la touche Maj pour sélectionner une plage" #: sabnzbd/skintext.py msgid "Check all" msgstr "Tout sélectionner" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Redémarrer SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Options de statut et d'interface" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Ou glissez-déposez des fichiers sur la fenêtre!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Connexion à SABnzbd perdue..." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Taux de rafraîchissement" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Utiliser les paramètres globaux de l'interface" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Limite des éléments de la file d'attente" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Limite des éléments historisés" #: sabnzbd/skintext.py msgid "Date format" msgstr "Format de la date" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Colonne de file d'attente supplémentaire" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "Colonne d'historique additionnelle" #: sabnzbd/skintext.py msgid "page" msgstr "page" #: sabnzbd/skintext.py msgid "Loading" msgstr "Chargement" #: sabnzbd/skintext.py msgid "articles" msgstr "articles" #: sabnzbd/skintext.py msgid "Rename" msgstr "Renommer" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Réparer la file d'attente" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Afficher les connexions actives" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Tâches orphelines" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Renvoyer dans la file d'attente" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Tout supprimer" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Réessayer tous" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Importer le NZB depuis l'URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "Uploader le NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Vous pouvez également indiquer un nom de fichier" #: sabnzbd/skintext.py msgid "Submit" msgstr "Soumettre" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Ouvrir URL Info." #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Soumis. Merci !" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Pas de sélection!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Supprimer tous les fichiers sélectionnés" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Afficher/masquer les fichiers terminés" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Afficher le journal des scripts" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Mise à Jour disponible!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" "Le stockage des données locales (cookies) est désactivé dans votre " "navigateur, les réglages de l'interface seront perdus lorsque vous fermerez " "votre navigateur !" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" "Glitter a des (nouvelles) fonctionnalités que vous devriez apprécier !" #: sabnzbd/skintext.py msgid "Custom" msgstr "Personnalisé" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "Affichage compact" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "Mise en page par onglets
(file d'attente et historique séparés)" #: sabnzbd/skintext.py msgid "Speed" msgstr "Vitesse" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Confirmer les suppressions de la file d'attente" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Confirmer les suppressions de l'historique" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Combien de temps ou jusqu'à quand souhaitez-vous mettre en pause ?" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Désolé, nous n'avons pas pu interpréter ça. Essayez encore." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Mettre en pause pour…" #: 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 Oldest→Newest" msgstr "Trier par Age Moins récent→Plus récent" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Trier par âge Plus récent→Moins récent" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Trier par nom A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Trier par nom Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Trier par taille Plus petit→Plus grand" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Trier par taille Plus grand→Plus petit" #: sabnzbd/skintext.py msgid "Uploading" msgstr "Upload en cours" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "Déconnexion forcée en cours" #: sabnzbd/skintext.py msgid "Removing job" msgstr "Suppression de la tâche" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "Suppression des tâches" #: sabnzbd/skintext.py msgid "Prev" msgstr "Préc." #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Suiv." #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "Vider l'historique ?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Vous devez activer JavaScript pour que Plush puisse fonctionner !" #: sabnzbd/skintext.py msgid "Options" msgstr "Options" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Mettre en pause pour combien de minutes ?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Afficher/Masquer menu" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Une fois terminé" #: sabnzbd/skintext.py msgid "Sort" msgstr "Trier" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Trier par âge (Moins récent→Plus récent)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Trier par âge (Plus récent→Moins récent)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Trier par nom (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Trier par nom (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Trier par taille (Plus petit→Plus grand)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Trier par taille (Plus grand→Plus petit)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "Vider la file d'attente ?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Réessayez toutes les tâches échouées de l'historique ?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Vider" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Vitesse max." #: sabnzbd/skintext.py msgid "Range" msgstr "Plage" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Appliquer à la sélection" #: sabnzbd/skintext.py msgid "Everything" msgstr "Tout" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Fréquence de rafraîchissement" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Largeur de l'affichage" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Permet d'éviter le rafraîchisssment du contenu quand la souris survole la " "file d'attente." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Bloquer rafraîchissements au survol" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Envoyer" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Uploader : .nzb, .rar, .zip, .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Avancement" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Espace disque insuffisant pour terminer les téléchargements!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Libre (Temp)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "A L'ARRET" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Téléchargements" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "Assistant de configuration SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "Version de SABnzbd" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Précédent" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Détails du serveur" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Entrez les informations de votre principal fournisseur usenet." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Le nombre de connexions autorisées par votre fournisseur usenet" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "Ex. : 8 ou 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "" "Cochez uniquement si votre fournisseur usenet permet les connexions SSL." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Cliquez pour tester les informations entrées." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Par ex. :" #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "La configuration est terminée!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd fonctionnera dorénavant en arrière plan." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "" "Fermer la fenêtre/onglet de votre navigateur NE QUITTERA PAS SABnzbd." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Il est recommandé de faire un clic-droit et d'ajouter cette page à vos " "favoris pour accéder à SABnzbd quand il tourne en arrière plan." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Une aide supplémentaire peut être trouvée sur notre" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "Aller à SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "Quitter SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Lancer l'assistant" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd est fourni sans AUCUNE GARANTIE.\n" "Ce logiciel est gratuit, et vous êtes invité à le redistribuer sous " "certaines conditions.\n" "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] msgid "Error getting TV info (%s)" msgstr "Erreur lors de l'obtention des information TV (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "Échec du renommage : %s en %s" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "Impossible de renommer le fichier similaire : %s en %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Accès non autorisé" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "Fichier introuvable sur le serveur" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "Le serveur n'a pas pu terminer la requête" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "L'URLGRABBER A PLANTÉ" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "Fichier NZB inutilisable" #: sabnzbd/urlgrabber.py 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." #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "La version de votre binaire UNRAR n'est pas recommandée, Vous pouvez " #~ "l'obtenir ici http://www.rarlab.com/rar_add.htm
" #~ msgid "Initiating restart...
" #~ msgstr "Initialisation du redémarrage...
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "%s a été remis en file d'attente" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "" #~ "Les éléments marqués avec '*' ne seront pas automatiquement téléchargés." #~ msgid "Not matched" #~ msgstr "Ne correspond pas" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Impossible de se connecter au registre HKEY_CURRENT_USER." #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Impossible d'ouvrir la clé de registre \"%s\"." #~ msgid "You have no permisson to use port %s" #~ msgstr "Le port %s n'est pas accessible" #~ msgid "ERROR: %s" #~ msgstr "ERREUR : %s" #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "Le fichier attendu est manquant : %s => erreur unrar ?" #~ msgid "Error importing OpenSSL module. Connecting with NON-SSL" #~ msgstr "Erreur lors de l'importation du module OpenSSL. Connection sans SSL" #~ msgid "No post-processing because of failed verification" #~ msgstr "Pas de post-traitement car la vérification a echoué" #~ msgid "View script output" #~ msgstr "Voir le résultat du script" #~ msgid "Error removing workdir (%s)" #~ msgstr "Erreur lors de la suppression du dossier de travail (%s)" #~ msgid "WARNINGS" #~ msgstr "AVERTISSEMENTS" #~ msgid "Add new downloads" #~ msgstr "Ajouter de nouveaux téléchargements" #~ msgid " or Report ID" #~ msgstr " ou Report ID" #~ msgid "Sort by name" #~ msgstr "Trier par nom" #~ msgid "Sort by age" #~ msgstr "Trier par âge" #~ msgid "Sort by size" #~ msgstr "Trier par taille" #~ msgid "Remain/Total" #~ msgstr "Restant/Total" #~ msgid "History Size" #~ msgstr "Taille Historique" #~ msgid "Show Weblogging" #~ msgstr "Afficher les weblogs" #~ msgid "Activate an alternative skin." #~ msgstr "Choisissez un thème pour la 2nde interface web." #~ msgid "HTTPS Support" #~ msgstr "Support HTTPS" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "" #~ "Intervalle de rafraichissement dans l'interface web (en sec, 0=aucun)." #~ msgid "Disable API-key" #~ msgstr "Désactiver la clé API" #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "A utiliser à vos risques et périls!" #~ msgid "Folder configuration" #~ msgstr "Configuration des dossiers" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "Dossier contenant les scripts utilisés lors du post-traitement." #~ msgid "Switches configuration" #~ msgstr "Configuration des options" #~ msgid "Processing Switches" #~ msgstr "Options de traitement" #~ msgid "Enable Unrar" #~ msgstr "Activer Unrar" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Activer la fonctionnalité unrar intégrée." #~ msgid "Enable built-in unzip functionality." #~ msgstr "Activer la fonctionnalité unzip intégrée." #~ msgid "Default Post-Processing" #~ msgstr "Post-traitement par défaut" #~ msgid "Default User Script" #~ msgstr "Script utilisateur par défaut" #~ msgid "Default Priority" #~ msgstr "Priorité par défaut" #~ msgid "Other Switches" #~ msgstr "Autres options" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Remplacer les caractères illégaux dans les noms de dossier" #~ msgid "Do not download" #~ msgstr "Ne pas télécharger" #~ msgid "Click below to test." #~ msgstr "Cliquer ci-dessous pour tester." #~ msgid "Remove" #~ msgstr "Supprimer" #~ msgid "RSS Configuration" #~ msgstr "Configuration RSS" #~ msgid "Delete Feed" #~ msgstr "Supprimer le flux" #~ msgid "User-defined categories" #~ msgstr "Catégories utilisateur" #~ msgid "Defines post-processing and storage." #~ msgstr "Définit le post-traitement et le stockage." #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Active le classement et le renommage des épisodes." #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "Activer si les téléchargement ne sont pas dans leur propre dossier." #~ msgid "Are you sure you want to delete" #~ msgstr "Etes-vous sûr de vouloir supprimer ?" #~ msgid "First" #~ msgstr "Premier" #~ msgid "Last" #~ msgstr "Dernier" #~ msgid "Close" #~ msgstr "Fermer" #~ msgid "Pause for 12 hours" #~ msgstr "Pause pour 12 heures" #~ msgid "Pause for 24 hours" #~ msgstr "Pause pour 24 heures" #~ msgid "Open Source URL" #~ msgstr "Ouvrir URL Source" #~ msgid "Plush Options" #~ msgstr "Options Plush" #~ msgid "Hour:Min" #~ msgstr "Heure:Min" #~ msgid "Delete the all failed items from the history?" #~ msgstr "Supprimer tous les éléments échoués de l'historique ?" #~ msgid "Links" #~ msgstr "Liens" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Affiche %s de %s sur %s résultats" #~ msgid "Saved" #~ msgstr "Enregistré" #~ msgid "DualView1" #~ msgstr "VueDuoV" #~ msgid "DualView2" #~ msgstr "VueDuoH" #~ msgid "Access" #~ msgstr "Accès" #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Je veux que SABnzbd ne soit accessible que depuis mon ordinateur." #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "" #~ "Lancer mon navigateur internet avec l'adresse de SABnzbd au démarrage de " #~ "l'application." #~ msgid "Please enter a whole number." #~ msgstr "Entrez un numéro." #~ msgid "_yenc module... NOT found!" #~ msgstr "module _yenc... Introuvable!" #~ msgid " " #~ msgstr " " #~ msgid "Page" #~ msgstr "Page" #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "" #~ "Protection de l'interface de SABnzbd par un mot de passe (recommandé)" #~ msgid "Web server authentication" #~ msgstr "Authentification Serveur Web" #~ msgid "New Feed URL" #~ msgstr "URL Nouveau Flux" #~ msgid "Showing one result" #~ msgstr "Affichage d'un seul résultat" #~ msgid "Scheduling configuration" #~ msgstr "Configuration de la planification" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd n'est pas compatible avec certains pare-feu logiciels.
\n" #~ " %s
\n" #~ " Désolé, mais nous ne pouvons pas résoudre cette incompatibilité pour le " #~ "moment.
\n" #~ " S'il vous plaît faite une demande à l'éditeur de votre pare-feu.
\n" #~ "
\n" #~ msgid "OK" #~ msgstr "OK" #~ msgid "No email templates found" #~ msgstr "Aucun modèle email trouvés" #~ msgid "Backup server" #~ msgstr "Serveur de soutien" #~ msgid "Feeds" #~ msgstr "Flux" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "Utiliser V23 à moins que votre fournisseur exige un autre type!" #~ msgid "Complete Dir" #~ msgstr "Dossier Complet" #~ msgid "Left" #~ msgstr "Restant" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "Utilise les serveurs de soutien si il y a des erreurs CRC yEnc." #~ msgid "Get NZB" #~ msgstr "Récupérer NZB" #~ msgid "Invalid encoding of email template %s" #~ msgstr "Codage non valide pour le modèle d'email %s" #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Échec de la lecture des clés de registre pour les dossiers spéciaux" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "" #~ "Échec de la suppression du nzo de la file d'attente de post-traitement (id)" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "Ex: 119 ou 563 pour le SSL" #~ msgid "Filters" #~ msgstr "Filtres" #~ msgid "Delete all failed items from History?" #~ msgstr "Supprimer tous les éléments erronés de l'historique?" #~ msgid "Purge Failed History" #~ msgstr "Purger Historique erronés" #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Échec lors d'erreurs CRC yEnc" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "Utilisé quand la catégorie ne précise pas de choix." #~ msgid "Used when no user script is defined by the category." #~ msgstr "Utilisé quand la catégorie ne précise pas de script." #~ msgid "Used when no priority is defined by the category." #~ msgstr "Utilisé quand la catégorie ne précise pas de priorité." #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "Remplace les caractères illégaux dans les noms de dossier par des " #~ "équivalents (sinon les supprime)." #~ msgid "Server configuration" #~ msgstr "Configuration du Serveur" #~ msgid "Server definition" #~ msgstr "Définition du Serveur" #~ msgid "Add Feed" #~ msgstr "Ajouter un flux" #~ msgid "Settings" #~ msgstr "Paramètres" #~ msgid "Sorting configuration" #~ msgstr "Configuration du tri" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Active le tri et le renommage générique des fichiers." #~ 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" #~ msgid "Storage" #~ msgstr "Stockage" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Envoyer : .nzb .rar .zip .gz" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Lire RSS obtient le contenu du flux en cours. " #~ "Forcer téléchargements pour télécharger de suite tous les " #~ "NZB correspondants." #~ msgid "Show Edit Options" #~ msgstr "Afficher les options d'édition" #~ msgid "Edit" #~ msgstr "Éditer" #~ msgid "Hide Edit Options" #~ msgstr "Cacher les options d'édition" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Activer l'accès à SABnzbd via HTTPS." #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "" #~ "Je veux que SABnzbd soit accessible à partir de tous les ordinateurs de mon " #~ "réseau." #~ msgid "Misc" #~ msgstr "Divers" #~ msgid "This field is required." #~ msgstr "Ce champ est obligatoire." #~ msgid "Step One" #~ msgstr "Étape 1" #~ msgid "Step Two" #~ msgstr "Étape 2" #~ msgid "Step Three" #~ msgstr "Étape 3" #~ msgid "Step Four" #~ msgstr "Étape 4" #~ msgid "Step Five" #~ msgstr "Étape 5" #~ msgid "Pause Interval" #~ msgstr "Intervalle pause" #~ msgid "Check result of unpacking" #~ msgstr "Vérifier le résultat de l'extraction" #~ msgid "Only for optional servers" #~ msgstr "Uniquement pour les serveurs optionnels" #~ 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" #~ msgid "Queued" #~ msgstr "Mis en file d'attente" #~ msgid "Download speed" #~ msgstr "Vitesse de téléchargement" #~ msgid "Thread" #~ msgstr "Traitement" #~ msgid "General configuration" #~ msgstr "Configuration générale" #~ msgid "Queue auto refresh interval:" #~ msgstr "Intervalle de rafraîchissement automatique de la file d'attente:" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Dossier des scripts de post-traitement" #~ msgid "QR Code" #~ msgstr "Code QR" #~ msgid "Enable Par Cleanup" #~ msgstr "Activer nettoyage Par" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "Utiliser l'horloge 12 heures (AM/PM)" #~ msgid "Secondary Web Interface" #~ msgstr "Interface Web secondaire" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Affiche l'heure au format AM/PM (n'affecte pas la planification)." #~ msgid "SSL type" #~ msgstr "Type SSL" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "" #~ "Supprime les fichiers Par2 (uniquement si la vérification/réparation a " #~ "réussie)." #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Vérifie le résultat de l'extraction (doit être désactivée pour certains " #~ "systèmes de fichiers)." #~ msgid "Email Options" #~ msgstr "Options email" #~ msgid "Email Account Settings" #~ msgstr "Paramètres du compte email" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Envoie les notifications à NotifyOSD" #~ msgid "Generic Sorting" #~ msgstr "Tri générique" #~ msgid "Notification classes" #~ msgstr "Classes de notification" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "" #~ "Activer les classes de messages qui doivent être communiqués (aucun, un ou " #~ "plusieurs)" #~ msgid "Send notifications to Notification Center" #~ msgstr "Envoyer des notifications au centre de notification" #~ msgid "Refer to https://www.oznzb.com/profile" #~ msgstr "Reportez-vous à https://www.oznzb.com/profile" #~ msgid "Automatic Feedback" #~ msgstr "Commentaires automatique" #~ msgid "Site API Key" #~ msgstr "Clé API du site" #~ msgid "Enable OZnzb Integration" #~ msgstr "Activer l'intégration de OZnzb" #~ msgid "OZnzb" #~ msgstr "OZnzb" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "" #~ "Envoyer les résultats de la validation calculées automatiquement pour les " #~ "téléchargements à l'indexeur." #~ msgid "Folder \"%s\" does not exist" #~ msgstr "Le dossier \"%s\" est introuvable" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "" #~ "AVERTISSEMENT : mise en pause de \"%s\" à cause de fichiers RAR cryptés" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "" #~ "AVERTISSEMENT : tâches \"%s\" interrompues à cause de fichiers RAR cryptés" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "" #~ "Aucun programme PAR2 n'a été trouvé, les réparations ne sont pas " #~ "possibles
" #~ 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 "File %s is empty, skipping" #~ msgstr "Fichier %s vide, ignoré" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd a besoin d'un port tcp/ip libre pour le serveur Web " #~ "interne.
\n" #~ " La plage de ports %s a %s a été essayée mais le compte utilisé pour " #~ "SABnzbd n'a pas la permission de l'utiliser.
\n" #~ " Sur les systèmes OSX et Linux, les utilisateurs normaux doivent utiliser " #~ "des ports supérieurs à 1023.
\n" #~ "
\n" #~ " Veuillez redémarrer SABnzbd avec un port différent." #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Il est probable que vous utilisiez ZoneAlarm sur Vista.
" #~ msgid "Hide files" #~ msgstr "Masquer les fichiers" #~ msgid "Email Test Result" #~ msgstr "Résultat du test e-mail" #~ msgid "Do not require the API key." #~ msgstr "Ne pas exiger la clé API (pour l'interaction avec SABnzbd)." #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Ignorer la vérification par2 quand les fichiers sont valides à 100%." #~ msgid "Enable Quick Check" #~ msgstr "Activer le contrôle rapide" #~ msgid "Enable Filejoin" #~ msgstr "Activer la fusion des fichiers" #~ msgid "Enable TS Joining" #~ msgstr "Activer la fusion TS" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "Fusionner les fichiers .001, .002, etc. en un seul fichier." #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "Fusionne les fichiers .001.ts, .002.ts, etc. en un seul fichier." #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "" #~ "Aucun programme UNRAR n'a été trouvé, l'extraction des fichiers RAR est " #~ "impossible
" #~ msgid "Unpacking failed, these file(s) are missing:" #~ msgstr "L'extraction a échoué, ces fichiers sont manquants :" #~ msgid "Unpacking failed, see log" #~ msgstr "Échec de l'extraction, voir le journal" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "Échec de l'extraction, un fichier attendu n'a pas été décompressé" #~ msgid "Enable MultiCore Par2" #~ msgstr "Activer le 'Par2 Multi-processeur'" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Applique les tentatives maximums uniquement aux serveurs optionnels" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Cette clé fournit l'identité à l'indexeur. Reportez-vous à " #~ "https://www.oznzb.com/profile." #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Activer les fonctionnalités avancées comme les classements et les " #~ "informations d'état supplémentaires quand connecté à l'indexer OZnzb." #~ msgid "Skip" #~ msgstr "Ignorer" #~ msgid "Send notifications to Growl" #~ msgstr "Envoie les notifications à Growl" #~ msgid "Groups / Indexer tags" #~ msgstr "balises Groupes / Indexeur" #~ msgid "Original Foldername" #~ msgstr "Nom du dossier originel" #~ msgid "Delete Failed" #~ msgstr "Supprimer les échoués" #~ msgid "Delete Completed" #~ msgstr "Supprimer les terminés" #~ msgid "Email Sent!" #~ msgstr "Email envoyé !" #~ msgid "No results" #~ msgstr "Aucun résultat(s)" #~ msgid "Timeleft" #~ msgstr "Temps restant" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "Êtes-vous sûr de vouloir redémarrer SABnzbd ?" #~ msgid "Toggle Add NZB" #~ msgstr "Afficher / Masquer Ajout NZB" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Après que SABnzbd a fini de redémarrer, vous serez en mesure d'y accéder à " #~ "l'adresse suivante : %s" sabnzbd-develop/po/main/sv.po0000600000175000017500000042170113642116632014274 0ustar jpjp# Swedish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2018-02-14 14:19+0000\n" "Last-Translator: Safihre \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:03+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Det gick inte att starta webbgränssnittet" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "Hittar inte webbmall: %s, försöker med standardmall" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "par2 binär... EJ funnen!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "Din UNRAR version är %s, vi rekommenderar version %s eller högre.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "unrar binär... EJ funnen!" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "unzip binär... EJ funnen!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "7za binär... EJ funnen!" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Tänk pÃ¥ att värdnamnet 0.0.0.0 behöver en IPv6-adress för extern Ã¥tkomst" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "HTTP och HTTPS portar kan inte vara likadana" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "Avaktiverade HTTPS dÃ¥ CERT och KEY -filer saknas" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Misslyckades att starta webbgränsnitt: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "Kan inte nÃ¥ SABHelper tjänsten" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s startad" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Varning" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Fel" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "SABnzbd nedstängning utförd." #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Adressen är inte angiven." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "" "Inga anslutningar är aktiverade. Var vänlig aktivera minst en anslutning." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Lösenordet är dolt med ******, försök igen" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Ogiltiga serverdetaljer" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "Timeout: Försök aktivera SSL eller anslut via en annan port." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Timeout" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Ogiltig serveradress" #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Servern avslutades under inloggning" #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Servern kräver användarnamn och lösenord." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Anslutning lyckades!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Autentisering misslyckades, kontrollera användarnamn och lösenord." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "För mÃ¥nga anslutningar, pausa en nedladdning eller försök igen senare" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Det gick inte att ansluta (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Signal %s mottagen, sparar och stänger..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Kritiskt fel vid sparande av läge" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Försöker att hämta NZB frÃ¥n %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Sparar %s misslyckades" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Kan inte skapa temp -fil för %s" #: sabnzbd/__init__.py [Warning message] 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 [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Fel i tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Laddning av %s misslyckades" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "E-mail sändning lyckades" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Testa notifikation" #: sabnzbd/api.py msgid " Resolving address" msgstr " Lösa adress" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Standard" #: sabnzbd/api.py msgid "unknown" msgstr "okänd" #: sabnzbd/api.py [Error message] 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..." #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Diskfel vid skapande av fil %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Kritiskt fel i Assembler" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Avbruten, kryptering detekterad." #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "Varning: I \"%s\" otillÃ¥ten filändelse i RAR-filen. OtillÃ¥tna filen är %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "Oönskad filändelse i RAR-fil %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Avbruten, oönskad filändelse detekterad" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "VARNING: Pausat jobb \"%s\" pga betyg (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "VARNING: Avbrutet jobb \"%s\" pga betyg (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Avbrutet, betyget matchade (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s saknas" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "video" #: sabnzbd/assembler.py msgid "audio" msgstr "ljud" #: sabnzbd/assembler.py msgid "spam" msgstr "spam" #: sabnzbd/assembler.py msgid "passworded" msgstr "lösenordskyddad" #: sabnzbd/assembler.py msgid "downvoted" msgstr "nedröstad" #: sabnzbd/assembler.py msgid "keywords" msgstr "nyckelord" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Din kvot är uppnÃ¥dd, pausar nerladdning" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s är inte en godkänd e-mail adress" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Kräver serveradress" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Kan inte skapa %s mapp %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Kan inte skriva till INI filen %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Kan inte skapa backup-fil för %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Felaktigt kodat lösenord %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s är inte rätt siffervärde" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "UNC sökväg \"%s\" är inte tillÃ¥ten här" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Fel: Sökvägen skall vara under %s." #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Fel: Kön är inte tom, kan inte byta mapp." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" "Kan inte skriva till historikdatabasen, kontrollera Ã¥tkomsträttigheter!" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "Skadad hitsotrikdatabas, skapade en tom ersättare" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "SQL Kommando 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" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Felaktig loggning i historiken av %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Avkodning av %s misslyckades" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Felaktigt utformad yEnc artikel i %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Okänt fel under avkodning av %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => saknas frÃ¥n alla servrar, kastar" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Färdig" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "Uppackad %s filer/mappar i %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [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] msgid "Error while adding %s, removing" msgstr "Det gick inte att lägga till %s, tar bort" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Fel vid borttagning av %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Kan ej läsa övervakad mapp %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Fortsätter" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "Pausad" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "Du mÃ¥ste ange maximal bandbredd innan du kan ange bandbreddsgräns" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Kan ej ansluta till server %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Servernamn kunde inte läsas" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Server %s kommer att ignoreras i %s minuter" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Misslyckades att initiera %s@%s med orsak %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "För mÃ¥nga anslutningar till servern %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Misstänkt kontodelning" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Det gick inte att logga in pÃ¥ server %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Anslutning %s@%s misslyckades, meddelande=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Server %s kräver användarnamn/lösenord" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Misstänker fel i nedladdare" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "PÃ¥börjar nedstängning av SABnzbd.." #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Det gick inte att ansluta till mailserver" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "Det gick inte att initialisera TLS anslutning" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "Servern svarade inte ordentligt till hälsningen" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Autentisering till mailserver misslyckades" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Ingen passande autentikationsmetod hittades" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Okänd autentikationmisslyckande i mailservern" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Det gick inte att skicka e-mail" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Det gick inte att stänga e-mail anslutning" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Ingen mottagare angiven, ingen e-post har skickats" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "Till: %s\n" "FrÃ¥n: %s\n" "Datum: %s\n" "Ämne: SABnzbd rapporterar att disk är full\n" "\n" "Hej,\n" "\n" "SABnzbd har stoppat nerladdningen pÃ¥ grund av att din disk inte har " "tillräckligt med utrymme kvar.\n" "Frigör utrymme och Ã¥teruppta nerladdningen manuellt.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Kan ej skapa mapp %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "%s mapp: %s Ã¥tkomst misslyckad" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Det gick inte att ändra rättigheter pÃ¥ %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Skapande av (%s) misslyckades" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Det gick inte att flyta %s till %s" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Saknar sessionsnyckel" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Fel: Kräver sessionsnyckel" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Fel: Fel sessionsnyckel" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "API-nyckel saknas, skriv in api-nyckeln frÃ¥n Konfiguration-> Allmänt i ditt " "tredjepartsprogram:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "API-nyckel felaktig, använd api-nyckeln frÃ¥n Konfiguration-> Allmänt i ditt " "tredjepartsprogram:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Autentisering saknas, ange användarnamn / lösenord frÃ¥n Konfiguration-> " "Allmänt i ditt tredjepartsprogram:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Testa vÃ¥rat nya tema Glitter! Ny fräsch design som är optimerad för " "stationära och mobila enheter. GÃ¥ till Inställningar -> Allmänt för att byta " "tema." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
SABnzbd nedstängning färdig.
Vänta ungefär 5 sekunder och " "klicka sedan på knappen under..

Ladda " "om
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Varning: LOCALHOST är tvetydigt, använda numerisk IP-adress ." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "Serveradressen \"%s:%s\" är ej giltig." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Flöde" #: sabnzbd/interface.py msgid "Daily" msgstr "Dagligen" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "Måndag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Tisdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Onsdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Torsdag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Fredag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Lördag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Söndag" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "av" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Odefinerad server!" #: 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 msgid "Back" msgstr "Bakåt" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "FEL:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Fel värde för %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "d" #: sabnzbd/misc.py msgid "h" msgstr "h" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Det gick inte att skapa SSL-nyckel eller certifikat." #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Kör skript" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Efterbehandling avbröts (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Skript" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Nästling för djup [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Slår ihop" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Ej komplett sekvens av filer för ihopläggning" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Filsammanslagning av %s misslyckades" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Fel \"%s\" under filsammanslagning" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Fel \"%s\" när du kör file_join på %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] Slår ihop %s filer" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Uppackning misslyckades, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Fel \"%s\" under uppackning av RAR fil(er)" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Fel \"%s\" när du kör rar_unpack på %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Borttagning av %s misslyckades!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Försöker att packa upp med lösenord %s" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Uppackning misslyckades, arkivet kräver lösenord" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Packar upp" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Packa upp" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Uppackning misslyckades, gick inte att hitta %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "FEL: gick inte att hitta \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Uppackning misslyckades, CRC-fel" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "FEL: CRC misslyckades i \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "Uppackning misslyckades, skrivfel eller disken full?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "FEL: skrivningsfel (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Uppackning misslyckades, sökvägen är för lång" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "FEL: sökvägen är för lång (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Oanvändbar RAR-fil" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s filer i %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Fel \"%s\" när du kör unzip() på %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Provar 7zip med lösenord \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "7ZIP set \"%s\" är inte komplett, kan inte packa upp" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Kunde inte packa upp %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Snabbkontrollerar" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Reparera" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Snabbkontroll OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Startar reparation" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Reparation misslyckades, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Fel %s när du kör par2_repair på %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Fel \"%s\" medans par2_repair kördes på %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2 har fått felaktiga alternativ, ändra dessa via Config->Switches " "inställningarna" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Verifierad i %s, alla filer är ok" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Verifiering i %s, kräver reparation" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Hämtar %s block..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Hämtar" #: 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 msgid "Repairing" msgstr "Reparerar" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Reparerad i %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Disken är full" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Verifierar" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Kontrollerar" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Den här servern tillåter in SSL på denna port" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Starta/Stäng" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "NZB tillagd" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Efterbehandling påbörjad" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Arbetet utförd" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Jobb misslyckades" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Kön färdig" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Andra meddelanden" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "Ej tillgänglig" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Misslyckades att skicka Prowlmeddelande" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Dålig respons från Pushover (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "Misslyckades att skicka pushovermeddelande" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "Dålig respons från Pushbullet (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Misslyckades att skicka pushbulletmeddelande" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Det gick inte att importera %s filer från %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Felaktig köfil funnen, kan ej fortsätta" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Laddningsfel %s, felaktig fil detekterad" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB tillagd i kön" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Okänd kodning" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "NZB filen %s är inte komplett" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Felaktig NZB fil %s, hoppar över (orsak=%s, linje=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "NZB filen %s är tom" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Ignorerar dubblett för NZB \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Pausar dubblett för NZB \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Avbrutet, kan inte slutföras" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DUBLETT" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "KRYPTERAT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "FÖR STOR" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "INKOMPLETT" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "OÖNSKAD" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "FILTRERAD" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "VÄNTA %s SEKUNDER" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Hämtade i %s vid ett genomsnitt på %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Ålder" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s artiklar var felaktiga" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s artiklar saknades" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s artiklar hade icke-matchande dubletter" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s artiklar borttagna" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Det gick inte att importera %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Varningar" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Inaktiv" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Konfiguration" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Kö" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Rensa kö" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Historik" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Töm historik" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Hastighetsbegränsning" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Pausa" #: sabnzbd/osxmenu.py msgid "min." msgstr "min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Återuppta" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Scanna bevakad mapp" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Läs alla RSS-flöden" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Färdig mapp" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Ofullständig mapp" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Felsök" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Starta om" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Starta om utan login" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Avsluta" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Kö (10 första sakerna)" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Tom" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Historik (10 senaste sakerna)" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Ny utgåva tillgänglig" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Gå till guiden" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Stänger..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Problem med" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd behöver en ledig tcp/ip -port för sin interna webbserver.
\n" " Port %s på %s testades , men den är inte tillgänglig.
\n" " Någon annan applikation använder porten eller så körs redan " "SABnzbd.
\n" "
\n" " Vänligen starta om SABnzbd med ett annat portnummer." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "" "Om du får detta felmeddelande igen, var vänlig försök med en annan " "siffra.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd behöver en giltig värdadress för dess interna webbserver.
\n" " Du har specifierat en ogiltig adress.
\n" " Säkra värdadresser är localhost och 0.0.0.0
\n" "
\n" " Var vänlig starta om SABnzbd med en giltig värdadress." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd har upptäckt sparad data från en annan version av SABnzbd
\n" " men kan inte återanvända datan från det andra programmet.

\n" " Färdigställ dina nedladdningar med det andra programmet först.

\n" " Därefter kan du starta det här programmet med alternativet \"--" "clean\".
\n" " Detta kommando kommer att ta bort din nuvarande kö och historik!
\n" " SABnzbd read the file \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd kan inte hitta webbgränssnittets filer i %s.
\n" " Var vänlig installera om programmet.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd upptäckte ett allvarligt fel:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd upptäckte att filen sqlite3.dll saknas.

\n" " Det händer att bristfälligt designade virusprogram tar bort denna " "fil.
\n" " Var vänlig kontrollera ditt virusprogram, försök installera om SABnzbd " "och klaga till din återförsäljare.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Tryck på Startknappen+R och skriv raden (exempel):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Öppna ett Terminal-fönster och skriv raden (exempel):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Programmet startade inte!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "Allvarligt fel" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Kan inte starta webbläsaren, hittades troligtvis inte" #: sabnzbd/panic.py msgid "Access denied" msgstr "Åtkomst nekades" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Error %s: Du måste ange ett giltigt användarnamn och lösenord." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "Gammal kö hittad, använd Status -> Reparera för att konvertera kön" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" msgstr "" #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "" "Nerladdningen kan misslyckas, bara %s av krävda %s finns tillgängligt" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Nerladdning misslyckades - Inte på din server eller servrar" #: sabnzbd/postproc.py msgid "Moving" msgstr "Flyttar" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "Skickat %s till kö" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Det gick inte att döpa om \"%s\" till \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Misslyckades med att flytta filer" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Kör användarskript %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "Körde %s" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Skriptets utgångskod är %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Mer" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Efterbehandling misslyckades för %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "se loggfil" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Hämtning misslyckades" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Rensning av %s misslyckades." #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Hämtningen slutfördes" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Kan inte skapa slutgiltig mapp %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Efterbehandling" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Ingen par2 sats" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Försöker verifiera SFV" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Some files failed to verify against \"%s\"" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Verifieringen lyckades med SFV-filer" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Lösenordskyddad" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Borttagning av %s misslyckades" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Kunde inte sätta systemet i vänteläge" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Det gick inte att sätta systemet i viloläge" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Fel uppstod då systemet skulle stängas" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Index id (%s) inte hittad för betygsfil" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Serveradress" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "API-nyckel" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Felaktigt RSS-flödesbeskrivning \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Det gick inte att hämta RSS flödet från %s: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Har inte giltig autentisering för flöde %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "Server fel (serverkod %s); kunde inte få %s på %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Server %s använder ett otillförlitlig HTTPS-certifikat" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "RSS-flödet %s var tomt" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Inkompatibel feed" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Tom RSS post hittades (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Visa gränssnitt" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Öppna färdig mapp" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Pausa för" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Pausa 5 minuter" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Pause 15 minuter" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Pausa 30 minuter" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Pausa 1 timme" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Pausa 3 timmar" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Pausa 6 timmar" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Stäng Av" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Återstår" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Lägg till NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Fel schema %s vid %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Okänd åtgärd: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Schema för icke existerande server %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Nedladdning" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Slår ihop filer" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Källa" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Servrar" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Misslyckades" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Misslyckades" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Väntar" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Reparerar..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Extraherar..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Flyttar..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Kör skript..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Hämtar extra block..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Snabbkontroll..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Verifierar..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Laddar ner" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Uppgift" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "avaktivera server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "aktivera server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Hastighetsgräns" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Pausa Allt" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Pausa efterbehandla" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Återuppta efterbehandla" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Läs RSS-flöden" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Ta bort misslyckade jobb" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Ta bort färdiga jobb" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Pausa lågprioriterade jobb" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Pausa normalprioriterade jobb" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Pausa högprioriterade jobb" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Återuppta lågprioriterade jobb" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Återuppta normalprioriterade jobb" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Återuppta högprioriterade jobb" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Aktivera kvothantering" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Av" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Mycket låg" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Medel" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normal" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Hög" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Nödfall" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Låg" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "timme" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "timmar" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "min" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "minuter" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "sek" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "sekunder" #: sabnzbd/skintext.py msgid "day" msgstr "dag" #: sabnzbd/skintext.py msgid "days" msgstr "dagar" #: sabnzbd/skintext.py msgid "week" msgstr "vecka" #: sabnzbd/skintext.py msgid "Month" msgstr "Månad" #: sabnzbd/skintext.py msgid "Year" msgstr "År" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Månadsdag" #: sabnzbd/skintext.py msgid "This week" msgstr "Denna vecka" #: sabnzbd/skintext.py msgid "This month" msgstr "Denna månad" #: sabnzbd/skintext.py msgid "Today" msgstr "I dag" #: sabnzbd/skintext.py msgid "Total" msgstr "Totalt" #: sabnzbd/skintext.py msgid "on" msgstr "den" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parametrar" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Python-version" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Webbplats" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "eller" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Adress" #: sabnzbd/skintext.py msgid "Comment" msgstr "Kommentar" #: sabnzbd/skintext.py msgid "Send" msgstr "Skicka" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Avbryt" #: sabnzbd/skintext.py msgid "Other" msgstr "Annat" #: sabnzbd/skintext.py msgid "Report" msgstr "Rapportera" #: sabnzbd/skintext.py msgid "Video" msgstr "Video" #: sabnzbd/skintext.py msgid "Audio" msgstr "Ljud" #: sabnzbd/skintext.py msgid "Not used" msgstr "Inte använd" #: sabnzbd/skintext.py msgid "or less" msgstr "eller mindre" #: sabnzbd/skintext.py msgid "Log in" msgstr "" #: sabnzbd/skintext.py msgid "Log out" msgstr "" #: sabnzbd/skintext.py msgid "Remember me" msgstr "" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "Det automatiska usenet nedladdningsverktyget" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Spara" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Sparar.." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Är du säker?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Ta bort alla nedladdade filer?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Hem" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Konfiguration" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Status" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Hjälp" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Forum" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Allmänt" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Mappar" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Switchar" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Schemaläggare" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Meddelanden" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "E-post" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Kategorier" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Sortering" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Speciell" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Sök" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Temporär nedladdningmapp" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "PAUSAD" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "Sparat %s artiklar (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Systembelastning" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Ny utgåva %s tillgänglig" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Är du säker på att du vill stänga av SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Lägg till" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Lägg till fil" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Kategori" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Bearbetar" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Prioritet" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Reparera" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Packar upp" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Ta bort" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "P" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "D" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Tvinga" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Stopp" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "Ange URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "När kön är färdig" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Stäng av PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "Sparläge PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Viloläge PC" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Stäng av SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Hastighetsgräns" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Ordning" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Namn" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "Tid kvar" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "År" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Ta bort" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Försök igen" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Åtgärder" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Skript" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Ta bort alla saker från kön?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Rensa NZB:er" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Rensa NZB:er och ta bort filer" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Starta om alla misslyckade jobb" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Ta bort NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Ta bort NZB och filer" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "av" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Saknade artiklar" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Kvot kvar" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "manuell" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Återställ Kvot nu" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Ta bort alla slutförda objekt från Historik?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Göm detaljer" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Visa detaljer" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Visa Misslyckade" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Visa alla" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Storlek" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Rensa Misslyckade NZB:er." #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Rensa Misslyckade NZB:er och ta bort filer" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Rensa färdiga NZB:er" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "Valfri Kompletterande NZB" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Sökväg" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Starta om alla mysslyckade" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Starta om alla" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Slut på retention" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Andra fel" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Tvinga frånkoppling" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Detta kommer att skicka ett test e-mail till ditt konto." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Visa logg" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Testa E-post" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Loggning" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Fel/Varning" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Info" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Debug" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Anslutningar" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Senaste Varningar" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "rensa" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Ta bort blockering" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Artikel-ID" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Filuppsättning" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "När" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Typ" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Aktiverad" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Instrumentpanel" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Anslutning misslyckades!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Lokal IPv4 adress" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Publik IPV4 adress" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "IPv6-adress" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Namnserver /DNS Lookup" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "CPU Modell" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Systemprestanda (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Nerladdningsmapphastighet" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Komplett mapphastighet" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Skrivhastighet" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "Kunde inte skriva. Kontrollera att sökvägen är skrivbar" #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Klicka på \"Gör om test\" nedan för att bestämma" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Gör om test" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "Konfig fil" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Använt cache" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Detta kommer att starta om SABnzbd.
Använd det när du tror att " "programmet har stabilitetsproblem.
Nerladdningar kommer att pusas innan " "omstarten och återupptas efteråt." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Det finns övergivna jobb i nedladdningsmappen.
Du kan välja mellan att " "radera dem (inklusive filer) eller skicka tillbaka dem i kön." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Ändringarna har inte sparats och kommer att försvinna." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Aktivera Unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "Aktivera 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "Version" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Upptid" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Säkerhetskopiera" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Läs Wiki Help för detta!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Startar om SABnzbd..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Ändringar kräver omstart av SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "SABnzbd Webbserver" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "SABnzbd Adress" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Adress som SABnzbd ska lyssna på." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "SABnzbd-port" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Port som SABnzbd ska lyssna på." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Webbkontrollsutseende" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Välj ett skin." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "SABnzbd Användarnamn" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Väljbart autentiserings användarnamn." #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "SABnzbd Lösenord" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "HTTPS Aktivera" #: sabnzbd/skintext.py msgid "not installed" msgstr "inte installerad" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Aktivera åtkomst till webbkontrollen med HTTPS adress." #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "HTTPS-port" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Om tom kommer standardporten endast lyssna till HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "HTTPS Certifikat" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Filnamn eller sökväg till HTTPS Certifikat." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "HTTPS Nyckel" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Filnamn eller sökväg till HTTPS Nyckel." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "HTTPS-kedjecertifikat" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Filnamn eller sökväg till HTTPS-kedja" #: sabnzbd/skintext.py msgid "Tuning" msgstr "Optimering" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "RSS Uppdateringsintervall" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Kontrollintervall (i minuter, minst 15). Ej aktiv om du använder " "Schemaläggaren!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Maximal linjehastighet" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Procent av linjehastighet" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "Vilken procent av linjehastigheten ska SABnzbd använda, te.x 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Cachestorlek för artiklar" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Sparar artiklar i minnet för att reducera diskåtkomst.
I bytes, " "följt av K,M,G. Till exempel: \"64M\" eller \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Rensa lista" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Lista av filändelser som skall bli borttagna efter nerladdning.
Till " "exempel: nfo or nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Spara ändringar" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "" #: sabnzbd/skintext.py msgid "Reset" msgstr "Återställ" #: sabnzbd/skintext.py msgid "Language" msgstr "Språk" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Välj språk till webbkontrollen." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "Denna nyckel ger tredjepartsprogram full tillgång till SABnzbd." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "NZB-nyckel" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "Denna nyckel ger tredjepartsprogram möjlighet att lägga till NZB:er i " "SABnzbd." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Generera Ny Nyckel" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "API- eller QR-kod" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Lista av lokala nätverksomfång" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Alla lokala nätverksadresser startar med dessa prefixer (ofta \"192.168.1.\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Extern internetåtkomst" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "Ingen åtkomst" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Lägg till NZB-filer " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (ingen Konfigurering)" #: sabnzbd/skintext.py msgid "Full API" msgstr "Full API" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Fullt Webgränsnitt" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "OBS: Mappar kommer att skapas automatiskt när du Sparar. Du måste " "ange exakta sökvägar till dina mappar för att spara utanför standardmapparna." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Användarmappar" #: sabnzbd/skintext.py msgid "Browse" msgstr "Bläddra" #: sabnzbd/skintext.py msgid "In" msgstr "I" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Temporär nedladdningsmapp" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Plats för att lagra ej bearbetade nedladdningar.
Kan endast ändras " "när kön är tom." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Minimal fri plats för temporär nedladdningsmapp" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Auto-pausa när fri plats är nära sin gräns.
I bytes, följt av " "K,M,G,T. Till exempel: \"800M\" or \"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Färdig nedladdningsmapp" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Plats för att lagra bearbetade och färdiga nedladdningar.
Kan " "åsidosättas av användar-definierade kategorier." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Rättigheter för färdiga nedladdningar" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Sätt rättigheter för färdiga filer och mappar.
Använd siffror. Till " "exempel: \"755\" or \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Övervakad Mapp" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Mapp som igenomsöks automatiskt efter .nzb filer.
Skannar även " "igenom .zip .rar och .tar.gz arkiv efter .nzb filer." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Skanningsintervall för Övervakade mappar" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Sekunder mellan skanningar för .nzb filer." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Mapp för E-mail mallar" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Mapp som innehåller användar-definierade e-mail mallar." #: sabnzbd/skintext.py msgid "Password file" msgstr "Lösenordsfil" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Fil som innehåller alla lösenord som ska prövas på krypterade RAR-filer." #: sabnzbd/skintext.py msgid "System Folders" msgstr "Systemmappar" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Administrativ mapp" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Plats för köadministration och historiedatabas.
Kan bara ändras när " "kön är tom." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "Data kommer inte tas bort. Kräver omstart av SABnzbd!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Loggmapp" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Plats för sparade loggfiler från SABnzbd.
Kräver omstart av " "SABnzbd!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr ".nzb Reservmapp" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Plats där .nzb filer sparas." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Standard basmapp" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Ladda ner alla par2 filer" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Aktivera rekursiv uppackning" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Packa upp arkiv (rar,zip,7z) inuti arkiven." #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Ignorera alla mappar i arkiven" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Alla filer kommer hamna i en mapp." #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Bara artiklarna för början av kön" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Aktivera för lägre minnesanvändning. Avaktivera för att förhindra långsamma " "jobb att blockera kön." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Efterbehandla endast verifierade jobb" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "Efterbehandla enbart jobb som passerat PAR2 kontrollen." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Händelse när krypterade RAR är nerladdad" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "Om \"Pausad\", så behöver du ange ett lösenord för att återuppta jobbet." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Upptäck dubbletter av nedladdningar" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Hitta dublettavsnitt i serier" #: sabnzbd/skintext.py 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 "Kasta" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Avbryt" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Händelse när oönskad filändelse hittad" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "Händelse när en oönskad filändelse är hittad i RAR-filer." #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Oönskade filändelser" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Lista alla oönskade filändelser. Till Exempel: exe or exe, com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Använd SFV-baserade kontroller" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Gör en extra kontroll med SFV filer" #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Användarskript kan flagga jobb som misslyckat" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "När ett användarskript returnerar ett icke-nollutgångsvärde, så kommer " "jobbet att flaggas som misslyckat" #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "När misslyckat, prova en alternativ NZB" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" "Vissa servrar kan förse en alternativ NZB när en nerladdning misslyckas" #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Döp om mappar" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Använd temporära namn under efterbehandling. Avslaget när ditt system inte " "stöder det." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Kö-specifika användarskript" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Används innan en NZB tas in i kön." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Extra PAR2 parametrar" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Bra parametrar" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "IONice parametrar" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Koppla ifrån när kön är tom" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "Koppla ifrån usenet servrarna när kön är tom eller pausad." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Sortera efter ålder" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Sortera automatiskt efter (medel) ålder." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Kolla efter ny utgåva" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Kolla efter ny utgåva av SABnzbd varje vecka." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "Även testutgåvor" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Ersätt mellanslag i mappnamn" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Ersätt mellanslag med understreck i mappnamn." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Ersätt punkter i mappnamn" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Ersätt punkter med mellanslag i mappnamn" #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Gör Windows-kompatibel" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "För servrar: Gör att namn är kompatibla med Windows." #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Starta webbläsare vid uppstart" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Startar standard webbläsaren när SABnzbd startar." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Pausa nedladdning under efterbehandling" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Pausas nedladdning när efterbehandling börjar och återupptar nedladdning när " "efterbehandling är klar." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Ignorera Sample-filer" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Filtrera ut sample-filer (ex. video samplingar)." #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Ta bort efter nedladdning" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" #: sabnzbd/skintext.py msgid "Server" msgstr "Server" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Efterbehandling" #: sabnzbd/skintext.py msgid "Naming" msgstr "Döpning" #: sabnzbd/skintext.py msgid "Quota" msgstr "Kvot" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indexerar" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Hur mycket kan laddas ner denna månad (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Nollställ dag" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "På vilken dag i månaden eller veckan (1=Måndag) nollställer din ISP din " "kvot? (Alternativt med hh:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Autoåterupptagning" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "Skall nerladdning återupptas efter att kvot är nollställd?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Kvotperiod" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "Nollställs kvoten varje dag, vecka eller månad?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Kontrollera innan nerladdning" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Försök att förutspå lyckad överföring innan nerladdningen påbörjas (saktare!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "Max antal omförsök" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Max antal omförsök per server" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Avbryt jobb som inte kan kompletteras" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Under nerladdning och det märks att för mycket data saknas, avbryt jobbet" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Aktivera Filtrering" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Action nedladdningar enligt filtreringsregler." #: sabnzbd/skintext.py msgid "Abort If" msgstr "Avbryt Om" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Annars Pausa Om" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Videobetyg" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Audiobetyg" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spam" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Bekräftad" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Fler tummar ner än upp" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Titelns nyckelord" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Kommaseparerad lista" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Användbar om en newsserver har fler val än en IPv4/IPv6adress" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Lägg till server" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Serverbeskrivning" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Port" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Användarnamn" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Lösenord" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Tidsgräns" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Retensionstid" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "Avaktiverad" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 är högst prioritet, 99 är lägst prioritet" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Valfri" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Aktivera" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Ta bort server" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Testserver" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Nollställ räknare" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Testar serverdetaljer..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Bandbredd" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Skicka grupp" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Skicka gruppkommando innan du begär artiklar." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Personliga noteringar" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Lägg till schema" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Förekomst" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Åtgärd" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Argument" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Aktuella scheman" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Kryssrutan bredvid flödesnamnet ska aktiveras för att flödet automatiskt ska " "kontrolleras för nya objekt.
När ett flöde läggs till kommer det bara " "att välja nya objekt och inte allt som redan finns i RSS-flöded så länge du " "inte klickar på \"Tvinga nedladdning\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Läs flöde" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Tvinga nedladdning" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filter" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Acceptera" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Avvisa" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Kräver" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "KräverKat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Minst" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Högst" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "Från SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Matchade" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Inte Matchade" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Nedladdad" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Läsa Alla Flöden Nu" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "E-post notifiering när jobb är slutfört" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Aldrig" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Alltid" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Bara vid fel" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Full hårddisk notifiering" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "Skicka e-mail när hårddisken är full och SABnzbd har pausat." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Skicka RSS-notiser" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "Skicka E-post när ett RSS-flöde lägger till jobb till kön." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "SMTP-server" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Ställ in din ISP's server för utgående e-mail." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "E-post mottagare" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "E-postadress att skicka e-post till." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "E-post avsändare" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Vem ska vi skicka e-posten från?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "VALFRITT Kontoanvändarnamn" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Användarnamn för e-post som kräver autentisering." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "VALFRITT Användarlösenord" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Lösenord för e-post som kräver autentisering." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Notis skickad!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Aktivera Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Använd endast för extern Growl.server (host:port)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Serverlösenord" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Valfritt lösenord för Growl-server" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "Aktivera NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Meddelandecenter" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Aktivera Windows-notiser" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Windows-notiser" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Aktivera Prowl-notiser" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Kräver ett Prowl-konto" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "API-nyckel för Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Personlig API-nyckel för Prowl (krävs)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Aktivera Pushover-notiser" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Kräver ett Pushover-konto" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Applikations Token" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Applikations token (krav)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Användarnyckel" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Användarnyckel (krävs)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Enhet(er)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Aktivera Pushbullet-notiser" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Kräver ett Pushbullet-konto" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Personlig API-nyckel" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Din personliga API-nyckel (krävs)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Enhet" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Enheter där meddelande skall skickas" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Avsluta sökvägen med en asterisk * kommer förhindra jobb att skapa mappar" #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Relativa mappar är baserade på" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Mapp/Sökväg" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Seriesortering" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Aktivera TV sortering" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Hjälp till Sorteringssträng" #: sabnzbd/skintext.py msgid "Clear" msgstr "Rensa" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "Förinställningar" #: sabnzbd/skintext.py msgid "Example" msgstr "Exempel" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Aktivera filmsortering" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Låt nedladdning i extramapp vara" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Påverkade kategorier" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Betyder" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Mönster" #: sabnzbd/skintext.py msgid "Result" msgstr "Resultat" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Säsongsmapp" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Säsongsmapp" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Episodmapp" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 Episodmapp" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "" #: sabnzbd/skintext.py msgid "Title" msgstr "Titel" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Film Namn" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Film.Namn" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Film_Namn" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Show Namn" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Show.Namn" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Show_Namn" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Säsongsnummer" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Episodnummer" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Episodnamn" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Episod.Namn" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Episod_Namn" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Filändelse" #: sabnzbd/skintext.py msgid "Extension" msgstr "Filändelse" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Delnummer" #: sabnzbd/skintext.py msgid "Decade" msgstr "Årtionde" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Originalfilnamn" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Små bokstäver" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEXT" #: sabnzbd/skintext.py msgid "text" msgstr "text" #: sabnzbd/skintext.py msgid "file" msgstr "fil" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Sorteringssträng" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Multi-del etikett" #: sabnzbd/skintext.py msgid "In folders" msgstr "In mapp" #: sabnzbd/skintext.py msgid "No folders" msgstr "Ingen mapp" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Datum sortering" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Aktivera datumssortering" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Visa Namn på mapp" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "År-Månads mappar" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Dagliga mappar" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "versal-justerade" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Hanterade resultat" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Sällan använda inställningar. För deras mening och förklaring, klicka på " "Hjälpknappen för att komma till Wiki-sidan.
Ändra inte dessa utan att " "kolla med Wiki först, då vissa kan ha seriösa " "sidoeffekter.
Standardvärdet är mellan paranteser." #: sabnzbd/skintext.py msgid "Values" msgstr "Värden" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Ändra NZB detaljer" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Ta bort" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Topp" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Upp" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Ner" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Botten" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Alla" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Invertera" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Filnamn" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Ämne" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Urval" #: sabnzbd/skintext.py msgid "left" msgstr "kvar" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Ledigt diskutrymme" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Temporär Mapp" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Multi-operationer" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Håll in shiftknappen för att välja omfång" #: sabnzbd/skintext.py msgid "Check all" msgstr "Markera alla" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Starta om SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Status och gränsnittsinställningar" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Eller dra och släpp filer i fönstret!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Förlorade förbindelse till SABnzbd.." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Uppdateringsfrekvens" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Använda globala gränsnittsinställningar" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Kö artikelgräns" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Historik artikelgräns" #: sabnzbd/skintext.py msgid "Date format" msgstr "Datumformat" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Extra kökolumn" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "" #: sabnzbd/skintext.py msgid "page" msgstr "sida" #: sabnzbd/skintext.py msgid "Loading" msgstr "Laddar" #: sabnzbd/skintext.py msgid "articles" msgstr "artiklar" #: sabnzbd/skintext.py msgid "Rename" msgstr "" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Köreparation" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Visa aktiva anslutningar" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Övergivna jobb" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "Skicka tillbaka i kön" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Ta bort alla" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Starta om alla" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Hämta NZB från URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "Ladda upp NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Alternativt ange ett filnamn" #: sabnzbd/skintext.py msgid "Submit" msgstr "Skicka" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Öppen informations URL" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Skickat. Tack!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Inget markerat!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Ta bort alla markerade filer" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Visa/göm färdiga filer" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Visa skriptlogg" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Uppdatering tillgänglig" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" #: sabnzbd/skintext.py msgid "Custom" msgstr "Anpassa" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "" #: sabnzbd/skintext.py msgid "Speed" msgstr "Hastighet" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Bekräfta Kö-borttagningar" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Bekräfta Historik-borttagningar" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Hur lÃ¥ng tid eller tills dÃ¥ vill du pausa? (pÃ¥ engelska!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Tyvärr, vi kunde inte tolka det. Försök igen." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Pausa i..." #: 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 Oldest→Newest" msgstr "Sortera efter Ã¥lder Äldst→Nyast" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Sortera efter Ã¥lder Nyast→Äldst" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Sortera efter namn A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Sortera efter namn Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Sortera efter storlek Minst→Störst" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Sortera efter storlek Störst→Minst" #: sabnzbd/skintext.py msgid "Uploading" msgstr "" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "" #: sabnzbd/skintext.py msgid "Removing job" msgstr "" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "" #: sabnzbd/skintext.py msgid "Prev" msgstr "FöregÃ¥ende" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Nästa" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "Vill du verkligen tömma historiken?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Du mÃ¥ste aktivera JavaScript för Plush ska fungera!" #: sabnzbd/skintext.py msgid "Options" msgstr "Alternativ" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Pausa hur mÃ¥nga minuter?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Menyrad" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Vid slut" #: sabnzbd/skintext.py msgid "Sort" msgstr "Sortera" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Sortera efter Ã…lder (Äldst→Nyast)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Sortera efter Ã…lder (Nyast→Äldst)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Sortera efter Namn (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Sortera efter Namn (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Sortera efter Storlek (Minst→Störst)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Sortera efter Storlek (Störst→Minst)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "Töm kön?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Starta om alla misslyckade jobb i historik?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Rensa" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Max hastighet" #: sabnzbd/skintext.py msgid "Range" msgstr "OmfÃ¥ng" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Applicera pÃ¥ valda" #: sabnzbd/skintext.py msgid "Everything" msgstr "Allt" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "Uppdateringsintervall" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Bredd av webbplats" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Detta kommer förhindra uppdaterande av innehÃ¥ll när din muspekare svävar " "ovanför kön" #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Block uppdaterar vid svävande" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Ladda upp" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Ladda upp: .nzb .rar .zip .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Förlopp" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Inte tillräckligt med diskutrymme för att kunna fortsätta ladda ned." #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Ledigt temputrymme" #: sabnzbd/skintext.py msgid "IDLE" msgstr "Väntar" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Hämtningar" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "SABnzbd Snabbstart Guide" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "SABnzbd Version" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "FöregÃ¥ende" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Serveruppgifter" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Fyll i uppgifter om din primära usenet leverantör." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Antalet anslutningar som tillÃ¥ts av din leverantör" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "Te.x 8 eller 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Välj bara om din leverantör tillÃ¥ter SSL-anslutningar." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Klicka här för att testa dina angivna serveruppgifter." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "T.ex." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "Installationen är nu utförd!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd kommer nu att köras i bakgrunden." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "" "SABnzbd kommer inte att stängas av om du stänger ett fönster eller en tab i " "webbläsaren." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Det är rekommenderat att du sparar denna plats som ett bokmärke för att " "komma Ã¥t SABnzbd när det körs i bakgrunden." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Övrig hjälp kan du hitta pÃ¥ vÃ¥ran" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "GÃ¥ till SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "Avsluta SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Starta guide" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd har ABSOLUT INGEN GARANTI\n" "Detta är gratis mjukvara, du är välkommen att sprida det under vissa " "omständigheter.\n" "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] msgid "Error getting TV info (%s)" msgstr "Det gick inte att hämta TV info (%s)" #: sabnzbd/sorting.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] msgid "Failed to rename similar file: %s to %s" msgstr "Det gick inte att döpa om liknande fil: %s till %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "OtillÃ¥ten Ã¥tkomst" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "URLGRABBER KRASHADE" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "Oanvändbar NZB fil" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "URL hämtning misslyckades; %s" #~ msgid "_yenc module... NOT found!" #~ msgstr "_yenc modul... EJ funnen!" #~ 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." #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Din version av UNRAR rekommenderas inte, få UNRAR från " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "Inget UNRAR program funnet, uppackning ej möjlig
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "Inget PAR2 program funnet, reparation ej möjlig
" #~ msgid "Initiating restart...
" #~ msgstr "Förbereder omstart...
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "Jobb \"%s\" är Ã¥terinlagt i kön" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "Jobb markerade med '*' kommer ej att laddas ned automatiskt." #~ msgid "Not matched" #~ msgstr "Matchade inte" #~ msgid "Downloaded so far" #~ msgstr "Nedladdade än sÃ¥ länge" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Kan ej ansluta till registret HKEY_CURRENT_USER." #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Kan ej öppna registernyckel \"%s\"." #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Det gick inte att läsa registernyckel för specialmappar" #~ msgid "You have no permisson to use port %s" #~ msgstr "Du har ingen behörighet för att använda port %s" #~ msgid "Try again" #~ msgstr "Försök igen" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "pyopenssl modul saknas, var vändlig installera för https Ã¥tkomst" #~ msgid "Unpacking failed, see log" #~ msgstr "Uppackning misslyckades, se logg" #~ msgid "ERROR: %s" #~ msgstr "FEL: %s" #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "Saknade förväntad fil: %s => unrar fel?" #~ 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 "File %s is empty, skipping" #~ msgstr "Fil %s är tom, hoppar över" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "Det gick inte att ta bort nzo frÃ¥n efterbehandlings kön (id)" #~ msgid "No post-processing because of failed verification" #~ msgstr "Ingen efterbehandling pÃ¥ grund av misslyckad verifiering" #~ msgid "View script output" #~ msgstr "Visa skriptutmatning" #~ msgid "Error removing workdir (%s)" #~ msgstr "Det gick inte att ta bort arbetsmapp (%s)" #~ msgid "Queued" #~ msgstr "Köad" #~ msgid "Complete Dir" #~ msgstr "Färdig nedladdningsmapp" #~ msgid "Download speed" #~ msgstr "Nedladdningshastighet" #~ msgid "WARNINGS" #~ msgstr "VARNINGAR" #~ msgid "Add new downloads" #~ msgstr "Lägg till ny nedladdning" #~ msgid " or Report ID" #~ msgstr " eller Report ID" #~ msgid "Sort by name" #~ msgstr "Sortera efter namn" #~ msgid "Sort by age" #~ msgstr "Sortera efter Ã¥lder" #~ msgid "Sort by size" #~ msgstr "Sortera efter storlek" #~ msgid "Hide files" #~ msgstr "Göm filer" #~ msgid "Show files" #~ msgstr "Visa filer" #~ msgid "Remain/Total" #~ msgstr "Ã…terstÃ¥r/Totalt" #~ msgid "History Size" #~ msgstr "Historikstorlek" #~ msgid "Show Weblogging" #~ msgstr "Visa webblogg" #~ msgid "Thread" #~ msgstr "TrÃ¥d" #~ msgid "General configuration" #~ msgstr "Allmän konfiguration" #~ msgid "Secondary Web Interface" #~ msgstr "Andra Webbkontrollsutseende" #~ msgid "Activate an alternative skin." #~ msgstr "Aktivera ett alternativt skin." #~ msgid "Web server authentication" #~ msgstr "Webbserver autentiserng" #~ msgid "HTTPS Support" #~ msgstr "HTTPS Stöd" #~ msgid "Queue auto refresh interval:" #~ msgstr "Automatisk uppdateringsintervall av kö:" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "Uppdateringsintervall av kö-sidan (sek, 0= ingen)." #~ msgid "Disable API-key" #~ msgstr "Stäng av API-nyckel" #~ msgid "Do not require the API key." #~ msgstr "Kräv ingen API-nyckel." #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "ANVÄND PÃ… EGEN RISK!" #~ msgid "Folder configuration" #~ msgstr "Mappkonfiguration" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Efterbehandlings skriptmapp" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "Mapp innehÃ¥llande skript för efterbehandling." #~ msgid "Switches configuration" #~ msgstr "Parameterkonfiguration" #~ msgid "Processing Switches" #~ msgstr "Bearbetar parametrar" #~ msgid "Enable Quick Check" #~ msgstr "Aktivera Snabbkoll" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Strunta i par2 kontroll när filerna är 100% giltiga." #~ msgid "Enable Unrar" #~ msgstr "Aktivera Unrar" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Aktiverar inbyggda Unrar funktionen." #~ msgid "Enable built-in unzip functionality." #~ msgstr "Aktiverar inbyggda Unzip funktionen." #~ msgid "Enable Filejoin" #~ msgstr "Aktivera Filsammanslagning (Filejoin)" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "SlÃ¥r ihop filer med filändelserna .001, .002 etc. till en fil." #~ msgid "Enable TS Joining" #~ msgstr "Aktivera TS Sammanslagning (TS Joining)" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "SlÃ¥r ihop filer med filändelserna .001.ts, .002.ts etc. till en fil." #~ msgid "Enable Par Cleanup" #~ msgstr "Aktivera Par rensning (Par Cleanup)" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Rensar bort par filer (om verifiering/reparation lyckades)." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Vid fel pÃ¥ pÃ¥ yEnc CRC" #~ msgid "Default Post-Processing" #~ msgstr "Standard efterbehandling" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "Används när efterbehandlingen är bestämd efter kategori." #~ msgid "Default User Script" #~ msgstr "Standard användarskript" #~ msgid "Used when no user script is defined by the category." #~ msgstr "Används när användarskript är bestämd efter kategori." #~ msgid "Default Priority" #~ msgstr "Standard prioritet" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Använd när ingen prioritet är bestämd av kategori." #~ msgid "Enable MultiCore Par2" #~ msgstr "Aktivera MultiCore Par2" #~ msgid "Other Switches" #~ msgstr "Andra parametrar" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Ersätt otillÃ¥tna tecken i mappnamn." #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "Ersätt otillÃ¥tna tecken i mappnamn med motsvarande tecken (annars ta bort)." #~ msgid "Do not download" #~ msgstr "Ladda inte ned." #~ msgid "SSL type" #~ msgstr "SSL typ" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "Använd V23 om inte din leverantör kräver annat!" #~ msgid "Server configuration" #~ msgstr "Serverkonfiguration" #~ msgid "Backup server" #~ msgstr "Reserv server" #~ msgid "Click below to test." #~ msgstr "Klicka nedan för att testa." #~ msgid "Scheduling configuration" #~ msgstr "Schemakonfiguration" #~ msgid "Remove" #~ msgstr "Ta bort" #~ msgid "RSS Configuration" #~ msgstr "RSS-konfiguration" #~ msgid "New Feed URL" #~ msgstr "Ny flödesadress" #~ msgid "Delete Feed" #~ msgstr "Ta bort flöde" #~ msgid "Email Options" #~ msgstr "E-mail alternativ" #~ msgid "Email Account Settings" #~ msgstr "E-mail kontoinställningar" #~ msgid "User-defined categories" #~ msgstr "Användardefinierade kategorier" #~ msgid "Defines post-processing and storage." #~ msgstr "Definierar efterbehandling och lagring." #~ msgid "Sorting configuration" #~ msgstr "Sorteringskonfiguration" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Aktiverar sortering och omdöpning av episoder." #~ msgid "Generic Sorting" #~ msgstr "Allmän sortering" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Aktiverar sortering och omdöpning av filer." #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "Aktivera om nedladdning inte är flyttad till egen mapp." #~ msgid "Enable sorting and renaming of date named files." #~ msgstr "Aktiverar sortering och omdöpning av datummärkta filer." #~ msgid "Are you sure you want to delete" #~ msgstr "Är du säker pÃ¥ att du vill ta bort" #~ msgid "Page" #~ msgstr "Sida" #~ msgid "First" #~ msgstr "Första" #~ msgid "Last" #~ msgstr "Sista" #~ msgid "Close" #~ msgstr "Stäng" #~ msgid "Set Pause Interval" #~ msgstr "Sätt pausintervall" #~ msgid "Pause Interval" #~ msgstr "Pausintervall" #~ msgid "Pause for 12 hours" #~ msgstr "Pausa 12 timmar" #~ msgid "Pause for 24 hours" #~ msgstr "Pausa 24 timmar" #~ msgid "Left" #~ msgstr "Vänster" #~ msgid "Open Source URL" #~ msgstr "Öppen källdkod URL" #~ msgid "Storage" #~ msgstr "Lagring" #~ msgid "Plush Options" #~ msgstr "Plush Inställningar" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Ladda upp: .nzb .rar .zip .gz" #~ msgid "Hour:Min" #~ msgstr "Timme:Minut" #~ msgid "Delete the all failed items from the history?" #~ msgstr "Ta bort alla felaktiga saker frÃ¥n historiken?" #~ msgid "Links" #~ msgstr "Länkar" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Visar %s till %s av %s resultat" #~ msgid "Email Sent!" #~ msgstr "Skickat E-mail!" #~ msgid "Saved" #~ msgstr "Sparad" #~ msgid "Toggle Add NZB" #~ msgstr "Visa/Dölj Lägg till NZB" #~ msgid "DualView1" #~ msgstr "Flerskärm1" #~ msgid "DualView2" #~ msgstr "Flerskärm2" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "Är du säker pÃ¥ att du vill starta om SABnzbd?" #~ msgid "Hide Edit Options" #~ msgstr "Dölj Redigeringsalternativ" #~ msgid "Show Edit Options" #~ msgstr "Visa Redigeringsalternativ" #~ msgid "Edit" #~ msgstr "Ändra" #~ msgid "Timeleft" #~ msgstr "Ã…terstÃ¥ende tid" #~ msgid "Access" #~ msgstr "Ã…tkomst" #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "" #~ "Jag vill att SABnzbd ska bli nÃ¥bart frÃ¥n vilken dator som helst i mitt " #~ "nätverk." #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Jag vill att SABnzbd ska bli nÃ¥bart enbart frÃ¥n min dator." #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Lösenordsskydda Ã¥tkomst till SABnzbd (rekommenderas)" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Aktivera HTTPS Ã¥tkomst till SABnzbd." #~ msgid "Misc" #~ msgstr "Diverse" #~ msgid "" #~ "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 "This field is required." #~ msgstr "Detta fält krävs." #~ msgid "Please enter a whole number." #~ msgstr "Ange ett heltal." #~ msgid "Step One" #~ msgstr "Steg ett" #~ msgid "Step Two" #~ msgstr "Steg tvÃ¥" #~ msgid "Step Three" #~ msgstr "Steg tre" #~ msgid "Step Four" #~ msgstr "Steg fyra" #~ msgid "Step Five" #~ msgstr "Steg fem" #~ msgid "Invalid encoding of email template %s" #~ msgstr "Ogiltig avkodning av email mallen %s" #~ 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:" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd är inte kompatibelt med vissa mjukvarubaserade brandväggar.
\n" #~ " %s
\n" #~ " Tyvärr kan vi inte lösa denna inkompatibilitet just nu.
\n" #~ " Vänligen registrera ett klagomål hos brandväggens tillverkare.
\n" #~ "
\n" #~ msgid "OK" #~ msgstr "OK" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd behöver en tillgänglig tcp/ip port för dess interna web " #~ "server.
\n" #~ " Port %s på %s testades, men kontot som används för SABnzbd har inte " #~ "tillåtelse att använda den.
\n" #~ " På OSX och Linux-system måste normala användare använda portnummer 1023 " #~ "eller högre.
\n" #~ "
\n" #~ " Var vänlig starta om SABnzbd med ett annat portnummer." #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Det är troligt att du använder ZoneAlarm på Vista.
" #~ msgid "Get NZB" #~ msgstr "Lägg till NZB" #~ msgid "KB/s" #~ msgstr "KB/s" #~ msgid " " #~ msgstr " " #~ msgid "Purge Failed History" #~ msgstr "Rensa Misslyckad Historik" #~ msgid "Delete all failed items from History?" #~ msgstr "Ta bort alla misslyckade objekt frÃ¥n Historik?" #~ msgid "QR Code" #~ msgstr "QR-kod" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "" #~ "När artiklars CRC-kontrollsumma ger fel, försök att hämta dem frÃ¥n en annan " #~ "server." #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Kontrollera resultat av uppackning (mÃ¥ste slÃ¥s av pÃ¥ vissa filsystem)." #~ msgid "Check result of unpacking" #~ msgstr "Kontrollera resultat av uppackning" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "Varning: avbröt jobbet %s pÃ¥ grund av att RAR-filen är krypterad" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "VARNING: Pausat jobb \"%s\" dÃ¥ RAR-filen är krypterad" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Efter att SABnzbd har startat om kommer du att hitta det vid angivna " #~ "platsen: %s" #~ msgid "No email templates found" #~ msgstr "Inga e-postmallar funna" #~ msgid "Email Test Result" #~ msgstr "E-posta testresultat" #~ msgid "Only for optional servers" #~ msgstr "Endast för vissa servers" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Applicera endast max antal omförsök till vissa servers" #~ msgid "Site API Key" #~ msgstr "Sidans API-nyckel" #~ msgid "Enable OZnzb Integration" #~ msgstr "Aktivera OZnzb-integration" #~ msgid "Automatic Feedback" #~ msgstr "Automatisk Feedback" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Denna nyckel ger indentitet till index. Refererar till " #~ "https://www.oznzb.com/profile." #~ msgid "Skip" #~ msgstr "Hoppa över" #~ msgid "Send notifications to Growl" #~ msgstr "Skicka notis till Growl" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Skicka notiser till NotifyOSD" #~ msgid "Send notifications to Notification Center" #~ msgstr "Skicka notiser till Meddelandecenter" #~ msgid "Groups / Indexer tags" #~ msgstr "Grupper/Indexering-tagg" #~ msgid "folder" #~ msgstr "mapp" #~ msgid "Original Foldername" #~ msgstr "Ursprungliga mappnamnet" #~ msgid "Delete Failed" #~ msgstr "Borttagning Misslyckades" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "T.ex. 119 eller 563 för SSL" #~ msgid "Showing one result" #~ msgstr "Visar ett resultat" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Visa tider allmänt i AM/PM (pÃ¥verkar inte schemaläggare)" #~ msgid "Delete Completed" #~ msgstr "Borttagning färdig" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "Använd 12-timmarsklocka (AM/PM)" #~ msgid "No results" #~ msgstr "Inga träffar" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "" #~ "Skicka automatiskt beräknade valideringsresultat för nedladdningar till " #~ "indexe." #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Förbättrad funktionalitet, inklusive betyg och extra statusinformation finns " #~ "tillgänglig när den är ansluten till OZnzb indexe." sabnzbd-develop/po/main/sr.po0000600000175000017500000046440313642116632014276 0ustar jpjp# Serbian translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # ОZZII , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: ОZZII \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2018-02-14 14:18+0000\n" "Last-Translator: Safihre \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:03+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "NeuspeÅ¡no pokretanje web interfejsa" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "Ðемогуће наћи веб модел: %s, програм покушава Ñа Ñтандардним моделом" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "par2 program...NIJE pronaÄ‘en!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" "Verzija vaÅ¡eg UNRAR-a je %s, mi preporuÄujemo verziju %s ili noviju.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "unrar program...NIJE pronaÄ‘en!" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "unzip program...NIJE pronaÄ‘en" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "7za program...NIJE pronaÄ‘en" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Obratite pažnju, hostu 0.0.0.0 će trebati IPv6 adresa za pristup spolja" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "HTTP i HTTPS portovi ne mogu biti isti" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "HTTPS onemogućen zbog nedostajućih CERT i KEY datoteka" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "NeuspeÅ¡no pokretanje web interfejsa: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "Nemoguće pristupiti SABHelper servisu" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "SABnzbd %s покренут" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Упозорење" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Грeшкa" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "Гашење SABnzbd је завршено" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Име хоÑта није унето." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "Везе ниÑу подешене. ПодеÑити макар једну везу." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Лозинка Ñакривена иÑпод ******, поновите уноÑ" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "Погрешни детаљи Ñервера" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "" "ИÑтекло време: Покушајте да упалите SSL или да Ñе привежете на други порт." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Време је иÑтекло" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "Погрешна адреÑа Ñервера." #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Сервер Ñе затворио при пријављивање" #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Серверу Ñу потребни име и лозинка." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "УÑпешно привезивање!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Ðутентификација погрешна, проверити име/лозинку." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "Превише конекција, паузирајте преузимање или поновите каÑније" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Nemoguće odrediti rezultate konekcije (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Signal %s primljen, snimanje i napuÅ¡tanje..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Fatalna greÅ¡ka pri snimanju trenutnog stanja" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "PokuÅ¡aj da se uÄita NZB sa %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Snimanje %s neuspeÅ¡no" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Nemoguće kreiranje privremene datoteke za %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Покушај поÑтављања ÑтатуÑа за непоÑтојећи Ñервер %s" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Грешка у tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "UÄitavanje %s neuspeÅ¡no" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "Упешно Ñлање е-поште" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Probno obaveÅ¡tenje" #: sabnzbd/api.py msgid " Resolving address" 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 "Ðиједно" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "Подразумевано" #: sabnzbd/api.py msgid "unknown" msgstr "непознато" #: sabnzbd/api.py [Error message] 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" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "GreÅ¡ka na disku prilikom kreiranja datoteke %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Fatalna greÅ¡ka u Assembler-u" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Prekinuto, detektovana enkripcija" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "UPOZORENJE: U \"%s\" pronaÄ‘ena neželjena ekstenzija u RAR datoteci. " "Neželjena datoteka je %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "Neželjena ekstenzija je u rar datoteci %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Prekinuto, detektovana neželjena ekstenzija" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "UPOZORENJE: Posao \"%s\" pauziran zbog ocene (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "UPOZORENJE: Posao \"%s\" prekinut zbog ocene (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Prekinuto, filter ocene se poklopio (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s nedostaje" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "video" #: sabnzbd/assembler.py msgid "audio" msgstr "аудио" #: sabnzbd/assembler.py msgid "spam" msgstr "neželjeno" #: sabnzbd/assembler.py msgid "passworded" msgstr "Å¡ifrovano" #: sabnzbd/assembler.py msgid "downvoted" msgstr "dole je glasao" #: sabnzbd/assembler.py msgid "keywords" msgstr "кључне речи" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Kvota utroÅ¡ena, pauziram preuzimanja" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s nije ispravna email adresa" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Потребна је адреÑа Ñервера" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Ðе могу да креирам %s фаÑциклу %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Ne može da se upiÅ¡e u INI datoteku %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Ne može se kreirati sigurnosna kopija za %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "PogreÅ¡no Å¡ifrovana lozinka %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s nije ispravna oktalna vrednost" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "UNC путања \"%s\" није дозвољена" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "GreÅ¡ka: Dužina putanje bi trebala biti ispod %s" #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Грешка: ред није празан, фаÑцикла Ñе не може променити." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "Ðе могу да пишем у бази дневника, проверите дозволе!" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "Baza dnevnika je oÅ¡tećena, kreirana prazna zamena" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "NeuspeÅ¡na SQL komanda, videti izveÅ¡taj" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "ÐеуÑпешно затварање базе, видети извештај" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "Погрешне етапе извештаја можете наћи у хронологији за %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "DeÅ¡ifrovanje %s neuspeÅ¡no" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Лоше формиран yEnc артикал у %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Nepoznata greÅ¡ka pri deÅ¡ifrovanju %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => фали на Ñвим Ñерверима, одбацивање" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Завршено" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "Издвојено %s датотека/фаÑцикла у %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message] msgid "Cannot read %s" msgstr "ÐеуÑпешно читање %s" #: sabnzbd/dirscanner.py [Error message] msgid "Error while adding %s, removing" msgstr "Грешка додавања %s, уклањање" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "GreÅ¡ka pri uklanjanju %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "ÐеуÑпешно читање надгледане фаÑцикле %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Nastavlja se" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "Паузирано" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Требате да поÑтавите макÑимални проток пре него што поÑтавите ограничење" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "NeuspeÅ¡no povezivanje na server %s[%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Ime servera se ne može odrediti" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Server %s će biti ignorisan %s minuta" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "NeuspeÅ¡na inicijalizacija %s@%s iz razloga: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "PreviÅ¡e konekcija ka serveru %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Moguće deljenje naloga" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "ÐеуÑпешно пријављивање на Ñервер %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Povezivanje na %s@%s neuspeÅ¡no, poruka=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Server %s zahteva koriniÄko ime/lozinku" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "Sumnja u greÅ¡ku u programu za download" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Гашење" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "ÐеуÑпешно привезивање на Ñервер е-поште" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "ÐеуÑпешна иницијализација TLS везе" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "Server nije pravilno odgovorio na helo pozdrav" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "ÐеуÑпешна аутентификација на Ñерверу е-поште" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Nije pronaÄ‘en odgovarajući metod autentifikacije" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "Nepoznata greÅ¡ka pri autentifikaciji na email server" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "NeuspeÅ¡no slanje e-mail poruke" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "ÐеуÑпешно затварање везе е-поште" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Ðема примаоце, е-порука није поÑлана" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "Za: %s\n" "Od: %s\n" "Datum: %s\n" "Tema: SABnzbd prijavljuje Disk Pun\n" "\n" "Zdravo,\n" "\n" "SABnzbd je stao sa downloadom zato Å¡to je disk skoro pun.\n" "Molimo Vas napravite mesta i pokrenite download u SABnzbd ruÄno.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Ðемогуће креирати фаÑциклу %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "ФаÑцикла %s: %s грешка приÑтупа" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Ðе може да Ñе промене дозволе од %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "NeuspeÅ¡no kreiranje (%s)" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "NeuspeÅ¡no premeÅ¡tanje %s u %s" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "ÐедоÑтаје кључ ÑеÑије" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Грешка: потребан је кључ ÑеÑије" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Грешка: Кључ ÑеÑије није добар" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "API кључ недоÑтаје, унети у Ñпољни програм API кључ из Подешавање->Опште:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "API кључ је погрешан, унети у Ñпољни програм API кључ из Подешавања->Опште:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "ÐедоÑтаје аутентификација, унети у Ñпољни програм име/лозинку из Подешавања-" ">Опште:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Isprobajte naÅ¡ novi izgled Glitter! Svež, nov dizajn koji je optimizovan za " "desktop i mobilne ureÄ‘aje. Idite na PodeÅ¡avanja->OpÅ¡ta da promenite izgled." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "Б" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
Гашење SABnzbd-а је завршено.
Сачекајте око 5 Ñекунди па " "кликните на линк иÑпод.

ОÑвежи
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Пажња: LOCALHOST је двоÑмиÑлен, кориÑтите ИП адреÑе." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "Adresa servera \"%s:%s\" je neispravna" #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Feed" #: sabnzbd/interface.py msgid "Daily" msgstr "Дневно" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "Понедељак" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Уторак" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Среда" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Четвртак" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "Петак" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Субота" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Ðедеља" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "иÑкљ." #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Server nije definisan!" #: 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 msgid "Back" msgstr "Ðазад" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "ГРЕШКÐ:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Погрешна вредноÑÑ‚ за %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "д" #: sabnzbd/misc.py msgid "h" msgstr "Ñ" #: sabnzbd/misc.py msgid "m" msgstr "м" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Грешка креације SSL кључа и Ñертификата" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Покретање Ñкрипта" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "ПоÑÑ‚-процеÑирање је зауÑтављено (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Скрипт" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "PreviÅ¡e ugnježdenih nivoa pri raspakivanju [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Спајање" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Ðепотпуна Ñеквенца датотеке за Ñпајање" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Спој датотеке %s није уÑпело" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Грешка \"%s\" при Ñпоја датотеке" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Грешка \"%s\" док Ñам покренуо 'file_join' на %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] Спојено %s датотеке(а)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "NeuspeÅ¡no raspakivanje, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] GreÅ¡ka \"%s\" pri raspakivanju RAR datoteka" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Грешка \"%s\" док Ñам радио 'rar_unpack' на %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "NeuspeÅ¡no brisanje %s!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Proba raspakivanja sa lozinkom \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "NeuspeÅ¡no raspakivanje, arhiva zahteva lozinku" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "РаÑпакивање" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "РаÑпакуј" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Погрешно раÑпакивање, не може да Ñе нађе %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "ГРЕШКÐ: Ðе могу да нађем \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "NeuspeÅ¡no raspakivanje, CRC greÅ¡ka" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "ГРЕШКÐ: Погрешан CRC у \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "NeuspaÅ¡no raspakivanje, greÅ¡ka u pisanju ili je disk pun?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "ГРЕШКÐ: грешка пиÑања (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "NeuspeÅ¡no raspakivanje, putanja je predugaÄka" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "ГРЕШКÐ: путања је превелика (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Neupotrebljiva RAR datoteka" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s датотека у %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Грешка \"%s\" при покретања 'unzip()' на %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Покушавам 7zip Ñа лозинком \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "7ZIP Ñкуп \"%s\" није потпун, не могу да издвојим" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Ðе могу да издвојим %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Брза Провера" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Поправи" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Брза Провера ОК" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Покретање пооправљања" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "NeuspeÅ¡na popravka, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Грешка %s при покретања 'par2_repair' на Ñкупу %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Грешка \"%s\" при покретања 'par2_repair' на Ñкупу %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] 'PAR2' је примио погрешне опције, проверите параметри Подешавање-" ">Прекидачи" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Проверено за %s, Ñве датотеке Ñу добре" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Проверено за %s, потребна је поправка" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Учитавање %s блокова..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Добављам" #: sabnzbd/newsunpack.py msgid "Repair failed, not enough repair blocks (%s short)" msgstr "Погрешна поправка, нема довољно блокова за поправку (фали %s)" #: sabnzbd/newsunpack.py msgid "Repairing" msgstr "Поправљање" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Поправљено за %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "ДиÑк је пун" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Проверавање" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Провера" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Ovaj server ne dozvoljava SSL na ovom portu" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Вики" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Покретање/Гашење" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "ÐЗБ додат" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "ПоÑÑ‚-процеÑирање покренуто" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "поÑао завршен" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "ÐеуÑпешан рад" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Ред завршен" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "ОÑтале поруке" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "ÐедоÑтупно" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "ÐеуÑпешно Ñлање Prowl поруке" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "Neodgovarajući odgovor od strane Pushover (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "NeuspeÅ¡no slanje Pushover poruke" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "PogreÅ¡an odgovor Pushbullet-a (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "NeuspeÅ¡no slanje Pushbullet poruke" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "ÐеуÑпешан ÑƒÐ½Ð¾Ñ %s датотеке Ñа %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Ðекомпатибилан ред нађен, на могу да наÑтавим" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Грешка учитавање %s, покварена датотека нађена" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB додат у ред" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Ðепознато енкодирање" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Ðепотпуна ÐЗБ датотека %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "Ðеважећи NZB %s, преÑкакање (разлог=%s, линија=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Празан NZB %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "ИгнориÑање дуплог NZB-а \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "Паузирам због дуплог NZB-а \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Поништено, не може да Ñе заврши" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "ДУПЛИКÐТ" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "ШИФРИРÐÐО" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "ПРЕВЕЛИКО" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "ÐЕПОТПУÐО" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "NEŽELJENI" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "FILTRIRANO" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "Чекање %s Ñек" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Преузето за %s на проÑек од %sБ/Ñ" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "СтароÑÑ‚" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s артикла ниÑу добро формирани" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s артикла недоÑтају" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s артикла ниÑу дупликате" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s артикла Ñу уклоњени" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Грешка увоза %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Упозорења" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Мирoвање" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "ПоÑтавке" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Ред" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "ОчиÑти ред" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Хронологија" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "ОчиÑти хронологију" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Ограничење брзине" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Пауза" #: sabnzbd/osxmenu.py msgid "min." msgstr "мин." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "ÐаÑтави" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Скенирај надгледану фаÑциклу" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "ProÄitani svi RSS kanali" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Комплетна фаÑцикла" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Ðекомплетна фаÑцикла" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "Реши проблем" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Поново покрени" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Ponovno pokretanje bez prijave" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Излаз" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "У ред прве 10 Ñтавке" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Празно" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "Хронологија задњих 10 Ñтавка" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "Ðово издање је доÑтупно" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Покрени аÑиÑтент" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "ЗауÑтављам..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Проблем Ñа" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd-у је потребан Ñлободан tcp/ip порт за интерни веб Ñервер.
\n" " Покушан је порт %s на %s, али није доÑтупан.
\n" " Ðеки други програм кориÑти тај порт или SABnzbd већ ради.
\n" "
\n" " Поново покрените SABnzbd Ñа другим портом." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "Ðко опет имате ову грешку, покушајте други број.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd-у је потребна важећа хоÑÑ‚ адреÑа за интерни веб Ñервер.
\n" " Унели Ñте погрешну адреÑу.
\n" " Сигурне вредноÑти Ñу localhost и 0.0.0.0
\n" "
\n" " Поново покренути SABnzbd Ñа добром хоÑÑ‚ адреÑом." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd је нашао Ñачуване податке неке друге верзије SABnzbd-а
\n" " али не може да иÑкориÑти податке Ñа другог програма.

\n" " Морате прво де завршите ред Ñа другом верзијом програма.

\n" " ПоÑле тога, покренути овај програм Ñа опцијом \"--clean\".
\n" " То ће обриÑати актуелни ред и хронилогију!
\n" " SABnzbd чита датотеку \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd не може да нађе датотеке веб интерфејÑа у %s.
\n" " Молимо да поново инÑтлирате програм.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd је нашао фаталну грешку:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd је нашао да недоÑтаје датотека 'sqlite3.dll'.

\n" " Ðеки лоши против-вируÑни програми уклањају ту датотеку.
\n" " Проверите против-вируÑни програм, поново инÑталирајте SABnzbd и " "пошаљите жалбу Ñвојим продавацу против-вируÑа.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "СтиÑнути Startkey+R и унети линију (пример):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Отворите прозор терминала и унети линију (пример):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Програм није покренут!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "Фатална грешка" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Ðемогуће је покренути претраживач, вероватно није нађен" #: sabnzbd/panic.py msgid "Access denied" msgstr "ПриÑтуп одбијен" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Грешка %s: Требате да унеÑете важеће име/лозинку." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "Стари ред је нађен, употребити СтатуÑ->Поправи за претварање реда" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" msgstr "" #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "Преузимање је можда погрешно. има %s од потребних %s" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "ÐеуÑпешно преузимање - није на вашем Ñерверу" #: sabnzbd/postproc.py msgid "Moving" msgstr "Премештање" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "%s поÑлат у ред" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Грешка преименовања \"%s\" у \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "ÐеуÑпешно премештање датотека" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Покретање Ñкрипта %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "%s покренуто" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Kod prekida skripte je %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Више" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Грешка поÑÑ‚-процеÑирања за %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "видети извештај" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "ÐеуÑпешно преузимање" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Чишћење %s није уÑпело." #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Преузимање завршено" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Ðемогуће креирање фаÑцикле %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "ПоÑÑ‚-процеÑирање" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Ðема par2 датотеке" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "PokuÅ¡aj SFV provere" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Ðеке датотеке ниÑу проверене \"%s\"" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "УÑпешна провера преко СФВ" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Zahteva lozinku" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Brisanje %s neuspeÅ¡no" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "ÐеуÑпешна хибернација ÑиÑтема" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "ÐеуÑпено поÑтављање ÑиÑтема у Ñтању приправноÑти" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "GreÅ¡ka pri gaÅ¡enju sistema" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Indekser id (%s) nije pronaÄ‘en za datoteku ocenjivanja" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "ÐдреÑа Ñервера" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "API кључ" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Погрешан Ð¾Ð¿Ð¸Ñ RSS фида \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "ÐеуÑпешно преузимање RSS од %s: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Ðемам важећу аутентификацију за фид %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "GreÅ¡ka na strani servera (kod greÅ¡ke %s); nemoguće dobiti %s na %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Server %s koristi nepouzdan HTTPS sertifikat" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "RSS фид %s је празан" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Ðекомпатибилан Фид" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "NaÄ‘en prazan RSS unos (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Pokaži interfejs" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Otvori fasciklu zavrÅ¡enih" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Паузирај за" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Паузирај 5 минута" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Паузирај 15 минута" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Паузирај 30 минута" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Паузирај 1 Ñат" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Паузирај 3 Ñата" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Паузирај 6 Ñати" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "УгаÑи" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "ПреоÑтало" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Додај NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Лоша планификација %s у %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Ðепозната акција: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Планификација за непоÑтојећи Ñервер %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Преузми" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Прилепити датотеке" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Извор" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Сервери" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Грешка" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "ÐеуÑпешно" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Чекам" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Popravljanje..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "РаÑпакујем..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Премештање..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Покретање Ñкипта..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Преузимање екÑтра блокова..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Брза провера..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Проверавање..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Преузимам" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Задатак" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "Onemogući server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "Omogući server" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Ограничење брзине" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Паузирај Ñве" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Паузирај поÑÑ‚-процеÑирање" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "ÐаÑтави поÑÑ‚-процеÑирање" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Читај RSS фидове" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Уклони неуÑпешна поÑла" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Ukloni zavrÅ¡ene poslove" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Pauziraj poslove sa niskim prioritetom" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Pauziraj poslove sa normalnim prioritetom" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Pauziraj poslove sa visokim prioritetom" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "ÐаÑтави радови Ñа ниÑким приоритетом" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "ÐаÑтави радови Ñа нормалним приоритетом" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "ÐаÑтави радови Ñа виÑоким приоритетом" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Омогући управљање квота" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "ИÑкључено" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Врло ниÑко" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Умерено" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Ðормалан" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "ВиÑок" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Хитно" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Ðизак" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "МБ" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "ГБ" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "Ñат" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "Ñата(и)" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "мин." #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "мин." #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "Ñек." #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "Ñекунди(е)" #: sabnzbd/skintext.py msgid "day" msgstr "дан" #: sabnzbd/skintext.py msgid "days" msgstr "дана" #: sabnzbd/skintext.py msgid "week" msgstr "Ñедмица" #: sabnzbd/skintext.py msgid "Month" msgstr "МеÑец" #: sabnzbd/skintext.py msgid "Year" msgstr "Година" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Дан у меÑецу" #: sabnzbd/skintext.py msgid "This week" msgstr "Ове Ñедмице" #: sabnzbd/skintext.py msgid "This month" msgstr "Овог меÑеца" #: sabnzbd/skintext.py msgid "Today" msgstr "ДанаÑ" #: sabnzbd/skintext.py msgid "Total" msgstr "Укупно" #: sabnzbd/skintext.py msgid "on" msgstr "укљ." #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parametri" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Верзија Python-а" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Почетна Ñтраница" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "или" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "ХоÑÑ‚" #: sabnzbd/skintext.py msgid "Comment" msgstr "Komentar" #: sabnzbd/skintext.py msgid "Send" msgstr "Пошаљи" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Откажи" #: sabnzbd/skintext.py msgid "Other" msgstr "ОÑтало" #: sabnzbd/skintext.py msgid "Report" msgstr "IzveÅ¡taj" #: sabnzbd/skintext.py msgid "Video" msgstr "Видео" #: sabnzbd/skintext.py msgid "Audio" msgstr "Ðудио" #: sabnzbd/skintext.py msgid "Not used" msgstr "Ðије коришћено" #: sabnzbd/skintext.py msgid "or less" msgstr "ili manje" #: sabnzbd/skintext.py msgid "Log in" msgstr "" #: sabnzbd/skintext.py msgid "Log out" msgstr "" #: sabnzbd/skintext.py msgid "Remember me" msgstr "" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "Alatka za automatizovano preuzimanje sa usenet-a" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Сачувај" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Snimanje..." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Да ли Ñте Ñигурни?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Обриши Ñве преузете датотеке?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Кућа" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Подешавање" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "СтатуÑ" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Помоћ" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Форум" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "ИРЦ" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Опште" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "ФаÑцикле" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Прекидачи" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Планирање" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Обавештења" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "Е-пошта" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Категорије" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Сортирање" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "ПоÑебно" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Претрага" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "ФаÑцикла преузимања" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "ПÐУЗИРÐÐО" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "Кеширано %s артикла (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Sysload" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Ðовије издање %s је доÑтупно на" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Da li ste sigurni da želite ugasiti SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Додај" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Додај датотеку" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Категорија" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Обрађивање" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Приоритет" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Поправи" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Издвој" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Обриши" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "П" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "С" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "П" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "ФорÑирај" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "ЗауÑтави" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "УнеÑите УРЛ" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "Када Ñе ред заврши" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "УгаÑи рачунар" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "У Ñтање приправноÑти" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Хибернација" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "УгаÑи SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Ограничење брзине" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "РедоÑлед" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Име" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "Процењено време" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "СТÐРОСТ" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Обриши" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Покушај опет" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Ðкције" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Скрипте" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "ОбриÑати Ñве Ñтавке Ñа реда?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "ОчиÑти NZB" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "ОчиÑти NZB и обриши датотеке" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Ponovo pokuÅ¡aj sve neuspeÅ¡ne poslove" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Уклони NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Уклони NZB и обриши датотеке" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "од" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "ÐедоÑтају артикли" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "ОÑтала квота" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "ручно" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "РеÑетуј квоту" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Обриши Ñве завршене Ñтавке Ñа хронологије?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Сакриј детаље" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Прикажи детаље" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Прикажи погрешне" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Прикажи Ñве" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Величина" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "ОчиÑти NZB Ñа грешком" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "ОчиÑти NZB Ñа грешком и обриши датотеке" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "ОчиÑти завршене NZB" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "Додатне опције NZB-а" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Путања" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Ponovo pokuÅ¡aj sve neuspeÅ¡ne" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Ponovo pokuÅ¡aj sve" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Virus/neželjeno" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Van retencije" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Neki drugi problem" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Ðатерај иÑкључење" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "То ће поÑлати пробну е-поруку Вашем малогу." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Покажи извештај" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Пробна е-порука" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Бележење" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Грешке/Упозорења" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Инфо" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Дебаг" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Везе" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Ðајновија Упозорења" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "очиÑти" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Деблокирај" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Идентифација артикла" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Збир датотека" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Када" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Тип" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Омогућено" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Управљачка табла" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Veza neuspeÅ¡na!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Lokalna IPv4 adresa" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Javna IPv4 adresa" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "IPv6 adresa" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Nameserver/DNS Pretraga" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "Модел процеÑора" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Performanse sistema (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Brzina foldera za preuzimanje" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Brzina foldera za kompletirana preuzimanja" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Brzina pisanja" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "Ne mogu da zapiÅ¡em. Proverite da li je u fasciklu moguće pisati." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Kliknite na dugme Ponovi test ispod, da odredite" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Ponovi test" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "; Датотека подешавања" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "; Кеш" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Ово поново покреће SABnzbd.
КориÑтити ако миÑлите да програм има " "проблем ÑтабилноÑти.
Преузимање ће бити паузирано и наÑтавиће Ñе поÑле." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "ПоÑтоје уÑамљени радови у фаÑцикли преузимања.
Можете да их обришете " "(укључујући датотеке) или да их поново пошаљете у ред." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "То поново покреће SABnzbd и ради пуну
реконÑтрукцију Ñадржаја реда, " "чувајући већ преузете датотеке.
То мења ред реда." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Промене Ñу изгубљене јер ниÑу Ñачуване." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Omogući Unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "Омогући 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "; Верзија" #: sabnzbd/skintext.py msgid "Uptime" msgstr "; Ради" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Резервно" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "За више информација, читајте Вики!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Поновно покретање SABnzbd-а..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "За апликацију промена, поново покренути програм!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "SABnzbd Веб Ñервер" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "SABnzbd хоÑÑ‚" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "ХоÑÑ‚ на којем SABnzbd Ñлуша." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "SABnzbd Порт" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Порт на који SABnzbd чека везе." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Веб интерфејÑ" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Odaberi izgled" #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "КориÑничко име SABnzbd-а" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "КориÑничко име за аутентификацију (опционо)" #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "Лозинка SABnzbd-а" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "Ðктивирај HTTPS" #: sabnzbd/skintext.py msgid "not installed" msgstr "никје инÑталирано" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "ПриÑтуп интерфејÑу преко HTTPS адреÑе." #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "HTTPS порт" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "Ðко је празно, Ñтандардни порт ће Ñлушати Ñамо HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "HTTPS Ñертификат" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Датотека или путања до HTTPS Ñертификата." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "HTTPS кључ" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Датотека или путања до HTTPS кључа." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "HTTPS Chain цертификати" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Датотека или путања до HTTPS Chain" #: sabnzbd/skintext.py msgid "Tuning" msgstr "Штеловање" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "Интервал RSS провере" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Интервал провере (у минутима, макар 15). Ðеактивно када кориÑтите планер!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "ÐœÐ°ÐºÑ Ð±Ñ€Ð·Ð¸Ð½Ð° линије" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "ПоÑтатак брзине линије" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "Који поÑтотак брзине линије SABnzbd треба да кориÑти, нпр. 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Лимит кеша артикла" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Кеширати артикле у меморији. То Ñмањује приÑтуп диÑка.
У бајтовима, " "опционо додати K,M,G. Пример: \"64M\" или \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "СпиÑак чишћења" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "ЛиÑта ектензије за бриÑање поÑле преузимања.
Ðа пример: nfo или " "nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Сачувај промене" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "" #: sabnzbd/skintext.py msgid "Reset" msgstr "РеÑетуј" #: sabnzbd/skintext.py msgid "Language" msgstr "Језик" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Језик веб интерфејÑа" #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "Овај кључ допушта пун приÑтуп SABnzbd-а другим програмима." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "NZB кључ" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "Кључ допушта да други програми додају NZB у SABnzbd." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Генериши нов кључ" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "QR Код ÐПИ кључа" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Lista lokalnih mrežnih raspona" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Sve lokalne mrežne adrese poÄinju sa sledećim prefiksima (najÄešće " "\"192.168.1.\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "ЕкÑтерни приÑтуп интернету" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "Без приÑтупа" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Dodaj NZB datoteke " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (без подешавања)" #: sabnzbd/skintext.py msgid "Full API" msgstr "Цео API" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Цео веб интерфејÑ" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "БЕЛЕШКÐ: ФаÑцикле ће бити аутоматÑки креиране приликом Сачувавања. " "Могуће је коришћење апÑолутне путање за Ñачувавање ван подразумеваних " "фаÑцикли." #: sabnzbd/skintext.py msgid "User Folders" msgstr "КориÑничке фаÑцикле" #: sabnzbd/skintext.py msgid "Browse" msgstr "Pregledaj" #: sabnzbd/skintext.py msgid "In" msgstr "У" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Привремена фаÑцикла преузимања" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Смештај непроцеÑираних преузимања.
Промене Ñу могуће Ñамо када је " "ред празан." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Минимални проÑтор за привремену фаÑциклу" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Паузирај када је проÑтор иÑпод ове вредноÑÑ‚.
У бајтовима, опционо " "додати K,М,G,T. ÐПР: \"800M\" или \"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "ФаÑцикла за завршена преузимања" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Смештај завршених, процеÑираних преузимања.
Може Ñе заобићи у " "дефиниÑаним категоријама." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Дозволе за фаÑциклу завршених преузимања" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "ПоÑтавља дозволе за завршене датотеке/фаÑцикле.
У октал. Ðа пример: " "\"755\" или \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Ðадгледана фаÑцикла" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "ФаÑцикла за надгледање .nzb датотека.
Такође Ñкенира " ".zip .rar и .tar.gz архиве у потрази за .nzb " "датотекама." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Интервал Ñкенирања" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Број Ñекунди између 2 провере .nzb датотека" #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "ФаÑцикла модела е-поште" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "ФаÑцикла где Ñе налазе модели е-поште." #: sabnzbd/skintext.py msgid "Password file" msgstr "Лозинка датотеке" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "Датотека Ñа Ñвим лозинкама за шифроване РÐР датотеке." #: sabnzbd/skintext.py msgid "System Folders" msgstr "СиÑтемÑке фаÑцикле" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "ФаÑцикла ÐдминиÑтратора" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Локацију за ред и хронологију базе.
Промене Ñу могуће Ñамо када је " "ред празан." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Податци неће бити премештени. Потребно поновно покретање SABnzbd-" "а!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "ФаÑцикла извештаја" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "Смештај извештаја SABnzbd-а.
Потребно је поновно покретање SABnzbd-" "а!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "ФаÑцикла копије .нзб" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Смештај за Ñачувавање .нзб датотека." #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Подразумевана оÑновна фаÑцикла" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Преузми Ñве par2 датотеке" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Омогући рекурÑивни издвој" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Издвој архиве (rar, zip, 7z) унутра архиве." #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "IgnoriÅ¡i foldere unutar arhiva" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Sve datoteke će biti smeÅ¡tene u jedan folder" #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Само артикли на врху реда" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Упали за мању употребу меморије. УгаÑити ради Ñпречавања блокирања реда " "Ñпорим радовима." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "ПоÑÑ‚-процеÑирај Ñамо проверени поÑлови" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" "Огранићи поÑÑ‚-процеÑирање Ñамо за радове који Ñу прешли Ñве PAR2 провере." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Ðкција када је шифрован РÐР преузет" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "Ðко је \"Пауза\", требате да поÑтавите лозинку и да наÑтавите рад." #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Откриј дупликатна преузимања" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Откриј дупле епизоде у Ñерије" #: sabnzbd/skintext.py 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 "Одбаци" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Прекини" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Radnja kada je otkrivena neželjena ekstenzija" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "Radnja kada je otkrivena neželjena ekstenzija u RAR datotekama" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Neželjene ekstenzije" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Lista svih neželjenih ekstenzija. Na primer: exe or exe, com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Упали SFV провере" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Уради још једну проверу базирану на SFV датотеке." #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "KorisniÄke skripte mogu uznaÄiti posao kao neuspeÅ¡an" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Kada korisniÄka skripta vrati kod koji nije nula, posao će biti oznaÄen kao " "neuspeÅ¡an" #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "U sluÄaju neuspeha, pokuÅ¡aj sa alternativnim NZB-om" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "Neki serveri nude alternativni NZB pri neuspeÅ¡nom preuzimanju" #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Упали преименовање фаÑцикле" #: sabnzbd/skintext.py 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" msgstr "КориÑнички Ñкрипт пре-реда" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Коришћено пре него што NZB уђе у ред." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Додатни параметри PAR2" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Параметри 'Nice'" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "Параметри 'IONice'" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "ЗауÑтави везу када је ред празан" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "ИÑкључи Ñе Ñа Ñервера када је ред празан или паузиран." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Сортирај по ÑтароÑÑ‚" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "ÐутоматÑко Ñортирај Ñтавке по ÑтароÑÑ‚ (проÑек)." #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Провери нове верзије" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Ðедељно проверавај за новије верзије програма." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "И пробне верзије" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Размени размаке у имену фаÑцикле" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Размени размаке Ñа _ у имену фаÑцикле." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Размени тачке у имену фаÑцикле" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Размени тачке Ñа размацима у имену фаÑцикле." #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Napravi Windows kompatibilnim" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "Za servere: osiguraj da su imena kompatibilna sa Windows-om." #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Покрени претраживач при покретању" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Покрени Веб претраживач при покретању SABnzbd-а." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Паузирај док Ñе поÑÑ‚-процеÑира" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "Паузирај преузимања на почетку поÑÑ‚-процеÑирања и наÑтави поÑле." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Игнориши примере" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Филтрирај примерне датотеке (нпр. видео пример)." #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Обриши поÑле преузимања" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" #: sabnzbd/skintext.py msgid "Server" msgstr "Сервер" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Ðакнадна обрада" #: sabnzbd/skintext.py msgid "Naming" msgstr "Именовање" #: sabnzbd/skintext.py msgid "Quota" msgstr "Квота" #: sabnzbd/skintext.py msgid "Indexing" msgstr "ИндекÑирање" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Колико може да Ñе преузме овог меÑеца (К/М/Г)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Дан реÑетовања" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "Који дан меÑеца или недеље (1=понедељак) Ваш провајдер реÑетује квоту? " "(опционо Ñа hh:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Automatski nastavi" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "Да Ñе наÑтави преузимање поÑле реÑета квоте?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Период квоте" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "Квота је реÑетована Ñваки дан, недеље или меÑец?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Провери пре преузимања" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Покуша да предвиди уÑпешан завршетак пре Ñтварног преузимања (Ñпорије!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "ÐœÐ°ÐºÑ Ð¿Ð¾ÐºÑƒÑˆÐ°Ñ˜Ð°" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "ÐœÐ°ÐºÑ Ð¿Ð¾ÐºÑƒÑˆÐ°Ñ˜Ð° по Ñерверу" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Поништи рад који не може да Ñе заврши" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Када током преузимања поÑтаје јаÑно да превише података недоÑтаје, прекинути " "поÑао" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Omogući filtriranje" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Radnje pri preuzimanju prema pravilima filtriranja." #: sabnzbd/skintext.py msgid "Abort If" msgstr "Obustavi ako" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "InaÄe pauziraj ako" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Ocena videa" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Ocena zvuka" #: sabnzbd/skintext.py msgid "Spam" msgstr "Ðепожељна" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "PotvrÄ‘eno" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "ViÅ¡e negativnih nego pozitivnih" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "KljuÄne reÄi naziva" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Lista razdvojena zarezom" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Korisno ukoliko news server ima viÅ¡e od jedne IPv4/IPv6 adrese" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Додај Ñервер" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Opis servera" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Порт" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "КориÑничко име" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Лозинка" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Време иÑтекло" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Време задржавања" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "ССЛ" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "Онемогућено" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 je najveći prioritet, 99 je najniži prioritet" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Опционо" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Омогући" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Уклони Ñервер" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Пробај Ñервер" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "ИÑпразни бројаче" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Пробам детаље Ñервера..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Проток" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Пошаљи 'Group'" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "ПоÑлати команду 'group' пре тражења артикла." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "LiÄne zabeleÅ¡ke" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Dodaj raspored" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Фреквенција" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Ðкција" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Ðргументи" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "trenutni rasporedi" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Кутијица поред имена фида треба да буде одабрана да би фид био омогућен и да " " провери нове Ñтавке.
Када је фид додат, ће узети нове Ñтавке а не оне " "које Ñу већ у RSS фиду оÑим ако ÑтиÑнете \"Ðатерај преузимање\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Читај фид" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Ðатерај преузимање" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Филтер" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Прихвати" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Одбаци" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Захтеви" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "ПотребанCat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Najmanje" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Ðајвише" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "Od SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Одговара" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Ðе одговара" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Преузето" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Сада читај Ñве фидове" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Ðотификација е-поштом при завршетку рада" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Ðикад" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Увек" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Само-Грешке" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Обавештење пуног диÑка" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "Пошаљи е-поруку када је диÑк пун и SABnzbd паузиран." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Пошаљи RSS нотификације" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "Пошаљи е-поруку када RSS фид дода рад у ред." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "СМТП Ñервер" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Унети Ñервер излазних е-поруке вашег провајдера." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Е-пошта примаоца" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "ÐдреÑа на коју Ñе шаље е-порука." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "Е-пошта Ñлања" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Е-пошта одакле долази нотификација" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "КориÑничко име (ОПЦИОÐО)" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Ðко је потребна аутентификација за Ñлање е-поште, унети име." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "Лозинка (ОПЦИОÐО)" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Ðко је потребна аутентификација за Ñлање е-поште, унети лозинку." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Обавештење поÑлато!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Упали „Growl“" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "КориÑти Ñамо удаљен „Growl“ Ñервер (хоÑÑ‚:порт)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Лозинка Ñервера" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Опциона лозинка за „Growl“ Ñервер" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "Упали „NotifyOSD“" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Центар за обавештења" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Windows notifikacije" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Windows notifikacije" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Омогући Prowl нотификације" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Потребан Prowl налог" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "API кључ за Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Лични API кључ за Prowl (потребно)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Omogući Pushover notifikacije" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Zahteva Pushover nalog" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Token aplikacije" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Token aplikacije (obavezan)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "KorisniÄki kljuÄ" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "KorisniÄki kljuÄ (obavezan)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "UreÄ‘aj(i)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Omogući Pushbullet notifikacije" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Zahteva Pushbullet nalog" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "LiÄni API kljuÄ" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "VaÅ¡ liÄni Pushbullet API kljuÄ (obavezan)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Уређај" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "UreÄ‘aj na koji bi poruka trebala biti poslata" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Завршавање путање Ñа звездицом * ће Ñпречити креацију фаÑцикле за рад." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "РелативноÑÑ‚ фаÑцикле је базирано" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "ФаÑцикла/Путања" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Сортирање Ñерије" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Упали Ñортирање ТВ-а" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Модел кључа" #: sabnzbd/skintext.py msgid "Clear" msgstr "ОчиÑти" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "Предподешавања" #: sabnzbd/skintext.py msgid "Example" msgstr "Примери" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Упали Ñортирање филма" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Задржи изгубљена преузимања у фаÑциклама" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Погођене категорије" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Значење" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Модел" #: sabnzbd/skintext.py msgid "Result" msgstr "Резултат" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 ФаÑцикла Ñезоне" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 ФаÑцикла Ñезоне" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 ФаÑцикла епизоде" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 ФаÑцикла епизоде" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "" #: sabnzbd/skintext.py msgid "Title" msgstr "ÐаÑлов" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Име филма" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Име.Филма" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Име_филма" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Име Ñерије" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Име.Ñерије" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Име_Серије" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Број Ñезоне" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Број епизоде" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Име епизоде" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Име.Епизоде" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Име_епизоде" #: sabnzbd/skintext.py msgid "File Extension" msgstr "ЕкÑтензија датотеке" #: sabnzbd/skintext.py msgid "Extension" msgstr "ЕкÑтензија" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Број дела" #: sabnzbd/skintext.py msgid "Decade" msgstr "Декада" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Оригинално име датотеке" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Мала Ñлова" #: sabnzbd/skintext.py msgid "TEXT" msgstr "ТЕКСТ" #: sabnzbd/skintext.py msgid "text" msgstr "текÑÑ‚" #: sabnzbd/skintext.py msgid "file" msgstr "датотека" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Уреди низ" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Етикете више-партија" #: sabnzbd/skintext.py msgid "In folders" msgstr "У фаÑциклама" #: sabnzbd/skintext.py msgid "No folders" msgstr "Ðема фаÑцикле" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Сређивање датумом" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Упали Ñређивање по датуму" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "ФаÑцикла Име Серије" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "ФаÑцикле Година-МеÑец" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Дневне фаÑцикле" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "Прилагођено-Ñлово" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Резултат обрађивања" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Опције ретко коришћене. За њихово значење и објашњење, клинути на дугме " "Помоћ за одлазак на Вики Ñтраницу.
Ðемојте их мењати пре не провере на " "Вики, пошто неке имају озбиљне нежељене ефекате.
Подразумеване вредноÑти " "Ñу између заграда." #: sabnzbd/skintext.py msgid "Values" msgstr "ВредноÑти" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Уреди детаље NZB-а" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Обриши" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Врх" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Горе" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Доле" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Дно" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Све" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Окрени" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Име датотеке" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Тема" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Избор" #: sabnzbd/skintext.py msgid "left" msgstr "оÑтало" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Слободан проÑтор" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Привремено" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Мулти-операције" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Držite taster shift pritisnut da bi ste odabrali raspon" #: sabnzbd/skintext.py msgid "Check all" msgstr "Proveri sve" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Ponovo pokreni SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Opcije statusa i interfejsa" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Ili prevucite i pustite datoteke u prozor!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Izgubljena konekcija sa SABnzbd" #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "Брзина оÑвежавања" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Koristi globalna podeÅ¡avanja interfejsa" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Limit stavku u redu" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Limit stavki u istoriji" #: sabnzbd/skintext.py msgid "Date format" msgstr "Формат датума" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Ekstra kolona reda" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "" #: sabnzbd/skintext.py msgid "page" msgstr "Ñтрани" #: sabnzbd/skintext.py msgid "Loading" msgstr "Учитавам" #: sabnzbd/skintext.py msgid "articles" msgstr "artikli" #: sabnzbd/skintext.py msgid "Rename" msgstr "Преименуј" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Поправљење реда" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Prikaži aktivne konekcije" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "ZapuÅ¡teni poslovi" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "PoÅ¡alji nazad u red" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Избриши Ñве" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Ponovo pokuÅ¡aj sve" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Povuci NZB sa URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "PoÅ¡alji NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Опционо Ñпецифирати име" #: sabnzbd/skintext.py msgid "Submit" msgstr "Пошаљи" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Отвори информативни УРЛ" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "Poslato. Hvala!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "MiÅ¡ta nije odabrano!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "Ukloni sve odabrane fajlove" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Sakrij/prikaži sve zavrÅ¡ene datoteke" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Види извештај Ñкрипта" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "Ðова верзија доÑтупна!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" #: sabnzbd/skintext.py msgid "Custom" msgstr "Прилагођено" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "" #: sabnzbd/skintext.py msgid "Speed" msgstr "Брзина" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Потврда бриÑања реда" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Потврда бриÑања хронологије" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Koliko dugo ili dokle želite da pauzirate? (na engleskom!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Žao nam je, nismo mogli to da interpretiramo. PokuÅ¡ajte ponovo." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Паузирај за..." #: 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 Oldest→Newest" msgstr "Среди по ÑтароÑÑ‚ Старије→Ðовије" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Среди по ÑтароÑÑ‚ Ðовије→Старије" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Среди по имену A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Среди по имену Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Среди по величини Мање→Веће" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Среди по величини Веће→Мање" #: sabnzbd/skintext.py msgid "Uploading" msgstr "" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "" #: sabnzbd/skintext.py msgid "Removing job" msgstr "" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "" #: sabnzbd/skintext.py msgid "Prev" msgstr "Претходно" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Следеће" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "ОчиÑти хронологију?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "За функциониÑање Plush-а упалите JavaScript!" #: sabnzbd/skintext.py msgid "Options" msgstr "Опције" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Паузирати за колико минута?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Главни мени" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Ðа крају" #: sabnzbd/skintext.py msgid "Sort" msgstr "Сортирај" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Среди по ÑтароÑÑ‚ (Старије→Ðовије)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Среди по ÑтароÑÑ‚ (Ðовије→Старије)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Среди по Имену (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Среди по Имену (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Среди по величини (Мање→Веће)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Среди по величини (Веће→Мање)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "ОчиÑти ред?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "PokuÅ¡aj ponovo sve poslove u istoriji?" #: sabnzbd/skintext.py msgid "Purge" msgstr "ОчиÑти" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Ðајвећа брзина" #: sabnzbd/skintext.py msgid "Range" msgstr "ОпÑег" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Примени на одабрано" #: sabnzbd/skintext.py msgid "Everything" msgstr "Све" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "ОÑвежавање" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Ширина контејнера" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "При прелазу миша преко рада, зауÑтавља Ñе обнова Ñадржаја." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Блокирати обнове на прелаз миша" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Слање" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "PoÅ¡alji: .nzb .rar .zip .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "Ðапредак" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Ðедовољно проÑтора на диÑку за завршавање преузимања!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Слободно (Привремено)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "ЧЕКÐ" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Преузимања" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "ÐÑиÑтент брзог-покретања SABnzbd-а" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "Верзија SABnzbd-а" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Претходно" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Детаљи Ñервера" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Овде унети детаље вашег примарног 'usenet' провајдера." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Број веза дозвољене од Ñтране провајдера" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "Ðпр 8 или 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Одабрати СÐМО ако Ваш провајдер допушта SSL везе." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Кликнути за пробу унетих детаља." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Ðпр." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "Подешавање је Ñада завршено!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd ће Ñада радити у позадини." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "Затварање прозора/језичка претраживаче ÐЕЋЕ затворити SABnzbd." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Препоручено је да поÑтавите ову локацију као 'маркер' тако да Вам је приÑтуп " "SABnzbd омогућен док он ради у позадини." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Даља помоћ Ñе може наћи на" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "Иди на SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "Затвори SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Покрени чаробњака" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd долази БЕЗ ИКÐКВЕ ГÐРÐÐЦИЈЕ.\n" "Ово је беÑплатан програм, и ви Ñте добродошли да га делите под одређеним " "уÑловима.\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' провајдер? Препоручујемо Вам %s." #: sabnzbd/sorting.py [Error message] msgid "Error getting TV info (%s)" msgstr "Грешка преузимању ТВ инфо (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "ÐеуÑпешно преименовање : %s у %s" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "ÐеуÑпешно преименовање Ñличне датотеке: %s у %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "Neautorizovan pristup" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "URLGRABBER SE SRUÅ IO" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "NZB датотека неупотребљива" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "Погрешно учитавање УРЛ-а; %s" #~ msgid "Step One" #~ msgstr "Корак 1" #~ msgid "Step Two" #~ msgstr "Корак 2" #~ msgid "Step Three" #~ msgstr "Корак 3" #~ msgid "Step Four" #~ msgstr "Корак 4" #~ msgid "Step Five" #~ msgstr "Корак 5" #~ msgid "Please enter a whole number." #~ msgstr "Молимо да унеÑете цео број." #~ msgid "This field is required." #~ msgstr "Ово поље је обавезно." #~ msgid "Access" #~ msgstr "ПриÑтуп" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Упали HTTPS приÑтуп на SABnzbd." #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Заштити лозинком приÑтуп SABnzbd-а (препоручено)" #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Желим да SABnzbd буде видљив Ñамо Ñа мог рачунара." #~ msgid "Misc" #~ msgstr "ОÑтало" #~ msgid "Show Edit Options" #~ msgstr "Прикажи опције Уређивања" #~ msgid "Timeleft" #~ msgstr "ПреоÑтало време" #~ msgid "Hide Edit Options" #~ msgstr "Сакриј опције Уређивања" #~ msgid "DualView2" #~ msgstr "DualView2" #~ msgid "Edit" #~ msgstr "Уреди" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "Сигурно поново покренути SABnzbd?" #~ msgid "Links" #~ msgstr "Линкови" #~ msgid "Email Sent!" #~ msgstr "Е-порука је поÑлата!" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Приказивање %s до %s од %s резултата" #~ msgid "DualView1" #~ msgstr "DualView1" #~ msgid "Saved" #~ msgstr "Сачувано" #~ msgid "Showing one result" #~ msgstr "Приказ једног резултата" #~ msgid "No results" #~ msgstr "Ðема резултата" #~ msgid "Hour:Min" #~ msgstr "Сат:Мин" #~ msgid "Delete Completed" #~ msgstr "Обриши завршено" #~ msgid "Open Source URL" #~ msgstr "Отвори изворни УРЛ" #~ msgid "Storage" #~ msgstr "Складиште" #~ msgid "Plush Options" #~ msgstr "Опције Plush" #~ msgid "Pause for 12 hours" #~ msgstr "Паузирај 12 Ñати" #~ msgid "Pause for 24 hours" #~ msgstr "Паузирај 24 Ñата" #~ msgid "Pause Interval" #~ msgstr "Интервал паузе" #~ msgid "Page" #~ msgstr "ЛиÑÑ‚" #~ msgid "First" #~ msgstr "Прво" #~ msgid "Close" #~ msgstr "Затвори" #~ msgid "Set Pause Interval" #~ msgstr "ПоÑтави интервал паузе" #~ msgid "Are you sure you want to delete" #~ msgstr "ЗаиÑта избриÑати" #~ 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 "Упали генерално Ñортирање/преименовање датотеке." #~ msgid "Generic Sorting" #~ msgstr "Генеричко Ñортирање" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Упали Ñортирање/преименовање епиÑоде." #~ msgid "Sorting configuration" #~ msgstr "Подешавање Ñортирања" #~ msgid "Groups / Indexer tags" #~ msgstr "Групе/ИндекÑуј ознаке" #~ msgid "Defines post-processing and storage." #~ msgstr "Дефиниши поÑле-процеÑирање и Ñтовариште." #~ msgid "User-defined categories" #~ msgstr "КориÑничке категорије" #~ msgid "Email Account Settings" #~ msgstr "ПоÑтавке е-поште" #~ msgid "Feeds" #~ msgstr "Фидови" #~ msgid "Settings" #~ msgstr "ПоÑтавке" #~ msgid "Email Options" #~ msgstr "Опције е-поште" #~ msgid "Add Feed" #~ msgstr "Додај фид" #~ msgid "Skip" #~ msgstr "ПреÑкочи" #~ msgid "Delete Feed" #~ msgstr "Обриши фид" #~ msgid "Scheduling configuration" #~ msgstr "Подешавање планификације" #~ msgid "Click below to test." #~ msgstr "Кликнути иÑпод за пробу." #~ msgid "RSS Configuration" #~ msgstr "Подешавање RSS-а" #~ msgid "Remove" #~ msgstr "Уклони" #~ msgid "New Feed URL" #~ msgstr "УРЛ новог фида" #~ msgid "Backup server" #~ msgstr "Резервни Ñервер" #~ msgid "Server definition" #~ msgstr "Дефиниција Ñервера" #~ msgid "Server configuration" #~ msgstr "Подешавање Ñервера" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Покажи време у AM/PM (не утиче на планер)." #~ msgid "Do not download" #~ msgstr "Ðе преузимај" #~ msgid "SSL type" #~ msgstr "Тип ССЛ-а" #~ msgid "Enable MultiCore Par2" #~ msgstr "Упали 'MultiCore Par2'" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Коришћено када категорија не дефинише приоритет." #~ msgid "Other Switches" #~ msgstr "ОÑтали прекидачи" #~ msgid "Default Priority" #~ msgstr "Подразумеван приоритет" #~ msgid "Used when no user script is defined by the category." #~ msgstr "Коришћено када категорија не дефинише Ñкрипт." #~ msgid "Default Post-Processing" #~ msgstr "Подразумевано поÑÑ‚-процеÑирање" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "Употребљено када категорија не дефинише поÑÑ‚-процеÑирање." #~ msgid "Default User Script" #~ msgstr "Подразумеван Ñкрипт" #~ msgid "Enable Filejoin" #~ msgstr "Упали Ñклапање" #~ msgid "Enable TS Joining" #~ msgstr "Упали TS Ñклапање" #~ msgid "Enable Par Cleanup" #~ msgstr "Упали чишћење Пар-а" #~ msgid "Switches configuration" #~ msgstr "Подешавање прекидача" #~ msgid "Processing Switches" #~ msgstr "Опције обраде" #~ msgid "Enable Quick Check" #~ msgstr "Упали брзу проверу" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "ФаÑцикла поÑÑ‚-процеÑирања" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "ФаÑцикла која Ñадржи Ñкиптове за поÑÑ‚-процеÑирање" #~ msgid "Folder configuration" #~ msgstr "Подешавања фаÑцикле" #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "КориÑтите на ÑопÑтвену одговорноÑÑ‚!" #~ msgid "Queue auto refresh interval:" #~ msgstr "Интервал обнове реда:" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "Интервал обнове реда у веб интерфејÑу (у Ñекундама, 0=без)." #~ msgid "HTTPS Support" #~ msgstr "HTTPS подршка" #~ msgid "Web server authentication" #~ msgstr "Ðутентификација веб Ñервера" #~ msgid "General configuration" #~ msgstr "Општа подешавања" #~ msgid "Thread" #~ msgstr "Ðит" #~ msgid "Email Test Result" #~ msgstr "Резултат пробне е-поруке" #~ msgid "Show Weblogging" #~ msgstr "Покажи веб извештај" #~ msgid "Remain/Total" #~ msgstr "ОÑтало/Збир" #~ msgid " or Report ID" #~ msgstr " Ð¸Ð»Ð¸ Report ID" #~ msgid "Sort by name" #~ msgstr "Поређај по имену" #~ msgid "Sort by age" #~ msgstr "Поређај по ÑтароÑÑ‚" #~ msgid "Sort by size" #~ msgstr "Поређај по величини" #~ msgid "Hide files" #~ msgstr "Сакриј датотеке" #~ msgid "Show files" #~ msgstr "Прикажи датотеке" #~ msgid " " #~ msgstr " " #~ msgid "Add new downloads" #~ msgstr "Додај нова преузимања" #~ msgid "WARNINGS" #~ msgstr "УПОЗОРЕЊÐ" #~ msgid "Complete Dir" #~ msgstr "ФаÑцикла завршених" #~ msgid "Download speed" #~ msgstr "Брзина преузимања" #~ msgid "Queued" #~ msgstr "У реду" #~ msgid "Error removing workdir (%s)" #~ msgstr "Грешка у бриÑању радне фаÑцикле (%s)" #~ msgid "No post-processing because of failed verification" #~ msgstr "Ðема поÑÑ‚-процеÑирање пошто провера није уÑпела" #~ msgid "View script output" #~ msgstr "Видети резултат Ñкрипта" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "ÐеуÑпешно бриÑање nzo Ñа реда поÑÑ‚-процеÑирања (ид)" #~ msgid "File %s is empty, skipping" #~ 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 "No email templates found" #~ msgstr "Ðема модела е-поруке" #~ msgid "Invalid encoding of email template %s" #~ msgstr "Погрешно енкодирање модела е-поруке %s" #~ msgid "Not matched" #~ msgstr "Ðе одговара" #~ msgid "OK" #~ msgstr "У реду" #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Изгледа да кориÑтите ZoneAlarm на Vista.
" #~ msgid "You have no permisson to use port %s" #~ msgstr "Ðије Вам дозвољено да кориÑтите порт %s" #~ msgid "Initiating restart...
" #~ msgstr "Иницирање поновног покретања...
" #~ msgid "Try again" #~ msgstr "Покушај поново" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Обриши Пар датотеке (ако је уÑпешна провера/поправка)." #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "КориÑтити V23 оÑим ако провајдер захтева другачије!" #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Погрешно ако има yEnc CRC грешке" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "Ðе проверавај Ñа 'par2' када Ñу датотеке 100% важеће." #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "КориÑти други Ñервер уколико има CRC грешке." #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "Промени илегална Ñлова у фаÑцикли по еквиваленти (иначе уклони)." #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "фали 'pyopenssl' модул, инÑталирајте га за 'https' приÑтуп" #~ msgid "ERROR: %s" #~ msgstr "ГРЕШКÐ: %s" #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "Фали датотека: %s => грешка 'unrar'?" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "ÐеуÑпешан издвој, потребна датотека није раÑпакована" #~ msgid "Unpacking failed, these file(s) are missing:" #~ msgstr "ÐеуÑпешан издвој, ове датотеке недоÑтају:" #~ msgid "Main packet not found..." #~ msgstr "Главни пакет није нађен..." #~ msgid "KB/s" #~ msgstr "КБ/Ñ" #~ msgid "Left" #~ msgstr "оÑтало" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "Ðпр 119 или 563 за ССЛ" #~ msgid "Disable API-key" #~ msgstr "УгаÑи API-кључ" #~ msgid "Get NZB" #~ msgstr "Узми NZB" #~ msgid "Toggle Add NZB" #~ msgstr "Пребаци Додај NZB" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Пошаљи: .nzb .rar .zip .gz" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "Склопи датотеке .001, .002 итд у једну датотеку." #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "Склопи датотеке .001.ts, .002.ts итд у једну датотеку." #~ msgid "Filters" #~ msgstr "Филтери" #~ msgid "Check result of unpacking" #~ msgstr "Провери резултат издвоја" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Провери резултат издвоја (треба да Ñе угаÑи за неке ÑиÑтеме датотеке)." #~ msgid "Send notifications to Growl" #~ msgstr "Пошаљи обавештења у „Growl“" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "Шаљи обавештења у „NotifyOSD“" #~ msgid "Invalid par2 files, cannot verify or repair" #~ msgstr "Погрешне par2 дат., не може да Ñе провери/поправи" #~ msgid "Only for optional servers" #~ msgstr "Само за опционе Ñервере" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Примени Ð¼Ð°ÐºÑ Ð¿Ð¾ÐºÑƒÑˆÐ°Ñ˜Ðµ Ñамо на опционе Ñервере" #~ msgid "QR Code" #~ msgstr "QR Код" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "ПÐЖЊÐ: ПоÑао је паузиран \"%s\" јер је RAR датотека шифрована" #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Ваша верзија UNRAR није препоручена, преузети одавде " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "UNRAR програм није нађен, раÑпаковање RAR датотеке није могуће
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "PAR2 програм није нађен, поправка је немогућа
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "ПоÑао \"%s\" је опет додат у ред" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "Радови маркирани Ñа '*' неће бити аутоматÑки преузети." #~ msgid "Downloaded so far" #~ msgstr "За Ñада преузето" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Ðемогуће приÑтупити кључу региÑтра 'HKEY_CURRENT_USER'." #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Ðемогуће отворити кључ региÑтра \"%s\"." #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Ðемогуће читати кључеве региÑтра за Ñпецијалне фаÑцикле" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd није компатибилан Ñа неким штитним зидовима.
\n" #~ " %s
\n" #~ " ÐажалоÑÑ‚ не можемо одмах да решимо ту некомпатибилноÑÑ‚.
\n" #~ " Пошаљите жалбу добављачу штитног зида.
\n" #~ "
\n" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd-у је потребан Ñлободан tcp/ip порт за веб Ñервер.
\n" #~ " Порт %s на %s је покушан, али налог за SABnzbd нема дозволу да га " #~ "кориÑти.
\n" #~ " Ðа OSX и Linux ÑиÑтемима, нормални кориÑници треба да кориÑте портове " #~ "изнад 1023.
\n" #~ "
\n" #~ " Поново покрените SABnzbd Ñа другим портом." #~ msgid "Purge Failed History" #~ msgstr "ОчиÑти хронологију погрешних" #~ msgid "Delete all failed items from History?" #~ msgstr "Обриши Ñве погрешне Ñтавке Ñа хронологије?" #~ msgid "History Size" #~ msgstr "Величина хронологије" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "Промени илегална Ñлова у имену фаÑцикле" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "КориÑти 12-то датни Ñат (AM/PM)" #~ msgid "Delete the all failed items from the history?" #~ msgstr "ОбриÑати Ñве погрешне Ñтавке Ñа хронологије?" #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "Упали ако преузимања ниÑу у ÑопÑтвеним фаÑциклама." #~ msgid "Last" #~ msgstr "ПоÑледње" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Читај Фид ће преузети Ñадржај фида. Ðатерај " #~ "преузимање јер ће одмах преузети одговарајуће NZB." #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "Желим да SABnzbd буде видљив било којег рачунара моје мреже." #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "Покрени мој претраживач Ñа SABnzbd лиÑтом при покретању." #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "ПоÑле покретања SABnzb-а, можете оведе приÑтупити: %s" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "ПÐЖЊÐ: Поништен рад \"%s\" због шифроване RAR датотеке" #~ msgid "Notification classes" #~ msgstr "КлаÑе нотификације" #~ msgid "Send notifications to Notification Center" #~ msgstr "Пошаљи нотификације у Центру нотификације" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "Омогући клаÑе поруке да буду извештене (без, једна или више)" #~ msgid "_yenc module... NOT found!" #~ msgstr "_yenc modul... NIJE pronaÄ‘en!" #~ msgid "Error: No secondary interface defined." #~ msgstr "GreÅ¡ka: Sekundarni interfejs nije definisan" #~ msgid "Unpacking failed, see log" #~ msgstr "NeuspeÅ¡no raspakivanje, videti izveÅ¡taj" #~ msgid "Error importing OpenSSL module. Connecting with NON-SSL" #~ msgstr "GreÅ¡ka u uvozu OpenSSL modula. Povezivanje bez SSL" #~ msgid "Secondary Web Interface" #~ msgstr "Sekundarni WEB interfejs" #~ msgid "Activate an alternative skin." #~ msgstr "Aktivirajte alternativni izgled" #~ msgid "Do not require the API key." #~ msgstr "Ne zahtevaj API kljuÄ" #~ msgid "Enable built-in unzip functionality." #~ msgstr "Omogući ugraÄ‘enu unzip funkcionalnost" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Omogući ugraÄ‘enu unrar funkcionalnost" #~ msgid "Enable Unrar" #~ msgstr "Omogući Unrar" #~ msgid "Enable OZnzb Integration" #~ msgstr "Omogući OZnzb integraciju" #~ msgid "Automatic Feedback" #~ msgstr "Automatske povratne informacije" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Ovaj kljuÄ obezbeÄ‘uje indentitet indekseru. Proverite na " #~ "https://www.oznzb.com/profile." #~ msgid "Site API Key" #~ msgstr "API kljuÄ sajta" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "" #~ "PoÅ¡alji indekseru automatski izraÄunate rezultate provere za preuzimanja." #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "ProÅ¡irena funkcionalnost, ukljuÄujući ocenjivanje i dodatne informacije o " #~ "statusu, dostupne su pri povezivanju na OZnzb indekser." #~ msgid "Delete Failed" #~ msgstr "ObriÅ¡i neuspeÅ¡ne" sabnzbd-develop/po/main/ru.po0000600000175000017500000046331613642116632014302 0ustar jpjpmsgid "" msgstr "" "Project-Id-Version: SABnzbd-0.7.x\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Pavel Maryanov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:03+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" "Generated-By: pygettext.py 1.5\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Ðе удалоÑÑŒ запуÑтить веб-интерфейÑ" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "" "Ðе удаётÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ шаблон веб-интерфейÑа: %s. ВыполнÑетÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° иÑпользовать " "Ñтандартный шаблон" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "ИÑполнÑемый файл par2... ÐЕ найден" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "ИÑполнÑемый файл unrar... ÐЕ найден" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "ИÑполнÑемый файл unzip... ÐЕ найден" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "" "Учтите, что Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ компьютера 0.0.0.0 потребуетÑÑ IPv6-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ " "доÑтупа" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "HTTPS отключён, поÑкольку отÑутÑтвуют файлы CERT и KEY" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "" #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Предупреждение" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "Завершение работы SABnzbd закончено" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Ðе задано Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ðµ наÑтроены. Добавьте Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одно подключение." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "Пароль Ñкрыт под ******. Повторите пароль." #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "ÐедопуÑтимые данные Ñервера" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "Тайм-аут. Попробуйте включить SSL или иÑпользовать другой порт." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¸Ñтекло" #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "ÐедопуÑтимый Ð°Ð´Ñ€ÐµÑ Ñервера." #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ…Ð¾Ð´Ð° на Ñервер был выполнен выход." #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Ð”Ð»Ñ Ñервера требуетÑÑ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Подключение уÑтановлено!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Ошибка проверки подлинноÑти. Проверьте Ð¸Ð¼Ñ Ð¸ пароль." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "Слишком много подключений. ПриоÑтановите загрузку или повторите попытку позже" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Ðе удалоÑÑŒ определить результат Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Получен Ñигнал %s. ВыполнÑетÑÑ Ñохранение и выход..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Попытка загрузить NZB Ñ %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ %s" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Ðе удаётÑÑ Ñоздать временный файл Ð´Ð»Ñ %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Попытка уÑтановить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð´Ð»Ñ Ð½ÐµÑущеÑтвующего Ñервера %s" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Ошибка в tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Ошибка загрузки %s" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "Электронное пиÑьмо уÑпешно отправлено" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "ТеÑтовое уведомление" #: sabnzbd/api.py msgid " Resolving address" 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 "Ðичего" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "по умолчанию" #: sabnzbd/api.py msgid "unknown" msgstr "неизвеÑтно" #: sabnzbd/api.py [Error message] 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 "Ðа диÑке нет меÑта ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¸Ð¾Ñтановка" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Ошибка диÑка при Ñоздании файла %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "" #: sabnzbd/assembler.py msgid "%s missing" msgstr "%s отÑутÑтвует" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "" #: sabnzbd/assembler.py msgid "audio" msgstr "" #: sabnzbd/assembler.py msgid "spam" msgstr "" #: sabnzbd/assembler.py msgid "passworded" msgstr "" #: sabnzbd/assembler.py msgid "downvoted" msgstr "" #: sabnzbd/assembler.py msgid "keywords" msgstr "" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Квота иÑчерпана. Загрузка приоÑтановлена" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым адреÑом Ñлектронной почты" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "ТребуетÑÑ Ð°Ð´Ñ€ÐµÑ Ñервера" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Ðе удаётÑÑ Ñоздать %s папку %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿Ð¸Ñать INI-файл %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Ðе удаётÑÑ Ñоздать файл резервной копии Ð´Ð»Ñ %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "Ðеправильно закодированный пароль %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s не ÑвлÑетÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼ воÑьмеричным значением" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "UNC-путь «%s» здеÑÑŒ не допуÑкаетÑÑ" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "" #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Ошибка: очередь не пуÑтаÑ, папку Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "Ошибка команды SQL (Ñм. журнал)" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "Ðе удалоÑÑŒ закрыть базу данных (Ñм. журнал)" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "ÐедопуÑтимый Ñтап Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° Ð´Ð»Ñ %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Ошибка Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %s" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Ðеверно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑ‚Ð°Ñ‚ÑŒÑ yEnc в %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => отÑутÑтвует на вÑех Ñерверах, отброшен" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "Завершено" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "РаÑпаковка %s файлов или папок в %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [Error message] # sabnzbd/dirscanner.py [Warning message] # sabnzbd/rss.py [Warning message] msgid "Cannot read %s" msgstr "Ðе удаётÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ %s" #: sabnzbd/dirscanner.py [Error message] msgid "Error while adding %s, removing" msgstr "Ðе удалоÑÑŒ добавить %s: удалён" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Ðе удаётÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ наблюдаемую папку %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "ПриоÑтановлено" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Ðе удаётÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Сервер %s будет игнорироватьÑÑ %s мин." #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Возможно, ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ иÑпользуетÑÑ Ð³Ð´Ðµ-то ещё" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Ошибка входа на Ñервер %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Ð”Ð»Ñ Ñервера %s требуетÑÑ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Завершение работы" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº почтовому Ñерверу" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "Ðе удалоÑÑŒ уÑтановить TLS-Ñоединение" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Ошибка входа на почтовый Ñервер" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Ðе удалоÑÑŒ отправить Ñлектронное пиÑьмо" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Ðе удалоÑÑŒ разорвать Ñоединение Ñ Ð¿Ð¾Ñ‡Ñ‚Ð¾Ð²Ñ‹Ð¼ Ñервером" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Получатели не указаны. Электронное пиÑьмо не отправлено" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd: на диÑке нет меÑта\n" "\n" "Привет.\n" "\n" "СиÑтема SABnzbd оÑтановила загрузку, поÑкольку на диÑке почти не оÑталоÑÑŒ " "Ñвободного меÑта.\n" "ОÑвободите меÑто на диÑке и возобновите работу SABnzbd вручную.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Ðе удаётÑÑ Ñоздать каталог %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "Каталог %s: ошибка доÑтупа %s" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Ðе удаётÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ права доÑтупа %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Ðе удалоÑÑŒ Ñоздать (%s)" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Ðе удалоÑÑŒ перемеÑтить %s в %s" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "ОтÑутÑтвует ключ ÑеанÑа" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Ошибка: требуетÑÑ ÐºÐ»ÑŽÑ‡ ÑеанÑа" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Ошибка: неправильный ключ ÑеанÑа" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "ОтÑутÑтвует ключ API. Введите в Ñторонней программе ключ API из раздела " "«ÐаÑтройка -> Общие»:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "Ðеправильный ключ API. ИÑпользуйте в Ñторонней программе ключ API из раздела " "«ÐаÑтройка -> Общие»:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "ОтÑутÑтвуют учётные данные. Введите в Ñторонней программе Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ " "пароль из раздела «ÐаÑтройка -> Общие»:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
СиÑтема SABnzbd уÑпешно оÑтановлена.
Подождите 5 Ñекунд и " "щёлкните ÑÑылку ниже.

Обновить
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "" "Внимание! Ð˜Ð¼Ñ LOCALHOST ÑвлÑетÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ñ‹Ð¼. ИÑпользуйте чиÑловой IP-" "адреÑ." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "ÐÐ´Ñ€ÐµÑ Ñервера «%s:%s» ÑвлÑетÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимым." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "Лента" #: sabnzbd/interface.py msgid "Daily" msgstr "ежедневно" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "понедельник" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "вторник" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Ñреда" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "четверг" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "пÑтница" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Ñуббота" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "воÑкреÑенье" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "выкл." #: sabnzbd/interface.py msgid "Undefined server!" msgstr "" #: 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 msgid "Back" msgstr "Ðазад" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "ОШИБКÐ" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "Ðеправильное значение Ð´Ð»Ñ %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "д" #: sabnzbd/misc.py msgid "h" msgstr "ч" #: sabnzbd/misc.py msgid "m" msgstr "м" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Ðе удалоÑÑŒ Ñоздать ключ SSL и Ñертификат" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "ЗапуÑк ÑценариÑ" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "ПоÑÑ‚-обработка была прервана (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Сценарий" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "Объединение" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "ÐÐµÐ¿Ð¾Ð»Ð½Ð°Ñ Ð¿Ð¾ÑледовательноÑть файлов, которые можно объединить" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "Ðе удалоÑÑŒ объединить файлы %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Ошибка Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²: %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Ошибка «%s» Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ file_join Ð´Ð»Ñ %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] Объединено файлов: %s" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Ðе удалоÑÑŒ раÑпаковать: %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Ошибка раÑпаковки RAR-файлов: %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Ошибка «%s» Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ rar_unpack Ð´Ð»Ñ %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Ðе удалоÑÑŒ удалить %s!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Попытка раÑпаковки RAR-архива Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼ «%s»" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Ошибка раÑпаковки: архив защищён паролем" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "РаÑпаковка" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "РаÑпаковать" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Ошибка раÑпаковки: не удаётÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "ОШИБКÐ: не удаётÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ «%s»" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Ðе удалоÑÑŒ раÑпаковать: ошибка CRC" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "ОШИБКÐ: Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ CRC-Ñумма Ð´Ð»Ñ %s" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "Ðе удалоÑÑŒ раÑпаковать: ошибка запиÑи или на диÑке нет меÑта?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "ОШИБКÐ: не удалоÑÑŒ запиÑать (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s файлов в %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Ошибка «%s» Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ unzip() Ð´Ð»Ñ %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ°" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "ИÑправить" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] БыÑÑ‚Ñ€Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° прошла уÑпешно" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "запуÑк иÑправлениÑ" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Ðе удалоÑÑŒ иÑправить: %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Ошибка %s Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ par2_repair Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Ошибка «%s» Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ par2_repair Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] Программе PAR2 переданы неправильные параметры. Проверьте параметры в " "разделе «ÐаÑтройка -> Переключатели»" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Проверено за %s. Ошибок нет" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Проверено за %s. ТребуетÑÑ Ð¸Ñправление" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "загрузка %s блоков..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Загрузка" #: sabnzbd/newsunpack.py msgid "Repair failed, not enough repair blocks (%s short)" msgstr "" "Ошибка иÑправлениÑ: недоÑтаточно блоков воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (не хватает %s)" #: sabnzbd/newsunpack.py msgid "Repairing" msgstr "ИÑправление" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] ИÑправлено за %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Проверка" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Проверка" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Вики-Ñайт" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "ЗапуÑк/оÑтановка" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "Добавлен NZB" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Запущена поÑÑ‚-обработка" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Задание завершено" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Другие ÑообщениÑ" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Ðе удалоÑÑŒ импортировать %s файлов из %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Ðайден неÑовмеÑтимый файл очереди. Продолжение работы невозможно" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Ошибка загрузки %s: обнаружен повреждённый файл" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB-файл добавлен в очередь" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> неизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Ðеполный NZB-файл %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "ÐедопуÑтимый NZB-файл %s: пропущен (причина — %s, Ñтрока — %s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "ПуÑтой NZB-файл %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "Пропущен повторÑющийÑÑ NZB-файл «%s»" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "ПриоÑтановлен повторÑющийÑÑ NZB-файл «%s»" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "ПОВТОР" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "ЗÐШИФРОВÐÐ" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "СЛИШКОМ БОЛЬШОЙ" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "ÐЕПОЛÐЫЙ" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "ОЖИДÐÐИЕ %s Ñ" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Загружено за %s Ñо Ñредней ÑкороÑтью %sБ/Ñ" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "ВозраÑÑ‚" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s Ñтатей Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "%s Ñтатей отÑутÑтвует" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s Ñтатей Ñодержат неÑовпадающие повторы" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Ошибка импорта %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "предупреждений" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "БездейÑтвие" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "КонфигурациÑ" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Очередь" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "ОчиÑтить очередь" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "ИÑториÑ" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "ОчиÑтить иÑторию" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Ограничение ÑкороÑти" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "ПриоÑтановить" #: sabnzbd/osxmenu.py msgid "min." msgstr "мин." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Возобновить" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Сканировать наблюдаемую папку" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "ÐŸÐ¾Ð»Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "ÐÐµÐ¿Ð¾Ð»Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "УÑтранение неполадок" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "ПерезапуÑтить" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "ПерезапуÑтить без входа" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "Выйти" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Первые 10 Ñлементов очереди" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "ПуÑто" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "ПоÑледние 10 Ñлементов иÑтории" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "ЗапуÑтить маÑтер" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "ОÑтановка..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Проблема Ñ" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " Службе SABnzbd требуетÑÑ Ñвободный порт TCP/IP Ð´Ð»Ñ Ð²Ñтроенного веб-" "Ñервера.
\n" " Был проверен порт %s на %s, но он оказалÑÑ Ð½ÐµÐ´Ð¾Ñтупен.
\n" " Возможно, Ñтот порт иÑпользуетÑÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ программой, или Ñлужба SABnzbd " "уже запущена.
\n" "
\n" " ПерезапуÑтите Ñлужбу SABnzbd, указав другой номер порта." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "" "ЕÑли Ñнова поÑвлÑетÑÑ Ñто Ñообщение об ошибке, попробуйте указать другой " "номер порта." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " Службе SABnzbd требуетÑÑ Ð´ÐµÐ¹Ñтвительный Ð°Ð´Ñ€ÐµÑ Ñервера Ð´Ð»Ñ Ð²Ñтроенного " "веб-Ñервера.
\n" " Указан недейÑтвительный адреÑ.
\n" " ДопуÑтимые значениÑ: localhost и 0.0.0.0
\n" "
\n" " ПерезапуÑтите Ñлужбу SABnzbd, указав дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñервера." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " Обнаружены Ñохранённые данные из другой верÑии SABnzbd,
\n" " но данные другой программы Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ иÑпользовать.

\n" " Возможно, Ñтоит Ñначала завершить очередь в другой программе.

\n" " ПоÑле Ñтого запуÑтите данную программу Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ «--clean».
\n" " При Ñтом Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´ÑŒ и журнал будут удалены!
\n" " Служба SABnzbd читает файл «%s»." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " Ðе удаётÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файлы веб-интерфейÑа SABnbzd в %s.
\n" " ПереуÑтановите программу.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "Обнаружена критичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " Обнаружено, что отÑутÑтвует файл sqlite3.dll.

\n" " Этот файл мог быть удалён плохо наÑтроенной антивируÑной " "программой.
\n" " Попробуйте проверить параметры Ñвоей антивируÑной программы, " "переуÑтановите SABnzbd и Ñообщите о проблеме поÑтавщику Ñтого антивируÑного " "ПО.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Ðажмите клавиши STARTKEY+R и введите команду (пример):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Откройте окно командной Ñроки и введите команду (пример):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Программа не запуÑтилаÑÑŒ!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "КритичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить браузер. Возможно, он не было найден" #: sabnzbd/panic.py msgid "Access denied" msgstr "ДоÑтуп запрещён" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Ошибка %s: укажите дейÑтвительное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" msgstr "" #: sabnzbd/postproc.py msgid "Download might fail, only %s of required %s available" msgstr "" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "" #: sabnzbd/postproc.py msgid "Moving" msgstr "Перемещение" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "%s отправлено в очередь" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Ошибка Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Â«%s» и «%s»" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Ðе удалоÑÑŒ перемеÑтить файлы" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "ЗапуÑк пользовательÑкого ÑÑ†ÐµÐ½Ð°Ñ€Ð¸Ñ %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "Запущено %s" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Подробнее" #: sabnzbd/postproc.py [Error message] msgid "Post Processing Failed for %s (%s)" msgstr "Ошибка поÑÑ‚-обработки Ð´Ð»Ñ %s (%s)" #: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py msgid "see logfile" msgstr "Ñм. журнал" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Ðе удалоÑÑŒ загрузить" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Ðе удалоÑÑŒ очиÑтить %s." #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Загрузка завершена" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Ðе удаётÑÑ Ñоздать конечную папку %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "ПоÑÑ‚-обработка" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s] Ðет PAR2-файлов" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Проверка SFV-Ñуммы" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Ðекоторые файлы не прошли проверку «%s»" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Проверка SFV-Ñумм прошла уÑпешно" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Ðе удалоÑÑŒ удалить %s" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Ðе удалоÑÑŒ перевеÑти ÑиÑтему в ÑоÑтоÑние гибернации" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Ðе удалоÑÑŒ перевеÑти ÑиÑтему в ÑоÑтоÑние Ñна" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Ðе удалоÑÑŒ завершить работу ÑиÑтемы" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "ÐÐ´Ñ€ÐµÑ Ñервера" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "Ключ API" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Ðеправильное опиÑание RSS-ленты «%s»" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Ðе удалоÑÑŒ получить RSS-ленту из %s: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Ðеправильные учётные данные Ð´Ð»Ñ Ð»ÐµÐ½Ñ‚Ñ‹ %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "RSS-лента %s была пуÑтой" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "ÐеÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ð»ÐµÐ½Ñ‚Ð°" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Обнаружена пуÑÑ‚Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ RSS (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Показать интерфейÑ" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "ПриоÑтановить на" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "ПриоÑтановить на 5 минут" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "ПриоÑтановить на 15 минут" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "ПриоÑтановить на 30 минут" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "ПриоÑтановить на 1 чаÑ" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "ПриоÑтановить на 3 чаÑа" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "ПриоÑтановить на 6 чаÑов" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Выключить" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "оÑталоÑÑŒ" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Добавить NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "ÐедопуÑтимое раÑпиÑание %s в %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "ÐеизвеÑтное дейÑтвие: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "РаÑпиÑание Ð´Ð»Ñ Ð½ÐµÑущеÑтвующего Ñервера %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Загрузить" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Объединить файлы" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "ИÑточник" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Серверы" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Сбой" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Ошибка" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "ожидание" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "ИÑправление..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Извлечение..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Перемещение..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "ЗапуÑк ÑценариÑ..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Загрузка дополнительных блоков..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ°..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Проверка..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "загружаетÑÑ" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Задача" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "отключить Ñервер" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "включить Ñервер" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Ограничить ÑкороÑть" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "ПриоÑтановить вÑе" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "ПриоÑтановить поÑÑ‚-обработку" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Возобновить поÑÑ‚-обработку" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Читать RSS-ленты" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Выкл." #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "обычный" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "выÑокий" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "низкий" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "МБ" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "ГБ" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "чаÑ" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "чаÑов" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "мин" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "минут" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "Ñ" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "Ñекунд" #: sabnzbd/skintext.py msgid "day" msgstr "день" #: sabnzbd/skintext.py msgid "days" msgstr "дней" #: sabnzbd/skintext.py msgid "week" msgstr "неделÑ" #: sabnzbd/skintext.py msgid "Month" msgstr "МеÑÑц" #: sabnzbd/skintext.py msgid "Year" msgstr "Год" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "День меÑÑца" #: sabnzbd/skintext.py msgid "This week" msgstr "за Ñту неделю" #: sabnzbd/skintext.py msgid "This month" msgstr "за Ñтот меÑÑц" #: sabnzbd/skintext.py msgid "Today" msgstr "за ÑегоднÑ" #: sabnzbd/skintext.py msgid "Total" msgstr "вÑего" #: sabnzbd/skintext.py msgid "on" msgstr "на" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "" #: sabnzbd/skintext.py msgid "Python Version" msgstr "" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "ÐдреÑ" #: sabnzbd/skintext.py msgid "Comment" msgstr "" #: sabnzbd/skintext.py msgid "Send" msgstr "" #: sabnzbd/skintext.py msgid "Cancel" msgstr "" #: sabnzbd/skintext.py msgid "Other" msgstr "" #: sabnzbd/skintext.py msgid "Report" msgstr "" #: sabnzbd/skintext.py msgid "Video" msgstr "" #: sabnzbd/skintext.py msgid "Audio" msgstr "" #: sabnzbd/skintext.py msgid "Not used" msgstr "" #: sabnzbd/skintext.py msgid "or less" msgstr "" #: sabnzbd/skintext.py msgid "Log in" msgstr "" #: sabnzbd/skintext.py msgid "Log out" msgstr "" #: sabnzbd/skintext.py msgid "Remember me" msgstr "" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "Клиент автоматичеÑкой загрузки из USENET" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Сохранить" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Сохранение..." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Уверены?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Удалить вÑе загруженные файлы?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "ГлавнаÑ" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "ÐаÑтройка" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "СоÑтоÑние" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Справка" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Форум" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Общие" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Папки" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Переключатели" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "РаÑпиÑание" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "УведомлениÑ" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "Эл. почта" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Категории" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Сортировка" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "ОÑобаÑ" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Каталог загрузки" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "ПРИОСТÐÐОВЛЕÐО" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "Статей в кÑше: %s (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Загрузка ÑиÑтемы" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %s на" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "ОÑтановить SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Добавить" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Добавить файл" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "КатегориÑ" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Обработка" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Приоритет" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+иÑправить" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+раÑпаковать" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+удалить" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "U" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "D" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "принудительный" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "ОÑтановить" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "Введите URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "По окончании очереди" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "выключить ПК" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "перевеÑти ПК в режим ожиданиÑ" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "перевеÑти ПК в ÑпÑщий режим" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Закрыть SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Ограничение ÑкороÑти" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "ПорÑдок" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Ðазвание" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "оÑÑ‚." #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "ВОЗРÐСТ" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Удалить" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Повторить" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "ДейÑтвиÑ" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Сценарии" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Удалить из очереди вÑе Ñлементы?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Удалить NZB" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Удалить NZB и Ñтереть файлы" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Удалить NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Удалить NZB и Ñтереть файлы" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "из" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "ОтÑутÑтвуют Ñтатьи" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "ОÑталоÑÑŒ квоты" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "вручную" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "СброÑить квоту" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Удалить вÑе завершённые Ñлементы из иÑтории?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Скрыть подробноÑти" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Показать подробноÑти" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Показать неудачные" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Показать вÑе" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Размер" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Удалить неудачные NZB" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Удалить неудачные NZB и Ñтереть файлы" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Удалить завершённые NZB" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "Дополнительный NZB (необÑзательно)" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Путь" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "" #: sabnzbd/skintext.py msgid "Other problem" msgstr "" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Принудительно отключить" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Отправка теÑтового пиÑьма на указанный почтовый Ñщик" #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Показать журнал" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Проверить Ñлектронную почту" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Журнал" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Ошибки и предупреждениÑ" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ информациÑ" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ отладка" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "СоединениÑ" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "ПоÑледние предупреждениÑ" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "ОчиÑтить" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Разблокировать" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Идентификатор Ñтатьи" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Ðабор файлов" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "ВремÑ" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Тип" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Включен" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "" #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "Файл конфигурации" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "ИÑпользуемый кÑш" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "Эта кнопка перезапуÑтит SABnzbd.
ИÑпользуйте её, когда программа " "работает неÑтабильно.
Загрузка будет приоÑтановлена до перезапуÑка и " "Ñнова возобновлена поÑле запуÑка." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "Ð’ папке загрузки еÑть оÑиротевшие заданиÑ.
Их можно удалить (вмеÑте Ñ " "файлами) или поÑтавить обратно в очередь." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "Эта кнопка перезапуÑтит SABnzbd и полноÑтью
переÑтроит Ñодержимое " "очереди, не Ñ‚Ñ€Ð¾Ð³Ð°Ñ ÑƒÐ¶Ðµ загруженные файлы.
При Ñтом порÑдок очереди " "будет изменён." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ были Ñохранены и будут потерÑны." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "РаÑпаковывать ZIP" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "ВерÑиÑ" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Резервный" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "ОпиÑание Ñм. на вики-Ñтранице." #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "ПерезапуÑк SABnzbd..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ необходимо перезапуÑтить SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "Веб-Ñервер SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "Сервер SABnzbd" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "ÐдреÑ, по которому будет доÑтупна Ñлужба SABnzbd." #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "Порт SABnzbd" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Порт, по которому будет доÑтупна Ñлужба SABnzbd." #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Веб-интерфейÑ" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Выберите тему." #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ SABnzbd" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "ÐеобÑзательное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°." #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "Пароль SABnzbd" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "Включить HTTPS" #: sabnzbd/skintext.py msgid "not installed" msgstr "не уÑтановлено" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "ДоÑтуп к интерфейÑу по протоколу HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "Порт HTTPS" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "ЕÑли не указать, будет доÑтупен только Ñтандартный порт Ñ HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "Сертификат HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Ðазвание файла или путь к Ñертификату HTTPS." #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "Ключ HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Ðазвание файла или путь к ключу HTTPS." #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "" #: sabnzbd/skintext.py msgid "Tuning" msgstr "Ð¢Ð¾Ð½ÐºÐ°Ñ Ð½Ð°Ñтройка" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "Интервал опроÑа RSS-лент" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "Интервал проверки (в минутах, не менее 15). ЕÑли иÑпользуетÑÑ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸Ðº, " "Ñтот параметр не отключён." #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Ограничить кÑш Ñтатей" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "КÑширование Ñтатей в памÑти Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва обращений к диÑку.
Ð’ байтах, поÑле чиÑла можно добавить K, M или G. Пример: «64M» или " "«128M»" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "СпиÑок очиÑтки" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Сохранить изменениÑ" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "" #: sabnzbd/skintext.py msgid "Reset" msgstr "СброÑить" #: sabnzbd/skintext.py msgid "Language" msgstr "Язык" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Выберите Ñзык веб-интерфейÑа." #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "" "По Ñтому ключу Ñторонние программы Ñмогут получить полный доÑтуп к SABnzbd." #: sabnzbd/skintext.py msgid "NZB Key" msgstr "Ключ NZB" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "" "По Ñтому ключу Ñторонние программы Ñмогут загружать файлы в доÑтуп к SABnzbd." #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Создать новый ключ" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "QR-код ключа API" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" #: sabnzbd/skintext.py msgid "External internet access" msgstr "" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "" #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "" #: sabnzbd/skintext.py msgid "Full API" msgstr "" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "ПРИМЕЧÐÐИЕ. Папки будут Ñозданы автоматичеÑки при Ñохранении. Можно " "иÑпользовать абÑолютные пути Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð·Ð° пределами папок по умолчанию." #: sabnzbd/skintext.py msgid "User Folders" msgstr "ПользовательÑкие папки" #: sabnzbd/skintext.py msgid "Browse" msgstr "" #: sabnzbd/skintext.py msgid "In" msgstr "Ð’" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Папка временной загрузки" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "МеÑто Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ñ‹Ñ… загрузок.
Изменить можно только " "тогда, когда очередь пуÑта." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Минимальное Ñвободное меÑто в папке временной загрузки" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Загрузка оÑтанавливаетÑÑ Ð¿Ñ€Ð¸ уменьшении Ñвободного меÑта до Ñтого " "значениÑ.
Ð’ байтах, поÑле чиÑла можно добавить K, M, G или T. " "Пример: «800M» или «8G»" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Папка завершённых загрузок" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "МеÑто Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ñ‹Ñ…, полноÑтью обработанных загрузок.
Можно " "переопределить в пользовательÑких категориÑÑ…." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Права доÑтупа Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ñ‹Ñ… загрузок" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Шаблон прав доÑтупа Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ‹Ñ… файлов и/или папок.
Ð’ " "воÑьмеричном формате. Пример: «755» или «777»" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "ÐÐ°Ð±Ð»ÑŽÐ´Ð°ÐµÐ¼Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Папка Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка NZB-файлов.
NZB-файлы также ищутÑÑ Ð² архивах ZIP, " "RAR и TAR.GZ." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "ЧаÑтота ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°Ð±Ð»ÑŽÐ´Ð°ÐµÐ¼Ð¾Ð¹ папки" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "ЧиÑло Ñекунд между Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñками NZB-файлов." #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Папка шаблонов Ñлектронных пиÑем" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "Папка, ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‰Ð°Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие шаблоны Ñлектронной почты." #: sabnzbd/skintext.py msgid "Password file" msgstr "Файл паролей" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Файл, Ñодержащий вÑе пароли, которые будут иÑпробованы Ð´Ð»Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… RAR-" "файлов." #: sabnzbd/skintext.py msgid "System Folders" msgstr "СиÑтемные папки" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "ÐдминиÑÑ‚Ñ€Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "МеÑто Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸ базы данных очереди и журнала.
Изменить можно " "только тогда, когда очередь пуÑта." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Данные не будут перемещены. ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк SABnzbd!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Папка журнала" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "" "МеÑто Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² журнала SABnzbd.
ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк " "SABnzbd!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "Папка Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¹ NZB" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "МеÑто, где будут ÑохранÑтьÑÑ NZB-файлы" #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° по умолчанию" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "" #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "" #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Загружать Ñтатьи только из начала очереди" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Включите, что уменьшить иÑпользование памÑти. Отключите, чтобы медленные " "Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð½Ðµ блокировали очередь." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Обрабатывать только проверенные заданиÑ" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "Обрабатывать только заданиÑ, уÑпешно прошедшие вÑе проверки PAR2." #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Обнаруживать повторÑющиеÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "" #: sabnzbd/skintext.py 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 "Отменить" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "ИÑпользовать проверку по SFV" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "ВыполнÑть дополнительную проверку по SFV-файлам." #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Переименовывать папки" #: sabnzbd/skintext.py 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" msgstr "ПользовательÑкий Ñценарий до Ð¿Ð¾Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð² очередь" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "ИÑпользуетÑÑ Ð´Ð¾ того, как NZB помещаетÑÑ Ð² очередь." #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Дополнительные параметры PAR2" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Параметры Nice" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "Параметры IONice" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "ОтключатьÑÑ, еÑли очередь пуÑта" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "" "ОтключатьÑÑ Ð¾Ñ‚ Ñерверов Usenet, еÑли очередь пуÑта или приоÑтановлена." #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Сортировать по возраÑту" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "ÐвтоматичеÑки Ñортировать Ñлементы по (Ñреднему) возраÑту" #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "ПроверÑть наличие обновлений" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Еженедельно проверÑть доÑтупноÑть новых верÑий SABnzbd." #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "ЗаменÑть пробелы в названиÑÑ… папок" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "ЗаменÑть пробелы на Ñимволы Ð¿Ð¾Ð´Ñ‡Ñ‘Ñ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð² названиÑÑ… папок." #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "ЗаменÑть точки в названиÑÑ… папок" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "ЗаменÑть точки на пробелы в названиÑÑ… папок." #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "" #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Открывать браузер при запуÑке" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Открывать веб-браузер по умолчанию при запуÑке SABnzbd." #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "ПриоÑтановить загрузку во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾ÑÑ‚-обработки" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "ПриоÑтановить загрузку Ñ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ð¼ поÑÑ‚-обработки и возобновить по её " "окончании." #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Игнорировать образцы" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "Отфильтровывать файлы образцов (например, образцы видео)." #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Удалить поÑле загрузки" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" #: sabnzbd/skintext.py msgid "Server" msgstr "Сервер" #: sabnzbd/skintext.py msgid "Post processing" msgstr "ПоÑÑ‚-обработка" #: sabnzbd/skintext.py msgid "Naming" msgstr "Именование" #: sabnzbd/skintext.py msgid "Quota" msgstr "Квота" #: sabnzbd/skintext.py msgid "Indexing" msgstr "" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Объем, который можно загрузить в меÑÑц (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "День ÑброÑа трафика" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "День меÑÑца или недели (1 — понедельник), когда провайдер ÑбраÑывает квоту. " "(дополнительно можно указать чч:мм)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "ÐвтоматичеÑки возобновлÑть" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "ВозобновлÑть загрузку поÑле ÑброÑа квоты?" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Период квоты" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "СбраÑываетÑÑ Ð»Ð¸ квота каждый день, неделю или меÑÑц?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "ПроверÑть перед загрузкой" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "ПопытатьÑÑ Ñпрогнозировать уÑпешное завершение до фактичеÑкой загрузки " "(медленнее!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "ЧиÑло попыток" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "МакÑимальное чиÑло повторных попыток Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñервера" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "" #: sabnzbd/skintext.py msgid "Abort If" msgstr "" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "" #: sabnzbd/skintext.py msgid "Video rating" msgstr "" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "" #: sabnzbd/skintext.py msgid "Spam" msgstr "" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Добавить Ñервер" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Порт" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Пароль" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Срок хранениÑ" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "отключено" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Дополнительный" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Включить" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Удалить Ñервер" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Проверить Ñервер" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "СброÑить Ñчётчики" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Данные проверки Ñервера..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Трафик" #: sabnzbd/skintext.py msgid "Send Group" msgstr "ОтправлÑть группу" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "ОтправлÑть команду группы перед запроÑом Ñтатей." #: sabnzbd/skintext.py msgid "Personal notes" msgstr "" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Добавить задание" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "ЧаÑтота" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "ДейÑтвие" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Ðргументы" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Текущие заданиÑ" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Чтобы включить ленту и автоматичеÑки проверÑть обновление её Ñодержимого, " "уÑтановите флажок напротив её названиÑ.
ПоÑле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð»ÐµÐ½Ñ‚Ñ‹ " "загружатьÑÑ Ð±ÑƒÐ´ÑƒÑ‚ только новые её Ñлементы, а не те, что были опубликованы " "раньше (еÑли только на нажать кнопку «Загрузить принудительно»)." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Прочитать ленту" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Загрузить принудительно" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Фильтр" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "ПринÑть" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Отклонить" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "ТребуетÑÑ" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "ТребуетÑÑ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "СоответÑтвующие" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Ðет ÑоответÑтвий" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Загружено" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Прочитать вÑе ленты" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Уведомление по Ñлектронной почте поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Ðикогда" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Ð’Ñегда" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Только при ошибках" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ нехватке меÑта на диÑке" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "" "ОтправлÑть Ñлектронное пиÑьмо, когда на диÑке нет меÑта и загрузка SABnbzd " "приоÑтановлена." #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "ОтправлÑть RSS-уведомлениÑ" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "" "ОтправлÑть Ñлектронное пиÑьмо, когда в очередь добавлÑетÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ðµ из RSS-" "ленты." #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "Сервер SMTP" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Укажите Ñервер Ñвоего провайдера Ð´Ð»Ñ Ð¸ÑходÑщей почты." #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Получатель" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹." #: sabnzbd/skintext.py msgid "Email Sender" msgstr "Отправитель" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "От кого будут отправлÑтьÑÑ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "ÐЕОБЯЗÐТЕЛЬÐОЕ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "" "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи (Ð´Ð»Ñ Ñлектронной почты Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ " "подлинноÑти)." #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "ÐЕОБЯЗÐТЕЛЬÐЫЙ пароль" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "" "Пароль учётной запиÑи (Ð´Ð»Ñ Ñлектронной почты Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ подлинноÑти)." #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Уведомление отправлено" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "ИÑпользовать Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "ИÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ Ñервера Growl (адреÑ:порт)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Пароль Ñервера" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "ÐеобÑзательный пароль Ð´Ð»Ñ Ñервера Growl" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "ИÑпользовать NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "" #: sabnzbd/skintext.py [Pushover settings] 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 "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "ЕÑли завершить путь звёздочкой (*), папки заданий не будут ÑоздаватьÑÑ." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "ОтноÑительный путь Ð´Ð»Ñ Ð¿Ð°Ð¿Ð¾Ðº" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Папка или путь" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Сортировка Ñериалов" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "ИÑпользовать Ñортировку по ТВ-шоу" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Ключи шаблона" #: sabnzbd/skintext.py msgid "Clear" msgstr "ОчиÑтить" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "Готовые шаблоны" #: sabnzbd/skintext.py msgid "Example" msgstr "Пример" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "ИÑпользовать Ñортировку по фильмам" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Хранить неÑвÑзанные загрузки в дополнительных папках" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "ЗадейÑтвованные категории" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Значение" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Шаблон" #: sabnzbd/skintext.py msgid "Result" msgstr "Результат" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "1x05 Сезон Папка" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "S01E05 Сезон Папка" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "1x05 Эпизод Папка" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "S01E05 Эпизод Папка" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "" #: sabnzbd/skintext.py msgid "Title" msgstr "Ðазвание" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Ðазвание фильма" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Ðазвание.фильма" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Ðазвание_фильма" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Ðазвание Ñериала" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Ðазвание.Ñериала" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Ðазвание_Ñериала" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Ðомер Ñезона" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Ðомер Ñпизода" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Ðазвание Ñпизода" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Ðазвание.Ñпизода" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Ðазвание_Ñпизода" #: sabnzbd/skintext.py msgid "File Extension" msgstr "РаÑширение файла" #: sabnzbd/skintext.py msgid "Extension" msgstr "РаÑширение" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Ðомер чаÑти" #: sabnzbd/skintext.py msgid "Decade" msgstr "ДеÑÑтки" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "ИÑходное название файла" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Ðижний региÑтр" #: sabnzbd/skintext.py msgid "TEXT" msgstr "ТЕКСТ" #: sabnzbd/skintext.py msgid "text" msgstr "текÑÑ‚" #: sabnzbd/skintext.py msgid "file" msgstr "файл" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Строка Ñортировки" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Обозначение неÑкольких чаÑтей" #: sabnzbd/skintext.py msgid "In folders" msgstr "Ð’ папках" #: sabnzbd/skintext.py msgid "No folders" msgstr "Без папок" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Сортировка даты" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "ИÑпользовать Ñортировку по дате" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Папка Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ Ñериала" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "Папки Ñ Ð³Ð¾Ð´Ð¾Ð¼ и меÑÑцем" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Папки по днÑм" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "case-adjusted" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Обработанный результат" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Редко иÑпользуемые параметры. Их опиÑание можно проÑмотреть на вики-" "Ñтранице, доÑтупной по кнопке «Справка».
Ðе изменÑйте Ñти параметры, не " "изучив Ñначала вики-Ñтраницу, поÑкольку их изменение может иметь Ñерьезные " "поÑледÑтвиÑ.
Ð’ Ñкобках показаны Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию." #: sabnzbd/skintext.py msgid "Values" msgstr "ЗначениÑ" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Изменить данные NZB" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "Удалить" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Ð’ начало" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Вверх" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Вниз" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Ð’ конец" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Ð’Ñе" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Обратить" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Ðазвание файла" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Тема" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Выбрать" #: sabnzbd/skintext.py msgid "left" msgstr "оÑталоÑÑŒ" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Ñвободно на диÑке" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Пакетные операции" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "" #: sabnzbd/skintext.py msgid "Check all" msgstr "" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "" #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "ЧаÑтота обновлениÑ" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "" #: sabnzbd/skintext.py msgid "History item limit" msgstr "" #: sabnzbd/skintext.py msgid "Date format" msgstr "" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "" #: sabnzbd/skintext.py msgid "page" msgstr "Ñтр." #: sabnzbd/skintext.py msgid "Loading" msgstr "" #: sabnzbd/skintext.py msgid "articles" msgstr "" #: sabnzbd/skintext.py msgid "Rename" msgstr "Переименовать" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "ИÑправление очереди" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "" #: sabnzbd/skintext.py msgid "Delete All" msgstr "Удалить вÑÑ‘" #: sabnzbd/skintext.py msgid "Retry all" msgstr "" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° (необÑзательно)" #: sabnzbd/skintext.py msgid "Submit" msgstr "" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Открыть URL Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "ПроÑмотреть журнал ÑценариÑ" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "ДоÑтупно обновление!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" #: sabnzbd/skintext.py msgid "Custom" msgstr "Другой" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "" #: sabnzbd/skintext.py msgid "Speed" msgstr "СкороÑть" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Подтвердите удаление очереди" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Подтвердите удаление журнала" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "" #: sabnzbd/skintext.py msgid "Pause for..." msgstr "ПриоÑтановить на..." #: 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 Oldest→Newest" msgstr "Сортировать по возраÑту от Ñтарых к новым" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Сортировать по возраÑту от новых к Ñтарым" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Сортировать по названию от Рдо Я" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Сортировать по названию от Я до Ð" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Сортировать по размеру от мелких к крупным" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Сортировать по размеру от крупных к мелким" #: sabnzbd/skintext.py msgid "Uploading" msgstr "" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "" #: sabnzbd/skintext.py msgid "Removing job" msgstr "" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "" #: sabnzbd/skintext.py msgid "Prev" msgstr "ПредыдущаÑ" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "СледующаÑ" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "Удалить иÑторию?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Plush необходимо включить JavaScript" #: sabnzbd/skintext.py msgid "Options" msgstr "Параметры" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Ðа Ñколько минут приоÑтановить?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Верхнее меню" #: sabnzbd/skintext.py msgid "On Finish" msgstr "По завершении:" #: sabnzbd/skintext.py msgid "Sort" msgstr "Сортировка" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Сортировать по возраÑту от Ñтарых к новым" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Сортировать по возраÑту от новых к Ñтарым" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Сортировать по названию от Рдо Я" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Сортировать по названию от Я до Ð" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Сортировать по размеру от мелких к крупным" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Сортировать по размеру от крупных к мелким" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "ОчиÑтить очередь?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "" #: sabnzbd/skintext.py msgid "Purge" msgstr "Удалить" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "МакÑ. ÑкороÑть" #: sabnzbd/skintext.py msgid "Range" msgstr "Диапазон" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Применить к выделенным" #: sabnzbd/skintext.py msgid "Everything" msgstr "вÑе" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "ЧаÑтота обновлениÑ" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Ширина контейнера" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "" "Это позволит предотвратить обновление Ñодержимого при наведении ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ " "мыши на очередь." #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Блокировать обновление при наведении мыши" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Отправить" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "" #: sabnzbd/skintext.py msgid "Progress" msgstr "Ход выполнениÑ" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "Ðе хватает меÑта на диÑке Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Ñвободно (временно)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "БЕЗДЕЙСТВИЕ" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Загрузки" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "МаÑтер быÑтрого запуÑка SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "ВерÑÐ¸Ñ SABnzbd" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Ðазад" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Данные Ñервера" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Введите данные Ñвоего оÑновного поÑтавщика уÑлуг Usenet." #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "КоличеÑтво подключений, разрешённое провайдером" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "Ðапример, 8 или 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Включайте, только еÑли вашим провайдером разрешены SSL-ÑоединениÑ." #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Ðажмите, чтобы проверить введённые данные." #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Ðапример," #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "ÐаÑтройка завершена." #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "Служба SABnzbd теперь будет выполнÑтьÑÑ Ð² фоновом режиме." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "" "ЕÑли закрыть окна или вкладки браузера, Ñлужба SABnzbd ÐЕ будет оÑтановлена." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "РекомендуетÑÑ Ñ‰Ñ‘Ð»ÐºÐ½ÑƒÑ‚ÑŒ Ñтраницу правой кнопкой мыши и добавить Ñтот Ð°Ð´Ñ€ÐµÑ Ð² " "закладки, а затем иÑпользовать Ñту закладку Ð´Ð»Ñ Ð´Ð¾Ñтупа к Ñлужбе SABnzbd, " "работающей в фоновом режиме." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "Дополнительные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупны на нашем" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "Перейти к SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd предоÑтавлÑетÑÑ Ð‘Ð•Ð— КÐКОЙ-ЛИБО ГÐРÐÐТИИ.\n" "Это Ñвободное программное обеÑпечение, и его можно раÑпроÑтранÑть при " "Ñоблюдении определённых уÑловий.\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 требуетÑÑ Ð´Ð¾Ñтуп к Ñтой Ñети через " "ÑоответÑтвующего поÑтавщика уÑлуг. Ваш поÑтавщик уÑлуг Интернета может " "предоÑтавить вам такой доÑтуп, однако рекомендуетÑÑ Ð¸Ñпользовать usenet-" "провайдеров клаÑÑа Premium." #: sabnzbd/skintext.py msgid "Don't have a usenet provider? We recommend trying %s." msgstr "У Ð²Ð°Ñ ÐµÑ‰Ñ‘ нет поÑтавщика уÑлуг Usenet? Рекомендуем попробовать %s." #: sabnzbd/sorting.py [Error message] msgid "Error getting TV info (%s)" msgstr "Ðе удалоÑÑŒ получить ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ ТВ (%s)" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename: %s to %s" msgstr "Ðе удалоÑÑŒ переименовать: %s в %s" #: sabnzbd/sorting.py [Error message] msgid "Failed to rename similar file: %s to %s" msgstr "Ðе удалоÑÑŒ переименовать похожий файл: %s в %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "ПуÑтой NZB-файл" #: sabnzbd/urlgrabber.py msgid "URL Fetching failed; %s" msgstr "Ðе удалоÑÑŒ загрузить URL: %s" #~ msgid "_yenc module... NOT found!" #~ msgstr "Модуль _yenc... ÐЕ найден" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "Ð’ÐИМÐÐИЕ! Задание «%s» приоÑтановлено из-за зашифрованного RAR-файла" #~ 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 "Invalid encoding of email template %s" #~ msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° шаблона Ñлектронного пиÑьма %s" #~ msgid "No email templates found" #~ msgstr "Ðе найдены шаблоны Ñлектронных пиÑем" #~ msgid "Error: No secondary interface defined." #~ msgstr "Ошибка: дополнительный Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½Ðµ определён." #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Ваша верÑÐ¸Ñ UNRAR не рекомендуетÑÑ Ðº иÑпользованию. Загрузите подходÑщую " #~ "верÑию Ñ Ñайта http://www.rarlab.com/rar_add.htm
" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "Программа UNRAR не найдена. РаÑпаковка RAR-файлов невозможна
" #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "Программа PAR2 не найдена. ИÑправление файлов невозможно
" #~ msgid "Initiating restart...
" #~ msgstr "Инициирование перезапуÑка...
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "Задание «%s» было повторно добавлено в очередь" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "" #~ "ЗаданиÑ, помеченные звёздочкой (*), не будут загружатьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." #~ msgid "Not matched" #~ msgstr "Ðе ÑоответÑтвующие" #~ msgid "Downloaded so far" #~ msgstr "Загружено на данный момент" #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Ðе удаётÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº куÑту рееÑтра HKEY_CURRENT_USER." #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ ключ рееÑтра «%s»." #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Ðе удалоÑÑŒ прочитать ключи рееÑтра Ð´Ð»Ñ Ñпециальных папок" #~ msgid "Try again" #~ msgstr "Повторить попытку" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "" #~ "ОтÑутÑтвует модуль pyopenssl. УÑтановите его Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ протокола HTTPS" #~ msgid "Unpacking failed, see log" #~ msgstr "Ðе удалоÑÑŒ раÑпаковать (Ñм. журнал)" #~ msgid "ERROR: %s" #~ msgstr "ОШИБКÐ: %s" #~ msgid "Missing expected file: %s => unrar error?" #~ msgstr "ОтÑутÑтвует ожидаемый файл: %s => ошибка unrar?" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "Ошибка раÑпаковки: ожидаемый файл не был раÑпакован" #~ 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 "File %s is empty, skipping" #~ msgstr "Файл %s пуÑтой: пропущен" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " СиÑтема SABnzbd неÑовмеÑтима Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ программными " #~ "брандмауÑрами.
\n" #~ " %s
\n" #~ " К Ñожалению Ñту неÑовмеÑтимоÑть ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÑтранить.
\n" #~ " Отправьте жалобу поÑтавщику Ñвоего брандмауÑра.
\n" #~ "
\n" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " Службе SABnzbd требуетÑÑ Ñвободный порт TCP/IP Ð´Ð»Ñ Ð²Ñтроенного веб-" #~ "Ñервера.
\n" #~ " Был проверен порт %s на %s, но у учётной запиÑи, иÑпользуемой Ð´Ð»Ñ " #~ "SABnzbd, нет прав Ð´Ð»Ñ ÐµÐ³Ð¾ иÑпользованиÑ.
\n" #~ " Ð’ ÑиÑтемах OSX и Linux обычные пользователи должны иÑпользовать порты, " #~ "Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 1023.
\n" #~ "
\n" #~ " ПерезапуÑтите Ñлужбу SABnzbd, указав другой номер порта." #~ msgid "OK" #~ msgstr "ОК" #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Скорее вÑего у Ð²Ð°Ñ Ð¸ÑпользуетÑÑ ZoneAlarm Ð´Ð»Ñ ÑиÑтемы Vista.
" #~ msgid "You have no permisson to use port %s" #~ msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на иÑпользование порта %s" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "Ðе удалоÑÑŒ удалить NZO из очереди поÑÑ‚-обработки (id)" #~ msgid "No post-processing because of failed verification" #~ msgstr "Отмена поÑÑ‚-обработка из-за ошибки проверки" #~ msgid "View script output" #~ msgstr "ПроÑмотреть выходные данные ÑценариÑ" #~ msgid "Error removing workdir (%s)" #~ msgstr "Ðе удалоÑÑŒ удалить рабочий каталог (%s)" #~ msgid "Get NZB" #~ msgstr "Загрузить NZB" #~ msgid "KB/s" #~ msgstr "КБ/Ñ" #~ msgid "Queued" #~ msgstr "Ð’ очереди" #~ msgid "Complete Dir" #~ msgstr "Каталог Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ñ‹Ñ…" #~ msgid "Download speed" #~ msgstr "СкороÑть загрузки" #~ msgid "WARNINGS" #~ msgstr "ПРЕДУПРЕЖДЕÐИЯ" #~ msgid "Add new downloads" #~ msgstr "Добавить новые загрузки" #~ msgid " " #~ msgstr " " #~ msgid " or Report ID" #~ msgstr " Ð¸Ð»Ð¸ код отчёта" #~ msgid "Sort by name" #~ msgstr "Сортировать по имени" #~ msgid "Sort by age" #~ msgstr "Сортировать по возраÑту" #~ msgid "Sort by size" #~ msgstr "Сортировать по размеру" #~ msgid "Hide files" #~ msgstr "Скрыть файлы" #~ msgid "Show files" #~ msgstr "Показать файлы" #~ msgid "Remain/Total" #~ msgstr "ОÑталоÑÑŒ/вÑего" #~ msgid "Purge Failed History" #~ msgstr "ОчиÑтить иÑторию неудачных загрузок" #~ msgid "Delete all failed items from History?" #~ msgstr "Удалить вÑе Ñлементы Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸ из иÑтории?" #~ msgid "History Size" #~ msgstr "Размер иÑтории" #~ msgid "Show Weblogging" #~ msgstr "Показать веб-журнал" #~ msgid "Thread" #~ msgstr "Поток" #~ msgid "Email Test Result" #~ msgstr "Результат проверки Ñлектронной почты" #~ msgid "General configuration" #~ msgstr "ÐžÐ±Ñ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ" #~ msgid "Secondary Web Interface" #~ msgstr "Дополнительный веб-интерфейÑ" #~ msgid "Activate an alternative skin." #~ msgstr "ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ темы." #~ msgid "Web server authentication" #~ msgstr "Проверка подлинноÑти веб-Ñервера" #~ msgid "HTTPS Support" #~ msgstr "Поддержка HTTPS" #~ msgid "Queue auto refresh interval:" #~ msgstr "Интервал автоматичеÑкого Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´Ð¸:" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "" #~ "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÐ±-Ñтраницы очереди (в Ñекундах, 0 — не обновлÑть)." #~ msgid "Disable API-key" #~ msgstr "Отключить ключ API" #~ msgid "Do not require the API key." #~ msgstr "Ðе требовать ключ API." #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "ИСПОЛЬЗУЙТЕ ÐРСВОЙ СТРÐÐ¥ И РИСК!" #~ msgid "QR Code" #~ msgstr "QR-код" #~ msgid "Folder configuration" #~ msgstr "ÐаÑтройка папок" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Папка Ñценариев поÑÑ‚-обработки" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "Папка, ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‰Ð°Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие Ñкрипты Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚-обработки." #~ msgid "Switches configuration" #~ msgstr "ÐаÑтройка переключателей" #~ msgid "Processing Switches" #~ msgstr "Обработка переключателей" #~ msgid "Enable Quick Check" #~ msgstr "ИÑпользовать быÑтрую проверку" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "ПропуÑкать проверку PAR2, когда файлы на 100% корректные." #~ msgid "Enable Unrar" #~ msgstr "РаÑпаковывать RAR" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Включить вÑтроенную функцию раÑпаковки RAR-архивов." #~ msgid "Enable built-in unzip functionality." #~ msgstr "Включить вÑтроенную функцию раÑпаковки ZIP-архивов." #~ msgid "Enable Filejoin" #~ msgstr "ОбъединÑть файлы" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "ОбъединÑть файлы Ñ Ñ€Ð°ÑширениÑми 001, 002 и Ñ‚. д. в один файл." #~ msgid "Enable TS Joining" #~ msgstr "ОбъединÑть TS" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "ОбъединÑть файлы Ñ Ñ€Ð°ÑширениÑми 001.ts, 002.ts и Ñ‚. д. в один файл." #~ msgid "Enable Par Cleanup" #~ msgstr "УдалÑть PAR" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "УдалÑть PAR-файлы (в Ñлучае уÑпешной проверки или иÑправлениÑ)." #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Сбой Ð´Ð»Ñ CRC-ошибок yEnc" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "" #~ "ЕÑли ÑÑ‚Ð°Ñ‚ÑŒÑ Ñодержит CRC-ошибку, попытатьÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ её Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ Ñервера." #~ msgid "Check result of unpacking" #~ msgstr "ПроверÑть результаты раÑпаковки" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "ПроверÑть результаты раÑпаковки (Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… файловых ÑиÑтем Ñледует " #~ "отключить)." #~ msgid "Default Post-Processing" #~ msgstr "ПоÑÑ‚-обработка по умолчанию" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "ИÑпользуетÑÑ, еÑли поÑÑ‚-обработка не определена категорией." #~ msgid "Default User Script" #~ msgstr "ПользовательÑкий Ñценарий по умолчанию" #~ msgid "Used when no user script is defined by the category." #~ msgstr "" #~ "ИÑпользуетÑÑ, еÑли пользовательÑкий Ñценарий не определен категорией." #~ msgid "Default Priority" #~ msgstr "Приоритет по умолчанию" #~ msgid "Used when no priority is defined by the category." #~ msgstr "ИÑпользуетÑÑ, еÑли приоритет не определён категорией." #~ msgid "Enable MultiCore Par2" #~ msgstr "Включить MultiCore PAR2" #~ msgid "Other Switches" #~ msgstr "Другие переключатели" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "ЗаменÑть недопуÑтимые Ñимволы в названиÑÑ… папок" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "ЗаменÑть (или удалÑть) недопуÑтимые Ñимволы на их Ñквиваленты в названиÑÑ… " #~ "папок." #~ msgid "Do not download" #~ msgstr "Ðе загружать" #~ msgid "SSL type" #~ msgstr "Тип SSL" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "ИÑпользуйте V23, еÑли только ваш провайдер не требует иного!" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "ИÑпользовать 12-чаÑовой формат (AM/PM)" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Отображать Ð²Ñ€ÐµÐ¼Ñ Ð² формате AM/PM (не влиÑет на планировщик)." #~ msgid "Only for optional servers" #~ msgstr "Только Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… Ñерверов" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "" #~ "ПрименÑть макÑимальное чиÑло повторных попыток только Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… " #~ "Ñерверов" #~ msgid "Server configuration" #~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñервера" #~ msgid "Server definition" #~ msgstr "Определение Ñервера" #~ msgid "Backup server" #~ msgstr "Резервный Ñервер" #~ msgid "Click below to test." #~ msgstr "Ðажмите кнопку внизу, чтобы начать проверку" #~ msgid "Scheduling configuration" #~ msgstr "ÐаÑтройка раÑпиÑаниÑ" #~ msgid "Remove" #~ msgstr "Удалить" #~ msgid "RSS Configuration" #~ msgstr "ÐаÑтройка RSS" #~ msgid "New Feed URL" #~ msgstr "URL новой ленты" #~ msgid "Add Feed" #~ msgstr "Добавить ленту" #~ msgid "Delete Feed" #~ msgstr "Удалить ленту" #~ msgid "Skip" #~ msgstr "ПропуÑтить" #~ msgid "Feeds" #~ msgstr "Ленты новоÑтей" #~ msgid "Settings" #~ msgstr "Параметры" #~ msgid "Filters" #~ msgstr "Фильтры" #~ msgid "Email Options" #~ msgstr "Параметры Ñлектронной почты" #~ msgid "Email Account Settings" #~ msgstr "Параметры учётной запиÑи Ñлектронной почты" #~ msgid "Send notifications to Growl" #~ msgstr "ОтправлÑть ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð² Growl" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "ОтправлÑть ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð² NotifyOSD" #~ msgid "User-defined categories" #~ msgstr "ПользовательÑкие категории" #~ msgid "Defines post-processing and storage." #~ msgstr "Категории определÑÑŽÑ‚ варианты поÑÑ‚-обработки и хранениÑ." #~ msgid "Groups / Indexer tags" #~ msgstr "Группы / теги индекÑатора" #~ msgid "Sorting configuration" #~ msgstr "ÐаÑтройка Ñортировки" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "ПозволÑет Ñортировать и переименовывать Ñпизоды." #~ msgid "Generic Sorting" #~ msgstr "ÐžÐ±Ñ‹Ñ‡Ð½Ð°Ñ Ñортировка" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "ПозволÑет Ñортировать и переименовывать файлы." #~ 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 "ПозволÑет Ñортировать и переименовывать файлы Ñ Ð´Ð°Ñ‚Ð¾Ð¹ в названии." #~ msgid "Are you sure you want to delete" #~ msgstr "ДейÑтвительно удалить" #~ msgid "Page" #~ msgstr "Страница" #~ msgid "First" #~ msgstr "ПерваÑ" #~ msgid "Last" #~ msgstr "ПоÑледнÑÑ" #~ msgid "Close" #~ msgstr "Закрыть" #~ msgid "Set Pause Interval" #~ msgstr "Задать интервал приоÑтановки" #~ msgid "Pause Interval" #~ msgstr "Интервал приоÑтановки" #~ msgid "Pause for 12 hours" #~ msgstr "ПриоÑтановить на 12 чаÑов" #~ msgid "Pause for 24 hours" #~ msgstr "ПриоÑтановить на 24 чаÑа" #~ msgid "Left" #~ msgstr "оÑталоÑÑŒ" #~ msgid "Open Source URL" #~ msgstr "Открыть URL иÑточника" #~ msgid "Storage" #~ msgstr "Хранилище" #~ msgid "Plush Options" #~ msgstr "Параметры Plush" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "ДопуÑтимые раÑширениÑ: NZB, RAR, ZIP и GZ" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Кнопка Прочитать ленту загрузит текущее Ñодержимое ленты.. " #~ "Кнопка Загрузить принудительно загрузит вÑе подходÑщие NZB-" #~ "файлы." #~ msgid "Hour:Min" #~ msgstr "ЧаÑ:мин" #~ msgid "Delete Completed" #~ msgstr "Удаление завершено" #~ msgid "Delete the all failed items from the history?" #~ msgstr "Удалить вÑе неудачные Ñлементы из иÑтории?" #~ msgid "Delete Failed" #~ msgstr "Ошибка удалениÑ" #~ msgid "Links" #~ msgstr "СÑылки" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "Показаны результаты Ñ %s по %s из %s" #~ msgid "No results" #~ msgstr "Ðет результатов" #~ msgid "Showing one result" #~ msgstr "Показан один результат" #~ msgid "Email Sent!" #~ msgstr "Сообщение отправлено" #~ msgid "Saved" #~ msgstr "Сохранено" #~ msgid "Toggle Add NZB" #~ msgstr "Переключить добавление NZB" #~ msgid "DualView1" #~ msgstr "ДвойнойВид1" #~ msgid "DualView2" #~ msgstr "ДвойнойВид2" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "ПерезапуÑтить SABnzbd?" #~ msgid "Hide Edit Options" #~ msgstr "Скрыть параметры редактированиÑ" #~ msgid "Show Edit Options" #~ msgstr "Показать параметры редактированиÑ" #~ msgid "Edit" #~ msgstr "Изменить" #~ msgid "Timeleft" #~ msgstr "ОÑталоÑÑŒ времени" #~ msgid "Access" #~ msgstr "ДоÑтуп" #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "Я хочу, чтобы SABnzbd был доÑтупен вÑем компьютерам в моей Ñети." #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "Я хочу, чтобы SABnzbd был доÑтупен только моему компьютеру." #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Защита паролем доÑтупа к SABnzbd (рекомендуетÑÑ)" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Включить HTTPS-доÑтуп к SABnzbd." #~ msgid "Misc" #~ msgstr "Разное" #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "Открывать веб-браузер Ñо Ñтраницей SABnzbd при запуÑке программы." #~ msgid "This field is required." #~ msgstr "Это поле обÑзательно Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ." #~ msgid "Please enter a whole number." #~ msgstr "Введите целое чиÑло." #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "ПоÑле перезапуÑка Ñлужба SABnzbd будет доÑтупна по Ñледующему адреÑу: %s" #~ msgid "Step One" #~ msgstr "Шаг первый" #~ msgid "Step Two" #~ msgstr "Шаг второй" #~ msgid "Step Three" #~ msgstr "Шаг третий" #~ msgid "Step Four" #~ msgstr "Шаг четвертый" #~ msgid "Step Five" #~ msgstr "Шаг пÑтый" #~ msgid "E.g. 119 or 563 for SSL" #~ msgstr "Ðапример, 119 или 563 Ð´Ð»Ñ SSL" sabnzbd-develop/po/main/pl.po0000600000175000017500000043343313642116632014264 0ustar jpjp# Polish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2020-01-24 15:29+0100\n" "PO-Revision-Date: 2018-02-14 14:18+0000\n" "Last-Translator: Safihre \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2020-02-22 06:02+0000\n" "X-Generator: Launchpad (build 19413b719a8df7423ab1390528edadce9e0e4aca)\n" #: SABnzbd.py [Error message] msgid "Failed to start web-interface" msgstr "Nie udaÅ‚o siÄ™ uruchomić interfejsu WWW" #: SABnzbd.py [Warning message] msgid "Cannot find web template: %s, trying standard template" msgstr "Nie znaleziono szablonu: %s, próbujÄ™ użyć standardowego szablonu" #: SABnzbd.py msgid "" "SABYenc disabled: no correct version found! (Found v%s, expecting v%s)" msgstr "" #: SABnzbd.py msgid "" "SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc" msgstr "" #: SABnzbd.py [Error message] msgid "par2 binary... NOT found!" msgstr "Program par2 ... NIE znaleziono!" #: SABnzbd.py msgid "MultiPar binary... NOT found!" msgstr "" #: SABnzbd.py msgid "Verification and repair will not be possible." msgstr "" #: SABnzbd.py msgid "Your UNRAR version is %s, we recommend version %s or higher.
" msgstr "Twoja wersja unrar to %s, zalecana jest wersja %s lub wyższa.
" #: SABnzbd.py [Error message] msgid "unrar binary... NOT found" msgstr "Program unrar ... NIE znaleziono!" #: SABnzbd.py msgid "unzip binary... NOT found!" msgstr "Program unzip ... NIE znaleziono!" #: SABnzbd.py msgid "7za binary... NOT found!" msgstr "Program 7za... NIE znaleziono!" #: SABnzbd.py [Error message] msgid "Essential modules are missing, downloading cannot start." msgstr "" #: SABnzbd.py [Warning message] msgid "" "Please be aware the 0.0.0.0 hostname will need an IPv6 address for external " "access" msgstr "Nazwa hosta 0.0.0.0 wymaga adresu IPv6 do dostÄ™pu z zewnÄ…trz" #: SABnzbd.py [Error message] msgid "HTTP and HTTPS ports cannot be the same" msgstr "Porty dla HTTP i HTTPS nie mogÄ… być takie same" #: SABnzbd.py msgid "" "SABnzbd was started with encoding %s, this should be UTF-8. Expect problems " "with Unicoded file and directory names in downloads." msgstr "" #: SABnzbd.py [Warning message] msgid "Disabled HTTPS because of missing CERT and KEY files" msgstr "Wyłączono HTTPS z powodu braku plików CERT oraz KEY" #: SABnzbd.py [Error message] msgid "Failed to start web-interface: " msgstr "Nie udaÅ‚o siÄ™ uruchomić interfejsu WWW: " #: SABnzbd.py [Error message] msgid "Cannot reach the SABHelper service" msgstr "Nie można połączyć siÄ™ z usÅ‚ugÄ… SABHelper" #: SABnzbd.py msgid "SABnzbd %s started" msgstr "Uruchomiono SABnzbd %s" #: SABnzbd.py # sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Status page, table column header, actual message] msgid "Warning" msgstr "Ostrzeżenie" #: SABnzbd.py # sabnzbd/notifier.py [Notification] msgid "Error" msgstr "Błąd" #: SABnzbd.py # sabnzbd/interface.py # sabnzbd/osxmenu.py msgid "SABnzbd shutdown finished" msgstr "SABnzbd zostaÅ‚ wyłączony" #: sabnzbd/utils/servertests.py msgid "The hostname is not set." msgstr "Nie ustawiono nazwy hosta." #: sabnzbd/utils/servertests.py msgid "There are no connections set. Please set at least one connection." msgstr "" "Nie ustawiono maksymalnej liczby połączeÅ„. ProszÄ™ umożliwić przynajmniej " "jedno połączenie." #: sabnzbd/utils/servertests.py msgid "Password masked in ******, please re-enter" msgstr "HasÅ‚o ukryte za ******, proszÄ™ wprowadzić je ponownie" #: sabnzbd/utils/servertests.py msgid "Invalid server details" msgstr "NiewÅ‚aÅ›ciwe dane serwera" #: sabnzbd/utils/servertests.py msgid "Timed out: Try enabling SSL or connecting on a different port." msgstr "" "UpÅ‚ynÄ…Å‚ limit czasu odpowiedzi: spróbuj włączyć SSL lub połącz siÄ™ z innym " "portem." #: sabnzbd/utils/servertests.py msgid "Timed out" msgstr "UpÅ‚ynÄ…Å‚ limit czasu odpowiedzi." #: sabnzbd/utils/servertests.py msgid "" "Unknown SSL protocol: Try disabling SSL or connecting on a different port." msgstr "" #: sabnzbd/utils/servertests.py msgid "Invalid server address." msgstr "NieprawidÅ‚owy adres serwera." #: sabnzbd/utils/servertests.py msgid "Server quit during login sequence." msgstr "Serwer przerwaÅ‚ połączenie w trakcie logowania." #: sabnzbd/utils/servertests.py msgid "Server requires username and password." msgstr "Serwer wymaga podania nazwy użytkownika i hasÅ‚a." #: sabnzbd/utils/servertests.py msgid "Connection Successful!" msgstr "Połączenie udane!" #: sabnzbd/utils/servertests.py # sabnzbd/interface.py # sabnzbd/newswrapper.py msgid "Authentication failed, check username/password." msgstr "Błąd połączenia, sprawdź nazwÄ™ użytkownika i hasÅ‚o." #: sabnzbd/utils/servertests.py msgid "Too many connections, please pause downloading or try again later" msgstr "" "Zbyt wiele połączeÅ„, proszÄ™ wstrzymać pobieranie lub spróbować ponownie " "później" #: sabnzbd/utils/servertests.py msgid "Could not determine connection result (%s)" msgstr "Nie można okreÅ›lić wyniku połączenia (%s)" #: sabnzbd/__init__.py [Warning message] msgid "Signal %s caught, saving and exiting..." msgstr "Odebrano sygnaÅ‚ %s, zapisywanie i zamykanie programu..." #: sabnzbd/__init__.py [Error message] msgid "Fatal error at saving state" msgstr "Błąd krytyczny podczas zapisywania stanu" #: sabnzbd/__init__.py msgid "Trying to fetch NZB from %s" msgstr "Próba pobrania NZB z %s" #: sabnzbd/__init__.py [Error message] msgid "Saving %s failed" msgstr "Nie udaÅ‚o siÄ™ zapisać %s" #: sabnzbd/__init__.py [Error message] msgid "Cannot create temp file for %s" msgstr "Nie można utworzyć tymczasowego pliku dla %s" #: sabnzbd/__init__.py [Warning message] msgid "Trying to set status of non-existing server %s" msgstr "Próba ustawienia statusu nieistniejÄ…cego serwera %s" #: sabnzbd/__init__.py [Error message] msgid "Failure in tempfile.mkstemp" msgstr "Błąd w tempfile.mkstemp" #: sabnzbd/__init__.py [Error message] msgid "Loading %s failed" msgstr "Nie udaÅ‚o siÄ™ wczytać %s" #: sabnzbd/api.py # sabnzbd/emailer.py msgid "Email succeeded" msgstr "Wiadomość wysÅ‚ana" #: sabnzbd/api.py # sabnzbd/skintext.py msgid "Test Notification" msgstr "Powiadomienie testowe" #: sabnzbd/api.py msgid " Resolving address" msgstr " RozwiÄ…zywanie adresu" #: 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" #: sabnzbd/api.py # sabnzbd/interface.py # sabnzbd/skintext.py [Default value, used in dropdown menus] msgid "Default" msgstr "DomyÅ›lne" #: sabnzbd/api.py msgid "unknown" msgstr "nieznany" #: sabnzbd/api.py [Error message] 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" #: sabnzbd/assembler.py [Error message] msgid "Disk error on creating file %s" msgstr "Błąd dysku podczas tworzenia pliku %s" #: sabnzbd/assembler.py [Error message] msgid "Fatal error in Assembler" msgstr "Błąd krytyczny w module skÅ‚adajÄ…cym" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Paused job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: Aborted job \"%s\" because of encrypted RAR file (if supplied, all " "passwords were tried)" msgstr "" #: sabnzbd/assembler.py msgid "Aborted, encryption detected" msgstr "Przerwano, wykryto szyfrowanie" #: sabnzbd/assembler.py [Warning message] msgid "" "WARNING: In \"%s\" unwanted extension in RAR file. Unwanted file is %s " msgstr "" "UWAGA: Plik z niepożądanym rozszerzeniem wewnÄ…trz pliku RAR \"%s\". " "Niepożądany plik to %s " #: sabnzbd/assembler.py msgid "Unwanted extension is in rar file %s" msgstr "Niepożądane rozszerzenie w pliku RAR %s" #: sabnzbd/assembler.py msgid "Aborted, unwanted extension detected" msgstr "Przerwano, wykryto niepożądane rozszerzenie" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Paused job \"%s\" because of rating (%s)" msgstr "UWAGA: Zadanie \"%s\" zostaÅ‚o wstrzymane z powodu oceny (%s)" #: sabnzbd/assembler.py [Warning message] msgid "WARNING: Aborted job \"%s\" because of rating (%s)" msgstr "UWAGA: Zadanie \"%s\" zostaÅ‚o przerwane z powodu oceny (%s)" #: sabnzbd/assembler.py msgid "Aborted, rating filter matched (%s)" msgstr "Przerwano, odfiltrowane z powodu oceny (%s)" #: sabnzbd/assembler.py msgid "%s missing" msgstr "Brakuje %s" #: sabnzbd/assembler.py [Warning message] msgid "" "Job \"%s\" is probably encrypted due to RAR with same name inside this RAR" msgstr "" #: sabnzbd/assembler.py [Warning message] msgid "Job \"%s\" is probably encrypted: \"password\" in filename \"%s\"" msgstr "" #: sabnzbd/assembler.py msgid "video" msgstr "wideo" #: sabnzbd/assembler.py msgid "audio" msgstr "audio" #: sabnzbd/assembler.py msgid "spam" msgstr "spam" #: sabnzbd/assembler.py msgid "passworded" msgstr "zabezpieczone hasÅ‚em" #: sabnzbd/assembler.py msgid "downvoted" msgstr "źle oceniane" #: sabnzbd/assembler.py msgid "keywords" msgstr "sÅ‚owa kluczowe" #: sabnzbd/bpsmeter.py [Warning message] msgid "Quota spent, pausing downloading" msgstr "Przekroczono limit, wstrzymywanie pobierania" #: sabnzbd/cfg.py msgid "%s is not a valid email address" msgstr "%s nie jest prawidÅ‚owym adresem email" #: sabnzbd/cfg.py # sabnzbd/interface.py msgid "Server address required" msgstr "Wymagane jest podanie adresu serwera" #: sabnzbd/config.py msgid "Cannot create %s folder %s" msgstr "Nie można utworzyć katalogu %s %s" #: sabnzbd/config.py [Error message] msgid "Cannot write to INI file %s" msgstr "Nie można zapisać pliku INI %s" #: sabnzbd/config.py [Error message] msgid "Cannot create backup file for %s" msgstr "Nie można utworzyć kopii zapasowej %s" #: sabnzbd/config.py [Error message] msgid "Incorrectly encoded password %s" msgstr "NieprawidÅ‚owo zakodowane hasÅ‚o %s" #: sabnzbd/config.py msgid "%s is not a correct octal value" msgstr "%s nie jest prawidÅ‚owÄ… wartoÅ›ciÄ… w systemie ósemkowym" #: sabnzbd/config.py msgid "UNC path \"%s\" not allowed here" msgstr "Åšcieżka UNC \"%s\" niedozwolona" #: sabnzbd/config.py msgid "Error: Path length should be below %s." msgstr "Błąd: DÅ‚ugość Å›cieżki powinna być mniejsza niż %s" #: sabnzbd/config.py msgid "Error: Queue not empty, cannot change folder." msgstr "Błąd: Kolejka nie jest pusta, nie można zmienić katalogu." #: sabnzbd/database.py [Error message] msgid "Cannot write to History database, check access rights!" msgstr "Nie można zapisać bazy danych historii, sprawdź prawa dostÄ™pu!" #: sabnzbd/database.py [Error message] msgid "Damaged History database, created empty replacement" msgstr "Uszkodzona baza danych historii, utworzono w jej miejscu nowÄ…, pustÄ…" #: sabnzbd/database.py [Error message] msgid "SQL Command Failed, see log" msgstr "Błąd polecenia SQL, sprawdź logi" #: sabnzbd/database.py [Error message] msgid "Failed to close database, see log" msgstr "Błąd zamykania bazy danych, sprawdź logi" #: sabnzbd/database.py [Error message] msgid "Invalid stage logging in history for %s" msgstr "NieprawidÅ‚owy log etapu w historii dla %s" #: sabnzbd/decoder.py msgid "Decoding %s failed" msgstr "Błąd dekodowania %s" #: sabnzbd/decoder.py msgid "Decoder failure: Out of memory" msgstr "" #: sabnzbd/decoder.py msgid "Badly formed yEnc article in %s" msgstr "Źle zbudowany artykuÅ‚ yEnc w %s" #: sabnzbd/decoder.py msgid "Unknown Error while decoding %s" msgstr "Nieznany błąd podczas dekodowania %s" #: sabnzbd/decoder.py msgid "%s => missing from all servers, discarding" msgstr "%s => nie znaleziono na żadnym serwerze, porzucam" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py msgid "Direct Unpack" msgstr "" #: sabnzbd/directunpacker.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [History: job status] msgid "Completed" msgstr "UkoÅ„czone" #: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py msgid "Unpacked %s files/folders in %s" msgstr "Rozpakowano %s plików/katalogów w %s" #: sabnzbd/directunpacker.py [Warning message] msgid "Direct Unpack was automatically enabled." msgstr "" #: sabnzbd/directunpacker.py [Warning message] # sabnzbd/skintext.py 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 [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] msgid "Error while adding %s, removing" msgstr "Błąd podczas dodawania %s, usuwanie" #: sabnzbd/dirscanner.py [Error message] msgid "Error removing %s" msgstr "Błąd podczas usuwania %s" #: sabnzbd/dirscanner.py [Error message] msgid "Cannot read Watched Folder %s" msgstr "Nie można odczytać obserwowanego katalogu %s" #: sabnzbd/downloader.py msgid "Resuming" msgstr "Wznawianie" #: sabnzbd/downloader.py # sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py [Priority pick list] msgid "Paused" msgstr "Wstrzymano" #: sabnzbd/downloader.py [Warning message] # sabnzbd/interface.py [Warning message] # sabnzbd/skintext.py msgid "You must set a maximum bandwidth before you can set a bandwidth limit" msgstr "" "Przed ustawieniem limitu przepustowoÅ›ci należy ustawić maksymalnÄ… " "przepustowość" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Cannot connect to server %s [%s]" msgstr "Nie można połączyć siÄ™ z serwerem %s [%s]" #: sabnzbd/downloader.py # sabnzbd/urlgrabber.py msgid "Server name does not resolve" msgstr "Nie udaÅ‚o siÄ™ rozwiÄ…zać nazwy serwera" #: sabnzbd/downloader.py [Warning message] msgid "Server %s will be ignored for %s minutes" msgstr "Serwer %s bÄ™dzie ignorowany przez %s minut" #: sabnzbd/downloader.py [Error message] msgid "Failed to initialize %s@%s with reason: %s" msgstr "Błąd podczas inicjalizacji %s@%s: %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Too many connections to server %s" msgstr "Zbyt wiele połączeÅ„ do serwera %s" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Warning message] msgid "Probable account sharing" msgstr "Prawdopodobne współdzielenie konta" #: sabnzbd/downloader.py # sabnzbd/downloader.py [Error message] msgid "Failed login for server %s" msgstr "Błąd logowania do serwera %s" #: sabnzbd/downloader.py [Error message] msgid "Connecting %s@%s failed, message=%s" msgstr "Błąd połączenia %s@%s, komunikat=%s" #: sabnzbd/downloader.py msgid "Server %s requires user/password" msgstr "Serwer %s wymagania podania nazwy użytkownika i hasÅ‚a" #: sabnzbd/downloader.py [Error message] msgid "Suspect error in downloader" msgstr "NieobsÅ‚ugiwany błąd w module pobierania" #: sabnzbd/downloader.py # sabnzbd/skintext.py msgid "Shutting down" msgstr "Wyłączanie" #: sabnzbd/emailer.py msgid "Failed to connect to mail server" msgstr "Błąd połączenia z serwerem pocztowym" #: sabnzbd/emailer.py msgid "Failed to initiate TLS connection" msgstr "Błąd połączenia TLS" #: sabnzbd/emailer.py msgid "The server didn't reply properly to the helo greeting" msgstr "Serwer nie odpowiedziaÅ‚ poprawnie na polecenie HELO" #: sabnzbd/emailer.py msgid "Failed to authenticate to mail server" msgstr "Błąd uwierzytelnienia na serwerze pocztowym" #: sabnzbd/emailer.py msgid "No suitable authentication method was found" msgstr "Nie znaleziono odpowiedniej metody uwierzytelnienia" #: sabnzbd/emailer.py msgid "Unknown authentication failure in mail server" msgstr "" "Uwierzytelnienie na serwerze pocztowym nie powiodÅ‚o siÄ™ z nieznanej przyczyny" #: sabnzbd/emailer.py msgid "Failed to send e-mail" msgstr "Błąd wysyÅ‚ania wiadomoÅ›ci email" #: sabnzbd/emailer.py msgid "Failed to close mail connection" msgstr "Nie udaÅ‚o siÄ™ zamknąć połączenia z serwerem pocztowym" #: sabnzbd/emailer.py # sabnzbd/notifier.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" #: sabnzbd/emailer.py msgid "No recipients given, no email sent" msgstr "Nie podano adresatów, wiadomość nie zostaÅ‚a wysÅ‚ana" #: sabnzbd/emailer.py msgid "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd reports Disk Full\n" "\n" "Hi,\n" "\n" "SABnzbd has stopped downloading, because the disk is almost full.\n" "Please make room and resume SABnzbd manually.\n" "\n" msgstr "" "To: %s\n" "From: %s\n" "Date: %s\n" "Subject: SABnzbd zgÅ‚asza przekroczenie dopuszczalnej zajÄ™toÅ›ci dysku\n" "\n" "Cześć,\n" "\n" "SABnzbd przestaÅ‚ pobierać pliki, ponieważ dysk jest prawie peÅ‚en.\n" "Opróżnij trochÄ™ miejsca i wznów dziaÅ‚anie SABnzbd rÄ™cznie.\n" "\n" #: sabnzbd/filesystem.py [Error message] # sabnzbd/sorting.py [Error message] msgid "Cannot create directory %s" msgstr "Nie można utworzyć katalogu %s" #: sabnzbd/filesystem.py [Error message] msgid "%s directory: %s error accessing" msgstr "Katalog %s: błąd dostÄ™pu do %s" #: sabnzbd/filesystem.py [Error message] msgid "Cannot change permissions of %s" msgstr "Nie można zmienić uprawnieÅ„ %s" #: sabnzbd/filesystem.py [Error message] msgid "Failed making (%s)" msgstr "Nie udaÅ‚o siÄ™ utworzyć (%s)" #: sabnzbd/filesystem.py [Error message] # sabnzbd/postproc.py msgid "Failed moving %s to %s" msgstr "Nie udaÅ‚o siÄ™ przenieść %s do %s" #: sabnzbd/interface.py msgid "Refused connection with hostname \"%s\" from:" msgstr "" #: sabnzbd/interface.py msgid "User logged in to the web interface" msgstr "" #: sabnzbd/interface.py # sabnzbd/notifier.py [Notification] msgid "User logged in" msgstr "" #: sabnzbd/interface.py msgid "Missing Session key" msgstr "Brak klucza sesji" #: sabnzbd/interface.py msgid "Error: Session Key Required" msgstr "Błąd: Wymagany klucz sesji" #: sabnzbd/interface.py msgid "Error: Session Key Incorrect" msgstr "Błąd: NieprawidÅ‚owy klucz sesji" #: sabnzbd/interface.py msgid "" "API Key missing, please enter the api key from Config->General into your 3rd " "party program:" msgstr "" "Brak klucza API, należy wprowadzić klucz API z sekcji Konfiguracja->Ogólne " "do zewnÄ™trznego programu:" #: sabnzbd/interface.py msgid "" "API Key incorrect, Use the api key from Config->General in your 3rd party " "program:" msgstr "" "Klucz API jest nieprawidÅ‚owy, użyj klucza API z sekcji Konfiguracja->Ogólne " "w zewnÄ™trznym programie:" #: sabnzbd/interface.py msgid "" "Authentication missing, please enter username/password from Config->General " "into your 3rd party program:" msgstr "" "Brak danych uwierzytelniajÄ…cych, wprowadź nazwÄ™ użytkownika/hasÅ‚o z sekcji " "Konfiguracja->Ogólne do zewnÄ™trznego programu:" #: sabnzbd/interface.py [Warning message] msgid "" "Try our new skin Glitter! Fresh new design that is optimized for desktop and " "mobile devices. Go to Config -> General to change your skin." msgstr "" "Wypróbuj naszÄ… nowÄ… skórkÄ™, Glitter! ZupeÅ‚nie nowy, Å›wieży projekt " "zoptymalizowany dla komputerów stacjonarnych i urzÄ…dzeÅ„ przenoÅ›nych. SkórkÄ™ " "możesz zmienić w sekcji Konfiguracja->Ogólne." #: sabnzbd/interface.py msgid "Unsuccessful login attempt from %s" msgstr "" #: sabnzbd/interface.py # sabnzbd/skintext.py [Bytes (used as postfix, as in "GB", "TB")] msgid "B" msgstr "B" #: sabnzbd/interface.py msgid "" " 
SABnzbd shutdown finished.
Wait for about 5 second and then " "click the button below.

Refresh
" msgstr "" " 
SABnzbd został wyłączony.
Zaczekaj około 5 sekund, a " "następnie kliknij na przycisk poniżej.

Odśwież
" #: sabnzbd/interface.py msgid "Warning: LOCALHOST is ambiguous, use numerical IP-address." msgstr "Uwaga: LOCALHOST jest niejednoznaczne, użyj adresu IP." #: sabnzbd/interface.py msgid "Server address \"%s:%s\" is not valid." msgstr "NieprawidÅ‚owy adres serwera \"%s:%s\"." #: sabnzbd/interface.py # sabnzbd/skintext.py [Config->RSS, tab header] msgid "Feed" msgstr "KanaÅ‚" #: sabnzbd/interface.py msgid "Daily" msgstr "Codziennie" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Monday" msgstr "PoniedziaÅ‚ek" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Tuesday" msgstr "Wtorek" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Wednesday" msgstr "Åšroda" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Thursday" msgstr "Czwartek" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Friday" msgstr "PiÄ…tek" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Saturday" msgstr "Sobota" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "Sunday" msgstr "Niedziela" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "off" msgstr "wyłączone" #: sabnzbd/interface.py msgid "Undefined server!" msgstr "Niezdefiniowany serwer!" #: 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 msgid "Back" msgstr "Powrót" #: sabnzbd/interface.py # sabnzbd/skintext.py msgid "ERROR:" msgstr "BÅÄ„D:" #: sabnzbd/interface.py msgid "Incorrect value for %s: %s" msgstr "NieprawidÅ‚owa wartość %s: %s" #: sabnzbd/misc.py msgid "d" msgstr "d" #: sabnzbd/misc.py msgid "h" msgstr "g" #: sabnzbd/misc.py msgid "m" msgstr "m" #: sabnzbd/misc.py [Error message] msgid "Error creating SSL key and certificate" msgstr "Błąd tworzenia klucza i certyfikatu SSL" #: sabnzbd/misc.py 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/newsunpack.py # sabnzbd/postproc.py msgid "Running script" msgstr "Uruchamianie skryptu" #: sabnzbd/newsunpack.py # sabnzbd/postproc.py msgid "PostProcessing was aborted (%s)" msgstr "Przetwarzanie koÅ„cowe zostaÅ‚o przerwane (%s)" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Script" msgstr "Skrypt" #: sabnzbd/newsunpack.py [Warning message] msgid "Unpack nesting too deep [%s]" msgstr "Zbyt głęboki poziom zagnieżdżenia podczas rozpakowywania [%s]" #: sabnzbd/newsunpack.py msgid "Joining" msgstr "ÅÄ…czenie" #: sabnzbd/newsunpack.py msgid "Incomplete sequence of joinable files" msgstr "Niekompletna sekwencja plików do połączenia" #: sabnzbd/newsunpack.py msgid "File join of %s failed" msgstr "ÅÄ…czenie pliku %s nie powiodÅ‚o siÄ™" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while joining files" msgstr "[%s] Błąd \"%s\" podczas łączenia plików" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running file_join on %s" msgstr "Błąd \"%s\" podczas uruchamiania file_join na %s" #: sabnzbd/newsunpack.py msgid "[%s] Joined %s files" msgstr "[%s] Połączono %s plików" #: sabnzbd/newsunpack.py msgid "Unpacking failed, %s" msgstr "Rozpakowywanie nie powiodÅ‚o siÄ™, %s" #: sabnzbd/newsunpack.py msgid "[%s] Error \"%s\" while unpacking RAR files" msgstr "[%s] Błąd \"%s\" podczas rozpakowywania plików RAR" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running rar_unpack on %s" msgstr "Błąd \"%s\" podczas uruchamiania rar_unpack na %s" #: sabnzbd/newsunpack.py [Warning message] msgid "Deleting %s failed!" msgstr "Usuwanie %s nie powiodÅ‚o siÄ™!" #: sabnzbd/newsunpack.py msgid "Trying unrar with password \"%s\"" msgstr "Próba rozpakowania archiwum RAR z użyciem hasÅ‚a \"%s\"" #: sabnzbd/newsunpack.py [Error message] # sabnzbd/newsunpack.py msgid "Unpacking failed, archive requires a password" msgstr "Rozpakowywanie nie powiodÅ‚o siÄ™, archiwum wymaga podania hasÅ‚a" #: sabnzbd/newsunpack.py msgid "Unpacking" msgstr "Rozpakowywanie" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "unpack"] msgid "Unpack" msgstr "Rozpakuj" #: sabnzbd/newsunpack.py msgid "Unpacking failed, unable to find %s" msgstr "Rozpakowywanie nie powiodÅ‚o siÄ™, nie można znaleźć %s" #: sabnzbd/newsunpack.py [Warning message] msgid "ERROR: unable to find \"%s\"" msgstr "BÅÄ„D: nie można znaleźć \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, CRC error" msgstr "Rozpakowywanie nie powiodÅ‚o siÄ™, błąd CRC" #: sabnzbd/newsunpack.py [Warning message] # sabnzbd/newsunpack.py msgid "ERROR: CRC failed in \"%s\"" msgstr "BÅÄ„D: nieprawidÅ‚owa suma kontrolna CRC w \"%s\"" #: sabnzbd/newsunpack.py msgid "Unpacking failed, file too large for filesystem (FAT?)" msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: File too large for filesystem (%s)" msgstr "" #: sabnzbd/newsunpack.py msgid "Unpacking failed, write error or disk is full?" msgstr "Rozpakowywanie nie powiodÅ‚o siÄ™, błąd zapisu lub zapeÅ‚niony dysk?" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: write error (%s)" msgstr "BÅÄ„D: błąd zapisu (%s)" #: sabnzbd/newsunpack.py msgid "Unpacking failed, path is too long" msgstr "Rozpakowywanie nie powiodÅ‚o siÄ™, zbyt dÅ‚uga Å›cieżka" #: sabnzbd/newsunpack.py [Error message] msgid "ERROR: path too long (%s)" msgstr "BÅÄ„D: zbyt dÅ‚uga Å›cieżka (%s)" #: sabnzbd/newsunpack.py msgid "Unusable RAR file" msgstr "Bezużyteczny plik RAR" #: sabnzbd/newsunpack.py msgid "Corrupt RAR file" msgstr "" #: sabnzbd/newsunpack.py msgid "%s files in %s" msgstr "%s plików w %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running unzip() on %s" msgstr "Błąd \"%s\" podczas uruchamiania unzip() na %s" #: sabnzbd/newsunpack.py msgid "No 7za binary found, cannot unpack \"%s\"" msgstr "" #: sabnzbd/newsunpack.py msgid "Trying 7zip with password \"%s\"" msgstr "Próba rozpakowania archiwum 7zip z użyciem hasÅ‚a \"%s\"" #: sabnzbd/newsunpack.py msgid "7ZIP set \"%s\" is incomplete, cannot unpack" msgstr "Zestaw 7zip \"%s\" jest niekompletny, nie można rozpakować" #: sabnzbd/newsunpack.py msgid "Could not unpack %s" msgstr "Nie można rozpakować %s" #: sabnzbd/newsunpack.py msgid "Quick Checking" msgstr "Szybkie sprawdzanie" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "repair"] # sabnzbd/skintext.py msgid "Repair" msgstr "Naprawa" #: sabnzbd/newsunpack.py msgid "[%s] Quick Check OK" msgstr "[%s] Szybkie sprawdzenie OK" #: sabnzbd/newsunpack.py msgid "Starting Repair" msgstr "Rozpoczynanie naprawy" #: sabnzbd/newsunpack.py msgid "Repairing failed, %s" msgstr "Naprawa nie powiodÅ‚a siÄ™, %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error %s while running par2_repair on set %s" msgstr "Błąd %s podczas uruchamiania par2_repair na zestawie %s" #: sabnzbd/newsunpack.py [Error message] msgid "Error \"%s\" while running par2_repair on set %s" msgstr "Błąd \"%s\" podczas wykonywania par2_repair na zestawie %s" #: sabnzbd/newsunpack.py msgid "" "[%s] PAR2 received incorrect options, check your Config->Switches settings" msgstr "" "[%s] PAR2 otrzymaÅ‚ nieprawidÅ‚owe opcje, sprawdź ustawienia w sekcji " "Konfiguracja->Przełączniki" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, all files correct" msgstr "[%s] Zweryfikowano w %s, wszystkie pliki prawidÅ‚owe" #: sabnzbd/newsunpack.py msgid "[%s] Verified in %s, repair is required" msgstr "[%s] Zweryfikowano w %s, wymagana naprawa" #: sabnzbd/newsunpack.py msgid "" "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair" msgstr "" #: sabnzbd/newsunpack.py msgid "Fetching %s blocks..." msgstr "Pobieranie %s bloków..." #: sabnzbd/newsunpack.py msgid "Fetching" msgstr "Pobieranie" #: 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 msgid "Repairing" msgstr "Naprawianie" #: sabnzbd/newsunpack.py msgid "[%s] Repaired in %s" msgstr "[%s] Naprawiono w %s" #: sabnzbd/newsunpack.py msgid "Verifying repair" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/notifier.py [Notification] msgid "Disk full" msgstr "Dysk peÅ‚ny" #: sabnzbd/newsunpack.py msgid "Verifying" msgstr "Weryfikowanie" #: sabnzbd/newsunpack.py msgid "Checking extra files" msgstr "" #: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status] msgid "Checking" msgstr "Sprawdzanie" #: sabnzbd/newsunpack.py [Error message] msgid "[%s] The command in build_command is undefined." msgstr "" #: sabnzbd/newsunpack.py [Error message] msgid "Python script \"%s\" does not have execute (+x) permission set" msgstr "" #: sabnzbd/newswrapper.py msgid "This server does not allow SSL on this port" msgstr "Serwer nie obsÅ‚uguje SSL na tym porcie" #: sabnzbd/newswrapper.py msgid "" "Certificate hostname mismatch: the server hostname is not listed in the " "certificate. This is a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Certificate not valid. This is most probably a server issue." msgstr "" #: sabnzbd/newswrapper.py msgid "Server %s uses an untrusted certificate [%s]" msgstr "" #: sabnzbd/newswrapper.py # sabnzbd/skintext.py [Main menu item] msgid "Wiki" msgstr "Wiki" #: sabnzbd/notifier.py [Notification] msgid "Startup/Shutdown" msgstr "Uruchomienie/Wyłączenie" #: sabnzbd/notifier.py [Notification] # sabnzbd/skintext.py [Config->RSS after adding to queue] msgid "Added NZB" msgstr "Dodano NZB" #: sabnzbd/notifier.py msgid "Post-processing started" msgstr "Uruchomiono przetwarzanie koÅ„cowe" #: sabnzbd/notifier.py [Notification] msgid "Job finished" msgstr "Zadanie ukoÅ„czone" #: sabnzbd/notifier.py [Notification] msgid "Job failed" msgstr "Zadanie nie powiodÅ‚o siÄ™" #: sabnzbd/notifier.py [Notification] # sabnzbd/postproc.py msgid "Queue finished" msgstr "Kolejka ukoÅ„czona" #: sabnzbd/notifier.py [Notification] msgid "Other Messages" msgstr "Inne komunikaty" #: sabnzbd/notifier.py # sabnzbd/skintext.py msgid "Not available" msgstr "NiedostÄ™pne" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send Prowl message" msgstr "Błąd wysyÅ‚ania wiadomoÅ›ci Prowl" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushover (%s): %s" msgstr "ZÅ‚a odpowiedź od Pushover (%s): %s" #: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] msgid "Failed to send pushover message" msgstr "Nie udaÅ‚o siÄ™ wysÅ‚ać wiadomoÅ›ci Pushover" #: sabnzbd/notifier.py [Error message] msgid "Bad response from Pushbullet (%s): %s" msgstr "ZÅ‚a odpowiedź od Pushbullet (%s): %s" #: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py msgid "Failed to send pushbullet message" msgstr "Nie udaÅ‚o siÄ™ wysÅ‚ać wiadomoÅ›ci Pushbullet" #: sabnzbd/notifier.py [Error message] # sabnzbd/notifier.py msgid "Script returned exit code %s and output \"%s\"" msgstr "" #: sabnzbd/notifier.py msgid "Notification script \"%s\" does not exist" msgstr "" #: sabnzbd/notifier.py msgid "Failed to send Windows notification" msgstr "" #: sabnzbd/nzbparser.py [Warning message] msgid "Failed to import %s files from %s" msgstr "Nie udaÅ‚o siÄ™ zaimportować %s plików z %s" #: sabnzbd/nzbqueue.py [Error message] msgid "Incompatible queuefile found, cannot proceed" msgstr "Znaleziono niekompatybilny plik kolejki, nie można kontynuować" #: sabnzbd/nzbqueue.py [Error message] msgid "Error loading %s, corrupt file detected" msgstr "Błąd Å‚adowania %s, wykryto uszkodzony plik" #: sabnzbd/nzbqueue.py msgid "NZB added to queue" msgstr "NZB dodany do kolejki" #: sabnzbd/nzbqueue.py [Warning message] msgid "%s -> Unknown encoding" msgstr "%s -> Nieznane kodowanie" #: sabnzbd/nzbstuff.py [Warning message] msgid "Incomplete NZB file %s" msgstr "Niekompletny plik NZB %s" #: sabnzbd/nzbstuff.py [Warning message] msgid "Invalid NZB file %s, skipping (reason=%s, line=%s)" msgstr "NieprawidÅ‚owy plik NZB %s, pomijam (powód=%s, linia=%s)" #: sabnzbd/nzbstuff.py msgid "Empty NZB file %s" msgstr "Pusty plik NZB %s" #: sabnzbd/nzbstuff.py msgid "Pre-queue script marked job as failed" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Ignoring duplicate NZB \"%s\"" msgstr "IgnorujÄ™ zduplikowany NZB \"%s\"" #: sabnzbd/nzbstuff.py [Warning message] msgid "Failing duplicate NZB \"%s\"" msgstr "" #: sabnzbd/nzbstuff.py # sabnzbd/nzbstuff.py [Warning message] msgid "Duplicate NZB" msgstr "" #: sabnzbd/nzbstuff.py [Warning message] msgid "Pausing duplicate NZB \"%s\"" msgstr "WstrzymujÄ™ zduplikowany NZB \"%s\"" #: sabnzbd/nzbstuff.py msgid "Aborted, cannot be completed" msgstr "Przerwano, nie można ukoÅ„czyć" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "DUPLICATE" msgstr "DUPLIKAT" #: sabnzbd/nzbstuff.py [Queue indicator for encrypted job] # sabnzbd/skintext.py msgid "ENCRYPTED" msgstr "ZASZYFROWANY" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "TOO LARGE" msgstr "ZA DUÅ»Y" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "INCOMPLETE" msgstr "NIEKOMPLETNY" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "UNWANTED" msgstr "NIEPOŻĄDANY" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "FILTERED" msgstr "ODFILTROWANE" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py msgid "WAIT %s sec" msgstr "CZEKAM %s s" #: sabnzbd/nzbstuff.py msgid "PROPAGATING %s min" msgstr "" #: sabnzbd/nzbstuff.py msgid "Downloaded in %s at an average of %sB/s" msgstr "Pobrano w %s ze Å›redniÄ… %sB/s" #: sabnzbd/nzbstuff.py # sabnzbd/skintext.py [Job details page, file age column header] msgid "Age" msgstr "Wiek" #: sabnzbd/nzbstuff.py msgid "%s articles were malformed" msgstr "%s artykułów byÅ‚o uszkodzonych" #: sabnzbd/nzbstuff.py msgid "%s articles were missing" msgstr "BrakowaÅ‚o %s artykułów" #: sabnzbd/nzbstuff.py msgid "%s articles had non-matching duplicates" msgstr "%s artykułów posiadaÅ‚o niepasujÄ…ce duplikaty" #: sabnzbd/nzbstuff.py msgid "%s articles were removed" msgstr "%s artykułów zostaÅ‚o usuniÄ™tych" #: sabnzbd/nzbstuff.py [Error message] msgid "Error importing %s" msgstr "Błąd importu %s" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Footer: indicator of warnings] msgid "Warnings" msgstr "Ostrzeżenia" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Idle" msgstr "Bezczynny" #: sabnzbd/osxmenu.py msgid "Configuration" msgstr "Konfiguracja" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Queue" msgstr "Kolejka" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Queue page button] msgid "Purge Queue" msgstr "Czyszczenie kolejki" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [Main menu item] msgid "History" msgstr "Historia" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [History page button] # sabnzbd/skintext.py msgid "Purge History" msgstr "Wyczyść historiÄ™" #: sabnzbd/osxmenu.py msgid "Limit Speed" msgstr "Ogranicz prÄ™dkość" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Pause downloading] # sabnzbd/skintext.py [Four way switch for duplicates] # sabnzbd/skintext.py [Config->Scheduling] msgid "Pause" msgstr "Wstrzymaj" #: sabnzbd/osxmenu.py msgid "min." msgstr "min." #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Resume downloading] # sabnzbd/skintext.py [Config->Scheduling] msgid "Resume" msgstr "Wznów" #: sabnzbd/osxmenu.py # sabnzbd/skintext.py [#: Config->Scheduler] msgid "Scan watched folder" msgstr "Przeszukaj obserwowany katalog" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Read all RSS feeds" msgstr "Czytaj wszystkie kanaÅ‚y RSS" #: sabnzbd/osxmenu.py msgid "Complete Folder" msgstr "Katalog zakoÅ„czonych" #: sabnzbd/osxmenu.py msgid "Incomplete Folder" msgstr "Katalog niezakoÅ„czonych" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Troubleshoot" msgstr "RozwiÄ…zywanie problemów" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py # sabnzbd/skintext.py [Config->Scheduling] msgid "Restart" msgstr "Uruchom ponownie" #: sabnzbd/osxmenu.py # sabnzbd/sabtray.py msgid "Restart without login" msgstr "Restart bez logowania" #: sabnzbd/osxmenu.py msgid "Quit" msgstr "ZakoÅ„cz" #: sabnzbd/osxmenu.py msgid "Queue First 10 Items" msgstr "Zakolejkuj 10 pierwszych" #: sabnzbd/osxmenu.py msgid "Empty" msgstr "Brak" #: sabnzbd/osxmenu.py msgid "History Last 10 Items" msgstr "10 ostatnich" #: sabnzbd/osxmenu.py msgid "New release available" msgstr "DostÄ™pne jest nowe wydanie" #: sabnzbd/osxmenu.py msgid "Go to wizard" msgstr "Uruchom kreatora konfiguracji" #: sabnzbd/osxmenu.py msgid "Stopping..." msgstr "Zatrzymywanie..." #: sabnzbd/panic.py msgid "Problem with" msgstr "Problem z" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a free tcp/ip port for its internal web server.
\n" " Port %s on %s was tried , but it is not available.
\n" " Some other software uses the port or SABnzbd is already running.
\n" "
\n" " Please restart SABnzbd with a different port number." msgstr "" "\n" " SABnzbd wymaga wolnego portu TCP/IP dla wewnętrznego serwera WWW.
\n" " Próbowano użyć portu %s na %s, ale nie jest on dostępny.
\n" " Inny program używa tego portu lub SABnzbd jest już uruchomiony.
\n" "
\n" " Uruchom ponownie SABnzbd używając innego numeru portu." #: sabnzbd/panic.py msgid "" "If you get this error message again, please try a different number.
" msgstr "" "Jeśli ponownie otrzymasz ten sam błąd, spróbuj zmienić numer portu.
" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd needs a valid host address for its internal web server.
\n" " You have specified an invalid address.
\n" " Safe values are localhost and 0.0.0.0
\n" "
\n" " Please restart SABnzbd with a proper host address." msgstr "" "\n" " SABnzbd wymaga prawidłowego adresu hosta dla wewnętrznego serwera " "WWW.
\n" " Podano nieprawidłowy adres.
\n" " Bezpieczne wartości to localhost i 0.0.0.0
\n" "
\n" " Uruchom ponownie SABnzbd używając prawidłowego adresu hosta." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected saved data from an other SABnzbd version
\n" " but cannot re-use the data of the other program.

\n" " You may want to finish your queue first with the other program.

\n" " After that, start this program with the \"--clean\" option.
\n" " This will erase the current queue and history!
\n" " SABnzbd read the file \"%s\"." msgstr "" "\n" " SABnzbd wykrył dane zapisane w innej wersji SABnzbd
\n" " lecz nie może ponownie użyć tych danych.

\n" " Zaleca się zakończenie pobierania kolejki w innym programie.

\n" " Następnie należy uruchomić SABnzbd z opcją \"--clean\".
\n" " Spowoduje to wymazanie aktualnej kolejki i historii!
\n" " SABnzbd czyta plik \"%s\"." #: sabnzbd/panic.py msgid "" "\n" " SABnzbd cannot find its web interface files in %s.
\n" " Please install the program again.
\n" "
\n" msgstr "" "\n" " SABnzbd nie może znaleźć plików interfejsu WWW w %s.
\n" " Proszę ponownie zainstalować SABnzbd.
\n" "
\n" #: sabnzbd/panic.py msgid "SABnzbd detected a fatal error:" msgstr "SABnzbd wykrył krytyczny błąd:" #: sabnzbd/panic.py msgid "" "\n" " SABnzbd detected that the file sqlite3.dll is missing.

\n" " Some poorly designed virus-scanners remove this file.
\n" " Please check your virus-scanner, try to re-install SABnzbd and complain " "to your virus-scanner vendor.
\n" "
\n" msgstr "" "\n" " SABnzbd wykrył brak pliku sqlite3.dll.

\n" " Niektóre źle działające programy antywirusowe usuwają ten plik.
\n" " Sprawdź swój program antywirusowy, spróbuj ponownie zainstalować SABnzbd " "i zgłoś problem dostawcy programu antywirusowego.
\n" "
\n" #: sabnzbd/panic.py msgid "Press Startkey+R and type the line (example):" msgstr "Naciśnij Klawisz start+R i podaj linię (przykład):" #: sabnzbd/panic.py msgid "Open a Terminal window and type the line (example):" msgstr "Otwórz okno terminala i podaj linię (przykład):" #: sabnzbd/panic.py msgid "Program did not start!" msgstr "Program się nie uruchomił!" #: sabnzbd/panic.py msgid "" "Unable to bind to port %s on %s. Some other software uses the port or " "SABnzbd is already running." msgstr "" #: sabnzbd/panic.py msgid "Fatal error" msgstr "Błąd krytyczny" #: sabnzbd/panic.py [Warning message] msgid "Cannot launch the browser, probably not found" msgstr "" "Nie można uruchomić przeglądarki, prawdopodobnie nie została znaleziona" #: sabnzbd/panic.py msgid "Access denied" msgstr "Brak dostępu" #: sabnzbd/panic.py msgid "Error %s: You need to provide a valid username and password." msgstr "Błąd %s: należy podać prawidłową nazwę użytkownika i hasło." #: sabnzbd/postproc.py [Warning message] msgid "Old queue detected, use Status->Repair to convert the queue" msgstr "" "Wykryto kolejkę w starszej wersji, użyj funkcji Status->Naprawa, aby ją " "przekonwertować" #: sabnzbd/postproc.py [Warning message] msgid "" "Completed Download Folder %s is on FAT file system, limiting maximum file " "size to 4GB" 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" #: sabnzbd/postproc.py msgid "Download failed - Not on your server(s)" msgstr "Pobieranie nieudane - Dane niedostępne na skonfigurowanych serwerach" #: sabnzbd/postproc.py msgid "Moving" msgstr "Przenoszenie" #: sabnzbd/postproc.py msgid "Sent %s to queue" msgstr "Wysłano %s do kolejki" #: sabnzbd/postproc.py [Error message] msgid "Error renaming \"%s\" to \"%s\"" msgstr "Błąd zmiany nazwy \"%s\" na \"%s\"" #: sabnzbd/postproc.py msgid "Failed to move files" msgstr "Nie udało się przenieść plików" #: sabnzbd/postproc.py msgid "Running user script %s" msgstr "Uruchamianie skryptu użytkownika %s" #: sabnzbd/postproc.py msgid "Ran %s" msgstr "Uruchomiono %s" #: sabnzbd/postproc.py msgid "Script exit code is %s" msgstr "Kod zakończenia skryptu: %s" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "More" msgstr "Więcej" #: sabnzbd/postproc.py [Error message] 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 msgid "see logfile" msgstr "sprawdź logi" #: sabnzbd/postproc.py msgid "Download Failed" msgstr "Pobieranie nie powiodło się" #: sabnzbd/postproc.py [Error message] msgid "Cleanup of %s failed." msgstr "Czyszczenie %s nie powiodło się." #: sabnzbd/postproc.py msgid "Download Completed" msgstr "Zakończono pobieranie" #: sabnzbd/postproc.py [Error message] msgid "Cannot create final folder %s" msgstr "Nie można utworzyć ostatecznego katalogu %s" #: sabnzbd/postproc.py msgid "Post-processing" msgstr "Przetwarzanie końcowe" #: sabnzbd/postproc.py msgid "[%s] No par2 sets" msgstr "[%s} Brak zestawów par2" #: sabnzbd/postproc.py msgid "Trying SFV verification" msgstr "Próba weryfikacji SFV" #: sabnzbd/postproc.py msgid "Some files failed to verify against \"%s\"" msgstr "Weryfikacja niektórych plików względem \"%s\" nie powiodła się" #: sabnzbd/postproc.py msgid "Verified successfully using SFV files" msgstr "Poprawnie zweryfikowano z użyciem plików SFV" #: sabnzbd/postproc.py msgid "Trying RAR-based verification" msgstr "" #: sabnzbd/postproc.py msgid "[%s] RAR-based verification failed: %s" msgstr "" #: sabnzbd/postproc.py # sabnzbd/skintext.py msgid "Passworded" msgstr "Zabezpieczone hasłem" #: sabnzbd/postproc.py msgid "RAR files verified successfully" msgstr "" #: sabnzbd/postproc.py msgid "RAR files failed to verify" msgstr "" #: sabnzbd/postproc.py [Error message] msgid "Removing %s failed" msgstr "Usuwanie %s nie powiodło się" #: sabnzbd/powersup.py [Error message] msgid "Failed to hibernate system" msgstr "Hibernacja systemu nie powiodła się" #: sabnzbd/powersup.py [Error message] msgid "Failed to standby system" msgstr "Wstrzymanie systemu nie powiodło się" #: sabnzbd/powersup.py [Error message] msgid "Error while shutting down system" msgstr "Wyłączenie systemu nie powiodło się" #: sabnzbd/rating.py [Warning message] msgid "Indexer id (%s) not found for ratings file" msgstr "Identyfikator indeksera (%s) nie został znaleziony w pliku ocen" #: sabnzbd/rating.py # sabnzbd/skintext.py [Address of Growl server] msgid "Server address" msgstr "Adres serwera" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "API Key" msgstr "Klucz API" #: sabnzbd/rating.py # sabnzbd/skintext.py msgid "" "This key provides identity to indexer. Check your profile on the indexer's " "website." msgstr "" #: sabnzbd/rss.py [Error message] # sabnzbd/rss.py msgid "Incorrect RSS feed description \"%s\"" msgstr "Nieprawidłowy opis kanału RSS \"%s\"" #: sabnzbd/rss.py msgid "Failed to retrieve RSS from %s: %s" msgstr "Nie udało się pobrać RSS z %s: %s" #: sabnzbd/rss.py msgid "Do not have valid authentication for feed %s" msgstr "Brak poprawnego uwierzytelnienia dla kanału %s" #: sabnzbd/rss.py msgid "Server side error (server code %s); could not get %s on %s" msgstr "Błąd po stronie serwera (kod: %s); nie udało się pobrać %s z %s" #: sabnzbd/rss.py # sabnzbd/urlgrabber.py msgid "Server %s uses an untrusted HTTPS certificate" msgstr "Serwer %s używa niezaufanego certyfikatu HTTPS" #: sabnzbd/rss.py msgid "RSS Feed %s was empty" msgstr "Kanał RSS %s był pusty" #: sabnzbd/rss.py msgid "Incompatible feed" msgstr "Niekompatybilny kanał" #: sabnzbd/rss.py [Warning message] msgid "Empty RSS entry found (%s)" msgstr "Znaleziono pusty wpis RSS (%s)" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Show interface" msgstr "Pokaż interfejs" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py msgid "Open complete folder" msgstr "Otwórz katalog zakończonych" #: sabnzbd/sabtray.py # sabnzbd/skintext.py [Queue page button or entry box] msgid "Pause for" msgstr "Wstrzymaj na" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 5 minutes" msgstr "Wstrzymaj na 5 minut" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 15 minutes" msgstr "Wstrzymaj na 15 minut" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 30 minutes" msgstr "Wstrzymaj na 30 minut" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 1 hour" msgstr "Wstrzymaj na 1 godzinę" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 3 hours" msgstr "Wstrzymaj na 2 godziny" #: sabnzbd/sabtray.py # sabnzbd/skintext.py msgid "Pause for 6 hours" msgstr "Wstrzymaj na 6 godzin" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py [Shutdown SABnzbd] # sabnzbd/skintext.py [Config->Scheduling] msgid "Shutdown" msgstr "Zakończ" #: sabnzbd/sabtray.py # sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Remaining" msgstr "Pozostało" #: sabnzbd/sabtraylinux.py # sabnzbd/skintext.py msgid "Add NZB" msgstr "Dodaj NZB" #: sabnzbd/scheduler.py [Warning message] msgid "Bad schedule %s at %s:%s" msgstr "Zły harmonogram %s o %s:%s" #: sabnzbd/scheduler.py [Warning message] msgid "Unknown action: %s" msgstr "Nieznane działanie: %s" #: sabnzbd/scheduler.py [Warning message] msgid "Schedule for non-existing server %s" msgstr "Harmonogram dla nieistniejącego serwera %s" #: sabnzbd/skintext.py [Queue status "download"] # sabnzbd/skintext.py [Post processing pick list] # sabnzbd/skintext.py [Config->RSS button "download item"] msgid "Download" msgstr "Pobierz" #: sabnzbd/skintext.py [PP phase "filejoin"] msgid "Join files" msgstr "Połącz pliki" #: sabnzbd/skintext.py [PP Source of the NZB (path or URL)] # sabnzbd/skintext.py [Where to find the SABnzbd sourcecode] msgid "Source" msgstr "Źródło" #: sabnzbd/skintext.py [PP Distribution over servers] # sabnzbd/skintext.py [Main menu item] msgid "Servers" msgstr "Serwery" #: sabnzbd/skintext.py [PP Failure message] msgid "Failure" msgstr "Niepowodzenie" #: sabnzbd/skintext.py [PP status] # sabnzbd/skintext.py msgid "Failed" msgstr "Nieudane" #: sabnzbd/skintext.py [Queue and PP status] msgid "Waiting" msgstr "Oczekuje" #: sabnzbd/skintext.py [PP status] msgid "Repairing..." msgstr "Naprawianie..." #: sabnzbd/skintext.py [PP status] msgid "Extracting..." msgstr "Rozpakowywanie..." #: sabnzbd/skintext.py [PP status] msgid "Moving..." msgstr "Przenoszenie..." #: sabnzbd/skintext.py [PP status] msgid "Running script..." msgstr "Wykonywanie skryptu..." #: sabnzbd/skintext.py [PP status] msgid "Fetching extra blocks..." msgstr "Pobieranie dodatkowych bloków..." #: sabnzbd/skintext.py [PP status] msgid "Quick Check..." msgstr "Szybkie sprawdzanie..." #: sabnzbd/skintext.py [PP status] msgid "Verifying..." msgstr "Weryfikowanie..." #: sabnzbd/skintext.py [Pseudo-PP status, in reality used for Queue-status] msgid "Downloading" msgstr "Pobieranie" #: sabnzbd/skintext.py msgid "Propagation delay" msgstr "" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Task" msgstr "Zadanie" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "disable server" msgstr "wyłącz serwer" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "enable server" msgstr "włącz serwer" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Speedlimit" msgstr "Ogranicz prędkość" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause All" msgstr "Wstrzymaj wszystkie" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Pause post-processing" msgstr "Wstrzymaj przetwarzanie końcowe" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Resume post-processing" msgstr "Wznów przetwarzanie końcowe" #: sabnzbd/skintext.py [#: Config->Scheduler] msgid "Read RSS feeds" msgstr "Czytaj kanały RSS" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove failed jobs" msgstr "Usuń nieudane zadania" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Remove completed jobs" msgstr "Usuń ukończone zadania" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause low prioirty jobs" msgstr "Wstrzymaj zadania o niskim priorytecie" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause normal prioirty jobs" msgstr "Wstrzymaj zadania o normalnym priorytecie" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Pause high prioirty jobs" msgstr "Wstrzymaj zadania o wysokim priorytecie" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume low prioirty jobs" msgstr "Wznów zadania o niskim priorytecie" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume normal prioirty jobs" msgstr "Wznów zadania o normalnym priorytecie" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Resume high prioirty jobs" msgstr "Wznów zadania o wysokim priorytecie" #: sabnzbd/skintext.py [Config->Scheduler] msgid "Enable quota management" msgstr "Włącz zarządzanie limitem" #: sabnzbd/skintext.py [Config->Scheduler] 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 [Three way switch for duplicates] msgid "Off" msgstr "Brak" #: sabnzbd/skintext.py [Prowl priority] msgid "Very Low" msgstr "Bardzo niski" #: sabnzbd/skintext.py [Prowl priority] msgid "Moderate" msgstr "Średni" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Normal" msgstr "Normalny" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "High" msgstr "Wysoki" #: sabnzbd/skintext.py [Prowl priority] msgid "Emergency" msgstr "Awaryjny" #: sabnzbd/skintext.py [Prowl priority] # sabnzbd/skintext.py [Priority pick list] # sabnzbd/skintext.py msgid "Low" msgstr "Niski" #: sabnzbd/skintext.py [Megabytes] msgid "MB" msgstr "MB" #: sabnzbd/skintext.py [Gigabytes] msgid "GB" msgstr "GB" #: sabnzbd/skintext.py [One hour] msgid "hour" msgstr "godzina" #: sabnzbd/skintext.py [Multiple hours] msgid "hours" msgstr "godziny" #: sabnzbd/skintext.py [One minute] msgid "min" msgstr "minuta" #: sabnzbd/skintext.py [Multiple minutes] msgid "mins" msgstr "minut" #: sabnzbd/skintext.py [One second] msgid "sec" msgstr "sekunda" #: sabnzbd/skintext.py [Multiple seconds] msgid "seconds" msgstr "sekund" #: sabnzbd/skintext.py msgid "day" msgstr "dzień" #: sabnzbd/skintext.py msgid "days" msgstr "dni" #: sabnzbd/skintext.py msgid "week" msgstr "tydzień" #: sabnzbd/skintext.py msgid "Month" msgstr "Miesiąc" #: sabnzbd/skintext.py msgid "Year" msgstr "Rok" #: sabnzbd/skintext.py msgid "January" msgstr "" #: sabnzbd/skintext.py msgid "February" msgstr "" #: sabnzbd/skintext.py msgid "March" msgstr "" #: sabnzbd/skintext.py msgid "April" msgstr "" #: sabnzbd/skintext.py msgid "May" msgstr "" #: sabnzbd/skintext.py msgid "June" msgstr "" #: sabnzbd/skintext.py msgid "July" msgstr "" #: sabnzbd/skintext.py msgid "August" msgstr "" #: sabnzbd/skintext.py msgid "September" msgstr "" #: sabnzbd/skintext.py msgid "October" msgstr "" #: sabnzbd/skintext.py msgid "November" msgstr "" #: sabnzbd/skintext.py msgid "December" msgstr "" #: sabnzbd/skintext.py msgid "Day of month" msgstr "Dzień miesiąca" #: sabnzbd/skintext.py msgid "This week" msgstr "Ten tydzień" #: sabnzbd/skintext.py msgid "This month" msgstr "Ten miesiąc" #: sabnzbd/skintext.py msgid "Today" msgstr "Dzisiaj" #: sabnzbd/skintext.py msgid "Total" msgstr "Razem" #: sabnzbd/skintext.py msgid "on" msgstr "włączone" #: sabnzbd/skintext.py [Config: startup parameters of SABnzbd] # sabnzbd/skintext.py [Notification Script settings] msgid "Parameters" msgstr "Parametry" #: sabnzbd/skintext.py msgid "Python Version" msgstr "Wersja Pythona" #: sabnzbd/skintext.py [Home page of the SABnzbd project] msgid "Home page" msgstr "Strona projektu" #: sabnzbd/skintext.py [Used in "IRC or IRC-Webaccess"] msgid "or" msgstr "lub" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server hostname or IP] msgid "Host" msgstr "Host" #: sabnzbd/skintext.py msgid "Comment" msgstr "Komentarz" #: sabnzbd/skintext.py msgid "Send" msgstr "Wyślij" #: sabnzbd/skintext.py msgid "Cancel" msgstr "Anuluj" #: sabnzbd/skintext.py msgid "Other" msgstr "Inne" #: sabnzbd/skintext.py msgid "Report" msgstr "Zgłoś" #: sabnzbd/skintext.py msgid "Video" msgstr "Wideo" #: sabnzbd/skintext.py msgid "Audio" msgstr "Audio" #: sabnzbd/skintext.py msgid "Not used" msgstr "Nieużywane" #: sabnzbd/skintext.py msgid "or less" msgstr "lub mniej" #: sabnzbd/skintext.py msgid "Log in" msgstr "" #: sabnzbd/skintext.py msgid "Log out" msgstr "" #: sabnzbd/skintext.py msgid "Remember me" msgstr "" #: sabnzbd/skintext.py [SABnzbd's theme line] msgid "The automatic usenet download tool" msgstr "Automatyczne narzędzie do pobierania z Usenetu" #: sabnzbd/skintext.py ["Save" button] msgid "Save" msgstr "Zapisz" #: sabnzbd/skintext.py msgid "Saving.." msgstr "Zapisywanie..." #: sabnzbd/skintext.py [Used in confirmation popups] # sabnzbd/skintext.py msgid "Are you sure?" msgstr "Czy jesteś pewien?" #: sabnzbd/skintext.py [Used in confirmation popups] msgid "Delete all downloaded files?" msgstr "Usunąć wszystkie pobrane pliki?" #: sabnzbd/skintext.py [Main menu item] msgid "Home" msgstr "Start" #: sabnzbd/skintext.py [Main menu item] msgid "Config" msgstr "Konfiguracja" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py [History table header] msgid "Status" msgstr "Status" #: sabnzbd/skintext.py [Main menu item] msgid "Help" msgstr "Pomoc" #: sabnzbd/skintext.py [Main menu item] msgid "Forum" msgstr "Forum" #: sabnzbd/skintext.py [Main menu item] msgid "IRC" msgstr "IRC" #: sabnzbd/skintext.py [Main menu item] msgid "Issues" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "Support the project, Donate!" msgstr "" #: sabnzbd/skintext.py [Main menu item] msgid "General" msgstr "Ogólne" #: sabnzbd/skintext.py [Main menu item] msgid "Folders" msgstr "Katalogi" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Switches" msgstr "Przełączniki" #: sabnzbd/skintext.py [Main menu item] msgid "Scheduling" msgstr "Harmonogram" #: sabnzbd/skintext.py [Main menu item] msgid "RSS" msgstr "RSS" #: sabnzbd/skintext.py [Main menu item] msgid "Notifications" msgstr "Powiadomienia" #: sabnzbd/skintext.py [Main menu item] msgid "Email" msgstr "Email" #: sabnzbd/skintext.py [Main menu item] msgid "Categories" msgstr "Kategorie" #: sabnzbd/skintext.py [Main menu item] msgid "Sorting" msgstr "Sortowanie" #: sabnzbd/skintext.py [Main menu item] msgid "Special" msgstr "Specjalne" #: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py msgid "Search" msgstr "Szukaj" #: sabnzbd/skintext.py msgid "Download Dir" msgstr "Katalog pobierania" #: sabnzbd/skintext.py msgid "PAUSED" msgstr "ZATRZYMANE" #: sabnzbd/skintext.py msgid "Cached %s articles (%s)" msgstr "%s artykułów (%s)" #: sabnzbd/skintext.py msgid "Sysload" msgstr "Obciążenie" #: sabnzbd/skintext.py msgid "New release %s available at" msgstr "Nowe wydanie %s dostępne na" #: sabnzbd/skintext.py msgid "Are you sure you want to shutdown SABnzbd?" msgstr "Czy na pewno wyłączyć SABnzbd?" #: sabnzbd/skintext.py [Add NZB to queue (button)] # sabnzbd/skintext.py [Add NZB to queue (header)] msgid "Add" msgstr "Dodaj" #: sabnzbd/skintext.py [Add NZB file to queue (header] msgid "Add File" msgstr "Dodaj plik" #: sabnzbd/skintext.py [Job category] msgid "Category" msgstr "Kategoria" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Queue page table column header] msgid "Processing" msgstr "Przetwarzanie" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Server priority] msgid "Priority" msgstr "Priorytet" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Repair" msgstr "+Napraw" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Unpack" msgstr "+Rozpakuj" #: sabnzbd/skintext.py [Post processing pick list] msgid "+Delete" msgstr "+Usuń" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Repair"] msgid "R" msgstr "N" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Unpack"] msgid "U" msgstr "R" #: sabnzbd/skintext.py [Post processing pick list: abbreviation for "+Delete"] msgid "D" msgstr "U" #: sabnzbd/skintext.py [Priority pick list] msgid "Force" msgstr "Wymuś" #: sabnzbd/skintext.py [Priority pick list] msgid "Stop" msgstr "Stop" #: sabnzbd/skintext.py [Add NZB Dialog] msgid "Enter URL" msgstr "Wprowadź URL" #: sabnzbd/skintext.py [Queue page selection menu] # sabnzbd/skintext.py msgid "On queue finish" msgstr "Po ukończeniu kolejki" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown PC" msgstr "Wyłącz komputer" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Standby PC" msgstr "Uśpij komputer" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Hibernate PC" msgstr "Hibernuj komputer" #: sabnzbd/skintext.py [Queue page end-of-queue action] msgid "Shutdown SABnzbd" msgstr "Wyłącz SABnzbd" #: sabnzbd/skintext.py [Queue page selection menu or entry box] msgid "Speed Limit" msgstr "Limit prędkości" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Order" msgstr "Kolejność" #: sabnzbd/skintext.py [Queue page table column header] # sabnzbd/skintext.py [Job details page] msgid "Name" msgstr "Nazwa" #: sabnzbd/skintext.py [Queue page table column header, "estimated time of arrival"] msgid "ETA" msgstr "ETA" #: sabnzbd/skintext.py [Queue page table column header, "age of the NZB"] msgid "AGE" msgstr "Wiek" #: sabnzbd/skintext.py [Queue page table, "Delete" button] msgid "Del" msgstr "Usuń" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Retry" msgstr "Ponów" #: sabnzbd/skintext.py [Queue end-of-queue selection box] msgid "Actions" msgstr "Działania" #: sabnzbd/skintext.py [Queue page table, script selection menu] msgid "Scripts" msgstr "Skrypty" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all items from the queue?" msgstr "Usunąć wszystkie obiekty z kolejki?" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs" msgstr "Wyczyść NZB" #: sabnzbd/skintext.py [Queue page button] msgid "Purge NZBs & Delete Files" msgstr "Wyczyść NZB i usuń pliki" #: sabnzbd/skintext.py [Retry all failed jobs dialog box] msgid "Retry all failed jobs" msgstr "Ponów wszystkie nieudane zadania" #: sabnzbd/skintext.py [Queue page button] msgid "Remove NZB" msgstr "Usuń NZB" #: sabnzbd/skintext.py [Queue page button] # sabnzbd/skintext.py msgid "Remove NZB & Delete Files" msgstr "Usuń NZB i pliki" #: sabnzbd/skintext.py [Queue page, as in "4G *of* 10G"] msgid "of" msgstr "z" #: sabnzbd/skintext.py [Caption for missing articles in Queue] msgid "Missing articles" msgstr "Brakujące artykuły" #: sabnzbd/skintext.py [Remaining quota (displayed in Queue)] msgid "Quota left" msgstr "Pozostało limitu" #: sabnzbd/skintext.py [Manual reset of quota] msgid "manual" msgstr "ręcznie" #: sabnzbd/skintext.py msgid "Reset Quota now" msgstr "Resetuj limit" #: sabnzbd/skintext.py [Confirmation popup] msgid "Delete all completed items from History?" msgstr "Usunąć z historii wszystkie ukończone pliki?" #: sabnzbd/skintext.py [Button/link hiding History job details] msgid "Hide details" msgstr "Ukryj szczegóły" #: sabnzbd/skintext.py [Button/link showing History job details] msgid "Show details" msgstr "Pokaż szczegóły" #: sabnzbd/skintext.py [Button or link showing only failed History jobs. DON'T MAKE THIS VERY LONG!] msgid "Show Failed" msgstr "Pokaż nieudane" #: sabnzbd/skintext.py [Button or link showing all History jobs] msgid "Show All" msgstr "Pokaż wszystko" #: sabnzbd/skintext.py [History table header] # sabnzbd/skintext.py [Size of the download quota] msgid "Size" msgstr "Rozmiar" #: sabnzbd/skintext.py [Button to delete all failed jobs in History] msgid "Purge Failed NZBs" msgstr "Wyczyść nieudane NZB" #: sabnzbd/skintext.py [Button to delete all failed jobs in History, including files] msgid "Purge Failed NZBs & Delete Files" msgstr "Wyczyść nieudane NZB i usuń pliki" #: sabnzbd/skintext.py [Button to delete all completed jobs in History] msgid "Purge Completed NZBs" msgstr "Wyczyść ukończone NZB" #: sabnzbd/skintext.py [Button to delete jobs on current page in History] msgid "Purge NZBs on the current page" msgstr "" #: sabnzbd/skintext.py [Button to add NZB to failed job in History] msgid "Optional Supplemental NZB" msgstr "Opcjonalne dodatkowe NZB" #: sabnzbd/skintext.py [Path as displayed in History details] msgid "Path" msgstr "Ścieżka" #: sabnzbd/skintext.py [Retry all failed jobs in History] msgid "Retry all failed" msgstr "Ponów wszystkie nieudane" #: sabnzbd/skintext.py [Retry all button for Retry All Failed Jobs] msgid "Retry All" msgstr "Ponów wszystkie" #: sabnzbd/skintext.py msgid "Virus/spam" msgstr "Wirus/spam" #: sabnzbd/skintext.py msgid "Out of retention" msgstr "Poza okresem przechowywania" #: sabnzbd/skintext.py msgid "Other problem" msgstr "Inny problem" #: sabnzbd/skintext.py [Status page button] msgid "Force Disconnect" msgstr "Wymuś rozłączenie" #: sabnzbd/skintext.py [Status page button text] msgid "" "Disconnect all active connections to usenet servers. Connections will be " "reopened after a few seconds if there are items in the queue." msgstr "" #: sabnzbd/skintext.py msgid "This will send a test email to your account." msgstr "Nastąpi wysłanie testowej wiadomości na twoje konto." #: sabnzbd/skintext.py [Status page button] msgid "Show Logging" msgstr "Pokaż logi" #: sabnzbd/skintext.py [Status page button] msgid "Test Email" msgstr "Przetestuj email" #: sabnzbd/skintext.py [Status page selection menu] msgid "Logging" msgstr "Logowanie" #: sabnzbd/skintext.py [Status page table header] msgid "Errors/Warning" msgstr "Błędy/Ostrzeżenia" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Info" msgstr "+ Informacje" #: sabnzbd/skintext.py [Status page logging selection value] msgid "+ Debug" msgstr "+ Debugowanie" #: sabnzbd/skintext.py [Status page tab header] # sabnzbd/skintext.py [Server: amount of connections] msgid "Connections" msgstr "Połączenia" #: sabnzbd/skintext.py [Status page, table header] msgid "Latest Warnings" msgstr "Ostatnie ostrzeżenia" #: sabnzbd/skintext.py [Status page button] msgid "clear" msgstr "wyczyść" #: sabnzbd/skintext.py [Status page button] # sabnzbd/skintext.py msgid "Unblock" msgstr "Odblokuj" #: sabnzbd/skintext.py [Status page, article identifier] msgid "Article identifier" msgstr "Identyfikator artykułu" #: sabnzbd/skintext.py [Status page, par-set that article belongs to] msgid "File set" msgstr "Zestaw plików" #: sabnzbd/skintext.py [Status page, table column header, when error occured] msgid "When" msgstr "Kiedy" #: sabnzbd/skintext.py [Status page, table column header, type of message] # sabnzbd/skintext.py [Config->RSS table column header] msgid "Type" msgstr "Typ" #: sabnzbd/skintext.py [Status page, indicator that server is enabled] msgid "Enabled" msgstr "Włączony" #: sabnzbd/skintext.py msgid "Dashboard" msgstr "Panel główny" #: sabnzbd/skintext.py msgid "Connection failed!" msgstr "Połączenie nie powiodło się!" #: sabnzbd/skintext.py msgid "Local IPv4 address" msgstr "Lokalny adres IPv4" #: sabnzbd/skintext.py msgid "Public IPv4 address" msgstr "Publiczny adres IPv4" #: sabnzbd/skintext.py msgid "IPv6 address" msgstr "Adres IPv6" #: sabnzbd/skintext.py msgid "Nameserver / DNS Lookup" msgstr "Serwer DNS" #: sabnzbd/skintext.py msgid "CPU Model" msgstr "Model procesora" #: sabnzbd/skintext.py [Do not translate Pystone] msgid "System Performance (Pystone)" msgstr "Wydajność systemu (Pystone)" #: sabnzbd/skintext.py msgid "Download folder speed" msgstr "Szybkość zapisu w katalogu pobierania" #: sabnzbd/skintext.py msgid "Complete folder speed" msgstr "Szybkość zapisu w katalogu zakończonych" #: sabnzbd/skintext.py msgid "Writing speed" msgstr "Szybkość zapisu" #: sabnzbd/skintext.py msgid "Could not write. Check that the directory is writable." msgstr "Zapis nie powiódł się. Sprawdź uprawnienia katalogu do zapisu." #: sabnzbd/skintext.py msgid "Internet Bandwidth" msgstr "" #: sabnzbd/skintext.py msgid "Click on Repeat test button below to determine" msgstr "Kliknij znajdujący się poniżej przycisk Powtórz test, aby zmierzyć" #: sabnzbd/skintext.py msgid "Repeat test" msgstr "Powtórz test" #: sabnzbd/skintext.py msgid "Test download" msgstr "" #: sabnzbd/skintext.py msgid "" "Adds a verified test NZB of the specified size, filled with random data. Can " "be used to verify your setup." msgstr "" #: sabnzbd/skintext.py msgid "Config File" msgstr "Plik konfiguracyjny" #: sabnzbd/skintext.py [Main config page, how much cache is in use] msgid "Used cache" msgstr "Użyta pamięć podręczna" #: sabnzbd/skintext.py msgid "" "This will restart SABnzbd.
Use it when you think the program has a " "stability problem.
Downloading will be paused before the restart and " "resume afterwards." msgstr "" "SABnzbd zostanie zrestartowane.
Użyj tej funkcji jeśli uważasz, że " "program ma problemy ze stabilnością.
Pobieranie zostanie wstrzymane " "przed restartem i wznowione po ponownym uruchomieniu." #: sabnzbd/skintext.py msgid "
If authentication is enabled, you will need to login again." msgstr "" #: sabnzbd/skintext.py msgid "Advanced" msgstr "" #: sabnzbd/skintext.py msgid "" "There are orphaned jobs in the download folder.
You can choose to " "delete them (including files) or send them back to the queue." msgstr "" "W katalogu pobierania istniejÄ… porzucone zadania.
Możesz je usunąć " "(razem z plikami) lub wysłać z powrotem do kolejki." #: sabnzbd/skintext.py msgid "" "The \"Repair\" button will restart SABnzbd and do a complete
reconstruction of the queue content, preserving already downloaded " "files.
This will modify the queue order." msgstr "" "Przycisk \"Napraw\" ponownie uruchomi SABnzbd i spowoduje kompletne
odtworzenie zawartości kolejki, z zachowaniem już pobranych plików.
Kolejność elementów kolejki zostanie zmieniona." #: sabnzbd/skintext.py msgid "Changes have not been saved, and will be lost." msgstr "Nie zachowano zmian, zostanÄ… one utracone." #: sabnzbd/skintext.py msgid "" "When your IP address changes or SABnzbd is restarted the session will expire." msgstr "" #: sabnzbd/skintext.py msgid "Enable Unzip" msgstr "Włącz unzip" #: sabnzbd/skintext.py msgid "Enable 7zip" msgstr "Włącz 7zip" #: sabnzbd/skintext.py msgid "Multicore Par2" msgstr "" #: sabnzbd/skintext.py msgid "" "Secure (SSL) connections from SABnzbd to newsservers and HTTPS websites will " "be encrypted, however, validating a server's identity using its certificates " "is not possible. OpenSSL 1.0.2 or above and up-to-date local CA certificates " "are required." msgstr "" #: sabnzbd/skintext.py msgid "" "Speed up repairs by installing multicore Par2, it is available for many " "platforms." msgstr "" #: sabnzbd/skintext.py msgid "Version" msgstr "Wersja" #: sabnzbd/skintext.py msgid "Uptime" msgstr "Czas dziaÅ‚ania" #: sabnzbd/skintext.py [Indicates that server is Backup server in Status page] msgid "Backup" msgstr "Zapasowy" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Notification Script settings] msgid "Read the Wiki Help on this!" msgstr "Przeczytaj o tym w Wiki!" #: sabnzbd/skintext.py msgid "Restarting SABnzbd..." msgstr "Restartowanie SABnzbd..." #: sabnzbd/skintext.py msgid "Changes will require a SABnzbd restart!" msgstr "Zmiany wymagajÄ… restartu SABnzbd!" #: sabnzbd/skintext.py msgid "SABnzbd Web Server" msgstr "Serwer WWW SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Host" msgstr "Adres hosta SABnzbd" #: sabnzbd/skintext.py msgid "Host SABnzbd should listen on." msgstr "Host, na którym ma nasÅ‚uchiwać SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Port" msgstr "Port SABnzbd" #: sabnzbd/skintext.py msgid "Port SABnzbd should listen on." msgstr "Port, na którym ma nasÅ‚uchiwać SABnzbd" #: sabnzbd/skintext.py msgid "Web Interface" msgstr "Interfejs WWW" #: sabnzbd/skintext.py msgid "Choose a skin." msgstr "Wybierz skórkÄ™" #: sabnzbd/skintext.py msgid "SABnzbd Username" msgstr "Użytkownik SABnzbd" #: sabnzbd/skintext.py msgid "Optional authentication username." msgstr "Opcjonalna nazwa użytkownika" #: sabnzbd/skintext.py msgid "SABnzbd Password" msgstr "HasÅ‚o SABnzbd" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable HTTPS" msgstr "Włącz HTTPS" #: sabnzbd/skintext.py msgid "not installed" msgstr "nie zainstalowane" #: sabnzbd/skintext.py msgid "Enable accessing the interface from a HTTPS address." msgstr "Włącz dostÄ™p do interfejsu przez HTTPS" #: sabnzbd/skintext.py msgid "HTTPS Port" msgstr "Port HTTPS" #: sabnzbd/skintext.py msgid "If empty, the standard port will only listen to HTTPS." msgstr "" "JeÅ›li pole bÄ™dzie puste, standardowy port bÄ™dzie obsÅ‚ugiwaÅ‚ tylko HTTPS" #: sabnzbd/skintext.py msgid "HTTPS Certificate" msgstr "Certyfikat HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Certificate." msgstr "Nazwa pliku lub Å›cieżka do certyfikatu HTTPS" #: sabnzbd/skintext.py msgid "" "Generate new self-signed certificate and key. Requires SABnzbd restart!" msgstr "" #: sabnzbd/skintext.py msgid "HTTPS Key" msgstr "Klucz HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Key." msgstr "Nazwa pliku lub Å›cieżka do klucza HTTPS" #: sabnzbd/skintext.py msgid "HTTPS Chain Certifcates" msgstr "ÅaÅ„cuch certyfikatów HTTPS" #: sabnzbd/skintext.py msgid "File name or path to HTTPS Chain." msgstr "Nazwa pliku lub Å›cieżka do Å‚aÅ„cucha certyfikatów HTTPS" #: sabnzbd/skintext.py msgid "Tuning" msgstr "Strojenie" #: sabnzbd/skintext.py msgid "RSS Checking Interval" msgstr "InterwaÅ‚ sprawdzania RSS" #: sabnzbd/skintext.py msgid "" "Checking interval (in minutes, at least 15). Not active when you use the " "Scheduler!" msgstr "" "InterwaÅ‚ sprawdzania (w minutach, co najmniej 15). Nieużywany podczas " "korzystania z harmonogramu!" #: sabnzbd/skintext.py msgid "Maximum line speed" msgstr "Maksymalna przepustowość łącza" #: sabnzbd/skintext.py msgid "Percentage of line speed" msgstr "Procent przepustowoÅ›ci łącza" #: sabnzbd/skintext.py msgid "Which percentage of the linespeed should SABnzbd use, e.g. 50" msgstr "" "Jaki procent dostÄ™pnej przepustowoÅ›ci ma wykorzystywać SABnzbd, np. 50" #: sabnzbd/skintext.py msgid "Article Cache Limit" msgstr "Limit pamiÄ™ci podrÄ™cznej artykułów" #: sabnzbd/skintext.py msgid "" "Cache articles in memory to reduce disk access.
In bytes, optionally " "follow with K,M,G. For example: \"64M\" or \"128M\"" msgstr "" "Umieszcza artykuły w pamięci podręcznej, aby ograniczyć częstotliwość " "dostępu do dysku.
W bajtach, opcjonalnie z przyrostkiem K, M, G. " "Przykład: \"64M\" lub \"128M\"" #: sabnzbd/skintext.py msgid "Cleanup List" msgstr "Lista czyszczenia" #: sabnzbd/skintext.py msgid "" "List of file extensions that should be deleted after download.
For " "example: nfo or nfo, sfv" msgstr "" "Lista rozszerzeń plików, które mają zostać usunięte po pobraniu.
Na " "przykład: nfo lub nfo, sfv" #: sabnzbd/skintext.py msgid "History Retention" msgstr "" #: sabnzbd/skintext.py msgid "" "Automatically delete completed jobs from History. Beware that Duplicate " "Detection and some external tools rely on History information." msgstr "" #: sabnzbd/skintext.py msgid "Keep all jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep maximum number of completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Keep completed jobs maximum number of days" msgstr "" #: sabnzbd/skintext.py msgid "Do not keep any completed jobs" msgstr "" #: sabnzbd/skintext.py msgid "Jobs" msgstr "" #: sabnzbd/skintext.py msgid "Save Changes" msgstr "Zapisz zmiany" #: sabnzbd/skintext.py msgid "Restore Defaults" msgstr "" #: sabnzbd/skintext.py msgid "Reset" msgstr "Resetuj" #: sabnzbd/skintext.py msgid "Language" msgstr "Język" #: sabnzbd/skintext.py msgid "Select a web interface language." msgstr "Wybierz język interfejsu WWW" #: sabnzbd/skintext.py msgid "" "Help us translate SABnzbd in your language!
Add untranslated texts or " "improved existing translations here:" msgstr "" #: sabnzbd/skintext.py msgid "This key will give 3rd party programs full access to SABnzbd." msgstr "Ten klucz umożliwi innym programom dostęp do SABnzbd" #: sabnzbd/skintext.py msgid "NZB Key" msgstr "Klucz NZB" #: sabnzbd/skintext.py msgid "This key will allow 3rd party programs to add NZBs to SABnzbd." msgstr "Ten klucz umożliwi innym programom dodawanie plików NZB do SABnzbd" #: sabnzbd/skintext.py msgid "Generate New Key" msgstr "Utwórz nowy klucz" #: sabnzbd/skintext.py [Explanation for QR code of APIKEY] msgid "API Key QR Code" msgstr "Kod QR klucza API" #: sabnzbd/skintext.py msgid "List of local network ranges" msgstr "Lista zakresów sieci lokalnych" #: sabnzbd/skintext.py msgid "" "All local network addresses start with these prefixes (often \"192.168.1.\")" msgstr "" "Wszystkie lokalne adresy sieciowe zaczynają się od tych prefiksów (często " "\"192.168.1.\")" #: sabnzbd/skintext.py msgid "External internet access" msgstr "Dostęp z zewnątrz" #: sabnzbd/skintext.py msgid "" "You can set access rights for systems outside your local network. Requires " "List of local network ranges to be defined." msgstr "" #: sabnzbd/skintext.py msgid "No access" msgstr "Brak dostępu" #: sabnzbd/skintext.py msgid "Add NZB files " msgstr "Dodawanie plików NZB " #: sabnzbd/skintext.py msgid "API (no Config)" msgstr "API (bez Konfiguracji)" #: sabnzbd/skintext.py msgid "Full API" msgstr "Pełne API" #: sabnzbd/skintext.py msgid "Full Web interface" msgstr "Pełny interfejs WWW" #: sabnzbd/skintext.py msgid "Only external access requires login" msgstr "" #: sabnzbd/skintext.py msgid "" "NOTE: Folders will be created automatically when Saving. You may " "use absolute paths to save outside of the default folders." msgstr "" "UWAGA: Katalogi zostaną automatycznie utworzone po zapisaniu zmian. " "Możesz użyć ścieżek absolutnych, aby wskazać lokalizację poza domyślnym " "katalogiem bazowym." #: sabnzbd/skintext.py msgid "User Folders" msgstr "Katalogi użytkownika" #: sabnzbd/skintext.py msgid "Browse" msgstr "Przeglądaj" #: sabnzbd/skintext.py msgid "In" msgstr "W" #: sabnzbd/skintext.py msgid "Temporary Download Folder" msgstr "Tymczasowy katalog pobierania" #: sabnzbd/skintext.py msgid "" "Location to store unprocessed downloads.
Can only be changed when " "queue is empty." msgstr "" "Miejsce przechowywania nieprzetworzonych plików.
Można zmienić tylko " "kiedy kolejka jest pusta." #: sabnzbd/skintext.py msgid "Minimum Free Space for Temporary Download Folder" msgstr "Minimalna ilość wolnego miejsca w tymczasowym katalogu pobierania" #: sabnzbd/skintext.py msgid "" "Auto-pause when free space is beneath this value.
In bytes, " "optionally follow with K,M,G,T. For example: \"800M\" or \"8G\"" msgstr "" "Automatycznie wstrzymaj pobieranie, jeśli pozostanie mniej miejsca niż " "podano.
W bajtach, opcjonalnie z przyrostkiem K, M, G, T. Przykład: " "\"800M\" lub \"8G\"" #: sabnzbd/skintext.py msgid "Completed Download Folder" msgstr "Katalog dla ukończonych plików" #: sabnzbd/skintext.py msgid "" "Location to store finished, fully processed downloads.
Can be " "overruled by user-defined categories." msgstr "" "Miejsce przechowywania ukończonych, przetworzonych plików.
Może " "zostać zmienione przez ustawienia kategorii." #: sabnzbd/skintext.py msgid "Permissions for completed downloads" msgstr "Uprawnienia dla ukończonych plików" #: sabnzbd/skintext.py msgid "" "Set permissions pattern for completed files/folders.
In octal " "notation. For example: \"755\" or \"777\"" msgstr "" "Ustawienia podane uprawnienia dla pobranych plików/katalogów.
W " "notacji ósemkowej. Przykład: \"775\" lub \"777\"" #: sabnzbd/skintext.py msgid "Watched Folder" msgstr "Obserwowany katalog" #: sabnzbd/skintext.py msgid "" "Folder to monitor for .nzb files.
Also scans .zip .rar and .tar.gz " "archives for .nzb files." msgstr "" "Katalog monitorowany w poszukiwaniu plików .nzb.
Skanowane są " "również pliki .zip, .rar oraz .tar.gz." #: sabnzbd/skintext.py msgid "Watched Folder Scan Speed" msgstr "Częstotliwość skanowania katalogu obserwowanego" #: sabnzbd/skintext.py msgid "Number of seconds between scans for .nzb files." msgstr "Ilość sekund pomiędzy kolejnymi skanami w poszukiwaniu plików .nzb" #: sabnzbd/skintext.py msgid "Scripts Folder" msgstr "" #: sabnzbd/skintext.py msgid "Folder containing user scripts." msgstr "" #: sabnzbd/skintext.py msgid "Email Templates Folder" msgstr "Katalog szablonów email" #: sabnzbd/skintext.py msgid "Folder containing user-defined email templates." msgstr "" "Katalog zawierający zdefiniowane przez użytkownika szablony powiadomień email" #: sabnzbd/skintext.py msgid "Password file" msgstr "Plik z hasłami" #: sabnzbd/skintext.py msgid "File containing all passwords to be tried on encrypted RAR files." msgstr "" "Plik zawierający wszystkie hasła, które będą używane do rozpakowywania " "zaszyfrowanych plików RAR" #: sabnzbd/skintext.py msgid "System Folders" msgstr "Katalogi systemowe" #: sabnzbd/skintext.py msgid "Administrative Folder" msgstr "Katalog administracyjny" #: sabnzbd/skintext.py msgid "" "Location for queue admin and history database.
Can only be changed " "when queue is empty." msgstr "" "Lokalizacja bazy danych administracyjnych i historycznych kolejki.
Można zmienić tylko kiedy kolejka jest pusta." #: sabnzbd/skintext.py msgid "Data will not be moved. Requires SABnzbd restart!" msgstr "" "Dane nie zostaną przeniesione. Wymaga restartu SABnzbd!" #: sabnzbd/skintext.py msgid "Log Folder" msgstr "Katalog logów" #: sabnzbd/skintext.py msgid "" "Location of log files for SABnzbd.
Requires SABnzbd restart!" msgstr "Lokalizacja logów SABnzbd.
Wymaga restartu SABnzbd!" #: sabnzbd/skintext.py msgid ".nzb Backup Folder" msgstr "Katalog kopii zapasowych .nzb" #: sabnzbd/skintext.py msgid "Location where .nzb files will be stored." msgstr "Miejsce przechowywania plików .nzb" #: sabnzbd/skintext.py msgid "Default Base Folder" msgstr "Domyślny katalog bazowy" #: sabnzbd/skintext.py msgid "Download all par2 files" msgstr "Pobierz wszystkie pliki par2" #: sabnzbd/skintext.py msgid "" "This prevents multiple repair runs by downloading all par2 files when needed." msgstr "" #: sabnzbd/skintext.py msgid "Enable recursive unpacking" msgstr "Włącz rekursywne rozpakowywanie" #: sabnzbd/skintext.py msgid "Unpack archives (rar, zip, 7z) within archives." msgstr "Rozpakowuj archiwa (rar, zip, 7z) wewnątrz archiwów" #: sabnzbd/skintext.py msgid "Ignore any folders inside archives" msgstr "Ignoruj foldery wewnątrz archiwów" #: sabnzbd/skintext.py msgid "All files will go into a single folder." msgstr "Wszystkie pliki zostaną rozpakowane do jednego folderu" #: sabnzbd/skintext.py msgid "Only Get Articles for Top of Queue" msgstr "Pobieraj artykuły tylko dla pierwszego pliku w kolejce" #: sabnzbd/skintext.py msgid "" "Enable for less memory usage. Disable to prevent slow jobs from blocking the " "queue." msgstr "" "Włącz, aby zmniejszyć użycie pamięci. Wyłącz, aby zapobiec blokowaniu " "kolejki przez powolne zadania." #: sabnzbd/skintext.py msgid "Post-Process Only Verified Jobs" msgstr "Przetwarzanie końcowe tylko dla zweryfikowanych zadań" #: sabnzbd/skintext.py msgid "Only perform post-processing on jobs that passed all PAR2 checks." msgstr "" "Uruchom przetwarzanie końcowe tylko dla zadań, które zostały sprawdzone przy " "użyciu PAR2" #: sabnzbd/skintext.py msgid "Action when encrypted RAR is downloaded" msgstr "Działanie dla zaszyfrowanych plików RAR" #: sabnzbd/skintext.py msgid "" "In case of \"Pause\", you'll need to set a password and resume the job." msgstr "" "Jeśli wybrano \"Wstrzymaj\", będzie trzeba ustawić hasło i wznowić zadanie" #: sabnzbd/skintext.py msgid "Detect Duplicate Downloads" msgstr "Działanie dla duplikatów" #: sabnzbd/skintext.py msgid "" "Detect identical NZB files (based on items in your History or files in .nzb " "Backup Folder)" msgstr "" #: sabnzbd/skintext.py msgid "Detect duplicate episodes in series" msgstr "Wykryj zduplikowane odcinki seriali" #: sabnzbd/skintext.py 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 "Odrzuć" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Fail job (move to History)" msgstr "" #: sabnzbd/skintext.py [Four way switch for duplicates] msgid "Tag job" msgstr "" #: sabnzbd/skintext.py [Three way switch for encrypted posts] msgid "Abort" msgstr "Przerwij" #: sabnzbd/skintext.py msgid "Action when unwanted extension detected" msgstr "Działanie dla niepożądanych rozszerzeń" #: sabnzbd/skintext.py msgid "Action when an unwanted extension is detected in RAR files" msgstr "" "Działanie, które zostanie podjęte po wykryciu w pliku RAR niepożądanego " "rozszerzenia" #: sabnzbd/skintext.py msgid "Unwanted extensions" msgstr "Niepożądane rozszerzenia" #: sabnzbd/skintext.py msgid "" "List all unwanted extensions. For example: exe or exe, com" msgstr "" "Lista niepożądanych rozszerzeń. Przykład: exe lub exe, com" #: sabnzbd/skintext.py msgid "Enable SFV-based checks" msgstr "Włącz sprawdzanie przy użyciu SFV" #: sabnzbd/skintext.py msgid "Do an extra verification based on SFV files." msgstr "Wykonuj dodatkową weryfikację na podstawie plików SFV" #: sabnzbd/skintext.py msgid "User script can flag job as failed" msgstr "Skrypty użytkownika mogą oznaczyć zadanie jako nieudane" #: sabnzbd/skintext.py msgid "" "When the user script returns a non-zero exit code, the job will be flagged " "as failed." msgstr "" "Jeśli skrypt użytkownika zwróci niezerowy kod zakończenia, zadanie zostanie " "oznaczone jako nieudane" #: sabnzbd/skintext.py msgid "On failure, try alternative NZB" msgstr "Użyj alternatywnego NZB w razie niepowodzenia" #: sabnzbd/skintext.py msgid "Some servers provide an alternative NZB when a download fails." msgstr "" "Niektóre serwery udostępniają alternatywne NZB, kiedy pobieranie kończy się " "niepowodzeniem" #: sabnzbd/skintext.py msgid "Use tags from indexer" msgstr "" #: sabnzbd/skintext.py msgid "" "When sorting, use tags from indexer for title, season, episode, etc. " "Otherwise all naming is derived from the NZB name." msgstr "" #: sabnzbd/skintext.py msgid "Enable folder rename" msgstr "Włącz zmianę nazw katalogów" #: sabnzbd/skintext.py msgid "" "Use temporary names during post processing. Disable when your system doesn't " "handle that properly." msgstr "" "Używaj tymczasowych nazw podczas przetwarzania końcowego. Należy wyłączyć tę " "opcję, jeśli system nie obsługuje jej prawidłowo." #: sabnzbd/skintext.py msgid "Pre-queue user script" msgstr "Skrypt użytkownika przed zakolejkowaniem" #: sabnzbd/skintext.py msgid "Used before an NZB enters the queue." msgstr "Uruchamiany zanim plik NZB zostanie umieszczony w kolejce" #: sabnzbd/skintext.py msgid "Extra PAR2 Parameters" msgstr "Dodatkowe parametry PAR2" #: sabnzbd/skintext.py msgid "Nice Parameters" msgstr "Parametry nice" #: sabnzbd/skintext.py msgid "IONice Parameters" msgstr "Parametry IONice" #: sabnzbd/skintext.py msgid "External process priority" msgstr "" #: sabnzbd/skintext.py msgid "Disconnect on Empty Queue" msgstr "Rozłącz przy pustej kolejce" #: sabnzbd/skintext.py msgid "Disconnect from Usenet server(s) when queue is empty or paused." msgstr "Rozłącz serwer(y) Usenet kiedy kolejka jest pusta lub wstrzymana" #: sabnzbd/skintext.py msgid "Sort by Age" msgstr "Sortuj według wieku" #: sabnzbd/skintext.py msgid "Automatically sort items by (average) age." msgstr "Automatycznie sortuj pozycje według wieku (średniego)" #: sabnzbd/skintext.py msgid "" "Posts will be paused untill they are at least this age. Setting job priority " "to Force will skip the delay." msgstr "" #: sabnzbd/skintext.py msgid "Check for New Release" msgstr "Sprawdzaj aktualizacje" #: sabnzbd/skintext.py msgid "Weekly check for new SABnzbd release." msgstr "Sprawdzaj co tydzień dostępność nowych wydań SABnzbd" #: sabnzbd/skintext.py [Pick list for weekly test for new releases] msgid "Also test releases" msgstr "także wydania testowe" #: sabnzbd/skintext.py msgid "Replace Spaces in Foldername" msgstr "Zastąp spacje w nazwach katalogów" #: sabnzbd/skintext.py msgid "Replace spaces with underscores in folder names." msgstr "Zastąp spacje w nazwach katalogów podkreśleniami" #: sabnzbd/skintext.py msgid "Replace dots in Foldername" msgstr "Zastąp kropki w nazwach katalogów" #: sabnzbd/skintext.py msgid "Replace dots with spaces in folder names." msgstr "Zastąp kropki w nazwach katalogów spacjami" #: sabnzbd/skintext.py msgid "Make Windows compatible" msgstr "Kompatybilność z Windows" #: sabnzbd/skintext.py msgid "For servers: make sure names are compatible with Windows." msgstr "Dla serwerów: zapewnij zgodność nazw z Windows" #: sabnzbd/skintext.py msgid "Launch Browser on Startup" msgstr "Uruchom przeglądarkę podczas uruchamiania" #: sabnzbd/skintext.py msgid "Launch the default web browser when starting SABnzbd." msgstr "Uruchom domyślną przeglądarkę podczas uruchamiania SABnzbd" #: sabnzbd/skintext.py msgid "Pause Downloading During Post-Processing" msgstr "Wstrzymaj pobieranie podczas przetwarzania końcowego" #: sabnzbd/skintext.py msgid "" "Pauses downloading at the start of post processing and resumes when finished." msgstr "" "Wstrzymuje pobieranie po rozpoczęciu przetwarzania końcowego i wznawia je po " "zakończeniu" #: sabnzbd/skintext.py msgid "Ignore Samples" msgstr "Działanie dla próbek" #: sabnzbd/skintext.py msgid "Filter out sample files (e.g. video samples)." msgstr "" "Działania, które zostaną podjęte dla plików próbek (np. próbek wideo)" #: sabnzbd/skintext.py msgid "Delete after download" msgstr "Usuń po pobraniu" #: sabnzbd/skintext.py msgid "HTTPS certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Verify certificates when connecting to indexers and RSS-sources using HTTPS." msgstr "" #: sabnzbd/skintext.py msgid "Server" msgstr "Serwer" #: sabnzbd/skintext.py msgid "Post processing" msgstr "Przetwarzanie końcowe" #: sabnzbd/skintext.py msgid "Naming" msgstr "Nazwy" #: sabnzbd/skintext.py msgid "Quota" msgstr "Limit pobierania" #: sabnzbd/skintext.py msgid "Indexing" msgstr "Indeksowanie" #: sabnzbd/skintext.py msgid "How much can be downloaded this month (K/M/G)" msgstr "Ile danych można pobrać w miesiącu (K/M/G)" #: sabnzbd/skintext.py [Reset day of the download quota] msgid "Reset day" msgstr "Dzień resetu" #: sabnzbd/skintext.py msgid "" "On which day of the month or week (1=Monday) does your ISP reset the quota? " "(Optionally with hh:mm)" msgstr "" "W którym dniu miesiąca lub tygodnia (1=poniedziałek) twój dostawca resetuje " "limit pobierania (opcjonalnie z gg:mm)" #: sabnzbd/skintext.py [Auto-resume download on the reset day] msgid "Auto resume" msgstr "Automatyczne wznawianie" #: sabnzbd/skintext.py msgid "Should downloading resume after the quota is reset?" msgstr "Czy pobieranie powinno zostać automatycznie wznowione w dniu resetu" #: sabnzbd/skintext.py [Does the quota get reset every day, week or month?] msgid "Quota period" msgstr "Okres limitu" #: sabnzbd/skintext.py msgid "Does the quota get reset each day, week or month?" msgstr "Czy limit jest kasowany dziennie, tygodniowo czy miesięcznie?" #: sabnzbd/skintext.py msgid "Check before download" msgstr "Sprawdź przed pobraniem" #: sabnzbd/skintext.py msgid "Try to predict successful completion before actual download (slower!)" msgstr "" "Spróbuj przewidzieć, czy pobieranie będzie udane przed jego rozpoczęciem " "(wolne!)" #: sabnzbd/skintext.py msgid "SSL Ciphers" msgstr "" #: sabnzbd/skintext.py msgid "Increase performance by forcing a lower SSL encryption strength." msgstr "" #: sabnzbd/skintext.py # sabnzbd/urlgrabber.py msgid "Maximum retries" msgstr "Maksymalna ilość prób" #: sabnzbd/skintext.py msgid "Maximum number of retries per server" msgstr "Maksymalna ilość prób połączenia z serwerem" #: sabnzbd/skintext.py msgid "Abort jobs that cannot be completed" msgstr "Przerwij zadania, które nie mogą zostać ukończone" #: sabnzbd/skintext.py msgid "" "When during download it becomes clear that too much data is missing, abort " "the job" msgstr "" "Jeśli podczas pobierania okaże się, że brakuje zbyt dużej ilości danych, " "przerwij zadanie" #: sabnzbd/skintext.py msgid "Enable Indexer Integration" msgstr "" #: sabnzbd/skintext.py 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 "" #: sabnzbd/skintext.py msgid "Enable Filtering" msgstr "Włącz filtrowanie" #: sabnzbd/skintext.py msgid "Action downloads according to filtering rules." msgstr "Wykonuj działania na zadaniach w oparciu o reguły filtrowania" #: sabnzbd/skintext.py msgid "Abort If" msgstr "Przerwij, jeśli" #: sabnzbd/skintext.py msgid "Else Pause If" msgstr "Bądź wstrzymaj, jeśli" #: sabnzbd/skintext.py msgid "Video rating" msgstr "Ocena wideo" #: sabnzbd/skintext.py msgid "Audio rating" msgstr "Ocena audio" #: sabnzbd/skintext.py msgid "Spam" msgstr "Spam" #: sabnzbd/skintext.py msgid "Confirmed" msgstr "Potwierdzone" #: sabnzbd/skintext.py msgid "More thumbs down than up" msgstr "Więcej ocen negatywnych niż pozytywnych" #: sabnzbd/skintext.py msgid "Title keywords" msgstr "Słowa kluczowe w tytule" #: sabnzbd/skintext.py msgid "Comma separated list" msgstr "Lista wartości oddzielonych przecinkami" #: sabnzbd/skintext.py msgid "Server IP address selection" msgstr "" #: sabnzbd/skintext.py msgid "First IP address" msgstr "" #: sabnzbd/skintext.py msgid "Randomly selected IP address" msgstr "" #: sabnzbd/skintext.py msgid "Quickest IP address, preferring IPv6" msgstr "" #: sabnzbd/skintext.py msgid "Useful if a newsserver has more than one IPv4/IPv6 address" msgstr "Przydatne, gdy serwer ma więcej niż jeden adres IPv4/IPv6" #: sabnzbd/skintext.py [Caption] # sabnzbd/skintext.py [Button: Add server] msgid "Add Server" msgstr "Dodaj serwer" #: sabnzbd/skintext.py [User defined name for server] msgid "Server description" msgstr "Opis serwera" #: sabnzbd/skintext.py [Server port] msgid "Port" msgstr "Port" #: sabnzbd/skintext.py [Server username] msgid "Username" msgstr "Nazwa użytkownika" #: sabnzbd/skintext.py [Server password] msgid "Password" msgstr "Hasło" #: sabnzbd/skintext.py [Server timeout] msgid "Timeout" msgstr "Limit czasu odpowiedzi" #: sabnzbd/skintext.py [Server's retention time in days] msgid "Retention time" msgstr "Czas przechowywania" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "SSL" msgstr "SSL" #: sabnzbd/skintext.py [Server SSL tickbox] msgid "Secure connection to server" msgstr "" #: sabnzbd/skintext.py msgid "Certificate verification" msgstr "" #: sabnzbd/skintext.py msgid "" "Minimal: when SSL is enabled, verify the identity of the server using its " "certificates. Strict: verify and enforce matching hostname." msgstr "" #: sabnzbd/skintext.py msgid "Disabled" msgstr "Wyłączone" #: sabnzbd/skintext.py msgid "Minimal" msgstr "" #: sabnzbd/skintext.py msgid "Strict" msgstr "" #: sabnzbd/skintext.py [Explain server priority] msgid "0 is highest priority, 100 is the lowest priority" msgstr "0 oznacza najwyższy priorytet, 99 - najniższy" #: sabnzbd/skintext.py [Server optional tickbox] msgid "Optional" msgstr "Opcjonalny" #: sabnzbd/skintext.py [Explain server optional tickbox] msgid "For unreliable servers, will be ignored longer in case of failures" msgstr "" #: sabnzbd/skintext.py [Enable server tickbox] msgid "Enable" msgstr "Włączony" #: sabnzbd/skintext.py [Button: Remove server] msgid "Remove Server" msgstr "Usuń serwer" #: sabnzbd/skintext.py [Button: Test server] # sabnzbd/skintext.py [Wizard step] msgid "Test Server" msgstr "Testuj serwer" #: sabnzbd/skintext.py [Button: Clear server's byte counters] msgid "Clear Counters" msgstr "Wyzeruj liczniki" #: sabnzbd/skintext.py msgid "Testing server details..." msgstr "Testuję serwer..." #: sabnzbd/skintext.py msgid "Bandwidth" msgstr "Przepustowość" #: sabnzbd/skintext.py msgid "Send Group" msgstr "Wyślij GROUP" #: sabnzbd/skintext.py msgid "Send group command before requesting articles." msgstr "Wyślij polecenie GROUP przed żądaniem artykułu" #: sabnzbd/skintext.py msgid "Personal notes" msgstr "Notatki osobiste" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Add Schedule" msgstr "Dodaj harmonogram" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Frequency" msgstr "Częstotliwość" #: sabnzbd/skintext.py [Config->Scheduling] # sabnzbd/skintext.py [Job details page, section header] msgid "Action" msgstr "Działanie" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Arguments" msgstr "Argumenty" #: sabnzbd/skintext.py [Config->Scheduling] msgid "Current Schedules" msgstr "Obecne harmonogramy" #: sabnzbd/skintext.py msgid "" "The checkbox next to the feed name should be ticked for the feed to be " "enabled and be automatically checked for new items.
When a feed is " "added, it will only pick up new items and not anything already in the RSS " "feed unless you press \"Force Download\"." msgstr "" "Pole wyboru obok nazwy kanału musi być zaznaczone, aby kanał był włączony i " "automatycznie sprawdzany w poszukiwaniu nowych wpisów.
Po dodaniu " "kanału będą pobierane tylko nowe wpisy - żaden istniejący już w kanale RSS " "wpis nie zostanie pobrany, chyba że klikniesz przycisk \"Wymuś pobranie\"." #: sabnzbd/skintext.py [Config->RSS, placeholder (cannot be too long)] msgid "Seperate multiple URLs by a comma" msgstr "" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read Feed" msgstr "Pobierz kanał" #: sabnzbd/skintext.py [Config->RSS button] msgid "Force Download" msgstr "Wymuś pobranie" #: sabnzbd/skintext.py [Config->RSS table column header] msgid "Filter" msgstr "Filtr" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Accept" msgstr "Akceptuj" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Reject" msgstr "Odrzuć" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "Requires" msgstr "Wymaga" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "RequiresCat" msgstr "WymagaKat" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At least" msgstr "Przynajmniej" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu] msgid "At most" msgstr "Najwyżej" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"] msgid "From SxxEyy" msgstr "Od SxxEyy" #: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"] msgid "From Show SxxEyy" msgstr "" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Matched" msgstr "Dopasowano" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Not Matched" msgstr "Nie dopasowano" #: sabnzbd/skintext.py [Config->RSS section header] msgid "Downloaded" msgstr "Pobrane" #: sabnzbd/skintext.py [Config->RSS button] msgid "Read All Feeds Now" msgstr "Czytaj teraz wszystkie kanały" #: sabnzbd/skintext.py msgid "Email Notification On Job Completion" msgstr "Powiadomienia email po zakończeniu zadania" #: sabnzbd/skintext.py [When to send email] msgid "Never" msgstr "Nigdy" #: sabnzbd/skintext.py [When to send email] msgid "Always" msgstr "Zawsze" #: sabnzbd/skintext.py [When to send email] msgid "Error-only" msgstr "Tylko błędy" #: sabnzbd/skintext.py msgid "Disk Full Notifications" msgstr "Powiadomienie o pełnym dysku" #: sabnzbd/skintext.py msgid "Send email when disk is full and SABnzbd is paused." msgstr "Powiadom, kiedy dysk jest pełen, a SABnzbd wstrzymany" #: sabnzbd/skintext.py msgid "Send RSS notifications" msgstr "Powiadomienia RSS" #: sabnzbd/skintext.py msgid "Send email when an RSS feed adds jobs to the queue." msgstr "Powiadom, kiedy kanał RSS dodaje zadanie do kolejki" #: sabnzbd/skintext.py msgid "SMTP Server" msgstr "Serwer SMTP" #: sabnzbd/skintext.py msgid "Set your ISP's server for outgoing email." msgstr "Ustaw serwer swojego ISP dla poczty wychodzącej" #: sabnzbd/skintext.py msgid "Email Recipient" msgstr "Adresat wiadomości email" #: sabnzbd/skintext.py msgid "Email address to send the email to." msgstr "Adres email, na który będą wysyłane powiadomienia" #: sabnzbd/skintext.py msgid "Email Sender" msgstr "Nadawca wiadomości email" #: sabnzbd/skintext.py msgid "Who should we say sent the email?" msgstr "Kto powinien być nadawcą wiadomości email?" #: sabnzbd/skintext.py msgid "OPTIONAL Account Username" msgstr "OPCJONALNA nazwa konta" #: sabnzbd/skintext.py msgid "For authenticated email, account name." msgstr "Nazwa konta dla kont z uwierzytelnieniem" #: sabnzbd/skintext.py msgid "OPTIONAL Account Password" msgstr "OPCJONALNE hasło do konta" #: sabnzbd/skintext.py msgid "For authenticated email, password." msgstr "Hasło dla kont z uwierzytelnieniem" #: sabnzbd/skintext.py msgid "Notification Sent!" msgstr "Wysłano powiadomienie!" #: sabnzbd/skintext.py [Header Growl section] msgid "Growl" msgstr "Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Enable Growl" msgstr "Włącz Growl" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Only use for remote Growl server (host:port)" msgstr "Tylko dla zdalnych serwerów Growl (host:port)" #: sabnzbd/skintext.py [Growl server password] msgid "Server password" msgstr "Hasło serwera" #: sabnzbd/skintext.py [Don't translate "Growl"] msgid "Optional password for Growl server" msgstr "Opcjonalne hasło dla serwera Growl" #: sabnzbd/skintext.py [Don't translate "NotifyOSD"] msgid "Enable NotifyOSD" msgstr "Włącz NotifyOSD" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section] msgid "Notification Center" msgstr "Centrum powiadomień" #: sabnzbd/skintext.py msgid "Enable Windows Notifications" msgstr "Włącz powiadomienia Windows" #: sabnzbd/skintext.py msgid "Windows Notifications" msgstr "Powiadomienia Windows" #: sabnzbd/skintext.py [Header for Ubuntu's NotifyOSD notifications section] msgid "NotifyOSD" msgstr "NotifyOSD" #: sabnzbd/skintext.py [Header for Prowl notification section] msgid "Prowl" msgstr "Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Enable Prowl notifications" msgstr "Włącz powiadomienia Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Requires a Prowl account" msgstr "Wymaga konta Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "API key for Prowl" msgstr "Klucz API Prowl" #: sabnzbd/skintext.py [Prowl settings] msgid "Personal API key for Prowl (required)" msgstr "Prywatny klucz API Prowl (wymagany)" #: sabnzbd/skintext.py [Header for Pushover notification section] msgid "Pushover" msgstr "Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Enable Pushover notifications" msgstr "Włącz powiadomienia Pushover" #: sabnzbd/skintext.py [Pushoversettings] msgid "Requires a Pushover account" msgstr "Wymaga konta Pushover" #: sabnzbd/skintext.py [Pushover settings] msgid "Application Token" msgstr "Token aplikacji" #: sabnzbd/skintext.py [Pushover settings] msgid "Application token (required)" msgstr "Token aplikacji (wymagany)" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key" msgstr "Klucz użytkownika" #: sabnzbd/skintext.py [Pushover settings] msgid "User Key (required)" msgstr "Klucz użytkownika (wymagany)" #: sabnzbd/skintext.py [Pushover settings] msgid "Device(s)" msgstr "Urządzenie(-a)" #: sabnzbd/skintext.py [Pushover settings] 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" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Enable Pushbullet notifications" msgstr "Włącz powiadomienia Pushbullet" #: sabnzbd/skintext.py [Pushbulletsettings] msgid "Requires a Pushbullet account" msgstr "Wymaga konta Pushbullet" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Personal API key" msgstr "Prywatny klucz API" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Your personal Pushbullet API key (required)" msgstr "Prywatny klucz API Pushbullet (wymagany)" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device" msgstr "Urządzenie" #: sabnzbd/skintext.py [Pushbullet settings] msgid "Device to which message should be sent" msgstr "Urządzenie, do którego mają być wysyłane powiadomienia" #: sabnzbd/skintext.py [Header for Notification Script notification section] msgid "Notification Script" msgstr "" #: sabnzbd/skintext.py [Notification Script settings] msgid "Enable notification script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Executes a custom script" msgstr "" #: sabnzbd/skintext.py [Notification Scriptsettings] msgid "Which script should we execute for notification?" msgstr "" #: sabnzbd/skintext.py msgid "" "Indexers can supply a category inside the NZB which SABnzbd will try to " "match to the categories defined below. Additionally, you can add terms to " "\"Indexer Categories / Groups\" to match more categories. Use commas to " "separate terms. Wildcards in the terms are supported.
More information " "can be found on the Wiki." msgstr "" #: sabnzbd/skintext.py msgid "" "Ending the path with an asterisk * will prevent creation of job folders." msgstr "" "Zakończenie ścieżki znakiem gwiazdki (*) zapobiegnie tworzeniu katalogów dla " "zadań." #: sabnzbd/skintext.py msgid "Relative folders are based on" msgstr "Ścieżki względne w stosunku do" #: sabnzbd/skintext.py msgid "Folder/Path" msgstr "Katalog/Ścieżka" #: sabnzbd/skintext.py msgid "Indexer Categories / Groups" msgstr "" #: sabnzbd/skintext.py [Small delete button] msgid "X" msgstr "X" #: sabnzbd/skintext.py msgid "Series Sorting" msgstr "Sortowanie seriali" #: sabnzbd/skintext.py msgid "Enable TV Sorting" msgstr "Włącz sortowanie TV" #: sabnzbd/skintext.py msgid "Pattern Key" msgstr "Zastępowane ciągi" #: sabnzbd/skintext.py msgid "Clear" msgstr "Wyczyść" #: sabnzbd/skintext.py msgid "Apply filters" msgstr "" #: sabnzbd/skintext.py msgid "Presets" msgstr "Predefiniowane" #: sabnzbd/skintext.py msgid "Example" msgstr "Przykład" #: sabnzbd/skintext.py msgid "Movie Sorting" msgstr "" #: sabnzbd/skintext.py msgid "Enable Movie Sorting" msgstr "Włącz sortowanie filmów" #: sabnzbd/skintext.py msgid "Keep loose downloads in extra folders" msgstr "Trzymaj niesklasyfikowane zadania w dodatkowych katalogach" #: sabnzbd/skintext.py msgid "Affected Categories" msgstr "Dotyczy kategorii" #: sabnzbd/skintext.py msgid "Meaning" msgstr "Znaczenie" #: sabnzbd/skintext.py msgid "Pattern" msgstr "Ciąg" #: sabnzbd/skintext.py msgid "Result" msgstr "Wynik" #: sabnzbd/skintext.py msgid "1x05 Season Folder" msgstr "Katalog sezonu 1x05" #: sabnzbd/skintext.py msgid "S01E05 Season Folder" msgstr "Katalog sezonu S01E05" #: sabnzbd/skintext.py msgid "1x05 Episode Folder" msgstr "Katalog odcinka 1x05" #: sabnzbd/skintext.py msgid "S01E05 Episode Folder" msgstr "Katalog odcinka S01E05" #: sabnzbd/skintext.py msgid "Job Name as Filename" msgstr "" #: sabnzbd/skintext.py msgid "Title" msgstr "Tytuł" #: sabnzbd/skintext.py msgid "Movie Name" msgstr "Tytuł filmu" #: sabnzbd/skintext.py msgid "Movie.Name" msgstr "Tytuł.Filmu" #: sabnzbd/skintext.py msgid "Movie_Name" msgstr "Tytuł_Filmu" #: sabnzbd/skintext.py msgid "Show Name" msgstr "Tytuł serialu" #: sabnzbd/skintext.py msgid "Show.Name" msgstr "Tytuł.serialu" #: sabnzbd/skintext.py msgid "Show_Name" msgstr "Tytuł_serialu" #: sabnzbd/skintext.py msgid "Season Number" msgstr "Numer sezonu" #: sabnzbd/skintext.py msgid "Episode Number" msgstr "Numer odcinka" #: sabnzbd/skintext.py msgid "Episode Name" msgstr "Tytuł odcinka" #: sabnzbd/skintext.py msgid "Episode.Name" msgstr "Tytuł.odcinka" #: sabnzbd/skintext.py msgid "Episode_Name" msgstr "Tytuł_odcinka" #: sabnzbd/skintext.py msgid "File Extension" msgstr "Rozszerzenie pliku" #: sabnzbd/skintext.py msgid "Extension" msgstr "Rozszerzenie" #: sabnzbd/skintext.py msgid "Part Number" msgstr "Numer fragmentu" #: sabnzbd/skintext.py msgid "Decade" msgstr "Dekada" #: sabnzbd/skintext.py msgid "Original Filename" msgstr "Oryginalna nazwa pliku" #: sabnzbd/skintext.py msgid "Original Job Name" msgstr "" #: sabnzbd/skintext.py msgid "Lower Case" msgstr "Małe litery" #: sabnzbd/skintext.py msgid "TEXT" msgstr "TEKST" #: sabnzbd/skintext.py msgid "text" msgstr "tekst" #: sabnzbd/skintext.py msgid "file" msgstr "plik" #: sabnzbd/skintext.py msgid "Sort String" msgstr "Wzorzec sortowania" #: sabnzbd/skintext.py msgid "Multi-part label" msgstr "Etykieta wieloczęściowa" #: sabnzbd/skintext.py msgid "In folders" msgstr "W katalogach" #: sabnzbd/skintext.py msgid "No folders" msgstr "Brak katalogów" #: sabnzbd/skintext.py msgid "Date Sorting" msgstr "Sortowanie według daty" #: sabnzbd/skintext.py msgid "Enable Date Sorting" msgstr "Włącz sortowanie według daty" #: sabnzbd/skintext.py msgid "Show Name folder" msgstr "Katalog z tytułem serialu" #: sabnzbd/skintext.py msgid "Year-Month Folders" msgstr "Katalogi rok-miesiąc" #: sabnzbd/skintext.py msgid "Daily Folders" msgstr "Katalogi dzienne" #: sabnzbd/skintext.py [Note for title expression in Sorting that does case adjustment] msgid "case-adjusted" msgstr "z dostosowaniem wielkości liter" #: sabnzbd/skintext.py msgid "Processed Result" msgstr "Przetworzony ciąg" #: sabnzbd/skintext.py msgid "" "Rarely used options. For their meaning and explanation, click on the Help " "button to go to the Wiki page.
Don't change these without checking the " "Wiki first, as some have serious side-effects.
The default values are " "between parentheses." msgstr "" "Rzadko używane opcje. Jeśli chcesz się dowiedzieć, co oznaczają, kliknij " "przycisk Pomoc, aby przejść do strony Wiki.
Nie zmieniaj tych opcji bez " "uprzedniego przeczytania Wiki, ponieważ niektóre mają poważne skutki " "uboczne.
DomyÅ›lne wartoÅ›ci zostaÅ‚y umieszczone w nawiasach." #: sabnzbd/skintext.py msgid "Values" msgstr "WartoÅ›ci" #: sabnzbd/skintext.py [Job details page] msgid "Edit NZB Details" msgstr "Edytuj szczegóły NZB" #: sabnzbd/skintext.py [Job details page, delete button] msgid "Delete" msgstr "UsuÅ„" #: sabnzbd/skintext.py [Job details page, move file to top] # sabnzbd/skintext.py msgid "Top" msgstr "Na górÄ™" #: sabnzbd/skintext.py [Job details page, move file one place up] msgid "Up" msgstr "Wyżej" #: sabnzbd/skintext.py [Job details page, move file one place down] msgid "Down" msgstr "Niżej" #: sabnzbd/skintext.py [Job details page, move file to bottom] # sabnzbd/skintext.py msgid "Bottom" msgstr "Na dół" #: sabnzbd/skintext.py [Job details page, select all files] msgid "All" msgstr "Wszystko" #: sabnzbd/skintext.py [Job details page, invert file selection] msgid "Invert" msgstr "Odwróć" #: sabnzbd/skintext.py [Job details page, filename column header] msgid "Filename" msgstr "Nazwa pliku" #: sabnzbd/skintext.py [Job details page, subject column header] msgid "Subject" msgstr "Temat" #: sabnzbd/skintext.py [Job details page, section header] msgid "Selection" msgstr "Zaznaczenie" #: sabnzbd/skintext.py msgid "left" msgstr "pozostaÅ‚o" #: sabnzbd/skintext.py msgid "Free Space" msgstr "Wolne miejsce" #: sabnzbd/skintext.py msgid "Temp Folder" msgstr "Folder tymczasowy" #: sabnzbd/skintext.py msgid "Multi-Operations" msgstr "Operacje na wielu" #: sabnzbd/skintext.py msgid "Hold shift key to select a range" msgstr "Przytrzymaj klawisz Shift, aby zaznaczyć zakres" #: sabnzbd/skintext.py msgid "Check all" msgstr "Sprawdź wszystkie" #: sabnzbd/skintext.py msgid "Restart SABnzbd" msgstr "Uruchom ponownie SABnzbd" #: sabnzbd/skintext.py msgid "Status and interface options" msgstr "Stan i opcje interfejsu" #: sabnzbd/skintext.py msgid "Or drag and drop files in the window!" msgstr "Lub przeciÄ…gnij i upuść pliki do okna!" #: sabnzbd/skintext.py msgid "Lost connection to SABnzbd.." msgstr "Utracono połączenie z SABnzbd..." #: sabnzbd/skintext.py 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 msgid "Refresh rate" msgstr "CzÄ™stotliwość odÅ›wieżania" #: sabnzbd/skintext.py msgid "Use global interface settings" msgstr "Użyj globalnych ustawieÅ„ interfejsu" #: sabnzbd/skintext.py msgid "Queue item limit" msgstr "Limit wyÅ›wietlanych pozycji kolejki" #: sabnzbd/skintext.py msgid "History item limit" msgstr "Limit wyÅ›wietlanych pozycji historii" #: sabnzbd/skintext.py msgid "Date format" msgstr "Format daty" #: sabnzbd/skintext.py msgid "Extra queue column" msgstr "Dodatkowa kolumna kolejki" #: sabnzbd/skintext.py msgid "Extra history column" msgstr "" #: sabnzbd/skintext.py msgid "page" msgstr "strona" #: sabnzbd/skintext.py msgid "Loading" msgstr "Åadowanie" #: sabnzbd/skintext.py msgid "articles" msgstr "artykułów" #: sabnzbd/skintext.py msgid "Rename" msgstr "ZmieÅ„ nazwÄ™" #: sabnzbd/skintext.py msgid "Queue repair" msgstr "Naprawa kolejki" #: sabnzbd/skintext.py msgid "Show active connections" msgstr "Pokaż aktywne połączenia" #: sabnzbd/skintext.py msgid "Orphaned jobs" msgstr "Porzucone zadania" #: sabnzbd/skintext.py msgid "Send back to queue" msgstr "WyÅ›lij z powrotem do kolejki" #: sabnzbd/skintext.py msgid "Delete All" msgstr "UsuÅ„ wszystko" #: sabnzbd/skintext.py msgid "Retry all" msgstr "Ponów wszystkie" #: sabnzbd/skintext.py msgid "Fetch NZB from URL" msgstr "Pobierz NZB z URL" #: sabnzbd/skintext.py msgid "Upload NZB" msgstr "Wczytaj NZB" #: sabnzbd/skintext.py msgid "Optionally specify a filename" msgstr "Opcjonalnie podaj nazwÄ™ pliku" #: sabnzbd/skintext.py msgid "Submit" msgstr "WyÅ›lij" #: sabnzbd/skintext.py msgid "Open Informational URL" msgstr "Otwórz URL informacyjny" #: sabnzbd/skintext.py msgid "Submitted. Thank you!" msgstr "WysÅ‚ano. DziÄ™ki!" #: sabnzbd/skintext.py msgid "Nothing selected!" msgstr "Nic nie zaznaczono!" #: sabnzbd/skintext.py msgid "Remove all selected files" msgstr "UsuÅ„ wszystkie zaznaczone pliki" #: sabnzbd/skintext.py msgid "Hide/show completed files" msgstr "Pokaż/ukryj ukoÅ„czone pliki" #: sabnzbd/skintext.py msgid "View Script Log" msgstr "Zobacz log skryptu" #: sabnzbd/skintext.py msgid "Update Available!" msgstr "DostÄ™pna aktualizacja!" #: sabnzbd/skintext.py [Don't translate LocalStorage] msgid "" "LocalStorage (cookies) are disabled in your browser, interface settings will " "be lost after you close the browser!" msgstr "" #: sabnzbd/skintext.py msgid "Glitter has some (new) features you might like!" msgstr "" #: sabnzbd/skintext.py msgid "Custom" msgstr "WÅ‚asny" #: sabnzbd/skintext.py msgid "Compact layout" msgstr "" #: sabnzbd/skintext.py msgid "Tabbed layout
(separate queue and history)" msgstr "" #: sabnzbd/skintext.py msgid "Speed" msgstr "PrÄ™dkość" #: sabnzbd/skintext.py msgid "Confirm Queue Deletions" msgstr "Potwierdzaj usuwanie z kolejki" #: sabnzbd/skintext.py msgid "Confirm History Deletions" msgstr "Potwierdzaj usuwanie z historii" #: sabnzbd/skintext.py msgid "How long or untill when do you want to pause? (in English!)" msgstr "Jak dÅ‚ugo lub do kiedy chcesz wstrzymać? (po angielsku!)" #: sabnzbd/skintext.py msgid "Sorry, we could not interpret that. Try again." msgstr "Przykro mi, nie rozumiem. Spróbuj ponownie." #: sabnzbd/skintext.py msgid "Pause for..." msgstr "Wstrzymaj na..." #: 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 Oldest→Newest" msgstr "Sortuj wedÅ‚ug wieku Najstarsze→Najnowsze" #: sabnzbd/skintext.py msgid "Sort by Age Newest→Oldest" msgstr "Sortuj wedÅ‚ug wieku Najnowsze→Najstarsze" #: sabnzbd/skintext.py msgid "Sort by Name A→Z" msgstr "Sortuj wedÅ‚ug nazwy A→Z" #: sabnzbd/skintext.py msgid "Sort by Name Z→A" msgstr "Sortuj wedÅ‚ug nazwy Z→A" #: sabnzbd/skintext.py msgid "Sort by Size Smallest→Largest" msgstr "Sortuj wedÅ‚ug rozmiaru Najmniejsze→NajwiÄ™ksze" #: sabnzbd/skintext.py msgid "Sort by Size Largest→Smallest" msgstr "Sortuj wedÅ‚ug rozmiaru NajwiÄ™ksze→Najmniejsze" #: sabnzbd/skintext.py msgid "Uploading" msgstr "" #: sabnzbd/skintext.py msgid "Forcing disconnect" msgstr "" #: sabnzbd/skintext.py msgid "Removing job" msgstr "" #: sabnzbd/skintext.py msgid "Removing jobs" msgstr "" #: sabnzbd/skintext.py msgid "Prev" msgstr "Wstecz" #: sabnzbd/skintext.py # sabnzbd/skintext.py [Button to go to next Wizard page] msgid "Next" msgstr "Dalej" #: sabnzbd/skintext.py msgid "Purge the History?" msgstr "WyczyÅ›cić historiÄ™?" #: sabnzbd/skintext.py msgid "You must enable JavaScript for Plush to function!" msgstr "Plush wymaga włączenia obsÅ‚ugi JavaScript!" #: sabnzbd/skintext.py msgid "Options" msgstr "Opcje" #: sabnzbd/skintext.py msgid "Pause for how many minutes?" msgstr "Na ile minut wstrzymać?" #: sabnzbd/skintext.py msgid "Top Menu" msgstr "Górne menu" #: sabnzbd/skintext.py msgid "On Finish" msgstr "Po zakoÅ„czeniu" #: sabnzbd/skintext.py msgid "Sort" msgstr "Sortuj" #: sabnzbd/skintext.py msgid "Sort by Age (Oldest→Newest)" msgstr "Sortuj wedÅ‚ug wieku (Najstarsze→Najnowsze)" #: sabnzbd/skintext.py msgid "Sort by Age (Newest→Oldest)" msgstr "Sortuj wedÅ‚ug wieku (Najnowsze→Najstarsze)" #: sabnzbd/skintext.py msgid "Sort by Name (A→Z)" msgstr "Sortuj wedÅ‚ug nazwy (A→Z)" #: sabnzbd/skintext.py msgid "Sort by Name (Z→A)" msgstr "Sortuj wedÅ‚ug nazwy (Z→A)" #: sabnzbd/skintext.py msgid "Sort by Size (Smallest→Largest)" msgstr "Sortuj wedÅ‚ug rozmiaru (Najmniejsze→NajwiÄ™ksze)" #: sabnzbd/skintext.py msgid "Sort by Size (Largest→Smallest)" msgstr "Sortuj wedÅ‚ug rozmiaru (NajwiÄ™ksze→Najmniejsze)" #: sabnzbd/skintext.py msgid "Purge the Queue?" msgstr "WyczyÅ›cić kolejkÄ™?" #: sabnzbd/skintext.py msgid "Retry all failed jobs in History?" msgstr "Ponowić wszystkie nieudane zadania z historii?" #: sabnzbd/skintext.py msgid "Purge" msgstr "Wyczyść" #: sabnzbd/skintext.py [Used in speed menu. Split in two lines if too long.] msgid "Max Speed" msgstr "Limit prÄ™dkoÅ›ci" #: sabnzbd/skintext.py msgid "Range" msgstr "Zakres" #: sabnzbd/skintext.py msgid "Apply to Selected" msgstr "Zastosuj do zaznaczonych" #: sabnzbd/skintext.py msgid "Everything" msgstr "Wszystko" #: sabnzbd/skintext.py msgid "Refresh Rate" msgstr "CzÄ™stotliwość odÅ›wieżania" #: sabnzbd/skintext.py msgid "Container Width" msgstr "Szerokość kontenera" #: sabnzbd/skintext.py msgid "" "This will prevent refreshing content when your mouse cursor is hovering over " "the queue." msgstr "Blokuje odÅ›wieżanie zawartoÅ›ci po najechaniu kursorem na kolejkÄ™" #: sabnzbd/skintext.py msgid "Block Refreshes on Hover" msgstr "Zablokuj odÅ›wieżanie podczas wskazywania" #: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box] msgid "Upload" msgstr "Wczytaj" #: sabnzbd/skintext.py msgid "Upload: .nzb .rar .zip .gz, .bz2" msgstr "Wczytaj: .nzb, .rar, .zip, .gz, .bz2" #: sabnzbd/skintext.py msgid "Progress" msgstr "PostÄ™p" #: sabnzbd/skintext.py msgid "Not enough disk space to complete downloads!" msgstr "NiewystarczajÄ…ca ilość miejsca na dysku do ukoÅ„czenia pobierania!" #: sabnzbd/skintext.py msgid "Free (Temp)" msgstr "Wolne (tymczasowo)" #: sabnzbd/skintext.py msgid "IDLE" msgstr "BEZCZYNNY" #: sabnzbd/skintext.py msgid "Downloads" msgstr "Pobieranie" #: sabnzbd/skintext.py msgid "SABnzbd Quick-Start Wizard" msgstr "Szybki kreator konfiguracji SABnzbd" #: sabnzbd/skintext.py msgid "SABnzbd Version" msgstr "Wersja SABnzbd" #: sabnzbd/skintext.py [Button to go to previous Wizard page] msgid "Previous" msgstr "Wstecz" #: sabnzbd/skintext.py msgid "Server Details" msgstr "Szczegóły serwera" #: sabnzbd/skintext.py msgid "Please enter in the details of your primary usenet provider." msgstr "Podaj szczegóły swojego głównego dostawcy Usenet" #: sabnzbd/skintext.py msgid "The number of connections allowed by your provider" msgstr "Ilość połączeÅ„ dopuszczanych przez twojego dostawcÄ™" #: sabnzbd/skintext.py [Wizard: examples of amount of connections] msgid "E.g. 8 or 20" msgstr "np. 8 lub 20" #: sabnzbd/skintext.py msgid "Select only if your provider allows SSL connections." msgstr "Zaznacz tylko jeÅ›li twój dostawca zezwala na połączenia SSL" #: sabnzbd/skintext.py msgid "Click to test the entered details." msgstr "Kliknij, aby przetestować wprowadzone dane" #: sabnzbd/skintext.py [Abbreviation for "for example"] msgid "E.g." msgstr "Np." #: sabnzbd/skintext.py [Wizard step] msgid "Setup is now complete!" msgstr "Konfiguracja ukoÅ„czona!" #: sabnzbd/skintext.py [Wizard tip] msgid "SABnzbd will now be running in the background." msgstr "SABnzbd bÄ™dzie uruchomiony w tle." #: sabnzbd/skintext.py [Wizard tip] msgid "Closing any browser windows/tabs will NOT close SABnzbd." msgstr "ZamkniÄ™cie okna przeglÄ…darki lub karty NIE zamknie SABnzbd." #: sabnzbd/skintext.py [Wizard tip] msgid "" "It is recommended you right click and bookmark this location and use this " "bookmark to access SABnzbd when it is running in the background." msgstr "" "Zalecamy dodanie tej strony do zakÅ‚adek i używanie tej zakÅ‚adki do " "późniejszego dostÄ™pu do SABnzbd uruchomionego w tle." #: sabnzbd/skintext.py [Will be appended with a wiki-link, adjust word order accordingly] msgid "Further help can be found on our" msgstr "DalszÄ… pomoc można uzyskać na naszej" #: sabnzbd/skintext.py [Wizard step] msgid "Go to SABnzbd" msgstr "Przejdź do SABnzbd" #: sabnzbd/skintext.py [Wizard EXIT button on first page] msgid "Exit SABnzbd" msgstr "WyjÅ›cie z SABnzbd" #: sabnzbd/skintext.py [Wizard START button on first page] msgid "Start Wizard" msgstr "Uruchom kreatora konfiguracji" #: sabnzbd/skintext.py msgid "" "\n" "SABnzbd comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it under certain " "conditions.\n" "It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your " "option) any later version.\n" msgstr "" "\n" "SABnzbd wydawany jest ABSOLUTNIE BEZ Å»ADNEJ GWARANCJI.\n" "To jest wolne oprogramowanie i mile widziane jest dalsze rozpowszechnianie " "go przez ciebie na okreÅ›lonych warunkach.\n" "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] msgid "Error getting TV info (%s)" msgstr "Błąd pobierania informacji TV (%s)" #: sabnzbd/sorting.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] msgid "Failed to rename similar file: %s to %s" msgstr "Nie udaÅ‚o siÄ™ zmienić nazwy podobnego pliku %s na %s" #: sabnzbd/urlgrabber.py msgid "Unauthorized access" msgstr "DostÄ™p zabroniony" #: sabnzbd/urlgrabber.py msgid "File not on server" msgstr "" #: sabnzbd/urlgrabber.py msgid "Server could not complete request" msgstr "" #: sabnzbd/urlgrabber.py [Error message] msgid "URLGRABBER CRASHED" msgstr "DziaÅ‚anie moduÅ‚u pobierania URL zostaÅ‚o przerwane" #: sabnzbd/urlgrabber.py msgid "Unusable NZB file" msgstr "Bezużyteczny plik NZB" #: sabnzbd/urlgrabber.py 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" #~ msgid "" #~ "Your UNRAR version is not recommended, get it from " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgstr "" #~ "Twoja wersja programu UNRAR jest niezalecana, pobierz nowÄ… z " #~ "http://www.rarlab.com/rar_add.htm
" #~ msgid "Initiating restart...
" #~ msgstr "InicjujÄ™ restart...
" #~ 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" #~ msgid "Try again" #~ msgstr "Spróbuj ponownie" #~ msgid "Cannot open registry key \"%s\"." #~ msgstr "Nie można otworzyć klucza rejestru \"%s\"." #~ msgid "Unpacking failed, these file(s) are missing:" #~ msgstr "Rozpakowywanie nie powiodÅ‚o siÄ™, brak nastÄ™pujÄ…cych plików:" #~ msgid "ERROR: %s" #~ msgstr "BÅÄ„D: %s" #~ msgid "Unpacking failed, an expected file was not unpacked" #~ msgstr "" #~ "Rozpakowywanie nie powiodÅ‚o siÄ™, oczekiwany plik nie zostaÅ‚ wypakowany" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Error removing workdir (%s)" #~ msgstr "Błąd usuwania katalogu roboczego (%s)" #~ msgid "Get NZB" #~ msgstr "Pobieranie NZB" #~ msgid "KB/s" #~ msgstr "KB/s" #~ msgid "Queued" #~ msgstr "W kolejce" #~ msgid "Add new downloads" #~ msgstr "Dodaj nowe pliki" #~ msgid "WARNINGS" #~ msgstr "OSTRZEÅ»ENIA" #~ msgid " " #~ msgstr " " #~ msgid " or Report ID" #~ msgstr " lub ID raportu" #~ msgid "Hide files" #~ msgstr "Ukryj pliki" #~ msgid "Show files" #~ msgstr "Pokaż pliki" #~ msgid "Remain/Total" #~ msgstr "PozostaÅ‚o/Razem" #~ msgid "History Size" #~ msgstr "Rozmiar historii" #~ msgid "Thread" #~ msgstr "WÄ…tek" #~ msgid "Email Test Result" #~ msgstr "Wynik testu email" #~ msgid "General configuration" #~ msgstr "Ogólna konfiguracja" #~ msgid "Queue auto refresh interval:" #~ msgstr "InterwaÅ‚ automatycznego odÅ›wieżania kolejki" #~ msgid "Disable API-key" #~ msgstr "Wyłącz klucz API" #~ msgid "Post-Processing Scripts Folder" #~ msgstr "Katalog skryptów przetwarzania koÅ„cowego" #~ msgid "Folder containing user scripts for post-processing." #~ msgstr "Katalog zawierajÄ…cy skrypty przetwarzania koÅ„cowego" #~ msgid "Enable Filejoin" #~ msgstr "Włącz łączenie plików" #~ msgid "Enable built-in unrar functionality." #~ msgstr "Włącz wbudowanÄ… funkcjonalność unrar" #~ msgid "Switches configuration" #~ msgstr "Konfiguracja przełączników" #~ msgid "Enable Quick Check" #~ msgstr "Włącz szybkie sprawdzanie" #~ msgid "Enable TS Joining" #~ msgstr "Włącz łączenie TS" #~ msgid "Fail on yEnc CRC Errors" #~ msgstr "Przerywaj po błędach CRC yEnc" #~ msgid "When article has a CRC error, try to get it from another server." #~ msgstr "Próbuj pobierać artykuÅ‚y z błędami CRC z innych serwerów" #~ msgid "Step Four" #~ msgstr "Krok czwarty" #~ msgid "Step Five" #~ msgstr "Krok piÄ…ty" #~ 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" #~ msgid "QR Code" #~ msgstr "Kod QR" #~ msgid "Check result of unpacking" #~ msgstr "Sprawdzaj wyniki rozpakowywania" #~ msgid "Default Priority" #~ msgstr "DomyÅ›lny priorytet" #~ msgid "Enable MultiCore Par2" #~ msgstr "Włącz wielordzeniowy Par2" #~ msgid "Default Post-Processing" #~ msgstr "DomyÅ›lne przetwarzanie koÅ„cowe" #~ msgid "Default User Script" #~ msgstr "DomyÅ›lny skrypt użytkownika" #~ msgid "Other Switches" #~ msgstr "Inne przełączniki" #~ msgid "Replace Illegal Characters in Folder Names" #~ msgstr "ZastÄ…p niedopuszczalne znaki w nazwach katalogów" #~ msgid "Do not download" #~ msgstr "Nie pobieraj" #~ msgid "SSL type" #~ msgstr "Typ SSL" #~ msgid "Show times in AM/PM notation (does not affect scheduler)." #~ msgstr "Pokazuj czas w notacji AM/PM (nie dotyczy harmonogramu)" #~ msgid "Server configuration" #~ msgstr "Konfiguracja serwera" #~ msgid "Server definition" #~ msgstr "Definicja serwera" #~ msgid "Backup server" #~ msgstr "Serwer zapasowy" #~ msgid "Scheduling configuration" #~ msgstr "Konfiguracja harmonogramów" #~ msgid "Remove" #~ msgstr "UsuÅ„" #~ msgid "Add Feed" #~ msgstr "Dodaj kanaÅ‚" #~ msgid "Skip" #~ msgstr "PomiÅ„" #~ msgid "RSS Configuration" #~ msgstr "Konfiguracja RSS" #~ msgid "Delete Feed" #~ msgstr "UsuÅ„ kanaÅ‚" #~ msgid "New Feed URL" #~ msgstr "Nowy URL kanaÅ‚u" #~ msgid "Feeds" #~ msgstr "KanaÅ‚y" #~ msgid "Filters" #~ msgstr "Filtry" #~ msgid "Settings" #~ msgstr "Ustawienia" #~ msgid "Email Options" #~ msgstr "Opcje email" #~ msgid "Email Account Settings" #~ msgstr "Ustawienia konta email" #~ msgid "Send notifications to Growl" #~ msgstr "WysyÅ‚aj powiadomienia Growl" #~ msgid "Send notifications to NotifyOSD" #~ msgstr "WysyÅ‚aj powiadomienia do NotifyOSD" #~ msgid "Enable sorting and renaming of episodes." #~ msgstr "Włącz sortowanie i zmianÄ™ nazw odcinków" #~ msgid "Sorting configuration" #~ msgstr "Konfiguracja sortowania" #~ msgid "Groups / Indexer tags" #~ msgstr "Grupy / Etykiety indeksera" #~ 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ąć?" #~ msgid "Page" #~ msgstr "Strona" #~ msgid "Close" #~ msgstr "Zamknij" #~ msgid "Pause for 12 hours" #~ msgstr "Wstrzymaj na 12 godzin" #~ msgid "Pause for 24 hours" #~ msgstr "Wstrzymaj na 24 godziny" #~ msgid "Left" #~ msgstr "PozostaÅ‚o" #~ msgid "Storage" #~ msgstr "Miejsce" #~ msgid "Plush Options" #~ msgstr "Opcje Plush" #~ msgid "Upload: .nzb .rar .zip .gz" #~ msgstr "Wczytaj: .nzb .rar .zip .gz" #~ msgid "Links" #~ msgstr "OdnoÅ›niki" #~ msgid "Delete Failed" #~ msgstr "Usuwanie nie powiodÅ‚o siÄ™" #~ msgid "Delete Completed" #~ msgstr "Usuwanie zakoÅ„czone" #~ msgid "Email Sent!" #~ msgstr "WysÅ‚ano email!" #~ msgid "Showing one result" #~ msgstr "PokazujÄ™ jeden wynik" #~ msgid "No results" #~ msgstr "Brak wyników" #~ msgid "DualView2" #~ msgstr "DualView2" #~ msgid "DualView1" #~ msgstr "DualView1" #~ msgid "Saved" #~ msgstr "Zapisano" #~ msgid "Show Edit Options" #~ msgstr "Pokaż opcje edycji" #~ msgid "Timeleft" #~ msgstr "PozostaÅ‚o" #~ msgid "Access" #~ msgstr "DostÄ™p" #~ msgid "Misc" #~ msgstr "PozostaÅ‚e" #~ msgid "Please enter a whole number." #~ msgstr "Wprowadź liczbÄ™ caÅ‚kowitÄ…" #~ msgid "Step One" #~ msgstr "Krok pierwszy" #~ msgid "Step Two" #~ msgstr "Krok drugi" #~ msgid "Step Three" #~ msgstr "Krok trzeci" #~ msgid "User-defined categories" #~ msgstr "Kategorie użytkownika" #~ msgid "_yenc module... NOT found!" #~ msgstr "ModuÅ‚ _yenc... NIE znaleziono!" #~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file" #~ msgstr "" #~ "UWAGA: Zadanie \"%s\" zostaÅ‚o wstrzymane z powodu zaszyfrowanego pliku RAR" #~ msgid "WARNING: Aborted job \"%s\" because of encrypted RAR file" #~ msgstr "" #~ "UWAGA: Zadanie \"%s\" zostaÅ‚o przerwane z powodu zaszyfrowanego pliku RAR" #~ msgid "Invalid encoding of email template %s" #~ msgstr "NieprawidÅ‚owe kodowanie szablonu wiadomoÅ›ci email %s" #~ msgid "No email templates found" #~ msgstr "Nie znaleziono szablonów wiadomoÅ›ci email" #~ msgid "Error: No secondary interface defined." #~ msgstr "Błąd: Nie zdefiniowano zapasowego interfejsu." #~ msgid "No PAR2 program found, repairs not possible
" #~ msgstr "Nie znaleziono programu PAR2, naprawa nie będzie możliwa
" #~ msgid "Job \"%s\" was re-added to the queue" #~ msgstr "Zadanie \"%s\" zostaÅ‚o ponownie dodane do kolejki" #~ msgid "Jobs marked with a '*' will not be automatically downloaded." #~ msgstr "Zadania oznaczone przez '*' nie zostanÄ… automatycznie pobrane." #~ msgid "Cannot connect to registry hive HKEY_CURRENT_USER." #~ msgstr "Nie można podłączyć gałęzi rejestru HKEY_CURRENT_USER." #~ msgid "Failed to read registry keys for special folders" #~ msgstr "Nie udaÅ‚o siÄ™ odczytać kluczy rejestru dla katalogów specjalnych" #~ msgid "pyopenssl module missing, please install for https access" #~ msgstr "Brak moduÅ‚u pyopenssl, należy go zainstalować w celu użycia HTTPS" #~ msgid "Unpacking failed, see log" #~ msgstr "Rozpakowywanie nie powiodÅ‚o siÄ™, sprawdź logi" #~ 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 "File %s is empty, skipping" #~ msgstr "Plik %s jest pusty, pomijam" #~ msgid "" #~ "\n" #~ " SABnzbd is not compatible with some software firewalls.
\n" #~ " %s
\n" #~ " Sorry, but we cannot solve this incompatibility right now.
\n" #~ " Please file a complaint at your firewall supplier.
\n" #~ "
\n" #~ msgstr "" #~ "\n" #~ " SABnzbd jest niekompatybilny z niektórymi programowymi firewallami.
\n" #~ " %s
\n" #~ " Przepraszamy, ale nie możemy obecnie rozwiązać tego problemu.
\n" #~ " Zgłoś problem u dostawcy swojego programu.
\n" #~ "
\n" #~ msgid "" #~ "\n" #~ " SABnzbd needs a free tcp/ip port for its internal web server.
\n" #~ " Port %s on %s was tried , but the account used for SABnzbd has no " #~ "permission to use it.
\n" #~ " On OSX and Linux systems, normal users must use ports above 1023.
\n" #~ "
\n" #~ " Please restart SABnzbd with a different port number." #~ msgstr "" #~ "\n" #~ " SABnzbd wymaga wolnego portu TCP/IP dla wewnętrznego serwera WWW.
\n" #~ " Próbowano portu %s na %s, lecz użytkownik SABnzbd nie ma uprawnień do " #~ "jego użycia.
\n" #~ " W systemach OS X oraz Linux normalny użytkownik musi używać portów " #~ "powyżej 1023.
\n" #~ "
\n" #~ " Uruchom ponownie SABnzbd używając innego numeru portu." #~ msgid "It is likely that you are using ZoneAlarm on Vista.
" #~ msgstr "Wygląda na to, że używasz ZoneAlarm w systemie Vista.
" #~ msgid "You have no permisson to use port %s" #~ msgstr "Nie masz uprawnieÅ„ do używania portu %s" #~ msgid "Failed to remove nzo from postproc queue (id)" #~ msgstr "Nie udaÅ‚o siÄ™ usunąć nzo z kolejki przetwarzania koÅ„cowego (id)" #~ msgid "No post-processing because of failed verification" #~ msgstr "" #~ "Przetwarzanie koÅ„cowe nie zostaÅ‚o uruchomione z powodu nieudanej weryfikacji" #~ msgid "View script output" #~ msgstr "Zobacz wynik dziaÅ‚ania skryptu" #~ msgid "Complete Dir" #~ msgstr "Katalog zakoÅ„czonych" #~ msgid "Download speed" #~ msgstr "PrÄ™dkość pobierania" #~ msgid "Sort by name" #~ msgstr "Sortuj wedÅ‚ug nazwy" #~ msgid "Sort by age" #~ msgstr "Sortuj wedÅ‚ug wieku" #~ msgid "Sort by size" #~ msgstr "Sortuj wedÅ‚ug rozmiaru" #~ msgid "Purge Failed History" #~ msgstr "UsuÅ„ nieudane z historii" #~ msgid "Delete all failed items from History?" #~ msgstr "Usunąć z historii wszystkie nieudane pliki?" #~ msgid "Show Weblogging" #~ msgstr "Pokaż logi WWW" #~ msgid "OZnzb" #~ msgstr "OZnzb" #~ msgid "Secondary Web Interface" #~ msgstr "Zapasowy interfejs WWW" #~ msgid "Activate an alternative skin." #~ msgstr "Włącz alternatywnÄ… skórkÄ™" #~ msgid "Web server authentication" #~ msgstr "Uwierzytelnienie serwera WWW" #~ msgid "HTTPS Support" #~ msgstr "ObsÅ‚uga HTTPS" #~ msgid "Refresh interval of the queue web-interface page(sec, 0= none)." #~ msgstr "" #~ "InterwaÅ‚ automatycznego odÅ›wieżania strony kolejki w interfejsie WWW " #~ "(sekundy, 0=brak)" #~ msgid "Do not require the API key." #~ msgstr "Klucz API nie bÄ™dzie wymagany" #~ msgid "USE AT YOUR OWN RISK!" #~ msgstr "UÅ»YWAJ NA WÅASNÄ„ ODPOWIEDZIALNOŚĆ!" #~ msgid "Processing Switches" #~ msgstr "Przełączniki przetwarzania" #~ msgid "Enable Unrar" #~ msgstr "Włącz unrar" #~ msgid "Enable built-in unzip functionality." #~ msgstr "Włącz wbudowanÄ… funkcjonalność unzip" #~ msgid "Join files ending in .001, .002 etc. into one file." #~ msgstr "ÅÄ…cz pliki koÅ„czÄ…ce siÄ™ na .001, .002 itd. w jeden plik" #~ msgid "Join files ending in .001.ts, .002.ts etc. into one file." #~ msgstr "ÅÄ…cz pliki koÅ„czÄ…ce siÄ™ na .001.ts, 002.ts itd. w jeden plik" #~ msgid "Enable Par Cleanup" #~ msgstr "Włącz czyszczenie par2" #~ msgid "Cleanup par files (if verifiying/repairing succeded)." #~ msgstr "Czyść pliki par2 (jeÅ›li weryfikacja/naprawa siÄ™ powiedzie)" #~ msgid "Used when no post-processing is defined by the category." #~ msgstr "" #~ "Używane, kiedy przetwarzanie koÅ„cowe nie zostaÅ‚o okreÅ›lone przez kategoriÄ™" #~ msgid "Used when no user script is defined by the category." #~ msgstr "" #~ "Używany, kiedy skrypt użytkownika nie zostaÅ‚ okreÅ›lony przez kategoriÄ™" #~ msgid "Used when no priority is defined by the category." #~ msgstr "Używany, kiedy priorytet nie zostaÅ‚ okreÅ›lony przez kategoriÄ™" #~ msgid "" #~ "Replace illegal characters in folder names by equivalents (otherwise remove)." #~ msgstr "" #~ "ZastÄ…p niedopuszczalne znaki w nazwach katalogów ich odpowiednikami (lub " #~ "usuÅ„, jeÅ›li odpowiednik nie jest dostÄ™pny)" #~ msgid "Use V23 unless your provider requires otherwise!" #~ msgstr "Użyj typu V23, chyba że dostawca wymaga innego!" #~ msgid "Use 12 hour clock (AM/PM)" #~ msgstr "Użyj dwunastogodzinnego zegara (AM/PM)" #~ msgid "Only for optional servers" #~ msgstr "Tylko dla serwerów zapasowych" #~ msgid "Apply maximum retries only to optional servers" #~ msgstr "Zastosuj maksymalnÄ… ilość prób tylko dla serwerów zapasowych" #~ msgid "Enable OZnzb Integration" #~ msgstr "Włącz integracjÄ™ z OZnzb" #~ msgid "" #~ "Enhanced functionality including ratings and extra status information is " #~ "available when connected to OZnzb indexer." #~ msgstr "" #~ "Połączenie z indekserem OZnzb daje wiÄ™cej możliwoÅ›ci, takich jak oceny i " #~ "dodatkowe informacje o stanie" #~ msgid "Site API Key" #~ msgstr "Klucz API strony" #~ msgid "Refer to https://www.oznzb.com/profile" #~ msgstr "Patrz: https://www.oznzb.com/profile" #~ msgid "Automatic Feedback" #~ msgstr "Automatyczne wysyÅ‚anie informacji zwrotnych" #~ msgid "Click below to test." #~ msgstr "Kliknij przycisk poniżej, aby przetestować" #~ msgid "Send notifications to Notification Center" #~ msgstr "WysyÅ‚aj powiadomienia do centrum powiadomieÅ„" #~ msgid "Notification classes" #~ msgstr "Klasy powiadomieÅ„" #~ msgid "Enable classes of messages to be reported (none, one or multiple)" #~ msgstr "ZgÅ‚aszaj wybrane klasy powiadomieÅ„ (żadna, jedna lub wiele)" #~ msgid "Defines post-processing and storage." #~ msgstr "Definiuje przetwarzanie koÅ„cowe i przechowywanie" #~ msgid "Enable generic sorting and renaming of files." #~ msgstr "Włącz standardowe sortowanie i zmianÄ™ nazw plików" #~ msgid "Enable if downloads are not put in their own folders." #~ msgstr "Włącz, jeÅ›li zadania nie sÄ… umieszczane we wÅ‚asnych katalogach" #~ msgid "Enable sorting and renaming of date named files." #~ msgstr "Włącz sortowanie i zmianÄ™ nazwy wedÅ‚ug daty" #~ msgid "First" #~ msgstr "PoczÄ…tek" #~ msgid "Last" #~ msgstr "Koniec" #~ msgid "Set Pause Interval" #~ msgstr "Ustaw czas wstrzymania" #~ msgid "Pause Interval" #~ msgstr "Czas wstrzymania" #~ msgid "Open Source URL" #~ msgstr "Otwórz źródÅ‚owy URL" #~ msgid "" #~ "Read Feed will get the current feed content. Force " #~ "Download will download all matching NZBs now." #~ msgstr "" #~ "Pobierz kanaÅ‚ pobierze aktualnÄ… zawartość kanaÅ‚u. " #~ "WymuÅ› pobranie natychmiast pobierze wszystkie pasujÄ…ce " #~ "pliki NZB." #~ msgid "Hour:Min" #~ msgstr "Godzina:Minuta" #~ msgid "Delete the all failed items from the history?" #~ msgstr "Usunąć z historii wszystkie nieudane pliki?" #~ msgid "Showing %s to %s out of %s results" #~ msgstr "WyÅ›wietlanie wyników %s-%s z %s" #~ msgid "Toggle Add NZB" #~ msgstr "Pokaż/ukryj panel dodawania NZB" #~ msgid "Are you sure you want to restart SABnzbd?" #~ msgstr "Czy na pewno zrestartować SABnzbd?" #~ msgid "Hide Edit Options" #~ msgstr "Ukryj opcje edycji" #~ msgid "Edit" #~ msgstr "Edycja" #~ msgid "I want SABnzbd to be viewable by any pc on my network." #~ msgstr "" #~ "ChcÄ™, aby dostÄ™p do SABnzbd byÅ‚ możliwy z dowolnego komputera w mojej sieci" #~ msgid "I want SABnzbd to be viewable from my pc only." #~ msgstr "ChcÄ™, aby dostÄ™p do SABnzbd byÅ‚ możliwy tylko z mojego komputera" #~ msgid "Password protect access to SABnzbd (recommended)" #~ msgstr "Zabezpiecz dostÄ™p do SABnzbd hasÅ‚em (zalecane)" #~ msgid "Enable HTTPS access to SABnzbd." #~ msgstr "Włącz dostÄ™p do SABnzbd przez HTTPS" #~ msgid "" #~ "Launch my internet browser with the SABnzbd page when the program starts." #~ msgstr "Uruchom stronÄ™ SABnzbd w przeglÄ…darce podczas uruchamiania programu" #~ msgid "This field is required." #~ msgstr "To pole jest wymagane" #~ msgid "" #~ "After SABnzbd has finished restarting you will be able to access it at the " #~ "following location: %s" #~ msgstr "" #~ "Po zakoÅ„czeniu ponownego uruchamiania dostÄ™p bÄ™dzie możliwy pod adresem: %s" #~ msgid "Skip par2 checking when files are 100% valid." #~ msgstr "PomiÅ„ sprawdzanie par2 dla plików prawidÅ‚owych w 100%" #~ msgid "Check result of unpacking (needs to be off for some file systems)." #~ msgstr "" #~ "Sprawdzaj wyniki rozpakowywania (należy wyłączyć dla niektórych systemów " #~ "plików)" #~ msgid "" #~ "This key provides identity to indexer. Refer to " #~ "https://www.oznzb.com/profile." #~ msgstr "" #~ "Ten klucz umożliwia indekserowi identyfikacjÄ™ klienta. Patrz: " #~ "https://www.oznzb.com/profile" #~ msgid "" #~ "Send automatically calculated validation results for downloads to indexer." #~ msgstr "WyÅ›lij automatycznie wyliczone wyniki walidacji plików do indeksera" #~ msgid "No UNRAR program found, unpacking RAR files is not possible
" #~ msgstr "" #~ "Nie znaleziono programu unrar, rozpakowywanie plików RAR nie będzie " #~ "możliwe
" sabnzbd-develop/po/nsis/0000700000175000017500000000000013642116632013325 5ustar jpjpsabnzbd-develop/po/nsis/da.po0000600000175000017500000000650213642116632014256 0ustar jpjp# Danish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2018-11-27 23:30+0000\n" "Last-Translator: scootergrisen \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Vis udgivelsesbemærkninger" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "Start SABnzbd" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Støt projektet, donér!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Luk venligst \"SABnzbd.exe\" først" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" "Installationsmappen er ændret (nu i \"Program Files\"). \\nHvis du kører " "SABnzbd som en tjeneste, skal du opdatere tjenesteindstillingerne." #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Dette vil afinstallere SABnzbd fra dit system" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Kør ved opstart" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Skrivebordsikon" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "NZB-filtilknytning" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Slet program" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Slet indstillinger" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Systemet kræver at Microsoft runtime-biblioteket VC90 skal installeres " "først. Vil du gøre det nu?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Downloader Microsoft runtime-installationsfil..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Fejl ved download, prøv igen?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Kan ikke installere uden runtime-bibliotek, prøv igen?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Du kan ikke overskrive en eksisterende installation. \\n\\nKlik `OK` for at " "fjerne den tidligere version eller `Annuller` for at annullere opgraderingen." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Dine indstillinger og data vil blive bevaret." #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "GÃ¥ til SABnzbd Wiki" #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> ADVARSEL <<<<\\r\\n\\r\\nVenligst, se først " #~ "produktbemærkningerne eller gÃ¥ til http://wiki.sabnzbd.org/introducing-0-7-0 " #~ "!" sabnzbd-develop/po/nsis/nl.po0000600000175000017500000000653513642116632014311 0ustar jpjp# Dutch translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2017-03-19 09:47+0000\n" "Last-Translator: Safihre \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Toon opmerkingen bij deze uitgave" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "Start SABnzbd" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Steun het project, doneer!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Sluit \"SABnzbd.exe\" eerst af" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" "De installatie map is veranderd (nu in \"Program Files\").\\nIndien je " "SABnzbd als een service draait, zul je de service instellingen moeten " "aanpassen." #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Dit verwijdert SABnzbd van je systeem" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Starten met Windows" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Bureaubladpictogram" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "NZB-bestanden openen met SABnzbd" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Programma verwijderen" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Verwijder alle instellingen" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Op dit systeem moeten eerst de Microsoft runtime bibliotheek VC90 " "geïnstalleerd worden. Wilt u dat nu doen?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Downloaden van de Microsoft bibliotheek" #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Download mislukt, opnieuw proberen?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Installeren heeft geen zin zonder de bibliotheek, opnieuw proberen?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "U kunt geen bestaande installatie overschrijven.\\n\\nKlik op `OK` om de " "vorige versie te verwijderen of op `Annuleren` om te stoppen." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Je instellingen en bestanden blijven behouden." #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> WAARSCHUWING <<<<\\\\r\\\\n\\\\r\\\\nLees eerst het " #~ "vrijgave bericht of ga naar http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "Ga naar de SABnzbd-Wiki" sabnzbd-develop/po/nsis/zh_CN.po0000600000175000017500000000623513642116632014676 0ustar jpjp# Chinese (Simplified) translation for sabnzbd # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2017-05-28 17:17+0000\n" "Last-Translator: ninjai \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "显示版本说明" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "å¯åЍ SABnzbd" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "支æŒè¯¥é¡¹ç›®ï¼ŒæåŠ©!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "请先关闭 \"SABnzbd.exe\"" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "安装目录已更改(现在ä½äºŽ \"Program Files\" 目录)。\\n如果以æœåŠ¡æ¨¡å¼è¿è¡Œï¼Œä½ éœ€è¦æ›´æ–°ç›¸åº”æœåŠ¡çš„è®¾ç½®ã€‚" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "这将从您的系统中å¸è½½ SABnzbd" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "å¯åŠ¨æ—¶è¿è¡Œ" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "桌é¢å›¾æ ‡" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "NZB 文件关è”" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "删除程åº" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "删除设置" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "该系统需è¦å…ˆå®‰è£… Microsoft è¿è¡Œæ—¶åº“ VC90。是å¦å¸Œæœ›ç«‹å³å®‰è£…?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "正在下载 Microsoft è¿è¡Œæ—¶å®‰è£…程åº..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "下载出错,é‡è¯•?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "没有è¿è¡Œæ—¶åº“无法安装,é‡è¯•?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "ä¸å¯ä»¥è¦†ç›–安装。\\n\\n点击“确定â€å¯ç§»é™¤æ—§ç‰ˆï¼Œæˆ–ç‚¹å‡»â€œå–æ¶ˆâ€å–消å‡çº§ã€‚" #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "æ‚¨çš„è®¾ç½®åŠæ•°æ®å°†ä¼šä¿ç•™ã€‚" #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> *警告* <<<<\\r\\n\\r\\n请首先查看版本说明或访问 " #~ "http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "访问 SABnzbd Wiki" sabnzbd-develop/po/nsis/es.po0000600000175000017500000000636413642116632014307 0ustar jpjp# Spanish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Victor Herrero \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Mostrar notas de la versión" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "¡Apoye el proyecto, haga una donación!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Por favor cierre primero \"SABnzbd.exe\"" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Esto desinstalará SABnzbd de su sistema" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Ejecutar al inicio" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Icono del escritorio" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "Asociación de archivos NZB" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Eliminar programa" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Eliminar Ajustes" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Este sistema requiere la ejecución de la biblioteca Microsoft runtime VC90 " "que debe ser instalada. ¿Quieres hacerlo ahora?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Descargando el instalador de Microsoft runtime..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Error en la descarga, ¿probamos de nuevo?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "" "No se puede instalar sin la biblioteca runtime, ¿Lo volvemos a intentar?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "No es posible sobrescribir una instalación existente. \\n\\nPresione `OK' " "para quitar la versión anterior o 'Cancelar' para cancelar la actualización." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Tus ajustes y datos se mantendrán intactos." #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "Ir al wiki de SABnzbd" #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> ATENCION <<<<\\r\\n\\r\\nPor favor, compruebe las " #~ "notas de version o visite http://wiki.sabnzbd.org/introducing-0-7-0 !" sabnzbd-develop/po/nsis/pt_BR.po0000600000175000017500000000643513642116632014705 0ustar jpjp# Brazilian Portuguese translation for sabnzbd # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: lrrosa \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Mostrar Notas de Lançamento" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Apoie o projeto. Faça uma doação!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Por favor, feche \"SABnzbd.exe\" primeiro" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Isso irá desinstalar SABnzbd de seu sistema" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Executar na inicialização" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Ãcone na Ãrea de Trabalho" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "Associação com Arquivos NZB" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Excluir o Programa" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Apagar Configurações" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Este sistema precisa que a biblioteca runtime Microsoft VC90 seja instalada " "antes. Você quer fazer isso agora?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Baixando o instalador runtime da Microsoft ..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Houve um erro de download. Quer tentar novamente?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Não é possível instalar sem a biblioteca runtime. Quer repetir?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Você não pode substituir uma instalação existente. \\n\\nClique `OK` para " "remover a versão anterior ou `Cancelar` para cancelar esta atualização." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Suas configurações e os dados serão preservados." #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> ATENÇÃO <<<<\\r\\n\\r\\nPor favor, verifique primeiro " #~ "as notas de lançamento ou vá até http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "Vá para a Wiki do SABnzbd" sabnzbd-develop/po/nsis/en.po0000600000175000017500000000002413642116632014265 0ustar jpjp# Dummy en.po file sabnzbd-develop/po/nsis/de.po0000600000175000017500000000701213642116632014257 0ustar jpjp# German translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2017-05-22 08:00+0000\n" "Last-Translator: larshuth \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Versionshinweise anzeigen" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "Starte SABnzbd" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Bitte unterstützen Sie das Projekt durch eine Spende!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Schliessen Sie bitte zuerst \"SABnzbd.exe\"." #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" "Das Installationsverzeichnis hat sich geändert (nun in \"Program Files\"). \\" "nWenn du SABnzbd als Service ausführst, musst du die Serviceeinstellungen " "anpassen." #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Dies entfernt SABnzbd von Ihrem System" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Beim Systemstart ausführen" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Desktop-Symbol" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "Mit NZB-Dateien verknüpfen" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Programm löschen" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Einstellungen löschen" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Dieses System erfordert die Installation der Laufzeitbibliothek VC90 von " "Microsoft. Möchten Sie die Installation jetzt durchführen?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "" "Installationsprogramm für Microsoft-Laufzeitbibliothek wird " "heruntergeladen..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Download-Fehler. Erneut versuchen?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "" "Installation ohne Laufzeitbibliothek nicht möglich. Erneut versuchen?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Eine vorhandene Installation kann nicht überschrieben werden. \\n\\nWählen " "Sie 'OK', um die vorherige Version zu entfernen oder 'Abbrechen' um die " "Aktualisierung abzubrechen." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Ihre Einstellungen und Daten bleiben erhalten." #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nBitte lesen Sie zuerst die " #~ "Versionshinweise oder gehen Sie zu http://wiki.sabnzbd.org/introducing-0-7-0 " #~ "!" #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "Gehen Sie auf die SABnzbd Wiki-Seite" sabnzbd-develop/po/nsis/he.po0000600000175000017500000000705613642116632014273 0ustar jpjp# Hebrew translation for sabnzbd # Copyright (c) 2017 Rosetta Contributors and Canonical Ltd 2017 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2017. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2017-05-06 09:07+0000\n" "Last-Translator: ION IL \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "הר××” הערות שחרור" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "התחל ×ת SABnzbd" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "תמוך במיז×, תרו×!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "×× × ×¡×’×•×¨ ×ת \"SABnzbd.exe\" תחילה" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" "ספרית ההתקנה השתנתה (עכשיו ב-\"Program Files\"). \\n×× ×ª×¨×™×¥ ×ת SABnzbd בתור " "שירות, ×תה צריך לעדכן ×ת הגדרות השירות." #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "×–×” יסיר ×ת SABnzbd ממערכתך" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "הפעל ב×תחול" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "צלמית שולחן עבודה" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "שיוך קבצי NZB" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "מחק תכנית" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "מחק הגדרות" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "מערכת זו דורשת ×ת ספרית זמן-×מת VC90 של Microsoft שתהיה מותקנת תחילה. ×”×× " "ברצונך להתקין ×ותה כעת?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "מוריד מתקין זמן-×מת של Microsoft..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "שגי×ת הורדה, לנסות שוב?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "×œ× × ×™×ª×Ÿ להתקין ×œ×œ× ×¡×¤×¨×™×ª זמן-×מת, לנסות שוב?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "×ינך יכול לדרוס התקנה קיימת.\\n\\nלחץ על `×ישור` כדי להסיר ×ת הגרסה הקודמת " "×ו על `ביטול` כדי לבטל שדרוג ×–×”." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "ההגדרות ×•×”× ×ª×•× ×™× ×©×œ×š יישמרו." #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> ×זהרה <<<<\\r\\n\\r\\n! " #~ "http://wiki.sabnzbd.org/introducing-0-7-0 ×× ×, בדוק תחילה ×ת הערות השחרור ×ו " #~ "לך ×ל" #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "SABnzbd לך ×ל וויקי" sabnzbd-develop/po/nsis/fi.po0000600000175000017500000000654313642116632014275 0ustar jpjp# Finnish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2017-04-02 07:38+0000\n" "Last-Translator: Paavo Rissanen \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Näytä julkaisutiedot" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "Käynnistä SABnzbd" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Tue projektia, lahjoita!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Ole hyvä ja sulje \"SABnzbd.exe\" ensin" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" "Asennuskansio on muuttunut (nykyisin \"Program Files\"). \\nJos suoritat " "SABnzbd:ta palveluna, sinun täytyy päivittää palvelun asetukset." #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Tämä poistaa SABnzbd:n tietokoneestasi" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Suorita käynnistyksen yhteydessä" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Työpöydän kuvake" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "NZB tiedostosidos" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Poista sovellus" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Poista asetukset" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Tämä järjestelmä vaatii, että Microsoft runtime kirjasto VC90 täytyy asentaa " "ensin. Haluatko asentaa sen nyt?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Ladataan Microsoft runtime asennusta..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Latausvirhe, yritä uudelleen?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Ei voida asentaa ilman runtime kirjastoa, yritä uudelleen?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Et voi asentaa tätä vanhan asennuksen päälle. \\n\\nPaina `OK` poistaaksesi " "edellisen version tai paina `Peruuta` peruuttaaksesi tämän päivityksen." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Asetuksiasi ja tietojasi ei poisteta." #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "Siirry SABnzbd wikiin" #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> VAROITUS <<<<\\r\\n\\r\\nOle hyvä ja tarkista " #~ "julkaisutiedot tai käy osoitteessa http://wiki.sabnzbd.org/introducing-0-7-0 " #~ "!" sabnzbd-develop/po/nsis/ro.po0000600000175000017500000000625013642116632014312 0ustar jpjp# Romanian translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: nicusor \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Arată Notele de Publicare" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "SusÅ£ine proiectul, Donează!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "ÃŽnchideÅ£i mai întâi \"SABnzbd.exe\"" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Acest lucru va dezinstala SABnzbd din sistem" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Executare la pornire" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Icoană Desktop" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "Asociere cu FiÅŸierele NZB" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Åžterge Program" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "ÅžtergeÅ£i Setări" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Acest sistem necesită librăria Microsoft VC90 instalată. DortiÈ›i să faceÈ›i " "asta acum ?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Descărcare rutină instalare Microsoft..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Eroare descărcare, încerc din nou?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Nu pot instala fără rutină librărie, încerc din nou?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Nu puteÈ›i suprascrie instalarea existentă. \\n\\nClick `OK` pentru a elimina " "versiunea anterioară sau `Anulare` pentru a anula actualizarea." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Setările ÅŸi informaÅ£iile vor fi salvate." #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> ATENÅ¢IE <<<<\\r\\n\\r\\nVă rugăm, să verificaÅ£i mai " #~ "întâi notele de publicare sau să vizitaÅ£i " #~ "http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "Dute la Wiki SABnzbd" sabnzbd-develop/po/nsis/nb.po0000600000175000017500000000630113642116632014266 0ustar jpjp# Norwegian Bokmal translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Vis versjonsmerknader" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Støtt prosjektet, donèr!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Vennligst lukk \"SABnzbd.exe\" først" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Dette vil avinstallere SABnzbd fra ditt system" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Kjør ved oppstart" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Skrivebordsikon" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "NZB-filassosiering" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Fjern program" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Slett innstillinger" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Dette sytemet krever at Microsoft runtime library VC90 er installert først. " "Ønsker du Ã¥ gjøre dette nÃ¥?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Laster ned Microsoft runtime installer..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Nedlasting feilet, prøve pÃ¥ nytt?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Kan ikke installere uten runtime library, prøve pÃ¥ nytt?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Du kan ikke overskrive en eksisterende installasjon. \\n\\nTrykk 'OK' for Ã¥ " "fjerne tidligere installasjon, eller 'Avbryt' for Ã¥ avbryte denne " "oppgraderingen." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Dine innstillinger og data vil bli tatt vare pÃ¥." #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> ADVARSEL <<<<\\r\\n\\r\\nVennligst sjekk " #~ "versjonsmerknadene først, eller gÃ¥ til http://wiki.sabnzbd.org/introducing-0-" #~ "7-0 !" #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "GÃ¥ til SABnzbd Wiki" sabnzbd-develop/po/nsis/fr.po0000600000175000017500000000677213642116632014312 0ustar jpjp# French translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2017-03-21 08:58+0000\n" "Last-Translator: Fred <88com88@gmail.com>\n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Afficher les notes de version" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "Démarrer SABnzbd" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Soutenez le projet, faites un don !" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Merci de fermer \"SABnzbd.exe\" avant l'installation" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" "Le répertoire d'installation a changé (maintenant dans \"Program Files\"). \\" "nSi vous exécutez SABnzbd en tant que service, vous devez mettre à jour les " "paramètres du service." #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Ceci désinstallera SABnzbd de votre système" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Lancer au démarrage" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Icône sur le Bureau" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "Association des fichiers NZB" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Supprimer le programme" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Supprimer les paramètres" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Ce système nécessite que la bibliothèque d'exécution Microsoft vc90 soit " "installée en premier. Voulez-vous le faire maintenant?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Téléchargement de Microsoft runtime installer..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Erreur de téléchargement, réessayer ?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Impossible d'installer sans moteur d'exécution, réessayer?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Vous ne pouvez pas remplacer une installation existante. \\n\\nCliquez `OK` " "pour supprimer la version précédente ou `Annuler` pour annuler cette mise à " "niveau." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Vos paramètres et données seront conservés." #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> AVERTISSEMENT <<<<\\r\\n\\r\\nS'il vous plaît, " #~ "vérifiez d'abord les notes de version ou consultez " #~ "http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "Aller sur le Wiki de SABnzbd" sabnzbd-develop/po/nsis/sv.po0000600000175000017500000000632213642116632014322 0ustar jpjp# Swedish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Andreas Lindberg \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Visa releasenoteringar" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Donera och stöd detta projekt!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Var vänlig stäng \"SABnzbd.exe\" först" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Detta kommer att avinstallera SABnzbd frÃ¥n systemet" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Kör vid uppstart" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Skrivbordsikon" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "NZB Filassosication" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Radera programmet" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Radera inställningar" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Detta system kräver att Microsofts runtimebibliotek VC90 är installerat. " "Vill du göra detta nu?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Laddar ned Microsofts runtimeinstaller..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Misslyckat nedladdningsförsök, försök igen?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Kan inte installera utan runtimebibliotek, försök igen?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Kan inte skriva över en existerande installation. \\n\\nKlicka 'OK' för att " "avinstallera tidigare version eller 'Avbryt' för att avbryta denna " "uppgradering." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Dina inställningar och ditt data kommer att bevaras." #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "GÃ¥ till SABnzbd Wiki" #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> VARNING <<<<\\r\\n\\r\\nVänligen läs först " #~ "releasenoteringarna eller gÃ¥ till http://wiki.sabnzbd.org/introducing-0-7-0 !" sabnzbd-develop/po/nsis/SABnsis.pot0000600000175000017500000000260713642116632015362 0ustar jpjp# # SABnzbd Translation Template file NSIS # Copyright 2011-2019 The SABnzbd-Team # team@sabnzbd.org # msgid "" msgstr "" "Project-Id-Version: SABnzbd-3.0.0-develop\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: shypike@sabnzbd.org\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 7bit\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "" #: NSIS_Installer.nsi msgid "The installation directory has changed (now in \"Program Files\"). \\nIf you run SABnzbd as a service, you need to update the service settings." msgstr "" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "" #: NSIS_Installer.nsi msgid "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade." msgstr "" #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "" sabnzbd-develop/po/nsis/sr.po0000600000175000017500000000755213642116632014324 0ustar jpjp# Serbian translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # МироÑлав Ðиколић , 2011. msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Ozzii \n" "Language-Team: Launchpad Serbian Translators\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" "Language: sr\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Прикажи белешке о издању" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Подржите пројекат, дајте добровољан прилог!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Прво затворите „SABnzbd.exe“" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Ово ће уклонити СÐБнзбд Ñа вашег ÑиÑтема" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Покрени Ñа ÑиÑтемом" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Иконица радне површи" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "Придруживање ÐЗБ датотеке" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Обриши програм" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Обриши подешавања" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Овај ÑиÑтем захтева да буде прво инÑталирана МајкроÑофтова извршна " "библиотека „VC90“. Да ли желите то да урадите?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Преузимам МајкроÑофтов извршни програм за инÑталацију..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Грешка у преузимању, да поновим?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Ðе могу да инÑталирам без извршне библиотеке, да поновим?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Ðе можете да препишете поÑтојећу инÑталацију. \\n\\nПритиÑните „У реду“ да " "уклоните претходно издање или „Откажи“ да поништите ову надоградњу." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Ваша подешавања и подаци биће Ñачувани." #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "Иди на вики СÐБнзбд-а" #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> ПÐЖЊР<<<<\\r\\n\\r\\nПрво проверите белешке о издању " #~ "или идите на „http://wiki.sabnzbd.org/introducing-0-7-0“ !" sabnzbd-develop/po/nsis/ru.po0000600000175000017500000000673213642116632014325 0ustar jpjp# Russian translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Pavel Maryanov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Показать заметки о выпуÑке" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Поддержите проект. Сделайте пожертвование!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Завершите Ñначала работу процеÑÑа SABnzbd.exe" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "Приложение SABnzbd будет удалено из вашей ÑиÑтемы" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "ЗапуÑкать вмеÑте Ñ ÑиÑтемой" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Значок на рабочем Ñтоле" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "ÐÑÑоциировать Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ NZB" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "Удалить программу" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Удалить параметры" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Ð”Ð»Ñ Ñтой ÑиÑтемы Ñначала необходимо уÑтановить библиотеку времени Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ " "Microsoft VC90. Сделать Ñто ÑейчаÑ?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Загрузка программы уÑтановки Microsoft..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Ошибка загрузки. Повторить попытку?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "" "Ðе удаётÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ уÑтановку без библиотеки времени выполнениÑ. Повторить " "попытку?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñать ÑущеÑтвующее уÑтановленное приложение. \\n\\nЧтобы " "удалить предыдущую верÑию, нажмите кнопку «ОК». Чтобы отменить обновление, " "нажмите кнопку «Отмена»." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Ваши параметры и данные будут Ñохранены." sabnzbd-develop/po/nsis/pl.po0000600000175000017500000000624013642116632014304 0ustar jpjp# Polish translation for sabnzbd # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the sabnzbd package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: sabnzbd\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2018-12-24 11:01+0000\n" "PO-Revision-Date: 2013-05-05 14:50+0000\n" "Last-Translator: Tomasz 'Zen' Napierala \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n" "X-Generator: Launchpad (build 18847)\n" #: NSIS_Installer.nsi msgid "Show Release Notes" msgstr "Pokaż informacje o wydaniu" #: NSIS_Installer.nsi msgid "Start SABnzbd" msgstr "" #: NSIS_Installer.nsi msgid "Support the project, Donate!" msgstr "Wspomóż projekt!" #: NSIS_Installer.nsi msgid "Please close \"SABnzbd.exe\" first" msgstr "Najpierw zamknij SABnzbd.exe" #: NSIS_Installer.nsi msgid "" "The installation directory has changed (now in \"Program Files\"). \\nIf you " "run SABnzbd as a service, you need to update the service settings." msgstr "" #: NSIS_Installer.nsi msgid "This will uninstall SABnzbd from your system" msgstr "To odinstaluje SABnzbd z systemu" #: NSIS_Installer.nsi msgid "Run at startup" msgstr "Uruchom wraz z systemem" #: NSIS_Installer.nsi msgid "Desktop Icon" msgstr "Ikona pulpitu" #: NSIS_Installer.nsi msgid "NZB File association" msgstr "powiÄ…zanie pliku NZB" #: NSIS_Installer.nsi msgid "Delete Program" msgstr "UsuÅ„ program" #: NSIS_Installer.nsi msgid "Delete Settings" msgstr "Skasuj obecne ustawienia" #: NSIS_Installer.nsi msgid "" "This system requires the Microsoft runtime library VC90 to be installed " "first. Do you want to do that now?" msgstr "" "Ten system wymaga najpierw zainstalowania bibliotek Microsoft VC90. Czy " "chcesz wykonać teraz instalacjÄ™?" #: NSIS_Installer.nsi msgid "Downloading Microsoft runtime installer..." msgstr "Pobieranie instalatora bibliotek Microsoft..." #: NSIS_Installer.nsi msgid "Download error, retry?" msgstr "Problem z pobieraniem, spróbować ponownie?" #: NSIS_Installer.nsi msgid "Cannot install without runtime library, retry?" msgstr "Nie można wykonać instalacji bez bibliotek, spróbować ponownie?" #: NSIS_Installer.nsi msgid "" "You cannot overwrite an existing installation. \\n\\nClick `OK` to remove " "the previous version or `Cancel` to cancel this upgrade." msgstr "" "Nie można nadpisać istniejÄ…cej instalacji. \\n\\n NaciÅ›nij `OK`, aby usunąć " "poprzednia wersjÄ™ lub `Anuluj` aby anulować aktualizacjÄ™." #: NSIS_Installer.nsi msgid "Your settings and data will be preserved." msgstr "Twoje ustawienia i dane zostanÄ… zachowane." #~ msgid "" #~ " >>>> WARNING <<<<\\r\\n\\r\\nPlease, first check the " #~ "release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgstr "" #~ " >>>> UWAGA <<<<\\r\\n\\r\\nNajpierw przeczytaj informacje " #~ "o wydaniu lub odwiedź http://wiki.sabnzbd.org/introducing-0-7-0 !" #~ msgid "Go to the SABnzbd Wiki" #~ msgstr "Idź do wiki SABnzbd" sabnzbd-develop/COPYRIGHT.txt0000600000175000017500000000331613642116632014051 0ustar jpjp (c) Copyright 2007-2019 by "The SABnzbd-team" The SABnzbd-team is: Active team: ShyPike inpheaux zoggy Safihre Sleeping members sw1tch pairofdimes rAf Honorary member (and original author) Gregor Kaufmann The main contributors and moderators of the translations Danish: Rene (nordjyden6), Scott Dutch: ShyPike, Safihre French : rAf, Fox Ace, Fred, Morback, Jih German: Severin Heiniger, Tim Hartmann, DonPizza, Alex Norwegian: Protx, mjelva, TomP, John Romanian: nicusor Serbian: Ozzii, KriÅ¡an Darko Swedish: Malmis, Kim Joahnsson, Patrik-liind, Chris M Spanish: Syquus, Adolfo Jayme Portuguese (Brazil): lrrosa, diegosps Russian: Pavel Maryanov Polish: Tomasz 'Zen' Napierala Chinese: XsLiDian Finnish: Matti Ylönen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. See accompanying files GPL2.txt and GPL3.txt. sabnzbd-develop/interfaces/0000700000175000017500000000000013642116632014056 5ustar jpjpsabnzbd-develop/interfaces/Glitter/0000700000175000017500000000000013642116632015470 5ustar jpjpsabnzbd-develop/interfaces/Glitter/licenses/0000700000175000017500000000000013642116632017275 5ustar jpjpsabnzbd-develop/interfaces/Glitter/licenses/LICENSE-Apache.txt0000600000175000017500000002646213642116632022313 0ustar jpjp License for: Bootstrap -------------------------------------------------------------------------------------------- Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --------------------------------------------------------------------------------------------sabnzbd-develop/interfaces/Glitter/licenses/LICENSE-MIT.txt0000600000175000017500000000247013642116632021554 0ustar jpjp License for: jQuery jQuery UI jQuery Peity Knockout JavaScript library Knockout sortable Knockout filedrop Knockout slider Knockout Persist DateJS MomentJS -------------------------------------------------------------------------------------------- The MIT License Copyright (c) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.sabnzbd-develop/interfaces/Glitter/licenses/LICENSE-CC.txt0000600000175000017500000004126413642116632021414 0ustar jpjphttp://creativecommons.org/licenses/by/3.0/ http://creativecommons.org/licenses/by/3.0/legalcode License THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. 1. Definitions 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. 2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, 4. to Distribute and Publicly Perform Adaptations. 5. For the avoidance of doubt: 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. 5. Representations, Warranties and Disclaimer UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. Termination 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. 8. Miscellaneous 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. sabnzbd-develop/interfaces/Glitter/templates/0000700000175000017500000000000013642116632017466 5ustar jpjpsabnzbd-develop/interfaces/Glitter/templates/include_queue.tmpl0000600000175000017500000003615313642116632023225 0ustar jpjp

$T('menu-queue')

$T('Glitter-left')
B / B $T('quota-left')
B $T('Glitter-free') ($T('Glitter-freeTemp'))
B $T('Glitter-free')
  • $T('Glitter-sortAgeAsc')
  • $T('Glitter-sortAgeDesc')
  • $T('Glitter-sortNameAsc')
  • $T('Glitter-sortNameDesc')
  • $T('Glitter-sortSizeAsc')
  • $T('Glitter-sortSizeDesc')
$T('Glitter-addNZB')
0
sabnzbd-develop/interfaces/Glitter/templates/include_menu.tmpl0000600000175000017500000002162013642116632023036 0ustar jpjp
#include $webdir + "/../../Config/templates/staticcfg/images/logo-small.svg"#
  • $T('Glitter-pause5m')
  • $T('Glitter-pause15m')
  • $T('Glitter-pause30m')
  • $T('Glitter-pause1h')
  • $T('Glitter-pause3h')
  • $T('Glitter-pause6h')
  • $T('Glitter-custom')
0:00
  • $T('Glitter-setMaxLinespeed')
    • $T('menu-help')
    • $T('menu-donate')
    • $T('logout')
    • $T('link-resetQuota')
    • $T('button-rssNow')
    • $T('sch-scan_folder')
    • $T('sch-resume_post')
    • $T('shutdownSab')
    • $T('Glitter-restartSab')
    • $T('Glitter-onFinish'):
sabnzbd-develop/interfaces/Glitter/templates/main.tmpl0000600000175000017500000002367213642116632021324 0ustar jpjp SABnzbd
  • $T('menu-queue')
  • $T('menu-history')
  • $T('warnings')
sabnzbd-develop/interfaces/Glitter/templates/static/0000700000175000017500000000000013642116632020755 5ustar jpjpsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/0000700000175000017500000000000013642116632022772 5ustar jpjpsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/js/0000700000175000017500000000000013642116632023406 5ustar jpjpsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/js/bootstrap.min.js0000600000175000017500000010772013642116632026554 0ustar jpjp/*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under the MIT license */ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'

'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);sabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/fonts/0000700000175000017500000000000013642116632024123 5ustar jpjpsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/fonts/glyphicons-halflings-regular.eot0000600000175000017500000004750213642116632032431 0ustar jpjpBOäMLP”Xª.(GLYPHICONS HalflingsRegularxVersion 1.001;PS 001.001;hotconv 1.0.70;makeotf.lib2.5.583298GLYPHICONS Halflings RegularBSGPv¤5O5U-RÍéŠÈ`ØWÉhKqJx"U:r,/–4\›Ü liÒÛÓñˆÊšEÇLFM´Æ€åV(gÔW6¹§äVä–`mƒ_fZž}‡~þÉÏHÊú¸ði%Ã[Dd…™"wã«ÀÐz’, ߘèËbAÕi*öåÕ+2 †î8€ Ë,媳ÃÖBÜIP×fI¦Í¡IöÞ‡Ð+ͱÖw£3¦-»éµ«bÔbä Ë‹\.µf©0Žg¬²-ô}P1—'ÏÀ=‰©¶®n}@À¤@Ø±è Ør›ÑU ½³¨²˜¸ù+(,¬©UgÄc´ã1­wüã†Lü¢9¶’ñ€ùnè†`ÙŸGvŽ!¢(\SÕÈJTïsÓ3dª&ruëNýÛü]Ú}ãLq¸ŒÔ4°ÒÁ5W¸e¡o@7Ü@˜Ì`Ãm`ʆ”6§êP p\£qf‘3h<@AÔÃU&QÕ*¹µã]Xœ%iµ,g!RBÒa/2ñ2!y3’°tM… E ûzEÚ2Ñ Ëœðp¨Eë`¹õ2¯)Ã;ßBÉà‚ôhŽP*ÊЮ}.]†jE·½+Iø*(LÆÇò‘=åsäVsXÑN–â:•Çõ eÕOo¥[Š™àáñÖP6”R¨¿6©›ÔÎt²/êlÕgx(’y{aû°D"¯ï‡÷Z‚žß È1÷†¸(ÏdWNúÝðµrÕG¢®|ÃM¥E×X§«¤qÛ•… :Ä"59Q)3eó£B`\ê­å¡ñYG>X)I 'øË_\jÉЋX+†Ùoäƒz˜ïTy7*au(ÖíäÌÌB ¾µ@ºôhâíÚí£ð¥ÿœ¸a@8ç§íHî{/ÔÌÂ<ý¾ÔüþÖbb´lðj½6sê ’vÖ)K$FœûY5×EêD€)µEZ¶3V¸€f®S&?"Áû•†Õ °–}Ó2Q?™¡ ˆh’宿„ñ64åÄ3ÖÂÒY+4W„š£­R@ µPâÛѯ2YJëÔÙŒììTÐCÉøEc*××4âg6ÿŽ©ì¼¤[ 3|ØCóà¬ùY©}˜‹ e R¹_|ñ´¢o›EIÉ{‘Ìcò²ù %žf¸Ä_ŒYQºW– Z`Þ}.䆌‚Ù‰üÊ Ê¾¹‘0fìe3x1Q'ˆöp°k^¢õò,ü[QÀÓ€a§µØlf²@.Ç]šJYo4™‚ _×Íž¹­†û]“ăÂ98B ‚xéßçbˆÂù–95¾"u‰H”0ŽS¨?¶ ÒqÞ+‰† ÀT×'(aÕ;:ˆ<m’HÝL¿de¡M·̤ÂÑžo…2SQFŒ¡2cþ÷¥æ(Ÿ:Bµálìó:€­àø(‡Ý=<Ñö¸Jæ,‰ ºö‰k*Gâ2›CÇ­ý$¶÷Î\ šã [Í©pº.+Ö|0‹ÊL9:GÃ>b¼ðYDo˜V9hd,˜ Ñij¦‘m®¾TÊeX2WŒ‚³^qû¿Øjö>!Ò*acâ¥zå8Y¢ø"'Õ÷r=€ÉφS•ñ*!\!áv»ÿ½ª4¢—IQ‘²aʇ­éÍœËmŠÊi¬âRé©ÌÐ3N%ÅÑýJÁx">7Œ„’22M~–¶Ê½2f¶°Gä%!)q×AÌá ‘8(ÿ ˆb§v’^Ü*Ù[p\ Æ6tµñ wŠCs°ý—Ò,§ lÉf CÓ¹ëi¹ScDŽ—'3ÏÂM‚œ%Ž©f Íaõ©° óKµ“£(q‘*²M¥B«˜$ñâôH“Ú\ÉgŸÂí«pú‹Ë›‰¢2Ô‚€XÇAXð8‡pØÐ(Ó©jÄ©oBfÎC #ËL%cfµØtnépe{\·¡ë“‡“ÆÅ7¢ ,úÄX§Ä±PÅ%ô€"Ó7ÅX¢^ßP5,M v…É“uÊÌUÆ:A÷ò÷I¹1\Šr8€¤ä©iEñxéX÷ÿˆ;dS4ôfáÇÞIüIúO“R¡’ÜH4 à(Fƒ´Fr™‡xžb7UЈ@òþ†ã´)y~c8¢° è 8¦=½ñ£o-ŽŠ+ÜÜn ‹¤3¹¹D2 ý„ê Ä5ˆLf!ú¿Àö7ÛÁ‚åYd†â>µ¾Nây¹ }§“À6ŠÈóö¥íâì+¯ÿí9÷£ÌTäkŠ)$EÔ´JdZü³°ÙŸbøËÈÁ”Y¶Qt9äÏâ0l?,’âŽðÒG )ëyaGAÜ;;Et¯ÔG¢Šæ5vÁŠÕ!rõÂϨ¨&Í÷û™—HA†´tòÁHíˆQIž6íÿ_[¯…ïØÕ›Ä…š§O­Í‚¿DkôÙ3Q’X,ÂÂ)ú+ˆÒílUb'åvòëþù/›4/ãhí8ÈPî½ð‘nAHžœ“„)­¹ Oc[óÌ ;$Û0f󨡭¸¶YnK0ã‚Äs~¿kR_œgA‹c 1û¡x…á¼ýÂG ºñï)`BÊY’|\„P£Æ8„0fó
Ôi?ª6!‹<²ÿ¬VrÐvƒ‚å¦2­yÑë­Ä­(íc» Ô¾¡‘hëîp--¨0ÄRÕUÄB¦oFÅI)™OŦij2j¢D!Y|`ž €jíÄ," µ¦ec)1£d:n*«îËåÕFÝ]†|rŠ=q »éÏ üÉ €lå&Ê#nƒvâú[¾g›LüiZè,¼àIP·ˆ•¸vƒ*³“]Ú/ &ëÉ_A.P@ªæm¡5*WñfSÊð¦]*°` g5¥Ëºr3ÝÌ]Bo ÁhÄé«ÇrÉ/ODˆŒ²Xk‡!K û9eðÔ%àê‰áäÌÐ#{7Ap —ÃFèpt;£è²3Ì”=Ï$)ä@àŒ³Paw&˜¨§ãql€=Õ¡r§°‡À¤Jãó»ÀʆBà¾ð²øÅ]£œn´ u…£¸&ÜǸJAÚ{¿)mPôÜFàl/—0,&wª¥pÓ„¾JܵºcHKÙÂm …ä^©rôdòð˜p¬„á×JÔa àÅ ±a™‚&[ýü÷zš‚ªA†'~(ü/®'[hvo«X`úe£ñáÂ@Ñ0&­fk«‡Ÿp¨d¨d¾ÛñhF eö«T÷ÿ]‘·˜%Q*¤¯¨¶ÕÛ%RB‘êÞY¬µë†Xz'R2óøs†\8f…Ü=€ˆhýãîs‚zGqntU¯‚"=f]ô©BÂ`…|˜xZÅ´,×('{$$Ó–LYSéÅ”‚¾âo¤óm" ³P:éü¥ÊéÜÀôäP¨“ò#/JD«þßîé¥ÃŠôd-,Þî…:N"®AÛœ{m"ej¿“ J݂ǡÔÒ%‡C(ŠvÑ3MxÇ:‘yµAI3Âý5Ã/¯¸!o”_çò½È•~gÅ…±·éu{‘ØØ}ðY´Å&Á‘á¼IƒrwH‚Ù¥ Ѳ¥Úž‰ÿ"«@“Ú³vç4aÖFÿò , Ö!W§¦«Eˆe¸$w”2hDÚ$³!Â…B Kø¥æÅ)V"Èñ z‰šuûзžLÆ^•{ú<޵ð7ÍÂ+€Ëéí¡7¤ÓÈEF!ýâ Uvî!!–—4=Ö¾ƒ.Ã}$Çøbボ¦¡…·Æˆ›&òcÆþ8Á,é÷<Ü£ @Ù7t}á£Ò–Ö!²¢úG8saÃ}€ÿ‚ ¶ ²d^IGtÁ&(Ì"«Û)\ä<Éc‰8²¯%óv¸vÁÆ fPn¶./ÄçÖì × !¢Ã—çd@Óà £Fh™Ù0k¤À¨ÊÃY©t¶Á»#_K¸gSØò:0Òs(“¸ý__34 ÆX* Š€Ö|B4v}a±‚¨ËD*Ww°wK)þÝÇpÌ6ìâÞ¨ñ­äzÃðB 5|R)SP¨ä¸Ú­çÙ¾Ôƒ&·>;$ð\0$d¶2­ö»ÿ'¡ÐZ ]d};et_d^¾$žkëéz,¹ +…Éä£É­È„cø8Ð…¿0!O‹DPجd¥-l8 ”í®íÎ@øúM%€ŠåäÑ…x‚ì¶\•)Wƒˆµ´ˆèYl°Œ(¦|µV –lNìNoÔBœáé×@Sñ‹ç:~eºÉŽ ÝÒB¢®„ï.³aÕÀé¢bÛ¶ËdmuïYH'‚¶‡á#'ðvº°cн=ÖÑÐlN’$B‡ä‚UÙ>c§jMåÀ¡âÑ)R©ÉÈÙôRÄçêþP éòÿ,ï’ªÐ!–?±…*úgèo$‚õë3@äd ò6<Ê2?Ñ­¢/ôÎϪX%‰,NPúª‹â›Jú™o©< –smÿ†ÊtÝ(3 ±Xùà@YæÀ3/¦Žèä3d¡8]IÚ‰79Yä`æL$¿Z’ƒV‚ÈÔƒÊB:kbŽ[5Ń@PZâ‚ú!e"-6‹F.ƒ$[+Ò}§º´YABã‹`2£ÉÖ|‘üe¶Ó5z5¿2¸,‰"ÉôÞb[/ÊJœ‘.+ÕWèËÕ „ëÑQ«(4©ÈF÷ê £132ÑšâÄTéc0¸áÅ„EM:Æ G°nBÛ¤äe¨65•Y-`±Ö0†ÕÏÒ$øN ÞH†XÆPZaûž›âjL`² ^Džä’XJ ì!ÉdÉ …HèX9é¶Eè}ÑÃÉÐ\ư/4 " £«ñç{wª» 1)P†ÍB€VÂ"?ôçÅü={ÅÀ£¶ƒjªßQ·TïB"Ö"É’ÚÖ°œ²§ëˆÛ\èk ˆ°IŸ“q¸yp$A;$Š~žœL\ÌÊ”ôÊwdU‰@–yûmŸ}±…;–uåf"™‘A )>¸ð'Ð+¬!Å“ùd¨-ÄiÒ1‹‘!“øghºgž\gÚ€Â"•[ ̳]b¬¹1B×í#¬A×Ć$áèÑ]vx‘±¿h\–mÈ´ŠÏ‘"iƒ÷Ð(ò³0/ˆñŸëÅ›ííñ®4\ÛPÁ”3á;çr673<F=ÔG¾2—ÙúSþÍ•‘¨î|+Ä+•@Ù~òÄJx"ªÖ9HŽkÒx§cs1‹Äܘ"Cy2oK—©`8fú‡ç•A-ÀáÔDGŠcO¿a—\E¥¿XØ æ†ùá;Ô§l’2?ÊÈ€àÀá·Ó:}‘¸ä‘öéIj,½ª,ß1ŠÉ‘E2 US¯õºÐý‚‘¤W’)å¢C0†ûà·…(Š ¼¿‘v>±0ëǺ¤np[L³·ìP3@4ü]{T~A?ñ€íî´Ê›X4ýgY) ç3«<2^.+é[¢ýJa Á€ÊLc™‡E‘;DUI`$ßH#`2r•-¡@*ýEEŰ·Oc°‚ U/㪽%Ý]ÛϤBVe¶Ý–ŽF¦Òä(n!…‰–géN/¯<9˜ËB¦<¹ˆ¼ÈÜ u‘Tà ™Õˆ¬’>W§/ød(ᨦ:Ú9RN§+hç|ÿ ™ÓòØØ$´#‡àg@q!¦(=ô~®5õ$•‰ª?çÜx—Ôš[³!»eÀ‚—mÜ 1’…8‰õ% ¾ ,Öíò¨E!l[ ÷½ðÒô/Ù)^à¬Ê¥ãY½éç«ßÈÓ€³ú qÛN)…áæ§ª Íñߎ‚ÄO¿~§Nðp?a§i Ð=Èð¸0ü(¯$Sïš”Á‘!•wÇf`-¯l.j³98ŠÿL¤“¯ßòwÖi;÷Ä"Í‘’Å‹\—ñ\¥Ô+Ý?Ã…_lQ"ÆZÝ­¢NìþqÛU.À YTX3L‘ÇñH'ÉN'c÷É7ሡËÿPîÊÎýÓq8œÝs§_¼NCR.1! sXñ²$µM¯—À,î|8<@ Í>Ô}²ŸENt©lXÔÓ{ét†Æ F¤äÊŠ1”Þ!í7j¼4éÅâEÀÖ"^Ë þ¹êåëð¹Ãp.†ä’Ì–‹¸ï ùÇ꘩3¶ñ@h[‰÷0zËd‚T"®qé®ðmh &½®³²ŠƒÎ êKlJûøL†²O7‘ùžl Q!ÈÖù%t­ «•šeV=Àêé†C’@Rî$M%G¹*ç1Š@ˆ^PQRÙÕZÈ„L-,„1¯# ÜeAm°EÒ4Ár͘}¹cJï¤âÛ$¹–éQßS*RS÷¾Ôx! ÁÍžþaXóè7á;£@"oYºka¼û×ù1“’Oü+¸›~Ó4€¼ðÜJàQ¦~×”\V·p&B! ’w‚ð=Õ¿'l= ›“îÄŽç.Däþ-͇¤$íºKël†YD —¶©î ½œU³4æÿ·MÍ5 ƒgDôÜãñ”êGäøhÝö€À¦<³<'‚Ô<_‹`¿rƒÿЙ ­<½†`ÖÓÓPÂgm÷ßÌô XP`ѧ¬Ÿwý ˆ©ùæ^¡ú`#÷z-\è#á>JÔ- ÙB£­º/ÈWÌŒ3]»ñ@±Lo Éu­ úÖ/^raà@-ùTAYZ*ãíÅ,¤…˜H·f1ZÚD•¸F¸˜ãÕÔZL!<<ÝñR šÄ:.áðJÖèU-J©-d¬œ©n8%Â3jÀ¢ ‡xù…0’¸¤Tµêä¡‹„hÙÆA© 6äÂñ–ˆ"­¾jÂI›ÅÊ{u#yŽVY,Òº£¯­šCdY±¾¯ƒ¦Ì|N:Bº(×XN²²Pìî¸|­E3wQiï6Ò¸í a3NÌÈ*nö°t^¹s ™k+Éþ•¶¶HÒh–Ç v2µ0¡á¿òd &Æð€ýß“ÅjÌ B8ÊÍÊÒNƒ¦ïLØÅ´’À^ù8Ù*’'Ýh™í]:såæ—‡¾Çªû°$¹5ÈqÄæ_.k¦~aDšEÖs}þ#/i®Ǥnú&Œ"58¼¾7díiÚ2… ¬TqYáP‚L¨F=4ÐÞÔY‚"?ÛFæä[¢Y^æà9 Z ·NJ7ÑgH§iÊj€i!É•Ñ-Z'€ä2Èp»Ppï,³ð`ø:ÜTO M6âªTÃÂÁ_«&žtÎ’æêÆ ×*oÙ÷˜Ì7ªÄ;×ÃÜGØm§*üéåŠgØ?4¤d tPðÿ¡IÌô‰FŠ&Ë(wÒËW¶v[¸(Oˆ©ýô$K@ˆÌFÊ-{£ ˜ d±Cn½A%$[AÀÛ7,LdôôÒâÜøGãº:2éÆgÙ4̵3ôÌ•xÐ Té¸çÁ÷¤^ZËFKpÛ ¨K+X¼¹‘–ϸkîT¬ë@Dv«ôé12øü=‰G4hañYÕÏãìÙp•JžJsC'“fHcÙˆMÀ-P› HŒ)ot/5o!ôŸ@ð=×8úpc 7écBTh|qÝßëÔÐ$Ù⟠¸°žâÊà_°qP1Fü¤ÀÞqº&Œú2«O¦†¸Vø§Âå4hø:½øŒ<äV4õ.¸|Ð # ®–<ÚÑvƒ£Ô±øö# A¶zé[tõm­¢ ²“íýT¡Õ±sèšm$^ž~‰©øÐ²k›ÓcM™pA•È  †ò‘¿‹rNáBVÌ2E;œî#Hþ¨¢J0™x’°ŸNF4-Áè0I~odTÐf\(h.tqQG<`½Ádâ|(ÏjÏùB¡áìØ¥|! €àÖ¶ÁOÌeé…袲§B))m£SXž]‰ÆuÀ‰SHX2¤+à }å³LªžF…˜ ]%JÊÛŠO0„Uö*p¡ÍVå …iÉIAt¥»ß6ªGìT½÷»ð°ÿCYåýœªÛæ~9<|™Æ¢Û©&ð€+æÏ•ús7Ñ…¤;rS’KN> bK±ÿn Kkü¿9‰:]`é=h€îCr@µ…‰üys8Þrø-§¸¥dzdü‘Èe‘\ñJ授“| Sß: ð×%š¤á’Âô&Ò”`"ÓÒÏŒbȯy% üZ"xÞÅ6)U` “ÞdÁKý,Püi1Ÿ¥%ÏY8)ÀdÕjÿ³¡ÆCùi#Yõ rd–ßDçYåé|Ñ)ÉÊ¡P[ß»Pqj©;,÷EVcLª !4oü>ËZFέWŠÃy~¤‘#•°hO1h|mÙ>6&ÛÎ g§&K…iý_qö$mŒr±Ç«9‰ÙgV뛉þFi5).`)s¦&ŽË´‰ ãm%‰!0<¬:ð…I씜KéJf‘MÍÿTÁMj¼·±áÎæäN_CLþGú‘!¾cÿM*ð—5Ù1¿n~“ž0Åqì€w¥!sd½Åλ?;´¶œL‚jüeÀâ^þÑÔ‡-¯å0—àÈ4GBTäÍäN^*L¸)x]#¹t:ÇÆBüK¤k¡ 4ÑûÌܪBW “>$RöçÇÃ߸SˆÇ2E*Ƽ½>:\|êPüUË …ãçX{Âá“;| fk îÎd·ÙdQ$§Ê²>àtf›Î‘šÌð6²,N\tDnÁ‚ÞEì“Æ¤,¥ßnfÞå E&ªãi³qiy4λ¨É¡ÆÌJ? Џ¿õ'ͧñþ¨F»#µúØú/Õ˜ÒhGúŒç µC芶'’î‡Á8Jfë¿ÚnfºaS¥…¨‚«#ÒÙÓ€ÿo‚ 0ŠQDAg×åÏ/Å¥„íyÊæ†.dº Cªªp&æÀèQx›'Š Þ‰Q•?¥…YV‡GÅW!‰°åÅŸt&Hýžì¬ú «cTÇZå–‘uh7©gC£`^(üª¥_ Ë®ÝÇŽ²üœ³ØŒGu‘ö lP†V@Ö@åù±§zÇJP–e›ûŽï©Û/±ª"ôÿWe8–J-s H7àa…[¥:çñ|ñR£¾Çp acð U'¡ñî?Á¿81§ñ>ÐÈy ª†.“¬þO—vJð&ûm™¨£¢ÂpZ‹x¤–mQóäðŒ¢ŠRÚ`xGˆL˜–΄xØF² Ð~ÂÆ¯‰¨Ù¤n„g4q¶Vìé[4î±âïùþ˜\lmÇœ#SÈükÍøgé@³Nör⎶“ïáNQSƒh8ÓÛŽªKg)ñ^F¦^¯‰AÓÔ±´U„£ÀüKxTÃv#ÁI>l«Š¤cß»fÏ8ÏExÒ–+-sÚ!‡ Bûseª¡c.S¨ÆŠ8ð/V*ˆª1 o ê)Ÿ€ÃîvÁ¼p-œ¼-ò”ØÓ¾¡]JQÔ ³ °9ï4÷7ÒÅŽK©´Æ¾EËz= l©=kó§Å}jÏ&–ó9S9APIWœðY˜„jnòña£L=«” ¢ŸD æ-cù1c@ÿa]Ö ”ëšQgÌÑ`„ß}õI¢q(Aù­L¸'÷”4LJL¥ê%>;î’Uw—Øn&ÒŒÐþ”9Jìë[θiÔCjE7†OŒ€kú.ZõØñQk§EŒ£/Ö]ׯ%Î\èž2×])–Did¯÷x}6<žÞë= òâV?y½MFp8X*>²C;Uý†¹V!UªÉo|Ú%œPx2ŰŽ$Ô`UlBjæÞ© \½¿xëËÖq ì´™( Fl IŒkÝŠ˜!û€µ·&jhŒS> µK?À–!δÞH ÑX{/ü÷uøžÐv8à„½D¸‚&}¯@'^A™8϶`ŸZês9íÀ-±:muâ<«nS) X\/¢*; àš=õD²Ër46†%0¤B1@#â•Ìæeì".—"ìE…Ÿ÷¤±ä‚ýÜ6*MYÓRç\ÄÖZNåÅðÍ©”µ=h;´78<+8#qÆcA&ÖŠ…¾^:ø‚ôʨ&~®„}‚@†8€½É•–›õš©u©êšR¨Ÿb@€RtŒŠ L“ïTeú8Ô '’pCªÄZV5 »¹kZÓåd©r¬͹ZHs…6ðJ€ƒªà5HÊŽÜ— D’´›Q=ÚUHÎÆ‚e:kyõÞ#D¥®K»¥èŸ7vÀô/ðñV !Þ:o¨‡a<¯7B¶ÉŽºµö‡ñ•¦n‹ã!OÈøqžæM‡a˜í a4âÓŠ Åóö§œVÔCÁ`·ì8'™¸xTš\Т;⊂ô)¸¸Tè\'\Ô'>RD+FñÈ“µˆhZ ZéRùº §kéÌñà¬G× Iä}¼x³ó6æGÀçŸçK:^{Cþ0bP‚"#õð4Dy¡Z!^9j°¥ï€YNÎÏ%aSÁw;T)Ê€“kÔ$ú åhqHÒO®¦>ã•ý/áœæ»Ò…FæP+¨™:¶ý`êîâ K^›þ«uÀœJ¢ö‰Ä>xxý)GSœO݃K,xUãí9ÖQíåF‘‡Sx%JO<8Nj7š¦f¨ŸŠ^ÕÒšµÍŠØ_S qàŠqýBGS„˜íå…'ÁALÑØ·®› 1Œ#Ôp*þDß»¶ÁŠ<`FoÃU©ÍM¨àg5€ ðÌWò¥Àº¯ÆÿpE§ Ä—TæxyiYm,Á%ÈÏúhTM6¼QÜ ¹U‚ ž5& .¡K´dQp&£=¿×Ì/34v½nä;’rµ‡¢Ðï迵ÁÁ˜¥*ÎCD õÄûÄ\Y´œl“ q4¹ p'z‘Ä܈G}…[c“­,^{¡ÚŒA_5xZ«0y$mnŒPX7F§jÒÉ×/ÂM mqÏÖPæ–!ï‡ê¡[$ƒfÌ6Z¿¿q¼Å[]Ï—ÊYó¤’1µ>¬©‹Ø ¯Øj‘¶ÃË•…µ>×Z°4_ÊaƼ¡¿àÃŒ`[ÔÐEyO{-ìm =“‡J¢Û;an¨BFŸ$ëË€›tü§X‹ænúåƒtaùª>¼D.5×MñqñïC q‹ù[%Êv*ÈŠª#G`¢ c¯q,ÓslÑ|¢z[„œ|×Ù÷B‰ÃrÓ¦rªÏ ÌF_cŒš¬ê[®½$„ BCJ „¨Àôªµ-ëÎHÁ¤ j¹G°)RDYÇ„CíímP%~_¦zB[¸Á"ðÆ?vh³Ü`:ÆAèQx<Øp †afì¸äù€R!µ!¶5”zU×# äIVוawDOÖ‰o}±êÒ5u…Ÿœt>e*:7G¯Ä9ܧM¯:{gzyS¢s«pLìû‰”9ö2X—ôñ_Û‰Ùý –)¬ïÂû>‰íŠa¶^y°çË"2§½Å»ßK^Uo}¥¢–SKÞ¥*ÓtÄvL~àä#Ì:b-¯hvN‰ Ðy?D†)à'ŸÌÉõãJ®8}$¦5j¹‹ØFØÅbayÈ)qÚ¯£¬ ¯¢G×Ôqò„ÈÕTçc÷lêHÅú¿îo_ ˆT=ÏÖnn:ÒJ¨[ ¾:` #5³›ôa²ÉÄ©pà I-Iw#‘^Ÿim¤|š@Z äDíD+¿ß ‹3öþm‹G›@ãèüqoê³Nà‘µÉ#¶ˆ+2÷ÆùÂs 8X’ñÍAû%aǃ8YbnZx³{/ƒMÑ=µ¾ˆËD&¾ŒBt¯ÐéL#·âºùºšiY­ÏN, `é±å~±uä#U™étˆD”µŸê?ªØ„šv•g0ÙE…G3¡dHp,ü,€êöåTpm×€«&å3Ư9I°ùnVRËiYi µaöŽxɧ­ÀË;)bÒ>7»™tVN0±©y#ª)6ˆ[…kÄI®»V¥ˆr…T9—3>0Ÿ ÷LÎuƒrÊðp"Mxö>èmcÎúeT㓸<­ÐH÷ûÙ†•`å´g'ÅhÖüÀØ]Ðh1Ï©OJ‚¼™±ÁC=ù3s_7»K^gùѨ(²êtqÆdn\—nùX›à‹.‹„bç5Q”_ŠÐñ¦Âæ»IË-Ê•³R9(äcÁ§Db“ñ0\tÆÒlÅÕvæ?%œX{Aød³AZ?††ÇÁ'èïRðÖÁl% ÕÓL2-ð4•CMÎËúˆÈ8,â”Ò6cP>ÆïBöǶ´$—_7ÂoF ¬ùÂN2] ÜŽ,Ù:î(•ð¸^Šñ Oý©Ù@^Óõ圾œ–ž¾ B‚ø£Ý4¼ðzJ3Qúãv ˜Þ0/¬^ëÑ+ß9¶a©¦éG\D G0<ˆÉs2è€ñàñðò8íÀuÌ e@eÏH®Iû=õAüIÈfí4<œ«Ó¢ÅGMJ.=-xíáäªQÅ`¢˜5Ä»ðÈ„ ®bÓ{l›gä?Ýh¹‚[*ˆ‡>2¹¹ð°iê2DÙ ÑàcKpi Ì€ÃÂiâÌF=/>+é˜ãÏ7>]Øžéê=­™¬xþ ¿-Ô^ yM+þÉ[ؘ ›:Øžf3­¡&IÝ ë“éXÖÿ•»îs•8hK<{Z®÷¤†}Ànl’ÔÅyMC˜»ªÃÐCÜ´ûè‚:ÜšÓ×J{öb ýº &K¾NñÌl†ŸÉá®ïÂýº&ñ» èŠ_dw«ëƒÙOÉHÑ?u'™qRÄN²kàÊv_ D–\wѾmβêĬ =übSŒF4?§,­NÝ{ËòTi3I¾ÒÄ–m]|-;멟áºÁIì±qOX~4€¿N”†’+)ŠG•€Ó(ÎÓ‰2Àÿ"tA¦²M Pñ 財l·RÓ!hð–é-Z1V;¡EðÍP½â8™ðÓ;`8â ü8©òÄs×µê4ÖÎQýr!c‘‡”Bª½³ºÕ†Y*€+2Y¬äÎ<úå[Ã/LŒâZ‰ø„ÓË\ å~¥™6Ãm4q$Éø²dÒ±Í&óÒö˜N}F€À¢; íµØe)8Ú°G8ð¹.—¥Û\ƒ[~e:j#][`ª<ÆÀ$$e'#eÊ ð˜÷ÀC°(”.$¤O‰6‚™ ¹p‡Ž\F,.L1KÅ †(vØImÅè*²|@ýYèI °°6»ˆÌœp@‘mCp:ÇQ%ȯ衧r­†«Hh“ÕvQPŠ"ÙŠ`È{¿\võÕRU 2þ² Rä0#Ñ“Ñ$›™p _Ó4IéhHtŠ(íw9zß;!L·{š™“yÀYÄÇš`t=ç¨(…hl-\ÌþÒ©[¹Ü ìƒ)ŒeC슉ÞE24óbx³ÍxKFIƒ£Ì“ R>¿(¦DNàˆÌ.Q°m€Ç” [KüÀ1(r\ØÂÐE»M¬Z3xㆤ°×íÐh!‹4ÍmI‡]VÂ}©bÈôþ^jèÒ„ƤZÚH%:4‹NȤ_˜ÅÔ󓜩bÇ…ˆq¹u“S,‘ùR¨Z ó±G#d }>R¹Š)(_iPyJµg1¨/Á¹”êE-L®ÅI01/é©¢ltöµPÊ‘JÚ5t³T)ªŒMØøU*f,Õ=çMÉ€¨ðæCmòŠýCоôdß ž;&ÏGg^¥Ó\™¼ü†Êë³Db£=u°à«1•ðÅxpÞF;ü3ü8(ÎÑAêú}žùš(ˆçÍ„`Ò8´ž–`' ÊVmìmBN`þ]Ôûø’["n€L`ä1ƒn¾pŽK ½ctE“z9¥ªÐúE*ÀŠƒÊçÈ´wÜ ëžA•2ìŸëj-b5ƒ˜æ÷ƒRóÆLÎV#eÝÜà ÃþmÖ1A²[gçÖ9÷”ßEMÙ8 ͘A²c6„ãÌFÁÓ×9=f½S´Âaý¥õÔ“@„Öå6¥ö4±Le†Mø³jº] øÕœxN^Š’†¢q£¹zhÙQ#ÄlÇ/p-HãØœmþ d-û%6šE›² FÍ#SK.ÁÏt͹¼q°€ ö:%=ÌÊÅø´ÅFtj¯l:[Kø2Ðr–¬ÅF ”²oZÆÃËÀi“k…üE¼ÌÝ¼ÏÆŠ P?"#k Â$m ¸.ªñˆ W ° FszQ$9 h¸öc£ÓS` .šò}IV¸)59•>ÐÆœS~”"CÕRŒ€]Ó-!Ÿ&ñE‡à}7 ÁŠ˜*óÚà “¡äAo€K¤ôE þGº¹Ö­dˆ&ÛÚ’Èâ}e¯†48û<0ÑÉ?xi!&¼Äà/ånhiîÏ/pG@]qÌ[Ф³¡J-BudggȯÆTyŽ-^%?«ã·ïv2ýt1BÉÌAÛȰký¢‡ÿçeºîÛ*M|îÃÎCnÔGTš‘†k”5¨{Al4¢¿@"JHXäîÌJ1‰€yÔÐRvˆ¹ 6Àáî)ú ‰Ì¾büÏy¼ñÖëÆ´5å¹Ë. IkŠUh£;!¾’¶²ž¹m0ÌÕ9ÉjgÏrMÃêøW£az—&P+_ììWE³­¦ÿ¹ãÐà@ʶîÓö‚Âì•Ö(xÅÎÙ±¸¨Ù`AúH*Újn LbæÊÑ0i[Pjô óòDzZéRø" '±Làˆw~êIó óäóòH3P4Î6BKB©…Õ TbtJËö,`È™>9¯¼W9©ô¨â4¢VöN¢VŽŽl1—JCÍåæ“3Ò¤£õXh+TRfëIl¨vZ»%šÌŽìÉ)Š-Žƒ ‚‘í/á;à…rþ©Ãz¶É󵞖ò–-A*ìiбL9VùšHäüàW—Îxò·§Á¹è¤SHXÒeý•%&, äl¹‡œt™SÅ)XTMÍ€)êÁ¹lø•%ûµ‘˜ Ó²¾h]ZóP‘Á„Ùö¡Wq¥cE°ØxÝørhóuÌPœÃ4rþãÐ#ÓZI˜)\my !߯/'yõɬ˜iLH1DàÌ)¼xWWîÎ^èQ¦Í­Òg6%s¡Nszm€,Yû¿E‡„‰ežØñ2Í—€†VÊÛ @ʔǫ,à I°j‡=ÝwOb½4«š6àr !ô¥"oŽ¨Ñø2~•ì}²dŠ#)?!“‹/Þ 5ˆW ÐK#º~Ê8àM>‘eÕåè“lKÖ\Cß«žŽW´ LÙÆv:R¥ <® ¢WÌ¢pS†-Â’À2‚2Pè¨Ð‘B6¤ˆU[eÙ¦¹7x”R×w4©¸‡†ùèh²7måÏø×åÕ½ò ó9Þ 6HrX\¥ëÚßhÊDÓ3TÂÿe<†±°$_¡ wX §…Ù2¦8ÜTYMûƒÉ[Á‡„¡ÿL‰˜Ñ·`ç`ΪAæÛŠÛìtâò4ÓÑázÜÈÓ®ÛG^c:ˆ÷¸×r»ºÍ(LäÞ”¶ešZY³Ñnq%ñXIYn ›1 é§Z£§XßGêòìF±:¥ªÀ(Ô›7VP éân OH)bdZÖd™¢$òôɰf(à<.{¼Ê:6¶0òpkR>©ÙWƒ¹q]?$9èƒ>œWÊízHÝ^Üb7úðbY8k´«.´šH"ßþz§_€Ì±¸ø<Ä«ãK01`_Ð’méË´Ï¢™6“ù.v´I 2!-43R¡_ G3Ÿ«ðÊ›êÖaÒ墳eo–©Þ.!’¦ Ö JÂ1”Z… ÔMTKì²Ñ9à#QO ×èö[¿¬ ƒ¼|õÈèžJd H`öÎQ}ÄãF‘6ä<¨DàO*läLûÒ1»’³„„¦a8î+t‰C–rZ„Žm“71B&(øU¯/PBtv“ +G‘j3¼¿ñQ&Hsw}¤‡+PE¬ ÀL ,û%XQJ˜ ¿×°ù ~ÓÛJ\ŽïÉ„H… Äì} ‚Œ•*jßÐÕvÆR$^éûðBÀVƹ@eHþÀÑu– ˆ÷–2Àc„àça&„ú ¦M :ßÙ%úKâ˜Ø€P:îˆFÄS!ˆŸ’Ì’8•³QD£g׃£á»GZ‚\±È•q¨ÊžMW£€õâCIg‰¬/Â=°êü!!ãŒhåj -9e ¦(ˆÛå^€÷]³„ÚÞ±¡!¢vü&m4K1 7О'D¡œ+ž±«èžL±~¡‰ê ó@ÜrIcE¤pj”Hè·FeBbîŒî‹r-8ƒ$pmãbETZâuiZ‚y³‚ëp¥­üX8(ÆñÐFÓ%·‰VÎ&˜0À‹W`Ñš¶ŽH±}ÈIË{_€O¹‹ëô\}ÿ`)P˜ èÂ!"†Ï´³t¹m'Ù ™ Jy7xFÕÊ‘EÔˆc®¡”³!x‹‹µ¾y³ð^†¹B™Ñ405DÊgF/†ü©]O6ízqñLäæl†ò‚æì~Gæå ü`óÿÙŸÀ(¬oÊWÌæÆ€LÕj'â½]Nˆ'à>aÑE¨KÃqB ýʈڣÖ_û˜ì£þ1ÿ)¬ýóžËá?H‡Œ‚Ø#±|ì™~éEí5Z$%/¬—n+£>ÄW0) |ÆJâ ¾(+$‘ZÛ8‰=f·bG¹Ý\v{"ó`±“{Ú…ðä¡Bâ}ód åµ»Õ’c™j6æ ª ƒ ‚ɘ¼(°€™ Q`‰‘È:JÜ–zžÏæÑ†¢ö¸»Q33â¡™…“í/Ø,tmM@!¡ß× "`S~ʈW%‚è•¥o\a©Ò¾Àèk{ÄÓŸÂB')Ö²Èÿ»8zÄgI˜2Ñ90G·YN©RÒ…³u…®»ÿiKn°b€ Îèž…4 # 5¹0 œA̲Œkâeeì•êÁ “˜ä½ #Û’_aˆ‹d‡ ´#fèú¨´ù¾ŸÆPˆ%¨ÔÅ~òp½*'èÒžåU˜›Ïqõº;n.2ôç T~;P §7 P“EâxÄ4˜úo'|êÈ9Í€^‰>Øô! \þƒ,›®Ázº¯’ltù©’ >Ôʼnø[ç\žìZ= Lü¼ì˜ *üÀ4U"”¤3dáuM¡ú®}=ÉúU&{ì tŠ|…hÙ¯•‘ˆkÂJpjìÐÄþ¶m® ÉF~3Á¦è=‹«¨Œ·v¤þ™Âæ](Õ š”ü cҵȇæ|QQìh+ªJ8„ ³ç°íœÉ|#&@—vNÒ¾Bm“Ä4G²y«ø^$+Óó‡Ó”N¬g ®Vp¥›U› ÉdÈП„‹¤9Ný虲½•Å(40Ù“Y¡ò 9£Í­O JqC'æèHØÚiC­l'¶š¶RÉ r«!"BÄI©˲AÂ!YؽǕrm™R„³#Er²“{#M@ƒ^É \°&ˆÃ]2‡âdG@\ô@¦ ¸Sn|XôSKaÐú –§p®Ê·&»yºqÁH[•PJ·tÒ!Îz˜Àè…Ubwa_Ðm±vЦÆ ‘ÃÄ.ŒV8y ѳ-$u"Ž1Y¾ÁaüL8YÐ ê†X—h¾Mbdˆ¶YcI-31j‚žÛh AÃíñv qMɧ.·m« M ,8¹‚Ü(ñÄ„[gi@%ÄÝѰÄè7ÙÌ“!(ëôú2uШFÛV;vdz_"[Ûä€ÞBr%Eȸ‡`'lIi)ÅØÐ>öYKzzÀ?7•zÓÛÃËäœÑš)'ÁÆ<¤{¬Ûað[,ÞÅá›Ô_aÔuî7›ÆËIUŒ#±í±/ûŸƒ¢®Jyì†EkŒ†³Õì-Xiѹ™7Qf"œ¨dÜuð¸!fF1N4lÆ9ú˜œ À¯ÈË2mDù8ÐáûhuÂ*8;\ÃØZÀÄYgc€º}ô¢\‹äL"vYïÈX Žÿ^Ç|"³„cùäÍÕ‰hÆ-TæÌ!Û²2:ãš)æ²7"? 9„€r ugåLÁ}"Ê3H‰@Bä(þ%0¿½(Þ%£‚Áaƒœ.ÓäÇmÅòÂ;6+D…Àé#1>Cç‚„3l¯V‹B ŒyHwgžLnFöc0¤›­&ßa‘Ù9òðµÒzf—’'n–-ô³ÊŠÜ ðù†hùF rDéCžâƒDHèŒÙ2ÇCW1êÚ8ƒ^Á7üøÃ¦`vGMå};E.§a÷±ѬE¤äu÷ 'xFƒ'é€{ˆÊTG†?€1Ï¿À¦Î sÝùGzD:è"’¯9­R6»Âš¤o·^Ã^ZÐ sabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/fonts/glyphicons-halflings-regular.ttf0000600000175000017500000012042413642116632032432 0ustar jpjpFFTMh÷ãäGDEF8 OS/2g§K„X`cmapâHL¸jcvt (‡$fpgmS´/§,egasp”glyf*Ï£‰œ‰headkœ´6hhea 2ì$hmtxÁ¿ôloca2•Tz“¸maxp ”¼ nameÔ¾™ó”Ü|postÌAV˜X„prep°ò+ Ü.webfaþR7¡ Ì=¢ÏÎ].—Î]}Ú ÐZ Ф2¸UKWN@ âÀÿ| dHN@ +  / _ ¬"&' 'àà àà)à9àIàYà`àiàyà‰à—á áá)á9áFáIáYáiáyá‰á•á™âÿÿ *  / _ ¬"&' 'àààà à0à@àPà`àbàpà€àááá á0á@áHáPá`ápá€áá—âÿÿÿõÿãÿÚÿfàßãß´ßhÞÚÙÙ     úôóíçáxrlf`_YSMGA@Ú(ø°,°K°LPX°JvY°#?°+X=YK°LPX}Y Ô°.-°, Ú° +-°,KRXE#Y!-°,i °@PX!°@Y-°,°+X!#!zXÝÍYKRXXýíY#!°+X°FvYXÝÍYYY-°, \Z-°,±"ˆPX° ˆ\\°Y-°,±$ˆPX°@ˆ\\°Y-°, 9/-° , }°+XÄÍY °%I# °&J°PXŠeŠa °PX8!!YŠŠa °RX8!!YY-° ,°+X!!Y-° , Ò° +-° , /°+\X G#Faj X db8!!Y!Y-° , 9/ Š GŠFa#Š Š#J°PX#°RX°@8!Y#°PX°@e8!YY-°,°+X=Ö!! ÖŠKRX Š#I °UX8!!Y!!YY-°,# Ö /°+\X# XKS!°YXа&I#Š# ŠIŠ#a8!!!!Y!!!!!Y-°, Ú°+-°, Ò°+-°, /°+\X G#FajŠ G#F#aj` X db8!!Y!!Y-°, РЇ °%Jd#а PX<ÀY-°,³@@BBK¸cK¸c Š ŠUX Š ŠRX#b °#Bb °#BY °@RX² CcB² CcB° c°e!Y!!Y-°,°Cc#°Cc#-ÿÿ(h .±/<²í2±Ü<²í2±/<²í2²ü<²í23!%3#(@þèðð üà(ÐddLL$°/° 3°Ͱ 2°/°Ö°2°Ͱ2±+015!'737!!'#'7d··È··þý··È··ôÈ··þý··È··þý··LL J² +°/°3°Ͱ2² +³@ +° /° Ö°2° Ͱ2² +³@  +² +³@ +± +01!!!!!,þpþÔ,þpþÔþpdŒ®7v°2/°(Ͳ(2 +³@(. +°/°!3°Ͱ2°/°3°Ͱ2°/° Ͳ +³@ +°8/°7Ö°2°"ͱ22°"±-+°2°.Ͱ2±9+±"7°9°-² 2999017347#7367632#4.#"!!!!32>53#"'.'ddqÚd‡%Ku´òp<µ3LJ9D?{dþÔ–dþÔ 09C3JL3®ak§Íw$B ôd/5d§Z½gj7X0,Z>d.6dJtB+0W5¬juž.«xÈL¼°/°Í°/±+01!!È„ü|,ÿò,ÂA°/°Ͱ Ͱ/±+± ± 99013!2654&#".#"qOîxªªx.,,µn˜ØBUîPr¬zx­aw×™ kd°L 57% ÈÈûP,þÔXXþÔ,dÈÈþpÈXþÔôý¥[þ ,ý¨ÿóÿó½½%'7'7764/&" MßZÖfÖVÖc ™$ pßQÖfÖVÖ\ '™ 1°° 3²+°Ͱ2° /°Ö°Ͳ +³@ +² +³@ +± +01!!!5!°þ ,üà,°ýÚýÚdd&L¯ &7>5%&7>54&&$ˆOAXX@JOW‰OFS ý @JO‹n)`*^›ý÷r67)Q7q Á ýOÿìÄ™Y²+°/°Ͱ/°Í°/°Ö°Ͱ±+°ͱ+±³$9°°9±° 9°°9°³$901 "'#" 6& N,mþÔwŽÈƒÂÁÁþîíþäÈŽwþÔm,NlþðÂÁÁdX¯D°/°Ö°Ͱͱ+014>>.d8Zwwy,0{xuX6Cy„¨>>§„yC@vS-IDEH-Sv@9y€²UU²€yÿ¸G•° !3! 7Hß’’Øþ‚‘þ€þ‚’” þpþêþ?þí¿þ?ÿ¸G•° ° /°3°Ͱ2°/±+01!3! 77'7#'Hß’’Øþ‚‘þ€þ‚’”CÄIÀÃJÁëMN þpþêþ?þí¿þ?tŽâŒåŒÓÓ°°155"&=462#%?°ø°?%d•3È|°°|È3•dþÿ °L #'+/3°²+°ͱ 22°/°"3°Ͱ$2° /°&3° Ͱ(2°/°*3°Ͱ,2°/°.3°Ͱ02°/±233°Í°4/°Ö°ͳ $2°±+³ $2°Ͱ2°±+°2° ͳ$(,0$2° ±!+³%)-1$2°ͱ5+± ±99°±99011!%35#535#535#535#535#!!5!!35#535#535#535#535#°û´ddddddddddÈXý¨Xý¨¼ddddddddddLû´ddddddddddü|dü|dddddddddLL/?B² +°,3°Ͱ$2°/°<3°Ͱ42°@/°Ö°2° Ͱ2° ± +°02°)Ͱ82±A+015463!2#!"&463!2#!"&463!2#!"&463!2#!"&þpþpXþpþp2þpmþpý½þpmþp LL/?O_ov² +±ÔþæÔþæþæÔþæÿìÄ™'·²+°/°Ͱ/°#3°Ͱ!2² +³@& +² +³@ +°/°Í°(/°Ö°Ͱ±&+°2°%Ͱ 2²%& +³@%# +²&% +³@& +°%±+°ͱ)+±&²999°%°9°³$9°°9±°9±³$9°²99901 "'#" 6& 53533##5N,mþÔwŽÈƒÂÁÁþîFdÈddÈíþäÈŽwþÔm,NlþðÂÁÁþYÈddÈddÿìÄš]²+°/°Ͱ/°Í° /°Ö°Ͱ±+°ͱ!+±µ$9°°9±° 9°°9°µ$901 "'#" 6& !5!N,mþÔxȃÂÁÁþîFþpîþäÈyþÕm+MlþðÂÂÂþYÈ™°+E°/° Ͱ,/°Ö°Ͳ +³@ +°± +°Ͳ  +³@  +±-+± ³#$90147 654&'5".;2654&+"Ò§g|úbú|g§Ò[›ÕìÕ›[ÝddX·(>¦7Èx±úú±xÈ7¦>þØ·vÕ›[[›Õ d°± 0²+± 33°/°Ö°Ͱ±+° Ͱ ± +°ͱ+0173#33333dÈÈ,ÈdÈdÈ,þÔôþ  üà°ûP––GQb°/°PͰK/°6ͰR/°Ö°HͰH±M+°$ͱS+±H± =99°M³39$9°$±/99±P±99°K³!'E$9°6±+A9901732?6?67'76?654/&/7&''&/&#"'462"&—P-<…-1&("/&./†80P˜˜P,<†-0&("/&2,…;.P —g~²~~²~Y!)&1,†;.Q —— Q,=†,1&("-&3*†:/Q˜˜Q/:†/.&0X~~XY~~dÿÿ°#'+/37‰²!+°$Ͳ(04222°'/²*26333°Ͱ/°ͱ,22°//° Ͱ8/°Ö°$Ͱ$±%+°2°(Ͱ,2²%( +³@% +°(±)+°0Ͱ0±1+°-2°4Ͱ 2²41 +³@4 +°4±5+°ͱ9+015463!5463!2!2#!"&!#!"&73#3#!5!3#3#d ;),);  ûæ d„;)ýD);dddÈdd,þÔÈddÈdd2 d);;)d 2 ün üà)<<)¼ýD¼,dû´¼ýD¼Ý ,² +°3° /° Ö°Ͱ±+°ͱ +±°901 #!!!„ÈþÔþÔþÔY„ý|ý¨þpXdè°"² +°/°Ö°Ͳ +³@ +±+017463!!#!"&d Û ü® X,~ þ ý] ,þÔ¬¬ ‚° /°Ͱ/°Ͳ +³@ +°/°Í°/°Ö° Ͱ ±+°Ͳ +³@ +°±+°ͱ+± ³ $9±³ $9±³ $9±³ $901$  $ 6& 33 D  þîþ¼þîóVóóþªGdȶD  þîþ¼þî  _þªóóVóýþþÔdÿœ° .²+°3° /° Ͱ/°Ͳ +³@ +°2°/±+01#333!#3#d¯Ñ¢Ð¯ýæ)ò(1રþÔ,ûPþpô,L° J² +° Ͱ/° Ͱ2°/°Ö°Ͳ +³@ +°± +° ͱ+±± 99° ± 99011!3!3!%35#êþÞÈ,ÈþÞêþᯯ,ôþ þÔþpÈd¯¯c² +°Ͱ/°Í°/°Ö°Ͱ±+°Ͱ±+° ͱ +±´ $9°°9°´ $9±µ $9014>2". 6& 333_ ÞôÞ __ ÞôÞ \òTòòþ¬P–È–úÞôÞ __ ÞôÞ __ þ¬òòTòþd,þÔþÔ¬¬ a° /°Ͱ/°Í°/°Ö° Ͱ ±+°Ͱ±+°ͱ+± ´ $9°°9°´ $9±µ$901$  $ 6& ## D  þîþ¼þîóVóóþªOúú–ȶD  þîþ¼þî  _þªóóVóþb,þÔþÔ,°° )² +° ͱ22°/°Í°/±+± ±99015!3#!"&3!73!È Ç û‚ ÈÈ2,2Èaý¢Û¼ýDþ% æÈÈô¬¬ F° /°Ͱ/°Í°/°Ö° Ͱ ±+°ͱ+± µ $9±µ$901$  $ 654&  D  þîþ¼þîóVóóþªó:)¶D  þîþ¼þî  ´¬òò¬«óóþŠ‘È™°S°/° Ͱ/°Í°/°Ö°Ͱ± +° ͱ+± µ$9° ±99± ´ $9°°9012>5# &632!&#"[›ÕìÕ›[–úþžúú±ˆn’‘ÆvÕ›ÎìÕ›[[›Õv±úúbúQ’‘z[›™°!z²+°/°Ͳ +³@ +° /°Ͳ  +³@ +°"/°Ö°Ͱ±+°ͱ#+±±99°· !$9°± 99±°!9° ± 99°°9014>327!7&#"!32653#"'[›ÕvÆ‘þp“p‡±úI“p‡±ú–[›ÕvÆXvÕ›[z‘þp“Pú±ý¨“Pú±vÕ›[z d°° #'P°/°3° Ͱ2° /°3° Ͱ2°/° 3°Ͱ!2°/°$3°Ͱ%2°(/°Ö² 222° Ͳ222±)+013!!!%53'53'53'53!5!=!%5!%5!dLû´d„üàddddddddôþ ôþ ôþ ô°û´„ü|dddÈddÈddÈddý¨ddddÈddÈddL°#J²+° /° Ͱ$/°Ö°Ͳ +³@ +°±+°Ͳ +³@ +±%+± ³$901546;5463!232#!"&!54&+";)dvR,Rvd);;)ü|);,ÈdX);ÈRvvRÈ;)ý¨);;å–dLL²+°/°Ö°ͱ+0133>>7.ddd<‡x|rjd)({„‡tZLû´<0 !OQôQE (( EQ°—!1Ag²/+°>3°&Ͱ62° /°Í°B/°Ö°Ͱ±"+°+Ͱ+±2+°;Ͱ;±+°ͱC+±2+³ $9±&/´$9° ±9901;2654> ;2654."46;2+"&%46;2+"& 2 ää 2 c£ÞèÞ£cÈ     X       ,ÑrrÑþÔ  ,tÞ£cc£ÞtýÕÌ þ4 Ì þ4 ÈXè!!7'77',,þÔþÔ°GGGÈ Èþ«GGGÈpè°/°Ö° ͱ+01!!%7'654,,þÔþÔ¼EojCVÈ È95‡¯©…6nŠ’ºb÷<°/°Í°/°Ö° Ͱ ±+°ͱ+± ³$9±³ $901!%%7'65477654/,,þÔ’EojCV^{wQŽ‘ÈüàÈÉ5‡¯ª…7nŠ‘Í—Á½–B²ãæ² °°!/3?CGKO²+±0D33°Ͳ)1E222°/²'+L333°Ͳ%-M222°"/±33°#Ͱ2°/±H33°!ͱ4I22°P/°Ö±22°ͱ22°±0+± ,22°3Ͱ52°3±. +°*2°%Ͱ@2².% +³@." +² 222°%±7+±DH22°;ͱ&J22°;±L+°B2°OͲ9=F222±Q+±0µ4?$9±7%²()8999±"³89$9°#²:;999°@ 67<=@C$9011!#5##535!535#!!!5335#5!3##5#5355333!5#53!!5!5353ôÈdÈdddþ d,þÔ,Èdddd,,ÈdÈddddddÈ,ÈÈý¨È,È,þÔdddôdddddd,û´,þÔ¼,þÔý¨dd¼dþ dþÔddddÈþ ddèþÔþÔÈdôþp,þÔüàdd„ddýDdd °° #p² +²333° ͱ22² +°Í°$/°Ö° Ͱ ±+° 2°ͰͰ± +°Ͱ± +°Ͱ± +°#ͱ%+± ±99±±990153#5!'353'3535353'3ddd,ÈdÈddÈddÈdÈÈèûPddÈèüÈ[[ÈèüÈ[[ÈèüÈ[[Èèü°°)²+°/°Í°/°Ö° ͱ+±² 99901463! 2764'&" Ú¼þ ýØSS¼Û ýDþ ãTTݰ1²+°3°/°Ͱ2°/°Ö° ͱ+±´ $901463! 2764'&"%3 ' Ú¼þ ý×TT d¼þ 2Â¼Û ýDþ ãTT°ýDþ 2Âd°° ?²+°/°Í° /°Ö° Ͱ ±+°ͱ +± ²999±²9990137!!!d¯dýdî¯üdèdüÈL± 3 4&#!"ÈÂÂüà¼þE~°° 'Y²%+°Ͱ /°Ͳ  +³@ +°2² +³@ +°2°(/°Ö° Ͱ2° ±+°2°ͱ)+± ³ '"$90153!73#5!!7.#!"7>3!2#!"&ÈdXdÈÈüà5(P>^ þ> B& ô & ý¨ d¼ÈÈýDÈÈÙ||Z  û˜  ˜ d°L%-1o°/°%Ͱ)/°-Ͱ!/°Í°2/°Ö°Ͳ +³@/ +°±'+°+ͱ3+±°9±+'³!$% $9±-)³"#$9°!±.199°´ /0$90153!2654&+.+"#"462"264&"%53;)è);;)–37S*È)R:. –);dÈÈ>X>>XXdÈ);;)X);E5+);;;)þpÈÈ X>>X>^dd5°¯"²+° 3°Ͳ 222°#/±$+013!5".?!#!5&'./#5m)>$\‡R+5¡"(þ]þq *k².tB6,êÞ-WBB*. æü0 ÇÉŒþÃdï )1e² +°!Ͳ +°Ͱ)/°*Ͱ1/° Ͱ ° Ͱ2/°Ö°!Ͱ*2°!±.+°Ͱ% Ö°ͱ3+±%.°9±)!°9°*°9°1°90135>54.'5!2#'32654&+532654&#d); $×xº!" E4+v¦OÈ¡Y€}^Ÿ‹Ll¨›Y3(; F°Œ7]7( 3AvFT‘MÈaTZd{MRaÈo° ²+°Ͱ2° /°3° Ͱ/±+0135>76&'.'5!ÈMs­ (G ©!:"€ 0G9C/Q8$99#'% üÇ4<9ÿµ° %~²+°/²333° Ͳ +³@ +° 2°&/°Ö°Ͱ± +°%Ͱ%±+°Ͳ +³@ +² +³@ +°±+°ͱ'+± ±99±° 9° °901'3#7#33!3#4.+!57#"KKK}}KK}ú–¼–2.!"ÈdþpdÈ"!/È §§üà§c,þÔ' ü®2dd2R '!ÿ¶± %‰²+°Ͱ/°3° Ͳ +³@ +°2°&/° Ö°%Ͱ%±+°Ͳ +³@ +² +³@ +°±+°ͱ'+±%³ $9±³$9±±99°²99901?!55!3!3#4.+!57#"!§ §§üàd–¼–2/!"ÈdþpdÈ"!.3}KK}}KKÏ,þÔ' ýv2dd2Š '°L/?53!26=4&#!"53!26=4&#!"53!26=4&#!"53!26=4&#!"Lû´ üàèüXý¨2dÈdÈdÈd°L/?53!26=4&#!"3!26=4&#!"3!26=4&#!"3!26=4&#!"Lû´Lû´È¼ýD¼ýD2dôdþpdôd°L/?&² +°Ͱ-/°$Ͱ/°Ͱ=/°4Ͱ@/±A+01=463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&Lû´dèüÈ üàÈXý¨2ddlddþèddldd°L/?&² +°Ͱ/°Ͱ-/°$Ͱ=/°4Ͱ@/±A+01=463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&Lû´Lû´Lû´Lû´2dd@dd@dd@dd°L/?O_oR² +°L3°ͰD2°/°\3°ͰT2°-/°l3°$Ͱd2°=/°|3°4Ͱt2°€/°Ö² 0222° Ͳ(8222±+01=46;2+"&546;2+"&546;2+"&546;2+"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&dddddddd, üà üà üà üà2dd@dd@dd@ddüdd@dd@dd@ddÿ›°L *:J °/°&3°Ͱ.2°K/±L+±°90153553#3!26=4&#!"53!26=4&#!"53!26=4&#!"5;26=4&+"eɦ¦ÈddÈXý¨,þÔôþ ddôdK}}Kþ LûædÈdÈdÈdL/?CJ²@+°K/°@Ö°CͱL+0173!26=4&#!"53!26=4&#!"53!26=4&#!"5;26=4&+"3535#5Xý¨,þÔôþ dd d!§ÈÈ2dÈdÈdÈdûæLû´&}KdKȰè-° /°ͰͰ/°Ö° ͱ+± °9± ±9901463!2#!"& ,î,,ý,„,Š,,ýv,,d,ý¨°LY² +°/°Ͱ/°Í° /°Ö°Ͱ±+°Ͱ±+° ͱ!+±°9°±99± ²999°°9015463!2#!"&?'!462"Xû¨d÷*J%ìülNpNNp,ôü í¶ƒœ>þàôþÎpNNpN”ÿó½=² +°/°Í°/°Ö°Ͱ±+°ͱ +±± 99± ²999014>32.'&73264&"”yÑz{ÐyII»99 "c]s+?—jk——Ö–é|×~Õö•röBB "ko K‹–k——Ö–—¯¯I² +°Ͱ/°Í°/°Ö°Ͱ±+° ͱ+±± 99° ± 99±³ $9014>2".3"_ ÞôÞ __ ÞôÞ Mû°°ÞôÞ __ ÞôÞ __  þžúVuß%4>7.77.'&6?uDmssIOWM?%N~šOrÀ~[[.  \7–^¸¡Å`Gvwsu†EY™d;^·RlbJ(I43n–Åh!&W²+°Ͱ/°Í°'/°Ö° Ͱ ±+°ͱ(+± ³ $9°±"99±³!$9°³ "#%$901463!"3!26=7#!"&%7' 7/ë¥nºþÉ);;)ô);Èë¥þԥ봡œrþkùqq\,¥ëº;)þ );;)}Èá¥ëëj2œqþkøqqU•L.H²+°Ͱ"/°'Ͱ /°Ͱ°Í°//°Ö° ͱ0+±"²$999± °%9±°&901463!#"3!2657#!"&> "륅U‘);;)ô);Èë¥þÔ¥ë§gg_hþ™HCVC9,¥ëP X;)þ );;)™5¥ëë!&4 ÑD>Ø3Cm§L#R²+°Ͱ /°Í°$/°Ö° Ͱ ±+°ͱ%+± ³"$9°°!9± ³"#$9°± !9901463!2!"3!26=7#!"& ''ë¥,:323>54.#"35# D  þíþ¼þíÈ 'È-"#1D1i†‰ÈȶD  þíþ¼þì    =& )2X23L(pýñd­­ ;° /° Ͱ/°3°Ͱ/°Ͱ/°Í°/±+±±99±±9901$  $7!5#!3#35# D  þíþ¼þíídþÔdddÈȶD  þíþ¼þì  Šd,dÈd°°1i²+°/°!Ͱ2°/²#333°Ͳ%/222°2/°Ö²+222°Ͳ )222±3+±³$%01$9±°9±!°9°² *+9990153>7533##5.'35367#53.'#53Â*EkIÈ6vkËË·YÈŒˆ`oKÈ•4ÉÈfIÈKnÑôÈ8dt«óÍap«ó;¶D  þîþ¼þî  ´sd7>óýò;ó«pac°è°/°Í°/±+±°901!!XXý¨#ÅþÔþÔþÓc°è°/°Í°/±+±°901! XXý¨,,þ;þ@-ÌJ°²+°/°Ö°ͱ+±°901 !!̼þÖþÔXXý¨ý¨Xhæ°²+°/°Ö°ͱ+±°901!!!h(,*þ?XXý¨ý¨Ç°L 5>7 F‰çœXý¨_°¤‚Ȅխgþ;þ@-$Du°° ²+°/±+011!&ŽþÚëŽ&þp&ŽþÚ Ž&"#ŽŽ 7'!' "'þÙ¨'ŽþÙ°'þp‚þÙ5'þÙ‚™™#O° /° Ͱ#/°Ͱ/°Í°$/°Ö°Ͱ±+° ͱ%+±µ !#$9±#± 99°±99014>2".;2676&+"35#[›ÕìÕ›[[›ÕìÕ›V:#6#:Ï0ÈÈâìÕ›[[›ÕìÕ›[[›FþÒ.ýÅd°°&*04;3²'+°13°*Ͱ22°7>7.#676%>7>'&"Ø 8./ieš‰èh,Jhqƒx{\Sc'C78Fak[)!#==þYÁ5<€b‚;7>'>7>76''&'.7.7o FFB:8( OV $9DkC@&¥¤'GOS3 *gJ.  &:4?¹B8- %>=Bí'P¨d!I,  =CnC¬Sm,UŸ!†Ù•fm§S ;4( .MV .nÿÃ}í3!?GC°/°)Ͱ:/° ͰH/°<Ö°7ͱI+±7<@ )(5>@C$9± :·$.5>BG$9017>2".'72>7.'"&5477./=FOsv““vsOFFOsv““vsOF›C-[Tz€wRY,H 7:91°ø°.f…1ii%LX( (WT`G//G`TW( (( (WT`G//G`TW( ( `=^8+(3\;hI%E:JY|°°|UIWs|Ci`$$ÿÃí° )A¡²+°3°B/±C+°6º=ïïÝ+ °.° À±ù° À°³  +³ +³ +³ +³$ +³% +² Š Š#9°9°9°$9°%9° 9· $%........@ $%..........°@017>3273#7.'77.547?./7>7&'7=FOsv“H=<%”þÆ”%R¦ri' ›Ò·%k.f…1i/:(&-/"0/a+'C. %Ze“X( (WT`G/ŽûPegy8(þæ6§nUIWs|C/WRý§‘&2&?@0’6@(( 4kbfÿž« &3!26'.7 !5#5#o%%ý~8ý~õ½½þ§ÈddÈDDG  ! ûÖdÓý-ddþÔ,dd°°)H°/° Ͱ*/°%Ö°2°Ͱ 2²% +³@ +²% +³@%# +±++±%±99± ±%99015467462'%/#&=47&dkX|Xkþ™d^Þ^dþ™)1ES>XX>þ­þ»1) ùþù[@ NN @[ù L° #'+/37;?CGKOSW53!265!5!54&+5#!5##"53'53'5353'53'5353'53'5353'53'5353'53'53èû´L–dþ d–dddddddddddddddddddddddddddddd2îd–ddddüJddÈddÈddþpddÈddÈddþpddÈddÈddþpddÈddÈddþpddÈddÈddx® A°/°3°Ͱ2° /°3°Ͱ2°/±+±±99° ³ $9°±9901=!35 5# !7'!735 5#Xñ,þÔŸý¨þ«zµþ«¦zŸ,þÔñÈÈXÆþÙþÔÅý¨XzŽ´ý•Ž{ÆþÙþÔŰL²+°/° 3°Í°/±+01463!2#!#"&;)è);;)ý¬þÐd);X);;)ý¨);þÔ,;dL°%)-`²+° Ͳ  +³@  +°2°&/°*3°'Ͱ+2°./°Ö°&2°Ͱ(2°±+°*2°Ͱ,2±/+±°$9°±99°°9015!32>'4=!".!!!d,U'5%;) ,'MeÀeM',,XÈúq \ #(,.úÈ*R~jqP33Pqj~RV,þÔ,þÔÿâ¸hÞ 7ã`aâý¾›ãaþŸãCFÚÌ ' FDBâþŸþ ý½CãþŸaÿ:dvè(°/°Í°/°Ö°ͱ+±°9±°901 #!!!# #Æ+,Ë×üà”×}Æ++ȼþåþpÈX,ÈþpþåXª°2F²"+°3°,Ͱ,°&ͱ22°//°Ͱ/° Ͱ3/°$Ö°Ͱ±+°ͱ4+±°-901&763!7>;2++"&=!"&=#"&5463!7!"&'€&^6É*þÔ*20ý‡ -«¢*ü? 2222È*°L ²+°Ͱ/°Ͱ 2° Ͱ/±+011!53463!2!°ûPÈ;),);ô üà„d);;)dÝL(²+°Ͱ/° Ͱ2° Ͱ/±+±°9013! 3463!2!!,°þÔûPÈ;),);ôü¼ýDX);;)È.‚° !² +° /°Ö°ͱ +±± 99013# #3.ÆÆ**ÆÆþÖ,X,þÔý¨þÔ/°‚ °/°Í° /± +±±9901!5 5!,X,þÔý¨X*ÆÆþÖþ×Å۰!I² +°Ͱ2°/° 3°Ͱ/°Í°"/°Ö°Ͱ±+° Ͳ +³@ +±#+± °901=463!2#!"&>3!235#35#;)è);;)ü);¬$ %¬þddÈdddd);;)d);;Uã'-ý$þÔdddÿ›d°L %3&°4/°Ö°Ͱ±&+°.ͱ5+±&± 9901546?.5454>;%%##"+"&'4632#"&e2"È È£ý]&/ S8éX22 ú!Uú úü®Èþì QþâRü®Jf°'/5²++°/Ͱ%/°3°Ͱ2²% +³@%" +°0/±1+±%/±(-990146;7>7'&6;232"&/.267"Jv?zS^Sz?vRýúñ::§ 8F8 0l^­GM~ %Mþ¹­( .))Ü1==1œœ777'7'7'7'''éNà-››-àNê´´êNà-››-àNé³½-àNé³³éNà-›œ,áNé´´éNá,œd°°".°//°(Ö°ͱ0+±(°90153#;;276=4&#!6=4&+"?3!#'ÈÈ,d={ú.%î='þ¸='20`‘d–d22ÂúÖˆÈXýóKd9X+d,Qv–,Q(ÆÄ%þ‰wÔÕ¯á}þ‰d°L".p²+°%Ͱ/°3°(Ͱ./°Ͱ2°,/° Ͱ//°Ö°Ͱ±+°#Ͱ#±&+°Ͱ±)+°ͱ0+±&#²(,999°°9°)°+9±.°*901374;6;2#!+"&/&735'!5##Èdd={ú.%î='þ¸='20`‘d–d22ÂúÖˆdXý¨}Kd9þ¨+d,Qv–,Q(ÆÄ%ÔÕ¯á}wddU"Ay° /°$Ͱ/°)Ͱ1/°Ͱ2²1 +³@1 +°B/°Ö°Ͱ±+°#Ͱ#±-+°Ͳ- +³@-< +±C+±-#´ ?$9±$°#9°)°9±1²;2654&#!*.'&54?'Èdj  m U.UkmTk‚þ«¦dd%ƒËþ7   “Vþ­ÈXý¨K % æ pyLNþ­'¢YS(  ·Sìÿ›e¯V8<y°/°$Ͱ/°Ͱ8/°Ͱ:2²8 +³@89 +°=/°Ö°Ͳ +³@, +°±&+°Ͱ±9+°<ͱ>+±&´ )$9±$°&9°°9±8²',9990146!'&54?632#!"&'#"'32!7%*#!3elU.U m  m!«þªƒjT Þƒ%jþªW‘   þ$èÈCLy q æ 'ýò ¡(Sd)þ­YöíS¸  þ Xý¨aL6:G²7+°8Ͱ;/°Ö°72°)Ͳ) +³@): +°32°)±/+°ͱ<+±)±699±/°9013!2654&'%54&"'&77><546!5!aæ ' ¢(þ­NLy%p[S·22(SYþ XÏþ•¦VƒjTnkUþÒT  n V’   ÈÊ‚þÚdþpÈÈ í26E°3/°4Ͱ7/°Ö°32°)Ͳ) +³@)6 +°2°)±%+° ͱ8+±)± 99± %° 901?26=%>54&#!"!&5<.'&5!p &yMNS)¢ ýó% ›í÷Yþ¬(22¸’XIn  UþÒTlnTjƒV¦þ‚SdþÚ‚ÊÈ  ’qÈȰ«:² +°Ͱ/°Í°/°Ö°ͱ+± ± 99°±99°±99014>32 $%! !_ Ýz¢  þíþ¼þì ',’þnþÖUzÝ _ þìþ¼þí  AÂ&*Å««8²+°Ͱ/°Í°/°Ö° ͱ+±°9°² 999°°9014>32 $75!5!5_ ÝyzÝ _ þìþ¼þí È.þÔUzÝ __ Ýz¢þí  ¥þÚÂÉŰ«>²+°Í°/°Ö°Ͱ±+° ͱ+±±99°±99° ± 99014>32 $%333_ ÝzyÝ _ þíþ¼þì 'ÈÈÈþÔUzÝ __ Ýz¢þí  ¥þÔ,°«M²+°/°Í°/°Ö°Ͱ±+° ͱ+±±99°±99° ± 99±² 999014>32 $% ##_ ÝzyÝ _ þíþ¼þì ',,ÈÈUzÝ __ Ýz¢þí  ¥þp,þÔ°«Šš†²+°,ͰQ/°/°Í°›/°Ö°Ͱ±Z+° ͱœ+±°9°Z@!#$>LWz†‡‹—$9° · "(2=\ix$9±Q,·28>HJWY$9°@ Zt‡p“–$9°²wxz999014>32 $277>7.'.'"'&65.'6.'&76746'&67>7&72267.'6'?6.''&%>72>7._ ÝzyÝ _ þíþ¼þì ù" X>9. #ex $/ F = .2) ( (%  )#? 7 .R+>>?1  B)UzÝ __ Ýz¢þí  Y"v F  /K q$>   #/ & % I+ *  ' ) $#   ' "rq % 1' ¯…<7&6767'"/X!N`¤Žþý‘û ¤{‚ý¬+o+WeÉ6\eŠè~¯\F/ý¬n`°¬/37;P° /°4Ͱ7/°Ͱ/°0Ͱ3/°Ͱ,/°8Ͱ;/°%ͰͰ>±D+°Iͳ7ID+°1Ͱ1/°7ͰI±+°ͱO+±&³ $9±>*±-<99±71µ /;$9±³ $9°³*-<>$9°(±99°#±/;9901$  $ 654& 462#"64632#"46?&54632#"'#"&%462#"& D  þîþ¼þîóVóóþªóm. M  Q*z   73$%3 .  ²D  þîþ¼þî  ´¬òò¬«óó‡.  ä,! . º 1~! . ‘$33R . ÿØ;º°O:°/°'Ͱ /°Ͱ6/°JͰP/±Q+±'°?9° ´ 1$9°±239901327>767>'&'&#"67632#"&'&>767>32>'.'&#"0#vF?8!@)'(Š#Z .C"þ|Ey&$ýÝ4I7Z 0$&\4=k6_v[üýEC8fOESkZ(GþÖ¾N9@1*+,Š#b/W""þtCu$'$ýÝ4B?#>@$$\475›be[ùÿ<ÿC´]W†$!7GþO6ÃX6C°4/°.3°Ͱ2°7/°Ö°Ͱ±++° ͱ8+±°9°+³$9±4°9014632632'.'.76?>54&#"'&#"OƃbgŽ‚Â#WCGÅ`+rFB:5S%«=>@]aRq @C>`:I:vr3I;cƒÅŃ.ZlGF¿ƒ:FA:5_=P&VA>Zo\o >FXGaS«®Pc9ÿòw¾232764/&''7'&'7'7>54/&#"9BB]_@BB iÔþ{÷_.7BÔBiÔ…÷_.#7BB]_@þåBa^BBBBºB iÔþ{ø_-87B]BiÔ…÷`.5#j+]BBBþå@Èè°E²+°Ͱ/°Ͱ/°Í°/°Ö°Ͱ±+° Ͱ °Ͱ/±+±²9990174>2#!"&7!!264&"È+°%Ͱ Ö°ͱC+±0°9±+°'9°9¶ %8>A$9°°9013'.54>753#.'#5&'.654&''‹WJ.BN/!X‚Od&ER<+Ÿ6J@"‹ª MNW(k,;ý+…@Gdf”­H°6/°/Ͱ/°#3°Ͱ!2°/° Ͳ +³@ +°I/°Ö°>2°Ͱ)2² +³@# +² +³@ +°±+°ͱJ+±³=GH$9°µ $%/68$9°°19±/6±2>99°±1A990153&'.>7632#4.#"3#>36327#"&'>7>'d¦ /-a¦Ê™DP$%T) òÅ):#b Œ"L<2)O'*Ò2'V7   0 $Xd17;V^(X²w4K,9  %(d2‚;6 "“B ‘  7G®° ² +°/° Ö° ͱ+± °901 ## ##**ÆÈ’**ÆÈ,þÔ,„ü|X,þÔü|„è° "¦²+°3° Ͳ+°Ͱ/°ͱ22° /°Ͱ/°Ͳ +³@ +°2°"/°Ͱ2°#/°Ö°Ͱ±+± 22° ͱ22° ±+± 22°ͱ 22³+°Ͱ/°ͱ$+±°9°°9±°9° °901333!5335!##535!#5#735#ÆÈÆþÖdÈþÔ,cdcÈ,dddd,„ü|þÔÈdddÈddd,ôþ ddÈÈè°" ²+± 33° /°Ͱ"/°Ͱ/°ͰͰ/°Ͱ/°Ͱ2°#/°Ö°Ͱ±+±22°ͱ22°± +± 22° ͱ22³ +°Ͱ/°ͱ$+±°9°°9±"³$9±°9°°901333!!#5#5335!##53535#ÆÈÆþÖ,ddddÈþÔ,cdccdd,„ü|þÔôþ dd¼ÈdddÈdddü|ÈL° k² +° /°Ͱ/°Ͱ /°Ͳ  +³@  +°/°Ö°ͳ+°Ͱ/° 3°Ͱ± +° 2° ͱ+± ´$9± ±9901 ##!#553#35#**ÆÈX,dÈÈddd,þÔ,„ü|Èþ dèdþ ü|ÈL° k² +°/°Ͱ/°Ͳ +³@ +°/°Í°/° Ö° ͳ +° Ͱ /°3°Ͱ ± +°2°ͱ+± ´$9±±9901 ##%53#!#5'35#**ÆÈXÈdd,dcdd,þÔ,„ü|ddþ þ ddȰ° R°/°Ͱ /° Ͱ/°Ͱ/°Í°/°Ö² 222°ͰͲ +³@ +³@ +±+± ³$901 ##5!5!5!53**ÆÈôôþ þp,þÔÈ,þÔ,„ü|ÈÈÈ,ÈÈ,ÈÈ,ÈȰ° R°/°Ͱ /° Ͱ/°Ͱ/°Í°/° Ö²222°Ͱ Ͳ +³@  +³@  +±+± ³$901 ##535!5!5!**ÆÈôÈÈ,þÔþpô,þÔ,„ü|ÈÈÈ,ÈÈ,ÈÈ,ÈÈLL*² +°Ͱ/°Í° /°Ö°Ͱ±+° ͱ!+01463!2#!"&73!2654&#!"ë¥,¢îí£þÔ¥ëÈ;)ô);;)þ );,¥ëí£þÔ¥ëëA);;)ô);;)LL">² +°Ͱ/°Í°#/°Ö°Ͱ±+° ͱ$+±± !99±± "9901463!2#!"&73!2654&#!"-î¢,¥ëë¥þÔ£íÈ;)ô);;)þ );ÈMþ³,£íë¥þÔ¥ëëA);;)ô);;)þ úúLL">² +°Ͱ/°Í°#/°Ö°Ͱ±+° ͱ$+±± "99±± !9901463!2#!"&73!2654&#!"ë¥,£íë¥þÔ¥ëÈ;)ô);;)þ );dúú,£íî¢þÔ¥ëëA);;)ô);;)dþ³MLL">² +°Ͱ/°Í°#/°Ö°Ͱ±+° ͱ$+±± !99±± "9901463!2#!"&73!2654&#!"!ë¥,¥ëí£þÔ¥ëÈ;)ô);;)þ );dôú,¥ëë¥þÔ¢îí?);;)ô);;)þpML<²+°Ͱ/°Ͱ/°Í°/° Ö°ͱ+±°9±°9°°901!5 55!2654&#!5!2#,þpÈô);;)þ ¥ëë¥,Èþ¢þ¢ÈþpÈ;)ô);Èë¥þÔ¥ëØÖ° /°Ö°ͱ!+±°9013!276'&!676/#"Ø .›  þÔš  ½þõLþJ v¯  ÕþÓXL?²+°Ͱ°Ͱ/°Ͱ/°ͰͰ /°Ö° ͱ!+±±99°°9013!275!"&5463!5./"!5 5ë¥,/5þ );;)ôÈ]]¥ëX,þp¥ë¹;)ô);¹ë¥þÔ,Èþ¢þ¢È°°$T²+°Ͱ/°Í°%/°Ö°Ͱ± +°ͱ&+± µ $$9°°#9±µ "#$$9°°9013!26='#!"&546;7'#"%'!'ë¥,£íNz;)þ );;)œvJd¥ëða•ô•þª¥ëë¥bI{”);;)ô);zNë¥ V•þ •þŸ¬¬ Z° /°Ͱ/°Ͱ/°Í°/°Ö° Ͱ ±+°Ͱ±+°ͱ+±· $9±· $901$  $ 6& 462" D  þîþ¼þîóVóóþªr rr ¶D  þîþ¼þî  _þªóóVóþ rr rL° .² +°Ͱ/°Ͱ 2°/°Ö°Ͳ +³@ +±+011463!2 !!35#  ü½ÂþÙþÔôdd  þí þ ôþpýv2L° +² +°Ͱ/°Í°/°Ö°Ͳ +³@ +±+011463!2!!! 35#  ü,,'þC^dd  þí¼þÔ,ôûæ2L .² +°Ͱ/°Í°/°Ö° 2°Ͳ +³@ +±+011463!2 ''35#  ü1TšþF–…dd  þíÁþÏT›þF—ý:2L° +² +°Ͱ/°Í°/°Ö°Ͳ +³@ +±+011463!27'!'35#  üaÔap¼ú•Ô•Îdd  þíÜbÕaüá»ï•Ô•þ 2L° .² +°Ͱ/°Í°/°Ö°2°Ͳ +³@ +±+011463!27'735#  ü|ÔbÕï•Ô•øcdd  þídÔaÔëú•Ô”í¼ûæ2ÿÿ°¯²+° /°Ö°ͱ +01  ™þ%þÊO ý`ŸûÉþw Íªý8dL°M°/°Ͳ +³@ +°2² +³@ +°2°/°Ö°ͰͰ±+° ͱ+±² 99901546;!3+!#"&35#úôdÈ–ýD–Xdd–èþÔ,Èü®þpgÈ>°@°/°Ͳ +³@ +² +³@ +°2°/°Ö°Ͱͱ+±² 99901546;!3'!#"&%735#úôdÈþìx~þ†–E{xa{þ%ádd–èþÔ,ÈÚþíxþp±{x`{þ$ªÈ°#°$/°Ö°Ͱͱ%+01546;!3'!#"&35#7'77'úôdÈgªþÖþ·–Xdddªªªªªªªª–èþÔ,ÈþógªþÖþpgÈûÕªªªª€©ªªª°°l°/°Ͳ +³@ +°° Ͱ/°ͱ22°/°Ö°Ͳ +³@ +°°Ͱ±+°Ͱ 2±+±°9± ±99±° 901546;!3!!#"&% ##53úôdÈþpþ –X,,ÈÈÈd–èþÔ,ÈþÔÈþp«þÔ,,þÔ¼ÈȰ°[°/°Ͳ +³@ +°/°ͱ22°/°Ö°ͰͰ±+°ͱ+±°9°° 9±² 999°° 901546;!3'!#"&%333 53úôdÈÈþÖþn–XÈÈÈþÔþÔd–èþÔ,ÈþnÈþÖþp«þÔ,,ÈÈȰL 53!265!5!54&#!"5!LûP°û´dú&d–ýÈÈf°® °/±33°ͱ22°/± 33°ͱ 22°/°Ö° Ͱ ± +°Ͱ±+°ͱ+± ³$9±³$9°³$9±°9°±99°°901!!5335335!5 553;5#,þpÈdddd,þÔddddd*ÆÈƺÈÈÈÈÈÆþÖþÖÆþ ÈÈÈd°°/:²+°0/°Ö°Ͱ± +°ͳ +°Ͱ/° Ͱ± +°ͱ1+0173737+"&5%;2654&d22d22d22dÈX È$þì%¼ddþÔ,ddþÔ,ddþpËþA¿d5!þsRuEd°L38²+° 3°3Ͳ 222°(/²%333°'Ͱ2°4/±5+±(3± 99013!5"&5!#!5".546?5!2!4635!2dKôK"2þpKþ Kþp"28 &Šþv& 88 x88 &þvŠ& 88 üˆLL *.2²+°Ͱ/°Ͳ +³@ +°//±0+±³$9013!2654&#!"!73%!!5!5!!%35!'!5%;),);;)þÔ);dÈi'þWdþ‰d,þÔ,þÔÈ'iþWdþ‰ô,);;)ô);;)ýDÈbþÖd,ÈÈ,ÈÈÈbbÈdýF£…£žŸ!3?6&/&&'&'7>/.>’fgÑ—{£À4w|~ev‹-¢ä+‰Ôfg’=!¢/ˆvg|~Žv1¢°L@/²+° Ͱ(/°8ͰA/±B+± ± /99°(³&)2@$901=46754>2#!"&?>=6 6=.#"m&RpR&mû´Ê>Êd|Ú~\¦ud?, 2Ô3/2  2þÑ3Ô«!"’’"!ÈA1)!((! d°L²+°Í°/±+0135!%!'57##5##5##5#dLûÿ¶}dddÈdÈdddddÈ–údÈÈÈÈÈÈþpdúd°L $² +°3°/° Ö°Ͱ±+°ͱ+013!4&+"46;2346;2d,;)d);;)d);d;)d););;)þpè);;)ü¼);;)ýDÿœ°L'+H² +°Ͱ/°Í°,/°Ö°Ͱ±+° ͱ-+±µ #(*$9±µ &()$901463!2#!"&7!!!#535!3#353#5#3d°|¼|°°|ýD|°È„ü|d,ÈÈþÔÈÈÈddÈdd,ô|°°|þ |°°¼ý¨,ddþÔddd,dþp,þÔÿœ°L'+H² +°Ͱ/°Í°,/°Ö°Ͱ±+° ͱ-+±µ #(*$9±µ &()$901463!2#!"&7!!3533##5#353#5#3d°|¼|°°|ýD|°È„ü|dddddddÈddÈdd,ô|°°|þ |°°¼ý¨ÈÈôÈÈþ d,dþp,þÔÿœ°L#D² +°Ͱ/°Í°$/°Ö°Ͱ±+° ͱ%+±³$9±³"$901463!2#!"&7!!!5#35!!5#35!d°|¼|°°|ýD|°È„ü|d,ÈÈþÔ,ÈÈþÔ,ô|°°|þ |°°¼ý¨d,dþ d,dÿœ°LD² +°Ͱ/°Í°/°Ö°Ͱ±+° ͱ+±³$9±³$901463!2#!"&7!!-d°|¼|°°|ýD|°È„ü|d,d,þÔ,ô|°°|þ |°°¼þ¢–,þÔ––ÿœ°L'Z² +°Ͱ/°Ͱ#2°/°%3°Ͱ/°Í°(/°Ö°Ͱ±+°Ͱ±+°!Ͱ!±$+°Ͱ±+° ͱ)+01463!2#!"&7!!!%3264&+;#"d°|¼|°°|ýD|°È„ü|d¼ý¨‚)69&‚6)‚‚&,ô|°°|þ |°°¼ý¨ôþ dT‚VV‚T,ÿœ°L#)H² +°Ͱ/°Í°*/°Ö°Ͱ±+° ͱ++±µ !$'$9±µ "&($901463!2#!"&7!!!#535!3#35#33#d°|¼|°°|ýD|°È„ü|d,ÈÈþÔÈÈ‘ddcddÈ,ô|°°|þ |°°¼ý¨,ddþÔddd,þpôÿœ°L!'L² +°Ͱ/°Í°(/°Ö°Ͱ±+° ͱ)+±·"%$9±· $&$901463!2#!"&7!!!#5#5335#33#d°|¼|°°|ýD|°È„ü|d,ÈdedÈddcddÈ,ô|°°|þ |°°¼ý¨dþpÈÈdd,þpôÿœ°L!%+›² +°Ͱ/±")33°Ͱ#2°/°Ͱ/°&3°Ͱ'2°/°Í°,/°Ö°Ͱ±+°2°!Ͱ!±+°ͳ+°Ͱ/°Ͱ±"+°%Ͱ%±*+°)Ͱ)°&Ͱ&/°)±+° ͱ-+±°9°°901463!2#!"&7!!5!##53553!5353#d°|¼|°°|ýD|°È„ü|d,cdcÇd,dÈd,ô|°°|þ |°°¼ÈdþÔddÈþpdddddþ ¬¬ y° /°Ͱ/°Ͱ/°Ͱ/°Í°/°Ö° Ͱ ±+°Ͱ±+°ͱ+±µ $9°µ $9±´ $9°°9°³ $901$  $ 6& 57!!!! D  þîþ¼þîóVóóþªd,þÔ,þÔ¶D  þîþ¼þî  _þªóóVóýþÈddÈd¨¬  $ ° /°Ͱ!/°3°"Ͱ/°Ͱ/°Í°%/°Ö° Ͱ ±+° Ͱ2²  +³@  +° ±!+°2°$Ͱ2°$±+°ͱ&+± ³ $9°!°9°$³ $9±"!´ $9°²999°³ $901$  $ 6& !#5#3#353 D  þîþ¼þîóVóóþª,ddÈÈÈÈd¶D  þîþ¼þî  _þªóóVóýšddddddddÿòÿœÂA!q°/°Ͱ° Ö°Ͱ2°"/°Ö°Ͱ±+°Ͱ±+° ͱ#+±²999±±!99± ± 99±³ $9°²99901;!32654&#".#"333qOÞ€xªªx.,,µn˜ØBU:ÈÈÈþÔîPr,þÔ¬zx­aw×™ kþ•,þÔþÔÿòÿœÂA° /°Ö°ͱ!+±²99901; >54&#".#" ##qOž“^yªx.,,µn˜ØBU:,,ÈÈîPržþmœdy­aw×™ kþ•,þÔþÔ,dLm7!!'5!33 33dK^KþòªþòªþÔþÔªþòªÈ›--›,,Mþ³þÔy7›)327!'32654'>54&'.#"&#"y9/iJ8,K^K.6Ji 2;{Y“^t£ Ji¼5XJiþÎ--2iJ f=ZƒYq£tiA.ªX”_<õ°Î]}Î]}ÿ:ÿœÝÿ„ÿ:þÓÝŸ¸(°°°°d°°ŒŒ²FÙÙ£HF°d°È°ÿò°°ÿóô°°°°d°ÿ¸°ÿ¸°°°°°°°j°°°°d°°d°°d°°ÿœ°°°°°°°°d°°d°°°°°°°°°d°È°°°5°d°È°ÿµ°!°°°°°°ÿ›°°°°”°°u°°°°°È°°ˆ°È°È°È°°°,°d°¹°°°°°°°°°°°°°°Ì°h°°°"°°°°o°ÿðÿðÿŸ°d°°°°d°ÿâ°F°ÿ:°°°°.°°°ÿ›°J°°°°°ÿ›°a°°°°°°°Ä°dÿØO9È'dØddddÿœÿœÿœÿœÿœÿœÿœÿœÿòÿòdy****f¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤0H|¢ÆÎþ6˜Ìî,Lôrd"DâL°è” 0 ` ” D ˆ î V ’ è @ ²  x ¬<bŒÞÚNŠÖ&”`ØŒ `¸$`ØJ„æ6€¼*–úHz´Ôâ.L„´Þò X¢ì0¾ ˆêDž¾à  ( D l Ž ð!h!Â"@"Æ#|#¬$$$ä%%†%š%°%ì&X&†&¼&æ' 'h'Ê(0(\(°).)Ì*f*ä+^+¨+î,8,Œ-¶-Þ.^.Š.ò/200®1"1x1Ì22¬3Z3Š44œ4þ5`5¸66V6®77Z7¦7ì8@8¤99H9†9Ä::L:t:Ä;;b;Ì<.6>ª>Ü??ˆ?ð@N@¢AAvAÞBpBæCvCäD*DNDŒÛ›º j (| ¤ L² 8þ x6 6® ä ú $ $4 $X È| É0’www.glyphicons.comCopyright © 2013 by Jan Kovarik. All rights reserved.GLYPHICONS HalflingsRegular1.001;UKWN;GLYPHICONSHalflings-RegularGLYPHICONS Halflings RegularVersion 1.001;PS 001.001;hotconv 1.0.70;makeotf.lib2.5.58329GLYPHICONSHalflings-RegularJan KovarikJan Kovarikwww.glyphicons.comwww.glyphicons.comwww.glyphicons.comWebfont 1.0Mon Sep 16 15:54:37 2013ÿµ2Û      ï !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×glyph1uni000Duni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205FEurouni2601uni2709uni270FuniE000uniE001uniE002uniE003uniE005uniE006uniE007uniE008uniE009uniE010uniE011uniE012uniE013uniE014uniE015uniE016uniE017uniE018uniE019uniE020uniE021uniE022uniE023uniE024uniE025uniE026uniE027uniE028uniE029uniE030uniE031uniE032uniE033uniE034uniE035uniE036uniE037uniE038uniE039uniE040uniE041uniE042uniE043uniE044uniE045uniE046uniE047uniE048uniE049uniE050uniE051uniE052uniE053uniE054uniE055uniE056uniE057uniE058uniE059uniE060uniE062uniE063uniE064uniE065uniE066uniE067uniE068uniE069uniE070uniE071uniE072uniE073uniE074uniE075uniE076uniE077uniE078uniE079uniE080uniE081uniE082uniE083uniE084uniE085uniE086uniE087uniE088uniE089uniE090uniE091uniE092uniE093uniE094uniE095uniE096uniE097uniE101uniE102uniE103uniE104uniE105uniE106uniE107uniE108uniE109uniE110uniE111uniE112uniE113uniE114uniE115uniE116uniE117uniE118uniE119uniE120uniE121uniE122uniE123uniE124uniE125uniE126uniE127uniE128uniE129uniE130uniE131uniE132uniE133uniE134uniE135uniE136uniE137uniE138uniE139uniE140uniE141uniE142uniE143uniE144uniE145uniE146uniE148uniE149uniE150uniE151uniE152uniE153uniE154uniE155uniE156uniE157uniE158uniE159uniE160uniE161uniE162uniE163uniE164uniE165uniE166uniE167uniE168uniE169uniE170uniE171uniE172uniE173uniE174uniE175uniE176uniE177uniE178uniE179uniE180uniE181uniE182uniE183uniE184uniE185uniE186uniE187uniE188uniE189uniE190uniE191uniE192uniE193uniE194uniE195uniE197uniE198uniE199uniE200¸ÿ…°K°PX±ŽY±F+X!°YK°RX!°€Y°+\XY°+R7aýsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/css/0000700000175000017500000000000013642116632023562 5ustar jpjpsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/css/bootstrap.min.css0000600000175000017500000045433013642116632027106 0ustar jpjp/*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * * SABnzbd EDIT: We use the Glyphicons of v3.0.2 because the new ones are not sharp on Firefox and Chrome on Windows (Sep 2015). * For example compare the icons in the config (that uses the new ones), with the Glitter icons. * *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}} @font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url(data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAFr8ABEAAAAAoRQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABgAAAABwAAAAcaPfj5EdERUYAAAGcAAAAHgAAACABCAAET1MvMgAAAbwAAABDAAAAYGenS4RjbWFwAAACAAAAARcAAAJq4khMF2N2dCAAAAMYAAAACAAAAAgAKAOHZnBnbQAAAyAAAAGxAAACZVO0L6dnYXNwAAAE1AAAAAgAAAAIAAAAEGdseWYAAATcAABN8wAAiRgqz6OJaGVhZAAAUtAAAAA0AAAANgEEa5xoaGVhAABTBAAAABwAAAAkCjIED2htdHgAAFMgAAABFAAAAvTBvxGPbG9jYQAAVDQAAAGrAAABuDKVVHptYXhwAABV4AAAACAAAAAgAgQBoG5hbWUAAFYAAAABgwAAA3zUvpnzcG9zdAAAV4QAAAM+AAAIhMxBkFZwcmVwAABaxAAAAC4AAAAusPIrFHdlYmYAAFr0AAAABgAAAAZh/lI3AAAAAQAAAADMPaLPAAAAAM5dLpcAAAAAzl0SfXjaY2BkYGDgA2IJBhBgYmAEwltAzALmMQAADagBDQAAeNpjYGZpZJzAwMrAwszDdIGBgSEKQjMuYTBi2gHkA6Wwg1DvcD8GBwbeRwzMB/4LANVJMNQAhRmRlCgwMAIAC2EJ1gB42s2RPUsDQRCGZ5Nc5ERjCAoeiDNYGKKFadOdjSaFErC6KkEkGLAIVqZLmy6NBDt/gKV/Jld485rCykptbNY1BxZXWVj4wnwtM8/ALBHlKbUtMs6TuXCVWdQF03TxlELyqOSyVRLap3tZlgPpyMNOZddU/eqa5tXXQGva0JZG2tW+DnWsU/gIUEMDR2ghQh9DjHGLu2ey9nvTgrfneJThkXpaVtG6htp2vHMd6EgnMChDUEeIJtroYoARJpgueMZ+2LmNbU+XknnymFw+5eONWWnmSyCbUpEVKQrxJ7/zG7/yC4Nv+JqvuMdd7nDEZ3zCx3zI4Xac3uEvZYr0AzU553LZhvQLUhU8+tcqZh/WfzP1BXUjZUgAAAAAjwAoAvh42l1Ru05bQRDdDQ8DgcTYIDnaFLOZkMZ7oQUJxNWNYmQ7heUIaTdykYtxAR9AgUQN2q8ZoKGkSJsGIRdIfEI+IRIza4iiNDs7s3POmTNLypGqd+lrz1PnJJDC3QbNNv1OSLWzAPek6+uNjLSDB1psZvTKdfv+Cwab0ZQ7agDlPW8pDxlNO4FatKf+0fwKhvv8H/M7GLQ00/TUOgnpIQTmm3FLg+8ZzbrLD/qC1eFiMDCkmKbiLj+mUv63NOdqy7C1kdG8gzMR+ck0QFNrbQSa/tQh1fNxFEuQy6axNpiYsv4kE8GFyXRVU7XM+NrBXbKz6GCDKs2BB9jDVnkMHg4PJhTStyTKLA0R9mKrxAgRkxwKOeXcyf6kQPlIEsa8SUo744a1BsaR18CgNk+z/zybTW1vHcL4WRzBd78ZSzr4yIbaGBFiO2IpgAlEQkZV+YYaz70sBuRS+89AlIDl8Y9/nQi07thEPJe1dQ4xVgh6ftvc8suKu1a5zotCd2+qaqjSKc37Xs6+xwOeHgvDQWPBm8/7/kqB+jwsrjRoDgRDejd6/6K16oirvBc+sifTv7FaAAAAAAEAAf//AA942r29B4Ab5ZUAPN/MSKMujaTRSNqVVmUlbZW80mrl9RYbV9yNDS50g4CAKabEGDAGTAskhgWCCTEJDhzgUEeyCUnO3CUkcEpR2hmHcBeONI6Ecgn4Sox3/L/3fdKuthjC3f//XkuaJs1773vf+14fjufaOI58RohwAidx6RLhMoNlSeTfy5aMhn8dLAs8bHIlAQ8b8HBZMgpHB8sEj+fkqJzIyfE2Mkd/+89/FiJH32zjf8YRrsgVxWXiMk7lWjmNy2j2nEaqmjVLNH9G8xzSDFnNXdWkbClAOrkZPZ58NFVQ5ZxcUKWoElWllByXpVShSIQXdr5QgRcR9NH65uFJB/RRehmgwcE/el8rt4QrWziuE28u0ZsbsmXCWTr3zSGCuZNotoxmOaTxWc1c1cRs2WzBU2bJ3Fm2mHHTwpk7S3YKXYBE5fofGSFdZETfrB8c39I3kxGKs0H8gvgsV+C2cFo2o7VVy21Z/Km2tJnCEaVwtGQ1Q0ZrzmnGqhbMakpGs1bLihUvVFwI2cyMVqCQxaqlUEsWPl2lbtKpubJauqo5s6V+0lmKFWS3JvVr3XLZGsn29/cjFQu53kK8kOsr9OWyqk+N96b5eMzBS1EpalTgLSzmssN8PmeUjPFYKk1SxeLlhteLtyeWfnb/B5sHjc/nli0J+/vnz/aQ64r6QSPZBe/mGf3zckpoybLcsy0bNz1Rvbp1ro0cLmbyxSdO3fniBRcV1s8IeLtOHS6m+4pLrprb6QzOWJd/+qLPfjX91FYOx6RCRsRl/AHgLzflBaFKNDFTMrCRB6JWhFuObkNy4vCRYx+QLvEl8QTOx7VwmpDRnFXNAl9RMyU/fKVkEWR3yebu75/RI3h9uWi2L9+bjMekNInHjIpXdRDH5Sv597c++eTWdFfX85d+6TV+7ink/VVXPH3t1mccG6/+5YMBm2MTJ8K9iqIGvCIC31s4O8fliVogCdlsgFGuANQfrSJd+kF+Pb8eRruriAf1zRW6d3j0Mf403Ua6RvfC7wjHPjz2ofii+CLHc0bOxXFSAtiZwKvQ15shyZhkJ8v/7dRD/PmH1h46125/0NnqtG/+t5PYgdPtKceDdjtX49/6v546P2uixpm5HFc2Ij9LVU2AaWTJaKZDQMqyYELOEQzAuCYBN01GYFwrJa4cJTJMp3xUFjUE9uibQFpt9PXR14tFPom/7+BMMF+e4yIclwyTwjDJywk5KTmIWtvrTUoGB1HgmFFs/dzKE4AYc5asXOeW71i5cI3DMuqyOGD/85e2B5WzO/gzd4/+t0sNXtFXaA+oJxWEyy1W4buCxzK6UvYHOKCOeuxd8fvig5yHa+I2cGUHYuTOaGpVa2KM0ZzRyCFNqWqKC2WDZoA5AOweUGT3PoF3uVvVfs0gA+dzJbcDpoC5X1NlzdWvNbn3EU4ywPkZPW4XIKR4JeLzOokxliLA7rzLF+lzJSMqaQZWa15BuiTpEpPXpB+8+q7KzS8R93e/q79P3sNz+u8rd12tH4STl0gS6VrBX6z/+aXvwhWUP2GerxefE+dzAU7hiBbMaNwhzVGF/6UmxtK9w3yYqPDGK16HIKXF4sxTr776mq4Z12397Pq+edfcsnd4+IlbrpknuOZsWdMtLp6/4ESxe82WOf3X3HhD+ZRTyjfceA3Q6tg3uUXi/TD2Fs4GLBb15DxR4jETj1A4kfzbvfy95DV9xz36jfqOe7/ICxEqiv6kzyYe/T3yj/BJ+bLxN3ycn9PsIH6pGBKzY1MKJlLjr3tUqaCmCvGUNPU+876/+DvfW/Ldd5avmOaO/FV3/fYLO//whX/+Z66Rdz3Ay3mSjyWHSG9f1hciXmNcIQoZSczW/kebnSAjdxNSvD9X2aZp2yq5+4v6sbs5nI/0+8voumTlnPA7KnBNCxfnUlwnl4EZoXFlDjlIrJb8ERCUUkaL5TRTVWvNataMlsxptqrWltWcGa0jp7mqWldW82S0dE7zVrUZWcQ/nM0hOYjWS8dRrO4z2VzeVjWriS4UUfvMdlnBXX9Va4Z3xpWhrBap7mtt65qBpyKuUhSuTLR39+CuUC3lUVDZrCCogk39/ZpTLjWHUGD10PUyH89PeqEUhFkaJdOcE7WP9hfH/oH4Gd1LXwfGD4rLGi9BWQrC6ui2sSOUlGNroxNomOFmc3O5sh2p15UDtJFkoYw2SEnTC7wxh9LDRddHP7y7ShFAHIjWXtVmZksnUL4B+dAHEtinyDCm0VgyQCbuk084HwIuUEIhRd+M7+Pb/Prjnck2HOYvadgZffF4ZziQnpNxX8mdxV3G3cDdDWs1pUJp8OIc0qHUW8wiJUrLtuWQFqX5V8F+d6Z0+hdgv7VaOvmWLFBnBKlTciHTmYH52rKUQjNAUs1ZBdv91dKJ6/HTVTobjm2+EbYvrJa2fi6bLd1DKYdzYYCw2dBJYkk5//H7JP//7fUhpYIEO84bGfm/nc+O7ZHHpts8+p//1wtg3a3Li8YxXlvj8UHK4710+i/Lac1VbT6OqnY6jql2Mozo2RNGVD3OiJY2Tj96Xh/s9sHhJOwalcnncTSQ76nsizLqf9z+J1ObP4A7o/PxffrtRpqPf/tTUBRleIiLiR+IHZyB42BxSJFUiDwqZA+Ofu0n5BX9dKEXtn6K113EXSQuFBeCnMbrCmaimolkJheRoP7WQRIkwYP6W/QNPoYn7h/Ea2CtmqAbpLgXJmgHoBbEc1qoqkWz5eYQqjnNSdB4Qs24GWoB/bqmP7Q16A9JEFjhrJaoapFsOZHESxNx+FYygZvJZvhWYkzLaIeRToKWUeZ9ILL7tYSsufu1AGgdqivYoHWobtA6XP2lEGgf+ziD4sdzTXLZGyD9/Z+gewggz3NKTokr8fzH6iELixUQ9Z+gjegb8CKU7nXafZnSroU7YzrNKjJVs4rWNKvnUbNqDn2MbvU86lbN4U/UrgRYxqZitnXnOGaoNZD3a4jtvEZ/VfLBVSbSuZwi9hJxvQSIUV2RU8UHQX9ogtV+AYeGI5oBXXRdkqpliRpzEhhzmuQq2QAjT7Vs8+BBG9hRaDKVbBIMkupvjgPgVDNzFxTQZr0ALBgNqbzPDRoaH0vzhE1g1HfpBFZ/8cQF246Qc45su+CJX5y2+9V3X919Gvl1SCni7CjiAvUCaRt+vFDZWjpypLS1Unh8WH/thS1wFVxMbONrFqy7RY6AXCqN6TEzuLKIK47JlssRzZXRRMQHkQAqgDGoWRk6zmpJptKmABY2AeO4/lcE46SrAkNfIWigkMO6DS1vUBRWId2CXJO4S9zFLeJO4s7hkAlWVbWlGa0PqLeaUu/Eqnaiq7Qc7gEL2hqg04kcqCrWIWD75fI+p5LrR1ZodZcCGTAsS6uA5UsSKDDaUnmfEE0twLN97lLnCcjwHm8L72shkk8tqD7YzGVn832zidpXSBX6YDPfm+GTGVJIpqRUEjbjMSdvdJKUUVIlI2waUClUvMZYMmh8gHf4hVXdg7caunsMybZYUyZpTGcMt82csUrwO8mXDIYvEZcqrOoavM3QPcPIrjBkuwy3DqRXCQE7/4CRXLC9vB3+8xui7UljT5fhtoH0SUIQThkMD/D2oHBS19Bthq4e/HJzd9KY6zDcNitzkhBwsJ93BISTMrNuM2TSxuSMwPrt29dv2L4dZKHEFY8dEzWDF/T+cQ20wN3BlaM411rB2p/Rm4WlIpUpd2T7cqAuNFVBxUSlwtEFxzMZWFmoeR88hKtOq6uUwHmY1dpQMy0n2qiE4oCh21woj7QZoKW6Sj2w1Z3VequaPVvu7cGLej1wUa8L9UwQiugQoE4UXETGVpKG5cQDaifbQlbywAvVTU9tu+i0EM9AO+lqHyAei9Nh/egtq6Mo3DLQPjq/faBIZQzyGZM2IslanMX2gYF2+F7W6nAcvRSZr31wsJ0/MDqfPwCW8kf72Sazl+DPoIi/Bhukiyubqb4OfA/6ufkQ6uomqmcjlYDpSwYTCB5CJ6uZxOtOF36Ev6WiH8Q/fgN/y+i20b0oR/j1yO8oAN8GOeHgZC7GlcFY6iTI9SDtjNWykSDBjCaQCB42m6hOOkYRIpOiw0r+hYw4rEeftTr49aQrIG63OnTb6BmAnuBG3FHGipwoPi0+DXPYAzywg0Mb3FnVvChky6oXb6MqMC4eHHJqGAIEdhg1V8kLCI5fFICLVBdObpj3aDSWvHaQUxbB4YGZVZJV2DGLTrR1uZLXCXsSZ3fhKQ+eMhLZVhPE7taI6HbxYqTVXRPAHpQQiriHuMl84t6zR39fP6C/7/uQrP3wQ/3JRSAyvtF4Ys8e/iz9yQ/x9KgOJD1IbQX+2EMcZ/ACTVFepWtWlpRDjMGicmao48FJHQ/EjCyMcqwmreIkJ8AfiQpxwZMT4kXy3M+VR7w/I8+NvtX+QVvPm01Piho6VD5aRdeCw8zvw9d0dHbPJVzZivdkdwMThGTHRWVZlPDWIsdEvx3oaKGysiSJIKl4M0gquwzylXrF0AuCfkqAiNpe5E/6Gyg/9Tdg6zfPPUf9eCBC0Y9XKcI4A7+Cff8cQKFyYe7cmgbpoXPZAAPbQgdWrmoyW0hBmWx2lRTYAsUxgkuqLLv320W3SnWDZlkL92uKe7/N4PGF6JiqHlhzicnMBWsrau8wnw3zdCki9ZEUqLAXyFl73jj8xp6z2MfpH5CTP/hAf3rVrsquI6ThBHzwvP70B3hep9MVmHYizwa5jXWerbFoUwOLIiZg4/rH+LIZMQG+3I986UVM/LKm9GtwBJnTRzHxOBETo8RRPWh6lhSaYCLH5ePx5MojR3Ydnyv1cxgulEn4MZ+CjfNy7TUPr71aMsggX2Ei8oCUkin50Py2W4AXiBOXqLzsibpztQnvyanRQk6IVoTIPxEQdjusjkolS7qylY2jjwTIv6Do0hMw88lbsM4exls20lHh/NzChrmPdAxQOgKv2saoFwTqyTYgjmi2CD7/2FSmxPKpU4jlqekkEZjdhuOR6kMyi7RPJhXZD6P+9FNw/k5yTwW4t643NXNrOHQ1w/jKGS0AcIYonAC301WyMH4NA5wWhMsgerxqAIfZLJcUH677Mo4+4cxeBQ8HZI0C7Q3z6ESOe42RpAsdzVJUlmBVdxC1pijtOqJ/FbSiz116Lxm55yuvgFbE/+RdphptAXUJtKqT8My1p+3mmJ7HUXhdXJS7livLOKYwx3zVsq8F57kvCPPcjnOvbDfgATuHbvIYc1BUNRdj3mC1FAdkXKjKyO5+BPgFyWC1gH4SRfiD7pLZhGj5WmCJiVIRYcbrDOhIZ247wKYgRwtJ9CQLclQCZaYvn4N5GY+lELstr3zlHn3zfZtvLx1ZTEbo5y52mF+Pyt+1eHbVkRIuT/hJj3Gw8hVrfDudL2sVp5kymj+HYi6YxcBEcw4HLZRFiRfJoaiJUvZuzaH+nshSM8d0qGxzeVHhsFbLDrcPtlBpAImHqxsu+QkwNlINLw8s+kMkqiTy7MX8RsItR9+sO4pQDo6/0POErnmmArD/o3uLY7sNMht1IpDZKo5dhOk5rTBih2BUyoYgDpoBpXXQhcud5gCAm/CgA/QYVIK4UgRXNtFhCNKZgX6lgXGjOdfgUQIFh6nooIBsWU26Vm+hysjRbaC9gCSntmuRX98+UFm9ZcvqCigxe+E8/4ddVBuv6QvUFyTAXFbZ2kY0H+UmASx/RkKQvZ5hEuaHSUF2kLRglADtwdu3brviomJ723W3jNx+1alepB8ZGZxhjzYZVp5EDp+0wNLWZllwEpMZTFY9AFzdw53AXcCVM0id4ZyWrGp9dJxDQKa5NXsGV7IY0KazqnW6SlnYGqhqA66Si6oOpXnA2tlOoJHNGmqm0iSZgdkpuTxeAbnbBusdlXXymCUzTCJhoozvp/mYg1c8MnNNIEHRNZGYtO+wglK38/fE+PuddPPcR994+41Hz63YTHtMNvrGrx/fJh4QlFbSdcPPr7ji5zfoB9neVfAF+N5Vo6+SH+OFei++N2zXZHlFXC+8zRlAb+PkqEE2REkBYyYqWAYpMHWZ5Oe1nTsX1f+TERDbFf2phkP13xI2099ycm6OqgqOQyjf5FogBH89UQA7Q0qBmB377QMLLrto3lr2q/3525/7+q19l955b338vi2eI/w3/c0QN0hjV+gpDtd+G/1DHiZ4WmB0PGYYHZdPZUs84VCJc3gYPwdINCEnyNj9wVJSwHhWC2gdEQYNuZfCcqZ03dXSSca7RozkHoDr6JsV8gMA7MlbC5feeU/V9MB3X9xlmmsq/+6tsmnMR66BVJGBmwMAZ5TaJbO5eWD/LeVWEsI4vDRjPhgk7mq5vWcByoxgppzqXMaMlHKiezkei2VKvBGOxEEpzwKaJceJsBetlnoXo89zFRouJUMY/aPVkoCRyRDzkNnRvMlVtTy8u0ppa6fWQd0uc7LlNPW1pGPmzjKxOvEuCVepAN+ZfyJsD1RLySX46SotA0rOzWorq+X+oYUoy06Ci2aEYGXyKv5A72xUfwsJ2V1ua5+J4c5SrAko7PHOpLZqXC6LswbQbxN2zzEbfIG+wuDQnHmU+D1ROZ5Hl0suH0WHOhOOBF4CCEUBVcI8qIfUK4MXsaMgAKK4y64WQFwSFKHwIofR9iYjxaJuo5oWGuMoPLuYVc789LBdGd2LH3gJla01GdsFQgPjigfwHeUpfwB/iV5UrMBWUXgbmbOC4ngzXoQCWrgFhO985ss3j4371PVkM7OAyqK3GUcXlCMllM3SY1R7baWBQ+ZlQNliy6JqizohmClWlDVom/hhC6zXJub1j1dRSJdcGNCQjP39pSaQ1jSkgTEANCOBPCmgmIorDXwq8JmvfeI+RbsytopUKsLbH62CLeHto/7KaadN+0nnNRnjbw/qe1LNq4VKl5cqMzDFFVw/3BKwBme0Uh+ch5p4ZsJ5VV+20NebSsYkAlbu6/wBsOpeC4XXhEP4BkPwLxYnqHs24Xcnh8LhEL7RuQ8SxfDr2n0DIL/ZndUcu7nmzdbtOzOL+tH774f7+wKU56aDIJFDDyoPApLB8Ut2P3jjrUU8kiUvIURWxySINNyHkzT2yOhhgRles8qY1muly4ilqlkmmNMWDj2akonOGAl3iGigNMrJBdDbQMeJysXnhK8UR91F/n2RPHfUD+xXpOTH2D1dK0twPw6gl3uTsAYblQp5ibwUUo6+qYTIAX2BuN0bDnsb1jy04VTQbDZw5QTCCBaShdqMFqGeWqFJ2bJgmWBBtlEUgDP5LDKniflGJOaaNVlx7XOmYsyTB8yFWjxM7KjigS0hTRAySSgME9QZWoiPqgsVUAWA3Y6+mW/jVw2fybss+rDFxc9N8h4LOWzx8Eneahnda8EBgPk6v1Lhf7VtGzkV17GPbvqSxeGw4FstfsbyBUJcgusGnriMZieAmGvPaN2gomVgIhFM/AAsWqrlFuqfbMkAdi2uUoou7aUcoNICw6AF+kudKUAp2pqI0AWjux32WmJxtAi1qFxK94Aw87j3WwPBzAymFNWyHaiPMi3CYu3gnTTpgUMXmtcY472+bF9vMoaK30C78DYqRrtEZ66wpqPSvnpW2mrbBVpScaQyMlIxDq8fHl5PgDp4FSpMpqYF+U7YUbwD7WAKwzUjJIIXDZ9Jdb08HdvnwCaOwYtxnz2nhatl3oaSnWjxTKm1poHmwZKdTaIqDIMSzSdTaQLrXByMHwdxEuJRPXlySftwq+d0cvtqV2eefC3W5g4bjfoNZ+iX+5ttHU4n2VROXzXX19f1pze6182dSzo8aYddeOuoe0aTLShJ5J/ID76gfw94Dv0/36M5DO0wKudx5QhCFq2yT0LHp6Oq9WSYpQscRkdJPATX4EIVhSUL02tAs44ckoFZ6Sgl0jBKPhiY9ihsNPdrHTLsaj3o/AcE8zQ5Ii2k8hjO9OJIhEX4JPFUjmakdMJywVJTQD/lzb7WFvLLrd9WozGrDQjd27nl8ZWVr2248fozH/78sov37t4g5dqEgWY1ZHdKC7UvFM4otJkkwZY7YcvCk+9ZXtl48qk3Fa9bvnojm5PCZVTnjtRGgdAQLYgAB0a8UTTVUhEQzIKnD8kPgKoOwUkEo09VKsuvND1jaVtkNBvI1/norFjAYLjRMmNRvzQvI5w0s9VDBNLfb4qnEjbb0X/qHTT2c/yx52s+ITPw/3au3MTstDJv8OFCYwOOt1GOdwHHW4AbklRAMs0WrU2YKbD2h6ifoeynQRx/EIM4fhrEaYKv+dma5KzifClZQKaWDNRma2li8QibrIlA/hTM/IIal3OSR85FYQdGopPIKrBaQQZTVFCWLl16/fXwOrKLP7Ar61LS0VilqG8uVmLRjFcGde+JJ46++YRwLi6voZRi5o8+my0Ws8Jq3qykQnTtiR77hng3yD7E9w4O1C3Al69S07QRXQvA7WToWg59eiRDoNPs401mggqOy49WEIgxKhJ4E+DPgbjWWmSQ20Eqt2cTQFKVQO4Jx0E9+gTDrshQ92bGUU8rrtz1jDLCT8dQH92CqPN31lGv5Qo0xlK5mvDBCCddAj7tfkgRl6EF9tF+fBci+I7rB2y/Tbf9NHq5nkYv94LKgksKjbZUPnbrb4FVnrTv+YTzE2Ed364cN9Q6Bg45PLapb57u6DTwJmseRtArujMYGAhlMAljKKP1VjEPo5ZrMUQmxog9+U+334hJsZHslcbxqEwYBBbuAuD5i8c29benO/rxeDGMGHafhJf8qWPl04/W8bbHkSJzPmETUTJNm1eAuSOra/gto7kF82n+zOk0f+ZkmltwMc0tKGYR4205jN9cBWLiRtQPyq7IjCzNNCj722aitXPT/yorZLqsj/8bLesBzo9/Qz/LhDn8idufgupHRz7NCBmP7a6NjxG01CDXwc3ilsDKiNZ6kma6pYHqSzNoYDKznK4gGIoHKUpjYJ9etE1I9jjvB48/jmYNzhyc5zhzYM534bZ+cHz+67Y61CgKwBxEOazbxGUfvfW3Cjv4Z0SbyKA08OM8wFflynOoH2tpRptzSJtXpejO6Cn8H3HDsLNHpalo5NPhJ0SK0Scqlb9Vjn/0FjrT+OT1S4tLa74hTXibenO6adYiTDG0+jxUvQarywtrp5mjuRhcSbTXnL7oapmYYgZWS1cL/35LV1fLqLulS7gFzHQPfyfd3wLvpMiSeIWGea4CZTfUZjcs9/UwLs2hmOBzDlXRBVIL/WA2RSgAEMn9miKXPG6quABkZZdHQddEk6x5+6cmzc0mhhTxyFF3TYsPusX1nkDA89Fed7D436RjCUm8e9R/8YrNK1Zs7hIOu4NB91EbvL/3jZsfIsP6m+Sw/hM8twLo9sVjH4rN4oucFzT0oRoGIQZ7C4Wd5X+gE9bEglVNCpDOLiKsIYRV4vzMhu4FSyobJl6qsafFVBJ5iZoXxi9e8/Nrr/vZNYsX/31/vyV27hlXds5+6YGLNj3wwKFd/B+3/fKm7a/+1/1X/NfcuebYpsv2LP38LnrmAWbP12NrCrd4PLLmZZE1X0NkzcOIqqJnTa6BiKEJA0b1Sl4PKEoYQZs2fpaTYxPDZss/0rTJ0TKz/tUjwlqA6bOcKPybwcn5QM/jAG2hEDaiRi+l+UKYqIU0n0r2zSYO8tn5l1x5ZVhZvHLd8tmJFdu/vPKK79243XHaaS7Jl7Y4ebP59ALZdeY3v/aVl89edPeWq6/87G0LNjxYHBCNZ75ww+qLg+cYfUvaFu/szV26a8xWfln8DNfMRWGtXMeVg0gNZxWjAThgKTpgLKqE1PBVS21IDRvGgENhNBs1n1xqiSFBTBgmVkIs1CHK+yKxeKLmegRuE1VpgqJTUBjrJQokZQYUM+Sdx8ilLd/Wf4DGIDncPlB55zH94GPvkP1fIw9doW8if738cuV0dLA/9o7R9G0wEG145fWV3zz2zjsXZclDl8M1/3P55ac0j8dy74e51MyluRNrmMG0iWW0VFUzs9ns0oyAZYZiaa+iI5ErxVzAgkqoFViwZA7CXEr0l0QjfCbHprZqlOLjuOTrqJBhoYUoZqLEHAZAxsDfeso9k5F5InzBBWeFQ+Qz+oOS/8R5a+f1M4xWRdbXMXowDwiRaLLXYybk52Q+GX6Nd6i5eZeM4/UE9QHEcf1vquFlZiPWWsNlPORP/WY0ui+FW9B3gRlVURgvMyC6zwf2PhuvUiTaILyOM1pmPkVSgFvX4Lyy/uhk5NaSJr7vc/rq+xhOaqmO0oLK1xGnnfrv+cId+kn3sdxslpOkcgu4shux8FHrEewbMyvS8R7ShCziZqJFOiWXFyahkco0H+YD2VWYj7xc4mw06kAUWCPMJA4fZpKHDzPmMivoBQWBm/oe9YJWvqf/Ct4r/Gmk7RV25BX9Nf3gKxXqRH1lzOck3AI09gCVWTTQmqPuPkZbgEcZS+RgkQsCf0wBqjD15LBuoxtZpuXqS8m/f7SfvK0vqec11mU9Svqygv5xuxOzsfz0LnIda64eiqrfZfxOtRvRzIEpN9MDtRv6x25KuM+N6SneWi0H5sFIGfR0Yb4L+/XP8b34m3yST47/SoMvbhlyIVCXFs3gVZQvK1xRuIWuly0cV5iUzDY5ua0yfeLurum1t9q9i+Iy+vtcYdwNxZyBjV/ahQt6w/eQzm11nKmvwtCIM/CNDAs0Ocz3jv5YXIYIY3UKeXvKGNEYBkj2XJ05xSwKjcDYz5BJcaw8HoPhGVdaUdXCO8Dr+XGTk3wDBwnuhxkGwtt1vqOwOhjfuWk1lrVa47vodPfqarwTvc+Ee7C4I+g0YhvVadw1nQYVGhQVyM6TdfMomWCmictGXz8ypoUTJ98LNPoWJwl/Fb9O83Mx7Tb1LX7Vn/WHycY/8+tGtT+TjbCFuLmO/UJcLV6F1kzCTApElRQ4SDbqD/+FH1TIqPYSvXT0ZR8hoyUm6wSOF58Rn6G+3Lk048FRxXI1hNo/NeMhUMt42IcZD9R/oWCKLOY7TM12yIGcQKUyrsSFPcQDctazZ4/+nn5Af++OCv1H0xzqB9/ds4espocnwOUEHWI8JwnhcjXAZWdwYV6QfQJcNswMkThYYkQn5ogY+yeDF81Hp4CFRRfTADWVVlkKU01f9Y85wRiFJILVay4UoyKCYVem3FwtqIVUISWlJHUyEGte3bnz1bvugveDO6fA0l4/A+8MJqEGkzwRJncDTJ4xmBzjMDmnwAScJaUmQ7OJeMnu5949fwIk7wEkt+jvkN3Pvns+i6OO06YPbLOLKSSFqjaL6gJRql73stEboHMtXNXCzCUL8A0CfGFcb6K9sN6k5f1msY2G/LhSalZtGLWorHVglnLZ5kyjot0rl4xkCg65LHrHhw2zaD6B1yg5RDU3LOZ70wIoFB5gx8kIVkZEp2TkDbxZdIgeweMzqQZnKuQnFYO7O9Yc75nf03ThbXdMZVY+yBttFskg8MTr8tlcRFRbhpKCpT27Pptb1uY3bh79S3EibTB6O1DnZoUuxm6auOOrYn6ROO7WLbmVOv/6UDOeimohilFOTDSfDqv3yAgLNk6F+04whooVON+YaxXkergLubIPJSJIw2gVk+q5TNnVFM/R4qmyI5Gh/v8sQHuoLIU70behVMvmSDv6NtCdrvhgBrYmZvSwTCjY09T+Eoe+9ZZ+jcjlSEcntTvkfA408HxOCfMqIOAgkhLPp0kqB6o4HO0rxPM52IWDcCqnvOTsWLBpcaVvyyb3j34UeGFD5QufC5/tv2xp5f7eH1QC5y+uLL3U/3NyuDK4YU3BXql4V928oHL+3ujLLzc9cP3iS/w/+cmMr1aWbFJ//CP/phMrk3O9PLDyLJyUMxdpyJmrST40/DBXiuZ6eYMTE+NoPsBxEuMash2Ol/K1+PbbL6n/P37q5r80XMVNzVWdjENwKg5NE3DwT8Ih8DE4AAbkeNBv2rnux3fpjx8/uy++c131Lv2JKTA31WD20SkgjhWGMskeYDDTwtB6jp3TS2GWfTWYHU3T5NipBFO7PDStqzc1Bephfmbxqqc+rG7c/NSHA1Pz7K4s8oXhD0c/GPjwqc0buZp+cy71UxhhlmCuHYZia9pNiTcAc3NUOaZZzFhIPLqXj5OXaSbzP0/5fi2/pP79MV8V1p+DlsS+T9NVu/QBfQ7pZjD8GObpEpinRtSTDNQLJNHcK7GKP1QSDQ0p1QjIj8lL5IB+iJU2j+7FekL8nc/AILxV/x1j/XfI+O/AMqEZ+2tF26CefIa0ASwd+uz679Rp8k9Ub8OKapjKCLpDMC68498fwqvO0v5uR+WWV5+5wEScDAu+df5nG+WNEb4p1/OyHJmSs6bjqQT+PPCSo+pNJHmX/vpN79xFkjfpm28iI7UDghmPwC78XoyLi3eJd9Hf48DQjcpg67JfiZEUXqT/iuy9iaTu0n91kwZH9M079F/xefyx1E79VzuwrobmUj5I9eo4t5JqbZGqFqf+7FCmnlFBGp1CZmb1BVyYVWmzi9E4k3lxkNVmXK5CMtCzf7LfgnjCBNV0jNehmo6iu55RyT7I2lli3NvnjYuzRL/yU69/Bkjw346fhw9+of4LbyjkJWl4H30Z5LhhjK5JroObwfXCKpPjyimU5j05DIyi5B7MaD20K0Mv7cowBPD39oDEtnrys1jEXc4pUZoTA2ANkmSGYL29E2YabOKkchIH8Sq0ktUTw/oPmmRTCGMC+AguKZfxfMw6lIqE/sPn9ijvR0OpIUuc5y8rYhZ4UYi53Yf+BTbv/qHBEXHzQoTZh0Vi8ZqeTs2QR+w+v23EnU6WTF4Lof0CDp89I/OPuKVvFm552da+rp/Z6Mf+JD5H64ay4/l9OdA2MPW11Eu5SckX0pjbN2woeHmHmObjUp+v0JcYxgSCVDLG4tSi9JrZJCgz05kLz/vyHW9/pmvJZy6/eet1p69xnutOzSuQmQs3bjqt3SeaJG9Ujn9laEi/e4Pv7u/mB288Z8fA4Cm57nB/+EX9xz/bfUrObPQ4CzfY18zdm5x91o0nZ71mQyiQuzISefnHOGcu42zifPHfuROBy4i2mHLUgqq2wEUVoCXwGlwA7DOrj6bcuL0qrIY+BmyYAKygy4QJ4iMW+viUT/Wlkqk0XwANJyw4RMmI2+Qyg3nhwpa5s2a2OSMO78q1sqHFZzE7BcHkCLT6++dvmjfHmXzs73xKapHTvXKNIWfvuGBJ2snbRBMhVlfQnZylSo7e2eRbc8Mzb+hWLInhofDc91Kr9haji7s83ohTNVmJaPQ2D827dN7TZM0lXac8bOCl6G2/ut/Ucv4lT6yxDTT1NrWpAZdoSS9fG0lfijXq3+OuF98Tc1yUm80t4uZxuDy1U/0Q00hPzGiDh0BfLC0GIhQGZfccizkQNLW35YdpfhdXMoMe+AInt6bzw3MXUaEPdDFmw4YWIIsxljakCmFDFiiTFlOs0CjfWzCqPrWASQlDQWPzwpVXbrlv5L4tV65c2GwMTj6wW5rXfdrJ19549eoNXSdaSSE0qz/co/2Plj7/1p4LL0ws83j59W2WtnUnn70ok1l09snr2jALdOK+5eyhM2d2tuVOH/iMgyxOLJgVWLIBy91PWbzuym3zLvSf3dqK0xRowQEtNM5HsxlO4L7GlZ11S3RuBrNAtb7gt4f+4z9+zSmdFs2Zdmi27xhKDvJXh2b/juZ07bM6bZ7OfS76HqDvQfreSt8T+F6Gs5E7I3fGjWCg9WuBfi3Yr7X2a4l+zdrPvWC12V2BYGsiXftH5ljgkMM54WA6rc0JEo7RGtOmcySOBC64kaw1As8mNO0DrigkYRB4HBBxjOAnDg0mvqi/8sXE6sevuDBl2f2LFxKb7qZEzajhWU4HaUv6ujOxGZ4M2diZmndT2h4MSolTz7tvnNzyXR+tuls574JrZjrb9Lf6drqfuJRRNLOueXVTcPSJe5zJbHK2fw5/w4x7++6e421rs/VuOud82hvhqyAc3eJToG+4MQc9Sd0aKQBZQksaVGhFbiL5+GVNCYMj0aSMbvfO9I5u/0/yInlRfwIDPvPnL4qIkagx8tGhIv/Po91FFGXYKaTeJ0KhcrcdZjUmjSI3d2S0BJWzPuyGU/bR7Eif39xZTvjq9amlTuB0XwKmeyiMNpk5DJu+BHXK53v7Cuh9oP6oMEFfQSohU59BhsQlI/ZYKMgGY7Loc5JN67etJ5ucPr+sP1gMes5840xPsKg/KPuJsd3b4yALyJrh9euH9Wf0v3f0eNu9dttf9b+e5sM2NCtWmF3KHN9pRPqrDVfjep63eVIHhgKsJmO5ptwabt1Y9D2PJWYsDwYzgMDQx8h7Yzb6p9xmvpCP9ovLQsouTJjcpYSKH/uPxp749+sXhpSjS+qp67Di/E1bzE8vGLaKz3IWzgW69AlUT/PTyKKHJt2YaGsJITtuoBFag+CDpd4q75Psblo/4QJLzYGDOESwzwN6SYHLwNSPkoLK9onAr/8LLnsPj+7VnyLCtTuf15/iH9957cN48C+VCr/+FfSgvowq27V37R+9/67r2IFGf5kbdElW/+sCYzI30cs0MTxG5HgsWc8UG31a/1kRs+gxGYzlzSM3D3Asx4qOfwK4uZs7myu34O+bwcSjJRpmzOFTspgD05FDs74TqJGmvtQkNsTAJhyCq+QmNDNYxXLHUga4XEAVFySPWy6FW4BcKibGsX5QihcECCjqw8ZULxYteB0GEOX1VkxgpxrlU1L5xEB7i2wFMxv2/anl533lO185b3nKb8TWTKSLX185cnnk9IDV6m2Ot3Wl/bLpSKVj9faLLl+Vy626/KLtq8lalsCLFX7Ye+i33DfFzwhvoNYkqOgoC/+OnE02/nb0H8ju36G77Hf8PKT1Qu518cciV6+LN5OF/Hx+7m/1h/U9Qmj0RX7e79AJx2rpZnFFwxbQ8U0wj9o41KlrThiJqtbogRElpqKzDQcuYbT6UQUVCl7oWJdfIZ2k60fkpl8efZN88ZfketzvrPAHSJP+B9qWCGvaNut/IE2ozgOMbhizJ2HMsgBtOYbjFchpXUB7l5ZkWcEYfBGryCYom0BFasXMRUxXbGbRC1CWSmozgNRNRyVZAN4BnQN9n+j5FBx8J6ErKh0h+hnH5RUvi8aSKbfB6QgINyYNTfKZOBn7fsCbwu6WUEdIPwhvWZpGo84YvT3SbRCe8rs9j8gKHD86W7T76OzNsvewVwlVOnxcQw0Y1m84GzPgRNTGNXuW4jJWjYgdV0g+V2P6qIJF0pVasethLFwVbmHFrFw939jwa/rbLhirsd920txBA/ttOYOM3GCf5UgUDIvxe0QJtlnSDzbc6agfy8rqUwsdDYSkgcd2UJkaZXWxtKsT9cxh/ybmlhPNVOMjOcYEOfjaK6+QDtLxyiv6IeRwlkRe41/4nwF7cgf8ZjOtKkJ71JKh7aDG08louCaKEieqjP8EfNIf1X/58ssNOWAaUJnVFSxmmeVakDqAQrQ0yUC5x1ul5VhNdd9dC7WCyi20kVoLNlLDyixzi1yb3pNTfpoIy9pVPRg0AmEYr8uko/72gZanDa1efo8nYXhav7vIEuzpkMEbOYX/nS/VrY62Uo8WXdd31/J0rSCtcmD11Hv7GKuakTWFSNMOPaWkEf2ePkpgAZh2NlHSoprvzYNZNkASciLu8TmAodHFn+JpL5ua4Iwlz8sGAqIjFvRViGgzV/hHR89IZniLzWkQ1nhD4kzhjyEFWRdbBWT9Wbv9CC8pvugpR3jBbnUajxx9tqK/a7OSZoWcpP9WWE29/M/Wco54bgnQ/nygfQpW2TxX7kS6Z6paIqOFcyhP1Ww5QXOpEzGshZuRwSpxrpTIAEZt3Sx+3zdACh6wCVJJGqxwgr4A5nPd98nHqA1nCKPJaYwtafLKW2Y7r13jNrq9Z3rhfc21ztlbZG9T0O1bPXrkL7NmuYPkCdvMhTOtMy4mZyqhZ8ii5du9EU9Q8SQ8NyzXv/UMYNwmmZvT7YpXav/XnqGhHiPypAJ60EPiQ6hj0dZS+JdCD3dBQid3SpVU5Y8r3uzevbv7zRV/2r//T/XtP+4jL9KPffT0Q12/WfHH/fv/uOI3XQ+xdblYq4GIcWlY82gsue0QxsmxKMXXBuzmrVcoEO8AwSgYWNcs2WUsx8XJg14izyY5RYoqQjyFAcvi0HWuI+nE+6GhlP7N5qFUtmmG4+x7vMVdRTCWXzpy6HPYhunDpcV+sr6ls9h10hZpV9dJbc2vfD+Y0O8gVx989bnfXK/fUWysA1tWg3MzV27G0UxQLy+Xw+J/WCklLHHG5haWsZg4DDOsmSKtv9DijHNZhS72BpAZlsm47C6b2rrQ7c3qc9vdWiesJGkU2x3Ue5STC3LvAEEuUD21STeWMpbhk4UWmHapaF6IS3GYXZ+EexHF2Oje68kIEEDfO5kAFHlyNZ2LsOYVDYp4CsX9BO4aDt2nrbQlSTvNyPYi2uUeWhffQ8s6506LezdLqO2mWbTdgyBRsCCuG5Dfb5ObvLOpIdjUCijHgQKy5u8veXuAMurgCdSrXJApEWCKJ2AStxBafhWtr2KEtkZQox66tNGk7WgHjzkvebB2UwZTpdjscJCLHFbZdonDegpJn7LpkpM37ZCanPpT0uOg9yduNjY5f+Ryu116gVhFsyCJIm+w3LdWf4Z27FrK2+WExfyW0bbZ4XU7rlk2skJ/xpd6pGkDWaO0hRVviBBeMAg2k8P+wpp3a3LsPPE5cS0X5mZyg0g7fz07FNbomVhPoc3KlmdSMTCzH2k3RJcPrD2gTQ9auljtATIOENrrwkYR2mC1NIyM04Llg7ZmsZ3SLtRKkyy0Flnj+kvCTKwUSXVR2vG9fWqUkQLLfQ1hvp65lBLisVQO5Xa0ICckLGqTHIYOgoplTj7vYiSU1XGJ3WV1kEskT/Qpk/6ks8l480UnW97AT5K4SH9y3T0WAzEAwcyileitwtsVft7IMnKNy6XYL7cZ3xLtKXn0A/vX2hSyptju1Z/ZQP7rvTXftDqtZgEDLES3IYXZXNuIeqrBAVYKxpoWceUCzrWZLLakHNIK2L+s3K4gedpnAXlycMCFuij270NfSzsGV9x9/f0lR4bmcoEAaSJhvh7zTiXymAKlyKmk0UmM2PSkMGwYxGqAPpxUPtUgS1GsF9tIQeft9kfaFP2ZFSPLrnEmHJt9p615wRdgkGeziNQG3Wzi1/M/1e83eloel8haRqJLN52i/+JkG7Ff6rOuvddtZzQSbIRU0IH2Q1eTcYf+OtgqlVrcgnAW4T2Dn/q9+rBjTo5l2hZoxVeOYU67Rbb3IWNQzLEDib1amomYo35gCQHmdjA+0RUAq4ixBZaN2UTAypIhkmAtITHu7ySCJ6rKBgc1QpN5eRBWk1TSSVB3J07fZnvSeQ1ZPrKCrPG2P2If/RD437L7PfLfG/SnvW3ZrCAZ/b5v3guIL27xXWonVsT24ktPvghnElkrPd7scOo7YMj113cYm50/9LndPlKxSi6TYHffy19eoT2CDFS2PsU5YJWZVdNPnFSy1vLJOOr0w6LektOGDli5n2bncazyu2Ty9I/VftfCBHwiKplBQTKctefX1z7SEB4jKdCWyL36pfoh/pRrf73nrD36u7WIp+eEl0iSdLxc10+fAphcsOLNrFlinioCY6jWsxcsLHWh5ME+S27M4ypbOLmfVaOjC0umEGEHSQpSAXQ1+AOIrmm8cQWsnLR+kEFDwWXQPKa//tIPXm6gD8IyPAZLPc/Fw6r+WP8MjE570HB1IIm8csmAGT4Wd8nONCTPRIgStD0FoUS6hoJUJ1KlUpkWpINolE2CaXkNpnHiAFisBLEBLHUCWO4aWB6aiwQEBNK5+8eHcRxEM208MQ2ItFSzMg2Mm9FspMq00ADnndyXudtqkIIBdVJGu4nBu5vCy2TrqQzehzDhi2Ojeqo8x+EweKLx1uFl66697fbPP4COAIv7BXusLTt0+oVbqeg9qUt2v+DLzhw+ccm6DXjBTfIcs4XznnrV7Zvv20WbcrnLV2+9djoUPUaf5PVJWXQHq2G+4DPCu+p1EJRKfAFmJPzHFsBG0AIxjNqXJrhd6CvAdWHSApo4nCkMC4VkAePjhbSQ6kvhlIcrU8aUA+Yp9oOV4EYOnP8FXxbevHDDND+Fsn81NRljxObzm7zrfcP9IVNasClxj5EYztvaEmkVHBmbY6FsHoqkXVmXSIztIm8KBFWPx2pyGNuajLY2h8MjignRYJH8PqPL1OJWzZb2+Gyb1dJSsFmN6dVOj9vZGRw2OYcd3tmC4CFCDxGEoGCRrW7JJRPj3PYp40o2xLY0mxcGrB7REjFlwqJ7qVdpahKNHouNvzzcOtxiJpLkshLeao2rfIa3mwRf0h0KhJrDLiMhJrMnYTYJixW10+Lo8AbMbo9gtqopJSK1C3bBILbGfTZBsLmNFiIYjcaU06pKsSsutyUki00W3T0pkZhszEfDw5p+K+fluEFSIED5PtWgFnwwJsQYyxAnvz664uy/u0sfvecj+99dt2P0aWen87K7O138uvN+0Hf6eXe+vf250xdmRp92uS7laM/Ds4FHn67lgjN/3CoOewv0VlHwG2jrvBlVXAuUKuqXM6u4FCaqNOaTP1Tq6R/vYVnOU4stjxYbdkLEOND/okKDYHMp2mBqoiF3vG2wPA/rNlYnXal8f9y4+9Z0m/qD6PzjDxTHezmgDYBVWqxGqxZGZR2SmS3NlThTzVjH5ckA+okkF4W3jy4RbtEfqYjLiljMrR8c6/dSty3QNk9wZ1OvDaFVrKEcagr+GFays4rPZEZzHtJitMugM4YEBNUEwKCNu+OsByEWg8VpMRh2HeSzWPrFlRwWmv5AXYJKY4fUsbIO6qmjrmjaCbZOO9I10F5pH0DfAhCO/qPGMBlpH2CEwhJOWnPOTbDlMRbqBQ2hno3nzmFkHSPpLMSK2QiE5h+hVxJ7oQgFDJxKN1XuqmCklX3wv6rtVTCMWsEXHBAi9OPog+wk/xa7hqv15twr7qV5Li1cOzcPJP8vav17YL0OZ7SlOS1Q1RZmsQy4n/Yg6M2W2yjN2k4wd9Zb7axoSAOAVb1WpB61dmJXjaSr1AHHhqvasKs0H7YWV/cVFs83dWo91NooVLXFYxkPK1EJxh4CFgdtoVEa7oBVpnsQ9J8CmA7Pm50eMTNAJXSY9eCyyawPzr6O7sFh3GxjyTdaXC5lBlA6+8l0HX18tQ538VgfdSHglgq2CE89ZWw/JbErkglWBQBbx2sCdElLOhJRfcvhFYn41JM6Wq4lZrbjsoOh05rIkZZIugXORUj5OM2Cbmfnf98VjaQj3470GLYTh8OHO5Z7fKHWXG61L4L34cix17gB8dvAOytBw8Ich1QVrTiQJn0ZbUkV+0JgrwaulMI8g9n9WkTeb3UGmzDTR1PcpWyOGhGwMJFcFhelvgLBGGsKo8YSAX6r9auXsJEkHK5dgs14wrDugKLZQvAbqF7GYxJ8pyk4I75l4eyZ0TntqTaZ3Bn3O5tO9ZrT82L6NmkBucbrUZuSTlfr6K97FxdONRucM1qTfi85vXdoU19APWuLSTrt6Ki0gDfMmym7zl+5YM2mU9sW6Rw59A8r+uc0u3o6OrvwV8/JrJP5WEy/SppHPutzqa0p/MW5s+PDc1pbFfy9Ql6Ud59z3ml/PcZJg+TYvP1nrLutNVrww48xP85Krk/8nrieawaNfB6Hjqg09d9IWaqXg/LASkg6mfKAaniIlYdrnfI+QXKyTByhF44ZmFcHyEL9UFihgH0U03wqLeKCDFatCgbuME/74TsptYwrX7l55JwL7trxUnzdvEUvny27Oq9YOHdWfk0i/NTQ8BzfGRtXX26bM2/47FmLZ225Ird44FzBdfPLN9308s3pUy9etPAfb1bVWTctPGFW/qyhVcmmtScM+0697PTLbMML1zcv2rjmqWdXncvw7D/2gXi1+A+cH2wPzuMFUGCsCW1+n5KwEz6Mt2TEVpGFFAEZ41Oxu3wvTR2Ace+fu3PuGWfNIU1z5+60SRce1K/777Pc6VBh7sG5Oz0XHiS34m5LKF5g1+l/mEs2ngnbc+Eb34avGPAr/3OWu3tmYS4Rz5i7U6ZfOtudzofiF3WegZfqf5jDZHul1i8QO6aEMP+dRlgD1LJ2U9vByLq8wOjAvptVX9COGVTcZGi7lyY3KJ5Gg489eqEgs1SOumVciMpRd60avzJ4/kNPfrk4i4VUimisfn9o7dDQ2qLwLSWbDofTWeXoIpDaf+EPHP0Vnhia0D/dP54NE8hgYzEU1QTjRqlkb6EvqxKfV0LlgYCcJpmf/gK0W2vc6XR0OEgT/WjV/3jwZ2Tbzw4StRV2nU79LSd+xPX/1A/+4qecQFKcG+zv34AOMcCdwN3DaZ0ZrY3WNQ5my50iSuHODpDC/XQBdFXLrn485pJrLhvbIVzvQM8gtGUlSOGy6MLCRjQ63aFBuuVCxwM6voJYZx9gTY1mYFYRj6GPTthI9Wv98jc4WyAxc/gEFjXTPP3o/waFUwZGz/eC9onZgaIaB4Egq1h1b8QcQSxy93jDAvCW7CAe2uCVpD5vWLekKT13RSa6fsfKYnLB6sFO4WFT35I5scFVhbby7uKXTmkL7HXJHd5mSRxa/Kcn168mpeXnOslKyRHI9K8vnH77PGnFStHTNfvCuScutetVh+TpGjxv+PNPWpevkNe1beLDoS6/YpTAnnebBkY73bfOWRRg8d/zhS+Kz3Ancjs5lJWZKqomcRo5jNJO1NZq2UMf/OFxIB0X05DQMO01354t+2mXQz92LJao30viWPW4k3krMCvEjw1u+aFFJyKtnPLz1tZEpm8m7jjcWg9QNdMHi1p2GBYpTi71sIat+RzSCuhI5Ui8lz45QzIq3rARUy59sC0Nk1wfzmEVe58laTZMatiA+SbFx/1ei1nIdG98/KYfPjh/VWviZG+7wWg3eU0q/8HLJkVpnxU/R4l8IbZsMNu+MtWh/iKbWqv6C0bFIttk8wxbK7++2FMIDqw9s219+erepc0hpavf2qRE3AlHm1jM7ggN9FkdJBa+L6AKc0UxaLPeIzqMdqtsKdy9iMobsLLFZ2v6TEu956eD8qG1igQqWcHa10xjjUTjspnHd57GTirk3tonjf7RUgoaBjm6TbgFo3p8TUYY6XMTsOPF47UeMMYcCGq2aaIJld5qiROBve00P55658ohGhUNqdjyDPsq4YjytEEGy6fDhwtgSp1dhS9aao95sdBKwlITtiB3gdoayGb3uV2KiXoPPCibsLtGPQ1PM8mwInAlr4nWQGp2WZNxcJlZHqV9pjHAwxofCTJrglQANZJ/pYKxo5Eirbo5t3guOryLBFv0ICFoo1c8y1oaHcaGRJXKBJo4aH1hjNvD8gRLkgU7DVG/JOBqovEykJwu6uhtpiLVN5UAEiDjVABZ4GUZCeBw0bhXKMKI4gHi7AtarCam5WWw0VYjASRGgFgLVhmIBqwyKDW74JwfPTywhI5To4a9MJkqDdRAGhTHSHLuODUYBfgD41Q5ug1LcSgPLqvxiBu4ZFO9Z2mm5u4BQlCmKNsdtG0hFZZqRpMxW3CfxyWb6ONcJPp4JA/NH8QOTFaKPX3WDXa92c/xgpF2h3BglatBpHO45tqgiAkY4JDR2qpxN/IyjBkb0zqDg5YOiAhvg6GDD4eocB+Hg0ShdyMmZTftqe3Gth5YJEYfxaNZ0Ye1z0NHx07xlCgOFoaDTFmY4uCZiINvMg4JCj1j0FQjDrTtcPHcRhyKFHj8o1yJSyTly5ptYwHORCxWczUErPXaEFdtqlLYnYfKktWDSxIwKbaZpJ1sfRYzvoMkZnBbTShaBSOrXqkTnPYBq79ySl2c0Dow2s4WkxYbiE5bdY+9/nfwWgFeJ4XXgY9CKlvommFxI7wW3yfAm1OEBpjH4K0wIGsNeI8P7liPR1Zv3jFes9s8tSRaHSuE5qYWYk+uG8NCxkfef+9RLF6ssFJGVrHI6hfZiXdOqJc5DrTXY2l1WGLo0ZwETXwqNCgyVBALtMSSKzV7cDM2Xan4ZAg93eT9RxAWrLB89L0JQFbIcn0fQvroe6z+shFS3XbkyHjs738Nb2wc3ujfAq/ahGW8YxBNgLd45AiD9v1HJkNbBESW//9O26iAsNbHeSKs5PARxgSICPDI7AbSbgZYKU8avLSuMMgNcmPLMXX9YMWAm3U3tqEzGZNZQJRK1ISqZ21osqwJLLceEyE8+THg8nWo2ePdKnW4yAjCg3BV9Ef0R/BRYBMKcKnO/hpHhEPiV4CCGI+O0FbvXlYh4g3SmhdUSIAUYLu18GgipZJStM9d6MuAEgZqFicZX7P4SHq3wWA2m+12Pug0m/wwP7/M8yaT2WUWX9T/c5nMSx59iVexmoiL3wJU50XynE22mJyGV/V/Xu+pz1tKIz9AM5srCzUambDuGkuKgjR3A0Sgd2waW9nkLQWFWvah5pK1ZtZVFIavkI9isSP1UGFmJ20QQemHY5nJs3pjcthROeOMx97BVYgKGCCc81uMVt8SJZ5/h8YCGBUb8v5DXCt3cg1OJ11AgwBYosEOszLPTRLVOzC/nvcHwi2RVtR2QReIYzQAK1ZM5nAsTo8GZepdGyukTkk1Lxsr6i2kMCcxQSsDajNnxbX1qumHtiwpPvYO+TPZeD85fL/+JBv+cxZf98U6M1674p3HzGTt/brtfv3hKfUrp9ZrbproQzg8jVUsrPIG20aA1RkY80jVH3T2gmi2OJxuD6tWVJvgCDFKNrtL5o5bh8PXmkccrxJHvWLPFVfsOX4hjhtPX9Egs9D36QI9L13r2S/XujTQhzgqtFDPBLoBjSe60WHsq/kQ6/PezNPW/bCiO6yi3+o66icvkpcwWxE7YWLjWKdFf0+IYKdhZJPRLVlumvt3Trr/33ZzliZonnD3LixE1+eRM8fvzh+gUanDH7014d43wL2xp2Ydd7YaG1jTSdDebFm8vUxvL+PtlSm4g+k54eY9/Mlf1hfu4m9tuPl39Z/yJ+/WFz4wOis79nwuxBt9tP4xzJUqxsUMrM+4j2Luo7f24a2DkzFXCykhKmP1aCMAGw9u3MwfOHL/wfvJTxqo/6/nvLrx6G/4v/8POKHbsw3PCRuHI30cODzZvwEUjyqpBVUWxkHZdvCcVwW83/+c20CL4sGNB8k7AN8XYVBwOPBZgcdov0EDZ8I6DpHaeGZa2WSsYkc5VjSPNT1moooP6gn9hyv5PaNnk4cF10c/IC79arKnKjw5OrOuxxQpXlhpuZzDVcIIg2ikg4jP03Bky0aZPixChD1Ttv5sP5A9Rip+nNQNREvlnEbZXTb7VOb9YeIEnzGg0opw1GVjSSR/SDkC3F4Je3eNzt+FuWDF4i7hbW+YCsCjz2IBvr45JFxQobw3TPvreWi+3RwO9UCA0EkhdILxUDY6J4AXri/IRtqBmCsZQfyVrSpr4NIAlAKSj4KUKGD5kzAOmP7u1u36bQjZguu2ko3X6YnfNEL4uv7e1hsAwBKcPPs6vVV4slKfJ0aDg8KqcnH6HMTWBmASDZ0TGFWkFBmjiaeh7LEGxgVP6of0F2oEKj755A31/+Og6B/SiyixPnqVnrzx6/g+oe+om9LuYg59AUA7B6WdA00XowtV6yCWG5dEU3aMfE6gMDcetKGLo9OFvIyuWVuWOvuC2ILEg6XjDlgYkcDskGUinfFhm5TMTPkWaNY6o/Nm3UbRY5HnSgONwV4ArJ6igoi2Ba5UuGlwOm0anKbDZgL8jcBrIVmzAwpY9FG22gKYbAAL5GQUagPFwvtmMo5CBah/KcWBBvj1g404XFqhY1PDAp+UWsehQnPfzJRTJtcGME0QzBLWn+2jVaJW609HRo7Q3OBkkXalGHXTH8Q40vnwe8/WbCfW8fomjEqUfMEcti8pqc30QZAlqzOHj4Is2Vw16kj19rhW6j5Db4OPrsCUSFYLWk8GZqRiUsE+UXC6avEet1eRWUdGVtIJ6kaJeIF+JuadxHRa+KPuBfqiOhHuDmBWP9Mjae/nkVozaLoJhtgr/Ldp9A7zbg+9QmN5Yz3qme83g3ktXir7ZtQeUYnOE9WKy9I+s0s1YV9njMuYqWZusVLnYA8Tj3LtqcrsTRrrV5HwYjXOeG949pTXYjZb+08bgtBGgFYL3W4N6u8GEvwB2vYaa1zq75t/pJ9Ae1z8YzGUj/qNBv1K2m9vdYtH/qxrQUu9FoblQOYwI4ZGHm05LVct81YH2rVtmbK/OYHV5Cl8BgJm7LJnaLblsMA9QhsWR/MIOX1uj4L9ZYU8TegD9qFBUlx2cDssoPbuJEDhpQFyOLCUjNBE3WwgoG9eGtBtgaX65vqRmbYkuVPfkrTNnEkMZsUhbPUFCD8TDutbyJ1jh49+Dg/X4pjMRvJzzVwE7OE0l+XK/pqW4EN9uuympTxuL7p7MhnW2MjtoiwVaKYanDzFGirkEtiLecxWj6pKAtBJRUk+obAsctBMD6JxNFK5EPSYdUX9jmK9eAErLFMX0mOoTLGrmeEyOr9yjn6oOGbWj1TOOadSHF346K2Pwri4OJf4VfFhLspx7rCghoXcbNKHFZ1AwGQqmSoME8wSdhIXaRm+9/wLfv7AdS0tj7qMnu94el1X371t+3lbZKPj845u9yPC7zvvuPvg+RfcOxQlj8gZx+ccorzlgm3b79oi93hf8hjlRxpy93F9y9T6J+EzWjM0R++ETGkufXJqE9qRGZhgbfK+ZHt2DiUapiEUSL53WMgi8yq1+ieageD1zSbDZIj0RVTFi92fQdtPi/GYQ3QSxUEu4X3J1ZtXJ32EkEscSthLm0J6f+gN7STDO+mGMVjc9vr20x//bHF2l9mcPejNOUgmK9ojAcXb1GyxZPWfO3JebHfHP6UExKgYU+71++9VYrAZUCqmwAk97Uq0rS1qtYzNX8z5DYzF2snEzrxRJRFNYc9WhXWnpy9ZpU/lOCZ843r6mA3WTb6y6wh9+jT+0zcXa76F+j3MtGNNay2a7s1RaWdpzO5iCwF7MshYY796C5vc2FYR0wpoBRD9KNZ2mNldT9fgDzCuouYlPieq1jMPeyVgVdiJNb+Ba8zm6WrwG8jMb4DP5pNdtLd/JN7WwboN0P1gJNnWzoo4J7XJw5CaB52EOdat35BDxyGoE9hfXtvGH8B6ytH52zTaGYkyPPaaArrVnmBGDuMVug3esRpjLxNi1MtdZI67/5dwCnw6nOiSwdiAfDxOtQcIHBejCnXs0acSjGEkTsCnCbS1+VOwaZ2KTaKGzT6v0hwaw2WfN9gc+5jRAQaG0SG1z+OOCnWiVJjpNREDCjmFn4qKCbD7YC5NhT04FfamcdhV/zjsiq/Wx2Ja2A2yp5tMC3FNyk4EVX9kFx7etWsqz6iUa04dh9RL4z/xLLZgTNBH+NRgb2uA3TuW3Y+1V9EqtiVvJfXnMdQwY8/3mRZ++mRpjDd3EhGXdVDipsEGabyjva8/uYN4+tp37EhOMy0w3nHyjrVrd5yMLbEmz4c4rWedPAodU0ehs2GOR1tTE+ZDLNn2t87xOI3hxD9uht9TxChB5WNnOPq5OeMEXFhVU4pbNgWbtqnYtNewecGrBJvDLbHEGD4veP3BpnCkNfnxGMWxllX9BHyK5+HEPg4yIzTXewwZ1Icn4BOiuWqd3O5xfMKZUqwdtKoWyn7UXEBuTFImTGWnk2ZhLBbI1hiQlQHuC6jNJlr3FcTniCE/xsb6uWPCVXtVa3fRBKwMRvnHBSJXamqhXk/NizUZ05NHhbGuxeOARFEascCQ0LQkOrd47j/ROVmZIv8qdKxxgaRCkoaKJveVCWEdBfPLhagHNEBDkzU6hCc9shExHvPOUVPKC/xrcXgE+iA/TZafNztFt9pEmSEYwooKu4vz1h6XpvRrPvc+o00mx2+fky9Eqe0QPZ7jLjSu5B3/yY10QWC+G1HcW8M1AjrBnjq20QxoBpik2JRpEECJSQhH4Hy2HKHlOJEwWJjs0fZaIIuVJ2oWn1kqjzthI16aPkcdldiEy4cPjd1ndrpFSpBYtEaQcO0Zyaq/Ba1OpYEojRlzY0QBnqAKET6TB1fH45AmgPMbdaLi8UnzZTRY2D+sxf3g2EPiS+IJXBDmyuU0m41qSZoDM1JMrIo71mBm4QRgFbESc/5gIaOIz1Hx+fEx0aWWZlBVPVHYsuLTClwRjIPgQ0z3cdYQxdshl10+5pIRqGAGycZqjGISzbxQvKqDEBapdly+8g0ycuPWJ5/cmu7qev7SL73Gzz2FzKIWN3l/1RXIB09fu/UZx8arf/lgwObYpN9fe9bjOG7o7w+z6EMY88tYY+IwwCwHDcxhRQExE0zBmggGS5IAKEzkq+S+M6+ZCAZzXlA4vqpfEnyoeM1UQHDNILW83EvAvuCAwSVQdKMkR7ApKMmhYUbOBLNM/+BJ/A9fws/K7u7u3dR7sFzfV69nvQZ+pyDuhjWH83h9KgCJSSky/KBca+JEcUjVMPApmPN2TX9GvHDJzC68S7pvyYXm7MB1G4L3nXnVo7zDvORC/kB+veLyLbkwrP+ku5tkwxcu8bdEzh869WbjhssfvUp0CfyF3P8DkKeJqAB42mNgZGBgYGRw1FsVMSWe3+YrgzzLBqAIw7lYoVoY/d/q/xzWu6wSQC4HAxNIFABKQAvLeNpjYGRgYJX43wImrf5dZr3LABRBAfMBiTsGS3jaY9zBoMGygYEBCafA2Ew9DAysEgiacRMQuzEwMNyE4sVAPguQ9oDQIDmo/hMsG/5/gpjz/zPjF7jZfEAsDlHzfwcEo9gNw7JAnAVVK47QwyAFpRmhNAvQjDlQPYwQPpjNgqYPxV9YMEgvE8LtcHFTJP9sBdKK2PX/nw01AyY2BcovxaIeZn4HlH0C1U5GHaidO4FsASDNjAPD/MmC5G8QPgPEGUh8JWg4wPj5QPcehuL5WMIFFDePgLQbkLYC0kKIMGLUQ/OzFxCLIunlgIonQv3PChVnRcIMLEcg9jCAwf8bDP4MlgwngOlHHSjGhAIR4AaYZEESEWdABSlgEwUgrP9zUCFI5/9P/z8B5SoBYR2ue3jaY2Bg0ILCNIYl+CCjAaMHYw3jIsZjjOcY/zGZMc1gOsP0jlmH2Yf5C0sRawobH5sSmwvbI3Yf9g3sLzimcBpwJnBO4eLicuHq4HrHHcY9ifsFjwPPJl453greNXw2fEl8PXz3+G8J+Al0CVwT5BNUE5wiJCKUIHRDWES4R4RLJEFkh6iK6ASxBLEb4l7iLeLPJMwkGiT2SGpJTpP8JeUhVSW1ReqK1CNpIWk9aR/pFukt0vekP8nwyETILJJ5I2sgu0+OR65D7pW8i/w8+X3yDxRYFDQUXBRyFPoUPihmKB5SclA6plyjvEZFSGWCyhNVIdU21VmqG1TfqEWotantUXumzqOeoX5Kw0AjRmODpp7mGa00rSfacdortN/pWOj06G7TvacXp9el90nfyEDAYJ2hkmGF4RkjJqM1xlHGXSYiJnNM/pkmmO4wEzALM1tnzmIeZb7M/I2Fg8USSw5LD8s2yyNWHFY+ViVWR6ylrJOsz9jo2YTZnLI1sp1m+8/OzG6V3R17OfsO+w8Ofg6LHAUcyxzvORU4PXMuc37iouXi59IDAEV6iBwAAAEAAADbAJsAEQAAAAAAAgABAAIAFgAAAQABAQAAAAB42q2SzU7CQBSFTwsaiUaNJKy7cOHGhn9BVsaF+E8kii4FoVQKbSxSSXwKn8GNGxcufQJ9D5/ChfHMMCJBFsbYZu58c+feM3duC2ABz9AgniiWaEPQwhHOl1wNWMMKbhXrmMe94hD28KQ4jBw+FE/hRssqnkZWe1Q8g5j2pjhCflc8i2V9UfEcOa04Sj5V/IKY/lXDK+L6XRAEpuX0vaZdczu+WXPb2IQLD31cwYaFJrow8MCRRBwJpEhV7hrYwTk6nHcZ3yOL+BZMejbg8DVGFHy5qnOuc+7RXjByizc/QwlFbPPUQxygzLgitRw0OGzqW8w5YryFa3rEKQlmxmUtBRzz9ArzChO1fiqtjmn9tgJjLO9E3sPnvit7MFpTSWoMVt/eJiO7qMn43jDDxBptAW2qtqgpYhr0ipOr7LiJjBw59j2J/B9vOflLTfYG8jWZ7fAre6zbVlX79Apq/1tMhVVWWbnwdoc92Vc9LXPXk96stBmsc6RpU+za8H/8BJBMiJoAeNpt1VXXlGUARuHZgGCB3d2tc7/z1tgo89nd3QKKgCgqdnd3d3dhd3fHgT/Cn6CfzObMObnXzHrnep6DPWs6YzoLXv/M7xSd/3v91ekwhrGdsZ2JnUmMYxHGM4FFWYzFWYIlmcgklmJplmHZzt8sx/KswIqsxMqswqqsxuqswZqsxdqsw7qsx/pswIZsxMZswqZsxuZswZZsRZdQ0KOkoqahpc/WbMO2bMf27MCOTGYndmYKA0bYhV3Zjd3Zgz3Zi73Zh33Zj/05gAM5iIM5hEM5jMM5giM5iqM5hmM5juM5gRM5iZOZyjSmcwqnMoPTmMksZnM6cziDM5nLWZzNOczjXM7jfC7gQi7iYi7hUi7jcq7gSq7iaq7hWq7jem7gRm7iZm7hVm7jdu7gTu7ibu7hXu7jfh7gQR7iYR7hUR7jcZ7gSZ7iaZ7hWZ7jeV7gRV7iZV7hVV7jdebzBm/yFm/zDu/yHu/zAR/yER/zCZ/yGZ/zBV/yFV/zDd/yHd/zAz/yEz/zC7/yG7/zB3+Onzpj3uxpmTB35vRutztluJO7/20x+oEbt3B7bulWbu02buv23cnDLUaGW42MG8ydM2vBm9pDGh9uugseGniJgZcYeImBlxh4+MDDBx4+8PCBhw+60YlOdKKT0tWLXvSiF71Cr9Ar9Aq9Qq/QK/QKvUKv0Ovp9fR6ej29nl5Pr6fX0+vp9fRKvVKv1Cv1Sr1Sr9Qr9Uq9Uq/Sq/QqvUqv0qv0Kr1Kr9Kr9Gq9WqfWqXVqnVqn1ql1ap1Gp/FejV6j1+g1eo1eo9foNXqtXqvX6rV6rV6r1+q1eq1eq9fX6+v19fp6fb2+Xl+vP/Ri97H72H2GP77RrdzaXfi91h3eI/Yf+4/9x/5j/7H/2H/sP/Yf+4/9x/5j/7H/2H/sP/Yf+4/9x/5j/7H/2H/sP/Yf+4/9x/5j/7H/2H/sP/Yf+4/9x/5j/7H72H3sPnYfu4/dx+5j97H72H3sPnYfu0+tZ/+x/9h/7D/2H/uP/cf+Y/+x/9h/7D/2H/uP/cf+Y/+x/9h/7D/2H/uP/cf+Y/+x/9h/7D/2H/uP/cf+Y/+x/yzsvq/THzqj/x7/AibTMyUAALgB/4WwAY0AS7AIUFixAQGOWbFGBitYIbAQWUuwFFJYIbCAWR2wBitcWFmwFCsAAAABUjdh/QAA) format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.glyphicon:empty{width:1em;} .glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}sabnzbd-develop/interfaces/Glitter/templates/static/stylesheets/0000700000175000017500000000000013642116632023331 5ustar jpjpsabnzbd-develop/interfaces/Glitter/templates/static/stylesheets/glitter.mobile.css0000600000175000017500000001046513642116632026773 0ustar jpjp/** MAIN & NAVBAR **/ .container { padding-left: 8px; padding-right: 8px; } .main-navbar { margin-top: 0; padding: 0; } .navbar-collapse { padding-left: 0; } .main-content { border: 0; margin-bottom: 0 !important; } .main-menu-link .icon-bar:first-child { margin-top: 1px; } .navbar-logo { margin-right: 8px; margin-left: 8px; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #e5e5e5; } h2 { font-size: 25px; margin-bottom: 5px; } .max-speed-input { margin-top: 1px !important; margin-left: -5px !important; width: 300px !important; } .max-speed-input .ui-slider { margin-bottom: 10px; } .main-restarting.in strong { font-size: 2em; font-weight: bold; } .main-restarting small { font-size: 0.7em; } .main-restarting.in span { top: 2px; } #feedback-slider { display: none; } /** QUEUE & HISTORY **/ .info-container { margin-top: 0px; margin-bottom: 10px; float: none; clear: both; line-height: 2.3em; } .info-container-box { float: left; } .history-info { margin-top: 5px; } .info-container-break:after { content: "\A"; white-space: pre; } .info-container .info-container-box-sorting { position: absolute; right: 10px; top: 0px; font-size: 1em; } .queue-table .table-header-progress { width: 0%; } .queue-table tr td { vertical-align: top !important; height: 5em; } .queue-table .no-downloads tr td { height: 2em; } .queue-table .progress-indicator { display: block; position: absolute; width: 100%; left: 0; margin-top: 2.8em; height: 2em; border: 0 !important; padding: 0 !important; background: transparent !important; } .queue-table .progress { margin: 0px 8px; } .queue-table td.name .row-wrap-text, .queue-table td.name:hover .row-wrap-text { max-width: calc(100% - 45px); } .queue-table .buttonMoveToBottom, .queue-table .buttonMoveToTop { display: none; } 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; } .queue-table td.name .name-options small { display: none; } .queue-table td.name .glyphicon-folder-open { width: 1.5em; margin-left: 1px; } .multioperations-selector .add-nzb-inputbox { width: 50%; } .multioperations-selector .add-nzb-inputbox-small { width: 72px; } .multioperations-selector .add-nzb-inputbox-clear { clear: both; } .multioperations-selector .add-nzb-inputbox-options { width: 55px; margin-right: -3px; } .table-messages strong { margin-right: 5px; min-width: 0px; } .history-table .history-ratings { display: none; } .name-has-ratings .row-wrap-text { max-width: calc(100% - 1px) !important; } .history-table .delete .dropdown-menu { width: 100%; left: 0; right: inherit; margin-bottom: 10px; } .history-table .table-status-header { width: 0; } .history-status-table .col-sm-2 { text-align: left; } .search-box input { width: 250px !important; } .search-box { margin-bottom: 5px; } .info-container .info-container-box-sorting .dropdown-menu { margin-top: 0px; } .history-item .dropdown-menu:before { right: 37px; } .history-item .dropdown-menu:after { right: 38px; } /** MODALS **/ /* Only remove on mobiles, not on iPad */ @media only screen and (max-device-width:760px) { .modal-dialog { margin: 0; padding: 0; } .modal-dialog .modal-content { border-left: 0; border-right: 0; border-top: 0; } .history-queue-swicher { margin-top: 20px; } } .modal.fade .modal-dialog, .modal.in .modal-dialog { transform: translate(0, 0); } .modal-header .close { opacity: 1 !important; } #modal-options .modal-header a { opacity: 1; font-size: 1.2em; margin-top: 2px; } #modal-options .col-sm-6:first-of-type { text-align: left; } #modal-options .options-function-box { margin-top: 0; } #modal-options .options-function-box .col-sm-6 { padding-left: 15px !important; padding-right: 15px !important; } #modal-options .form-checkbox input[type="checkbox"] { margin-top: 0; } #modal-item-files .form-group { clear: left; margin-bottom: 5px; }sabnzbd-develop/interfaces/Glitter/templates/static/stylesheets/glitter.css0000600000175000017500000011434113642116632025523 0ustar jpjpbody { background-color: #E4E4E4; } h2 { margin-top: 0; } /*** Navbar **/ .container { margin-top: 1em; } .main-navbar { padding: 0 0 0 0; margin-bottom: 0px; z-index: 999; } .sparkline-container svg { margin: 10px 15px 8px; float: left; } .main-navbar .sparkline { display: none; } .navbar-collapse { padding-right: 4px; } .navbar-collapse.in { overflow: visible; } .navbar-collapse ul { margin: 0; float: right; } .navbar-collapse.in>ul>li>a, .navbar-collapse.collapsing>ul>li>a { margin-top: 7px; } .navbar-collapse.in .dropdown-menu { position: absolute; box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1); background-color: #ffffff; border: 1px solid #cccccc; margin-left: -220px; margin-top: 5px; } .navbar-collapse.in .dropdown-menu a, .navbar-collapse.in .dropdown-menu a:hover { color: black !important; } .navbar-collapse.in .dropdown-menu a.active-on-queue-finish { color: white !important; } .navbar-nav>li>a { color: white !important; opacity: 0.7; } .navbar-nav>li>a:hover, .main-menu-link:hover a { opacity: 1; } .main-menu-link .icon-bar { display: block; width: 16px; height: 3px; border-radius: 1px !important; background-color: white; margin-top: 3px; } .main-menu-link .icon-bar:first-child { margin-top: 2px; } .main-menu-link .icon-bar:last-child { margin-bottom: 3px; } .active-on-queue-finish-menu .icon-bar { background-color: red; } .navbar-timeleft { font-weight: bold; min-width: 100px; border-left: 0; } .navbar-logo { vertical-align: middle; display: inline-block; margin: 4px 12px -1px 15px; } .navbar-logo svg { height: 40px; width: 40px; } li.dropdown { margin-right: 5px; } .navbar-speed { min-width: 120px; font-weight: bold; } .navbar-speed .glyphicon { opacity: 0.4; float: right; line-height: 18px; } .caret { border-top-color: black !important; } .max-speed-input-clear { position: absolute; top: 16px; text-align: center; right: 30px; z-index: 999; display: inline-block; width: 20px; height: 20px; background-color: transparent !important; font-size: 1.1em; } .max-speed-input { padding: 10px 10px 5px 10px; margin-right: -20px; font-weight: bold; width: 190px; text-align: center; } .max-speed-input a { margin-bottom: 5px; display: block; text-decoration: underline; font-weight: normal; } .max-speed-slider { width: 95%; margin: 4px 5px 5px; } .ui-slider { position: relative; text-align: left; height: 10px; background-color: #E5E5E5; margin-top: 5px; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 0.5em; height: 24px; top: -7px; cursor: default; background-color: #767676; border: 1px solid white; margin-left: -.25em; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { background-color: #9DDB72; left: 0; } .ui-slider-handle, .ui-slider-range { transition: all 0.2s ease; } .queue-error-info { color: red !important; } .menu-options { min-width: 200px; padding-bottom: 0; } .menu-options .form-control { border-width: 1px 0px 0px; padding-left: 15px; } .menu-options a[href="#modal-help"] span { top: 2px; } .rss-icon-svg { display: inline-block; margin-top: 1px; margin-bottom: -3px; width: 1.2em; height: 1.2em; } .rss-button { fill: transparent; } .rss-symbol { stroke: none; fill: white; } /*** Main content ***/ .main-content { padding-top: 8px; background-color: #FFF; border: 1px solid rgba(0, 0, 0, 0.2); margin-top: 0; margin-bottom: 30px; } .main-notification-box { position: fixed; top: 40%; left: 50%; background-color: white; border: 1px solid rgba(0,0,0,.2); padding: 10px 25px; z-index: 2005; width: 250px; text-align: center; box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1); margin-left: -125px; } .main-notification-box>div { display: inline; margin-right: -3px; } .main-notification-box .glyphicon { margin-right: 10px; } .main-filedrop { display: none; } .main-filedrop.in, .main-restarting.in { text-align: center; opacity: 0.9; color: black; z-index: 2000; padding: 15% 1em 1em; } .main-filedrop.in span { font-size: 20em; } .main-restarting.in { display: block; height: 100%; padding: 0; } .main-restarting.in div { position: relative; top: 30%; transform: translateY(-50%); -webkit-transform: translateY(-50%); } .main-restarting.in strong { font-size: 5em; display: block; } .main-restarting.in span { top: 10px; } .main-restarting small { font-size: 2rem !important; } #feedback-slider { position: fixed; z-index: 2000; width: 400px; top: 40px; left: -370px; background: white; border: 1px solid rgba(0,0,0,.2); transition-duration: 0.3s; height: 115px; overflow: hidden; opacity: 0.6; } #feedback-slider>h4 { transform: rotate(-90deg); position: absolute; right: -30px; top: 35px; letter-spacing: 1px; } #feedback-slider>h4>a { display: none; } #feedback-slider:hover>h4 { right: -25px; } #feedback-slider:hover>h4>a { display: block; position: absolute; margin: -20px -25px; } #feedback-slider:hover { left: 0px; height: 200px; opacity: 1; } #feedback-slider-inner h4 { font-weight: bold; margin-top: 13px; margin-bottom: 5px; } #feedback-slider-inner { margin-right: 40px; padding: 20px; border-right: 1px solid #ccc; } #feedback-slider-inner a { text-decoration: underline; line-height: 1.6em } #feedback-slider-inner span { top: 2px; margin-right: 2px; } table { table-layout: fixed; background-color: #FDFDFD; border: 0; border-collapse: collapse; margin-bottom: 10px; } .table { margin-bottom: 10px; } thead { height: 0px; } tr th { border-bottom: none !important; padding: 0px !important; height: 0px; } tr td { border-top: 1px solid #F0F0F0 !important; vertical-align: middle !important; padding-top: 6px; padding-bottom: 6px; } .queue .table-active-sorting { border-collapse: separate; border-bottom: 1px solid #F0F0F0 !important; } tbody>tr:last-child td { border-bottom: 1px solid #F0F0F0 !important; } tbody>tr>td:first-child { border-left: 1px solid #F0F0F0 !important; } tbody>tr>td:last-child { border-right: 1px solid #F0F0F0 !important; } .row-wrap-text { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /** Tabbed navigation **/ .container-tabbed #history-tab, .container-tabbed #queue-tab, .container-tabbed #queue-tab, .container-tabbed #queue-messages, .container-tabbed .history h2, .container-tabbed .queue h2, .history-queue-swicher { display: none; } .container-tabbed #history-tab.active, .container-tabbed #queue-tab.active, .container-tabbed #queue-messages.active, .container-tabbed .history-queue-swicher { display: block; } .container-tabbed .queue-messages { max-height: none; } .container-tabbed .info-container { margin-bottom: 5px; } .container-compact.container-tabbed .queue .info-container { margin-top: 1em; } .container-compact.container-tabbed .nav-tabs>li>a { padding: 5px 8px; } .container-compact.container-tabbed .history-queue-swicher { margin-top: 4px; } .history-queue-swicher { float: left; z-index: 800; position: relative; } .history-queue-swicher .nav { border-bottom: none; } .history-queue-swicher .nav-tabs>li>a, .history-queue-swicher .nav-tabs>li.active>a { border-bottom: 1px solid #eee } .history-queue-swicher .badge-warning { background-color: #d9534f !important; } .history-queue-swicher .badge { margin-left: 4px; } /*** QUEUE Specific ***/ .queue { position: relative; } .queue h2 { float: left; } .hover-button { opacity: 0.3; text-decoration: none; outline: none !important; } .hover-button:hover { opacity: 1; color: inherit; } .hover-button.glyphicon-play, .hover-button.glyphicon-forward, .hover-button.glyphicon-stop { opacity: 1; color: #474747; } .hover-button.disabled, .hover-button.disabled:hover, .name-options.disabled .hover-button, .name-options.disabled .hover-button:hover { cursor: not-allowed !important; opacity: 0.1 !important; pointer-events: none; } .name-options.disabled { cursor: not-allowed !important; } .info-container { float: right; color: #888; font-size: 12px; margin-top: 1em; text-transform: capitalize; } .info-container-box { display: inline-block; margin-left: 8px; margin-right: 5px; } .info-container .glyphicon { margin-right: 2px; } .info-container .info-container-box-sorting { float: right; } .info-container .info-container-box-sorting>a { padding: 10px 10px 10px 10px; margin: -10px -10px -10px 0px; display: inline-block; outline: none !important; } .info-container .info-container-box-sorting .dropdown-menu { left: auto; right: 11px; margin-top: 6px; } .info-container .info-container-box-sorting .dropdown-menu small { color: #AAA; } .queue-table td.name, .queue-table td.progress-indicator, .queue-table td.row-extra-text { cursor: move; } .queue-table .table-header-progress { width: 40%; } .queue-table .table-header-extra, .history-table .table-header-extra { width: 0; } .queue-table .row-extra-text, .history-table .row-extra-text { text-align: right; color: #888; padding-left: 0; } .history-table .row-extra-text { text-align: left; } td.name .row-wrap-text { max-width: calc(100% - 1px); display: block; float: left; margin-right: 6px; height: 1.5em; } .queue-table td.name .name-options, .queue-table td.name:hover .queue-item-password { display: none; } .queue-table td.name .name-options small, .queue-table td.name .direct-unpack, .queue-item-password { opacity: 0.5; } .queue-item-password { 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; } .queue-table td.name:hover .name-options { display: block; } .queue-table td.name:hover .glyphicon-folder-open { width: 1.5em; margin-left: 1px; } .queue-table td.name input { width: 100%; display: block; height: 22px; margin-left: -1px; margin-top: -1px; border: 1px solid #ccc; } td.name .name-icons { display: inline; margin-left: 5px; color: black !important; text-decoration: none !important; } td.name .name-icons .glyphicon { margin-left: 2px; top: 2px; font-weight: bold; } .glyphicon-chevron-down, .glyphicon-chevron-up { top: 2px; font-weight: bold; } tbody.no-downloads tr td { border: none; text-align: center; border-bottom: 1px solid #F0F0F0 !important; } tbody.no-downloads tr td a { line-height: 2em; font-size: 1.5em; display: block; } tbody.no-downloads tr td a span { top: 2px; } td.timeleft { text-align: right; } td.delete { overflow: visible !important; padding-left: 0 !important; text-align: right !important; } td.delete .dropdown { float: left; } td.delete .dropdown>a { display: inline-block; padding: 10px 10px; margin: -10px 0px; } td.delete input[type="checkbox"], .add-nzb-inputbox-options input[type="checkbox"]{ margin: 0 0 -2px; display: block; } td.delete label, .multioperations-selector .add-nzb-inputbox-small label { margin: -10px -5px; padding: 10px 12px 10px 10px; cursor: pointer; } tr.queue-item>td:first-child { padding: 0; } tr.queue-item>td:first-child>a { display: block; padding: 5px 10px; } .queue-item-settings { margin-top: 4px !important; padding: 5px 10px 10px; left: -180px; width: 220px; } .queue-item-settings select { margin-top: 5px; width: 168px; } .queue-item-settings .glyphicon { float: left; margin-left: 4px; margin-top: 10px; margin-right: 10px; } .progress-indicator { padding-top: 0px !important; padding-bottom: 0px !important; } .progress { position: relative; height: 24px; 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); } .progress>span, .progress-bar>span { position: absolute; top: 0; left: 0; z-index: 2; text-align: right; font-size: 12px; width: 100%; color: #404040; padding-right: 10px; } .item-files-table tr .fileControls{ float:right; display:none; } .item-files-table tr.files-sortable:hover .fileControls{ float:right; display:block; margin-left:5px; } .progress .progress-bar .fileDetails { display:inline; text-align: left; margin-left: 70px; line-height: 25px; position: absolute; top: 0; left: 0; z-index: 2; font-size: 12px; color: #404040; padding-right: 0px; } .progress .progress-bar .fileDetails>span { float: left; } .progress strong { font-size: 13px; } .progress strong, .progress i { color: black; margin-left: 10px; line-height: 24px; } .progress i { position: absolute; top: 0; left: 30px; } .progress-bar { z-index: 1; text-align: left; } .progress-bar-info { background-color: #9DDB72; } .multioperations-selector { padding-left: 10px; border: 1px solid #F0F0F0; margin: -7px 0px 10px; background-color: #f9f9f9; max-width: 720px; float: right; position: relative; z-index: 900; } .multioperations-selector .add-nzb-inputbox { width: 20%; } .multioperations-selector .add-nzb-inputbox-small { width: 80px; float: right; padding-left: 0; padding-top: 2px; } .multioperations-selector .add-nzb-inputbox-small .label { vertical-align: text-bottom; margin-left: 2px; } .multioperations-selector .add-nzb-inputbox-small span { margin-left: 0; } .multioperations-selector .add-nzb-inputbox-small input[type="radio"] { display: none; } .multioperations-selector .add-nzb-inputbox-small input[type="radio"]+span { opacity: 0.3; } .multioperations-selector .add-nzb-inputbox-small input[type="radio"]:checked+span { opacity: 1; } .multioperations-selector .add-nzb-inputbox-options { width: auto; padding-right: 6px; } .multioperations-selector .add-nzb-inputbox-small label[for="multiedit-pause"], .multioperations-selector .add-nzb-inputbox-small label[for="multiedit-play"] { padding-left: 6px; padding-right: 6px; } /* WARNINGS */ .queue-messages { clear: both; width: 100%; overflow: auto; max-height: 180px; margin-bottom: 0px; } .table-messages { border-collapse: separate !important; } .table-messages .table-messages-hide { padding: 0 !important; border: 0 !important; } .table-messages .table-messages-remove { border-bottom: 1px solid #F0F0F0 !important; text-align: center; vertical-align: top !important; padding-top: 4px !important; cursor: pointer; } .table-messages .table-messages-remove a { display: block; } .table-messages .table-messages-remove:hover a { opacity: 1; } .table-messages .table-messages-none td { padding: 10px 15px !important; } .table-messages .label { margin-right: 8px; min-width: 100px; } .table-messages td { padding: 2px !important; } .table-messages .label { display: inline-block; padding: 5px; } .table-messages .label-info { background-color: #58A9FA; } .table-messages .queue-message-text { word-wrap: break-word; } .table-messages .queue-update-sab { font-weight: bold; } .table-messages .glyphicon { top: 2px; } .table-messages .queue-update-sab:hover { text-decoration: underline; } .table-messages strong { display: inline-block; min-width: 150px; } /*** History Specific ***/ .history { margin-top: 2px; position: relative; } .history h2 { clear: left; } .history-table { border-bottom: 1px solid #F0F0F0 !important; } .history-failed-download td.status { color: red !important; } .retry-button, .retry-button-inactive { color: red !important; } .retry-buttontext { text-decoration: underline; color: red !important; font-weight: bold; } .history-table td.name.name-has-ratings .row-wrap-text { max-width: calc(100% - 80px) ; } .history-failed-download:hover .retry-button .glyphicon:before, .retry-button:hover .glyphicon:before { content: " \e030 "; color: red !important; } .history-table tr td { vertical-align: top !important; cursor: default; } .history-table tr td.status, .history-table tr td.history-completedon, .history-table tr td.row-extra-text { color: #888; font-size: 12px; padding-right: 0 !important; vertical-align: middle !important; cursor: pointer; } .history-table .table-status-header { width: 35%; } .history-table .table-header-status-smaller { width: 30%; } .history-table .delete .dropdown { position: inherit; } .history-table .delete .dropdown-menu { top: -100000px; left: auto; right: 20px; text-align: left; margin-top: 4px; padding: 10px; width: 700px; } .history-table .delete .open .dropdown-menu { top: auto; } .history-status-table .col-sm-2 { font-weight: bold; text-align: right; padding-right: 0; } .history-status-table .col-sm-10 { word-wrap: break-word; } .history-status-table a { font-weight: bold; } .history-status-hidden { display: none; } .history-ratings { display: inline-block; } .history-ratings.open a { opacity: 1; } .history-ratings .name-icons { float: none !important; } .history-ratings-menu { width: 300px; padding: 10px; margin-top: 4px !important; } .history-ratings-menu .divider { background-color: black; } .history-ratings-menu label { margin-right: 12px; font-weight: normal; } .history-ratings-basic input[type="radio"] { display: none; } .history-ratings-basic input[type="radio"]+span { opacity: 0.6; cursor: pointer; font-size: 1.3em; font-weight: bold; top: 3px; margin-left: 3px; } .history-ratings-basic input[type="radio"]+span+span { opacity: 0.3; } .history-ratings-basic input[type="radio"]:checked+span, .history-ratings-basic input[type="radio"]:checked+span+span { opacity: 1; } .history-ratings-basic .history-ratings-spacer { margin-left: 10px; } .history-ratings-basic select { margin-left: 3px; background-color: transparent; border: 1px solid #ccc; } .history-ratings-basic select:disabled { background-color: #F5F5F5; } .history-ratings-report label { width: 100%; } .history-ratings-report .ratings-report-hidden { display: none; } .history-ratings-report input[type="radio"]:checked+input, .history-ratings-report input[type="radio"]:checked+select { display: block; } #history-options { margin-top: 0; margin-left: 10px; padding: 0 0 0 4px; } #history-options .hover-button { padding: 7px 8px 7px 8px; line-height: 1.428571429; display: inline-block; } #history-options .hover-button span { top: 2px; } .history-info { margin-top: 10px; margin-bottom: 10px; margin-right: 5px; } .history-info>span { margin-left: 8px; } .history-info>span:nth-child(2) { margin-left: 2px; } .search-box { float: left; margin-bottom: 10px; margin-right: 5px; } .search-box input { width: 130px !important; transition: width 0.2s ease-out !important; border: 1px solid #dddddd; box-shadow: none !important; -webkit-box-shadow: none !important; } .search-box input:focus, .search-box input:valid { width: 250px !important; border-color: #ccc !important; } .search-box input::-ms-clear { display: none; } .search-box a { float: right; position: absolute; display: block; top: 0; right: 0; padding: 8px 10px 3px 0px; opacity: 0.7; z-index: 999; } .search-box a span { cursor: pointer; } .history-options-show-failed, .search-box input:focus+span { opacity: 1 !important; } .history-options-show-failed { color: red !important; } .processing-download { width: 16px; height: 18px; text-align: center; font-size: 8px; margin-top: 1px; } .processing-download > div { background-color: #333; height: 100%; width: 2px; float: left; margin-right: 2px; animation: stretchdelay 1.2s infinite ease-in-out; } .processing-download .loader-bar-two { animation-delay: -1.1s; } .processing-download .loader-bar-three { animation-delay: -1.0s; } .processing-download .loader-bar-four { animation-delay: -0.9s; margin-right: 0; } @keyframes stretchdelay { 0%, 40%, 100% { transform: scaleY(0.4); } 20% { transform: scaleY(1.0); } } /*** Modals ***/ /* OPTIONS MODAL */ #modal-options .tab-content { transition: all 0.3s !important; min-height: 270px; } #modal-options .form-group { margin-bottom: 5px; } #modal-options fieldset { margin-bottom: 1em; } #modal-options .nav-tabs .label { display: inline-block; vertical-align: middle; } #modal-options .options-switch { text-align: center; border-bottom: 1px solid #F0F0F0; padding-bottom: 3px; margin-bottom: 13px; } #modal-options .form-group+.options-switch { margin-bottom: 13px; margin-top: 8px; clear: both; } #modal-options .options-switch label, #modal-options #options-orphans .process-all-orphaned { font-size: 1.4rem; margin-top: 5px; margin-bottom: 10px; font-weight: bold; cursor: pointer; color: black; } #modal-options .options-switch a, #modal-options #options-orphans .process-all-orphaned, #modal-options .options-switch input+span { opacity: 0.6; } #modal-options .options-switch label:hover span, #modal-options #options-orphans .process-all-orphaned:hover, #modal-options .options-switch a:hover { opacity: 1; } #modal-options .options-switch input:checked+span { opacity: 1 !important; } #modal-options .options-switch input { width: 14px; height: 14px; display: block; float: left; margin-top: 3px; margin-right: 4px; } #modal-options #options-orphans .process-all-orphaned { margin-right: 8px; margin-left: 5px; float: right; } #modal-options .modal-header a { float: right; color: white !important; margin-right: 1em; margin-top: 2px; opacity: 1; outline: none; } .rotate-refresh span { animation: spin 2s infinite linear; } .col-loading { color: #9E9E9E; font-size: 85%; padding-top: 3px; } #modal-options #options-status .glyphicon:not(.glyphicon-comment) { margin-right: 5px; margin-left: 3px; top: 2px; } #modal-options .options-server-box { margin-bottom: 10px; padding: 0px 5px 10px; border-bottom: 1px solid #F0F0F0; } #modal-options .options-server-box .btn { float: right; } #modal-options .options-server-box .alert { margin-bottom: 5px; } #modal-options .options-server-box:last-child { border-bottom-width: 0; margin-bottom: 0; padding-bottom: 0; } #modal-options .col-sm-6 { padding-bottom: 3px; } #modal-options .options-function-box .col-sm-6:nth-child(even) { padding-left: 5px; } #modal-options .options-function-box .col-sm-6:nth-child(odd) { padding-right: 5px; } #modal-options .col-sm-6:first-of-type { text-align: right; font-weight: bold; } #modal-options .options-bad-status { color: red; font-weight: bold; } #modal-options #options-status small { color: #9E9E9E; } #modal-options #options-status hr { border-top: 1px solid #F0F0F0; margin: 5px 0px 10px; } #modal-options .test-download .btn { padding: 1px 5px; } #modal-options #options-status .test-download .btn .glyphicon { margin-right: 2px; } #modal-options .options-function-box { margin-top: 5px; } #modal-options .options-function-box .btn { width: 100%; } #modal-options .options-function-box .glyphicon { float: left; } #modal-options .options-function-box .input-group-addon { background-color: whitesmoke; } #modal-options .table-server-connections { margin-top: 5px; } #modal-options .table-server-connections thead { height: auto; visibility: visible; background-color: #f5f5f5; } #modal-options .table-server-connections td, #modal-options .table-server-connections th { padding: 3px !important; height: auto; visibility: visible; border: 1px solid #F0F0F0; } #modal-options .tab-content h4 { color: black; text-align: center; } #modal-options .form-checkbox input[type="checkbox"] { height: 14px; width: 14px; display: block; margin-top: 11px; } .loader-dot-one, .loader-dot-two, .loader-dot-three { opacity: 1; animation: dot 1.3s infinite; animation-delay: 0.0s; } .loader-dot-two { animation-delay: 0.2s; } .loader-dot-three { animation-delay: 0.3s; } @keyframes dot { 0% { opacity: 0; } 50% { opacity: 0; } 100% { opacity: 1; } } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* PURGE MODAL */ #modal-purge-history .modal-body .btn { width: 100%; margin-bottom: 10px; text-align: left; } #modal-purge-history .modal-body .btn .glyphicon { float: right; } #modal-purge-history hr { margin: 0px 0px 10px; } /* ADD-NZB MODAL */ #modal-add-nzb fieldset { margin-bottom: 5px; } #modal-add-nzb .add-nzb-inputbox:nth-child(even) select { width: 100%; } .add-nzb-inputbox { float: left; width: 50%; margin: 5px 0px; padding-left: 20px; } .add-nzb-inputbox select { display: inline-block; width: calc(100% - 10px); } .add-nzb-inputbox span { display: inline-block; margin: 8px 2px 0px -20px; } .btn-file { width: 100%; text-align: left; cursor: pointer; display: inline-block; overflow: hidden; } .btn-file input[type=file] { display: none; } .btn-file em { display: inline-block; max-width: 100px; } .btn-file, input[name="nzbURL"] { transition : border 500ms ease-out; } /* HELP MODAL */ #modal-help .modal-body { text-align: center; } #modal-help svg { margin: 0.5em 0 0.5em; height: 65px; width: 234px; } #modal-help table { margin: 0.5em auto; text-align: left; border-collapse: collapse; } #modal-help table td { border: 0 !important; padding: 2px; background-color: white; } #modal-help table td:first-child { text-align: right; padding-right: 5px; } #modal-help table td a:hover { text-decoration: underline; } #modal-help hr { margin: 0.75em 0; } #modal-help small { color: #888; } /* FILES MODAL */ #modal-item-files .form-group { width: 400px; } #modal-item-files .input-group input { width: auto; display: inline-block; margin-right: -4px; } #modal-item-files h4, #history-script-log h4 { width: calc(100% - 30px); overflow: hidden; height: 1.3em; white-space: nowrap; text-overflow: ellipsis; } #modal-item-files hr { margin: 10px 0px; } #modal-item-files .multioperations-selector { clear: left; float: left; padding: 5px 8px; margin: 0 10px 5px 0; border: 1px solid #cccccc; } #modal-item-files .multioperations-selector a { margin-left: 10px; } #modal-item-files .item-files-table { margin-bottom: 5px; } #modal-item-files .item-files-table .sortable-placeholder td { padding: 2px 0px !important; } #modal-item-files .item-files-table .progress { overflow: hidden; box-shadow: none; } #modal-item-files .item-files-table .progress strong { vertical-align: top; line-height: 25px; } #modal-item-files .item-files-table .progress-bar { transition: none; } #modal-item-files .item-files-table .progress-bar>span { text-align: left; margin-left: 80px; line-height: 25px; } #modal-item-files .item-files-table .progress small { color: #727272 !important; margin-left: 5px; } #modal-item-files .item-files-table tr.files-sortable:hover .progress small { display:none; } #modal-item-files .item-files-table td { padding: 0 !important; border-bottom: 3px solid white; } #modal-item-files .item-files-table .files-sortable td { cursor: move; } #modal-item-files .item-files-table input[type="checkbox"] { margin-left: 8px; margin-top: 5px; } /* RETRY JOB MODAL */ #modal-retry-job .form-group { margin-bottom: 3px; } #modal-retry-job fieldset { margin-bottom: 10px !important; } #modal-retry-job .input-group-addfile { width: 100%; } /* SCRIPT LOG MODAL */ #history-script-log .modal-dialog { width: auto !important; max-width: 800px !important; } #history-script-log form { display: none; } #history-script-log h3 { word-break: break-all; margin: 3px 0px 0px; } #history-script-log code { background: none; } #history-script-log pre, #history-script-log code { padding: 0; background: 0; margin: 0; border: 0; } /*** Compact layout ***/ .container-compact .search-box .form-control { height: 28px; } .container-compact, .container-compact .dropdown-menu, .container-compact .btn, .container-compact select { font-size: 13px; line-height: 1.35; } .container-compact .nav>li>a { padding-top: 15px; padding-bottom: 12px; } .container-compact nav .dropdown-menu { margin-top: 1px; } .container-compact .main-content .btn, .container-compact .modal-dialog .btn { padding: 5px 6px; } .container-compact .sparkline-container svg { margin-bottom: 0; height: 30px; } .container-compact .form-control { height: 29px; } .container-compact .modal-header { padding: 5px 12px; } .container-compact legend { font-size: 1.4em; } .container-compact hr { margin: 13px 0px; } .container-compact .nav-tabs>li>a { padding: 8px 12px; font-size: 1em; } .container-compact #modal-options .options-switch label, .container-compact #modal-options #options-orphans .process-all-orphaned { font-size: 1em; } .container-compact #modal-options .options-switch input { margin-top: 1px; } .container-compact #modal-options .tab-content { min-height: 190px; } .container-compact #modal-item-files .multioperations-selector { padding: 1px 8px 5px; } .container-compact #modal-item-files .multioperations-selector input { margin-top: 3px; } .container-compact h2 { font-size: 1.8em; margin-bottom: 8px; } .container-compact h4 { font-size: 1.1em; } .container-compact tr.queue-item>td:first-child>a { padding: 0 0 0 3px; } .container-compact .table>tbody>tr>td { padding: 3px 4px 1px; } .container-compact .progress { box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.2); margin-top: -1px; margin-bottom: -1px; height: 26px; } .container-compact .td.delete .dropdown>a { margin-top: -14px; } .container-compact .info-container { margin-top: 0.5em; } .container-compact .pagination>li>a, .container-compact .pagination>li>span, .container-compact #history-options .hover-button { padding: 4px 10px; } .container-compact .info-container, .container-compact .progress>span, .container-compact .progress-bar>span, .container-compact .progress strong, .container-compact .progress i { font-size: 12px; } .container-compact .progress-indicator { padding: 0 !important; } .container-compact .search-box a { padding-top: 5px; } /*** Dynamic sizing ***/ @media screen and (min-width: 1200px) { .queue-table .table-extra-header-visible, .history-table .table-extra-header-visible { width: 10%; } .queue-table .table-header-progress-smaller, .history-table .table-header-progress-smaller { width: 35%; } #options-interface .label { display: none; } } @media screen and (max-width: 1200px) { td.name .name-icons { margin-left: 0px; margin-right: -5px; } td.name .row-wrap-text { margin-right: 4px; } /* Need to reduce sparkline width when RSS button is added */ .navbar-have-rss .sparkline-container svg { width: 220px !important; } } @media screen and (max-width: 1000px) { .sparkline, .sparkline-container { display: none !important; } .container-tabbed .nav li.active>a { border-bottom: 1px solid #ddd; box-shadow: none !important; margin-bottom: 5px; } .history-queue-swicher .nav-tabs>li>a { border-bottom: inherit; } } @media screen and (min-width: 768px) { .modal-small .modal-dialog { width: 370px; } .queue .multioperations-selector { min-width: 715px; } .queue .sortable-placeholder td { padding: 9px 0px 8px !important; } .queue-table .buttonMoveToBottom, .queue-table .buttonMoveToTop { display: inline; } } @media screen and (min-height: 800px) { /* Only for AddNZB and AboutModals */ #modal-add-nzb .modal-dialog, #modal-help .modal-dialog, #modal-purge-history .modal-dialog, #modal-options .modal-dialog, #modal-retry-job .modal-dialog { margin-top: 80px; } #history-script-log .modal-dialog { margin-top: 30px; } } /* Targetting Ipad */ @media only screen and (min-device-width:768px) and (max-device-width:1024px) { .main-navbar { margin-top: 0; } .container { width: 100%; } .sparkline-container { display: block !important; } .history-table .table-status-header { width: 25% !important; } #feedback-slider { display: none; } .glyphicon-facetime-video { top: 2px; } } @media only screen and (min-device-width:768px) and (max-device-width:1024px) and (orientation:portrait) { .sparkline-container svg { width: 160px !important; } } /* For large and veryyy large screens */ @media screen and (min-width: 1500px) { .container { width: 1400px; } } @media screen and (min-width: 2000px) { .container { width: 1700px; } } /*** Bootstrap overwrites ***/ * { border-radius: 0 !important; } a, a:active, a:hover, a:focus { color: black; text-decoration: none; } .glyphicon-volume-up, .glyphicon-trash { top: 2px; } .collapsing { transition: none; } .navbar-inverse { background-color: black; } .nav>li { display: inline-block; float: left; } .nav>li>a { padding-left: 10px; padding-right: 10px; outline: none; } .collapsing li { overflow: hidden !important; } .dropdown-menu { margin-top: 0; box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1); display: block; visibility: hidden; opacity: 0; transform-origin: top; animation-fill-mode: forwards; transform: scale(1, 0.8); transition: all 0.15s ease; -webkit-transform-origin: top; -webkit-animation-fill-mode: forwards; -webkit-transform: scale(1, 0.8); } .queue-item .dropdown-menu:before, .history-item .dropdown-menu:before, .info-container-box-sorting .dropdown-menu:before { position: absolute; top: -6px; right: 17px; display: inline-block; border-right: 6px solid transparent; border-bottom: 6px solid rgba(0, 0, 0, 0.2); border-left: 6px solid transparent; content: ''; } .queue-item .dropdown-menu:after, .history-item .dropdown-menu:after, .info-container-box-sorting .dropdown-menu:after { position: absolute; top: -5px; right: 18px; display: inline-block; border-right: 5px solid transparent; border-bottom: 5px solid #ffffff; border-left: 5px solid transparent; content: ''; } .history-ratings-menu:after { right: inherit !important; left: 23px; } .history-ratings-menu:before { right: inherit !important; left: 22px; } .open > .dropdown-menu { opacity: 1; visibility: visible; transform: scale(1, 1); -webkit-transform: scale(1, 1); } .dropdown-menu .divider { margin: 3px 0px; } .tooltip { z-index: 5000; } .tooltip-inner { max-width: 350px; } .pagination { margin: 0; } .pagination li { cursor: pointer; } legend { margin-bottom: 10px; } .nav-tabs>li>a { font-weight: bold; font-size: 1.1em; color: black !important; opacity: 0.7; } .nav-tabs>li.active>a, .nav-tabs>li.active>a:hover { box-shadow: 0px -1px 1px 0px rgba(0,0,0,0.08); color: black; } .nav-tabs>li.active>a, .nav-tabs>li:hover>a { opacity: 1 } .tab-content { padding-top: 10px; } .form-control, .input-group-addon { padding: 4px 8px; } .pagination li.active a, .pagination li.active span, .pagination li.active a:hover, .pagination li.active span:hover { background-color: #8F8F8F; border: 1px solid #8F8F8F; } .pagination>li>a, .pagination>li>span, .pagination>li>span:hover { color: #333; z-index: 2; } .progress-bar { box-shadow: none; -webkit-transition: width 0.3s linear; transition: width 0.3s linear; } .btn { box-shadow: 1px 1px 1px rgba(0,0,0,.1) !important; } .modal-content { box-shadow: none; } .modal-backdrop { background-color: white; } .modal-backdrop.in { opacity: 0.8; } .modal-header { background-color: #3C3C3C; color: white; border: 0; padding: 10px 12px; margin-left: -1px; margin-right: -1px; } .modal-header .close { opacity: 0.5; background: transparent; color: white; text-shadow: none !important; font-weight: normal !important; font-size: 32px; vertical-align: middle; margin-top: -5px; font-family: arial, sans-serif !important; } .modal-header img { margin: -10px 0px; } .modal-header .close:hover { opacity: 1; } .modal-body { padding: 10px; } .modal-footer { margin-top: 0; } .modal-dialog { padding: 3px; transform: scale(0.7) !important; -webkit-transform: scale(0.7) !important; opacity: 0 !important; transition: all 0.3s !important; } .modal.in .modal-dialog { transform: scale(1) !important; -webkit-transform: scale(1) !important; opacity: 1 !important; } legend { border-color: #9E9E9E; } hr { border-color: #D6D6D6; }sabnzbd-develop/interfaces/Glitter/templates/static/stylesheets/colorschemes/0000700000175000017500000000000013642116632026017 5ustar jpjpsabnzbd-develop/interfaces/Glitter/templates/static/stylesheets/colorschemes/Night.css0000600000175000017500000001167013642116632027611 0ustar jpjpbody, .modal-backdrop { background-color: black; color: #EBEBEB } nav { background-color: #444444 !important; border: 0 !important; border-bottom: 1px solid black !important; } nav .btn { background-color: #E4E4E4; border-color: #5D5D5D !important; } @media (max-width: 767px) { nav { background-color: black !important; } } a, a:active, a:hover, a:focus, .hover-button.glyphicon-play, .hover-button.glyphicon-stop, .dropdown-menu>li>a, legend, #modal-options legend label, #modal-options legend a, #modal-item-files .item-files-table .progress small, #modal-options .options-switch label, #modal-options #options-orphans .process-all-orphaned, .text-muted { color: #EBEBEB; } .dropdown-menu>li>a:hover, .dropdown-menu>li>a:focus, .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus, #feedback-slider { background-color: #555555; color: white !important; } .main-restarting, .main-filedrop, .nav-tabs>li>a { color: white !important; } .hover-button, .fileControls a:hover { opacity: 0.7; } .progress { background-color: #DADADA; } .main-notification-box { background-color: #727272; border-color: #252525 !important; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .container, .modal-body, .modal-footer { background-color: #727272; } .dropdown-menu, .navbar-collapse.in .dropdown-menu { background-color: #666; } .navbar-collapse.in .dropdown-menu { border: none; } .max-speed-input-clear, .max-speed-input-clear:hover, .nav-tabs>li>a:hover, .fileControls a { color: black; } .nav-tabs>li.active>a, .nav-tabs>li.active>a:focus, .nav-tabs>li.active>a:hover, .nav-tabs>li>a:hover { background-color: #ddd; color: #555 !important; box-shadow: 0px -1px 1px 1px rgba(0,0,0,0.15); } .processing-download > div { background-color: #EBEBEB; } .table-striped>tbody>tr:nth-child(odd)>td, .table>tbody>tr:nth-child(odd)>td, .multioperations-selector, .pagination li.active span, .pagination li span:hover, .dropdown-menu .divider, .history-queue-swicher .badge { background-color: #444444; color: #EBEBEB; } table, .table-striped>tbody>tr:nth-child(even)>td, .table>tbody>tr:nth-child(even)>td, .table th, .pagination li span, .pagination>.disabled>span, .pagination>.disabled>span:hover, .search-box input, input, input.form-control, .input-group-addon, select.form-control, .main-content .btn-default, .modal-body .btn-default, .modal-footer .btn-default, #modal-options .options-function-box .input-group-addon { background-color: #555555; color: #EBEBEB; } .table, tr td, tbody>tr>td:last-child, tbody>tr>td:first-child, tbody>tr:last-child td, .table-messages .table-messages-remove, .multioperations-selector, .pagination li span, .pagination li a, .search-box input, input, input.form-control, .input-group-addon, select.form-control, #modal-options .table-server-connections th, .main-content .btn-default, .modal-body .btn-default, .modal-footer .btn-default, .queue .table-active-sorting { border-color: #252525 !important; } .history-failed-download td.status, .retry-buttontext, .retry-button, .retry-button-inactive, .history-options-show-failed, .queue-error-info, .options-bad-status, .history-failed-download:hover .retry-button .glyphicon:before, .retry-button:hover .glyphicon:before { color: #F95151 !important; } .ui-sortable-helper td { background-color: #555555 !important; } tbody .caret { border-top-color: #EBEBEB !important; } .info-container, #modal-options .options-status-box small, #modal-options #options-status small, #modal-options .tab-content h4 { color: #D6D6D6; } 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; } legend, hr { border-color: #C6C6C6 !important; } .ui-slider .ui-slider-handle { background-color: #969696; border-color: #969696 } #modal-help table td, #modal-help table { background-color: transparent; } #modal-item-files .item-files-table td { border-bottom: none !important; } #modal-item-files .item-files-table { border-bottom: 1px solid black; } .history-queue-swicher .nav-tabs>li>a, .history-queue-swicher .nav-tabs>li.active>a { border-bottom: none; margin-bottom: 1px; } .queue-item .dropdown-menu:after, .history-item .dropdown-menu:after, .info-container-box-sorting .dropdown-menu:after { border-bottom-color: #666; } .container-compact .progress, .container-compact .queue .progress-bar { box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 1); } .modal-content { border-color: #727272; border-top: none; } /* Placeholders - Will not work if grouped! */ ::-webkit-input-placeholder { color: #EBEBEB !important; } ::-moz-placeholder { color: #EBEBEB !important; opacity: 1 !important; } :-ms-input-placeholder { color: #EBEBEB !important; }sabnzbd-develop/interfaces/Glitter/templates/static/stylesheets/colorschemes/Default.css0000600000175000017500000000003013642116632030110 0ustar jpjp/* Just a placeholder */sabnzbd-develop/interfaces/Glitter/templates/static/javascripts/0000700000175000017500000000000013642116632023306 5ustar jpjpsabnzbd-develop/interfaces/Glitter/templates/static/javascripts/glitter.filelist.pagination.js0000600000175000017500000003337313642116632031273 0ustar jpjp// For the file-list function Fileslisting(parent) { var self = this; self.parent = parent; self.fileItems = ko.observableArray([]); // Need to reserve these names to be overwritten self.filelist_name = ko.observable(); self.filelist_password = ko.observable(); // Load the function and reset everything self.loadFiles = function(queue_item) { // Update self.currentItem = queue_item; self.fileItems.removeAll() self.triggerUpdate() // Update name/password self.filelist_name(self.currentItem.name()) self.filelist_password(self.currentItem.password()) // Hide ok button and reset $('#modal-item-filelist .glyphicon-floppy-saved').hide() $('#modal-item-filelist .glyphicon-lock').show() // Set state of the check-all setCheckAllState('#modal-item-files .multioperations-selector input[type="checkbox"]', '#modal-item-files .files-sortable input') // Show $('#modal-item-files').modal('show'); // Stop updating on closing of the modal $('#modal-item-files').on('hidden.bs.modal', function() { self.removeUpdate(); }) } // Move to top and bottom buttons self.moveButton = function (item,event) { var targetRow, sourceRow, tbody; sourceRow = $(event.currentTarget).parents("tr").filter(":first"); tbody = sourceRow.parents("tbody").filter(":first"); ko.utils.domData.set(sourceRow[0], "ko_sourceIndex", ko.utils.arrayIndexOf(sourceRow.parent().children(), sourceRow[0])); sourceRow = sourceRow.detach(); if ($(event.currentTarget).is(".buttonMoveToTop")) { // we are moving to the top targetRow = tbody.children(".files-done").filter(":last"); } else { //we are moving to the bottom targetRow = tbody.children(".files-sortable").filter(":last"); } if(targetRow.length < 1 ){ // we found an edge case and need to do something special targetRow = tbody.children(".files-sortable").filter(":first"); sourceRow.insertBefore(targetRow[0]); } else { sourceRow.insertAfter($(targetRow[0])); } tbody.sortable('option', 'update').call(tbody[0],null, { item: sourceRow }); }; // Trigger update self.triggerUpdate = function() { // Call API callAPI({ mode: 'get_files', value: self.currentItem.id, limit: 5 }).then(function(response) { // When there's no files left we close the modal and the update will be stopped // For example when the job has finished downloading if(response.files.length === 0) { $('#modal-item-files').modal('hide'); return; } // Go over them all var newItems = []; $.each(response.files, function(index, slot) { // Existing or updating? var existingItem = ko.utils.arrayFirst(self.fileItems(), function(i) { return i.nzf_id() == slot.nzf_id; }); if(existingItem) { // Update the rest existingItem.updateFromData(slot); } else { // Add files item newItems.push(new FileslistingModel(self, slot)); } }) // Add new ones in 1 time instead of every single push if(newItems.length > 0) { ko.utils.arrayPushAll(self.fileItems, newItems); self.fileItems.valueHasMutated(); } // Check if we show/hide completed if(localStorageGetItem('showCompletedFiles') == 'No') { $('.item-files-table tr.files-done').hide(); $('#filelist-showcompleted').removeClass('hover-button') } // Refresh with same as rest self.setUpdate() }) } // Set update self.setUpdate = function() { self.updateTimeout = setTimeout(function() { self.triggerUpdate() }, parent.refreshRate() * 1000) } // Remove the update self.removeUpdate = function() { clearTimeout(self.updateTimeout) } // Move in sortable self.move = function(event) { // How much did we move? var nrMoves = event.sourceIndex - event.targetIndex; var direction = (nrMoves > 0 ? 'Up' : 'Down') // We have to create the data-structure before, to be able to use the name as a key var dataToSend = {}; dataToSend[event.item.nzf_id()] = 'on'; dataToSend['session'] = apiKey; dataToSend['action_key'] = direction; dataToSend['action_size'] = Math.abs(nrMoves); // Activate with this weird URL "API" callSpecialAPI("./nzb/" + self.currentItem.id + "/bulk_operation/", dataToSend) }; // Remove selected files self.removeSelectedFiles = function() { // We have to create the data-structure before, to be able to use the name as a key var dataToSend = {}; dataToSend['session'] = apiKey; dataToSend['action_key'] = 'Delete'; // Get all selected ones $('.item-files-table input:checked:not(:disabled)').each(function() { // Add this item dataToSend[$(this).prop('name')] = 'on'; }) // Activate with this weird URL "API" callSpecialAPI("./nzb/" + self.currentItem.id + "/bulk_operation/", dataToSend).then(function() { // Fade it out $('.item-files-table input:checked:not(:disabled)').parents('tr').fadeOut(fadeOnDeleteDuration, function() { // Set state of the check-all setCheckAllState('#modal-item-files .multioperations-selector input[type="checkbox"]', '#modal-item-files .files-sortable input') }) }) } // For changing the passwords self.setNzbPassword = function() { // Have to also send the current name for it to work callAPI({ mode: 'queue', name: 'rename', value: self.currentItem.id, value2: self.currentItem.name(), value3: $('#nzb_password').val() }).then(function() { // Refresh, reset and close parent.refresh() $('#modal-item-filelist .glyphicon-floppy-saved').show() $('#modal-item-filelist .glyphicon-lock').hide() $('#modal-item-files').modal('hide') }) return false; } // Check all self.checkAllFiles = function(item, event) { // Get which ones we care about var allChecks = $('#modal-item-files .files-sortable input').filter(':not(:disabled):visible'); // We need to re-evaltuate the state of this check-all // Otherwise the 'inderterminate' will be overwritten by the click event! setCheckAllState('#modal-item-files .multioperations-selector input[type="checkbox"]', '#modal-item-files .files-sortable input') // Now we can check what happend if(event.target.indeterminate) { allChecks.filter(":checked").prop('checked', false) } else { // Toggle their state by a click allChecks.prop('checked', !event.target.checked) event.target.checked = !event.target.checked; event.target.indeterminate = false; } // Set state of all the check-all's setCheckAllState('#modal-item-files .multioperations-selector input[type="checkbox"]', '#modal-item-files .files-sortable input') return true; } // For selecting range and the check-all button self.checkSelectRange = function(data, event) { if(event.shiftKey) { checkShiftRange('#modal-item-files .files-sortable input:not(:disabled)') } // Set state of the check-all setCheckAllState('#modal-item-files .multioperations-selector input[type="checkbox"]', '#modal-item-files .files-sortable input') return true; } } // Indiviual file models function FileslistingModel(parent, data) { var self = this; // Define veriables self.filename = ko.observable(data.filename); self.nzf_id = ko.observable(data.nzf_id); self.file_age = ko.observable(data.age); self.mb = ko.observable(data.mb); self.canselect = ko.observable(data.status != "finished" && data.status != "queued"); self.isdone = ko.observable(data.status == "finished"); self.percentage = ko.observable(self.isdone() ? fixPercentages(100) : fixPercentages((100 - (data.mbleft / data.mb * 100)).toFixed(0))); // Update internally self.updateFromData = function(data) { self.filename(data.filename) self.nzf_id(data.nzf_id) self.file_age(data.age) self.mb(data.mb) self.canselect(data.status != "finished" && data.status != "queued") self.isdone(data.status == "finished") // Data is given in MB, would always show 0% for small files even if completed self.percentage(self.isdone() ? fixPercentages(100) : fixPercentages((100 - (data.mbleft / data.mb * 100)).toFixed(0))) } } // Model for pagination, since we use it multiple times function paginationModel(parent) { var self = this; // Var's self.nrPages = ko.observable(0); self.currentPage = ko.observable(1); self.currentStart = ko.observable(0); self.allpages = ko.observableArray([]).extend({ rateLimit: 50 }); // Has pagination self.hasPagination = ko.pureComputed(function() { return self.nrPages() > 1; }) // Subscribe to number of items parent.totalItems.subscribe(function() { // Update self.updatePages(); }) // Subscribe to changes of pagination limit parent.paginationLimit.subscribe(function(newValue) { self.updatePages(); self.moveToPage(self.currentPage()); }) // Easy handler for adding a page-link self.addPaginationPageLink = function(pageNr) { // Return object for adding return { page: pageNr, isCurrent: pageNr == self.currentPage(), isDots: false, onclick: function(data) { self.moveToPage(data.page); } } } // Easy handler to add dots self.addDots = function() { return { page: '...', isCurrent: false, isDots: true, onclick: function() {} } } self.updatePages = function() { // Empty it self.allpages.removeAll(); // How many pages do we need? if(parent.totalItems() <= parent.paginationLimit()) { // Empty it self.nrPages(1) self.currentStart(0); // Are we on next page? if(self.currentPage() > 1) { // Force full update parent.parent.refresh(true); } // Move to current page self.currentPage(1); // Force full update parent.parent.refresh(true); } else { // Calculate number of pages needed var newNrPages = Math.ceil(parent.totalItems() / parent.paginationLimit()) // Make sure the current page still exists if(self.currentPage() > newNrPages) { self.moveToPage(newNrPages); return; } // All the cases if(newNrPages > 7) { // Do we show the first ones if(self.currentPage() < 5) { // Just add the first 4 $.each(new Array(5), function(index) { self.allpages.push(self.addPaginationPageLink(index + 1)) }) // Dots self.allpages.push(self.addDots()) // Last one self.allpages.push(self.addPaginationPageLink(newNrPages)) } else { // Always add the first self.allpages.push(self.addPaginationPageLink(1)) // Dots self.allpages.push(self.addDots()) // Are we near the end? if((newNrPages - self.currentPage()) < 4) { // We add the last ones $.each(new Array(5), function(index) { self.allpages.push(self.addPaginationPageLink((index - 4) + (newNrPages))) }) } else { // We are in the center so display the center 3 $.each(new Array(3), function(index) { self.allpages.push(self.addPaginationPageLink(self.currentPage() + (index - 1))) }) // Dots self.allpages.push(self.addDots()) // Last one self.allpages.push(self.addPaginationPageLink(newNrPages)) } } } else { // Just add them $.each(new Array(newNrPages), function(index) { self.allpages.push(self.addPaginationPageLink(index + 1)) }) } // Change of number of pages? if(newNrPages != self.nrPages()) { // Update self.nrPages(newNrPages); } } } // Update on click self.moveToPage = function(page) { // Update page and start self.currentPage(page) self.currentStart((page - 1) * parent.paginationLimit()) // Re-paginate self.updatePages(); // Force full update parent.parent.refresh(true); } }sabnzbd-develop/interfaces/Glitter/templates/static/javascripts/jquery.min.js0000600000175000017500000024711113642116632025755 0ustar jpjp/*! jQuery v2.2.4 | (c) jQuery Foundation | jquery.org/license */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; }catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("
$T('wizard-previous')
sabnzbd-develop/interfaces/Config/0000700000175000017500000000000013642116632015263 5ustar jpjpsabnzbd-develop/interfaces/Config/README.txt0000600000175000017500000000144013642116632016762 0ustar jpjp uniConfig for SABnzbd 0.7.x zoggy@sabnzbd.org Changed by Safihre for 1.0.x ======================================================== LIBRARIES USED jQuery * Project repository: https://github.com/jquery/jquery * Dual licensed under the MIT and GPL licenses: * http://www.gnu.org/licenses/gpl.html * http://www.opensource.org/licenses/mit-license.php jQuery Form Plugin * Project repository: https://github.com/malsup/form * Dual licensed under the MIT and GPL licenses: * http://www.gnu.org/licenses/gpl.html * http://www.opensource.org/licenses/mit-license.php Bootstrap v3.3.6 (http://getbootstrap.com) * Licensed under the MIT license Changed by Safihre, Nov 2015 We include the icon-file directly into the CSS, this way we avoid errors when HTTPS is enabled sabnzbd-develop/interfaces/Config/templates/0000700000175000017500000000000013642116632017261 5ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/0000700000175000017500000000000013642116632021230 5ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/0000700000175000017500000000000013642116632023245 5ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/js/0000700000175000017500000000000013642116632023661 5ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/js/bootstrap.min.js0000600000175000017500000011026513642116632027025 0ustar jpjp/*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under the MIT license */ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'

'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);sabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/fonts/0000700000175000017500000000000013642116632024376 5ustar jpjp././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/fonts/glyphicons-halflings-regular.eotsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/fonts/glyphicons-halflings-regular.e0000600000175000017500000004723713642116632032346 0ustar jpjpŸNAMLP',(GLYPHICONS HalflingsRegularxVersion 1.009;PS 001.009;hotconv 1.0.70;makeotf.lib2.5.583298GLYPHICONS Halflings RegularBSGP©ÜMMFîÍéŒÏÒÙ£(uÊŒ<0DãB/X ïNï ˆCCê^Ç rmR2skÉËPJ"5+–gléW*iÕW–/EÓ4#¬Ô£U¦~²f‰‘UDÜĹ÷ˆ«±àJ·1á/!þþ/žºÊsª7’“kŠ•”(ºˆ¡hNøé8oíd$yq޹1³âÖ9ƒ@-‰‚HG’ôµS"øFjôØ 6C3”¤&ž‡ÁøªW51ÁÓÜ×BŸ¯aËêQaR†U/õ¶{*¿‚Ëï‚=–@dôøh$¡1ÉTÛ—nc+c’ÞA¡§¼ •ZÉ€¤@QÑc­a‡ÕÞl÷2>ÊK°Èmó' “ËC‡HMĬfB‰X,¾YòÂp¨e¢ î¸UøØ*Ò”zÿ m‚ËËiO1nEÆ.›„ä hx!aC XTÚV¢Å©Â‹– —éR¥š%¥|Iä HðÅÕPƒ5"Åb’N²µ=âøƒrÙ/_åRŒ›”™_ à%Ò„uzÉéÒ˜Ö5’2Ä¡ÒãPÚ)žÔþžÆÃFƒ7S‹q„FÀ{náia·¸@DÐsˆ;š}9⬥?ź‘§Â R{¦Tkí;޵ǜ×U\NžZø›Q-»^Ôs7òf 0˜ÊÆS3A Ü _n`W7Pp˜»ôài«í³!ðgØ/à_p»ÁÒZ€-=Ã×¥~WZ#/á4 KF`´ »ŒzßÒ0Û| D‚ѵì‚&däI‰´ŽüÃÁ;·Mì”{'¶om†”m¢ I !wi9|H:§Û§À»ç÷Êþ¾{û~ö¹ýqº¸©Oøåôî© ú›,˜ ‚L]&„J0ñ•Ù9/í9&ÌYø è“°{;÷ú'À3`’e@vH„yDZ$º„3ˈDx28 ƒW€ Cx5xw‚B`£$C$'ãÊEl…y Õh¿ëÔ€ DJ $(p½îQA”A܉A–@'Ç$ hpÊ0ÎV0 `ºs¾ªeÒ$É4$"t2=f´˜4„A„{Tk–0|rH¤öÄУï`L&±´sÔh¦]”§A<£¡‹²`R´'£•!ƒ‹1N¦;£_Št3Û#  âòëúØêVãê *veÑF`E O$Ž{)ÙW=p:®ÞÖF`о2ÆÄ2Ú“CëÁŒÒ^×.Êć˜¡ø–øGþ<û.pçNe2ê‹ïÖ´ºÞ+YìsÛl:ÂÃË¼ïµ Ü«u5©¦ÞîÐtÀu•^8¾Ì6èóÈ„TmyðQÉ%þu~ôòš%~1rÒ˜aýwßš^ù_©Z£Za¢ƒ²0!Ùè¡·úNö`¥.Ž uqÀ±çêYB¥\™¨ó…„ÊᨀÔê…[eð‹îîþ:@ êJ'EÛ,¯3ubj@p¨ÁÆäð´f¨Éßóîµ·eW9( óºå ´Þ…‰³æ=‹l”G¦à7gj âSƒM6ư ô0ƒÿ9ò§–OË‘¨üíl§®B¼aªÝò¯  ƒ<¦çžÇBÕ™(VRAp¡fù^°ú¯+g9 qÓݹŠMÆt]»ØªpëE•r@]‡@ó©VŸkV¥ uêädé^ÑX å–—R@?EÕöY2ô¨˜Éï]#àǼš4ÀJÞåKöÁäÖ'ÃÁ¾d²âPC|mãmånä#¾‚$+48u'…çe&û¿€[n[LáÈù’ž±%{BCDÚL:^! ‹‚ÓbÆ™:&Éÿˆî‚g3“-3Ðøu´è­ÇæÐð¹ƒb iLZéÚ‚W‚FSÉäIdÍñ¡6.‘k5Pî„l7ž7üUz’T:NýN¡‘—.ý"€ªåü)‰Å—ì’['ß|U"Aƒ€³—‚I•Ûv©wÐÛØpë™í­t¹dk‚ˆž9Ø›Šå««Í9n¨D‹mq¹—7I|6›Kbcƒ]¶Mô“©²ÄÎ÷—è¶BA€BøÈª_ôJºT Ùüq Ð 6@—§„¸F—‡ƒžhd`G®Tëñ·:MÅ7'à…L,éIh—ÆFP »Ê~j½ŠŒíÄ ¬$¡„ Ä3™hAÝä’-SŒ^ûÚ†…Ðä-%qeÏìë~ÀÆQq«§¬ln"i¾ž&‘æÑQe?FlKï¨"úAsÀ(Ý3Y;"¡LžÚÔe€tå'ÄRzMœª1 0¨{=æ÷)ž€ ³K %$C Âø‘9ŠMðö¼ë¼4c ê€EotjÍÂV§GDŽ)lñ8“¯,˜\wÀ¥à !%$¿×3tÉ TBz’žÒ´ iUJÒÝ[¢Çxgd„Brï$Å!eqˆ’"J>࣠)\~¡‚Љ3(^ â R€8#>Öb›äH€âG'7_ fÓ«cκtDoAA߃†(q™B<ý`Ç­`VˆüøéΫ”©Ö˜Â*úbÞÏu‹P­4v@—+•Ê.’îQåÔ¥$V‚¡•í@C0 íR¢ÓÜP[‘z:X¦H#eäÁ òs >?úEÈWO>@IØ$|s¬žiâ ES¥²)0AŒ?£9•ab,¶@KšñÌ©o&îþüˆ¬Q´%¬ ÏžLu+› Â+H|ÌÆ?´NKÌ4ŒÆ’ÓCnPtè³ 'OTòœÒ.j5àÄ´8ÈÜv¶wÖœ«I¥&•+ß`¼ŠyScaO[#¡g°§Q§œ€¸Údª[îK½I矗`ôÄŒLPýÓ¸ #°Áœ½ ©)2Ò7aTƒäëi@c\Þ‘î ÂâÈ0nêC»pòß–é‹4͵Žxö*ñËÐR”zÕYâ„b‡ÀúÛT[\úkU™vìHʈÜq’p঄IÂíIëÅ—) ‹bB X”PºN´…štzí 2 Iæ==¤ ¦³ˆý¨Ã;}†bŠœàqþÓjiÞ†§a²#" ¬Ÿ>1¼‚°1äA›£p1ÖíÝP‚§OÇèO—ux÷Qôù°¹Î Fϲ(úhÝ„©O'MDxÊLíK$ȵœhæ& ù‹¦Ð1ŒïÄ4››Si ÜãrHJ’P°tDMË;rMã‚+”ö— *–àŸíØ—5u2$ªf3’K ß<ùP²LçrÑc‹I)˜Öå^ëda> %Åàѳb (Ÿú–@,‘2f,~"¦7ÛR;®EÑŽ;¬­”HXå(ú¹Ÿ4Š2ZäÝ'TªÛ¿ö‹„”½2J+ÿ^!#oŽ„›”Y~4Ø-׃òGW*ð!ßÃA•0&8€fä{`¼½øàWö=’DP8’'ÿ= ÖR¦ g©}ôiP>“Ê#¹Ëå¹4ÃÒEÐBRY®Æ^4eóý‚§N8¸V,[B‹†ĨîD#X†ø]²,Öèâ«LBsNC> +¢íoÍê^x¨ì§  ÷•újCì.4ÀYa‰_{e¦A2=rŽðØ+‰­´Öî§¡9PO»A!! ×}´YÊPJe„—çGnš±%xü1¬/}RgHØša Ž^3-Š© ‹5 ¶|‹qS§ÐðaWK{ 1al`IÀ1Ó ™ÆQé¾ëf_yyCZ)ÄL3X±] W6@DM™Tø<.„«uëGÎKŒì8ÙDsôÚбWæ‘r…Ý\ß7Z\ÕËÿòVÓ"I¦¢ŒõS¡§®dµ‰>CަÈUjßÉežÉÈÓD ®3MÇtWcP﯆–òÓ‰6#3Qךnቩ…°J\º¡Ã7ž#磱`Ø€Këë¤ ©×lV6 &ÓTŽ’ Þ~îÚl.’¾¡ <˜˜BP £*´!zRZÄäeÑ™»¾¾Ù·T±#£CéLH±¬ÈªWÅ)ÚD›†÷“p®YU#ÉÊ51{WJ€Ž¤4^Äf³Ì¼Z°öÌÑy6–Ó‘T2™dÎ4H=êB„Ҋɬ}œ&݃êÂ,aPçv+:2æ~òÁ*0¼°¢ˆd¦É“ÂõÖƒd ‚øáË!"A+‰rHn ¡ÇàsAäÁÈÚ—U €ýø¤b H“ÛN6þ$.ÐlÀ};½@£¡âiKà \¬Ò‚:v‰QEÇ:,|ýªQ  Y0|Ç%Ö@í° ÜäqcçÓÑdqh¯«è«¹vÜCÍGV†°©¸¯-(шm…’1»®âq89KF–Öä "2±ò}RrzóŽ,j^¥ÀqË\…Ý–#pƒ»+õ`flš³½â:k ´t–5E„OaIÃJ¬P @ps­E™j1ä4;6öô/aHÎ.¼ÏÓ°TX¤p“L‹¸ÄL8¤½Fç„Üši¨lí1–²YØŠ8É %!/Áù{­¨ÒÅñ éœ‹ÙåÆXœ€ºbˆ•½…NÉÂxp»ºäPWê½ÛíèÄcI9g²*þº¿îƒ¹œ%:Ö»LËÞuŠ‚CAOÂŒ­™%¬/Å“´(Y¢³^ï? Þã&I'ˆÈuh[x‹´–Qô$ÇzҵŽø‚ ß³ž‚(=V×€Ÿê ¾mð­ÅU) »ílΠΒ¾Ìiœ•d㦈™¨½~f¦ùjGíµÖR{D€%>®¥@”…”6‚¥¤1‚œ`Æ!Î ` ņ¶wYó§‰Õàk/a0A†«Â¹ŸÔ´ÊYh²¯—µòˆdìæxš‘k:fšƒÿ漣<ÕØÙWL4`8IYMBÁSlcäÖßÈà™-»EÒ‚'ÎÚŒÅ:,ÿD¬°çÑÙøÆ©84Ó)~÷ÿ2·j€Ÿ–Ç i¶·B(Lãµ| "a©š¦¯4,¦b8§”¥Ô“i 94¦åÔŒÒjWщ° ©6*ÐTð£†c4gŠÌ“¢×UMÉb³RÇE²þª‹ò…C5‘Æ)jäÈ´ ‘­16pbÃëÛÆŽH÷§ªFxòˆñ¹¿—¯«Ä£%4âòQÙÄC‰Êˆ§Å $9Ò:ÅM>òEÖÝaÜÆo«ÌŸ^ÂØ<IwÞYgq7s[†ð’ð -yÐ1ع5†äaÄãMKš×æRBÇY€†óFq}¹âç±ô8ïÀ²*ÈNtå'.Yb„”›¤ÍðZÍûvÅK (Ê]&ÉœŠ( Õ™¥ý2¯:0Õ €äo¤ÎÑ…PKiBH4Uð¹X,Ž¢[ˆð$ 0­mX±å»Ø´‚ ò¥fë5ð0± VR ©8ê%ÙÑñÊÞ§§Dt°ÃUŒ‘s`ô·-BPÈzôP”së°Á¦vIë¶8z-¥t1DiB ÒÝ"˶ÜÈYTJ ƒÄ.š?Ô0Ç7à€jL¢ÃNžú[2ÿtÈÂĮ̎†æ ù#þ6?E×»†”Œ×¡®ˆ:ÉžÎY;ƒç¬A&q…êSØIRÈ)Éss 9*xÒß0Bj)mìáH§A¾öhyÐhòMm¤&4ÅŠ…4€ €‡ÜÚg¸ŸVæ&tYóÚ¦ÏOCS0³Y²ô‚d7MvNïj)wë÷AÉ(¬âo "Í¢É[¦Ö E`›”þŠë7ez¸Ä†»Þ-·QÀ]¦6Û+BcaÍ@^IÂ:²Ò»´Þþ¾=ƒ—š­ˆsSŸäÏncÇùÓ 6 ‚ÍçOã¡B„4½ˆŸç L¥¨ÀGpãB‰q/<•zAãÓCÁ¥» €ÔA~¹ÉxÐ0 6rih£Íh¤IìØ·O‚N,:oÇÁkìçÚöÅ/ó¸{H°,ÛzЂgÚfÈ»z—¯Ó΀5ýFõ²TrÀn/ät``l†Á™*H6jT¡tG/xøË@P@(„ÄIèp Òeº!ùê`wv,:A쑜¹N£ 4}09zÇqCìä$rìüM`Y†Q”’ øMää•«³÷Ä(|éB!í>¢ÁØ>«O pwj A*@›ªŸJäC[h&3üëB QbýÏ©8 …:ñ“%f~v/‹lâSäÐèÒ0ÝèþÐð0a“·¶"ŽBæ8(f úuGoÇšÈgyñÅ×t£_Ãy~ÀÍ”Ž Ã%ä…°ûm†L èà!I$äXt0ƒÏ€~ÀeŒPˆzËÍ]¢Uìg Ð=_±?ñºµº.j#+`li‘¡ BŠñâM5›Ò º¿Å‘GÒpŒž7«a †Ö’%Y[UG9æ™òÆÓ@\bDêÐY…’{‰{¤ðED0®— Ö$ Qø+FvCð`ݨì3°ýQ¥ “î±E\àÐuC9ÍáÃ![€$êlïßõ šúêù6ßD¨oÙDgÀGˆ*+X!¸%#‚C€q‘ ?é­8ZUB)U@o¢ÏpgÞ©¶ZØq…¡¡É8ŽÊ9øžÇ|ucácAÑœ¶­é°•W;©@á" €Ø>P‚Óïåh_™Ç9}.6€„V/ÇO:à3´}Ž¡ZS ±µœ{:ØÚ~’óþœÅyŠk¦cO6;OÎBá=—bVñ. R¿k‹ oñ ¤ÿ^±GV=áØ }ïoI"+ ô ]w‡×FªÁzÏ·ä®ö`<“Éõ²30ûh÷ŒÅ3]êRfú—¿859s¼`K…M€¤8ñË X»Uqˆ<‰˜¥\˜“ÆZOàssè¿M’·&j&Ï ÄÖ÷ .§%Ÿ ÒPÊBL~^äßÿùGˆËˆ‘3páD‡¬•:í¸×£Z¿£Á¹¨©<\ñ«Ç i¯¨ÛW̆¨ÈÂ"(”ƒ:áÅâz‹©–X–~êÎ0PG]8ª¬ƒŒˆRQMNT¦qfÝW~!Ý0”R%Õ‘0ðxvGFy/Fø-›Ïwúu‚/ôî*ë+’Æ \õÂ8@ˆ6¢«Âþ©´‹»c<´àLƒ;c[šû÷ŠÛÙº nr ŸQS'o£QuòT®{qÒ_œÍ¿ƒƒSdª»A*ð:mò8Yuz2ÿPB« ìHh`l´k’pèÿLLh cEb6eÛÒ‹ ?!„™>| *=Vü­»Kî@žë“rx‘0ÓG`%ryr[6êŠY3Œ7ŒÅ ‡f*—*n•à%9™ÚdfÃè1ó1Þ¢Ú^'Ìý]‰š– RÍßèqÜÔ.Øê÷,œö•‰Ó^%„¯lÂÚâ ã½eØØ#wWÂÑsó56!Ù=âå!q[ö°ÄØ Ã%ÈÔ®]ó‹5^:€½m¨5©)?V b|šuÀ7f“ºìw°œæÄð,:çYe æ†R%” ò[À›î Éo gæF«AzµFP¥›òŸÀÔx›¶î{Ïíöd‚xíÖwÃ8Ž˜–Ù”{{L> ®‚d¬2CäL‘º¨äLÞ,œLÜè,„ò(àmSìø›ÃØåå$=Ñ|%Öluè& Ä…”83ãÚ N ¢XåŠx ë \VnõÍïžJ[)I›êwŒÄ/Ñé¹»²Ú ²| GÅºÙØY×Áð÷DHµ˜½*›Sýªîè¤æ’p6®0ÓcJ2ã@ÅW´%Ѧcï¼_^Ó$Ñç#*:G§®æ6Ž¡ïn>ÍD;úù¥~¤`9ëhXB ñUŽ«JB_вˆ˜ùˈî%ªý’´w'¹$³èv|#T<68çªKM¶Ï‘-Ù5U+¾¶¡'íB ËĪN…‘øŽbJìÃOv'Èì|‹„+*MŒ¼k(dˆ }›CÚ˱@ ³Áq°³¹&ùaR%}´ Ë!ÖVЃ‘s3w2¦ŽÑa²2²ÿŽawHæz¡/Q0ðF¦ Ù]~;ž¥Ã¤ËÖ NDùP mü˜K3xÞŠke_™£  ñóþS¯!¡V&=²²ª²ºvç_PÀL9؃Y£¡i¿ §NU­Ó_¶¬¯)–ƒJ6Ý9‘f*ÊðS ± 17ÚF|¸BR$É·y,Ʊ.¿ÀÕ&=uqsáó¡ODÅòB›ÈôR„=çÙɳ—eøØ½É‡àB®¬ä¬ÖH­¡®ˆ ª2lu'h7^#ÿS…)£Xi2..Pe¡/@FÕKÉ‘$é](Ø%à|–2ÉðY1pC±8tÁùIøã11N//+\»“p¥jÔÄïôd€”ÎáWÊmé›ÃI=ß½·ÓY“Zx¡ÔMЉPý8²“1/ JG«õÄ^U ,PÈd1O®ó^¬yßpq”l¿£2hÝÑ$øjvñø‹þª­ÌõžIšö%‡Š¨§áèÔ]VæÎÖ .'[+WU8Á­[Žå†Dê’³è,ß»¾-=[ÀåÙ O wÿƒ ¿Eê)å3±ø¬äó¿J&¥dïقݶR¡¬—S–\.° •5J$I&ó‘Ýoª·Hȳ~› l‡½Îz>€ Ux/õHñÐu;š?Gt®{?à³;óT¡ŒªH äLþ|Fú8á†ð²}ˆ¡{ú˜p:ß2tì͆a·Ëѧp6ÑÏíÔû·¶øè5Y"LÚD“Œù.Šr¼ØV“ß‘²ßS_ ºÚÊkþÏ]»n&úH¸z§~¦9‘æ ¦p $§4Ù‚”'¢{º& ¸«ÿËM\ŸÎ°éч¨®!ìq®ià ÏÄ(.hš'Ë B± T­²Ÿ|ž{I„6cLò¡.¹ž£ë¹iI¾ê«¿\!à;§àg`1â ᾕ˜j%C ¹o3*60÷·EŒ˜ØŽž]tä‰.×-%0 Y‰KÇ_nft] ·*VFCÆtJ’°ÄTÔ+¤\WZ8áòÄâ×gFвàÙ^ Þžf¶ 5šI=¶×ù#6ö.@õ2zÒÃ;Wš`ÿB/Ä™QøŠgí°ühŠjyJÓ°€N²AX¤3ªÝ,õ¤› Kä6è’ë6Ú²ØM0®T@ Ž…O{¡£˜4kj£|"¬ftÑŸ”Û„Uü‚<-üÞa†®Õæ5bú)í^R±°8™„ÎÁž:†§il¾­ÀKaÇ6@µæ”Ã!ÀÍÃ] buvÎ$ ‡oUÇœ~:.…Lût–èêe—ü Ç€¢JξP l$S[z–~Rq39é’ºô¶9ëQïË/m"•%ʤ‰¯†¼7Ÿš Ãî5MKLŸé‘§"IßG„ èXTÞŽXL¿FðݧV j‘p^¡/MÃgÁÛ»{¶¹»wô ì*øº€ž9ÿð—ÊO¾Êˆ<Ë"aôÁþ÷Aáîïˆq¿»¢†.M—2@möë‡p¿^Ú'“wß•möÇkxO8 ü$[ó«&Áü|Y‚Zyý`2_|%r—“/åJ?¡QùÃṈl‰3ÞÎßK¡E$–wÿvCËh£û a@÷U€1©Mø¾%0?1*¥ –$GÓZÓ{!|ÇÊ¿À$ÃßÛ•Â-òÙªEv;‹Í“:佋Ÿ`BlÏ˸ ìŒ§Çɬ›oQÝ0&‹•ûþñ,†F?¡ýÆä„^s,‡c“™ÁhË•ÿ$ÃEücl0åºw`ý⺹ň©@/€r^l˜8cT·3™Ük@›ÜúJÂÝ”´uPÐ&ʪNÉódùJjTK¸ªi ·é*u§»éX–{t“j~½É¡}ùñi\BÈKenâ‹Èµ|NëÖê šu’ï#Ã]@lõCZ$iPæa½ã¸©t04y20ü sØÖªâ,AuÆ!QÒØBäÏ–ö–^ìˆ@VsÉ‘€‚\ÞZßaã7©ì¾‰©¸âш³»6-Tïr±ÀäU˜ àu“Œ~ë°1HÂJ¨(<Î±Ž‚ò½Ó³bRÔ–¸qi Ï鿢¬J?íeÿGÁ §*jVħ "áØã†:Y);-Fådô!ðH£»ÙG~´•u¦x cb6m•¼ø)&;ñ0‡ÏdU?‡8ÅX~ïŸ1Ñ2šÛ¼¨t€ˆIØxè5ÄÀ{(ëz„ê Ü'¿ûÿ[ ÅƒkŽèZÐ…ØìéÍi,ðÅb™1̇‹¢Íá`º±(ôªmHáNðìüe‰K¤°ßÔ/ [à´(õö#Qô—GdÊuÎT©½^øm³¢¿%ù†ŒÅ!(˜7Kgé…P=èhøÏ•ákÉU+ŒÂÆ.[Òe¯‹Ïм³CÁžÿå"GDÿΨ£›<*<ÖÏþéh «)¤` A˜U @O]hýlÅf2”…!HžçÏF#QBÂé=uȾ9f´h€ó;"R„¥Ú’KÜ3-‚(G )¼P±áø¡¨ž¦²T],7ÁecÞ ë F4hH Ós³73á–Ÿ ¡² âÛ`àºR–¡Tíwfͳ;6Bó>Ř 9&ÈâÛÑÚÜ‚Î?’—÷ø)À\¨Œ€<&Ŏ™ð5 LÃJu¥@YžÝÝ,냲ھÛ_wÂ0˜^é17ñððöìpÞ»‡*>D”8㟘ü°_)$UźóÊR´!jOFôÖ>{ˆÐ’‘ »t,¯-…bPµ,m`D"/ŸzðAâ ͔إêßQZGÕ&U]xejxæåLwvõ~²œ=)@ØB¯Ö6Ê?!;53/ps@tƒOZS7©”§Ø™®’nŸØlxèûîÿZ?áƒZù—j a²–{ýû6—¥ÿL4›Š«1Ÿ 2¹´ù¯‹Q‡iÜý&Ö¥lƒˆá½Åì]o= 7Äļ ofüЖür MEV@ƒâHõ¦èòû/èýaD¥Ù¦ëH•ƒ®®lK5)ÂŒZ OE´œ˜„3Á¦IG©'г;îD'¶zl(‘ ÷EŸÏÑ$Š.Ùœð-W R'\w+)Âw3æêº¾ù¸ @Û%RÔ)ÿ.ò~Š9;]ô.šg+)Ø%ÈökÕÎÀÒ‰³¨^ÒöN€W·>b1z:s†¨oD Kö²ºÂ2w[|>9â®vWMFâ¯uÞ`¹ëÍax‡chÕ«õU·`*ʆeû]O V'6ý‡ÀƒxÔd?¼H]_rõA»£+zÀd­F›¯H ÄÊ‹<¤…Ç´£ÕÆkUsFzÀºòÏaHÖÇ9-³œ˜ƒgv‚b‹=ÓëL/žE»)°Ä.˜½x9j%Bã) $—ŒéAËB¢æì ƒÛŸt b.bÒAE¨žZRböH(‘£õJÿyaãˆÒ9Wj0f¤ßF'›°Xàz¾Ã ï$DQ­6´ëžqƒØ` oÊÐ i=áÁ{#4¤©FYHù@ØJÐ3 3i~‘tYТÙhkH‡PÏñ×÷ý17ÓàॆYÜD—"Üp—Ħ;'³16€Æf—pu‹ ô¾>þF›oDÅQi¨náÌ’-Ïç @P#äš«‡ ¦h“j Þ‚ˆÅ€f´¶C– –ƒ7°”T5HVXÉpíöÉklÄ­Œ³®]™ÚyXrÆ)?ͺÓBNJš Bƒ÷øä½#Ë›9e”&&»_0•Ó=®špZÉ6§ªh¤Ù)ð Ì—ƒa bÀŒí=(p)‡âÙåí¬;Š.N•,“ÃWí^ *hÔºŠC—îm}E™7iõà‡6Á‚Ã÷aËIívͲxpƒ*Ac#4‚ÿýûŒ³Ç Nö&ð`)®Ä‰ˆ£H£We›ƒy7jl¡ï°oÝEh_n3 ­ ‹jp?ª4èp2WÀE'kT_ã &£°!È–jVl˜HíÓ»_kÉšáÈâöʳùaYùŒ ¡ sÎ@ä[…G"ÊÓbYÕLÛÜ«X¦ªi ÕC˜q8ñ&úzVaY{èÆ#I@µ§­2˜Žmó!ôdŒ[1 …AàÆ¢šÿnKèðòÕÆeײå/>ßdƒm†uX:xÊ·\„âpòN‘ûý©l+ƒH+cÇtSǶ‚æCÀ±[íà~3ŒÍeÀ}6° \³,ÎñÉ„˜×|¤YòÝ§çø˜§v]¬'û|¿žŸë&í–ìMô2° dõ¬dsàx-((76”©aX›½m=ÕîÓŠ¿ãQˆ—<$ªª€üóQ†˜„º\“ Ô ªqiéH阇¬‹‰i'i¤”$"£{S*VwF‹“/°t<ìÊÁáQ`Ê’Z¸š+ðpr)›(¹.jµé¸«Iük5õ <ä´ʆ±Ë®ÉÖ, kO‘‡œDTˆÊJ&^7º£‡ÄªQþ¤ËÏvße &žZØ’ ^4úÆ^s°ñD+`WHµ™®bì6ÙÄ©˜ ¸®ÈL˜W{ZZ ¦@°ämqáûv¦É·(DÁ\+Ôlåéû0*¥V¥ß‡°VmÕЧæhÆæØ/S`|³^\<-™„©Ã6ë¸2©N3‚" ToŸóŒlräÅe ‚!õÅH2 ‹pƒA Ö›¨ ‡ÞÃÏ{›È¼þ/£òŸÑçœudU2*2ò"c«Ì"p…${©€y, 饋ö&\àm¾&º`Ð|x ¦p…ˆCªÒw#ÂÉûW9D­IiñÑ–Cˆ›Ksï–ç‡S¶“ã3ï ,¶‘–þM›’;j¨þBë§4š›P›2ÙÙiµîïf¶®É¿íÁbA­]a¢idíÂðŠ­¨†"Äò×i!aQhÔCNO½±žŠï‚õYí “xF$Äøg—9ž¥‘Z`W«°…VBâg¸± ìÚ#j\Ë‚—¨€eùGñû [³.à¾]‹ª0º~X{2›D©„? Šø"óŠ3ÄBáj,ÀK~Æb#„0¬É’L˜kcÍ(6 ¸  ±aüE7λ/ÕŽ¯%­ ü±œ·ï àÉÄ¡Rë^JûëÅCÏZ+71XÛ´ÐUO,Á„öá}#-”eÙ¤ 4ö3Å‚ðítÃ8§™Z7†Îià¬Ê<:iÑ?Ft‹Fk–C W'˜êf0i<âXdj—ùŒ”0ÛW#i‹‹š–eCÏ zI7ˆÎB°s·¬˜.Kƒ  *ëÝV‘°«dÿ‡ŸDljö@ì«ï% ©Üˆå ÎZˆÄsÝï®sh̸%‡^ß ýèøÍ÷@8†ò§¤øÎ?  Nº8gÔGøgr¨X°€Sƒ» üä• Ap ‘³º4‡z*ö¹4áÝà§,í¹Ät4GÙnÔè÷‘¼õdSå>fî”Q–CòÏWUZ{SÙ;Nxå½Ê}°ÇH&º¼* ­9׸¯q‹šU1 Êó a `(M-aÈG}Õn¶Ì½è¢Ú0 –¼pÊÔÇmcnñŽ òð‚ɘÀ_ú\±ül¼ÞÛàþ»}Î È Þ9÷FávžHþkƒJZüNO å´mZáÁQžíÒ¤ aSûëfú )QC+2 d’˜¡[¯ý» ÌïÁõH"t*Þ Ác*bÏÆÚ¢÷¯q°¨,µ™óã#S˜Ÿ#¢äu›'Ò¬õ:4©as¥©¾CDMF§|ɸm©_Ã1L]öáY˜Ê\À§ý*¤XœŠ>tú–¯¸Ìg‹§ØD‰Ÿ£Šøèd@&[°)8ÃÎ;<œ{óÊ8<–È+VG\°H˜®¦^¯a—‹aeÝ-4”úsÚJÔA \à hM[‚\`ð“¼#¿pD5Z97g;²÷BWâmÎä‰qTXX‘%0¹vºžã†ù&ù·]E ¹Û4]ûFŸIJä¤ù–œ„&ÝSŽ_¦îƒ4ÈR‰0 ¯¥Dü+Ëme¹Ô¨Y ƒg÷ÐOøñ+M{”03Ïv'Í…f…ÁÅt¯áè :;ôØ±Ê Nô¦nà\Ç”^Ü,)1Þlãá’aBïZZÚ„[•à ¸ ûZSÒÒä¼UYhÜ߆ÏÊw€õ‹šS¸\®/¤*?zQЋÿ`X4ïg¹ríÛ[§ŠCWæÛGû.§Y„ì0Q|ûRÔƒ‚E[w¾¦î„yƒ)¸áï‘,шï$ËNK@c/b -#Z¯I ¹G$Æ—¯™‹tmçÊH#êð)X£wPZAD|¢S oýfŠõT¤€ÝHÚë)¸ÎäÓçÇ>ªM1 b 7á°…ɆS‹uÐÃq× ö·öjK4[sð„‡ •—×xL ›Ö¼Ç¢©ë]5 ú!M!A¾dƧN Ë><«:Ç»Z(°8†ø)e… „ß »¥™†/™WØÈÀ| ý°bªØéˆú<é÷œƒ®T?%à ²:@±äÔ,-àø€ecMPð8u¤m°VÐgŒ9Héö6®Ëç‹}¾=³5ƒ—AbÒÄŽæýÏ찬ΙÀV:’…_ leÉ¹ß ÏÊî–•v ý`Í0Žä!$`GÁéA"I;$ß^?ú®Ší‰Ke O¢ Í÷³N(Õ½çö“YyÊ5Bç¡w¸ÐV¹%ˆju;)lFµoaåìË›7óxéÿ’Ú¸Ø4-‰É%ë †ð$ÏÖ¹/zskǘ(sh>»ÁDD©ÅƒÉt¥TÄ7örurÀœ¸0ÉÒ¢ `Ü´h5 5Œ¦Éä¶“Sá}¸ÑÝÈÿÒ4hrva¼éléc!ZjB]¹Ž¦©ÎxâD¯¶ÿb–TxzYS‚ß6_ö)ƒÊo°Ôp>˜#@P¢SÓ*ýbÜS\q Æ‹xñYfQ><"ó·²ã¢ Y6‘ÅòIEr_7ñˆÒ° VÔHÃ!³ÅIçrŒELçŽ6ž!N»öq"'’d “aþqMvºÅ‹A‚%íõºº¾ ñv³í½Ž nð.;šëA/Ïç°ô2ʲ‰œa8D$ÿGWv…#Ìû 9®kÅÅ'ü‰ËoØŸœo€@âýÌ (]gkí+}/ (nq‡ºìK(f¢ÍÖ ÝÆŸÐ¸žpüøÌ2ÔÈ3Y°ãÝéw²pDþdG´q2$ÌÉ}‘KÓ¯A­"öE&N‚tg'NeýsÕó!Юð4qìœo}ì¿¥Sµµë,oÕjr/s œTþMT—&öÐðQf\12¡h'&ctN¦ú'TÅx7¼]2û ;GÍ Ê…ë¢ã|Tª++:%/ †è¦ûгÿ1T ‘ÅúÏ“ óË€Ÿ<ÔñÌ4ÂÓÔùŠÀÍ”×ÿ“Ë— É,0~áò!¡W‹O©à'‰ áÍ:sñuÈÆÊÒ¦Ù†ù(´^ﮎ µ¥œÂ)˜ø7èØfÁ€Ñml¥òÒ¹î1Å«tÜÒZƒèhÀ ÊL0 §£·–6ÒX"JÒ‚í Œˆ4§9ØÑ Ö©Bé}ƒÞÔ­`è`‘¥®ð„Ó’ç #¦JÞïnéäôÑ_‘F­ H|š¡$OÈKÎú=¡Å“i1÷¡¦7Œ”o-HËq¡ªûp[É«%%:ˆä€Éˆi3Û ú„G C—LL‰4ŠSÐ:ždBòj|‰ˆpYÓöSþDP>¶pÓvÞ²5KLeè{t0®ò‘yÇEND$à*;z»5šŠN’áBIóÙgnŒ€.NÉ|×¶àÑnДRÈaS¤Z×ÂJcH² mÍÑXøÜÊßek;_ 6È,yÊÂb”0#¦Z„¸A e|w‚ÔÌG U½1l¸ËLDØ7ÄV£q’Ýt[­xuÝE”QULˆïðPBlZSh–’.áé1Q0UìÙ±8R„iúp;¦ñ{óôH#–GON!?ë£èt>©Q |pÊk¤Ûó¨q!çgT,öÕjÇÐ2ÃÈsÇ4툊t”jä·nÆ›/IÉO˜E!Ë‹nFõ›4¨†·ˆM&Ô1„’—¾…xÓ$§ew+v™SðË  bm]e%8 ²äPÌ !úﳌsÂó_06£ò)ÂQ´2JB†êØý „[t9®–ƒ'”§³Ôœ,§¢Ìô[½fÆג¶]˜ÂBŠBÃ@š¦îr&B„s|•Qš °§™×g¨íOCˆž1‡ÜJ Dç<ÌÏâUÿ‡²Î¼Ó(o©!³h¦ÜK½Hüê 0q›ˆ’§AÑVˆ¼'p´fÌy"Q O…Û 2ÇZ»¾ŸqÂà½#d"›@bQ»,®“ w)îPÍ\b`xŠßOþ)Þ¢ d¼MC€$[Ho¤WÞ¦Ñva4{äDZ`52íýº‡³5;‚…X°ÿaoK†;˜6“%ÁR(À‚ŒÓÆÑ…x9Š8 À2rãDc÷¥@ÙˆŒæ¾É¤îF×<†d(ÈAN#FI·ž›zmEþ‰»F=©±…Æš­å•S‚€f 4Ê8§<'´„íjêŽô-ª˜Ú'ǘ<ÒTbñ2Ýv€EÀt¸¿q¡Ò3qODd_íÐ{`/œhhê‚öÌ`Â’9_ü1hAY|/ùë «Þ·Uê-Í•ºÐÄAÞ”Õo(ñËê"“$r؆TÌ×PR;§.¸-w>&LJøiC`A£^±—Ó#‰€ÄX8—t—öâH?€dÁ¿aÃÄ–TSTÚa¨HŸ0@ÒîŠðóU)ˆ£æï^e}Jb7%×Ü”%:›ÓÆ¿@—¯MŽ+ñ»y”sqŽª¡ëLÌÒýø¿á ÊYª00Ô÷GüD¡ >Ä©êAW ˆ¶ð2IÛ:ÄÙF žÈÇš3ãŸ2Ê íq€÷À”:6S•—ŽÑ]KÎÏ" ¥®g[¦ åÏ‘H“˜âB¬5ÈVEqÛLJŒ•X{C¼ˆ¹§B½ÅÙÒ!¥P«Iáq9»øLlx–®Êª7Ò>Ö¤–Û]@Õ!@9H”!ªíäÈpÀÉ™Õ$ â?ÞÕ)›«Üލl°/"±”ÀÌ–¯+“@`}}:\÷•¯Ð 8•zQgS£¿+ò’¤¿Á’C„£}€R:ŸõHþUF\¡Xþ’göÀ/âë€AZ%c1ÕwlET–wX  ZNh¥ …Äyf2DÆ €Ã¸‰&v®L“qî4Æ7•ñ§ûÊzúð\iJyÀèJ-k¯NÄ3½ ë £-¼s‘ÑJ5‰—)ÙV0™N0ÝdÚ\Ó›d0d-©ãEÚ[mf£\£UmÁx²ÒÒC«R<(`ªÑ•æƒp4^!hÔQè `¢ù!l“ ~Æ™ì:J‡É ñlüW±þ€9˸ÌZXB=ëÈl)`jžªeVJ³àU€³†G!®sØç1Ô?Ƽ3„¨ÃŠ.³}bIaÙê6àÊ• œt?èÀ€ÞSxZJ'Ãp ië,¦.ˆñ¬ØR2T`5˜-R BxræWHö JP°e#Bb‰|“¯”-±þ¡ì‹[²„ ÆäPÂâý…¤¨Eh‹±³Â‹(5Sœ¢•fÕräÃ/]˰ÑIÆŠ ÌÖd”ÞE#ú¢O®Sú3—9Ó»]¸º³€e‚¿Û®Õɹ.9_Œbêe§æ¾MŒ´9b#e©(’¦-ˆ 0§Ò×Ra±àÆ„9ùº–ˆ"þ‰±þýýU,áÂ%ú~¾XèÜ€ö—”ëz€Û½{'6[@„t[W%ýÑ* .d'vR {”ÒðhЦ!ÞAed’CªE}»x=E[|ïB$7J¡* B-á ,=k7”[_¶ê-ÐIô– ¢«€’‡J5eÖ̶Ä´{ Èí( ´†;WMw§`«°€Ë~pÜA °z 8‡îfæ))âŒâÂ(Þü@ ©ĪÙ……Ù<áî…ä.a%N òìné@bz­Ã‡ÈÑÀµ¿>Àëô%…‡€T*?lgb¿döÈ<‚ĵãúÀw9Na¬Å¼8;<^*%›yÒ:tD¥Ò•Z<@ü‰0ª¨«ä‚q4±äÐíl\ –†1†îÉŸÓ`/ž$IJ Ò“sN)¼;:A;’)$ו °Ww¢y%KrÞIv\b¶V™£\n­d{ÀÞôÈ6t»ví×/~¢ü*OÖí 7U>£8ûr‚AC<ºjéŠEâ¢-jçØç‰·¨üxsî)ÌD¢›–1¼ÃŒ/ÏÊq“p**̸À$Ù‘, Ûá ƒ³BõȼpÄúk MhpˆKê7ÆUè¤Ã]ðøáh&„-ž$ˆéŽ»¯”“Yê£;àqËé6w•zÝ÷ÖWûî˄֭A¦h²ìDœ‘^RöÞÉ"­Æs5fýüîw ˆ¿ä+çQ&’/9È‚–œ¸wNbÇëéü­ãü°Øz{娕ÓþYÅ> ]NEÚÁ±c,ßž# BFý:0ÍØ/-EȾÆÂŒÇ׃ëF\êŒôäI§{tìäA»Z‰C™ORÃuk¥ iú”ô)…ytkdN¸&›v§A±™ˆ P{ÍÖîôËP'šó’>ÈêàxàÆ†`.Üä%,;:Ô¿Ù:Ž©«­¿íaFñ§oTQ«}v#ôìš×£‘öÚQkèÆ'ÝsÄÔÓÖØ÷~…µÞÍz5hMÄQÊ’áY>C…èÊ™„è¾i·ÌU± ÓNF#J0uŒÎCðäð8k“! f«éì§v ¹{Eñ/ÏëæIKIEË> ºp·yd†Ìe ʾ”=zô†:@7ÖJà÷ijÌ|ÆÆ5g8Àîx Å3çO±Œªþ€ÄÜÜ þ3€H1‹ó±Ø„F. y´fz´ìWIM ñÙƒÆj[.wæ%„i?Ò†UÂè©f|}@+[8•k7Cx¤˜S…íEOÞ¯p $ä—üáç¾Qæ»+™Ê:¸<á]¶¸Kâ3‹T-y²ÂÍ[NÑÖz´µ„;y³Š¤-HZþªY^¡Ô.¥M*Ô'h8ÒíA….°Nï2r‰œLBœ 7:Or’©}‘C‰SËšS9äJq#ì£WI}*8ËD!ˆ¸# g#Y>8`• ìÐ’Âñ ?a…2H,^ñãÄ'ƒï?¸ÿ^¸ˆæ§nƒhãOÆ’­¿i<ѪæÝYa2É+™üÌ6a°F±âa<Ì!„Û0¬‰2½]c:ïe¼K¤¬X˜X˜[UgéO¯u5iÔyPcVÙTºž5RIúŸA6òOÔ¸i ¤ýCŽ\‡ñ…—ãQZM„DÄÆƒÓÚÏB!X–Ä:ôÐã\!Ç^Á…"{¡E Vax$P \$ ³DBBTÞÓFtèŸ~™Ã{O‡¼ wïøž5a#ø`«=g€Ð°Yý2>‡±MG¯-G­kèªÛ1T¾b¦ü…L ¹`*Ù€«V¬X ­Þ*¥xªe§֊Z*c`ªVÁSÕb¥ºÅJUŠ’ªÐ*6 TK@¨zqPÄâ¶ÉÅh“ŠÇg†Ì*ß”U§(ªöQU4‚§9L’ ­cMÆ*ŒT»©R!R,B£È…E°Šˆ ¾*C|TzøôpðôFèô@èô4èô*àôà÷õ±î±í…°–†Ø¬á±Xób°€L€.™T2y`®ÀUpbàåÀë ªT, %@`äÀ è€# ?@t€¤øGLˆëÅžSÀ)öžÃ¿ z“ÿtϲFy׎ 14LhŒÐဃf™°ÈeÀ(.)pK€@\âà —X¸e@Tb v•h˜DÀÅ&ù0-IbD‰ d@ZD1¤@ ‘DàyÀ¸ó€Ñ§CN| 9Ü4æØÓš#Nc lÂÀ°;¸, `c‹XâÀ³@(„2$0 "@- ˜$èB@‰<$ÐÁÀø8p7C¦ €àbè(@¥ PA@…F ¸0Àõt‰üœÞ‹äG­éÔOR—‰éIJâIïTñySÍMW52\TÆoRå¥KV•0ÈŽ¬à»‚Œ( - $²€’š€” ¤!6¦„¢wˆêH¢©†£ùúGù­ O r~àe~/à]þ·àV~/àP~7 Szï Kú— Fv`;ö¯`9vÑ# J¤Ü§BÍN‚,ä×ÎÅÓ­²'°`¡'â‚`\LTþðÙApBs)r…!Õ â( Òi‚`././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/fonts/glyphicons-halflings-regular.svgsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/fonts/glyphicons-halflings-regular.s0000600000175000017500000032430213642116632032353 0ustar jpjp ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/fonts/glyphicons-halflings-regular.ttfsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/fonts/glyphicons-halflings-regular.t0000600000175000017500000013053413642116632032356 0ustar jpjp€pFFTMm*—ÜüGDEFD OS/2g¹k‰8`cmapÚ­ã˜rcvt (ø gaspÿÿglyf}]Âo”¤headM/Øœ¼6hhea Dœô$hmtxÒÇ `tlocaoû•ΠŒ0maxpjØ¢¼ name³, ›¢Ü¢postº£å5¦€ ÑwebfÃTP±TÌ=¢ÏÐvuÐvs—‹ ÐZ Ф2¸UKWN@ ÿÿÀÿ{ , Üh, ܰh@( + ¥ / _ ¬ ½"#%ü&&ú' 'àà àà)à9àIàYà`àiàyà‰à—á áá)á9áFáIáYáiáyá‰á•á™ââ âââ!â'â9âIâYâ`øÿÿÿ * ¥ / _ ¬ ½"#%ü&&ú' 'àààà à0à@àPà`àbàpà€àááá á0á@áHáPá`ápá€áá—ââ âââ!â#â0â@âPâ`øÿÿÿÿãÿÚÿfÿbàßäßµßißYÞÜýÚÚÙ!ÙÙ     þø÷ñëå|vpjdc]WQKEDÞÜÖÕÎÍÅ¿¹³ Œ5 *+  ¥¥  / / _ _ ¬ ¬ ½ ½""##%ü%ü&&&ú&ú' ' ''àààà !àà&à à)0à0à9:à@àIDàPàYNà`à`XàbàiYàpàyaà€à‰kàà—uáá }áá†á á)á0á9šá@áF¤áHáI«áPáY­á`ái·ápáyÁá€á‰Ëáá•Õá—á™ÛââÞâ â åââæââíâ!â!ïâ#â'ðâ0â9õâ@âIÿâPâY â`â`øÿøÿõõöªöª (øÿÿ(h .±/<²í2±Ü<²í2±/<²í2²ü<²í23!%3#(@þèðð üà(ÐddLL[27>32+&/#"&/.=/&6?#"&'&546?>;'.?654676X& žjžà  àžjž )"& žjžà  àžjž )L àžjž )"& žjžà  àžjž )"& žjžà LL#32!2#!+"&5!"&=463!46ÂÈ^þ¢Èþ¢^Lþ¢Èþ¢^È^p@LE32!2+!2++"&=!"&?>;5!"&?>;&'&6;22?69ú þ” x } x } ” þí x }þí x vþ” ú¤¤L þ”   d   ®  ®   d   l ¤¤dŒ®;2#4.#"!!!!32>53#"'.'#7367#73>76èòp<µ#4@9+820{dþÔ–dþÔ 09B49@4#®bk§Îv$B ÙdpÚd†>u®½hi-K0! .O2d22dJtB+"0J+«kuž0ªwd/5dW…%{L°>G!2+!2++"&=!"&?>;5!"&?>;4632654&#¬^CjB0  0BjC² x Š • þõ x uþõ x u¶Ë@--@°$?2O*$ $*P2@%d   ¯  ¯   d   Û ÈþÔBVT@ÈL¼!2#!"&=46ú üà¼ÈÈÈè°%A+32!546;5467.=#"&=!54&'.467>=è2cQQc2üà2cQQc2ÈA7 7AA7 7A°–d[•##•[––––[•##•[d–Èd76!'ö ˆÓûPÔ‡ $ op zy¶Ã³#»ý%**%ê·$ ”–üpd°L #7!2"'&6&546 6'&4#!"&7622?62~ ýÌýÌþø Œ þø\l û‚ l¤¤L ýÉ7 Úþøþø & þð ýÚ €þ” l¤¤ÿðÿ𺺠2'7' à&™ cÖ_"ý™Öfþþ³nº ™&\Ö`þtýšÖfüjpO°°32!546;!¼úüàúþ °ŠýÚ22&&Lœ%6.676.67646p…'0SFOˆ$WOHBý¨XAOˆ$WOHBù£"üÁ7Q)mr ›ý¢*`)nq&* ÿø»§)2"'#'".4>"2>4&ȶƒNN;)þíwŽd¶ƒNNƒr°”VV”°”VV§Nƒ¶dyþî%:MNƒ¶È¶ƒ[V”°”VV”°”dX¯D>.54>‰0{xuX6Cy„¨>>§…xC8ZvxyµDH-Sv@9y€²UU²€y9@vS-HÿÓ^{”62!2'%&7%&63—ƒ¥þª‚þ©þª‚þ¥ aþŸ ùþo ö÷ û ÿÓ^{”"62!2'%&7%&63#7'7#'—ƒ¥þª‚þ©þª‚þ¥óðÅJÁÃJÀêN aþŸ ùþo ö÷ û dŽâ‹ŒåŒÓ°°&2##!"&=467%>="&=46X|°>& f  û‚  f &>°°°|ú.hK æ ]  ] æ Kh.ú|° °L#'+/37GKOSW!2#!"&54635)"3!2654&33535!3535!35!"3!2654&35!3535!35~  û‚ Ud£ýÚ  & sdüd düd dáýÚ  & üïd düd dL ûæ   ddd þ¢  ^ ddÈddddÈddddd þ¢  ^ dddddÈddddLL/?!2#!"&546)2#!"&546!2#!"&546)2#!"&5462þpmþpý½þpmþpLþpþpý¨þpþp LL/?O_o32+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=462ÈÈ¥ÈÈ¥ÈÈüõÈÈ¥ÈÈ¥ÈÈüõÈÈ¥ÈÈ¥ÈÈLÈÈÈÈÈÈþpÈÈÈÈÈÈþpÈÈÈÈÈȰL/?O_32+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=462ÈÈ¥¼ýDþ…ÈÈ¥¼ýDþ…ÈÈ¥¼ýDLÈÈÈÈþpÈÈÈÈþpÈÈÈÈ&,è  62"'&4?622Ñ;±üñþ€±«Ý;±üð€±«nnBB# "' "/&47 &4?62 62ˆ²þõ ²þôþô² þõ²  ;³þôþô² þõ²  ²þõ ÿëÅ™%I2"'#".4>"2>4&3232++"&=#"&=46;546™Ä³‚MN,mþÔwŽb´MMo³˜XX˜³™XXþ¼– K  K – K  K™M‚³byþÕl+MM´Ä³‚MX™³˜XX˜³™# K – K  K – K ÿëÅ™%52"'#".4>"2>4&!2#!"&=46™Ä³‚MN,mþÔwŽb´MMo³˜XX˜³™XXþX^  þ¢ ™M‚³byþÕl+MM´Ä³‚MX™³˜XX˜³™‡ –  – ™°-32+"&5465".5472>54&&dd§Ò[›ÖêÖ›[Ò§g|rÅèÅr|°þpá¦>þÙ¸uÖ›[[›Öu¸'>¦7ÈxtÅrrÅtxÈd°°/?32+"&54632+"&54632+"&54632+"&=46–  – þÞ–  – þÞ–  – þÞ–  – ° û‚  ~ þp ý  î þÔ þ>   È ú  ú ––GO27'#"/&/&'7'&/&54?6?'6776?6"264X!)&1-†=+P˜˜P08†,2&+!)&1-†<,P —— P/:…-1&+x²~~²~–˜P09†,1&+"(&1,†=,Q——Q09†-0&* !(&0-†=,P˜þ™~±~~±d°!%)-1!2!2!5463!546!5#!"&53333333ô,); û´ ;),,;)ýD);dddddddd;)d KK d);dddþÔüà);;) dýD¼ýD¼ýD¼ýD¼ Ñ62++"&5!+"&5#"&l` ¯ ú þÔ ú ¯ j`ý  ýÁ  wþ‰  ? dè°3!#!"&5463#"&=X;),üàRú°þp);ývLþpú™™02".4>"2>4&3232+"&546ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþ|2 ¯  ú ™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ  þí 2  ^ ÿœ° )#!3333ýæ)ò)ýæ¯Ñ¢Ðþžàþp°þÔ,þpþÔ,d°°/3232"'&6;4632#!"&546;2!546&È¿ þ¹ & þ¹ ¿T2  ûæ  2 „°þ>þpÂüà þ¢  ^  ¯¯ ™™12".4>"2>4&3232"'&6;46ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþ|– ‰ ß & ß ‰™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ  þíþí ™™12".4>"2>4&%++"&5#"&762ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþçß ‰ – ‰ ß &™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅþíþí  °°9!2#!"&'&547>!";2;26?>;26'.áî º û´ ¹—ýÔ W – & ú & – W° ýtþW  ©Œ È þ>  ˜  ˜   ™™'2".4>"2>4&&546ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþ‹ýý™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ]¾ $ ¾  ™°(76#!"&?&#"2>53".4>32³‡  þ– …mtÅrrÅèÅr–[›ÖêÖ›[[›ÖuÀ$‡ þ–  …LrÅèÅrrÅtuÖ›[[›ÖêÖ›[™°576#!"&?&#"#4>323#"'&5463!232>³‡  þ— †ntÅr–[›ÖuÀë–[›ÖuÀœ†  h …n‚tÅr$‡ þ—  †KrÅtuÖ›[ý¿uÖ›[v† h  …LrÅ d°°/?O_oŸ!2#!"&546!"3!2654&32+"&=463!2#!"&=4632+"&=463!2#!"&=4632+"&=463!2#!"&=4632+"&=463!2#!"&=46}  ûæ Àü®  R ý2  2 Ò  þ> ¾2  2 Ò  þ> ¾2  2 Ò  þ> ¾2  2 Ò  þ> ° û‚  ~ È ü®  R d 2  2  2  2 È 2  2  2  2 È 2  2  2  2 È 2  2  2  2 L°#54&#!"#"3!2654&#!546;2„uSþÔRvd);;)„);;)ý¨È ÈSuvRÈ;)ý¨);;)X);––dLL 732#462#".'.#"#"'&5>763276}2 dÀ!C@1?*'),GUKx;(.9)-EgPL ûÍ3 0þ[;P$ 9¶7W W°—!1A2+"&54. +"&54>32+"&546!32+"&546äèÞ£c 2 äþúä 2 c£*    `    —c£ÞtþÔ  ,ÑrrÑþÔ  ,tÞ£ýÀ þ4 Ì þ4 Ì ÓGÝ9%6'%&+"&546;2762"/"/&4?'&4?62A þþú  úXx"xx"xx"ww".¬ ý ¬ ^ „x"xx"ww"xx"ÓrÝ/%6'%&+"&546;2%3"/.7654'&6?6A þþú  úÒ `Z  HN.¬ ý ¬ ^ d ¡š g~„jÄbì1K3#"/.7654&'&6?6%6'%&+"&546;2%3"/.7654'&6?6Ç ‡D@  *o;7 *ý‚ þþú  úÒ `Z  HNì ³ÙiËT "–²Z¬G !¾¬ ý ¬ ^ d ¡š g~„j °° !%-;?CGKO3#!#!#3!##5!!!!#53#533!3533##5#535#5!!#53#53#53!5!ôddþpdô¼ÈÈþÔÈdXû´,,üàdd¼ddýDÈþ ÈdôÈdÈddÈ,ýD,ddd„ddþ ddôþÔ,„dddXþ dÈ,,ÈdþÔ,þÔ,Èdddþ þ ôdþÔddddÈdÈþÔ,ÈdddþÔddd °° #7#3#3#3#3#3!5!#53#53#53dddÈddÈÈÈdd,ÈÈüàþÔ,ÈddÈdd,ÈÈÈèüèüèüèüèûPdd[[[[[ ¦°  "'463&"26ôªþ0ýV C;S;;S;°ýVþ0ªÛ Í;;T;; Ò° ! "'463!"/ &"26ôªþ0ýV ªþ08¨ýDþÓ;S;;S;°ýVþ0ªÛ ýVþ08ª¼Í;;T;;d°°&!2&54&#!"3!2#!"&54?6,9K@  ýD@ ¼  ü® ‹°Kü|@ ¶ @  üJ  Ï‹ÈÿÿL° !2 46ú þ>þ>°û‚¼þC°°EU!"3!26?6'.#"#!"&/.+";26=463!2;2654&!"3!26/.6þD N9  >SV– N ýÚ N –  –  î  – þ±þ & X &° þÓl l- þp œ œ  ýv  –  –  Š ý¨ ˜  ˜ d°L!)13232#!"&546;>35"264$2"&4ôÈ8]4$–);;)ü);;)– '3]ÈdþϾ‡‡¾‡þïV<?!©(% þ_5,Rþy:" *2þ“8 ¬T¢¯ü2*BBW-Þ‘Y". BB % îýZÉdð°'2;#!5>54.'52%32654.+32654&+ñ50;*7Xml0þ ); !×9uc>--þ‹Ni*S>vØPR}^Ÿ3:R.CuN7Y3(;  G)IsC3[:+ 1aJ);4ü®ePZÈo°!56764.'&'5mSB„ ,Jþ º­  °95(ü¹1(aaR@ 9ÿµ°%/#4.+!52>5#"#!#3'3#72 &È2þp"È& 2èû›KK}}KK}„ ü®dd R ,Èüà§§ §!ÿµ°%/#4.+!52>5#"#!5!'7!5L2 &È2þp"È& 2èC§üà§§ „ ývdd Š ,û‚}KK}}KK°L/?!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=462Xý¨èü üàLû´LddþÔddþÔddþÔdd°L/?!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=46ú¼ýD³Lû´Ý¼ýD³Lû´LddþÔddþÔddþÔdd°L/?5463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&ôXý¨þpèüÈ üàþÔLû´¶ddþéddþéddþédd°L/?!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=462Lû´Lû´Lû´Lû´LddþÔddþÔddþÔdd°L/?O_o32+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=462ddA üàþéddA üàþéddA üàþéddA üàLddddþÔddddþÔddddþÔddddÿœ°L#*:J!#;2+"&=46!2#!"&=465#535!2#!"&=46!2#!"&=46dd–ddôþ þú§ÈÈÂ,þÔXý¨LddþÔddú}KdK¯ddþÔddL#*:J32+"&=46#3!2#!"&=463#'7!2#!"&=46!2#!"&=462ddgddü®ôþ /Èȧ§ûæ,þÔXý¨Lddû´LþÔddÈdK}}¯ddþÔddȰè!2#!"&546 Kî,,ý,,„þÔ,è,ýv,,Š,ýD,,°L!2#!"&5467'2"&4,Xû¨J÷*J%ìüÒpNNpNLü ôdý¶ƒœ>þàôtNoOOoÛ6‘2.'&54>"264ˆuÆsFE²66 !^Xm)!fh˜H„uX£yH¸¸™™2".4>"ãêÖ›[[›ÖêÖ›[[›KtÅrrÅ™[›ÖêÖ›[[›ÖêÖ›üoVrÅèÅruß5.54>6?6&'.'&76#&*IOWN>%3Vp}?T›|J$?LWPI¼)(!1 )  Huwsu‡EG€^F&:c—YE‡vsxvýþ!K‚:%A'# " A)Y¶ Ël */7>%!2!"3!26=7#!"&546 7èl lý27»þ);;)ô);È»£þp¥¹¹8þ–¡7cõs* sÈ »;)þ );;)¶Èþ´¥¹¹¥¥¹þ×þ–2ªc“L6!#"3!2657#!"&546&'5&>75>^i¤4Ã);;)ô);ȹ¥þp¥¹¹Sþ¬ 9dTX .9I@F* L’6;)þ );;)™g¥¹¹¥¥¹þÓþÎ Ë 0!;bA4Ò L5!2!"3!26=7#!"&546 62"/&4?622^^ ªÈ þø Ȫ þüþø ¯È þø ȯ –þø È­ þüþ÷ ­È þø È­   ­È È„L326'+"&546údÐþ0dLþJÅüÅþJè°L#3266''+"&5462dÐÐþ0þ0dLþJÅþJÅüÅþJÅþJè°3''&4766°þ0þìÐüÅþJà*àþJÅÈ36 &546ó.üÒ2þ  þ èÈd„è32+"&546!32+"&546úÈÈ¥ÈÈèüà üà ÈdLè#!"&5463!2Lüà ¶üà 346&5&546ôìþþ0d¶þ *þ ¶þ;èÿþ³O#72#"&5&5&5464646ddþ1þ2ÒÒNüµþ: µþ9 è þ>¶ þ=¶,èL32+"&5&54646Rddþ0ÐLü¶þ;èþ;¶dȰH  #!"&762!2#!"&=46®õ ûî õ*ý÷èü9ýäýHddˆÿüuJ  uþ `ÅýØ(„þŸþŸÆ(&;ÿü(J ' 7(ýÙÆaþŸÆ#ýÙÆaaÆ™™32".4>#"#";;26=326=4&+54&ãêÖ›[[›ÖêÖ›[[›}d––d––™[›ÖêÖ›[[›ÖêÖ›º–d––d–™™2".4>!"3!26=4&ãêÖ›[[›ÖêÖ›[[›Eþ ô™[›ÖêÖ›[[›ÖêÖ›þ~dd™™32".4>"'&"2?2?64/764/ãêÖ›[[›ÖêÖ›[[›å xx  xx  xx  xx ™[›ÖêÖ›[[›ÖêÖ›­ xx  xx  xx  xx  ™™$2".4>'&"2764/&"ãêÖ›[[›ÖêÖ›[[›T‹òw‹™[›ÖêÖ›[[›ÖêÖ›þ1U‹ñw‹™™;K2".4>";7>32";2>54.#";26=4&ãêÖ›[[›ÖêÖ›[[›?2".4>#";26=4&#";#"3!26=4&+4&ãêÖ›[[›ÖêÖ›[[›––  –  ú  KK  ^  K™[›ÖêÖ›[[›ÖêÖ›V –  – þÔ 2 È 2  2  °°/_3232++"&=.'#"&=46;>7546+"&=32+546;2>7#"&=46;. – g—  —g – g—  —g¹ – Df¨  ¨fD – Df¨  ¨f° —g – g—  —g – g— þͨ  ¨fD – Df¨  ¨fD – Df™™?2".4>"2>4&"/"/&4?'&4?62762ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrš@||@||@||@||™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅZ@||@||@||@||™™02".4>"2>4&"/&4?62762ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrƒjþÀÊjOÅ™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ}jþ¿ËjOÅ™™!2".4>"&32>54ãêÖ›[[›ÖêÖ›[[›KtÅrAKiõý¸hstÅr™[›ÖêÖ›[[›ÖêÖ›;rÅtxiKAÐý¸>rÅtsS°ù6!2#!'&4' &ýÚýöF« þÝÈþÝ « &S™ù &5!"&=463!46 ýöýÚ&ñþU & þU #È# ·]™ #!+"&5!"&762ª« þÝÈþÝ « &‰ýöýÚ& ·]°32!2"'&63!46&È# þU & þU #°ýÚýö &·™] &5>746 ýö^°¥$,[‡Ç~UþU & þU #$DuMi±qF °°+!2/"/&4?'&6!"&546762R,^ùjù^þ!þÔ^ùjù^°þÔ^ùjù^ûP,^ùjù^IIgg+#!"&546762!2/"/&4?'&6öjù^þÔ^ùý ,^ùjù^`jù^,^ùýñþÔ^ùjù^™™/2".4>#";2676&#";26=4&ãêÖ›[[›ÖêÖ›[[›³Ð:#6#:1–  – ™[›ÖêÖ›[[›ÖêÖ›ºþÒ.þ  –  – °°IUaho276?67632;2+"!#!54&+"&=46;2654?67>;26/.'&;26!"&5)#! Ä &Ä0  =  2 þpÈþp 2  =  ¦ Û 3þ5±3 ç þ‰ X þ‰° v  v !{,  2  ¯,þÔ¯  2 0€y¢  • ª  ür wþ‰  ¯¦+I6.'&&&547>7>'.>7>&67>7>7>-Bla‹bŽD8=3™*U  :1'Ra\‡{À%&¢=>8\tYR-!Šq[Fak[)¦²þÝÈ•X1 ™"@&J<7_…?3J5%#/D &/q!!6ROg58<'([@1%@_U2]rÏO.>7'&767>.'&'.'&>77>.'&>' '8GB    `ŠH  >JS>H7 '+" NA 5M[`/Pg!;('2"&"IbYÏC€e\D9$ 886#1%)*ƒ‘§—J7gG:    8G\au9hªoK$œ]54<&"&5476&2>76&'&6?6&'&'.¤{nO9:On{¢{nO:9On{°ø°FZ  2Z_ƒˆƒ_Z2  Zýÿ# %8-#,- "F-I\b\I*I\b\I--I\b\I*I\b\IÜ9>|°°|;7Es1$F^D10E^E$1u$/D0 "%,IÿÜÔ°';L!#7.54>327377>76&'&%7.5476&6?'&'.P”[©vY,9On{R=A ”&/l‰'Pj˜R.Mv&  6ýQFZ  *HLh5)k|# %8- ,- "xatzbI\b\I-yþRµUÖ4Zrnc­1ˆ?1FrEs1þ­þ»1) ùþù]@ €€ @]ù )1ES>L°'+/37;?CGKOSW[_c3232!546;546;2!546#!"&5353353353353353533533533533535335335335335Rd2û´2dôüddddddddddü|dddddddddü|ddddddddd°2––222þpýîÈddddddddddÈddddddddddÈddddddddddw—%7&=#!"&=46;3546'#"&=463!&=#'73546oùùŸý¨þÝÑXñý©zÑ#ùùñµzŸæ*æ–ý¨dX–þ˜zdþMæ*æ–µz–°L!2#!#"&546dè);;)ý¬þÐd);;L;)ý¨);þÔ,;)X);dL° ?32!546!32!546".5!2>&54=–ÈþÔÑÈþÔ(LfœÀœfL(, '6B6'°úúúúþpþÔ)IjV\>((>\VjI),ú +'%! !%'*úÿÿÔL 'LÆþŸþŸÅ'›ÇaþŸÇ'îMÜ 7 MýÚýÙÆaaýÙ'ÇþŸaÿQd_è)!232"/&6;!%+!!"&5#"&?62”ê–æ*æ–þƒþæ–×ý–æ*èýÙùù‘¸ùþpÈ&ùž°032!2#!!2+"&=!"&=#"&/#"&468^&€d,!ý‡02*þÔ*É6°¢%þ%+È*2222 Á*°L !53463!2!!°ûPÈ;),);ýD°ûPèdd);;)ÈüàÜL 3463!2!!ÈÈÈ;),*:ô,þÔûP, þpX);;)ÈdýD¼Ek¯+32"/&6;#"&?62{æ––æ*æ––æ* ùý§ùùYùD¯k&=!/&4?6!546¨ùùý¨ùùX`å)å —— å)å •• °° !.#!"!"3!26=4&53353‘¬$ý`$¬-ü);;)è);;þ«dddÜ-(ýd;)d);;)d);Èddddÿœd°L #12"&54%##"+"&'=454>;%".=4>7i**dý]&/T7 È£ü" Lü®Rü™ÈþìQú úþÔú )2( Jf°,53232#"./.46;7>7'&6327"&)^Sz?vdjŸO9t\U>/ v?zS$2451 7F8°%Mþ¹­)(  ()­GM~ û¾1==œœ7'''7'7'7'77 àNê´´êNà-››-àNê´´êNà-››²Nà-››-àNê´´êNà-››-àNê´´d°°!-=32!2+"&/#"&54?>335!7532+"&546Š2(<H(<î,úF=-7‘` 1d–dˆÖúþ>2ývdd°Q,–}Q,d-þ¨!2$'$ÄÆ(dÔÕþ‰dw}á¯þÔþ ô°L 0<32#!+"&/&546;632+"&546!#35'!5Xú,î<(þ¸<(21 `‘7-=|ýédd_ˆd–d22ÂúL!þ¨-d,Qv–,Q(ÆÄ$'$ddþ ôdþ‰ÕÔ¯á}wdO7G%6!2+#!"&5467!>;26&#!*.'&?'32+"&546dkn  T.TlnTjƒþª¦:d%ƒËþ8   ’VýOddiæp &yLNþ­(¢  % Hþ YS(22·Säþ ôÿœd°O6F#!"&'#"&463!'&6?6*#!32!7%32+"&546Ûn ¬þªƒjUmlT.U  nJ’   þ%Ý‚&jþªPddOæ ýó ¢(SNLy& p®·d(þ­Y÷ìäþ ôaL7G2#!"&/&?>454&/!7%.!2#!"&=46ÞNS(¢ ýó% æp &yÆ22·Sì÷Yþ­(–ôþ nTjƒþª¦kn  T.TÖËþ8   ’Vþ­d%ƒý ddÿýè-I!26=4&#!""&5&/&7>3!2766=467%'^ôþ NLy& pæ  ¢(ý‰ìS·22(SYLddüæjTnlT.T  nk ¦þªÏþ­V’   þ8˃%dšš%2".4>%&!"3!7%64âìÖ›[[›ÖìÖ›[[›†þíþí  š[›ÖìÖ›[[›ÖìÖ›þ9ß ‰ – ‰ ß &šš%2".4> 6=!26=4&#!54&âìÖ›[[›ÖìÖ›[[›%þí  þíš[›ÖìÖ›[[›ÖìÖ›èß & ß ‰ – ‰ šš%2".4>&";;265326âìÖ›[[›ÖìÖ›[[›Kß & ß ‰ – ‰ š[›ÖìÖ›[[›ÖìÖ›þ@þíþí  šš%2".4>#"#"276&+4&âìÖ›[[›ÖìÖ›[[›—– ‰ ß & ß ‰š[›ÖìÖ›[[›ÖìÖ›» þíþí ˜˜–¦2".4>%&277>7.'.'"'&65.'6.'&767>'&>7>7&72267.'4>&'?6.'.'>72>äèÕ›\\›ÕèÕ›\\›d+: =?1 " "/ ?9 #hu!$ 0 E.(,3)  (     *!A 7 ,8 !?*  ˜\›ÕèÕ›\\›ÕèÕ›  ' "r"v G  .&* r$>   #1    %  *  '"  $  g2( % ¯…67'"/&47&6ô¤Žþý‘ûPM<†;ý¬+oX"O…\eŠè~Y‡+" ý¬n+WeÉ`°¬#'7;!2#!"&=46#3!2#!"&=46!!!2#!"&=46!!dè);;)ü);;ÈÈüè);;)ü);;þ ôüè);;)ü);;þÔ,¬;)d);;)d);ddÈ;)d);;)d);ddÈ;)d);;)d);dddL° !2#!"&46!–„ü|;Èþ¢„°**ýDþÔÈôôd°°%32!2!5#!463!54635#!"&=ôÈ);,);þ Èþ ;),;)Èô;)ü);°;)d;)þpdd);d);dddýDÈ);;)Ȱ°+AW!2"/&546)2/"/&4?'&6#!"&54676276#!"&?'&4?622,^ÇjÇ^5,^ÇjÇ^þ/jÇ^þÔ^ÇË^þÔ^Çj°^ÇjÇ^,þÔ^ÇjÇ^ý&jÇ^,^ÇÎ^þÔ^Çj¨¨#;CK2".4>"2>4&$2"&4$2#"'"&546?&542"&4$2"&4ÛòÝŸ__ŸÝòÝ ^^ Æà¿oo¿à¿ooþ-- - L- 73H3)z þ‡- - - - ¨_ŸÝòÝ ^^ ÝòÝŸWo¿à¿oo¿à¿ -!!- -! ‘$33$ 1~¤ - - - -ÿØZ¹¼[%676&'&#"3276'.#"&477>32#"&'&6767632'."Õ[v_"A0?! þˆ-  Y7J3$$ þ«)G"#A.,= # (wn‹kV8@Fv"0DÿG([kPHNg8Bþ*­Ö[eb›2!þ‰5(7>B3$$' þ®)M"#!7)/c# *xn‰fL@9N¾DÿH7!$†W]µBþ$&dX¯DD>.54>"".#"2>767>54&‰0{xuX6Cy„¨>>§…xC8Zvxy#!?2-*!')-?"CoA23:+1! "3)@ +)?jµDH-Sv@9y€²UU²€y9@vS-H-&65&&56&oM8J41<*.0(@  )*D*2Om9ÿòw¾.2&/7'/&477"/&4?«»BB8"._÷þ{ÔiBBi BBþåBºBBB7._÷…¾BB^*k"5._øþ{ÔjBºBþFi BºBþåBBB»B77/_ø…Èè°2#!"&54>!"264ªšd:;)ý¨);XþÿV==V=°.2üG);;)¹3-ªýD¼ý=V==V°° "/''!'&462†*$þéÔþÌþèË3Ò, #*¡þæ*#þõþÔÒþÍË4Ô$*' à2@K#.'#5&'.'3'.54>75>4.¼&ER<,Ÿ 3'@"‹ª MOW(kVMbO/9X6FpH*Mþ6&+ÐþÊ  4C4%df”­J2#4.#"3#>36327#".'>7>'#53&'.>761T™^™'<;%T)ñÅ-6"b Œ"S5268 jt&'V7  0 $ݦ -$a­P‹N(?",9J0* d2‚>2 "“" ‘  7Gd/9+DAL!Xÿÿ—°32"/&6;3+##"&?62–æ*æ–Èæ–È–æ*,úú„ùü|„ùÿÿè°%#5##!32"/&6;3353!57#5!èddd,ý¨–æ*æ–È‘dcÈÈþÔÈÈ,¼ddôü|úú„dÈÈýúd–údÿÿè°!%32"/&6;33!57#5!#5##!35–æ*æ–ÈXÈÈþÔÈÈ,ddd,Çd,úú„–úd–údûPddôdÈÈÿÿL°32"/&6;3##53#5#!35–æ*æ–ÈXddÈddÈ,Çd,úú„þ dûPddÈÈÿÿL°32"/&6;3#5#!35##53–æ*æ–ȼdÈ,ÇdddÈ,úú„þ ddÈÈû´dÿÿ°°32"/&6;3#53!5!!5!!5!–æ*æ–ÈôÈÈdþÔ,dþpdþ ô,úú„ÈÈþ Èþ Èþ Èÿÿ°°32"/&6;3!5!!5!!5!#53–æ*æ–È þ ôdþpdþÔ,dÈÈ,úú„ÈÈþ Èþ Èþ ÈLL!2#!"&546!"3!2654&^¢¼»£þp¥¹¹gþ );;)ô);;L»£þp¥¹¹¥¥¹È;)þ );;)ô);LL+!2#!"&546!"3!2654&&546^¥¹¹¥þp£»¼dþ );;)ô);;þoýýL¹¥þp¥¹¹¥£»È;)þ );;)ô);‚¾ $ ¾  LL+!2#!"&546!"3!2654&!2"/&6^£»¹¥þp¥¹¹gþ );;)ô);;þ ¾ $ ¾ L¼¢þp¥¹¹¥£»È;)þ );;)ô);ÈýýLL+!2#!"&546!"3!2654&#!"&?62^¥¹¹¥þp£»¹gþ );;)ô);;þû¾ þp ¾ $L¹¥þp£»¼¢¥¹È;)þ );;)ô);ÏýýL5!2#!"&=463!2654&#!"&=46&=#"&=46;546&¥¹¹¥þpÂ);;)þ>¿Dþ¼úúL¹¥þp¥¹d;)ô);déþä&þä –È– Ùמ#%2"+'&7>?!"'&766763 ˜,þ÷þó  P''þÒ K » ž  þS#þÊþÅ  ånnV/ÓþL5!2#!"3!2#!"&546&=#"&=46;546^þ>);;)Âþp¥¹¹ñDþ¼úúLd;)þ );d¹¥¥¹éþä&þä –È– °°1!2/"/&47'&6#"3!26=7#!"&5463!îmþÈ)8mþïœ);;)ô);È»£þp¥¹¹¥,°þpmþÈ)8mþÔ;)þ );;)”ÈþÖ¥¹¹¥¥¹¢¢#2".4>"2>4&2"&4áîÙ]]ÙîÙ]]ÃæÂqqÂæÂqqþ{ rr r¢]ÙîÙ]]ÙîÙGqÂæÂqqÂæÂsr rr L°#3232"'&6;46!2!54635ÂÈõ þ' þ… úþ…èû´gd°þ¢þVª^ü|úúd22L¬# ++"&=#"&7>!2!54635Gz ô"Èú 'ýùèû´gdžþM úú!¯üúúd22LK" 62"'&4?62!2!54635Œq‹ýóþÜ‹Ôèû´gdÓq‹ýó#‹ýÒúúd22L› #'762'&476#"&?'7!2!54635‡Ž*MÔMÒý«КÔþ=èû´gdÿŽMÔL*šÒý©ЛÔý:úúd22L°#'/'7'&6"/&4?!2!54635^WЛԛÒÃL*ŽMþúèû´gd°ý«КԚÒýPMŽ*MþXúúd22ÿì°¯% ! °þþÆþq¬ý3«gþq§üùæ¹dL°+!#"&546;!3#53L–ýD–úôdÈddèü®þpèþÔ,ÈÈEݰ/'&"!#"&546;!3#53"/&4?6262LþÕ_  •þÈ–úôdÈdd°jþ\ÊjO)è•þÕ_ “þpèþÔ,ÈÈýÎjþ[ËjO) °>'.!#"&546;!3#53"/"/&4?'&4?62762Lg†%þöþ·–úôdÈddöFƒƒF)ƒƒ)FƒƒF)ƒƒ)èþóg†þöþpèþÔ,ÈÈýŒF)ƒƒ)FƒƒF)ƒƒ)Fƒƒ—°/!"!#"&546;!3#533232"/&6;546Lþ¢þ –úôdÈdd–d–æ*æ–èþÔ–þpèþÔ,ÈÈý¨úææú—°/'&"!#"&546;!3#53++"&=#"&?62L¥*þùþn–úôdÈddëæ–d–æ*èþp¥þ÷þpèþÔ,ÈÈý…åúúåȰL !2!546#!"&5!52LûP“û´dL––þÔýÚ&þÔÈÈ}­—-1;&=!5!546#"&=46;#5376!!/&4#5;2+§øøþpý/22Èddþ‚÷þp÷ddd33æ*æ–È–þ…dÈÈýËæ–È–æ*yÈdd°°Q%6+"&5.546%2+"&5.54>323<>3234>^%È"%þá È"  d d 1tû®5gD‘ þ>?1) þA¿..@  þ¢^  þ¢^ d°L3"!5265!3!52>54&/5!"!4°"2þpKþ Kþp"2KôKL8 üˆ88 %Šþv% 88 x88 %þvŠ% 8LL  $(4!2#5'!7!!2#!"&546!55%!5#!!'!73£wiþÙÈþpdwþ%,);;)þÔ);;),¼þpü,¼þ‰dþ‰dÈiè–bbÈdÈ;)þ );;)ô);dÈÈþ÷…£…ÆÈÈføddÈŸŸ&767>".'.7¢.‹wfüw3À£ .1LOefx;JwF2 ï¢Â1vŽüevˆ/¢ 5Cc;J™|sU@°L#A2/.=& &=>2#!"&=46754>ü¸¦ud?, ÊþÂÊ 1;ftÊpR&mû´m&L!((" È""’’""È '$+ þä 2þÑ2ÔÔ2/2 !°° '!'3353353!2+!7#"&46!2!546LÈý¨ÈÈÈÈÈÈü®¼ ‰üJ‰ ³LûP¼ÈÈôÈÈÈÈüà*dd*þÔ22d°L #"!4&#"!4&!46;2¼d);,;gd);,;ýþÔ;)d);L;)üè);þÔ;)ýD¼);üà);;)ÿœ°L%)!2#!"&546!#3!535#!#33ȼ|°°|ýD|°°„þ ÈÈþÔÈÈ,dÈÈddL°|þ |°°|ô|°ÈýD¼ÈdþÔdd,dþÔdôdþÔ,ÿœ°L%)!2#!"&546!#5##3353#33ȼ|°°|ýD|°°„þ dddddddÈÈddL°|þ |°°|ô|°ÈýD¼ý¨ÈÈôÈÈdþÔdôdþÔ,ÿœ°L#!2#!"&546!#3!!#3!!ȼ|°°|ýD|°°„þ ÈÈþÔ,ÈÈþÔ,L°|þ |°°|ô|°ÈýD¼ÈþÔdôdþÔdôÿœ°L!2#!"&546!- ȼ|°°|ýD|°°„þ þÔ,þÔL°|þ |°°|ô|°ÈýD¼þ ––––,ÿœ°L )!2#!"&546!!!#";32654&#ȼ|°°|ýD|°°„dýD¼d‚&96)‚þ ‚)69&L°|þ |°°|ô|°ÈýD¼ý¨ôdVAAT,þÔTAAVÿœ°L%)!2#!"&546!#3!535#!##53#53ȼ|°°|ýD|°°„þ ÈÈþÔÈÈ,ddÈÈddL°|þ |°°|ô|°ÈýD¼ÈdþÔdd,þ dþ dÿœ°L#'!2#!"&546!3!3##5335#53ȼ|°°|ýD|°°„ýDÈþÔdXddÈý¨d,ddL°|þ |°°|ô|°ÈýD¼Èþpôþ dÈÈÈþÔdÿœ°L"&!2#!"&546!#575#5!##53#53ȼ|°°|ýD|°°„þ ÇdÇÈ,ddÈÇddL°|þ |°°|ô|°ÈýD¼þpÈ2È–dþ dþ d §§%2".4>"2>4&!!!'57!àðÛž^^žÛðÛž^^žÅäÂqqÂäÂqqlþÔ,þÔdd,§^žÛðÛž^^žÛðÛžLqÂäÂqqÂäÂÐÈddÈd §§'+2".4>"2>4&#'##!35àðÛž^^žÛðÛž^^žÅäÂqqÂäÂqql2ddd–d,Èȧ^žÛðÛž^^žÛðÛžLqÂäÂqqÂäÂÐd2d2dddddÿòÿÂA 62632+54&#!"#"&5467&54>3232"/&6;46÷nµ,,.xªªx€þÔÞPpVAbªz– ‰ ß & ß ‰Awa­ñ­úúsOEkdªbý³ þíôô ÿòÿœÃA32632&"#"&5467&54>++"&5#"&76762ön¶,+.yªxZþ† % þƒ OqVAb©æß ‰ – ‰ ÇAwa­xc¤hþ“sOEkd©cý’äþí  ÌdLm%5!33 33!#"!54&#¼þòªþòªþÔþÔªþòªþò2dd,,Mþ³þÔþÔd22y7›/2#"'2!54635#"&547.546324&546X^“Y{;2 iJ7-þÔ-7Ji/9iJ£›qYƒZ=gJiû22ûiJX5Jit£'‰œ*BJb{"&'&7>2"3276767>/&'&"327>7>/&'&&"267"327>76&/&"327>76&/&òoOOoSÙÜÙSoOOoSÙÜÙþ=y±" $GF`   Pu "Q9   ùcŒccŒcVQ:   Pu "GF`   y±" $òoþÕþÕoSWWSo++oSWW"±y  `FG # ‘uP  :Q # úccŒcc:Q # uP  $`FG # "±y  dè° "!#5!!463!#53'353!"&5+¼,´þ¬þ„ ?,Èd¢ÔÔ¢d´þu „ à þ„ÈÈó þÔÈüàÔÔÈþ  ‹Èà dè° !! 463!#5##5#7!"&=)+5¼,þ¢ýÚ ?,È>¢d¢Ôªþ | › ýø^ýÚG þÔÈü|ÈÈÔþd 77 P°ô#3!#732!!34>3!!Š¢ddþÔ¢ÔýÈ!,ý¨Èd!sððüà,ô Èd,ÔÔ+$dþ¢Â$+þpþpôLL293232#!"&=46;54652#!"'74633!265#535Šd2þÔ2s);;)ý¨öþº;)X>,>Xý´ÔÈÈL2dd2ú–;)üà);öFD);–>XXýæÔ¢d¢d¼L6=3232#!"&=46;54652#3#!"&54633!265#535Âd2þÔ2s);ÈÈ!ý¨);;)X>,>XœÔÈÈL2dd2ú–;)þ þÔ$+;) );–>XXýæÔ¢d¢ÿ¢Ô  #!"&762#";2676&35’} ,û, }@DÐ:#6#:àÈ­û°&77&P'þLþÒ.þ dd LL/?O_o32+"&=4632+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=46©ú  ú  ú  ú šú  ú üêú  ú šú  ú šú  ú üêú  ú šú  ú šú  ú L –  – þÔ –  –  –  – þÔ –  –  –  –  –  – þÔ –  –  –  –  –  – °)33#!2!&/&63!5#5353!2+!7#"&46!2!546¼dd^>1B)(üü()B1>^ddÈþ>¼ ‰üJŠ ³LûP°ÈdO7„S33S„7OdÈdü|*dd*þÔ22°+52#4!!2!'&63!&54!2+!%5#"&46!2!5460P9Â<:H)"¯ýZ²" )H¯¼–üJ–³LûP;))%&!‘‘!&þ•*ÈÈÈÈ*ý¨22°$.2"&432!65463!2+!7#"&46!2!546 –jj–j·."+'þ¼'+#þͼ ŠüJ‰ ³LûPj–jj–þë9:LkkL:9þr*dd*þÔ22°,62"&5477'632!65463!2+!7#"&46!2!546X/[3oœo"o£"."+'þ¼'+#þͼ ŠüJ‰ ³LûPk‹6NooN>Qo£þ 9:LkkL:9þr*dd*þÔ22°",!!.54>7!2+!7#"&46!2!546X,þÔ%??Mýî<=BmJþ¢¼ ŠüJ‰ ³LûP°¡‹9fQ?HS½TT¡vKü~*dd*þÔ22Èè)2!546754!2#3#3#3#!"&546/R;.6þp6.d6\¬ÈÈÈÈÈuSþpSuu;)N\6226\N)þG6.dddddSuuSSudÿÿLL/3!2#!"&546!2#!"/!"&4?!"&=46!'–„ü|¶  þåà % XýôW & àþß ªdDdLþ ôýD 2 à % XX % à 2 ddd°L#-7!2#4&+"#4&+"#546!2!46+"&=!+"&=È Sud;)ú);d;)ú);duè);ûP;ñdèdLuSÈ);;));;)ÈSuþ ;)þÔ,);þ 2222©¬  !&4762 !2!546ઃþýû 'Yþ¬V/þ«¢ ü|ýUYƒY(þnþª0Uü22!°/.#!"3!26=326!546;546;33232!½'þp'½q*}¨ý­20È/2‡úþ––ýŒ22,þÔ2°° "!#!5463!#5!#!"&5463!#5„, þ‰þÔ w,Èý¨, ýv  w,È ýÁ O,T þÔÈþ ýÁ  ¶ þÔÈÿœdGFV32676'&7>++"&?+"'+"&?&/.=46;67'&6;6#";26=4&äÃKŽjI C   )V=>8'"d 1*Ã) "dT,Ÿ| -oËtEú  ú GAkŠI ! "% ,=?W7|&êF@Je5&2WO_e_ 2  2 ÿœÿæ~ $4<Rb%6%32!2&'&#!"&=46#";2654&'&"2647>?&/&6%?6'.'.§. ‹ü+jCHf7ý" *:þÔ>XX¹P*† €@--@-þ˜ -?0 !3P/|)‚( )f!% = „÷ &* xÈ"6Ô2&„CX>È>X¬83 DÉ-@--@þÛ‚ # ³=I+E( /—/}X&+ 5!H d9°Q`o322#+"&=#+"&=#"&=46;#"&=46;546;23546!2>574.#!2>574.#q– Oh ..40:*"6-@# – d – ¯  KK  ¯ – d×)  )þùk)  )° m!mJ.M-(2N-;]<* K  KK  K – X – K  KK þÔÈ "þpÈ "°®),!2#!"&'.546"!7.#Ô Vz$RýÄR‚(z Œ}VG+œ0œ )IU!îzVþ`3·BBWwvXZÅ3 Vz™&--% óó,(1#þÂÈ„32#!"&546+"&=Û–g¬T)þ>)T¬H6–6¬gþ )TT)ôg¬üá66áÈ„33#!"&546+"&=Û`³–T)þ>)T¬H6–6–³þB)TT)ôg¬üá66á %'5754&>?' %5%ý‚þ†Nd––d/“‚\þ¢þ¢^^ÿþåª<à–Ç”•È–ú  (Aýb¦¦“¥¥dô° 2"&4$2"&4$2"&4¼|XX|Xè|XX|Xè|XX|X X|XX|XX|XX|XX|XX|¼L2"&42"&42"&4è|XX|XX|XX|XX|XX|XLX|XX|þÈX|XX|þÈX|XX|ddLL/!2#!"&=46!2#!"&=46!2#!"&=46}¶  üJ  ¶  üJ  ¶  üJ L –  – þp –  – þp –  – °°/3!2#!"&546!"3!2654&!2#!"&546!5^ô¢¼»£þ ¥¹¹Ëý¨);;)X);;ý±ôþ G°»£þ ¥¹¹¥ô¥¹È;)ý¨);;)X);dþÔ,dÈÈdd°L;!2+32+32+32#!"&46;5#"&46;5#"&46;5#"&46–è222222ü222222L*È*È*È**È*È*È*,è£ *.62"&%#462"&%#46"&=32ŠW??WW??þù|°|°¼°|°ýÀ|°|°¼°|°°*(£C²²BB²²þÀ°|°||°|°þÔ°|°||°|°þÓŽÿµÈ”B76+2+"47&"+".543#"&'&676/!'.6éE*  '?)’¸ T ¸Ž0I' *L #3¶{¶,# nþÙ  6F82 þà*5#"#!#4.+3#525#"#5!°2 &È2þp"È& 2èýD d È2d ô„ ü®dd R ,ý þW 22© –L® 05"'./#!5"&?!##!"&=463!2èþßEþÔ  1;E%= !'þì†y±üè,2 " ëý# 22+.°¦"A2‡Vþªýãdd°°GJ!2#!"&546#"3!26=4&#"'&?!#"3!26=4&'"'&'#&#2Lû´FF þÕ&  7 ? 9   9 þàÅg°û´LR ý  2 2 £™ 2 2 $ì þ°°#'!5!!2#!"&546)2#!"&546!°ûP°û‚þpmþpG,LdÈü|„þpdþÔ,°°#'!2#!"&546!2#!"&546!!5!2þpmþpG,ÈûP°°ü|„þ þpdþÔ,ý¨dd°è'+!235463!23##!"&=##!"&546!2dddþpdþpŸ,èþ¢––d––þ¢ þÔþÔ,°°'3#3!2#!"&546!!2#!"&546ddd–þpG,þ¢„ü|°dþpdþÔ,þ þpdL°'+32+!2#!"&5463!5#"&546;53!X––Âü|^––dÈ,LþpdþpddÈþÔ,°°'!#3!2#!"&546!!2#!"&546°ddývþpG,ü®„ü|°dþpdþÔ,þ þp,0o€ #"&54632aþî5þèþ*A2„~ 6'&4Oî**þ{î)ü)î*2A~„ !2"'&6dè)þ*þ„*þî*2,~o #!"&762{î)ü)î*aþ**î°( 5-5!5!¼ýLþc¨üà å¶þ½ÝÁÁÝûØÈd°° 1#3!35#5!34>;!5".5323!°ÈÈþÔÈÈ,ûP2 &d2"d& 2üà„dd,ddþ  ýÚdd & ,Lè%1#4.+!52>5#"#!#3!35#5! 2 &d2þp"d& 2 ,ÈÈþÔÈÈ,¼ ýÚdd & ,üàdd,ddÈfrJ32 +"'&476½  þ0Ð   þ)× J þ0þ0  ×× >fèJ32+"&7 &6S  ×þ)   Ðþ0 J þ)þ)  ÐÐ fÈJr"'&=46 4 þ)þ)  ÐÐw   þ)×   þ0Ðf>Jè ' &=4762j×  þ0þ0  ×áþ)   Ðþ0   ×Ùÿù=°:#463267>"&#""'./.>'&6è°|°þVd&O "(P3G*+*3M, :I G79_7&%*>7F1“ °|°|°ÈÂ5KmCKG\JBktl$#?hI7 ÀÈ„°!2+&5#"&546!5úX–ÿ–«,°þpþ ² ŠdddÈL°!2%!#4675úî'=ýDXýDd d°Q,ü[u¶}ü4ý]ddMoÃ__<õ°Ðvs—Ðvs—ÿQÿœÜÿ…ÿQþÔÜ£¸(°°d°°°pŠŠ±EØØ¢HE°d°{°È°Èô°ÿò°°°ÿð°°° °d°ÿÓ°ÿÓ°°°°°°&°n°°°°d°°d° °d°°ÿœ°d°°°°°°°d°°d°°°°°°°°°d°È°°°5°d°È°ÿµ°!°°°°°°ÿœ°°°°Û°°u°°°° °È°°°È°È°È°°ÿþ°,°d°ˆ°;°°°°°°°°°°°°°·°·°°°I°°°°]°ÿܰÿܰÿŸ°d°°°°d°ÿÿ°°ÿQ°°°°E°°°ÿœ°J°°°°°ÿœ°a°ÿý°°°°°°Ä°dÿØd9È'dÙdddÿœÿœÿœÿœÿœÿœÿœÿœ ÿòÿòdy'dddÿ¢ÈdÿœÿœdÈÈddd,ÿµd,A22È>ffÙÈÈ****²èèNNNNNNNNNNNNNN¤"~†¬äFnŒÄ2b¢Ü\ºrô bÊb¾ 6 „ ¶ Þ ( L ” â 0 Š Ê  X * ^ °h´(¦æTª*v¶ 8|ÀtÐ*Ô<¨Ì6`°þR¦.j–°àþ(h”ÄÚî6h¸ö^´2”âDl”¼æ.vÀbÒ F ¾!2!v!¸"@"–"¸##"#8#z#Â#à$$0$^$–$â%4%`%¼&&~&æ'P'¼'ø(4(p(¬) )Ì*&*J*„+ +z,,h,º,ì--ˆ-ô.(.f.¢.Ø//F/~/²/ø0>0„0Ò11`1®1è2$2^2š2Þ3"3>3h3¶44`4¨4Ò5,5ž5è6>6|6Ü77N7’7Ô88B8†8È9 9J9ˆ9Ì::l:š:Þ; ;Ü<:>Œ>Ô?(?n?ª?ú@H@€@ÆAA~BB¨BîCCBCvC CÊDD`D®DöEZE¶FFtF´FöG6GvG¶GöHH2HNHjH†HÌII8I^I„IªJJ.JR§@.Æ j (| ¤ L² 8þ x6 6® ä ú $ $4 $X È| É0’ ÙÂwww.glyphicons.comCopyright © 2014 by Jan Kovarik. All rights reserved.GLYPHICONS HalflingsRegular1.009;UKWN;GLYPHICONSHalflings-RegularGLYPHICONS Halflings RegularVersion 1.009;PS 001.009;hotconv 1.0.70;makeotf.lib2.5.58329GLYPHICONSHalflings-RegularJan KovarikJan Kovarikwww.glyphicons.comwww.glyphicons.comwww.glyphicons.comWebfont 1.0Wed Oct 29 06:36:07 2014Font Squirrelÿµ2 –     ï !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     glyph1glyph2uni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205FEurouni20BDuni231Buni25FCuni2601uni26FAuni2709uni270FuniE001uniE002uniE003uniE005uniE006uniE007uniE008uniE009uniE010uniE011uniE012uniE013uniE014uniE015uniE016uniE017uniE018uniE019uniE020uniE021uniE022uniE023uniE024uniE025uniE026uniE027uniE028uniE029uniE030uniE031uniE032uniE033uniE034uniE035uniE036uniE037uniE038uniE039uniE040uniE041uniE042uniE043uniE044uniE045uniE046uniE047uniE048uniE049uniE050uniE051uniE052uniE053uniE054uniE055uniE056uniE057uniE058uniE059uniE060uniE062uniE063uniE064uniE065uniE066uniE067uniE068uniE069uniE070uniE071uniE072uniE073uniE074uniE075uniE076uniE077uniE078uniE079uniE080uniE081uniE082uniE083uniE084uniE085uniE086uniE087uniE088uniE089uniE090uniE091uniE092uniE093uniE094uniE095uniE096uniE097uniE101uniE102uniE103uniE104uniE105uniE106uniE107uniE108uniE109uniE110uniE111uniE112uniE113uniE114uniE115uniE116uniE117uniE118uniE119uniE120uniE121uniE122uniE123uniE124uniE125uniE126uniE127uniE128uniE129uniE130uniE131uniE132uniE133uniE134uniE135uniE136uniE137uniE138uniE139uniE140uniE141uniE142uniE143uniE144uniE145uniE146uniE148uniE149uniE150uniE151uniE152uniE153uniE154uniE155uniE156uniE157uniE158uniE159uniE160uniE161uniE162uniE163uniE164uniE165uniE166uniE167uniE168uniE169uniE170uniE171uniE172uniE173uniE174uniE175uniE176uniE177uniE178uniE179uniE180uniE181uniE182uniE183uniE184uniE185uniE186uniE187uniE188uniE189uniE190uniE191uniE192uniE193uniE194uniE195uniE197uniE198uniE199uniE200uniE201uniE202uniE203uniE204uniE205uniE206uniE209uniE210uniE211uniE212uniE213uniE214uniE215uniE216uniE218uniE219uniE221uniE223uniE224uniE225uniE226uniE227uniE230uniE231uniE232uniE233uniE234uniE235uniE236uniE237uniE238uniE239uniE240uniE241uniE242uniE243uniE244uniE245uniE246uniE247uniE248uniE249uniE250uniE251uniE252uniE253uniE254uniE255uniE256uniE257uniE258uniE259uniE260uniF8FFu1F511u1F6AATPÃsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/css/0000700000175000017500000000000013642116632024035 5ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/bootstrap/css/bootstrap.min.css0000600000175000017500000045171313642116632027363 0ustar jpjp/*! * Bootstrap v3.3.6 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}} @font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAFuAAA8AAAAAsVwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABWAAAABwAAAAcbSqX3EdERUYAAAF0AAAAHwAAACABRAAET1MvMgAAAZQAAABFAAAAYGe5a4ljbWFwAAAB3AAAAsAAAAZy2q3jgWN2dCAAAAScAAAABAAAAAQAKAL4Z2FzcAAABKAAAAAIAAAACP//AANnbHlmAAAEqAAATRcAAJSkfV3Cb2hlYWQAAFHAAAAANAAAADYFTS/YaGhlYQAAUfQAAAAcAAAAJApEBBFobXR4AABSEAAAAU8AAAN00scgYGxvY2EAAFNgAAACJwAAAjBv+5XObWF4cAAAVYgAAAAgAAAAIAFqANhuYW1lAABVqAAAAZ4AAAOisyygm3Bvc3QAAFdIAAAELQAACtG6o+U1d2ViZgAAW3gAAAAGAAAABsMYVFAAAAABAAAAAMw9os8AAAAA0HaBdQAAAADQdnOXeNpjYGRgYOADYgkGEGBiYGRgZBQDkixgHgMABUgASgB42mNgZulmnMDAysDCzMN0gYGBIQpCMy5hMGLaAeQDpRCACYkd6h3ux+DAoPD/P/OB/wJAdSIM1UBhRiQlCgyMADGWCwwAAAB42u2UP2hTQRzHf5ekaVPExv6JjW3fvTQ0sa3QLA5xylBLgyBx0gzSWEUaXbIoBBQyCQGHLqXUqYNdtIIgIg5FHJxEtwqtpbnfaV1E1KFaSvX5vVwGEbW6OPngk8/vvXfv7pt3v4SImojIDw6BViKxRgIVBaZwVdSv+xvXA+Iuzqcog2cOkkvDNE8Lbqs74k64i+5Sf3u8Z2AnIRLbyVCyTflVSEXVoEqrrMqrgiqqsqqqWQ5xlAc5zWOc5TwXucxVnuE5HdQhHdFRHdNJndZZndeFLc/zsKJLQ/WV6BcrCdWkwspVKZVROaw0qUqqoqZZcJhdTnGGxznHBS5xhad5VhNWCuturBTXKZ3RObuS98pb9c57k6ql9rp2v1as5deb1r6s9q1GV2IrHSt73T631424YXzjgPwqt+Rn+VG+lRvyirwsS/KCPCfPytPypDwhj8mjctRZd9acF86y89x55jxxHjkPnXstXfbt/pNjj/nwXW+cHa6/SYvZ7yEwbDYazDcIgoUGzY3h2HtqgUcs1AFPWKgTXrRQF7xkoQhRf7uF9hPFeyzUTTSwY6EoUUJY6AC8bSGMS4Ys1Au3WaiPSGGsMtkdGH2rzJgYHAaYjxIwQqtB1CnYkEZ9BM6ALOpROAfyqI/DBQudgidBETXuqRIooz4DV0AV9UV4GsyivkTEyMMmw1UYGdhkuAYjA5sMGMvIwCbDDRgZeAz1TXgcmDy3YeRhk+cOjCxsMjyAkYFNhscwMrDJ8BQ2886gXoaRhedQvyTSkDZ7uA6HLLQBI5vGntAbGHugTc53cMxC7+E4SKL+ACOzNpk3YWTWJid+iRo5NXIKM3fBItAPW55FdJLY3FeHBDr90606JCIU9Jk+Ms3/Y/8L8jUq3y79bJ/0/+ROoP4v9v/4/mj+i7HBXUd0/elU6IHfHt8Aj9EPGAAoAvgAAAAB//8AAnjaxb0JfBvVtTA+dxaN1hltI1m2ZVuSJVneLVlSHCdy9oTEWchqtrBEJRAgCYEsQNhC2EsbWmpI2dqkQBoSYgKlpaQthVL0yusrpW77aEubfq/ly+ujvJampSTW5Dvnzmi1E+jr//3+Xmbu3Llz77nnbuece865DMu0MAy5jGtiOEZkOp8lTNeUwyLP/DH+rEH41ZTDHAtB5lkOowWMPiwayNiUwwTjE46AI5xwhFrINPXYn/7ENY0dbWHfZAiTZbL8ID/InAd5xz2NpIH4STpDGonHIJNE3OP1KG4ISaSNeBuITAyRLgIxoiEUhFAnmUpEiXSRSGqAQEw0kuyFUIb0k2gnGSApyBFi0il2SI5YLGb5MdFjXCey4mNHzQ7WwLGEdZiPPgYR64we8THZHAt+wnT84D/x8YTpGPgheKH4CMEDVF9xBOIeP3EbQgGH29BGgpGkIxCMTCW9qUTA0Zsir+QUP1mt+P2KusevwIO6Bx/Iaj8/OD5O0VNrZW2EsqZBWbO1skRiEKE0DdlKKaSVO5VAuRpqk8VQJAqY7ydxaK44YJvrO2EWjOoDBoFYzQbDNkON+UbiKoRkywMWWf1j4bEY2iIY1AeMgvmEz/kVo9v4FSc/aMZMrFbjl4zWLL0+Y5FlyzNlEVYDudJohg8gPUP7kcB/mn+G6cd+5PV4Q72dXCgocWJADBgUuDTwiXiGSyZo14HOEQ2lE6k0XDIEusexDzZOMXwt1Dutz+tqmxTvlskNWXXUQIbhaurum9GrePqm9Yaeabjkiqf+bUvzDOvb2Y1E+EX2DnemcTP/zLcuu7xjQXdAtjR0Lo5n4/Hs/GtntMlysHt+29NXbH6se//WbFcyu+r28H0MwzI30DYeYTLMXIA2EG8QlHpAsyS0EfEToR0a3utIxFPJ3kiIHCCrZ66b0e2xEmL1dM9YN/MwS5p01N5jMX/BLKt/1R83l0LyC29M6+iYxo/UNg/EF7c2WyyW5tYl8WnhWg2/hyySbD5UhnDyS7OcU0dnrFw+DfGdI7v4QfYIIzOMq9hFtY55gmvC7jZ2FK7sEdrn6IXBuucYhjsGdQ8z0yEbWkkczjjsE5hNAIZrPx2zOLZDmKNXcXtg7EMqidAEEWg+SJCBBNwxvxJfc/bZa+KKf+xoKZybnq5vaqpPTye7CiF+ZFjxZ8/7Qij0hfOG/cowPA1rT1l4ymWnrKmxxqfErTVrpgwPlz1kC+Oy8NMDz6c+IO38K/x0xkPnLW8Kx6qGAoQdL+TD9V9rb+/ctn//trxz8dUrZrD/zk/ferF0cNt1BzctmX2FZPXt/jnFCQNz4Ah/iKllGiCMs1w5Lkg0kiEwj6VTXCDKsX9rMpnvIj9pcDecXAIXMnqn2dTUbN6w0XQ9ue6FV/nnXCH7S3lPWGltVcLsH75ub3ab7A8M28caNrIeOr3o5Q0yFsYL80xaa0EY/UEczV7icUMY5pnelAkmUAXmHYjvFWFGxuqlSaow3OM+/iYY7/l/hVELF4EjRqNR/bvRbOY+DUGzGR/Oh3EqmE/ugIQQguGt/eMYz/+L0cimjeZfQDI3phXMbMQsqH+CjwVz/hf4idHovgVmB8gLvjbicDcC/NypP536E/9N/puMibExdohBmNwyiaZdJGoigos7GpF222xrfnZhML/7Z+ylaqP63Hr+m7bdUkQ6/2cXqdfmvwixY+s2ksXFeXcE+iX0Z+Iow76DBNgjJ7TOdUK18iPsPflfQD+DPsZG2Aj9VmKMMJ4fYRrhIaxhTDR0Elh2vA6h/AE6xUb29mj3sjmL72petXjejPy+oel60M99tFduCI59N3221xe7apOvxs6aHs7vab1IqY2tv7q2xsHeHGml/cV06u/8S/xTjJ+JYc0bWEX0ukW6YmIbGkJRMdjJ9mYIH5QIdJF4hvRGyK7cC7ctImQRcUET99fGXOoft35GYLMQu+g2smnkgZUrH8AL/9Si217IssJ916nv14ZrJrvdxLkQvrvtBcjgPC0NXOicO8Qf4mcxPqh3hgUw3DDfdvLJXngg7N3dN2zbPJSaed3OfZnMU7dvmznp3C3bruO+Nmue0LFsy7S+6265+fCKFYdvvuW6vmlblnUI8xCXp37CrOZv4B9gauDBlYp7adcUXB5DNCwYImlXOJJKkAdvExXxVvKEYnCo+3eIskP9qrrfIYs71CccBjfXRC52udTHHdaP1A1ui/VvH1otbrLrpNXBsGX5B89QghDyimlvNB2KfkxZ5C9/em3+d1+d//IfFp2+2Oxn/s+9n/79p39S3s8idN6g0yZObwJOgKUpNB3GyU0Ls0PbRzIRq4lcarLKOJBkLRzJQD4j2090XrbA7DW8K3jNF5hlGS5e4V2D17zgss4T20egOJte5iD0bReM9yjTxnQxCRj3c5kFzGJmGbNKmwGw39IJDJcXJZGMkaAB4jyJAKw0jt5IAuIE+A+U3cVAZZrq9zhDyBrU8oosuxcGNTzCKJfla7JjNVmuSb/+tuzN2H+X4vlB+PpdfMXXmuVsNiub1T34SFbjYw5itEvVi0K0Nt9pNJUMI7SLGRhf2xipfCYf8z5OdlGKayOucFeVPeS/dbo3lBrbSMmwUiQN5/ed7g0Ds1s17IuZC5kNzM3MZ6EWCa0DtekdJfAxz+R/OX28sND7yRMTBcf++s8mQCQWHya4qBv/ufeMoWyslPA9DtMxUknxkH/yfTnm2CMYzs+Cq3r7PxY/MXomrvTEsRpfEGHa+WN8E1AHjElb7d06ddA7oK/+5Mdsv9EtPms0jv0Z5kf1FqPxWdFtfFr0kHfgDX0Y+5PRSG7RUj0tQr7rmfX8DH4G5W28kKeJLtmQsQkuwMP1pk16EV4sl7vrMJATfyUWo/GwEco4rh4XFQgaiUX9qxZHrMQqKnz/c2d8b9TysYrAuXpP/Rf/Gr8b1qwwc5a+euLa6S6sneNXToG2XrEJi4R5SGs8Sq2S3d97bsfCRaTdaLwKClRHt37mkudvXbjwVrLhuYeGhh56bvfQkHpk2CwvwClqgWwuBfndC3c8dwmstj81KkagcUgbfPY8Zje0W/82VPWJHmSq6pP8hPWpotc/EexDOK3qU+wngPhOCiO9MJRm8TJefjelrzoKnG2Bn+1NCUmPE4gHFmBN9jrTigRIpsACrc9Gstg58ULkp9467+Gf/eFnD5/31lNrt2967dhrm7bzI+VT5m+fzKhvf2MzpICEm79Bopkn07lt1762adNr127LwVqQLdJ5+lpQDcvHPQtVY5knhYrK6q8/JsiP6EuhGZdFdaNszjvpqvc+PI0CdjN0AXsFOC3ZfALDJwr4q2Xq+GF+GNbsxUg5NLLIEXi8otcDQcUts0D8eQ1iVDRAMBTsYiNdRIxE09EIBJO9A2xqgERTaW86BUFn0OD2xFO97FAgFhF6OoQ7prYt4XwSeUgQHiJyDbeke9IdQntciLQ1FlJMaYcUNvZBg+FB1ubjlnRNvl3o6IEU2w7fdNPhm/hh+FLysUu6++DLHkOkrSHYEjH0tEPe7WdD3uyDgvAgK/m4szFFR7ch0toUgBTdWHr7EpaWru6+6dmbbnqWEbV2EtxAsXiZAPTtGPSbHsotI2leoM8TePEqgSQprs7AGFf8kuOkPdZPXGb55POAW1d/jLST9v5YflasP6v/CO7+GNAPC2BMZWmsOjp2NNbfHwMCJD+LPVL+D/OYlWEEI/9jpPddOFkB5d1GSuKZYggmCCd7JUxD7EXAzxyirYnNDLdDZoFdx14kivkvGc3579Jm36reTTvDgBnaO6vzyQ6chQmlsMoIkIQ2+bBDWBud1Va4pcCn8CPqxlh/fgtG8IPaPH8C5wk6/nZDv69jurV5QhtwE0x2iqOsj9Mx8B9/0EaUdiPfOYYDCi/q9jhWRuupMDEU0+CtX0sDFxv07T/K5niBPqN9+tQjgEc31NGCXFeMcCEuQBIc/BK4CO78u7EPYvl3yaEfK3vcb6qP1R2tI7vUjVDDUdKubsSrNjYKY1qBEa2P50SJoaXiksIoLiCwnxS6EBuBde87botNfdEWwYvF/R0/u5yCqhGeEOR2ynSeyXjt6ka7neyye8kryBSWE52y+RBgogrXPZ8E1yIHoHIFUM+AbJhE7lbMtt8ApL+xmZW7PwbjAO0fAVoXQOuiSP/ksIVdFZ0aulsamKUzwPZ/NYDMJRBPCxsBqLzqHyneXF6Ej9HlIFo7+pg+jUb3unRmGpstGkm6etOuDBGA5wCMefp1gTHcdZlvPBXlOslvYTp1cd8UjYLVd/J5awNrIOKLnIt9MD9qdrKrWCvA6ALm3QV9VrsPm60Q7+RHJHP+2hqfugo/MvI2H/mqr4b9tFnKSRY1Y5Ek80Nm/WIhr1ikKnxGz9TWXrokf9xwujfvcOTtNTWnxd0F37Y2W79tteBqZ4G5qLCuomw+nSr28QESCRVLTyYKILGJOPfcnaIFOsewhRdvv+rWa/Wih0vlbX6Zb75T5C0qNKVFvH1QL/vazSWgC2s6oWXXIuUxQelKiJbowuJDQViatLmLijg9CQBMg8WiPgiw3LEeYRmm5f+XdnvkDnxLLjMLxtvX74C3OlwPQqx4xwIdpPx38LrlDphiyWUWHWKAzzxurS/xTo+P5wGFak62ap1PVFFN4v/y+xuR39WnIO7lsWfwgVsK17wxrs9K8ltIKuhkw7f/6dhK6gQokFKhWX3urrjk/rnI0pgfpGMeuQIUaEM7+GF5q2iMkCaMQwxxOzcvU0eXbsnS9XknXvP7Gtw5dwPXlFu2ecvSHEZgNDsU6x/GdXBYXyOQjzZReSedeEPY6nEv9gJR4oBQJtFO6Kd0fwC6BO4LNHDeBujB6dSNcUQC9zIv2LnAzGk99bUDrdFY+9yGFQtEo0GQPNv6vS2drj4+1jHbv3aJSMUWP+QTZrmbNTjU8wyG/iXNNpskybLcJ3CiTF5Ir+JYzmJwE0mSVhlxbtbmvweB3ulB6Til5UuUZydpgiFVeobhU0WaBqpJ198d+/XeNRTZ9/1OPfG7+2hwzd5W3D+hmyjsRcUg/+Cavb++Vh2ls3L7zT/etOnHNxeerv313vzLVqPai4nJv+K1FC6040/4udw7sAb3laSg0XCkAAs0npBO6VJabS4Elk/U+D4gTXW+j0wnrMlqNamq4tMIYB87tE10i0FR3LZNhJsb7/R561btmes8YBCRkhYNByRtKd55mqTas9FYhJnbRGHuOh3M4QTdgQSqmgRxuzGdSvZGcbMxNQGk5C3ebLjoXIOFM4l+WKHmLTJwRv9E8GWJ6dYvf/FmEyEGr+gyrr1p5zrgkz0Cw2j94Hv8Jdx7dIVegBSNtgsqGsRQEYiIBoXwD0LNvQ5d7s5Z00QzwNhqZA0b+tMG1tQq5nd84uq8R0zPvX35G8uRaze4jcOHzz0w1+Q2BIRvf6J6Kgatnrbiem+CFvAxfkrndzD9MFPP1GWTUHclpASUkCNAQkpCCcCgDSUDAhDZ+CuEkgn8J7i9nMA7pA4lISappxILKfAeSAbIcSDuN2bJcfZILqeO5rLs0MnngSHYRdrHjmaz7JEsEPw51ZqDJDmUIOZIe34WaQeegNsJn1qz8AIpT3yCjyEih/xELkuJ0lEMYTLVCiWpo5oYMleMH6USyYJcD+uOe+kWKpn1Qns34iyYDjkSLvgnZXcgVQNeqINXr48m3iS7cjm8tedyY0f1QvTnHHdsrKby/+SSbPY8/NH6vpl/Esq3Ae4ZU1HC44KFiI9o7CEgab/RqHbj7s5KAg06s39ZP/zxI/mVuF/TbTSy+3Fb8If9/cv7+wt91yy8RfP1QXtW5RzQn7qIiZyuFM5QfJ5E9uVnqT85TanFx0lkP3ukBAMprvsRyi/C8NAJL1xbIIirSvnSj4O5netb4JxmNANHPssHAcHMHsFRgEug816gDBeMbdfiuRcghqYcm0+Xxx/5IAEtN3fqFF3LzAXqwoT0PN0OVTNqxo8sxMkd5Ig6k79Zk7VxxX6gMLOZFQgvpW2RrMW1D0BDihaXQ9wVRoBxPLfpknmkeMtoB/qM9cRc9IqmMD2XUmdZ7GSRKPUZvChf8BoykriM2MnKYbOHX8R7cLdNCxSFFVQqoYswnlWtlFS2mNkhswVpZiQW1J/UKFfipHGlUkM6UKBhMz1istELIHJLMSctu3ugzfaVSOjKvUgc/THK4Sdg2Wscz69leKIkkrwuuWiOe9yGYKQXRumkC3qbRcMwrvhjNXgdZk3RxAUEhuSPvn3nnd++U/3vlVOmrJzCD8JLxV1OHRjrZifbcFDOuRNTGqdgQm1tSNJ2OcQ04YiEXuxtII1ECSQRoQGYioEsgCfchB4ghAtw7FfJre4WZ9hkVi9MtjuWqtdNDlpMrfEG9fOT6q21okg+e4As38MfGquNt7oUws6Ysarj1/efE+yst86YUVNvDdts3Pv5c8m/aP0C+f8/Qb+IMnGq09BgwN01oIOAnAdagI8mBSrqk1gxTDUBOtk2ousEtBH2z4Ir2d3f6k8PXXVlt2qN9RODxRuoJT/v27wm09jRYVc/e++iyx2tyzJb/n3J0htXP87eSsQaf2Ly0s6Zmxela88REy1cf4273mI3iXNJ7KxrZibOm9xm6rl4fqy/t27smU8tOfdW2ucBzg2UfmOIVyLIl3kpYlwphDISTXJXsctmiDtN7fNV6zelgxwnWxsVr83Aj/S5ki1jL/a0GC6+2L6Um+aoddlNFuj+bJ8mH/iaLh8I0/U51NspIEfq0dohwyFXKgm4NggwQ4rRhCOUFtxxo8XnitT4cnGfT93IS8FaT85XE3H5LMY4zIEPL1hw443wz+1UmhTJyJGxZzw+wsKkKZgUiVtKOKMEb2AKHTv61FNc01PQFwKnvsZ/9pPA4RKTASWahmh+8MxwzHxKy74IRn5LGRjsPUUwTu64UYNY38caqd7HKucZ/tHnODtENw/2UfHRMaq1UUPDJQ0OKkWCeet5fYOhII1VRz8+/Elg5j4Gxur3J8o2PJ4rg+2d08T/fwEzSVbyZ9XPro95T477lRKqUSRXQnauHNsISAl27oWi6Fv9z48JMv8r/aMMj8onCP/DuDZOuN+GPPr/+p7bx+7JlbYdppcNhzKU/1Px5aiaGDn/s1iGMaBcleKUo/v9rcxkZj7DBEKOfrayytXNLYiUdBY+pleQXdnscKlQcpzuWluxsieeyuXIK6SdxozitWyGOV3vOHHjguyCQ6fpIYy2JwvrQEF/Qa9Pdf/QqOSqCiE/EE1/XIVKTc2tzWbHnimrEd+Vyz311Ml3P0GVTj7PD5aDnsvCvH36alEaPMePcMegXs7x8igTu4B9v7G9vTHvhCu/kzIdx+BxC0ay9zRSvoS0F2lIxI+X7klU63I40gLQ3w5ep5na+SFnba3z5D64zv+QtM4n4ffG3tq4aNHGRfxgrXPMim+5487abL7xhdseIRn1KDl+7aINixdv0OD+JSPwKf5+xoP6aiTeQIDVlIhMcL1H5R9PYXvprs3fv2bO7MOplCmweuiq2JRZ1zz+9a/v2PH1Hfz9236w+ZrPXvWfAxlj4NLLHpq3c/PQ3uvmvbrjG7fe+o2y/cLdtE6VUlXi0ASb1VLUBVSUWSU4HdvAraTyS8xzM8NxvxFkXV6pUVRiJwcgC5zEeht4rwcp7ki0k41G0qlQhG1Vzlq8alEmnFi58caB5Q9vn988MLhqyVlHvLEWjtQFeupdiocF/tkkOGPW2ibWaBTkeZ/dvPWazXfOnnvL6jkRXpi85sFzZt+55ZptW3bl1cCCHZPD06MhySha7UFzjcjbp8fOecFCirzAG/yVjBX6OFIaadSjQq1nNhyIe8tVbaaSdHlXIWKacMeuZA1uxS95zILhyrxAdsXTL6m7kNQlx2P9uZf2qhufePFFbpI6/OU0WcP99RrCsrwseVot5mtytpf6Y0gm9sdeyKnPQ7onyK4nXlR/rg7H95M1upzu89DH6pgUcikoiihJ6NJKmRxV1x+MJiOA3YwhDRQrWU0u/0rvq0VYXnyCwsLeTJYBq3dAtJDavuzyoVpzZ99Z0+a0uoiFH/xcqgDR7rUFeOrUn6Cywb8ZeNMbhLV5ugP9l0zv9UN5b5mFkjzxUcpPJCn3V402pRxtJd2GrnLdhtVk9ZSZh9W91fCSH5B7ofxPiWL+j3D/uwhBRdyAyozeZwvQzs79soi+BKSnafLviZCcfrpBpLyimfLfTyJtbyruIQKD01tUwJyKEo/ybaxkSNFUMdMkhQoJyRBQFhnUkDQSXhTM+3NmY0EDM7ffLIjqWEGt8lCO6mLia3PukFnghosJD5p5SIho/VDkzQfLE+IrYoJXkD19pdP7OwG/voIUtagiWiZ4PAFTHHlTVhRZ7dYmPar+NJ+8JhmR6DFK5DV1foHoLNO/pHrvZfmWZ15RQlwvoVDKhCWNK3CCch9lfFBuAqUgpFSShmNaPj+i5++WZfKeViJfW5HnUakVL4UCNVkA4+ETfIqx4B5xSaP2L1yn0zn2ltPn4+OqZGmwwEVCaCSqG53ldtL1oLGAhdMLd09MpCCF6tD6ZnAZBY9hDaYsP0jzZ0j5ZjKsF4i1UmLuhbJMCnYJPt5VwFNvmZawXjEvLJqIH8STonZjq7BZ8gKgR20C9MDFqJAX1H64QW2NEup6qgzLP8cvppL/NNTOBTCJABOHeWoXzLhw4Wuy7gaBtjKr9kgKq8ZlRYBS32Lpxc8vIhpNDTfyNXWybMJbn2RyQ5EmWc2QF9wmSZ0KYCE+cPuYO6b15Uotj2Kd4MItLS7gtFbkTdrFND6pvEZqv5Yv7jXAus7Pg7avo7KDot50NX3CPkP+Kps8J9/3mGQIteY/LGPC+L7872SPR2br5fy8MtKBMHedGuM28/MZmPJMrGgi3Gb1S+Si1/L/zrZwO9XH1ce/z7ZQ1WSoY/+pMb5FT4ua0Wm+Jf/298nFmChEQ+Ti71est4mq9VYI6RsymoRJKYidElT2FGnDTZvqtfhGAFTbeqEw68GqtfmbVa/1IFO1/jdWr/8BDRRtQh9XNjubEm4aWVpVonpTGR7PVGc+KJNoBIWF7kYi4gUV3r1U6723i6TxUl3n3/tM27aZfKb7THiHW9VzFSwHJ05VfK6Ar7kaB0XgPPE0BSkSFKsBUpaLihEWoA9wBt8qirh2VSOkZwXEwyrxZ5jyt2rJmSo9gX7cg6jsEUGJU9z9xJPOEM3uQQxKgkh35DNATnVyrmJ3mbCNyIB/yox4wH1bg2DwN7q9kov4pFqny8oSm3RQbGgJ1QQTs6ZMLilOVYJ9v6Wha3HcJ9jddsXp9YhGUXLXt/qMDnvLpPNTXfNa60z5/yjXQOMq+lNmwh5egpYrdfZQZV9rI47xlRkuyTjpzsmCBSWNkAXVoK8sgYWqQJWbo1RLo6QH0YW6pxqfCnRgkd+RiFjUQUQ7poIaYoakgXxwFd9BuuI38H1xBxXSFb/pBDIKQFn7YB3dB36l7sG1FLaKiBdp1KxLvfswap/30lnVESgNnvjbUoT6w9N+Xoio0qcYOIM+heg940YimsucQVvli9NEcft2UZwGQwLuilj1fFr1i3NP94X+PE7Hpvtj6lBJfJ4R6NvWiaL6MgzWHxiN66DExa+dAdAbMYX6HVF8A+7rjEZIXAVbDe7PVI9rmN69JOLV1DOSvRPxWNPZBZf/Nf+Ny65BhYxxxV+77XJ2wfQ389/IQPgajXbwMsuAz/0IaQcXJavKbRqR2IqyZruXjVC2+hdee/5vdnYOedpmVtR3NGXldxSzDSIiBVpkGb9by89UpEPKrSLZmyFDzMab/wXl2CNe7s/qCtTvWgG5kpBmCBlSzDS/r8N4uwBwohRW63JTS1y32f0TQsPfXVGEHQrV8/NCfiOUVirYcBbIeA2+iF68rQIo3B/S628vYESr79ehzS7Q9LEL9UXmik9XVHb1yBO3Ngvt5935+k1efkV51mzzrM0LL3/20avnwMeKuWyOUZg2TasSqZ+KcZQiOn1Iu2Vh497ALUVZiCKt/gh6IvTIj1ZLRjWAkpHKOKovNwp00eqPROiAbiNEKieXwMLcXhVJ1/uzmLP4tfxaHR59cBdJVG1kTAgl9ze9QKUEQ946Hkb+okJ5JRDyf54Axur1D+WS49cLr0tTPEu7UmXrxcSr3XNvumv4yXzInXKH4F7Tc7p17Zt+t/qW2+93k063X7VW6lALxTY7i1nBXMxcxmzQbabxz+tJo+wijYaIGMNS8AoSMgAPt84DdHOoMPfjXhF+kuH1tZvuFQrRCN07xGcXRX9MYxYchDe5BcHj+Z4i+42WyPc8Xofi7bbZJN5nJLJ5qr6IqRtzqNlM17SpFsnkEyTWoABEjz4JXOQvzWYuwdnV5LNGOwTM5v9r4RpQ8ZXsYodks3o31JBlzbYtNotisnm22MxiwGFXam5oN1n0TA/hRvshvTSDwHff4nNzRo9Dum6PaJbMXzDz+x+Fkj4L4bFNBb1asqsgH7Dyh4DvbkPtf5yMDKzEwyoaESMSNS9P9gJVA3/RTlwoMwZvxECFWxIPNw9gi01nOHjP32esZTtmXHnxvZd8ZtakqQ7ekajbXetpNa6ocTVxJtY+uSe69OLz77zh5bDR3xjZMzUz6fxrz1nqrZGcHQHfPVefN+fiK86LeXj+Sc5lPKy+k/vCUI/DaLFYCWHr6nbXuILTIsb5imNKY/rCm28fSMxPhkN1XbNMNZGuqwOBhtTSxWuTk6bw0ZaG86b1hKddePOKuBvmiguYBn4T/yOqOyGRBt7bKUI1GjioBC8aUKwF7Q319UgcmtFGIzCJGBqwQij0ynDsfdFGc3TS3BlNfJ25xmzniMkpXXTPvCaD3ZaZvyzjmZdudBostmhb0ORZNN2sJBeed1HXkrUsywueQH+L0eCPxmsa5ZpgRJSDZ11yDv+jmbd86vxZfc1WcZJ3UkMq1BOOOVtvu/+pB+en186d3GTwWAw2jheaJs09/+LNfZft37DALyrNj1wABMuUKbODyTVnT/KYbJ3Tpq8IrNh92dkxOj5P/YpZx4/ycyiVcDYdn4JbEoKdQi9054iBKsygLW46FRGxAb0NPNCm8BSNCPjoKcj6EAus4SuP3rB+cV99/eTF6294dA8+TK6v74MHVpYNRt/I30e8QGTOOdfGWzzxcy+87a7bLjw37rHw1nPzp0KyyRSeZO+QQhInt3dYgvycjrPOv+T8s1rptaP84VeywdWX2T4ysr0/7TLIs6+x9zib56ye1dM9e/XsZmePY3NDs9zlnNVt4+WgHJbbz3Livg4P9WWgviOMm4kCRT6I8vw0NbUUEnFvOuFKoxQW1gTsvFirsF5pb7qTUCx4i7VmtToveaDxvK9uOaedVvPRpVOnNz0Q6bry7uiSdQ8t7Vy4JQKVS+XPplV2ts4bvCwZu+KzgITtxepaPRzWdpv74muvv6RO0SorX6cu/dqKn/XWnrtp/Zragz13DUCl5myiFW2Ycvb0PtsXnU+tx8pvLFbUspLX68mdegwmOif/NPDONajTGoUh6tU56HBJCTBASVvNUB5VIiKpc9kd7kludodSFz7xQbiOmMk5dOYk56gzL6uaf7N8a6MQOHm0ae6snZpFDfuT3/jdYzjzwkXXIVHoXNuCfQslQZqBZjTsoHMqrkE4jaYdgkGz2ATOgB3cPkSukD01DnV3ttb1wx+6arPqbkcNAHoFPzKUUQ+qL0k97pjbZv1I/egC9zTFbrrlFpNdmea+gIgfWW3wqkcis8ky5FAcRd1If5nNZrl2FFpungc8wpoCl1BpQV/ScS+zjlASyUTVv/AJ46gkJI4bHX4lTnloctxPZE1ckS3+jG2fKIjkQFyzuo8jvYQG1OrGvJPSTu/nSp9PHNTl4z5hK/8gtXVKF6gEKiglgcKiRlCESsQCV5QIlKWKpr34lt/wkSx/JCmP5/cBKQfl/5gd+rOS/+p91/+YCg5CXK2W4M9fu+/6xxX+vnelVuldIDCG0VQTpU9Dw4pRfei+6zWx0MLie0gPbyrkmRU7OwT16JGeyXLHqOLqAfVN1GPlBzWtFNzj0TRTCjogtP1NjIvu5habN5Aoa1k66wGpqriVetJgiGdwDZtKhnN0y4n9sXYnsqGmZfDSR15+5NLBlhoDaedEm7sxmpqRija6ZEEg2EAnTiAC8IrmFbGz1q08P9PSkjl/5bqzYqT9hMmptEXDgTqP3Wiye+sD4Wir4jCeoHbbp5hRfpB7BakUIppIlPCD30dR1GtslDz8OsqbXmejFC/v8wu5X2myq7SJ8Avzv9DFUJySf5uNvq4+Ti7W9D/OZrLChdwxmPNiBRqVjnpK/aGxRCDspVYKAW9AN1JANoo8wP4BJUlGqdgw6m1qPQ2QW3+OfU5/ieLS/NuKpDU3uf8bcAXyBal5jMR2NEAbPAZt0K3hvxHBEDlUxfIGcD+N2gNSNx36nfqlAYow0puatNpRz0e4W2oahKzQHsjf2c16ad/3t2KTtPobnX6D8C8pd0MDP+Kx7wnXqGGlLQcvikMErm6TmfsuxJXbSAxqNjOogJLQBLiKEHAE+JGTS3JoEhTrz8/CB+5YlupJ58aOat8Kv4JvregxwcU5Cp8GFAFm1FyOfto6GS2m1NGTS6CPNKkbsTdCBlnN9onMho55BX8IJZtEQ35lk+htwN5A0V3RCPoD/yXAcv6pAtbZczRUA64JmcUf4q7Q89ZHLeJVZ5D1Ps/t+0iCT3AHVtZC7JDCXfR7OSb/Xja5H3zQbZL1B+ULX1BMTEk3AseSpmnKEK4T9ekMIidUCRQFfcbj7z8gNLvzF7mbhQN8h6ZbRset+nQWdS/ZX3k7WpS8P9sfo0iGS64wV516pOhjI6TZ2dApgI5+LhxywYoWxKUrykKJsIoDsR4mSrCTg0egMPnLW/3Q5Nn8BZEuzqEI7HK3n0+zFmuO3TtWQ5WJoG9YqCD6Gc32SxnbnVPfsxvrFXK2dILl7bLthDp6glhcsfp4bYvbSmj/mQ94uBTw0E73x2jbNRCvC6VL6GCFDwU7eWQDcC5FY5s0slieRDwtAbRsbLXbaXAuu14e2OJw1dc6jQ3ZdY8v7rv2/BWZLqvFWVvvcmwZkK9f5jS4muO9yR5res4kfkRxhV03L1RfPOiPtYi8pd7jNEsOpyTwxpaY/yCZu/Amd5Or9uS3DYaeqVOhH7gZN/8I/wi1fEuLXvyNivibjuKvN+1Nc01HF/3h+ef/sOhox8MPd5SFucPjorQwXT+ytA8EmA5mamHNFDVhBI5pjZbQpugBNkO8MvRub8KVDKST1Wag7D3xlin1ZF7LFP/79nbvCXFOY+PUjrT7/otsPXXZ4exdPzuhZuL5LUXVAn7k7PbhG89uz3b41X01gbjP1xwlu5rrvvf9+pbs6E/Vu7Nk642/PYRaAiUBdrmO6CDTBLPQFA1ur0uXoBR1INDMkypKpoTqnSMx5GiEdTEaSHLs0Alvu/19/5QW9Rv1U1ridT22i+53pzumbs+XFFXYC++CGsTj5JUT/GCgRt3n78i2n71FHG4/u6X++9+raya7os3ZbDmgWfXun44e+u2NZKuGZ0HiF8M4TlMPR+EU6rPKRJ8wOU2RFUFLex3egEsz3YqEAq0cqhAAW19dBZIlVzR61tuIdTnpXH7l+uXrbjPUyep+8cl6aXKWhPHpDcXl9KiTWDNr4mBQc8Tq+NzK/OKSbsfl79o9G20R+brBXYvUg0rLHhtrc4TN81TTOWSZ0gL1ZVlOYH2ery/7XVUjFMbzYpg7UswcqJPQwBd0LKLabJ8IaCr2otcjSkIrGwootKECaUd4XH1+SdazRrfddkBU98t1htvWrbjqSqjaCguxrffM/5zDCpBALUycmajhd+R6ww4SWafuZ5eU+tPid4lgd3gt+b/Y9rQoZNmiXYPXyRHbRs8zX/f4WIFjWZJtUdSD55AP3xtXH+ZipC0EqdBGDA4CoYEU6gRLGPU11QhkLTBiEYPiqOeQgwTCl9aok1Qr5pFf71qEeNxjy/8F0GoqYPv75Yh9j3x4DuJ+uEzHRpAq2lMqb+qfTdiq6kGtzfOWsv0c7lSeMXDHBDe1MT+LUgx0Pg/p87u2UicdIvqQi8DkxhcUwUXCedMpb4NQjwY3npTmgsURJavLwCRyEcN2HfWsDVGfv/u9ZUWUx+PYFueUKwaNvbtu+Xps3eVWbN1GcgVrdMnWJ7WmJz9SD66EBidag0NF1Ukep0t5A7sFCWdhzvYwHv6L/BehXuHqfaBwBEU7hfVLcXvS4VQv+T/vaSIl7cbeMc7ekv9i8S3e1L5xxpvMGcu1EYPbKyCiijjGXcDKckm43PqU2qNWlXusZMiqF82cuVzolUHN9NNR0HZPxFPV9V0wLtvq+k4DqOwVWDlzuQLVdqFiP08cRX7aRlBVfR8cb55bWe5LExnlcsDp1vAP8Q9BucPMk1Ulh4GnN0SAdxcNHv3q9ohx1Ati4S/tkWjIDe3hQdkUGrGRaFBiUdiTSkI41UkMuuQHP+EaSQYlPQTFWJF03BNPpTu5KFAdkWgDukzsZKMG0Q1TAQQglScOaP/dsZ8+fP75D/9Uu5Gs3FY/2SxPld0DHOciXI9gqjcEidXjE+3BLosy0OcX3T7O5g65ROGyzQ2BZs7WbZVnO5ydLe32hMwTQ4wnnKXW6XW5LAa7oaXOIHoUl0FgLQLH2by8wSTWeAx2Y5PDazK3BqZbeJZwXGPaYhX87ZNszoDdaRxotXO1nNlpdvAPFWHDm8PqEE0sZxDEqGzxisFNnuCWetPcGrObN0p23tTZwMuRVodSV8+LTrOV3eRvzjQZiSjaLYS1WEJe0kNsJlZu9LFun7++wW4gRDRbaxw2nrOGm+xOj9cmtbp9ZqeTM1m8UXfQQCSTVSQox6pvtjot/FpHvIUjJovFEoYvHYV9C5Y/xN9OfcalvII37UEhTbTg/AQIaPb4Vz6j5u8/aViycMod/fkDcpu8QZbZoeBi/vbzP3XPsZvOubMtaPHkD9jt6+U2O7vqU/9C9SMvgrXpQNG/E0oJxun+CiElUa0IKQSUwERxOntKSV7ekcuh9VBZBBo3VUcB58ofKBHCwLyf9qFosz9Ibf8dGqwaBMjRig4SGOZ2UkWI7UiO9OfUPdxOYFApUZyfpY7mgEc5rtNGGk2H1lPhAk1Hp/VAMqQEHEUfEYkkUQq1JMdzsX7kklRrTrUi1wMcDjmu1YYfATj7Y+pGpPEBXuoQIj8rR9mgCl4C9yqmF7xnVWxGVniNqtpVmXBvQ6iwni5YQ8a1jYrXtc2J13HvgkvqWxuva1sbr+P2S5ceKGyBwDv2DbrToe1u6BkAJV7xnVLUaq0sJB8pFqcUIPi3yuwxi4JuLr+P30f3OkPQ72aO0xYo3/EsmO3QO5qEF8S0qQH0UsKXv0brnl9+8M7jF174+DsfvPOl1au/RL5/9DsbNnwHL2pHR1NTRxMZhJtHktOOxLxErPF6YlLvpC9YP73x+4ofw+3xVdrHcDE0dQQCmCRgvt9b35xINDf1CDcRSfJ+pYl+Sf8YcurfmXP5F/kj6J82jNsrkWiEuhVlgFfyNkB3S5MUzLhoNiwSCYcxQ7Ui4J0Xh7fmqRbaPa1tzujxkBRlsEHy0/OM4pYLPb7g9O6BQJN6l9zQ0OGyCaZz0vMTbHOzXfQ7a2tsterTcqxeInODoemdktw+1SbVhKwtW9ffe8VKadK0OVuC3bWzyKm5LeddsWTeorWyY9IMtUFutdu5g+Rn533qkocdvLs2HmhU75br/MmWtD8zA3OP2t1ea636jEzqYxJZGAwFiDEd61oTsrRuW3/3pYNi3bS+Rd+GjOfVpAPNd6y64Gsz1GaZleWIPoYL/v9mTeQBENVEguiF1aC4YeXxFETw6QyPfn0m9g8IrMFAvKM1EI11DARnbqibHk/Iojy5rSdgCyZi06y8sS024PeuO4MfwQ5Y9yKRZCqyYaF30vzeHlmUprR21tR0t0yz8KZY66zWuGvxVQB/36kP+K38t2Hu6NQ9SFJfw0AdpqPEK2qTMpf2VCqJwqPoJezTL824b8akoL+x03nhh+oNo5e77psxg9Q5LzebIKD+fsY34f2MtB9fk9v5b8PT6tYrgv4kRPwd0q9z3gdJSJ0653KjCYPwCaR5aUY63eW48O/kdo33yxX9wCiMv2QTrk8eGSI6Ag6moG9t2P/F7GRNlDjl0gw7pJ5aOXXqyqn8SENnXBmbSwUYLyqJjv3UmY1nKr4t80no0faXsaIEiF/BRaIBnItSce4OUif7W6Vm9T9H1X9Vj71BEm+RdmIJQST/ZfVdudUvh9S/qqNvqT98g9SQ3lHibZY0mRVHooyDN/FHmTgzjdozKw28NwQ0hwN6BCoPKaEk3YtKwNhwRLXuk076CGoZNXDQcRwZvreTZY9EZi+d0s4+ztv8iei04JQl6ZbDD2eHV7X4uHuFVfPrOmcs6m6Kr7hssr+1VZFcEZ/PdJkn1hOs8SXS/NFFgqt94PIZzZ3tdaL6Q5vo6piSzdy737pwsX1VyxUrF15iJ4uNkq+rbyg1Z+O8VsNC1UmcvORPRfxtPrfRwL2p/oA1eZp6Z/aGffoewaXcA/xBlKlQLfhQL/oPgBGP3qsA7IQS8qDVNswHKRSheDUvA3Q7MZoRcJMxlEygujn1QdyzfPfq3dEp/bXh5e5YXW2Ngfvza0ZF6UgFL/E0fTq4LBlvTE2qb/KuuzYSXVnjTfM1osvqMHVbm9950quIZlbqaL6YP7jk3kUtA0GnX2nvq53f3WoSsvEdDRnULgo2fN7lNZJgI8/VWi33c3bBZnGY05+dm+3qc7fNmj4YGKLj2nfqFP+g7jdDlxEV5XsJQZP6hYrS1l0VQr4c69Xueixp90gnZPmE5OF22j+SYEWHlZ0K/Hgsh/Ztsbh6h2DNRlvv6jJh9XaJaHCZDiUDKNTMkvb8vsqCyf3ZNdSmO0fa0Y4baJTtpbKzuVzeeSI7fCKr2Z0WypapnXJ4gnoWy3PoUIlIQ1TXdqhQJIXp9Wx5fYdpeWh2TY5D+YVyKd0jw3iumwi/BC3cEy4o83QlZnW79MrCgCjbhWXBlRZVVZZv4rIKpXC01HFlHdHLoeWVl6UVc/J5uGm6CViW5mulYMk+HqNYr0AyUPivLg2oMs2MPqtuhHyRyiwvNJej1Br+fcLyoAyu8D9B7bgmzUqfFobF5nKnK4+t8MPJkI/xHUNWk117jugWF+xazTAALQn6+UE9lhoI5ApGA/iuJOsrlNP28SVVuBVajXmircLel46w2bJS1Q0Ft0KDuikDFL/3pYrid1Q4FvofwRIo4R9h2ftSwc6jHAMqLcCql8YPHtlzGoByNXYN6v8hXnRaOhUvx0sVLCexwupGDR4NOYC7PePa5keIPACnuAdD7dEadRuTIiS6Lb7uskb381My5yjzF8lGCjBRqdwrWJCagfB3yCy7XT1i92hbcZ5Ci1FJkgYMDf6n+jspIsHFjJrTOdzSMuOa9DbDcj/nH9N9bIoGVgzHPWIQuFuYtaMRaq8eCKI0gEF6lPOZjBz3EEvaaxwSUT9U/8JbJZPJJLBLolH1La/RbF9AbC8JJjv/mMnssKjLRBJyqj9QXxNko0Ux/X79epfiXkm6fmKwF/en1HLc6LxloXWKvGa5rVCVL83VuiPcDEX/K5pTXOxHfx6HHB0t2FI0qI2rCZFTrvPWU67zVuS/kTsLnc7IKhFg30e4FOkqNSfH5PtkmUy6Cpiv/36k2sbqCeCFNa+URpoY0sZoYmCgCr3qgZz6s8I0gP1bYiR+D79H56NOz0EVWCTy2/fffvSCCx59W7uRV9995eqrX8GLesOXNm360iZ+T/El3uZqL+FyzSZ8XxpTiI/G0nkT4zznFZ0t4ipMz5v4q9ssqbdKUZt6u82knPCrt6PZwsnn0XySVnyPR1ZXAn72yx48bWJsu7apnI3Hy8bygUK5Js32qcytapqgmn95uexccj205vGgJ+euOeG2SORmKZr/qKzcx9SFctMJdwMUFZDJITs7dnOp1EKZCxg304Cevyfya+vlKqv6aXK1qIj3imL+L6hL+yvUlFfE0VKZ7E8gBY3M/8VoJCFgizH1W6VyC76nH6b7jiibYVxUmVIEspry/LgZIlCeP11Z4zs/AwvVwtGFEut5S1JY4lfyT0N/evOLo+rUEgjcqc9IkGpQbv3iW7Co5b+KgjvpzYdH85PLcc4X21ouwEGl/S4qnUAvoSlXUUhR1eKr2VWFTB+GMl6FsiQsVD1R3urlAAIoSn7JQkmiVVCHSpCwDH/qPepXQ0Db77CJOAImohB+RPWr31ev5g/kE+zTa4lbvZo8xdWPffQu9yJTPCNB66s+zXoJt/0L6hSoCuBIoK8fnBGG87OoRckJpLqyWe4YbpGi50g0+3I3UD85Oa0fzubfoXxPLbW3FDWzigmyJeM0tQkax7PqTy80+UxfUHPlBZIRVNQ+v0xRm8REKPoLmNr0+Uo48v9GFbXPKylqQ2IKm00QddgyWGMROCTxdLB9nCY8P7j2DjlsV/+mfr0C0r/NkeXbbpPlOTBBwT0mVz1zx9S/wJecBF9Wgv3p032iP2v4VSgfgW2G+HUEdEXU6iq4CtpLJfIN9XQG8dwa1VoO8XC2SrPDDyCOQptXgbcPvlAgBfxBoGwftQKeKFrNTASPt3pGGqDt/QRasn2kri+H6L80MJRsmVYJrAKyDItpJUy3/15WYIJqcJ9Q5N/LFJ4c3dc1URpWl9hW6mu50MUIelg4ucTPf15zs5DFo1c0VSp1tKB9jkwIyuM45kb+IP8gHed+6jO3v0KbIknzLy636E8KPTdCuUpB0wLo9JKnAO6pv0vS31EtBha/fJemkgLVVnd8KCk4qBTpQ5m7FbifBKrPJcq0pZAFVG/XbOFz+Tcq2MLrcmV28Nmi/OHskh82bau0k8eWCaPijQPWQ5lUvslwVCfHkXBMIehqUgtDNLeauH1huvZTbYmw+luPjyWoNGEuxRLR7LK5fSyXFUyK7PURQv2v8D3XOt2NJ6liBbmPGOsakw1kbeOs+31Wm5qpH+iJWSzqdPr2O7zc2TmtnrzCig6bBd/vgQmzOlz0STWIlmZEQfupogOZFHUZ7EkUnMn0RrpIMqAgHRJAOjIJ3yGw1I/MAp9q9S3Q/clADNm1wEeO+xbwg5OIYHZLY3ehG5lJk2xhco+6JWybpEVz2wrR6hZyD0QXZbeDVB+onmlimpkWprdAs4WEZDSQppsDlcdCBJJESIYFuAtUnC4GIF2C3Uu2Kv7L1bdz6FxtqxpG4TqQOqOUNAJ2HLvPWA2GgDy4O4vaDrtyl6P+1fAll+SyFcQ28GHqh7fvvf37udylf0fNwhzgz87Y+cf5x9GnF6ygHu18sAbipWeF0YPBgp2GaKeQduxxdEr3SgbH1kvH7tvqSLhedomOvZyts2dw8acu3dY/f+ucuMtCuP/e4zC4XnH3OLZ8ZuxTWxy8dJfU5dhDeKPSlJy5pn/+7u3XrJhmr9C5CuleGflGQocKnlAUaRKp0BAHV0ZwUt9VCqk6zYOgRIuMfePJzdmBdpPJ7/6B23+f+sp9NMDZevovvfYHG5dGPISQq1DojqNckchVrCcCYz/Q0hI0m3NKDRfkgsrnamo+p0CAq1FyvC3a3Nak/s5VX282x9Ufy3E39VAx6o7LpCvO2wK+ch9jNqpJCutcIOooKnYWtDK8gTRVYygRQfwgzKM5+jP2jOZdx3r32Py7rQUPOzAnoRs95NvRAR0qLGU11Taqu1bUYSzMcWjMEir067JQQHfIrLBHsrgv00/Wavd8HRLMEEYFSW3HCSNQehnrHztKqHcDyo4VfZ6gPKCR+gufwA8GegxUEo4A+gd0BASHiH6jYMLIsUdQJTs/C641KN4oCHWolCMLlMfIdtWKScjx7SM5LD9HnfmhrGI0S139UWfUnxgOXdJFW+AMcGjKr6eHAttHF5sUoeArYKDcxMSYcKA/xUDhPiEOEAPafSIUFArN0r24ynI91EPARDXvIDYyvqZaWeroBOUABQA/E+DXC7PWafDLQY2oiwpUEyj4RQtVlUp1GrM7In2p2A7VuiOW6otMiGOo5Mrp05ejVuTy6dNX/k/7mybZQ0nUmfrbx3U4KueDnlHm5wdh8FFeKnoaKKh/TK18StOPhwG9Xo5mqXAxvw/79YQwwDR+nAKQQ4izVXioB84qcppWB7IqjU45z4CE17OvF1Dw+oTFqxtz8dxwtogBnF9MjIl/in+K8s3hM9laIn0TiCbTAXL0T798bPXqx36p3chrv0O+GC9Xaj48Ecv8U8UEeBvUEsDlTepiU5OvlpeNGvpnKF0RvUooWhIjnx6GeBapXCQYTw9DNg6/OC3gZjp76oNTj9Kz6Jqobxb9NDqc08vcKReOpcsQV2K8InXFaXW3aI6Ofr1k48rp7CX7rx+v1UKPsfvzQU0Kc83i2VdILmd2/yX55zT9luN2+Cu4nKfwPcK/CvDVU+pHh8+LaldIf1fA5h3ndT6Fln9/W/9Ce1vndfvJtnPVO2xhm3qbafHVCN1X363UXHq9xuVD8OSD29Z8pZ5cZrern9cAdGW/uib/ud+VK0L9a42r6C90kL8KzxwLQw9NkIQJL0ASU8M+VG0KsUdgdvpgP/6NqqP0/gHZFUfGEijZLHpiIgvV5/Bltrj8Qd7XQd5p4P+7tJo30NMO6VGBwahSPMYiaaBYoLY6uEnciyhhh1Z/vvacG/rjpsvnpzs0B1Id6fmX8119l88XnOxe/uGrzzHcdu7UtY3+2vmXN5zUyj3ZcPl8p1sZSs6/nGXtwrV7Ka0XZdz83fwjjINpZWYw85lL8BRK4nGyIir2RiOsEyipuEcIakpGjWgBjLiHWOgj0Yi34gW1kKPxHt2Na5q+lwg1RdRSpFDNzosb44YJXnAfoEOpZW//6u1lhYA6leevezbI26zNHO811M2dc5HFxpk4i1jPC0s21/BWW5DnPQbn2X1WK43/aM2n18DfSoybbNHijFpamzXI31eRibGUOxSu/lT96YZlq1Yt20DaSBuG6knw2eusHs5EPBfNmVvHKdaQzcDfz9ZsXmLDWGXy2U5OsYSsIn8CS12jQIyD12KKqZrLPy7mSPdICmd6WGHG8NDZkkHuE4h9TU8FpmUO/VjC/EinToFyoNDz2p9XD6g78WgQdPG7Z3R0T/Z5dTM9lsL8Ktek7szl2L+gQwGgwkZHc2g5Su7NvVqwGy2Ua4KSXUwt1X4PaM5paaEu6jQ5zVFyNabxvUksVt2T/4VeamYPlLtffdQsk+2sUTY/zDXl/05W53/Bz9UK3p7LjapZ2ZxOm+UlZXrL3HHGqO8+wVroDaCTTnTxitMxmiAAYQzVJQH+nj3oIHnPaN6Zq6sNSLjBl8tKgVr2mj/9CWi9dnKca8rBQBsd5R1tzVlgrl5pbnPw6kZclCr2CHxMnHohLz+3KRQokzALyeIKFU1TNCiayJdoHvDYe7K6mZLm8S3uJ9dojuaJ62/qN/tjQxnSnhnKPw+LNrLi8ZKyJ3x1YhiI1aNAtP6NzCGzYv3DmaGh/LvQZnt0evgIhTFV0kE/PYxAnOHhCQUZdCWY5JWJwMzlAGl1mpNbDU7yyGnhRMILsYhH3VRAijrPcBU8/Cj1Y9NY6cnGVW0CjTLaz7E3epvaT/LtTV72Rs+0WVVmd0dz/MGTI5F0OsIviaqDlbbO5X6xT3PeXbXHRtf/z+fdka+eKPr8KF7IF4vBsT9MFPuPJMBTBMq9hQxXelQ+bewnf18ap4Ib+mSMrtDU5zqlD8QANa5MBGh/OwOvSDfcV2d66mfEWsbGWmIz6nsyZDWQSmqmxDneYyvjHPmRXHZxeueyRGLZzvRioKnGto9nIPkibAJA16adcOZRQr1iAP3bUyBR7T4RgAWTKxhkCYFwshq+7iV9r0whk50cmRcTg4fy5x4OmmNkHndIA2+YuMbmE9dwGYB4KFTsvnDE6Ah47r/fE3AYI+oXADpkdlENcZ8OZEEf8FFGZNxMs6ZLpG3SUFLL7Q2kcFU/A/Jsw+vWDa/7emewLaoeibaF1B9qUNnuqWK3+UfXYVL1v/omD15xxeDkPnXTOKSVcCbDGtOu0YQNpGAP7U1HU58UrqGu8xIbHtkQ3LVhb7Dx46ET3Ffcm1q0YcOizNmf3bC3VjWfAcpSv3MyTlgJ23FHQgmgvk+gk8pL0mcCDOn08MDAQlf+/SlTZ1z12fnqntOhbOTL9/ZdevbAPN+yby1f/uUtC/ixm8ZBo59LTXEW060hGrTDplNprWd58fwB/b/E27BdS/s7U+rGVCeQ46nzaw9QccnmZerGZZs3Yw9aVHt+Kh6HN4ti6lxIhT/wahnZtWwzlY9QHQ2c79C+dxzvVDKy8GqKWQERO9YAKbpsDUTLdWV5dE8PVPjvj9pqw7ah/PFVtkit7aj6G5xY9mfJrCz1j1e0BcnPol4UjtrCdbahIVtd2HaURujnFJR8CuOuUUfhrGhgKKgjCYNSvCc1WKlEp8wHUaAYynFNyzZn+2MnYv36dbMDBTonl/T/ma5IKAyEGz+4eRnVtaX6tss2o34u8mWorFtuFgm4A6qK/yp/gLEBVat5WnPDdKA574ubuFJ/IUfZ/Y2Nt6mN+ZNNTSTaeI56gKwkXerTe9DDHUw8/H35FY3nNN7GGuBKWhrV9ep+0k1WjNWVaHkW1yA+QHWNu8rtBw2a5YXuE40rs7/GA+j09V3hA98yRnFPOGr8ltGlsFdD/7tRce3LH6Trcneuiy7K7J3khKu+3qUaXPWaX7T6/Kfj9BX2eZq2XAcZT79u1ClJzUtHUqfqSMWBcZS43Ena0cUGLgpkKxB1QM+0Fxz10wgg6r5rltnFpH05pepUq3Y2HfYqeKRntmUFNz+XmcOs1H31U6cC6RTVLfCg7RNBF1UF2/wBgu0fFQtPEU1sSg3VcNsR7dWq3af87tUFn1l3ltXpaJxpNvtcZkH2WmMst3JqRpxUH+WC0E1qOGtP66s1MYv+VLu8/XFXvV/ZbunYYBeVN64ls0ur6NzpV9xzlmQwB5qC4Tq70WC0tk8dWJXeHvkD0h9zJOM0vD86/1NJMaIAolctvlByferCsqOKDKceOfUu1PsmoFCamV5mCrMUOCi6V6FJosMF22AcrKJgQDVhfYh6tepp/lYgvnCEAbJQ1L0rOpajEmRcasMiPfxhgGoVo4rwreQpV6fUJHH2e8fa1s2c13Apl1b89a58ozdoap2sjgLN9uISl7P1DrulyeIkt0zr6JjWocoPOZsaXPb6jtqBblsgsaRre2xHi4nELm0MhG1+x1SXwLpFi53b+aHRYo/IrbZtuWAKu5cSEXfybnnmUCaXGTpQr0xK2O2WWY76f+nAjNVf7nCZHU5XqIkTnpt6VtvsFlPXg1031g/VRdpkkyVpD7jnmax88QwDvg/66NnMRdRXTcGTmQc3cuINwN5IQqi0yzb+YFVHuVqI5s4ADfg5oE4ybDLd28mFSFmYvRoomsWXEdLU2Wl3GJy93ZNb/d5gqmNaqJZSO1l6PVRy0nZIj/45EetjLguh1rLqR+SK0hO6NrsqcNX8zoUdjQYDJ7tb4os6+i+Y0qpY2AWlnLRDWdGFTfGY1gV0zNAtJ7pdo24se0D88AwLY/gZmE9iuP4V5v7CSR/RThaHLh+UeBkXwU6BC7lGOevK65udTv+tS/PfW7qj3ljTcj3b9OkbV85t8xsMj7Ddj7DGpthZKwKPvso/c/1K9aLE12fMWLV1y1D9ua8lyJdWXr/bG+noCFutf/mLILe39ITUV4igr3876fpX5g2zeB52sWnIL4fXHlgeUzOx5QfIvJQyrKQE9wHUqVq+PEaOrz0wVvNbJZVSfsuMzxN4l9PkedFzw9V5Dj+nzpgoT4ZxCxJfC5RWLc74YVHxKlExCYt0JAOMatREhHBSCAtSfod6x6Ls8HCWECLwXZ9nd5Dz1T24JUdWs6fU3++fcnT49Qe+kBs+wdsMZgPXMp3U5S958snPP/EE7bvkOPCuTUDTUQ/UzirLhML9yPahoe1D5Fj5jWsaoveyP00PehdUAHk/seDVWsvDWXXXsyn/4wfpXc2V3/Qxli3jl/5hj/83avSCfpTNxOEKLmTjxOEKuxgNlsQn0xgct724mhynupNW1Ph6o3RYS3/+2TJrzLlkFz+ip3qCHKf6eqW02QJLjBYuuj4sobhCWqa/YHGEHpcnumuWSOhxeaL7sOakNR6vvmo+YcfFA8UFXEPZf9UjyudIOyNwx/i90DdsujS/FX2UAwvWSVK4NxaMhAGw3oowp/uc8CTi7D2rBgZWwb/60faR7SPsEbjkXy4G0XaqhXPwe2cePjxjxuHD6ssQuR1fq6PF0E+o2t1nePTn8TUmxz/A3crMoCc7egESuoTHYc7mYdg6etORoOhR7BBGD+qJopELrl4S6cJNRtEAsLP/OdvnJq0Wo0GolY2Et9VFB2Kf+4bZvVyxfOMz3WdFfSIryj6DwWghre7aQbdiDrkTL3A3vNDuDpk93HqXwam+bWmUJZfNn5ozKV5Pmmq8PF/jVY+2Tlk2M2RzSXKjmbQ4RZcQavEYrN/9rlXwtIQqzxQNMzPPfHYLvuPoO9TbT8bpGw5CQPGd+SyX/Cyf0Vxjd2R9NmsunnXYa8xGHzn+sSfM5J0y0DZEXWWxkXjcR75KBLNLHi7XvX2G8VOrf4Ykg0AMdBESIpo7MgAfyakA6rkqpI6UjNs0px7cMV+D5BF49Tez1VGnYmq0WIijp985m4Sn2gJR9b07riPPFo97OYbUZbxJCpot7H/lpZBicglCPN7WOfJkcHqc3ElWqvvz/1E6bIQrG+tz6WkM1SM9FBTR7FSs8KyBBytSmNEoquJNFN5EQyTiCrnKDx1h58yxCepPHU5nxGoxEQeeOZi2m80DxNxncVhr6BmEfUarxejw+WSiHhWk19bSY7aKR5MsteblJpfTLtjimBouXsm3d3djjYM+wEW0El9dM/ueVRWIsXwe43R7SgbVZqrnqoJ1X/kuF7pcgf8duv4q6vayV5U9zMV91GxO59UUjW8rHV6u799WzKMT7umRCXbYUKM+foaCcwgaoqZUtmodV3p+X7akb4dnU9B9La38RPFUG2SCC90tVA4XwEFhyOpZZrUCsgWYHsczLFBBVGNtstoN1bw0Z+O4fYIbvZVt4EUcJEKOhHeincWqONw+q6w5Go+WGOSR7LhKV+KBqbBPpfUvOf9QqkpDyVhBeyyZQGMsdA5FBUqvFMtUyGq9vjnsAJU4UcrxldP1CCaofyDkSAifoP5QwWx+SyUGxp75BzGAvtG7uQ38LehlyEQMeh0TeE6Bm7tYdXqdkt0uOb3kfYlNwmOdDyacOq/qlFo1v+PTmTi3E/glC9W11b34A22zmLzvb231Q0L2Bgg60OTW4YdstO+YOJnO38TtpH7zy9ymokWyA79qlVSn38HtpFlImFnhu3b4boNWXklOXV0Iwo7lQ1hrZyPFcwtjwFP7iEKSHSSJw509kh8kj6pr+H1jR7km9vcvqN9657vffefkv+fKxge1X+7RdjYUPIESN7gTvRkB/RMYtEkaVkdHApmdBPpnKmz0n1xSWFOyVIuLrinZwpoCRe6kyiVZoHX088F+UX4+WKS4iBTP0IWxGtZgOdMaV4KTayqHQF/VihBwTbgDXTCmKoOBJeNhwJMzEVjtjIFLuU38fPR7hqNG1JS7g/qRCuy3vmQ3W9Vu8qbVbP+SzazGRJH83MzP90Ck2m31mMjP8TiLn5uwD2Ugr2PFvPQjB5BnSJvQxGQZZEB+LopqzGzDbMmbkAPkZVJjeO5FzOSBKCgJze2ZS4Gemc9twrwY6u9H61iUQTcRvtdT9RW3tRxAWwFs2tcuJRnI6xjmBdWjbgFNRHMHiF1uHYBfUR/ut5Ug2jXAaT96+9RH/FToRwIzGbKmVJ1AZQnoabSB1yyIg7ByAridHApPMjyw0OiV6RjSbCuzwLAvFizBliWJua1tsuAgvNPbmljYbpt8lkWam7b3XZiOiKJskMOtmfScnsbPW208knwjuXrXK4Q1iKIgNyYXXDVT9C2Ye/78GQ5BEEXfFdde2RwauOysdJNL5AzCy84ard/nGAVN8alecnFdgu5Gbd5DJTL+hHZK0vApVy3OfU8XTSJg1TlssivsPYUlIqvn66PzrVTymCc4wgF6SDNR0pDf+9Gp+VnsUH5WtpHYsuhOaey8zdwLN47V8MTbm78g687+P3cx6tcAeNpjYGRgYGBk8s0/zBIfz2/zlUGeZQNQhOFCWfF0GP0/8P8c1jusIkAuBwMTSBQAYwQM6HjaY2BkYGAV+d8KJgP/XWG9wwAUQQGLAYqPBl942n1TvUoDQRCe1VM8kWARjNrZGIurBAsRBIuA2vkAFsJiKTYW4guIjT5ARMgTxCLoA1hcb5OgDyGHrY7f7M65e8fpLF++2W/nZ2eTmGfaIJi5I0qGDlZZcD51QzTTJirZPAI9JIwVA+wT8L5nOdMaV0AuMJ+icRHq8of6LSD18fzq8ds7xjpwBnQiSI9V5QVl6NwPvgM15NXn/AtWZyj3W0HjEXitOc/dIdbetPdFTZ+P6t+X7xU0/k6GJtOe1/B3arN0/pmz1J4UZc+D6ExwjD7vioeGd5HvhvU+R+DZcGZ6YBPNfAi0G97iBPwFXqph2cW8+D7kjMfwtinHb6kLb6Wygk3cZytSEoptGrlScdHtLPeri1JKueACMZfU1ViJG1Sq5E43dIt7SZZFl1zuRhb/GOs44xFVDbrJzB5tYs35OmaXTrEmkv0DajnMWQB42mNgYNCCwk0MLxheMPrhgUuY2JiUmOqY2pjWMD1hdmPOY+5hPsLCwWLEksSyiOUOawzrLrYiti/sCuxJ7Kc45DiSOPZxmnG2cG7jvMelweXDNYXrEbcBdxf3KR4OngheLd443g18fHwZfFv4NfiX8T8TEBIIEZggsEpQS7BMcJsQl5CFUI3QAWEp4RLhCyJaIldEbURXiJ4RYxEzE0sQ2yD2TzxIfJkEk4SeRJbENIkNEg8k/klqSGZITpE8InlL8p2UmVSG1A6pb9Jx0ltkjGSmyDySlZF1kc2RnSK7R/aZnJ5cmdwB+ST5SwpuCvsUjRTLFHcoOShNU9qhzKespGyhXKV8SPmBCpOKgUqcyjSVR6omqgmqe9RE1OrUnqkHqO9R/6FholGgsUZzgeYZLTUtL60WbS7tKh0OnQydXTpvdGV0O3S/6Gnopekt0ruhz6fvpl+nv0n/h4GdQYvBJUMhwwTDdYYvjFSM4oxmGd0zVjK2M84w3mYiYZJgssLkkqmO6TzTF2Z2ZjVmd8ylzP3MJ5lfsRCwcLJoszhhyWXpZdlhecZKxirHapbVPesF1ndsJGwCbBbZ/LA1sn1jZ2XXY3fFXsM+z36V/S8HD4cGh2OOTI51ThJOK5zeOUs4OzmXOS9wPuUi4JLgss7lm2uU6zY3NrcSty1u39zN3Mvct7l/8xDzMPLw88jyaPM44ynkaeEZ59niucqLyUvPKwgAn3OqOQAAAQAAARcApwARAAAAAAACAAAAAQABAAAAQAAuAAAAAHjarZK9TgJBEMf/d6CRaAyRhMLqCgsbL4ciglTGRPEjSiSKlnLycXJ86CEniU/hM9jYWPgIFkYfwd6nsDD+d1mBIIUx3mZnfzs3MzszuwDCeIYG8UUwQxmAFgxxPeeuyxrmcaNYxzTuFAewi0fFQSTxqXgM11pC8TgS2oPiCUS1d8Uh8ofiSczpYcVT5LjiCPlY8Qui+ncOr7D02y6/BTCrP/m+b5bdTrPi2I26Z9qNGtbRQBMdXMJBGRW0YOCecxEWYoiTCvxrYBunqHPdoX2bLOyrMKlZg8thDETw5K7Itci1TXlGy0124QRZZLDFU/exhxztMozlosTpMH6ZPge0L+OKGnFKjJ4WRwppHPL0PP3SI2P9jLQwFOu3GRhDfkeyDo//G7IHgzllZQxLdquvrdCyBVvat3seJlYo06gxapUxhU2JWnFygR03sSxnEkvcpf5Y5eibGq315TDp7fKWm8zbUVl71Aqq/ZtNnlkWmLnQtno9ycvXYbA6W2pF3aKfCayyC0Ja7Fr/PW70/HO4YM0OKxFvzf0C1MyPjwAAeNpt1VWUU2cYRuHsgxenQt1d8/3JOUnqAyR1d/cCLQVKO22pu7tQd3d3d3d3d3cXmGzumrWy3pWLs/NdPDMpZaWu1783l1Lpf14MnfzO6FbqVupfGkD30iR60JNe9KYP09CXfvRnAAMZxGCGMG3pW6ZjemZgKDMyEzMzC7MyG7MzB3MyF3MzD/MyH/OzAAuyEAuzCIuyGIuzBGWCRIUqOQU16jRYkqVYmmVYluVYng6GMZwRNGmxAiuyEiuzCquyGquzBmuyFmuzDuuyHuuzARuyERuzCZuyGZuzBVuyFVuzDduyHdszklGMZgd2ZAw7MZZxjGdnJrALu9LJbuzOHkxkT/Zib/ZhX/Zjfw7gQA7iYA7hUA7jcI7gSI7iaI7hWI7jeE7gRE7iZE5hEqdyGqdzBmdyFmdzDudyHudzARdyERdzCZdyGZdzBVdyFVdzDddyHddzAzdyEzdzC7dyG7dzB3dyF3dzD/dyH/fzAA/yEA/zCI/yGI/zBE/yFE/zDM/yHM/zAi/yEi/zCq/yGq/zBm/yFm/zDu/yHu/zAR/yER/zCZ/yGZ/zBV/yFV/zDd/yHd/zAz/yEz/zC7/yG7/zB3/yF3/zD/9mpYwsy7pl3bMeWc+sV9Y765NNk/XN+mX9swHZwGxQNjgb0nPkmInjR0V7Uq/OsaPL5Y7ylE3l8tQNN7kVt+rmbuHW3LrbcDvam1rtzVvdm50TxrU/DBvRtZUY1rV5a3jXFn550Wo/XDNWK3dFmh7X9LimxzU9qulRTY9qelTTo5rlKLt2wk7YiaprL+yFvbAX9pK9ZC/ZS/aSvWQv2Uv2kr1kr2KvYq9ir2KvYq9ir2KvYq9ir2Kvaq9qr2qvaq9qr2qvaq9qr2qvai+3l9vL7eX2cnu5vdxebi+3l9sr7BV2CjuFncJOYaewU9gp7NTs1LyrZq9mr2avZq9mr2avZq9mr26vbq9ur26vbq9ur26vbq9ur26vYa9hr2GvYa9hr2GvYa/R7oXuQ/eh+2j/UU7e3C3cqc/V3fYdof/Qf+g/9B/6D/2H/kP/of/Qf+g/9B/6D/2H/kP/of/Qf+g/9B/6D/2H/kP/of/Qf+g/9B/6D/2H/kP/of/Qf+g/9B/6D92H7kP3ofvQfeg+dB+6D92H7kP3ofvQfRT29B/6D/2H/kP/of/Qf+g/9B/6D/2H/kP/of/Qf+g/9B/6D/2H/kP/of/Qf+g/9B/6D/2H/kP/of/Qf+g/9B/6j6nuG3Ya7U5q/0hN3nCTW3Grbu4Wrs/rP+k/6T/pP+k/6T/pP+k+6T7pPek86TzpPOk86TzpOuk66TrpOuk66TrpOlWmPu/36zrpOuk66TrpOuk66TrpOvl/Pek76TvpO+k76TvpO+k76TvpO+k76TvpO7V9t+qtVs/OaOURU6bo6PgPt6rZbwAAAAABVFDDFwAA) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')} .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} /** Changed by Safihre, Nov 2015 We include the icon-file directly into the CSS, this way we avoid errors when HTTPS is enabled **/sabnzbd-develop/interfaces/Config/templates/staticcfg/ico/0000700000175000017500000000000013642116632022002 5ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/ico/favicon.ico0000600000175000017500000001246613642116632024136 0ustar jpjp h&  ¨Ž(  @ÿÿÿi–ÿi–ÿÿÿi–ÿÁÿÿÀÿÿi–ÿÿÿi–ÿ³ÿÿ$Èÿÿ$Çÿÿ³ÿÿi–ÿÿÿi–ÿ³ÿÿ ¸ÿÿ(Êÿÿ(Êÿÿ ¸ÿÿ³ÿÿi–ÿÿÿi–ÿ³ÿÿ³ÿÿÀÿÿ(Êÿÿ(ÊÿÿÀÿÿ³ÿÿ³ÿÿi–ÿÿÿi–ÿ³ÿÿ³ÿÿ³ÿÿ$Çÿÿ(Êÿÿ(Êÿÿ#Çÿÿ³ÿÿ³ÿÿ³ÿÿi–ÿÿÿaŠÿ³ÿÿ³ÿÿ³ÿÿ ¸ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ·ÿÿ³ÿÿ³ÿÿ³ÿÿi–ÿÿÿC_ôC_ø³ÿÿ³ÿÿ¿ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¿ÿÿ³ÿÿ³ÿÿC_øC_ôÿÿ³ÿÿ³ÿÿ#Çÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ"Æÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ·ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ·ÿÿ³ÿÿÿÿ³ÿÿ¿ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¾ÿÿ³ÿÿÿÿ³ÿÿ"Æÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ!Æÿÿ³ÿÿÿÿ³ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ³ÿÿÿÿ³ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþü?øðàÀ€ÀÀÀÀÀÀÀ( @ €ZZZÿÿZZÿ³ÿÿ³ÿÿÿZ Zÿ³ÿÿÄÿÿÃÿÿ³ÿÿÿZZÿ³ÿÿ´ÿÿ'Éÿÿ&Éÿÿ´ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ»ÿÿ(Êÿÿ(Êÿÿ»ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿÃÿÿ(Êÿÿ(ÊÿÿÂÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ´ÿÿ&Éÿÿ(Êÿÿ(Êÿÿ&Éÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ»ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ ºÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÂÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(ÊÿÿÁÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ´ÿÿ&Éÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ%Èÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ ºÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ ¹ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÂÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(ÊÿÿÁÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZPÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ%Èÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ$Èÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿJFÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ ¹ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ ¹ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿ@<ÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÁÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(ÊÿÿÀÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿ6ÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ%Èÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ$Çÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿÿÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ ¹ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ ¸ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿÿÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÀÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¿ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ$Çÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ#Çÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ ¸ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ·ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ³ÿÿÀÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¿ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ#Çÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ"Æÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ¸ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ·ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ¿ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¾ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ"Æÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ!Æÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ·ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¶ÿÿ³ÿÿÿÿ³ÿÿ¾ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¾ÿÿ³ÿÿÿÿ³ÿÿ!Æÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ Åÿÿ³ÿÿÿÿ³ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ'Éÿÿ³ÿÿÿÿ³ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþü?øðààÀ€øøøøøøøøøøøøøøsabnzbd-develop/interfaces/Config/templates/staticcfg/ico/apple-touch-icon-120x120-precomposed.png0000600000175000017500000000236313642116632031116 0ustar jpjp‰PNG  IHDRxxºÆà2PLTE @-ï§@0@3 @/ ??? 000€€€ÀÀÀ```ààà¿¿¿ßßß@@@?,?-?2 ?-<* ÿ¹  pÉ” ²ÿ³ÿÁÿº ÿ¼ÿÈ%ÿÅ ÿ·ÿÀÿ·ÿÇ#ÿ¾ÿµeÿÂP8 0"ð¨`C¿†Ï‘ÿÿÿ¿‘ܤcJpYnS ´}ÿÊ(°{Ϥ À† t€Z¿—dWBK4Yï½%Ð’eÈàx3DtRNS_¿@ ϯp€?Ÿïßo`0 ÀðàP¨Ð°º›)TIDATxÚíÙiWÚ@Æñ©‚DRm—Bk[·î«í\–¸×î›Ý—ïÿê u$“&“{§ã‹æÿFOÎÈïð(aÑ5ÔHŽé—ƒmxŒ6®ëæÀpŽ&\‡_¼2ÒgØO÷×ìŠÃõ7Fzžn˜¦†yË„ë½OÙÚGÀF¶î `nÀír ¼f`iÜ4°4 îXÓ·ö‘p“¼4 ¦oÝâ(˜¾uÓ·n á6qi4Ì=ÒÒ8 -M€Û¤¥‘0uë: KcaêÖ ·^CÃÄ­›D¸ƒ…{D˜w±KSa¹4î —&ü‹[šû¨¥ 0ië6¦líqLÙ:07pKÓaÞÂ-M‡ëˆ¥ 0aë6 ÆoíqŒß: Áø­;4½u—Ó`ôÖ¾A¸‰[š÷pKÓa¾†[š7qKÓábi,ŒÜÚO;§‡šÀÈ­úðÈ$DÄq[·¸«9+ÜDÆq[×`y›¢zp å¾û°w¬þS ‡*³Š&ÜÖq_B¨õ×˦`ãíŽç%»?TàËŽRÿvÅ—Í-®”~ëo‘ò ¾oˆËE–ŸNõ·þâÃý¸3ŽøëÒ”=-x÷X°ßW>ÔÖ¦¸8]fL_°êJy=qk,]˜ª”··&ÁÒ-±£\-Ù'ÂÒ•UtäÞ–nJ¹?‹‡UWäŒèÂÜßÚ޹ؿt9¶+QðüÜaWAt.ä–'!±yHJ…Õ&”ç‹Cwsž)ﲮŵÉGX9²(N(ðn\K`âÈrgðîr¸)—¯ÇÂòˆ6 š-ÅÂG28ƒ‡~äF¸)—o"aúë8ƒ3X^ ·û¨òΡ_¤DØ™± Ë '—OjêÒ¿„³÷\üÁEqáV\ `âÈ¢ú¿Ú^Uv¼){ð윯BbfŽŒ³P¥ñ©¸jnž•΃èöÑÝ{ƒî‹ï<Qmÿˆ›ð(9–>ù  üÐË‹þÄÎ|)ûBŸœÙ ¸pIòÞÁÝlïÈu³#¯îfÜ ³PíPnˆ¥-ºÌ©Ê-÷¥kQ®«Òµ)?~¢c–å Uf[–®ÅÊÓÒµ,W…[s˜ýf]7ÇÐýkó¼rƒ/IEND®B`‚sabnzbd-develop/interfaces/Config/templates/staticcfg/ico/apple-touch-icon-180x180-precomposed.png0000600000175000017500000000324713642116632031134 0ustar jpjp‰PNG  IHDR´´ öDPLTEÿµÿÂÿÁÐ’ pÿº €€€`Cð¨ÿÿÿ?,À˜ÿ³```ÀÀÀÿÊ(@-P8ŸŸŸÐÐÐÀ†œnÿ¹ €Z@@@000ÿ·e¿¿¿ÿÅ ï½%pYϤ pÿ¾ÿÀµ~ܤï§È]` ¿†°{Y0"0&ÿÄ ¯{Ï‘¿—ÿ¾ÿÇ# àààe   pppßßßdÿÈ%ÿ¼X=b` ÿ·õ³ ~\=-vÿë"tRNS€À¿0ð`Р@ pPïߟà°_o¯OÏü¾þLèÄ’vAðIDATxÚíÝëwÓ6Æa5̹9—lƒ%†Ð²©¡”è æb; ì–îžlË@ÿÿw‰@‡£ÊT•^ÅÙô~÷ñÓö—¦Mâ„||å“Gît™˜¯ÕfŽ·šš²9lÉÌÜdsYhbn°ùlÙ]esZÙ}|^誺Ħë^q¶ü¦hŽ»C?²†î83'ÛÖÐÔY©E´³>&Ñ®úR‹hW}dVÑcGuXEwÕaM'uXF§Nê°ŒŽÔaí¦Ì.ÚM7¬£ñ}Œ¨u4¾€†÷Ñ cx4‚뀠3pô\î# á}ŒhxÝG—¢Ð°ú°šŽpuàЬ º«ˆ¦#T4ºF÷#Ðà>ŠEG: hp1ÝÔFÓ. 8z ¨ŽîêÀ ¡}d 4´ ìcHAhd ìcâꀣi¨ŽNuÀÑ1 ×G„Cãúèáа>F‡†õ9Dÿ¨Žžê€£éPꀣ'€:hD](ÔÇŠõÑ¢1}t©kt¨ŽîꀣéPꀣ{Æu€Ñˆ> F#úHÑhD1 è#¡óAwê0E7NødßµsÑcÛuôòþž#'œœ`Êå¢;–ëhõÚ§fè3LmÞGª‰;zÀ+©ý>b ´|]W™i£Íû¸wuCÚæÍí¡Û„TµÑæ}ÜeŠm<hõʤΦû*oÔn/Ôž½oóÞÇ»KW©ÆÌú¸År¶AÕ[ãè©2õK}ó–»ïs͸þ¶ÎønRý%‡E_–¶“‹^e|MñgÑt úÀ¢…¹Nf j‡WÇp´l6W'h´l6W§h´l–ÕÏuûÀ£/Êf®>ÆfÛ» ©‚ÑÂ\ ¤·©Ráвٖz¢‰þC-›ÕjdO4вY­~z}û û÷ñµÎî<ÎG>8ÅuÉ,¡?ÿ‚émãýeÀ4§F«wö3›ï@ÂÉ(´Ø§Á~æ3-ÔD^Ð.8šµÌãp.Éè¥Â£ÛÊǯjì;6ÛŽÆ1ëjô5åAüËQ¢/+§þÖ\Ò8¦¯F«wÉ£=Ú£=Ú£Õè¾rß°ÙÖûªmé ·øA?[@3ƒíh ÅΣ=Ú£=Ú£Ý#z´G{´G{ôÿ½ÂïÔÛÒ8˯ü˜ßh­ ûÚgÁ߇‹ˆ&¥ED·,/ ºiÚÿö8ÄÓ¿kœå6?æš­~úâ¶Ò£=Ú£=ú?†îK3yúBÞŸŒéŸh]…®³Âð¹Oð•0üäþÓ¸– n®).‰+ò*e²ïšýY°Âtw, õO´ÕÂæ’΀Ò8wžñýµË÷÷-¾vù6ß—ÓïX¹ªw¢±=ùeÌ©xk(ù%£Å˜üÒÚ˜›‡3NÌÐÀŒS§¼€£}Œ¦æ Æf¼z°ö¾hjÞc³U¤p«2¡æ}ô¸YÜ;[ó:f˜zÚG0cÕÙÛ:Öfœz“N®ŒÄu,$ÞqqEæ0æ*)ôêïÕÙ¿3Zýê5À WãÌxu³ð`ùÿ¶:YŒ5€¯.‰ûhÕÊ[r-$‹µF´7$`MCB‹”IEND®B`‚sabnzbd-develop/interfaces/Config/templates/staticcfg/ico/apple-touch-icon-152x152-precomposed.png0000600000175000017500000000274313642116632031132 0ustar jpjp‰PNG  IHDR˜˜/Ð5PLTE?,?2 ÏÏÏ¿¿¿ààà@@@???pppßßß000ïïï@10$   ÐÐÐ```4$?-?2 0!˜ojLÿº ÿÁÿ³ÿ·ÿµÿ·ÿÀÿÅ ÿ¼0" ÿ¾ÿÈ%ÿÇ#ÿÂß°#`C@-P8ð¨€Zà •hXAÀÀÀoX¿“ pÿ¹ ÿ¾ÿÊ(¿— €€€¨} °‹°{€^¿†@3 pOÏ‘YÿÿÿÐ’ï½%ÿÄÄpxÆtRNSÀ@€0ðÐ`p à P¯°¿ïÏOW¥oß_èÜ[îCÖ@IDATxÚíÛysÓVÆáïKpe­Óâ²”BiéÛŠ’8ÆšÒRHP(í÷ÿ`É3gŽ3W~ÏqÕ©~ÿFÑ<É›e¢\›Ó*_ZRì\ÓÌWu…”[šÏu–Ô[™¶A ¨aÒG‹¨ÞU¦…”V¤qü®ÖÏì` åÚÚÇ`¾l„yZ°.³¥%- ó•–„ažÒ’0Ì*-‰Ã†°°PÖ€õ\{‡©lˆÀB…%E`=%q˜Æ–,_RÖ_Rf·da¾lWæ‰Àä·X˜ü–¾ L~KOÖ_‡‰oé ÁÄ·ôDa}Á%EavO 6†R°P &½eOf÷d—ÄaÂ[†â°¾ì’8LvË¡•‡"K*À~YR&ñ@ê«óqØ® ÌÃa]¾å–Õùð’J0^R fè’Z0\R ‚KªÁzà# ü@*Ðá[öa=hI¾e  %Ua=`I¾e  Û–T…uGJ0씯÷ôÔa]`Iq¾¥¯÷ôëK Ãð-ýù`ÖÖ‰‡à’ Œo}­±ªkå ë,xo…Ü`À©¡M £’1-r€a[¾~»¢ƒ7 Œ¯iJ0hËGïˆiûýé°–)и??ð[tË¿_Ûγ|'[–âà‰ºå/4£Ç–íã«›"9È€-ŸÒ¬NsQÓ˜Âé2pËG43îË䧉«dŒ©.§—ùΰ—4î诩gÁžlSTÍŒ+W’ÑóÄ`¼«j¦d#wÙ@Æ»æ•ùb0Þ5·Ì“€ñ®Êg ˆÃFWÙLU§¸`K6åâe¿:o‰Ãx(s„=wƒ%.¦/È­íѱ=}K.½ºÍÃftža•Ï’{ûä\*-¡/]Ñ‚Që$¬DÙ€­WÍt…ŒÀ¨È½¦¦ýKçtm›…m²×Þd_4y—(ÎéÚ£ÆÄ}K9,‡å°ÿ ìÚű]caü¿›vHé;daü;9,‡å°”°_±QÿÆL÷lËa9ìkw¸®;Á®w¢îHà 4³Ž¬£ô“#«°êrFaeÊ(l5«°‹Y…Ѹ»_sm:Á6ã‹o¹ÀnMnœÿÁ›ÃrX“†µ;.Q\Ç¥6¹ß˜j] ŒTþ3¢YÅœ¬F™¨eNÖL3æ*¹W[&ç* ÃÔ8Spk£hÊ¥Ëõý½«Q?|÷ãÕ¸ûw¥aªÕ‚[¥¦AK¾]v>N\ô§èœ1‹¯ZKŽÞ$§P=À¥#ëF®àR’Å[ú€KKö"^29jUû×\ÓG¼úcDgñ%G¼âÓnCÀ¥$E'CÀ¥&oÙ\в½!sÔ* ² LŽèd¢:Å=x¸Te€KK†»ôe€KSV©›ŒUŒ~;ÕÊ&{ëõ¦ë¬°yW§DmIEND®B`‚sabnzbd-develop/interfaces/Config/templates/staticcfg/ico/faviconpaused.ico0000600000175000017500000001246613642116632025340 0ustar jpjp h&  ¨Ž(  @ÿÿÿiiiÿiiiÿÿÿiiiÿÊÊÊÿÊÊÊÿiiiÿÿÿiiiÿ¹¹¹ÿÒÒÒÿÒÒÒÿ¹¹¹ÿiiiÿÿÿiiiÿ¹¹¹ÿÀÀÀÿÕÕÕÿÕÕÕÿÀÀÀÿ¹¹¹ÿiiiÿÿÿiiiÿ¹¹¹ÿ¹¹¹ÿÉÉÉÿÕÕÕÿÕÕÕÿÉÉÉÿ¹¹¹ÿ¹¹¹ÿiiiÿÿÿiiiÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÒÒÒÿÕÕÕÿÕÕÕÿÒÒÒÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿiiiÿÿÿiiiÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¿¿¿ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¿¿¿ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿiiiÿÿÿÿÿ¹¹¹ÿ¹¹¹ÿÈÈÈÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÈÈÈÿ¹¹¹ÿ¹¹¹ÿÿÿÿÿ¹¹¹ÿ¹¹¹ÿÑÑÑÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÑÑÑÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¾¾¾ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¾¾¾ÿ¹¹¹ÿÿÿ¹¹¹ÿÇÇÇÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÇÇÇÿ¹¹¹ÿÿÿ¹¹¹ÿÐÐÐÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÐÐÐÿ¹¹¹ÿÿÿ¹¹¹ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¹¹¹ÿÿÿ¹¹¹ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿþü?øðàÀ€ÀÀÀÀÀÀÀ( @ €ZZZÿÿZZÿÀÀÀÿ¹¹¹ÿÿZZÿ¹¹¹ÿÎÎÎÿÎÎÎÿ¹¹¹ÿÿZZÿ¹¹¹ÿ»»»ÿÔÔÔÿÔÔÔÿ»»»ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿÄÄÄÿÕÕÕÿÕÕÕÿÄÄÄÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÍÍÍÿÕÕÕÿÕÕÕÿÍÍÍÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿºººÿÔÔÔÿÕÕÕÿÕÕÕÿÔÔÔÿºººÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÃÃÃÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÃÃÃÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÌÌÌÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÌÌÌÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿºººÿÔÔÔÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÔÔÔÿºººÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÂÂÂÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÂÂÂÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿËËËÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿËËËÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÓÓÓÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÓÓÓÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÁÁÁÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÁÁÁÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÊÊÊÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÊÊÊÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÓÓÓÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÓÓÓÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿÿÿÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÀÀÀÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÀÀÀÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿÿÿÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÉÉÉÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÉÉÉÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÒÒÒÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÒÒÒÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÀÀÀÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÀÀÀÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÉÉÉÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÉÉÉÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÒÒÒÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÒÒÒÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¿¿¿ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¿¿¿ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿÈÈÈÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÈÈÈÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿÑÑÑÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÑÑÑÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¾¾¾ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¾¾¾ÿ¹¹¹ÿÿÿ¹¹¹ÿÇÇÇÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÇÇÇÿ¹¹¹ÿÿÿ¹¹¹ÿÐÐÐÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÐÐÐÿ¹¹¹ÿÿÿ¹¹¹ÿÔÔÔÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÔÔÔÿ¹¹¹ÿÿÿ¹¹¹ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþü?øðàÀ€øøøøøøøøøøøøøøsabnzbd-develop/interfaces/Config/templates/staticcfg/ico/android-192x192.png0000600000175000017500000000335513642116632025075 0ustar jpjp‰PNG  IHDRÀÀeœ52PLTEXA¿’.#iÿÊ(ÿÇ#@-€ZÿÅ ÿÀÿ¾ÿ·ÿ·ÿ³ÿ¹ ÿÈ%ÿÁÿ¾ÿº ÿµÿÂÿ¼ÿÄï§À†Ï‘ß°#P? er 0"Y¿†¯ŠŸo  pï½%`Ce?2 pOÐ’ÀÀÀÿÿÿ@@@ð¨ 0!Àˆ €eÀ”xT ŸŸŸ€€€   àààÏÏÏ¿¿¿000pppâ§²’ÏSmctRNS?o0Ïÿ¯pï@ß¿P €Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_O`ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿàÿÿðÿÿÿÿÐÿ°ÿÿÿÿÿÿÿÿÃÿÿÿÿÿÿÿÿÿÿÈ÷¦¤—¾žIDATxÄÏBQ°óí¹áÐ?(V¹¶Ã7¦yÑ·Î`²9o$L`½”A–½¥4h*ÞTQóÆ:h†7Ö@³óoûƒº£<ÓYÛåʸ=ˆ±Ú‚( ‚’A8Mø¾ÙÈ¡Il½ƒPR+õoÐô4`< ˜é‚êa@…j ý=È6ôªÇÙ†lIÀ#ZÔW° hÁ‚` "€\C Z¬ ˆ5t@°¡³ ØÐÅ{¨ ¨W¦ X‘‚ `d±†Î2€XCb M ð ý–œ¼ ¸xApð‚(À7Ô9749àÀq€mhóÛÐ:Õ€º EÝä“äp´· Û‚<`Ú‚<@5´<À6´ÇÓMup“tÍäÃ䢡4[ Z€†N° ]`:€zÙ‚<`Ù‚<`gyhè¬<`Ù‚<`Gyhè.  õ(44ß(0Õ³€\  (àyh¨G ¡™€†¾* µ(44Þ˜  ( ~AAQ@E$ ¡ö àã¿»àm 8>VåÎ%N‡effæ6œã»r—÷û„RRµö3Íö)#½¿¸¡ùI³P+Ï3þeBýü t)›µiúÜP0`}I4Üœ/ͧ19€»C£ flxÊN#ÀÜ¡q3t" 0ÀÛ …EoK‘¸ `#À¹Ð¾²º†¾u¯G @Š `\hߨDeÝ ÑláKÛ;í}ÿÚà¶÷ƒ':À—æ!͇’ÄØ¡£M lg(¨cl怃c‡N0¤(ó£Ö)GÀØ¡3 i)Âüp:whCÚRuŽ­Š9xj_+éÜ!lV®xª†ü!8Ä׿á¥-luL0®  ˜Ÿ/ÑPÌÏŒjÐüypUc Æõhþ-pg‘ žd‡tJ®ù‚í‚Qõü|Á¸€z~¾`D€æo€_V1¹`T€æ¯Yà›M‚¸€©·Ô÷ίüѱõÅ…¡§þüëï˜ý èîq÷ïáóC&é|aý§¨ú?þY˜,_ @yÃ.d¤€éø”B)Å ‚˜o( à€'›]Äë¯S®^×ÂåÕ÷­Ä«ŠÌ× R×```q7×ê.±Õu@ñôy·L}³˜zÌ À ÀÚpw¯î¶ºˆñ_ >À À À ‡ÍªÅ¼§×i@‘÷š Çô ÒŽt4„ì´p@…2ÂJ˜«Ó```m°PR)ðvŠ‚rÔÿQ|Êen•B)À¿Tµœðu[§ ?ÏE¹åÆ­¶eƒµüãöñ“V¾Û~Úp€Wä¯îÓ©ˆIõWèÛ'{NEL½Î¿Í˜_¿€NÖL˜ß+ š1?ýwŠ£´Aîù‹6´ió߯ÝÔÍ™_¿àv¨—Î0Óü2ÍêWÌ/A0õ ”0?•r &šDócÚ¾-·`òeƒÎÝg˜% JÏ;4è9ƒ-GpPšøµW1¿Ád¿b~)‚Ï_ÜgàÅDg“¿*ÎÀ‹ˆ›Ÿ¢ç'Í/ZЉYº•—Àè:M͹YÎ[Oÿo\º3–‡0IEND®B`‚sabnzbd-develop/interfaces/Config/templates/staticcfg/ico/safari-pinned-tab.svg0000600000175000017500000000440113642116632026010 0ustar jpjp sabnzbd-develop/interfaces/Config/templates/staticcfg/ico/apple-touch-icon-76x76-precomposed.png0000600000175000017500000000172613642116632031004 0ustar jpjp‰PNG  IHDRLLÇ—Q+IDATxíÜdÜPð·r2]¹^Ím5ÖXÁM h(C±Á@°Î€6, 0ìlãcÅX9uVÕ¤³jMé°Ù@ ööþ–.Ú÷r{—|©÷ø8·Köò«/I®OÙˆcI$(q>‰¸,§áŠðs;0ÿù¹‚ýúXçüÛ­RåÇûZq`o­Òí¿®®2Î÷æË¶kÓœ Û™-Øv lsª<`= ¬+²‹N]†V’Z†u 0üZRaÀðkÕ ¿–a ¿–= »–QAÁ¾\C¬#0ØVìó$0ØÆ"º  ­–;³ø`PµÜœÂ£Z"Õ,ª%RñÁ¨–@uÄ£ZÕŒòõ:TñÁ¶kÅmUKÖ«¶1QB0Ê®?]¡»  ¦–TG|0 ZRñÁ@jÕ ¥–TG|0 ZRs³EVD^*$ÈFÙ›/¬Ž°@ñ˜)vŒåˆ‰ð¬Q 빬›È–9. DøXÁzÖØ ëóÜ»_åîí Üm°3³t—ñµçÿ¶Î’o´–VÕsô@Š­¥{g2ÓA7æ²£·xbûÀZñÓ—ï¿QFˆRl-Õ±â¨ÿ ;ÍÔ¶‹F8v´ž5V0×uùYƒþ=þl ?•Y$±:,1¦EúcG£ZâƒI±òC ë`¬~ $E³¯0~¼†UKý`,2‘Œ9‘ŸñFWkŒ¿xÀ¸ÿhôÐÉsðîïmˆÿx†ûË—µ¤µ23˜·˜žãÓ{Œ_¬œÀú®‚5-¹/ƒ:X¦´e`ž7`'b+=X·Z-–$'àyž¶ý:Ž£ vxx¨º_šcêqH †!×5’`¾ïsMƒä`Ùͱd`̀ѕ“³m[y»N§£ ¬ÙlÆû¥×¹ƒår壉ëKÖ€aƒ-,,¨&UIÕíÚí6"þI߀0FF„¦”áp¨ ,½_l0oW3ýŸÅs²a°fÄ€iÿzg0hCPßo„ýëz}ί’æÛ fÀLF¹­09Výës¡æÿ¸/Ò9мßß"Ñ2¤¡f(ڧÆMˆSÜÆ‹ˆ« é7ðÎÔAPhÞâ)‹ˆ·ªKŠÖ³R‹|݆ÁJ?ì'ÑhYU³Kïɱ ZX§jþ‹ÅOÁ2h¯žXüÙÃJz¹¤§£ŽeÐ –â3Åe`ãYÛŠw—G+IEND®B`‚sabnzbd-develop/interfaces/Config/templates/staticcfg/images/0000700000175000017500000000000013642116632022475 5ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/images/logo-full.svg0000600000175000017500000000421013642116632025115 0ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/images/logo-arrow.svg0000600000175000017500000000112213642116632025304 0ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/images/logo-small.svg0000600000175000017500000001043213642116632025266 0ustar jpjp image/svg+xml 3 sabnzbd-develop/interfaces/Config/templates/staticcfg/js/0000700000175000017500000000000013642116632021644 5ustar jpjpsabnzbd-develop/interfaces/Config/templates/staticcfg/js/jquery.tablesort.min.js0000600000175000017500000001114713642116632026307 0ustar jpjp/* A simple, lightweight jQuery plugin for creating sortable tables. https://github.com/kylefox/jquery-tablesort Version 0.0.11 */ (function($) { $.tablesort = function ($table, settings) { var self = this; this.$table = $table; this.$thead = this.$table.find('thead'); this.settings = $.extend({}, $.tablesort.defaults, settings); this.$sortCells = this.$thead.length > 0 ? this.$thead.find('th:not(.no-sort)') : this.$table.find('th:not(.no-sort)'); this.$sortCells.on('click.tablesort', function() { self.sort($(this)); }); this.index = null; this.$th = null; this.direction = null; }; $.tablesort.prototype = { sort: function(th, direction) { var start = new Date(), self = this, table = this.$table, rowsContainer = table.find('tbody').length > 0 ? table.find('tbody') : table, rows = rowsContainer.find('tr').has('td, th'), cells = rows.find(':nth-child(' + (th.index() + 1) + ')').filter('td, th'), sortBy = th.data().sortBy, sortedMap = []; var unsortedValues = cells.map(function(idx, cell) { if (sortBy) return (typeof sortBy === 'function') ? sortBy($(th), $(cell), self) : sortBy; return ($(this).data().sortValue != null ? $(this).data().sortValue : $(this).text()); }); if (unsortedValues.length === 0) return; //click on a different column if (this.index !== null && this.index !== th.index()) { this.direction = 'asc'; this.index = th.index(); } else if (direction !== 'asc' && direction !== 'desc') this.direction = this.direction === 'asc' ? 'desc' : 'asc'; else this.direction = direction; direction = this.direction == 'asc' ? 1 : -1; self.$table.trigger('tablesort:start', [self]); self.log("Sorting by " + this.index + ' ' + this.direction); // Try to force a browser redraw self.$table.css("display"); // Run sorting asynchronously on a timeout to force browser redraw after // `tablesort:start` callback. Also avoids locking up the browser too much. setTimeout(function() { self.$sortCells.removeClass(self.settings.asc + ' ' + self.settings.desc); for (var i = 0, length = unsortedValues.length; i < length; i++) { sortedMap.push({ index: i, cell: cells[i], row: rows[i], value: unsortedValues[i] }); } sortedMap.sort(function(a, b) { return self.settings.compare(a.value, b.value) * direction; }); $.each(sortedMap, function(i, entry) { rowsContainer.append(entry.row); }); th.addClass(self.settings[self.direction]); self.log('Sort finished in ' + ((new Date()).getTime() - start.getTime()) + 'ms'); self.$table.trigger('tablesort:complete', [self]); //Try to force a browser redraw self.$table.css("display"); }, unsortedValues.length > 2000 ? 200 : 10); }, log: function(msg) { if(($.tablesort.DEBUG || this.settings.debug) && console && console.log) { console.log('[tablesort] ' + msg); } }, destroy: function() { this.$sortCells.off('click.tablesort'); this.$table.data('tablesort', null); return null; } }; $.tablesort.DEBUG = false; $.tablesort.defaults = { debug: $.tablesort.DEBUG, asc: 'sorted ascending', desc: 'sorted descending', compare: function(a, b) { if (a > b) { return 1; } else if (a < b) { return -1; } else { return 0; } } }; $.fn.tablesort = function(settings) { var table, sortable, previous; return this.each(function() { table = $(this); previous = table.data('tablesort'); if(previous) { previous.destroy(); } table.data('tablesort', new $.tablesort(table, settings)); }); }; })(window.Zepto || window.jQuery);sabnzbd-develop/interfaces/Config/templates/staticcfg/js/filesize.min.js0000600000175000017500000000366213642116632024607 0ustar jpjp/* 2017 Jason Mulligan @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.mapsabnzbd-develop/interfaces/Config/templates/staticcfg/js/chartist.min.js0000600000175000017500000011642613642116632024621 0ustar jpjp/* Chartist.js 0.11.0 * Copyright © 2017 Gion Kunz * Free to use under either the WTFPL license or the MIT license. * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT */ !function(a,b){"function"==typeof define&&define.amd?define("Chartist",[],function(){return a.Chartist=b()}):"object"==typeof module&&module.exports?module.exports=b():a.Chartist=b()}(this,function(){var a={version:"0.11.0"};return function(a,b,c){"use strict";c.namespaces={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},c.noop=function(a){return a},c.alphaNumerate=function(a){return String.fromCharCode(97+a%26)},c.extend=function(a){var b,d,e;for(a=a||{},b=1;b":">",'"':""","'":"'"},c.serialize=function(a){return null===a||void 0===a?a:("number"==typeof a?a=""+a:"object"==typeof a&&(a=JSON.stringify({data:a})),Object.keys(c.escapingMap).reduce(function(a,b){return c.replaceAll(a,b,c.escapingMap[b])},a))},c.deserialize=function(a){if("string"!=typeof a)return a;a=Object.keys(c.escapingMap).reduce(function(a,b){return c.replaceAll(a,c.escapingMap[b],b)},a);try{a=JSON.parse(a),a=void 0!==a.data?a.data:a}catch(b){}return a},c.createSvg=function(a,b,d,e){var f;return b=b||"100%",d=d||"100%",Array.prototype.slice.call(a.querySelectorAll("svg")).filter(function(a){return a.getAttributeNS(c.namespaces.xmlns,"ct")}).forEach(function(b){a.removeChild(b)}),f=new c.Svg("svg").attr({width:b,height:d}).addClass(e),f._node.style.width=b,f._node.style.height=d,a.appendChild(f._node),f},c.normalizeData=function(a,b,d){var e,f={raw:a,normalized:{}};return f.normalized.series=c.getDataArray({series:a.series||[]},b,d),e=f.normalized.series.every(function(a){return a instanceof Array})?Math.max.apply(null,f.normalized.series.map(function(a){return a.length})):f.normalized.series.length,f.normalized.labels=(a.labels||[]).slice(),Array.prototype.push.apply(f.normalized.labels,c.times(Math.max(0,e-f.normalized.labels.length)).map(function(){return""})),b&&c.reverseData(f.normalized),f},c.safeHasProperty=function(a,b){return null!==a&&"object"==typeof a&&a.hasOwnProperty(b)},c.isDataHoleValue=function(a){return null===a||void 0===a||"number"==typeof a&&isNaN(a)},c.reverseData=function(a){a.labels.reverse(),a.series.reverse();for(var b=0;bf.high&&(f.high=c),h&&c0?f.low=0:(f.high=1,f.low=0)),f},c.isNumeric=function(a){return null!==a&&isFinite(a)},c.isFalseyButZero=function(a){return!a&&0!==a},c.getNumberOrUndefined=function(a){return c.isNumeric(a)?+a:void 0},c.isMultiValue=function(a){return"object"==typeof a&&("x"in a||"y"in a)},c.getMultiValue=function(a,b){return c.isMultiValue(a)?c.getNumberOrUndefined(a[b||"y"]):c.getNumberOrUndefined(a)},c.rho=function(a){function b(a,c){return a%c===0?c:b(c,a%c)}function c(a){return a*a+1}if(1===a)return a;var d,e=2,f=2;if(a%2===0)return 2;do e=c(e)%a,f=c(c(f))%a,d=b(Math.abs(e-f),a);while(1===d);return d},c.getBounds=function(a,b,d,e){function f(a,b){return a===(a+=b)&&(a*=1+(b>0?o:-o)),a}var g,h,i,j=0,k={high:b.high,low:b.low};k.valueRange=k.high-k.low,k.oom=c.orderOfMagnitude(k.valueRange),k.step=Math.pow(10,k.oom),k.min=Math.floor(k.low/k.step)*k.step,k.max=Math.ceil(k.high/k.step)*k.step,k.range=k.max-k.min,k.numberOfSteps=Math.round(k.range/k.step);var l=c.projectLength(a,k.step,k),m=l=d)k.step=1;else if(e&&n=d)k.step=n;else for(;;){if(m&&c.projectLength(a,k.step,k)<=d)k.step*=2;else{if(m||!(c.projectLength(a,k.step/2,k)>=d))break;if(k.step/=2,e&&k.step%1!==0){k.step*=2;break}}if(j++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}var o=2.221e-16;for(k.step=Math.max(k.step,o),h=k.min,i=k.max;h+k.step<=k.low;)h=f(h,k.step);for(;i-k.step>=k.high;)i=f(i,-k.step);k.min=h,k.max=i,k.range=k.max-k.min;var p=[];for(g=k.min;g<=k.max;g=f(g,k.step)){var q=c.roundWithPrecision(g);q!==p[p.length-1]&&p.push(q)}return k.values=p,k},c.polarToCartesian=function(a,b,c,d){var e=(d-90)*Math.PI/180;return{x:a+c*Math.cos(e),y:b+c*Math.sin(e)}},c.createChartRect=function(a,b,d){var e=!(!b.axisX&&!b.axisY),f=e?b.axisY.offset:0,g=e?b.axisX.offset:0,h=a.width()||c.quantity(b.width).value||0,i=a.height()||c.quantity(b.height).value||0,j=c.normalizePadding(b.chartPadding,d);h=Math.max(h,f+j.left+j.right),i=Math.max(i,g+j.top+j.bottom);var k={padding:j,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return e?("start"===b.axisX.position?(k.y2=j.top+g,k.y1=Math.max(i-j.bottom,k.y2+1)):(k.y2=j.top,k.y1=Math.max(i-j.bottom-g,k.y2+1)),"start"===b.axisY.position?(k.x1=j.left+f,k.x2=Math.max(h-j.right,k.x1+1)):(k.x1=j.left,k.x2=Math.max(h-j.right-f,k.x1+1))):(k.x1=j.left,k.x2=Math.max(h-j.right,k.x1+1),k.y2=j.top,k.y1=Math.max(i-j.bottom,k.y2+1)),k},c.createGrid=function(a,b,d,e,f,g,h,i){var j={};j[d.units.pos+"1"]=a,j[d.units.pos+"2"]=a,j[d.counterUnits.pos+"1"]=e,j[d.counterUnits.pos+"2"]=e+f;var k=g.elem("line",j,h.join(" "));i.emit("draw",c.extend({type:"grid",axis:d,index:b,group:g,element:k},j))},c.createGridBackground=function(a,b,c,d){var e=a.elem("rect",{x:b.x1,y:b.y2,width:b.width(),height:b.height()},c,!0);d.emit("draw",{type:"gridBackground",group:a,element:e})},c.createLabel=function(a,d,e,f,g,h,i,j,k,l,m){var n,o={};if(o[g.units.pos]=a+i[g.units.pos],o[g.counterUnits.pos]=i[g.counterUnits.pos],o[g.units.len]=d,o[g.counterUnits.len]=Math.max(0,h-10),l){var p=b.createElement("span");p.className=k.join(" "),p.setAttribute("xmlns",c.namespaces.xhtml),p.innerText=f[e],p.style[g.units.len]=Math.round(o[g.units.len])+"px",p.style[g.counterUnits.len]=Math.round(o[g.counterUnits.len])+"px",n=j.foreignObject(p,c.extend({style:"overflow: visible;"},o))}else n=j.elem("text",o,k.join(" ")).text(f[e]);m.emit("draw",c.extend({type:"label",axis:g,index:e,group:j,element:n,text:f[e]},o))},c.getSeriesOption=function(a,b,c){if(a.name&&b.series&&b.series[a.name]){var d=b.series[a.name];return d.hasOwnProperty(c)?d[c]:b[c]}return b[c]},c.optionsProvider=function(b,d,e){function f(b){var f=h;if(h=c.extend({},j),d)for(i=0;i=2&&a[h]<=a[h-2]&&(g=!0),g&&(f.push({pathCoordinates:[],valueData:[]}),g=!1),f[f.length-1].pathCoordinates.push(a[h],a[h+1]),f[f.length-1].valueData.push(b[h/2]));return f}}(window,document,a),function(a,b,c){"use strict";c.Interpolation={},c.Interpolation.none=function(a){var b={fillHoles:!1};return a=c.extend({},b,a),function(b,d){for(var e=new c.Svg.Path,f=!0,g=0;g1){var i=[];return h.forEach(function(a){i.push(f(a.pathCoordinates,a.valueData))}),c.Svg.Path.join(i)}if(b=h[0].pathCoordinates,g=h[0].valueData,b.length<=4)return c.Interpolation.none()(b,g);for(var j,k=(new c.Svg.Path).move(b[0],b[1],!1,g[0]),l=0,m=b.length;m-2*!j>l;l+=2){var n=[{x:+b[l-2],y:+b[l-1]},{x:+b[l],y:+b[l+1]},{x:+b[l+2],y:+b[l+3]},{x:+b[l+4],y:+b[l+5]}];j?l?m-4===l?n[3]={x:+b[0],y:+b[1]}:m-2===l&&(n[2]={x:+b[0],y:+b[1]},n[3]={x:+b[2],y:+b[3]}):n[0]={x:+b[m-2],y:+b[m-1]}:m-4===l?n[3]=n[2]:l||(n[0]={x:+b[l],y:+b[l+1]}),k.curve(d*(-n[0].x+6*n[1].x+n[2].x)/6+e*n[2].x,d*(-n[0].y+6*n[1].y+n[2].y)/6+e*n[2].y,d*(n[1].x+6*n[2].x-n[3].x)/6+e*n[2].x,d*(n[1].y+6*n[2].y-n[3].y)/6+e*n[2].y,n[2].x,n[2].y,!1,g[(l+2)/2])}return k}return c.Interpolation.none()([])}},c.Interpolation.monotoneCubic=function(a){var b={fillHoles:!1};return a=c.extend({},b,a),function d(b,e){var f=c.splitIntoSegments(b,e,{fillHoles:a.fillHoles,increasingX:!0});if(f.length){if(f.length>1){var g=[];return f.forEach(function(a){g.push(d(a.pathCoordinates,a.valueData))}),c.Svg.Path.join(g)}if(b=f[0].pathCoordinates,e=f[0].valueData,b.length<=4)return c.Interpolation.none()(b,e);var h,i,j=[],k=[],l=b.length/2,m=[],n=[],o=[],p=[];for(h=0;h0!=n[h]>0?m[h]=0:(m[h]=3*(p[h-1]+p[h])/((2*p[h]+p[h-1])/n[h-1]+(p[h]+2*p[h-1])/n[h]),isFinite(m[h])||(m[h]=0));for(i=(new c.Svg.Path).move(j[0],k[0],!1,e[0]),h=0;h1}).map(function(a){var b=a.pathElements[0],c=a.pathElements[a.pathElements.length-1];return a.clone(!0).position(0).remove(1).move(b.x,r).line(b.x,b.y).position(a.pathElements.length+1).line(c.x,r)}).forEach(function(c){var h=i.elem("path",{d:c.stringify()},a.classNames.area,!0);this.eventEmitter.emit("draw",{type:"area",values:b.normalized.series[g],path:c.clone(),series:f,seriesIndex:g,axisX:d,axisY:e,chartRect:j,index:g,group:i,element:h})}.bind(this))}}.bind(this)),this.eventEmitter.emit("created",{bounds:e.bounds,chartRect:j,axisX:d,axisY:e,svg:this.svg,options:a})}function e(a,b,d,e){c.Line["super"].constructor.call(this,a,b,f,c.extend({},f,d),e)}var f={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,type:void 0},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,type:void 0,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,showLine:!0,showPoint:!0,showArea:!1,areaBase:0,lineSmooth:!0,showGridBackground:!1,low:void 0,high:void 0,chartPadding:{top:15,right:15,bottom:5,left:10},fullWidth:!1,reverseData:!1,classNames:{chart:"ct-chart-line",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",line:"ct-line",point:"ct-point",area:"ct-area",grid:"ct-grid",gridGroup:"ct-grids",gridBackground:"ct-grid-background",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};c.Line=c.Base.extend({constructor:e,createChart:d})}(window,document,a),function(a,b,c){"use strict";function d(a){var b,d;a.distributeSeries?(b=c.normalizeData(this.data,a.reverseData,a.horizontalBars?"x":"y"),b.normalized.series=b.normalized.series.map(function(a){return[a]})):b=c.normalizeData(this.data,a.reverseData,a.horizontalBars?"x":"y"),this.svg=c.createSvg(this.container,a.width,a.height,a.classNames.chart+(a.horizontalBars?" "+a.classNames.horizontalBars:""));var e=this.svg.elem("g").addClass(a.classNames.gridGroup),g=this.svg.elem("g"),h=this.svg.elem("g").addClass(a.classNames.labelGroup);if(a.stackBars&&0!==b.normalized.series.length){var i=c.serialMap(b.normalized.series,function(){ return Array.prototype.slice.call(arguments).map(function(a){return a}).reduce(function(a,b){return{x:a.x+(b&&b.x)||0,y:a.y+(b&&b.y)||0}},{x:0,y:0})});d=c.getHighLow([i],a,a.horizontalBars?"x":"y")}else d=c.getHighLow(b.normalized.series,a,a.horizontalBars?"x":"y");d.high=+a.high||(0===a.high?0:d.high),d.low=+a.low||(0===a.low?0:d.low);var j,k,l,m,n,o=c.createChartRect(this.svg,a,f.padding);k=a.distributeSeries&&a.stackBars?b.normalized.labels.slice(0,1):b.normalized.labels,a.horizontalBars?(j=m=void 0===a.axisX.type?new c.AutoScaleAxis(c.Axis.units.x,b.normalized.series,o,c.extend({},a.axisX,{highLow:d,referenceValue:0})):a.axisX.type.call(c,c.Axis.units.x,b.normalized.series,o,c.extend({},a.axisX,{highLow:d,referenceValue:0})),l=n=void 0===a.axisY.type?new c.StepAxis(c.Axis.units.y,b.normalized.series,o,{ticks:k}):a.axisY.type.call(c,c.Axis.units.y,b.normalized.series,o,a.axisY)):(l=m=void 0===a.axisX.type?new c.StepAxis(c.Axis.units.x,b.normalized.series,o,{ticks:k}):a.axisX.type.call(c,c.Axis.units.x,b.normalized.series,o,a.axisX),j=n=void 0===a.axisY.type?new c.AutoScaleAxis(c.Axis.units.y,b.normalized.series,o,c.extend({},a.axisY,{highLow:d,referenceValue:0})):a.axisY.type.call(c,c.Axis.units.y,b.normalized.series,o,c.extend({},a.axisY,{highLow:d,referenceValue:0})));var p=a.horizontalBars?o.x1+j.projectValue(0):o.y1-j.projectValue(0),q=[];l.createGridAndLabels(e,h,this.supportsForeignObject,a,this.eventEmitter),j.createGridAndLabels(e,h,this.supportsForeignObject,a,this.eventEmitter),a.showGridBackground&&c.createGridBackground(e,o,a.classNames.gridBackground,this.eventEmitter),b.raw.series.forEach(function(d,e){var f,h,i=e-(b.raw.series.length-1)/2;f=a.distributeSeries&&!a.stackBars?l.axisLength/b.normalized.series.length/2:a.distributeSeries&&a.stackBars?l.axisLength/2:l.axisLength/b.normalized.series[e].length/2,h=g.elem("g"),h.attr({"ct:series-name":d.name,"ct:meta":c.serialize(d.meta)}),h.addClass([a.classNames.series,d.className||a.classNames.series+"-"+c.alphaNumerate(e)].join(" ")),b.normalized.series[e].forEach(function(g,k){var r,s,t,u;if(u=a.distributeSeries&&!a.stackBars?e:a.distributeSeries&&a.stackBars?0:k,r=a.horizontalBars?{x:o.x1+j.projectValue(g&&g.x?g.x:0,k,b.normalized.series[e]),y:o.y1-l.projectValue(g&&g.y?g.y:0,u,b.normalized.series[e])}:{x:o.x1+l.projectValue(g&&g.x?g.x:0,u,b.normalized.series[e]),y:o.y1-j.projectValue(g&&g.y?g.y:0,k,b.normalized.series[e])},l instanceof c.StepAxis&&(l.options.stretch||(r[l.units.pos]+=f*(a.horizontalBars?-1:1)),r[l.units.pos]+=a.stackBars||a.distributeSeries?0:i*a.seriesBarDistance*(a.horizontalBars?-1:1)),t=q[k]||p,q[k]=t-(p-r[l.counterUnits.pos]),void 0!==g){var v={};v[l.units.pos+"1"]=r[l.units.pos],v[l.units.pos+"2"]=r[l.units.pos],!a.stackBars||"accumulate"!==a.stackMode&&a.stackMode?(v[l.counterUnits.pos+"1"]=p,v[l.counterUnits.pos+"2"]=r[l.counterUnits.pos]):(v[l.counterUnits.pos+"1"]=t,v[l.counterUnits.pos+"2"]=q[k]),v.x1=Math.min(Math.max(v.x1,o.x1),o.x2),v.x2=Math.min(Math.max(v.x2,o.x1),o.x2),v.y1=Math.min(Math.max(v.y1,o.y2),o.y1),v.y2=Math.min(Math.max(v.y2,o.y2),o.y1);var w=c.getMetaData(d,k);s=h.elem("line",v,a.classNames.bar).attr({"ct:value":[g.x,g.y].filter(c.isNumeric).join(","),"ct:meta":c.serialize(w)}),this.eventEmitter.emit("draw",c.extend({type:"bar",value:g,index:k,meta:w,series:d,seriesIndex:e,axisX:m,axisY:n,chartRect:o,group:h,element:s},v))}}.bind(this))}.bind(this)),this.eventEmitter.emit("created",{bounds:j.bounds,chartRect:o,axisX:m,axisY:n,svg:this.svg,options:a})}function e(a,b,d,e){c.Bar["super"].constructor.call(this,a,b,f,c.extend({},f,d),e)}var f={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:c.noop,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,referenceValue:0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,showGridBackground:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",gridBackground:"ct-grid-background",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};c.Bar=c.Base.extend({constructor:e,createChart:d})}(window,document,a),function(a,b,c){"use strict";function d(a,b,c){var d=b.x>a.x;return d&&"explode"===c||!d&&"implode"===c?"start":d&&"implode"===c||!d&&"explode"===c?"end":"middle"}function e(a){var b,e,f,h,i,j=c.normalizeData(this.data),k=[],l=a.startAngle;this.svg=c.createSvg(this.container,a.width,a.height,a.donut?a.classNames.chartDonut:a.classNames.chartPie),e=c.createChartRect(this.svg,a,g.padding),f=Math.min(e.width()/2,e.height()/2),i=a.total||j.normalized.series.reduce(function(a,b){return a+b},0);var m=c.quantity(a.donutWidth);"%"===m.unit&&(m.value*=f/100),f-=a.donut&&!a.donutSolid?m.value/2:0,h="outside"===a.labelPosition||a.donut&&!a.donutSolid?f:"center"===a.labelPosition?0:a.donutSolid?f-m.value/2:f/2,h+=a.labelOffset;var n={x:e.x1+e.width()/2,y:e.y2+e.height()/2},o=1===j.raw.series.filter(function(a){return a.hasOwnProperty("value")?0!==a.value:0!==a}).length;j.raw.series.forEach(function(a,b){k[b]=this.svg.elem("g",null,null)}.bind(this)),a.showLabel&&(b=this.svg.elem("g",null,null)),j.raw.series.forEach(function(e,g){if(0!==j.normalized.series[g]||!a.ignoreEmptyValues){k[g].attr({"ct:series-name":e.name}),k[g].addClass([a.classNames.series,e.className||a.classNames.series+"-"+c.alphaNumerate(g)].join(" "));var p=i>0?l+j.normalized.series[g]/i*360:0,q=Math.max(0,l-(0===g||o?0:.2));p-q>=359.99&&(p=q+359.99);var r,s,t,u=c.polarToCartesian(n.x,n.y,f,q),v=c.polarToCartesian(n.x,n.y,f,p),w=new c.Svg.Path(!a.donut||a.donutSolid).move(v.x,v.y).arc(f,f,0,p-l>180,0,u.x,u.y);a.donut?a.donutSolid&&(t=f-m.value,r=c.polarToCartesian(n.x,n.y,t,l-(0===g||o?0:.2)),s=c.polarToCartesian(n.x,n.y,t,p),w.line(r.x,r.y),w.arc(t,t,0,p-l>180,1,s.x,s.y)):w.line(n.x,n.y);var x=a.classNames.slicePie;a.donut&&(x=a.classNames.sliceDonut,a.donutSolid&&(x=a.classNames.sliceDonutSolid));var y=k[g].elem("path",{d:w.stringify()},x);if(y.attr({"ct:value":j.normalized.series[g],"ct:meta":c.serialize(e.meta)}),a.donut&&!a.donutSolid&&(y._node.style.strokeWidth=m.value+"px"),this.eventEmitter.emit("draw",{type:"slice",value:j.normalized.series[g],totalDataSum:i,index:g,meta:e.meta,series:e,group:k[g],element:y,path:w.clone(),center:n,radius:f,startAngle:l,endAngle:p}),a.showLabel){var z;z=1===j.raw.series.length?{x:n.x,y:n.y}:c.polarToCartesian(n.x,n.y,h,l+(p-l)/2);var A;A=j.normalized.labels&&!c.isFalseyButZero(j.normalized.labels[g])?j.normalized.labels[g]:j.normalized.series[g];var B=a.labelInterpolationFnc(A,g);if(B||0===B){var C=b.elem("text",{dx:z.x,dy:z.y,"text-anchor":d(n,z,a.labelDirection)},a.classNames.label).text(""+B);this.eventEmitter.emit("draw",{type:"label",index:g,group:b,element:C,text:""+B,x:z.x,y:z.y})}}l=p}}.bind(this)),this.eventEmitter.emit("created",{chartRect:e,svg:this.svg,options:a})}function f(a,b,d,e){c.Pie["super"].constructor.call(this,a,b,g,c.extend({},g,d),e)}var g={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",sliceDonutSolid:"ct-slice-donut-solid",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutSolid:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:c.noop,labelDirection:"neutral",reverseData:!1,ignoreEmptyValues:!1};c.Pie=c.Base.extend({constructor:f,createChart:e,determineAnchorPosition:d})}(window,document,a),a}); //# sourceMappingURL=chartist.min.js.mapsabnzbd-develop/interfaces/Config/templates/staticcfg/js/jquery-ui.min.js0000600000175000017500000013437213642116632024732 0ustar jpjp/*! jQuery UI - v1.12.1 - 2016-09-16 * http://jqueryui.com * Includes: widget.js, data.js, keycode.js, scroll-parent.js, widgets/sortable.js, widgets/mouse.js, widgets/slider.js * Copyright jQuery Foundation and other contributors; Licensed MIT */ (function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){t.ui=t.ui||{},t.ui.version="1.12.1";var e=0,i=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var s,n,o=i.call(arguments,1),a=0,r=o.length;r>a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var s=!1;t(document).on("mouseup",function(){s=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!s){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,n=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return n&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),s=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,s=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,l=r+t.height,h=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+h>r&&l>s+h,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&l>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],l=[],h=this._connectWith();if(h&&e)for(s=h.length-1;s>=0;s--)for(o=t(h[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&l.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(l.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=l.length-1;s>=0;s--)l[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,l,h,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,h=r.length;h>s;s++)l=t(r[s]),l.data(this.widgetName+"-item",a),c.push({item:l,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t(" ",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,l,h,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(l=this.items[s].item.offset()[a],h=!1,e[u]-l>this.items[s][r]/2&&(h=!0),n>Math.abs(e[u]-l)&&(n=Math.abs(e[u]-l),o=this.items[s],this.direction=h?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s} },_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():l?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():l?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.slider",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle"),o="",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e).attr("tabIndex",0)})},_createRange:function(){var e=this.options;e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=t("
").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),("min"===e.range||"max"===e.range)&&this._addClass(this.range,"ui-slider-range-"+e.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,l,h,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,this._addClass(o,null,"ui-state-active"),o.trigger("focus"),l=o.offset(),h=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=h?{left:0,top:0}:{left:e.pageX-l.left-o.width()/2,top:e.pageY-l.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,"ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_uiHash:function(t,e,i){var s={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(s.value=void 0!==e?e:this.values(t),s.values=i||this.values()),s},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger("start",t,this._uiHash(e))},_slide:function(t,e,i){var s,n,o=this.value(),a=this.values();this._hasMultipleValues()&&(n=this.values(e?0:1),o=this.values(e),2===this.options.values.length&&this.options.range===!0&&(i=0===e?Math.min(n,i):Math.max(n,i)),a[e]=i),i!==o&&(s=this._trigger("slide",t,this._uiHash(e,i,a)),s!==!1&&(this._hasMultipleValues()?this.values(e,i):this.value(i)))},_stop:function(t,e){this._trigger("stop",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger("change",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),void 0;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this._hasMultipleValues()?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),this._super(e,i),e){case"orientation":this._detectOrientation(),this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(i),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=n-1;s>=0;s--)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,"ui-state-disabled",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this._hasMultipleValues()){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step,s=Math.round((t-e)/i)*i;t=s+e,t>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,l=this,h=this._animateOff?!1:r.animate,c={};this._hasMultipleValues()?this.handles.each(function(s){i=100*((l.values(s)-l._valueMin())/(l._valueMax()-l._valueMin())),c["horizontal"===l.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[h?"animate":"css"](c,r.animate),l.options.range===!0&&("horizontal"===l.orientation?(0===s&&l.range.stop(1,1)[h?"animate":"css"]({left:i+"%"},r.animate),1===s&&l.range[h?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&l.range.stop(1,1)[h?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&l.range[h?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[h?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({width:100-i+"%"},r.animate),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({height:100-i+"%"},r.animate))},_handleEvents:{keydown:function(e){var i,s,n,o,a=t(e.target).data("ui-slider-handle-index");switch(e.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(e.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(t(e.target),null,"ui-state-active"),i=this._start(e,a),i===!1))return}switch(o=this.options.step,s=n=this._hasMultipleValues()?this.values(a):this.value(),e.keyCode){case t.ui.keyCode.HOME:n=this._valueMin();break;case t.ui.keyCode.END:n=this._valueMax();break;case t.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+o);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-o)}this._slide(e,a,n)},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),this._removeClass(t(e.target),null,"ui-state-active"))}}})});sabnzbd-develop/interfaces/Config/templates/staticcfg/js/script.js0000600000175000017500000020126513642116632023516 0ustar jpjp/* ============================================================= * bootstrap3-typeahead.js v4.0.2 * https://github.com/bassjobsen/Bootstrap-3-Typeahead * ============================================================= * Original written by @mdo and @fat * ============================================================= * Copyright 2014 Bass Jobsen @bassjobsen * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================ */ (function(root,factory){"use strict";if(typeof module!=="undefined"&&module.exports){module.exports=factory(require("jquery"))}else if(typeof define==="function"&&define.amd){define(["jquery"],function($){return factory($)})}else{factory(root.jQuery)}})(this,function($){"use strict";var Typeahead=function(element,options){this.$element=$(element);this.options=$.extend({},$.fn.typeahead.defaults,options);this.matcher=this.options.matcher||this.matcher;this.sorter=this.options.sorter||this.sorter;this.select=this.options.select||this.select;this.autoSelect=typeof this.options.autoSelect=="boolean"?this.options.autoSelect:true;this.highlighter=this.options.highlighter||this.highlighter;this.render=this.options.render||this.render;this.updater=this.options.updater||this.updater;this.displayText=this.options.displayText||this.displayText;this.source=this.options.source;this.delay=this.options.delay;this.$menu=$(this.options.menu);this.$appendTo=this.options.appendTo?$(this.options.appendTo):null;this.fitToElement=typeof this.options.fitToElement=="boolean"?this.options.fitToElement:false;this.shown=false;this.listen();this.showHintOnFocus=typeof this.options.showHintOnFocus=="boolean"||this.options.showHintOnFocus==="all"?this.options.showHintOnFocus:false;this.afterSelect=this.options.afterSelect;this.addItem=false;this.value=this.$element.val()||this.$element.text()};Typeahead.prototype={constructor:Typeahead,select:function(){var val=this.$menu.find(".active").data("value");this.$element.data("active",val);if(this.autoSelect||val){var newVal=this.updater(val);if(!newVal){newVal=""}this.$element.val(this.displayText(newVal)||newVal).text(this.displayText(newVal)||newVal).change();this.afterSelect(newVal)}return this.hide()},updater:function(item){return item},setSource:function(source){this.source=source},show:function(){var pos=$.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});var scrollHeight=typeof this.options.scrollHeight=="function"?this.options.scrollHeight.call():this.options.scrollHeight;var element;if(this.shown){element=this.$menu}else if(this.$appendTo){element=this.$menu.appendTo(this.$appendTo);this.hasSameParent=this.$appendTo.is(this.$element.parent())}else{element=this.$menu.insertAfter(this.$element);this.hasSameParent=true}if(!this.hasSameParent){element.css("position","fixed");var offset=this.$element.offset();pos.top=offset.top;pos.left=offset.left}var dropup=$(element).parent().hasClass("dropup");var newTop=dropup?"auto":pos.top+pos.height+scrollHeight;var right=$(element).hasClass("dropdown-menu-right");var newLeft=right?"auto":pos.left;element.css({top:newTop,left:newLeft}).show();if(this.options.fitToElement===true){element.css("width",this.$element.outerWidth()+"px")}this.shown=true;return this},hide:function(){this.$menu.hide();this.shown=false;return this},lookup:function(query){var items;if(typeof query!="undefined"&&query!==null){this.query=query}else{this.query=this.$element.val()||this.$element.text()||""}if(this.query.length0){this.$element.data("active",items[0])}else{this.$element.data("active",null)}if(this.options.addItem){items.push(this.options.addItem)}if(this.options.items=="all"){return this.render(items).show()}else{return this.render(items.slice(0,this.options.items)).show()}},matcher:function(item){var it=this.displayText(item);return~it.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(items){var beginswith=[];var caseSensitive=[];var caseInsensitive=[];var item;while(item=items.shift()){var it=this.displayText(item);if(!it.toLowerCase().indexOf(this.query.toLowerCase()))beginswith.push(item);else if(~it.indexOf(this.query))caseSensitive.push(item);else caseInsensitive.push(item)}return beginswith.concat(caseSensitive,caseInsensitive)},highlighter:function(item){var html=$("
");var query=this.query;var i=item.toLowerCase().indexOf(query.toLowerCase());var len=query.length;var leftPart;var middlePart;var rightPart;var strong;if(len===0){return html.text(item).html()}while(i>-1){leftPart=item.substr(0,i);middlePart=item.substr(i,len);rightPart=item.substr(i+len);strong=$("").text(middlePart);html.append(document.createTextNode(leftPart)).append(strong);item=rightPart;i=item.toLowerCase().indexOf(query.toLowerCase())}return html.append(document.createTextNode(item)).html()},render:function(items){var that=this;var self=this;var activeFound=false;var data=[];var _category=that.options.separator;$.each(items,function(key,value){if(key>0&&value[_category]!==items[key-1][_category]){data.push({__type:"divider"})}if(value[_category]&&(key===0||value[_category]!==items[key-1][_category])){data.push({__type:"category",name:value[_category]})}data.push(value)});items=$(data).map(function(i,item){if((item.__type||false)=="category"){return $(that.options.headerHtml).text(item.name)[0]}if((item.__type||false)=="divider"){return $(that.options.headerDivider)[0]}var text=self.displayText(item);i=$(that.options.item).data("value",item);i.find("a").html(that.highlighter(text,item));if(text==self.$element.val()){i.addClass("active");self.$element.data("active",item);activeFound=true}return i[0]});if(this.autoSelect&&!activeFound){items.filter(":not(.dropdown-header)").first().addClass("active");this.$element.data("active",items.first().data("value"))}this.$menu.html(items);return this},displayText:function(item){return typeof item!=="undefined"&&typeof item.name!="undefined"&&item.name||item},next:function(event){var active=this.$menu.find(".active").removeClass("active");var next=active.next();if(!next.length){next=$(this.$menu.find("li")[0])}next.addClass("active")},prev:function(event){var active=this.$menu.find(".active").removeClass("active");var prev=active.prev();if(!prev.length){prev=this.$menu.find("li").last()}prev.addClass("active")},listen:function(){this.$element.on("focus",$.proxy(this.focus,this)).on("blur",$.proxy(this.blur,this)).on("keypress",$.proxy(this.keypress,this)).on("input",$.proxy(this.input,this)).on("keyup",$.proxy(this.keyup,this));if(this.eventSupported("keydown")){this.$element.on("keydown",$.proxy(this.keydown,this))}this.$menu.on("click",$.proxy(this.click,this)).on("mouseenter","li",$.proxy(this.mouseenter,this)).on("mouseleave","li",$.proxy(this.mouseleave,this)).on("mousedown",$.proxy(this.mousedown,this))},destroy:function(){this.$element.data("typeahead",null);this.$element.data("active",null);this.$element.off("focus").off("blur").off("keypress").off("input").off("keyup");if(this.eventSupported("keydown")){this.$element.off("keydown")}this.$menu.remove();this.destroyed=true},eventSupported:function(eventName){var isSupported=eventName in this.$element;if(!isSupported){this.$element.setAttribute(eventName,"return;");isSupported=typeof this.$element[eventName]==="function"}return isSupported},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:if(e.shiftKey)return;e.preventDefault();this.prev();break;case 40:if(e.shiftKey)return;e.preventDefault();this.next();break}},keydown:function(e){this.suppressKeyPressRepeat=~$.inArray(e.keyCode,[40,38,9,13,27]);if(!this.shown&&e.keyCode==40){this.lookup()}else{this.move(e)}},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},input:function(e){var currentValue=this.$element.val()||this.$element.text();if(this.value!==currentValue){this.value=currentValue;this.lookup()}},keyup:function(e){if(this.destroyed){return}switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break}},focus:function(e){if(!this.focused){this.focused=true;if(this.options.showHintOnFocus&&this.skipShowHintOnFocus!==true){if(this.options.showHintOnFocus==="all"){this.lookup("")}else{this.lookup()}}}if(this.skipShowHintOnFocus){this.skipShowHintOnFocus=false}},blur:function(e){if(!this.mousedover&&!this.mouseddown&&this.shown){this.hide();this.focused=false}else if(this.mouseddown){this.skipShowHintOnFocus=true;this.$element.focus();this.mouseddown=false}},click:function(e){e.preventDefault();this.skipShowHintOnFocus=true;this.select();this.$element.focus();this.hide()},mouseenter:function(e){this.mousedover=true;this.$menu.find(".active").removeClass("active");$(e.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=false;if(!this.focused&&this.shown)this.hide()},mousedown:function(e){this.mouseddown=true;this.$menu.one("mouseup",function(e){this.mouseddown=false}.bind(this))}};var old=$.fn.typeahead;$.fn.typeahead=function(option){var arg=arguments;if(typeof option=="string"&&option=="getActive"){return this.data("active")}return this.each(function(){var $this=$(this);var data=$this.data("typeahead");var options=typeof option=="object"&&option;if(!data)$this.data("typeahead",data=new Typeahead(this,options));if(typeof option=="string"&&data[option]){if(arg.length>1){data[option].apply(data,Array.prototype.slice.call(arg,1))}else{data[option]()}}})};$.fn.typeahead.defaults={source:[],items:8,menu:'
    ',item:'
  • ',minLength:1,scrollHeight:0,autoSelect:true,afterSelect:$.noop,addItem:false,delay:0,separator:"category",headerHtml:'
  • ',headerDivider:'
  • '};$.fn.typeahead.Constructor=Typeahead;$.fn.typeahead.noConflict=function(){$.fn.typeahead=old;return this};$(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(e){var $this=$(this);if($this.data("typeahead"))return;$this.typeahead($this.data())})}); /*! * jQuery Form Plugin * version: 4.2.2 * Requires jQuery v1.7.2 or later * Project repository: https://github.com/jquery-form/form * Copyright 2017 Kevin Morris * Copyright 2006 M. Alsup * Dual licensed under the LGPL-2.1+ or MIT licenses * https://github.com/jquery-form/form#license * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ !function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,r){return void 0===r&&(r="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(r),r}:e(jQuery)}(function(e){"use strict";function t(t){var r=t.data;t.isDefaultPrevented()||(t.preventDefault(),e(t.target).closest("form").ajaxSubmit(r))}function r(t){var r=t.target,a=e(r);if(!a.is("[type=submit],[type=image]")){var n=a.closest("[type=submit]");if(0===n.length)return;r=n[0]}var i=r.form;if(i.clk=r,"image"===r.type)if(void 0!==t.offsetX)i.clk_x=t.offsetX,i.clk_y=t.offsetY;else if("function"==typeof e.fn.offset){var o=a.offset();i.clk_x=t.pageX-o.left,i.clk_y=t.pageY-o.top}else i.clk_x=t.pageX-r.offsetLeft,i.clk_y=t.pageY-r.offsetTop;setTimeout(function(){i.clk=i.clk_x=i.clk_y=null},100)}function a(){if(e.fn.ajaxSubmit.debug){var t="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(t):window.opera&&window.opera.postError&&window.opera.postError(t)}}var n=/\r?\n/g,i={};i.fileapi=void 0!==e('').get(0).files,i.formdata=void 0!==window.FormData;var o=!!e.fn.prop;e.fn.attr2=function(){if(!o)return this.attr.apply(this,arguments);var e=this.prop.apply(this,arguments);return e&&e.jquery||"string"==typeof e?e:this.attr.apply(this,arguments)},e.fn.ajaxSubmit=function(t,r,n,s){function u(r){var a,n,i=e.param(r,t.traditional).split("&"),o=i.length,s=[];for(a=0;a',k).val(f.extraData[c].value).appendTo(w)[0]):u.push(e('',k).val(f.extraData[c]).appendTo(w)[0]));f.iframeTarget||h.appendTo(D),v.attachEvent?v.attachEvent("onload",s):v.addEventListener("load",s,!1),setTimeout(t,15);try{w.submit()}catch(e){document.createElement("form").submit.apply(w)}}finally{w.setAttribute("action",i),w.setAttribute("enctype",o),r?w.setAttribute("target",r):p.removeAttr("target"),e(u).remove()}}function s(t){if(!x.aborted&&!X){if((O=n(v))||(a("cannot access response document"),t=L),t===A&&x)return x.abort("timeout"),void S.reject(x,"timeout");if(t===L&&x)return x.abort("server abort"),void S.reject(x,"error","server abort");if(O&&O.location.href!==f.iframeSrc||T){v.detachEvent?v.detachEvent("onload",s):v.removeEventListener("load",s,!1);var r,i="success";try{if(T)throw"timeout";var o="xml"===f.dataType||O.XMLDocument||e.isXMLDoc(O);if(a("isXml="+o),!o&&window.opera&&(null===O.body||!O.body.innerHTML)&&--C)return a("requeing onLoad callback, DOM not available"),void setTimeout(s,250);var u=O.body?O.body:O.documentElement;x.responseText=u?u.innerHTML:null,x.responseXML=O.XMLDocument?O.XMLDocument:O,o&&(f.dataType="xml"),x.getResponseHeader=function(e){return{"content-type":f.dataType}[e.toLowerCase()]},u&&(x.status=Number(u.getAttribute("status"))||x.status,x.statusText=u.getAttribute("statusText")||x.statusText);var c=(f.dataType||"").toLowerCase(),l=/(json|script|text)/.test(c);if(l||f.textarea){var p=O.getElementsByTagName("textarea")[0];if(p)x.responseText=p.value,x.status=Number(p.getAttribute("status"))||x.status,x.statusText=p.getAttribute("statusText")||x.statusText;else if(l){var m=O.getElementsByTagName("pre")[0],g=O.getElementsByTagName("body")[0];m?x.responseText=m.textContent?m.textContent:m.innerText:g&&(x.responseText=g.textContent?g.textContent:g.innerText)}}else"xml"===c&&!x.responseXML&&x.responseText&&(x.responseXML=q(x.responseText));try{M=N(x,c,f)}catch(e){i="parsererror",x.error=r=e||i}}catch(e){a("error caught: ",e),i="error",x.error=r=e||i}x.aborted&&(a("upload aborted"),i=null),x.status&&(i=x.status>=200&&x.status<300||304===x.status?"success":"error"),"success"===i?(f.success&&f.success.call(f.context,M,"success",x),S.resolve(x.responseText,"success",x),d&&e.event.trigger("ajaxSuccess",[x,f])):i&&(void 0===r&&(r=x.statusText),f.error&&f.error.call(f.context,x,i,r),S.reject(x,"error",r),d&&e.event.trigger("ajaxError",[x,f,r])),d&&e.event.trigger("ajaxComplete",[x,f]),d&&!--e.active&&e.event.trigger("ajaxStop"),f.complete&&f.complete.call(f.context,x,i),X=!0,f.timeout&&clearTimeout(j),setTimeout(function(){f.iframeTarget?h.attr("src",f.iframeSrc):h.remove(),x.responseXML=null},100)}}}var u,c,f,d,m,h,v,x,y,b,T,j,w=p[0],S=e.Deferred();if(S.abort=function(e){x.abort(e)},r)for(c=0;c',k)).css({position:"absolute",top:"-1000px",left:"-1000px"}),v=h[0],x={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(t){var r="timeout"===t?"timeout":"aborted";a("aborting upload... "+r),this.aborted=1;try{v.contentWindow.document.execCommand&&v.contentWindow.document.execCommand("Stop")}catch(e){}h.attr("src",f.iframeSrc),x.error=r,f.error&&f.error.call(f.context,x,r,t),d&&e.event.trigger("ajaxError",[x,f,r]),f.complete&&f.complete.call(f.context,x,r)}},(d=f.global)&&0==e.active++&&e.event.trigger("ajaxStart"),d&&e.event.trigger("ajaxSend",[x,f]),f.beforeSend&&!1===f.beforeSend.call(f.context,x,f))return f.global&&e.active--,S.reject(),S;if(x.aborted)return S.reject(),S;(y=w.clk)&&(b=y.name)&&!y.disabled&&(f.extraData=f.extraData||{},f.extraData[b]=y.value,"image"===y.type&&(f.extraData[b+".x"]=w.clk_x,f.extraData[b+".y"]=w.clk_y));var A=1,L=2,F=e("meta[name=csrf-token]").attr("content"),E=e("meta[name=csrf-param]").attr("content");E&&F&&(f.extraData=f.extraData||{},f.extraData[E]=F),f.forceSync?i():setTimeout(i,10);var M,O,X,C=50,q=e.parseXML||function(e,t){return window.ActiveXObject?((t=new ActiveXObject("Microsoft.XMLDOM")).async="false",t.loadXML(e)):t=(new DOMParser).parseFromString(e,"text/xml"),t&&t.documentElement&&"parsererror"!==t.documentElement.nodeName?t:null},_=e.parseJSON||function(e){return window.eval("("+e+")")},N=function(t,r,a){var n=t.getResponseHeader("content-type")||"",i=("xml"===r||!r)&&n.indexOf("xml")>=0,o=i?t.responseXML:t.responseText;return i&&"parsererror"===o.documentElement.nodeName&&e.error&&e.error("parsererror"),a&&a.dataFilter&&(o=a.dataFilter(o,r)),"string"==typeof o&&(("json"===r||!r)&&n.indexOf("json")>=0?o=_(o):("script"===r||!r)&&n.indexOf("javascript")>=0&&e.globalEval(o)),o};return S}if(!this.length)return a("ajaxSubmit: skipping submit process - no element selected"),this;var l,f,d,p=this;"function"==typeof t?t={success:t}:"string"==typeof t||!1===t&&arguments.length>0?(t={url:t,data:r,dataType:n},"function"==typeof s&&(t.success=s)):void 0===t&&(t={}),l=t.method||t.type||this.attr2("method"),(d=(d="string"==typeof(f=t.url||this.attr2("action"))?e.trim(f):"")||window.location.href||"")&&(d=(d.match(/^([^#]+)/)||[])[1]),t=e.extend(!0,{url:d,success:e.ajaxSettings.success,type:l||e.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var m={};if(this.trigger("form-pre-serialize",[this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(t.beforeSerialize&&!1===t.beforeSerialize(this,t))return a("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var h=t.traditional;void 0===h&&(h=e.ajaxSettings.traditional);var v,g=[],x=this.formToArray(t.semantic,g,t.filtering);if(t.data){var y=e.isFunction(t.data)?t.data(x):t.data;t.extraData=y,v=e.param(y,h)}if(t.beforeSubmit&&!1===t.beforeSubmit(x,this,t))return a("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[x,this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var b=e.param(x,h);v&&(b=b?b+"&"+v:v),"GET"===t.type.toUpperCase()?(t.url+=(t.url.indexOf("?")>=0?"&":"?")+b,t.data=null):t.data=b;var T=[];if(t.resetForm&&T.push(function(){p.resetForm()}),t.clearForm&&T.push(function(){p.clearForm(t.includeHidden)}),!t.dataType&&t.target){var j=t.success||function(){};T.push(function(r,a,n){var i=arguments,o=t.replaceTarget?"replaceWith":"html";e(t.target)[o](r).each(function(){j.apply(this,i)})})}else t.success&&(e.isArray(t.success)?e.merge(T,t.success):T.push(t.success));if(t.success=function(e,r,a){for(var n=t.context||this,i=0,o=T.length;i0,D="multipart/form-data",A=p.attr("enctype")===D||p.attr("encoding")===D,L=i.fileapi&&i.formdata;a("fileAPI :"+L);var F,E=(k||A)&&!L;!1!==t.iframe&&(t.iframe||E)?t.closeKeepAlive?e.get(t.closeKeepAlive,function(){F=c(x)}):F=c(x):F=(k||A)&&L?function(r){for(var a=new FormData,n=0;n0)&&(n={url:n,data:i,dataType:o},"function"==typeof s&&(n.success=s)),n=n||{},n.delegation=n.delegation&&e.isFunction(e.fn.on),!n.delegation&&0===this.length){var u={s:this.selector,c:this.context};return!e.isReady&&u.s?(a("DOM not ready, queuing ajaxForm"),e(function(){e(u.s,u.c).ajaxForm(n)}),this):(a("terminating; zero elements found by selector"+(e.isReady?"":" (DOM not ready)")),this)}return n.delegation?(e(document).off("submit.form-plugin",this.selector,t).off("click.form-plugin",this.selector,r).on("submit.form-plugin",this.selector,n,t).on("click.form-plugin",this.selector,n,r),this):this.ajaxFormUnbind().on("submit.form-plugin",n,t).on("click.form-plugin",n,r)},e.fn.ajaxFormUnbind=function(){return this.off("submit.form-plugin click.form-plugin")},e.fn.formToArray=function(t,r,a){var n=[];if(0===this.length)return n;var o,s=this[0],u=this.attr("id"),c=t||void 0===s.elements?s.getElementsByTagName("*"):s.elements;if(c&&(c=e.makeArray(c)),u&&(t||/(Edge|Trident)\//.test(navigator.userAgent))&&(o=e(':input[form="'+u+'"]').get()).length&&(c=(c||[]).concat(o)),!c||!c.length)return n;e.isFunction(a)&&(c=e.map(c,a));var l,f,d,p,m,h,v;for(l=0,h=c.length;lr||r>=c||0>t||t>=c?!1:f.isDark(r,t)}function i(r,t,e,n){var o=u.isDark,a=1/l;u.isDark=function(i,u){var f=u*a,c=i*a,l=f+a,g=c+a;return o(i,u)&&(r>l||f>e||t>g||c>n)}}var u={},f=r(n,e);f.addData(t),f.make(),o=o||0;var c=f.getModuleCount(),l=f.getModuleCount()+2*o;return u.text=t,u.level=e,u.version=n,u.moduleCount=l,u.isDark=a,u.addBlank=i,u}function e(r,e,n,o,a){n=Math.max(1,n||1),o=Math.min(40,o||40);for(var i=n;o>=i;i+=1)try{return t(r,e,i,a)}catch(u){}}function n(r,t,e){var n=e.size,o="bold "+e.mSize*n+"px "+e.fontname,a=w("")[0].getContext("2d");a.font=o;var i=a.measureText(e.label).width,u=e.mSize,f=i/n,c=(1-f)*e.mPosX,l=(1-u)*e.mPosY,g=c+f,s=l+u,v=.01;1===e.mode?r.addBlank(0,l-v,n,s+v):r.addBlank(c-v,l-v,g+v,s+v),t.fillStyle=e.fontcolor,t.font=o,t.fillText(e.label,c*n,l*n+.75*e.mSize*n)}function o(r,t,e){var n=e.size,o=e.image.naturalWidth||1,a=e.image.naturalHeight||1,i=e.mSize,u=i*o/a,f=(1-u)*e.mPosX,c=(1-i)*e.mPosY,l=f+u,g=c+i,s=.01;3===e.mode?r.addBlank(0,c-s,n,g+s):r.addBlank(f-s,c-s,l+s,g+s),t.drawImage(e.image,f*n,c*n,u*n,i*n)}function a(r,t,e){w(e.background).is("img")?t.drawImage(e.background,0,0,e.size,e.size):e.background&&(t.fillStyle=e.background,t.fillRect(e.left,e.top,e.size,e.size));var a=e.mode;1===a||2===a?n(r,t,e):(3===a||4===a)&&o(r,t,e)}function i(r,t,e,n,o,a,i,u){r.isDark(i,u)&&t.rect(n,o,a,a)}function u(r,t,e,n,o,a,i,u,f,c){i?r.moveTo(t+a,e):r.moveTo(t,e),u?(r.lineTo(n-a,e),r.arcTo(n,e,n,o,a)):r.lineTo(n,e),f?(r.lineTo(n,o-a),r.arcTo(n,o,t,o,a)):r.lineTo(n,o),c?(r.lineTo(t+a,o),r.arcTo(t,o,t,e,a)):r.lineTo(t,o),i?(r.lineTo(t,e+a),r.arcTo(t,e,n,e,a)):r.lineTo(t,e)}function f(r,t,e,n,o,a,i,u,f,c){i&&(r.moveTo(t+a,e),r.lineTo(t,e),r.lineTo(t,e+a),r.arcTo(t,e,t+a,e,a)),u&&(r.moveTo(n-a,e),r.lineTo(n,e),r.lineTo(n,e+a),r.arcTo(n,e,n-a,e,a)),f&&(r.moveTo(n-a,o),r.lineTo(n,o),r.lineTo(n,o-a),r.arcTo(n,o,n-a,o,a)),c&&(r.moveTo(t+a,o),r.lineTo(t,o),r.lineTo(t,o-a),r.arcTo(t,o,t+a,o,a))}function c(r,t,e,n,o,a,i,c){var l=r.isDark,g=n+a,s=o+a,v=e.radius*a,h=i-1,d=i+1,w=c-1,m=c+1,y=l(i,c),T=l(h,w),p=l(h,c),B=l(h,m),A=l(i,m),E=l(d,m),k=l(d,c),M=l(d,w),C=l(i,w);y?u(t,n,o,g,s,v,!p&&!C,!p&&!A,!k&&!A,!k&&!C):f(t,n,o,g,s,v,p&&C&&T,p&&A&&B,k&&A&&E,k&&C&&M)}function l(r,t,e){var n,o,a=r.moduleCount,u=e.size/a,f=i;for(e.radius>0&&e.radius<=.5&&(f=c),t.beginPath(),n=0;a>n;n+=1)for(o=0;a>o;o+=1){var l=e.left+o*u,g=e.top+n*u,s=u;f(r,t,e,l,g,s,n,o)}if(w(e.fill).is("img")){t.strokeStyle="rgba(0,0,0,0.5)",t.lineWidth=2,t.stroke();var v=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",t.fill(),t.globalCompositeOperation=v,t.clip(),t.drawImage(e.fill,0,0,e.size,e.size),t.restore()}else t.fillStyle=e.fill,t.fill()}function g(r,t){var n=e(t.text,t.ecLevel,t.minVersion,t.maxVersion,t.quiet);if(!n)return null;var o=w(r).data("qrcode",n),i=o[0].getContext("2d");return a(n,i,t),l(n,i,t),o}function s(r){var t=w("").attr("width",r.size).attr("height",r.size);return g(t,r)}function v(r){return w("").attr("src",s(r)[0].toDataURL("image/png"))}function h(r){var t=e(r.text,r.ecLevel,r.minVersion,r.maxVersion,r.quiet);if(!t)return null;var n,o,a=r.size,i=r.background,u=Math.floor,f=t.moduleCount,c=u(a/f),l=u(.5*(a-c*f)),g={position:"relative",left:0,top:0,padding:0,margin:0,width:a,height:a},s={position:"absolute",padding:0,margin:0,width:c,height:c,"background-color":r.fill},v=w("
    ").data("qrcode",t).css(g);for(i&&v.css("background-color",i),n=0;f>n;n+=1)for(o=0;f>o;o+=1)t.isDark(n,o)&&w("
    ").css(s).css({left:l+o*c,top:l+n*c}).appendTo(v);return v}function d(r){return m&&"canvas"===r.render?s(r):m&&"image"===r.render?v(r):h(r)}var w=window.jQuery,m=function(){var r=document.createElement("canvas");return!(!r.getContext||!r.getContext("2d"))}(),y={render:"canvas",minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:0,quiet:0,mode:0,mSize:.1,mPosX:.5,mPosY:.5,label:"no label",fontname:"sans",fontcolor:"#000",image:null};w.fn.qrcode=function(r){var t=w.extend({},y,r);return this.each(function(r,e){"canvas"===e.nodeName.toLowerCase()?g(e,t):w(e).append(d(t))})}}(function(){var r=function(){function r(t,e){if("undefined"==typeof t.length)throw new Error(t.length+"/"+e);var n=function(){for(var r=0;re;e+=1){t[e]=new Array(r);for(var n=0;r>n;n+=1)t[e][n]=null}return t}(v),T(0,0),T(v-7,0),T(0,v-7),A(),B(),k(r,t),l>=7&&E(r),null==d&&(d=D(l,g,w)),M(d,t)},T=function(r,t){for(var e=-1;7>=e;e+=1)if(!(-1>=r+e||r+e>=v))for(var n=-1;7>=n;n+=1)-1>=t+n||t+n>=v||(e>=0&&6>=e&&(0==n||6==n)||n>=0&&6>=n&&(0==e||6==e)||e>=2&&4>=e&&n>=2&&4>=n?s[r+e][t+n]=!0:s[r+e][t+n]=!1)},p=function(){for(var r=0,t=0,e=0;8>e;e+=1){y(!0,e);var n=a.getLostPoint(m);(0==e||r>n)&&(r=n,t=e)}return t},B=function(){for(var r=8;v-8>r;r+=1)null==s[r][6]&&(s[r][6]=r%2==0);for(var t=8;v-8>t;t+=1)null==s[6][t]&&(s[6][t]=t%2==0)},A=function(){for(var r=a.getPatternPosition(l),t=0;t=i;i+=1)for(var u=-2;2>=u;u+=1)-2==i||2==i||-2==u||2==u||0==i&&0==u?s[n+i][o+u]=!0:s[n+i][o+u]=!1}},E=function(r){for(var t=a.getBCHTypeNumber(l),e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[Math.floor(e/3)][e%3+v-8-3]=n}for(var e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[e%3+v-8-3][Math.floor(e/3)]=n}},k=function(r,t){for(var e=g<<3|t,n=a.getBCHTypeInfo(e),o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);6>o?s[o][8]=i:8>o?s[o+1][8]=i:s[v-15+o][8]=i}for(var o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);8>o?s[8][v-o-1]=i:9>o?s[8][15-o-1+1]=i:s[8][15-o-1]=i}s[v-8][8]=!r},M=function(r,t){for(var e=-1,n=v-1,o=7,i=0,u=a.getMaskFunction(t),f=v-1;f>0;f-=2)for(6==f&&(f-=1);;){for(var c=0;2>c;c+=1)if(null==s[n][f-c]){var l=!1;i>>o&1));var g=u(n,f-c);g&&(l=!l),s[n][f-c]=l,o-=1,-1==o&&(i+=1,o=7)}if(n+=e,0>n||n>=v){n-=e,e=-e;break}}},C=function(t,e){for(var n=0,o=0,i=0,u=new Array(e.length),f=new Array(e.length),c=0;c=0?d.getAt(w):0}}for(var m=0,s=0;ss;s+=1)for(var c=0;cs;s+=1)for(var c=0;c8*s)throw new Error("code length overflow. ("+c.getLengthInBits()+">"+8*s+")");for(c.getLengthInBits()+4<=8*s&&c.put(0,4);c.getLengthInBits()%8!=0;)c.putBit(!1);for(;;){if(c.getLengthInBits()>=8*s)break;if(c.put(o,8),c.getLengthInBits()>=8*s)break;c.put(i,8)}return C(c,n)};return m.addData=function(r){var t=c(r);w.push(t),d=null},m.isDark=function(r,t){if(0>r||r>=v||0>t||t>=v)throw new Error(r+","+t);return s[r][t]},m.getModuleCount=function(){return v},m.make=function(){y(!1,p())},m.createTableTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e="";e+='";for(var o=0;o';e+=""}return e+="",e+="
    "},m.createImgTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e=m.getModuleCount()*r+2*t,n=t,o=e-t;return h(e,e,function(t,e){if(t>=n&&o>t&&e>=n&&o>e){var a=Math.floor((t-n)/r),i=Math.floor((e-n)/r);return m.isDark(i,a)?0:1}return 1})},m};t.stringToBytes=function(r){for(var t=new Array,e=0;ea)t.push(a);else{var i=e[r.charAt(o)];"number"==typeof i?(255&i)==i?t.push(i):(t.push(i>>>8),t.push(255&i)):t.push(n)}}return t}};var e={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},n={L:1,M:0,Q:3,H:2},o={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},a=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],n=1335,a=7973,u=21522,f={},c=function(r){for(var t=0;0!=r;)t+=1,r>>>=1;return t};return f.getBCHTypeInfo=function(r){for(var t=r<<10;c(t)-c(n)>=0;)t^=n<=0;)t^=a<n;n+=1)e=e.multiply(r([1,i.gexp(n)],0));return e},f.getLengthInBits=function(r,t){if(t>=1&&10>t)switch(r){case e.MODE_NUMBER:return 10;case e.MODE_ALPHA_NUM:return 9;case e.MODE_8BIT_BYTE:return 8;case e.MODE_KANJI:return 8;default:throw new Error("mode:"+r)}else if(27>t)switch(r){case e.MODE_NUMBER:return 12;case e.MODE_ALPHA_NUM:return 11;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 10;default:throw new Error("mode:"+r)}else{if(!(41>t))throw new Error("type:"+t);switch(r){case e.MODE_NUMBER:return 14;case e.MODE_ALPHA_NUM:return 13;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 12;default:throw new Error("mode:"+r)}}},f.getLostPoint=function(r){for(var t=r.getModuleCount(),e=0,n=0;t>n;n+=1)for(var o=0;t>o;o+=1){for(var a=0,i=r.isDark(n,o),u=-1;1>=u;u+=1)if(!(0>n+u||n+u>=t))for(var f=-1;1>=f;f+=1)0>o+f||o+f>=t||(0!=u||0!=f)&&i==r.isDark(n+u,o+f)&&(a+=1);a>5&&(e+=3+a-5)}for(var n=0;t-1>n;n+=1)for(var o=0;t-1>o;o+=1){var c=0;r.isDark(n,o)&&(c+=1),r.isDark(n+1,o)&&(c+=1),r.isDark(n,o+1)&&(c+=1),r.isDark(n+1,o+1)&&(c+=1),(0==c||4==c)&&(e+=3)}for(var n=0;t>n;n+=1)for(var o=0;t-6>o;o+=1)r.isDark(n,o)&&!r.isDark(n,o+1)&&r.isDark(n,o+2)&&r.isDark(n,o+3)&&r.isDark(n,o+4)&&!r.isDark(n,o+5)&&r.isDark(n,o+6)&&(e+=40);for(var o=0;t>o;o+=1)for(var n=0;t-6>n;n+=1)r.isDark(n,o)&&!r.isDark(n+1,o)&&r.isDark(n+2,o)&&r.isDark(n+3,o)&&r.isDark(n+4,o)&&!r.isDark(n+5,o)&&r.isDark(n+6,o)&&(e+=40);for(var l=0,o=0;t>o;o+=1)for(var n=0;t>n;n+=1)r.isDark(n,o)&&(l+=1);var g=Math.abs(100*l/t/t-50)/5;return e+=10*g},f}(),i=function(){for(var r=new Array(256),t=new Array(256),e=0;8>e;e+=1)r[e]=1<e;e+=1)r[e]=r[e-4]^r[e-5]^r[e-6]^r[e-8];for(var e=0;255>e;e+=1)t[r[e]]=e;var n={};return n.glog=function(r){if(1>r)throw new Error("glog("+r+")");return t[r]},n.gexp=function(t){for(;0>t;)t+=255;for(;t>=256;)t-=255;return r[t]},n}(),u=function(){var r=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(r,t){var e={};return e.totalCount=r,e.dataCount=t,e},e={},o=function(t,e){switch(e){case n.L:return r[4*(t-1)+0];case n.M:return r[4*(t-1)+1];case n.Q:return r[4*(t-1)+2];case n.H:return r[4*(t-1)+3];default:return}};return e.getRSBlocks=function(r,e){var n=o(r,e);if("undefined"==typeof n)throw new Error("bad rs block @ typeNumber:"+r+"/errorCorrectLevel:"+e);for(var a=n.length/3,i=new Array,u=0;a>u;u+=1)for(var f=n[3*u+0],c=n[3*u+1],l=n[3*u+2],g=0;f>g;g+=1)i.push(t(c,l));return i},e}(),f=function(){var r=new Array,t=0,e={};return e.getBuffer=function(){return r},e.getAt=function(t){var e=Math.floor(t/8);return 1==(r[e]>>>7-t%8&1)},e.put=function(r,t){for(var n=0;t>n;n+=1)e.putBit(1==(r>>>t-n-1&1))},e.getLengthInBits=function(){return t},e.putBit=function(e){var n=Math.floor(t/8);r.length<=n&&r.push(0),e&&(r[n]|=128>>>t%8),t+=1},e},c=function(r){var n=e.MODE_8BIT_BYTE,o=t.stringToBytes(r),a={};return a.getMode=function(){return n},a.getLength=function(r){return o.length},a.write=function(r){for(var t=0;t>>8)},t.writeBytes=function(r,e,n){e=e||0,n=n||r.length;for(var o=0;n>o;o+=1)t.writeByte(r[o+e])},t.writeString=function(r){for(var e=0;e0&&(t+=","),t+=r[e];return t+="]"},t},g=function(){var r=0,t=0,e=0,n="",o={},a=function(r){n+=String.fromCharCode(i(63&r))},i=function(r){if(0>r);else{if(26>r)return 65+r;if(52>r)return 97+(r-26);if(62>r)return 48+(r-52);if(62==r)return 43;if(63==r)return 47}throw new Error("n:"+r)};return o.writeByte=function(n){for(r=r<<8|255&n,t+=8,e+=1;t>=6;)a(r>>>t-6),t-=6},o.flush=function(){if(t>0&&(a(r<<6-t),r=0,t=0),e%3!=0)for(var o=3-e%3,i=0;o>i;i+=1)n+="="},o.toString=function(){return n},o},s=function(r){var t=r,e=0,n=0,o=0,a={};a.read=function(){for(;8>o;){if(e>=t.length){if(0==o)return-1;throw new Error("unexpected end of file./"+o)}var r=t.charAt(e);if(e+=1,"="==r)return o=0,-1;r.match(/^\s$/)||(n=n<<6|i(r.charCodeAt(0)),o+=6)}var a=n>>>o-8&255;return o-=8,a};var i=function(r){if(r>=65&&90>=r)return r-65;if(r>=97&&122>=r)return r-97+26;if(r>=48&&57>=r)return r-48+52;if(43==r)return 62;if(47==r)return 63;throw new Error("c:"+r)};return a},v=function(r,t){var e=r,n=t,o=new Array(r*t),a={};a.setPixel=function(r,t,n){o[t*e+r]=n},a.write=function(r){r.writeString("GIF87a"),r.writeShort(e),r.writeShort(n),r.writeByte(128),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(255),r.writeByte(255),r.writeByte(255),r.writeString(","),r.writeShort(0),r.writeShort(0),r.writeShort(e),r.writeShort(n),r.writeByte(0);var t=2,o=u(t);r.writeByte(t);for(var a=0;o.length-a>255;)r.writeByte(255),r.writeBytes(o,a,255),a+=255;r.writeByte(o.length-a),r.writeBytes(o,a,o.length-a),r.writeByte(0),r.writeString(";")};var i=function(r){var t=r,e=0,n=0,o={};return o.write=function(r,o){if(r>>>o!=0)throw new Error("length over");for(;e+o>=8;)t.writeByte(255&(r<>>=8-e,n=0,e=0;n=r<0&&t.writeByte(n)},o},u=function(r){for(var t=1<u;u+=1)a.add(String.fromCharCode(u));a.add(String.fromCharCode(t)),a.add(String.fromCharCode(e));var c=l(),g=i(c);g.write(t,n);var s=0,v=String.fromCharCode(o[s]);for(s+=1;sa;a+=1)for(var i=0;r>i;i+=1)o.setPixel(i,a,e(i,a));var u=l();o.write(u);for(var f=g(),c=u.toByteArray(),s=0;sn?t.push(n):2048>n?t.push(192|n>>6,128|63&n):55296>n||n>=57344?t.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&r.charCodeAt(e)),t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return t}return t(r)}}(r),r}()); /*! * jQuery PathBrowser * * (c) 2012 SABnzbd Team, Inc. All rights reserved. * * Dual licensed under MIT or GPLv2 licenses * http://en.wikipedia.org/wiki/MIT_License * http://en.wikipedia.org/wiki/GNU_General_Public_License * * Changed by Safihre - 11 Nov 2015 */ ;(function($) { // Building object function FileBrowser(element) { // Initialize this.element = $(element); this.initialDir = null; this.currentBrowserPath = null; this.currentRequest = null; this.fileBrowserDialog = $('#filebrowser_modal .modal-body'); this.fileBrowserTitle = this.element.data('title') || $('label[for="'+this.element.attr('id')+'"]').text() || ''; // Start this.init() }; // Adding button FileBrowser.prototype.init = function () { // Self-reference var self = this; // Small or big button buttonText = this.element.hasClass('fileBrowserSmall') ? '' : configTranslate.browseText; // Add button this.element.addClass('fileBrowserField').after( $('').click(function () { self.openBrowser(); }) ) } // Open browser-window FileBrowser.prototype.openBrowser = function() { // Self-reference var self = this; // set up the browser and launch the dialog // textbox (not saved) path > textbox (saved) path > none this.initialDir = this.element.val() || this.element.data('initialdir') || ''; // If there's no seperator, it must be a relative path if(this.initialDir.split(folderSeperator).length < 2 && this.element.data('initialdir')) { this.initialDir = this.element.data('initialdir') + folderSeperator + this.element.val(); } // Browse this.browse(this.initialDir , folderBrowseUrl); // Choose path and close modal $('#filebrowser_modal_accept').click(function() { // Is it a relative path? if(self.currentBrowserPath.indexOf(self.element.data('initialdir')) === 0) { // Remove start self.currentBrowserPath = self.currentBrowserPath.replace(self.element.data('initialdir')+folderSeperator, ''); // If it's identical to the initial dir the replacement won't work if(self.currentBrowserPath == self.element.data('initialdir')) { self.currentBrowserPath = ''; } } // Changed? if(self.element.val() != self.currentBrowserPath) { self.element.val(self.currentBrowserPath); formHasChanged = true; } // Hide and stop default action $('#filebrowser_modal').modal('hide'); return false; }) // Show hidden folders $('#show_hidden_folders').off('change') $('#show_hidden_folders').on('change', function() { self.browse(self.currentBrowserPath , folderBrowseUrl); }) // Use custom title instead of default and open modal $('#filebrowser_modal .modal-header h4').text(this.fileBrowserTitle); $('#filebrowser_modal').modal('show'); return false; } FileBrowser.prototype.browse = function(path, endpoint) { // Self-reference var self = this; // Still loading if (this.currentRequest) this.currentRequest.abort(); // Show hidden folders on Linux? var extraHidden = $('#show_hidden_folders').is(':checked') ? '&show_hidden_folders=1' : ''; // Get current folders this.currentBrowserPath = path; this.currentRequest = $.getJSON(endpoint + extraHidden, { name: path }, function (data) { // Clean self.fileBrowserDialog.empty(); // Make list var list = $('
    ').appendTo(self.fileBrowserDialog); $.each(data.paths, function (i, entry) { // Title for first one if(i == 0) { self.fileBrowserDialog.prepend($('

    ').text(entry.current_path)) return } // Regular link link = $('').click(function () { self.browse(entry.path, endpoint); } ).text(entry.name); // Back image if(entry.name == '..') { $(' ').prependTo(link); } else { $(' ').prependTo(link); } // Add to list link.appendTo(list); }); }); } // Make sure we have unique instances $.fn.fileBrowser = function () { return this.each(function () { if (!$.data(this, 'plugin_FileBrowser')) { $.data(this, 'plugin_FileBrowser', new FileBrowser(this)); } }); } })(jQuery); /* * Takes the inputs-elements found in the current selector * and extracts the values into the provided data-object. */ $.fn.extractFormDataTo = function(target) { var inputs = $("input[type != 'submit'][type != 'button']", this); // could use .serializeArray() but that omits unchecked items inputs.each(function (i,elem) { target[elem.name] = elem.value; }); var selects = $("select", this); selects.each(function (i,elem) { target[elem.name] = elem.value; }); return this; } /*! * Config JS * * (c) 2015 SABnzbd Team, Inc. All rights reserved. */ function config_success() { $('.saveButton').each(function () { $(this).removeAttr("disabled").html(' '+configTranslate.saveChanges); }); // Let us leave! formWasSubmitted = true; formHasChanged = false; } function config_failure() { $('.saveButton').each(function () { $(this).removeAttr("disabled").addClass('btn-danger').html(' '+configTranslate.failed); }); // Can't go yet.. formWasSubmitted = false; } function do_restart() { // Show overlay $('.main-restarting').show() // What template var switchedHTTPS = ($('#enable_https').is(':checked') == ($('#enable_https').data('original') === undefined)) var portsUnchanged = ($('#port').val() == $('#port').data('original')) && ($('#https_port').val() == $('#https_port').data('original')) // Are we on settings page or did nothing change? if(!$('body').hasClass('General') || (!switchedHTTPS && portsUnchanged)) { // Same as before var urlTotal = window.location.origin + urlBase } else { // Protocol and port depend on http(s) setting if($('#enable_https').is(':checked') && (window.location.protocol == 'https:' || !$('#https_port').val())) { // Https on and we visited this page from HTTPS var urlProtocol = 'https:'; var urlPort = $('#https_port').val() ? $('#https_port').val() : $('#port').val(); } else { // Regular var urlProtocol = 'http:'; var urlPort = $('#port').val(); } // We cannot make a good guess for the IP, so at least we assume that stays the same var urlTotal = urlProtocol + '//' + window.location.hostname + ':' + urlPort + urlBase; } // Show where we are going to connect $('.main-restarting .restarting-url').text(urlTotal) // Initiate restart $.ajax({ url: '../../config/restart?session=' + sabSession, complete: function() { // Keep counter of failures var failureCounter = 0; // Now we try until we can connect var refreshInterval = setInterval(function() { // We skip the first one if(failureCounter == 0) { failureCounter = failureCounter+1; return } $.ajax({ url: urlTotal, success: function() { // Back to base location.href = urlTotal; }, error: function(status, text) { failureCounter = failureCounter+1; // Too many failuers and we give up if(failureCounter >= 6) { // If the port has changed 'Access-Control-Allow-Origin' header will not allow // us to check if the server is back up. So after 7 failures we redirect // anyway in the hopes it works anyway.. location.href = urlTotal; } } }) }, 4000) // Exception if we go from HTTPS to HTTP // (this is not allowed by browsers and all of the above will be ignored) if(window.location.protocol != urlProtocol) { // Saftey redirect after 20 sec setTimeout(function() { location.href = urlTotal; }, 20*1000) } } }); } // Remove obfusication function removeObfuscation() { $('input[data-hide]').each(function(index, objInput) { $(objInput).attr('name', $(objInput).data('hide')) }) return true } // Add coloring to rows (shorthand function) function addRowColor() { // Have to do it seperate for each section $('.section').each(function(i, elmn) { $(elmn).find('.field-pair:visible').removeClass('even').filter(':even').addClass('even') }) } $(document).ready(function () { /** Restart function **/ $('.sabnzbd_restart').click(function () { $('.sabnzbd_restart').each(function () { $(this).attr("disabled", "disabled"); }); if (confirm(configTranslate.explainRestart.replace(/\/g, '\n'))) { $(this).attr("value", configTranslate.wizzardRestart); // Let us leave! formWasSubmitted = true; do_restart(); } $('.sabnzbd_restart').each(function () { $(this).removeAttr("disabled"); }); return false; }); /** Submit the form **/ $('.fullform').ajaxForm({ datatype: 'json', // But first remove Obfuscation! beforeSerialize: removeObfuscation, beforeSubmit: function () { $('.saveButton').each(function () { $(this).attr("disabled", "disabled").removeClass('btn-danger').html(' ' + configTranslate.saving); }); }, success: function (json) { if (json.error) { $('#config_err_msg').text(json.error); alert(json.error) config_failure() } else if(json.value && json.value.restart_req) { // Trigger restart question if(confirm(configTranslate.needRestart + "\n" + configTranslate.buttonRestart + " SABnzbd?")) { // No more questions do_restart(); } else { $('#config_err_msg').text(" "); setTimeout(config_success, 1000); } } else { $('#config_err_msg').text(" "); setTimeout(config_success, 1000); } }, error: function () { config_failure() }, timeout: 3000 }); /** Form changes tracking **/ $(document).on("submit", "form", function(event){ // Let us leave! formWasSubmitted = true; formHasChanged = false; }); $('#content').on('change', 'form input[type!="submit"][type!="button"], form select, form textarea', function (e) { formHasChanged = true; formWasSubmitted = false; }); window.onbeforeunload = function (e) { if (formHasChanged && !formWasSubmitted) { var message = configTranslate.confirmLeave, e = e || window.event; if (e) { e.returnValue = message; } return message; } } // Fix for touch devices needing double click on the menu $('.navbar-nav li a').on('touchstart', function(e) { $(this).click() }) // Add hover to checkboxes (can't do it with CSS) $('input[type="checkbox"]').siblings('label').addClass('config-hover') $('input[type="checkbox"]').parents('label').addClass('config-hover') // Disable sections var checkDisabled = '#rating_enable, #enable_tv_sorting, #enable_movie_sorting, #enable_date_sorting' $(checkDisabled).on('change', function() { $(this).parent().nextAll().toggleClass('disabled') }) if(!$(checkDisabled).is(':checked')) { $(checkDisabled).parent().nextAll().addClass('disabled') } // Advanced or not? $('.advanced-button').on('change', function(event){ localStorage.setItem('advanced-settings', !$('.advanced-settings').is(':visible')) $('.advanced-settings').toggle() addRowColor() }) if(localStorage.getItem('advanced-settings') == 'true') { $('.advanced-settings').show() $('#advanced-settings-button').prop('checked', true) addRowColor() } addRowColor() }); /* * SEARCH FUNCTIONALITY */ // Make :contains() case-insensitive $.expr[":"].contains = $.expr.createPseudo(function(arg) { return function( elem ) { return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; }); // Create list of pages to check and empty contain for results var arrPages = ['general', 'folders', 'switches', 'sorting', 'notify', 'special'] var pagesContainer = new Array(arrPages.length); // Add trigger to focus on the field and load the results $(document).ready(function() { $('#search-menu').on('shown.bs.dropdown', function(event) { // Focus so easy typing $('#search-box').focus() // Load things to search if we haven't yet if(!pagesContainer[0]) { $.each(arrPages, function(index, page) { $.get(rootURL + 'config/' + page + '/', function(data) { pagesContainer[index] = $(data).find('label') }); }); } }); // For the scrolling // *only* if we have anchor on the url if(window.location.hash) { // Sometimes the ID is non-existing try { // Could be an Advanced setting if(!$(window.location.hash).is(':visible')) { // Show advanced settings, but don't save in localStorage $('.advanced-settings').toggle() } // smooth scroll to the anchor id $('html, body').animate({ scrollTop: $(window.location.hash).offset().top -100 + 'px' }, 750, 'swing'); setTimeout(function() { $(window.location.hash).focus() }, 750) } catch(err) {} } }) // Don't go too fast var searchTimeout function doConfigSearch(value) { // Cancel previous clearTimeout(searchTimeout) // Build new search var searchTerm = $(value).val().replace('"', '\"') var searchOutput = $('#search-dropdown') // Build new search searchTimeout = setTimeout(function() { // Clear the output searchOutput.find('li:not(:first)').remove() // Anything to search for? if (searchTerm.length < 2) return // Find some results! $.each(pagesContainer, function(page_index, results) { // Get the matches var subResults = results.filter(':contains("'+searchTerm+'")') if(subResults.length > 0) { // Add the section searchOutput.append('
  • ') searchOutput.append('
  • '+configTranslate.searchPages[page_index]+'
  • ') $.each(subResults, function(index, result) { searchOutput.append('
  • '+$(result).text()+'
  • ') }) } }) }, 200) } sabnzbd-develop/interfaces/Config/templates/staticcfg/js/jquery-3.2.1.min.js0000600000175000017500000025120313642116632024747 0ustar jpjp/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ !function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("
    $error
    sabnzbd-develop/interfaces/Config/templates/config_cat.tmpl0000600000175000017500000001772713642116632022273 0ustar jpjp

    $T('explain-catTags2')
    $T('explain-catTags')


    $T('explain-relFolder'): $defdir
    class="sorting-row">
    $T('category') $T('priority') $T('mode') $T('script') $T('catFolderPath') $T('catTags')

    sabnzbd-develop/interfaces/Config/templates/config_folders.tmpl0000600000175000017500000001572613642116632023157 0ustar jpjp

    $T('userFolders')

    $T('explain-folderConfig')

    $T('base-folder'): $my_home
    $T('explain-download_dir')
    $T('explain-download_free')
    $T('explain-complete_dir')
    $T('explain-permissions')
    $T('explain-dirscan_dir')
    $T('explain-dirscan_speed')
    $T('explain-script_dir')
    $T('explain-email_dir')
    $T('explain-password_file')
          

    $T('systemFolders')

    $T('explain-folderConfig')

    $T('base-folder'): $my_lcldata
    $T('explain-admin_dir1') $T('explain-admin_dir2')
    $T('explain-log_dir')
    $T('explain-nzb_backup_dir')
    sabnzbd-develop/interfaces/Config/templates/config_general.tmpl0000600000175000017500000004702713642116632023135 0ustar jpjp

    $T('webServer')

    $T('restartRequired')

    $T('explain-host')
    $T('explain-port')
    0 then 'checked="checked" data-original="1"' else ""#-->/> $T('explain-enable_https')
    $T('explain-web_dir')  $caller_url
    $T('explain-language')
    $T('explain-ask-language') https://sabnzbd.org/wiki/translate
    $T('base-folder'): $my_lcldata
    $T('explain-https_port')
    $T('explain-https_cert')
    $T('explain-https_key')
    $T('explain-https_chain')

    $T('security')

    $T('restartRequired')

    $T('explain-web_username')
    $T('explain-web_password')
    $T('explain-inet_exposure').replace('. ','.
    '+$T('warning').upper()+' ')
    $T('explain-local_ranges')
    $T('explain-apikey')
    $T('explain-nzbkey')

    $T('cmenu-switches')

    0 then 'checked="checked"' else ""#--> /> $T('explain-auto_browser')
    $T('explain-check_new_rel')
    "> 0 then 'checked="checked"' else ""#--> /> $T('explain-enable_https_verification')

    $T('tuning')

    $T('explain-bandwidth_perc')
    $T('explain-cache_limitstr').replace("64M", "256M").replace("128M", "512M")
    sabnzbd-develop/interfaces/Config/templates/_inc_footer_uc.tmpl0000600000175000017500000000343313642116632023141 0ustar jpjp

    $T('restarting-sab')
    ...
    sabnzbd-develop/interfaces/Config/templates/config_switches.tmpl0000600000175000017500000011661313642116632023347 0ustar jpjp

    $T('swtag-server')

    $T('explain-load_balancing')
    $T('explain-max_art_tries')
    0 then 'checked="checked"' else ""#--> /> $T('explain-auto_disconnect')

    $T('swtag-queue')

    $T('explain-pre_script')
    $T('minutes') $T('explain-propagation_delay')
    0 then 'checked="checked"' else ""#--> /> $T('explain-top_only')
    0 then 'checked="checked"' else ""#--> /> $T('explain-pre_check')
    0 then 'checked="checked"' else ""#--> /> $T('explain-fail_hopeless_jobs')
    $T('explain-no_dupes')
    $T('explain-no_series_dupes')
    0 then 'checked="checked"' else ""#--> /> $T('explain-series_propercheck')
    $T('explain-pause_on_pwrar')
    $T('explain-unwanted_extensions')
    $T('explain-action_on_unwanted_extensions')
    0 then 'checked="checked"' else ""#--> /> $T('explain-auto_sort')
    0 then 'checked="checked"' else ""#--> /> $T('explain-direct_unpack').replace('. ', '.
    ')

    $T('swtag-pp')

    0 then 'checked="checked"' else ""#--> /> $T('explain-pause_on_post_processing')
    0 then 'checked="checked"' else ""#--> /> $T('explain-enable_all_par').replace('. ', '.
    ')
    "> /> $T('explain-nice')
    "> /> $T('explain-ionice')
    $T('explain-win_process_prio')
    $T('explain-par_option')
    0 then 'checked="checked"' else ""#--> /> $T('explain-sfv_check')
    0 then 'checked="checked"' else ""#--> /> $T('explain-safe_postproc')
    0 then 'checked="checked"' else ""#--> /> $T('explain-enable_recursive')
    0 then 'checked="checked"' else ""#--> /> $T('explain-flat_unpack')
    0 then 'checked="checked"' else ""#--> /> $T('explain-script_can_fail')
    0 then 'checked="checked"' else ""#--> /> $T('explain-new_nzb_on_failure')
    0 then 'checked="checked"' else ""#--> /> $T('explain-ignore_samples') $T('igsam-del').
    0 then 'checked="checked"' else ""#--> /> $T('explain-enable_meta').replace('. ', '.
    ')
    $T('explain-cleanup_list')
    $T('explain-history_retention').replace('. ', '.
    ')

    $T('swtag-naming')

    0 then 'checked="checked"' else ""#--> /> $T('explain-folder_rename').replace('. ', '.
    ')
    0 then 'checked="checked"' else ""#--> /> $T('explain-replace_spaces')
    0 then 'checked="checked"' else ""#--> /> $T('explain-replace_dots')
    0 then 'checked="checked"' else ""#--> /> $T('explain-sanitize_safe')

    $T('swtag-quota')

    $T('explain-quota_size')
    $T('explain-quota_period')
    $T('explain-quota_day')
    0 then 'checked="checked"' else ""#--> /> $T('explain-quota_resume')

    $T('swtag-indexing')

    0 then 'checked="checked"' else ""#--> /> $T('explain-rating_enable').replace('. ', '.
    ')
    $T('explain-rating_api_key')
    0 then 'checked="checked"' else ""#--> /> $T('explain-rating_filter_enable')

    0 then 'checked="checked"' else ""#--> /> 0 then 'checked="checked"' else ""#--> />

    0 then 'checked="checked"' else ""#--> /> 0 then 'checked="checked"' else ""#--> />

    0 then 'checked="checked"' else ""#--> />

    $T('explain-rating_filter_keywords')

    0 then 'checked="checked"' else ""#--> /> 0 then 'checked="checked"' else ""#--> />

    0 then 'checked="checked"' else ""#--> /> 0 then 'checked="checked"' else ""#--> />

    0 then 'checked="checked"' else ""#--> />

    $T('explain-rating_filter_keywords')

    sabnzbd-develop/interfaces/Config/templates/_inc_header_uc.tmpl0000600000175000017500000002427213642116632023077 0ustar jpjp#if $pane == "Config"# #set global $root = '../'# #else# #set global $root = '../../'# #end if# SABnzbd $T('menu-config') #if $pane != "Config" then "-" else ""# #if $pane == "General" then $T('cmenu-general') else ""# #if $pane == "Folders" then $T('cmenu-folders') else ""# #if $pane == "Switches" then $T('cmenu-switches') else ""# #if $pane == "Servers" then $T('cmenu-servers') else ""# #if $pane == "Scheduling" then $T('cmenu-scheduling') else ""# #if $pane == "Email" then $T('cmenu-notif') else ""# #if $pane == "Categories" then $T('cmenu-cat') else ""# #if $pane == "Sorting" then $T('cmenu-sorting') else ""# #if $pane == "Special" then $T('cmenu-special') else ""# #if $pane == "RSS" then $T('cmenu-rss') else ""#
    #include $webdir + "/staticcfg/images/logo-small.svg"#
    • $T('cmenu-general')
    • $T('cmenu-folders')
    • $T('cmenu-servers')
    • $T('cmenu-cat')
    • $T('cmenu-switches')
    • $T('cmenu-sorting')
    • $T('cmenu-notif')
    • $T('cmenu-scheduling')
    • $T('cmenu-rss')
    • $T('cmenu-special')
    • $T('menu-help')
    sabnzbd-develop/interfaces/Config/templates/config_rss.tmpl0000600000175000017500000011141313642116632022316 0ustar jpjp

    $T('explain-RSS')

      $T('name') $T('feed') URL  
    "> ">
    rel="$feed_item" /> $feed_item
    $uri

      $T('Next scan at:') $rss_next $T('explain-rss_rate')

    $T('cmenu-rss') » $active_feed

    $error
      $T('rss-order') $T('rss-type') $T('rss-filter') $T('category') $T('priority') $T('mode') $T('script')  
    ">
    />   $T('Incorrect filter')

    • $T('rss-matched')
    • $T('rss-notMatched')
    • $T('rss-done')
    $T('link-download') $T('rss-filter') $T('size') $T('sort-title') $T('category') $T('nzo-age') $T('source')
    $job['rule'] $job['skip'] $job['size_units'] $job['title'] $job['cat'] $job['age']
    $T('none')
    $T('link-download') $T('rss-filter') $T('size') $T('sort-title') $T('category') $T('nzo-age') $T('source')
    $job['rule'] $job['skip'] $job['size_units'] $job['title'] $job['cat'] $job['age']
    $T('none')
    $T('rss-added') $T('size') $T('sort-title') $T('category') $T('source')
    $job['time_downloaded'] $job['size_units'] $job['title'] $job['cat']
    $T('none')
    sabnzbd-develop/interfaces/Config/templates/config_server.tmpl0000600000175000017500000007232313642116632023023 0ustar jpjp

    $T('addServer')

    $T('srv-enable')
    $T('explain-ssl')
    $T('explain-svrprio')
    $T('days')
    $T('seconds')
    advanced-settings"> $T('explain-ssl_verify').replace('. ', '.
    ')
    $T('explain-ssl_ciphers')
    $T('readwiki') ${helpuri}advanced/ssl-ciphers
    $T('srv-explain-send_group')
    $T('explain-optional')
    ">
    ">

    $server['displayname']

    $server['priority'] $T('srv-priority'):
    />
    /> $T('explain-ssl')
    $T('explain-svrprio')
    $T('days')
    $T('seconds')
    advanced-settings"> $T('explain-ssl_verify').replace('. ', '.
    ')
    $T('explain-ssl_ciphers')
    $T('readwiki') ${helpuri}advanced/ssl-ciphers
    /> $T('explain-optional')
    /> $T('srv-explain-send_group')
    $T('srv-bandwidth'):
    $T('total'): $(server['amounts'][0])B
    $T('today'): $(server['amounts'][3])B
    $T('thisWeek'): $(server['amounts'][2])B
    $T('thisMonth'): $(server['amounts'][1])B
    :
    sabnzbd-develop/interfaces/Config/templates/config_notify.tmpl0000600000175000017500000006047713642116632023034 0ustar jpjp
    0 then 'checked="checked"' else ""#--> />
    0 then '' else 'style="display:none"'#-->>
    $T('affectedCat')

    $T('cmenu-email')

    0 then '' else 'style="display:none"'#-->> $T('affectedCat')
    0 then 'checked="checked"' else ""#--> /> $T('explain-email_full')
    0 then 'checked="checked"' else ""#--> /> $T('explain-email_rss')
    $T('explain-email_server') ($T('host'):$T('srv-port'))
    $T('explain-email_to')
    $T('explain-email_from')
    $T('explain-email_account')
    $T('explain-email_pwd')

    $T('section-NC')

    0 then 'checked="checked"' else ""#--> />
    0 then '' else 'style="display:none"'#-->>
    $show_notify_checkboxes('ncenter')

    $T('section-AC')

    0 then 'checked="checked"' else ""#--> />
    $show_cat_box('acenter')
    0 then '' else 'style="display:none"'#-->>
    $show_notify_checkboxes('acenter')

    $T('section-OSD')

    0 then 'checked="checked"' else ""#--> />
    $show_cat_box('ntfosd')
    0 then '' else 'style="display:none"'#-->>
    $show_notify_checkboxes('ntfosd')

    $T('section-NScript')

    0 then 'checked="checked"' else ""#--> />
    $T('explain-nscript_enable')
    $T('readwiki') $show_cat_box('nscript')
    0 then '' else 'style="display:none"'#-->>
    $T('explain-nscript_script')
    $T('Optional') - $T('explain-nscript_parameters')
    $show_notify_checkboxes('nscript')

    $T('section-Prowl')

    0 then 'checked="checked"' else ""#--> />
    $T('explain-prowl_enable') $show_cat_box('prowl')
    0 then '' else 'style="display:none"'#-->>
    $T('explain-prowl_apikey')

    $T('section-Pushover')

    0 then 'checked="checked"' else ""#--> />
    $T('explain-pushover_enable') $show_cat_box('pushover')
    0 then '' else 'style="display:none"'#-->>
    $T('explain-pushover_token')
    $T('explain-pushover_userkey')
    $T('explain-pushover_device')
    $T('explain-pushover_emergency_retry')
    $T('explain-pushover_emergency_expire')

    $T('section-Pushbullet')

    0 then 'checked="checked"' else ""#--> />
    $T('explain-pushbullet_enable') $show_cat_box('pushbullet')
    0 then '' else 'style="display:none"'#-->>
    $T('explain-pushbullet_apikey')
    $T('explain-pushbullet_device')
    $show_notify_checkboxes('pushbullet')
    sabnzbd-develop/interfaces/Config/templates/main.tmpl0000600000175000017500000000027513642116632021111 0ustar jpjp/* This file was intentionally left blank and is only needed for 'skin' detection routine */ /* https://github.com/thezoggy/sabnzbd-uni_Config */ /* Updated Nov 2015 by Safihre for 1.0.x */sabnzbd-develop/interfaces/Config/templates/config_scheduling.tmpl0000600000175000017500000001711613642116632023641 0ustar jpjp <% import time t = time.localtime() hour = t[3] if hour != 23: hour += 1 else: hour = 0 %>

    $T('addSchedule')

     : 






    $T('currentSchedules')

    "> 0 then 'checked="checked"' else ""#-->>
    $taskinfo[$schednum][1]:$taskinfo[$schednum][2]$taskinfo[$schednum][3] $taskinfo[$schednum][4]
    sabnzbd-develop/interfaces/Config/templates/config_sorting.tmpl0000600000175000017500000007333513642116632023206 0ustar jpjp

    $T('seriesSorting')

    $T('affectedCat')

    $T('ft-download'): $complete_dir
    0 then 'checked="checked"' else ""#--> />


     
    $T('sort-meaning') $T('sort-pattern') $T('sort-result')
    $T('show-name'): %sn $T('show-sp-name') ($T('case-adjusted'))
      %s.n $T('show-dot-name') ($T('case-adjusted'))
      %s_n $T('show-us-name') ($T('case-adjusted'))
    $T('show-name'): %sN $T('show-sp-name')
      %s.N $T('show-dot-name')
      %s_N $T('show-us-name')
    $T('show-seasonNum'): %s 1
      %0s 01
    $T('show-epNum'): %e 5
      %0e 05
    $T('ep-name'): %en $T('ep-sp-name')
      %e.n $T('ep-dot-name')
      %e_n $T('ep-us-name')
    $T('fileExt'): %ext avi
    $T('orgFilename'): %fn $T("sort-File")
    $T('orgJobname'): %dn
    $T('lowercase'): {$T('TEXT')} $T('text')

    $T('movieSort')

    $T('affectedCat')

    $T('ft-download'): $complete_dir
    0 then 'checked="checked"' else ""#--> />
    0 then 'checked="checked"' else ""#--> />
     
    $T('sort-meaning') $T('sort-pattern') $T('sort-result')
    $T('sort-title'): %title $T('movie-sp-name')
      %.title $T('movie-dot-name')
      %_title $T('movie-us-name')
    $T('year'): %y 2009
    $T('extension'): %ext avi
    $T('decade'): %decade 00
      %0decade 2000
    $T('orgFilename'): %fn $T('sort-File')
    $T('orgJobname'): %dn
    $T('lowercase'): {$T('TEXT')} $T('text')
    $T('multiPartLabel') $T('sort-pattern') $T('sort-result')
    $T('partNumber'): %1 1

    $T('dateSorting')

    $T('affectedCat')

    $T('ft-download'): $complete_dir
    0 then 'checked="checked"' else ""#--> />

     
    $T('sort-meaning') $T('sort-pattern') $T('sort-result')
    $T('show-name'): %t $T('show-sp-name')
      %.t $T('show-dot-name')
      %_t $T('show-us-name')
    $T('year'): %y 2009
    $T('month'): %m 1
      %0m 01
    $T('day-of-month'): %d 2
      %0d 02
    $T('decade'): %decade 00
      %0decade 2000
    $T('orgFilename'): %fn $T('sort-File')
    $T('orgJobname'): %dn
    $T('lowercase'): {$T('TEXT')} $T('text')
    sabnzbd-develop/interfaces/Config/templates/config.tmpl0000600000175000017500000001332513642116632021432 0ustar jpjp
    $T('version'): $version [$build]
    $T('uptime'): $uptime
    $T('confgFile'): $configfn
    $T('parameters'): $cmdline
    $T('pythonVersion'): $sys.version[:120] [$CODEPAGE]
    OpenSSL: $ssl_version
    $T('warning') $T('explain-nosslcontext')
    $T('opt-multicore-par2') $T('notAvailable') $T('explain-getpar2mt') ${helpuri}installation/multicore-par2
    SABYenc: $T('notAvailable')
    $T('opt-enable_unzip'): $T('notAvailable')
    $T('opt-enable_7zip'): $T('notAvailable')
    $T('homePage') https://sabnzbd.org/
    $T('menu-wiki') https://sabnzbd.org/wiki/
    $T('menu-forums') https://forums.sabnzbd.org/
    $T('source') https://github.com/sabnzbd/sabnzbd
    $T('menu-irc') #sabnzbd on irc.synirc.net $T('or') (webchat)
    $T('menu-issues') https://sabnzbd.org/wiki/introduction/known-issues
    $T('menu-donate') https://sabnzbd.org/donate
    Copyright © 2007-2019 The SABnzbd Team <team@sabnzbd.org>

    $T('yourRights')

    sabnzbd-develop/interfaces/Config/templates/config_special.tmpl0000600000175000017500000000647213642116632023137 0ustar jpjp

    $T('explain-special')

    $T('sptag-boolean')

    0 then 'checked="checked"' else ""#--> />

    $T('sptag-entries')

    sabnzbd-develop/ABOUT.txt0000600000175000017500000000212213642116632013345 0ustar jpjp******************************************* *** This is SABnzbd 2.3.8 *** ******************************************* SABnzbd is an open-source cross-platform binary newsreader. It simplifies the process of downloading from Usenet dramatically, thanks to its friendly web-based user interface and advanced built-in post-processing options that automatically verify, repair, extract and clean up posts downloaded from Usenet. SABnzbd also has a fully customizable user interface, and offers a complete API for third-party applications to hook into. There is an extensive Wiki on the use of SABnzbd. https://sabnzbd.org/wiki/ Please also read the file "ISSUES.txt" The organization of the download queue is different from 0.7.x (and older). 1.0.0 will not finish downloading an existing queue. Also, your sabnzbd.ini file will be upgraded, making it incompatible with older releases. ******************************************* *** Upgrading from 0.7.x and below *** ******************************************* Empty your current queue Stop SABnzbd. Install new version Start SABnzbd. sabnzbd-develop/LICENSE.txt0000600000175000017500000000143213642116632013560 0ustar jpjp(c) Copyright 2007-2019 by "The SABnzbd-team" This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. See accompanying files GPL2.txt and GPL3.txt.sabnzbd-develop/GPL2.txt0000600000175000017500000004310613642116632013206 0ustar jpjp GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. sabnzbd-develop/SABnzbd.py0000755000175000017500000017132213642116632013613 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys if sys.hexversion < 0x03050000: print("Sorry, requires Python 3.5 or above") print("You can read more at: https://sabnzbd.org/python3") sys.exit(1) import logging import logging.handlers import traceback import os import getopt import signal import socket import platform import ssl import time import re try: import Cheetah if Cheetah.Version[0] != '3': raise ValueError import six import feedparser import configobj import cherrypy import portend import cryptography import chardet except ValueError: print("Sorry, requires Python module Cheetah 3 or higher.") sys.exit(1) except ImportError: print("Not all required Python modules are available, please check requirements.txt") print("You can read more at: https://sabnzbd.org/python3") print("If you still experience problems, remove all .pyc files in this folder and subfolders") sys.exit(1) import sabnzbd import sabnzbd.lang import sabnzbd.interface from sabnzbd.constants import * import sabnzbd.newsunpack from sabnzbd.misc import check_latest_version, exit_sab, \ split_host, create_https_certificates, windows_variant, ip_extract, \ set_serv_parms, get_serv_parms, get_from_url from sabnzbd.filesystem import get_ext, real_path, long_path, globber_full, remove_file from sabnzbd.panic import panic_tmpl, panic_port, panic_host, panic, launch_a_browser import sabnzbd.scheduler as scheduler import sabnzbd.config as config import sabnzbd.cfg import sabnzbd.downloader import sabnzbd.notifier as notifier import sabnzbd.zconfig try: import win32api import win32serviceutil import win32evtlogutil import win32event import win32service import pywintypes win32api.SetConsoleCtrlHandler(sabnzbd.sig_handler, True) from util.mailslot import MailSlot from util.apireg import get_connection_info, set_connection_info, del_connection_info except ImportError: class MailSlot: pass if sabnzbd.WIN32: print("Sorry, requires Python module PyWin32.") sys.exit(1) # Global for this module, signaling loglevel change LOG_FLAG = False def guard_loglevel(): """ Callback function for guarding loglevel """ global LOG_FLAG LOG_FLAG = True class GUIHandler(logging.Handler): """ Logging handler collects the last warnings/errors/exceptions to be displayed in the web-gui """ def __init__(self, size): """ Initializes the handler """ logging.Handler.__init__(self) self.size = size self.store = [] def emit(self, record): """ Emit a record by adding it to our private queue """ if record.levelname == 'WARNING': sabnzbd.LAST_WARNING = record.msg % record.args else: sabnzbd.LAST_ERROR = record.msg % record.args if len(self.store) >= self.size: # 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) except UnicodeDecodeError: # Catch elusive Unicode conversion problems pass def clear(self): self.store = [] def count(self): return len(self.store) def content(self): """ Return an array with last records """ return self.store def print_help(): print() print(("Usage: %s [-f ] " % sabnzbd.MY_NAME)) print() print("Options marked [*] are stored in the config file") print() print("Options:") print(" -f --config-file Location of config file") print(" -s --server Listen on server:port [*]") print(" -t --templates Template directory [*]") print() print(" -l --logging <-1..2> Set logging level (-1=off, 0= least, 2= most) [*]") print(" -w --weblogging Enable cherrypy access logging") print() print(" -b --browser <0..1> Auto browser launch (0= off, 1= on) [*]") if sabnzbd.WIN32: print(" -d --daemon Use when run as a service") else: print(" -d --daemon Fork daemon process") print(" --pid Create a PID file in the given folder (full path)") print(" --pidfile Create a PID file with the given name (full path)") print() print(" -h --help Print this message") print(" -v --version Print version information") print(" -c --clean Remove queue, cache and logs") print(" -p --pause Start in paused mode") print(" --repair Add orphaned jobs from the incomplete folder to the queue") print(" --repair-all Try to reconstruct the queue from the incomplete folder") print(" with full data reconstruction") print(" --https 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(" --disable-file-log Logging is only written to console") print(" --new Run a new instance of SABnzbd") print() print("NZB (or related) file:") print(" NZB or compressed NZB file, with extension .nzb, .zip, .rar, .7z, .gz, or .bz2") print() def print_version(): print((""" %s-%s Copyright (C) 2007-2019, The SABnzbd-Team SABnzbd comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. It is licensed under the GNU GENERAL PUBLIC LICENSE Version 2 or (at your option) any later version. """ % (sabnzbd.MY_NAME, sabnzbd.__version__))) def daemonize(): """ Daemonize the process, based on various StackOverflow answers """ try: pid = os.fork() if pid > 0: sys.exit(0) except OSError: print("fork() failed") sys.exit(1) os.chdir(sabnzbd.DIR_PROG) os.setsid() # Make sure I can read my own files and shut out others prev = os.umask(0) os.umask(prev and int('077', 8)) try: pid = os.fork() if pid > 0: sys.exit(0) except OSError: print("fork() failed") sys.exit(1) # Flush I/O buffers sys.stdout.flush() sys.stderr.flush() # Get log file path and remove the log file if it got too large log_path = os.path.join(sabnzbd.cfg.log_dir.get_path(), DEF_LOG_ERRFILE) if os.path.exists(log_path) and os.path.getsize(log_path) > sabnzbd.cfg.log_size.get_int(): remove_file(log_path) # Replace file descriptors for stdin, stdout, and stderr with open('/dev/null', 'rb', 0) as f: os.dup2(f.fileno(), sys.stdin.fileno()) with open(log_path, 'ab', 0) as f: os.dup2(f.fileno(), sys.stdout.fileno()) with open(log_path, 'ab', 0) as f: os.dup2(f.fileno(), sys.stderr.fileno()) def abort_and_show_error(browserhost, cherryport, err=''): """ Abort program because of CherryPy troubles """ logging.error(T('Failed to start web-interface') + ' : ' + str(err)) if not sabnzbd.DAEMON: if '49' in err: panic_host(browserhost, cherryport) else: panic_port(browserhost, cherryport) sabnzbd.halt() exit_sab(2) def identify_web_template(key, defweb, wdir): """ Determine a correct web template set, return full template path """ if wdir is None: try: wdir = fix_webname(key()) except: wdir = '' if not wdir: wdir = defweb if key: key.set(wdir) if not wdir: # No default value defined, accept empty path return '' full_dir = real_path(sabnzbd.DIR_INTERFACES, wdir) full_main = real_path(full_dir, DEF_MAIN_TMPL) if not os.path.exists(full_main): logging.warning(T('Cannot find web template: %s, trying standard template'), full_main) full_dir = real_path(sabnzbd.DIR_INTERFACES, DEF_STDINTF) full_main = real_path(full_dir, DEF_MAIN_TMPL) if not os.path.exists(full_main): logging.exception('Cannot find standard template: %s', full_dir) panic_tmpl(full_dir) exit_sab(1) logging.info("Template location for %s is %s", defweb, full_dir) return real_path(full_dir, "templates") def check_template_scheme(color, web_dir): """ Check existence of color-scheme """ if color and os.path.exists(os.path.join(web_dir, 'static/stylesheets/colorschemes/' + color + '.css')): return color elif color and os.path.exists(os.path.join(web_dir, 'static/stylesheets/colorschemes/' + color)): return color else: return '' def fix_webname(name): if name: xname = name.title() else: xname = '' if xname in ('Default', ): return 'Glitter' elif xname in ('Glitter', 'Plush'): return xname elif xname in ('Wizard', ): return name.lower() elif xname in ('Config',): return 'Glitter' else: return name def get_user_profile_paths(vista_plus): """ Get the default data locations on Windows""" if sabnzbd.DAEMON: # In daemon mode, do not try to access the user profile # just assume that everything defaults to the program dir sabnzbd.DIR_APPDATA = sabnzbd.DIR_PROG sabnzbd.DIR_LCLDATA = sabnzbd.DIR_PROG sabnzbd.DIR_HOME = sabnzbd.DIR_PROG if sabnzbd.WIN32: # Ignore Win32 "logoff" signal # This should work, but it doesn't # Instead the signal_handler will ignore the "logoff" signal # signal.signal(5, signal.SIG_IGN) pass return elif sabnzbd.WIN32: try: from win32com.shell import shell, shellcon path = shell.SHGetFolderPath(0, shellcon.CSIDL_APPDATA, None, 0) sabnzbd.DIR_APPDATA = os.path.join(path, DEF_WORKDIR) path = shell.SHGetFolderPath(0, shellcon.CSIDL_LOCAL_APPDATA, None, 0) sabnzbd.DIR_LCLDATA = os.path.join(path, DEF_WORKDIR) sabnzbd.DIR_HOME = os.environ['USERPROFILE'] except: try: if vista_plus: root = os.environ['AppData'] user = os.environ['USERPROFILE'] sabnzbd.DIR_APPDATA = '%s\\%s' % (root.replace('\\Roaming', '\\Local'), DEF_WORKDIR) sabnzbd.DIR_HOME = user else: root = os.environ['USERPROFILE'] sabnzbd.DIR_APPDATA = '%s\\%s' % (root, DEF_WORKDIR) sabnzbd.DIR_HOME = root sabnzbd.DIR_LCLDATA = sabnzbd.DIR_APPDATA except: pass # Long-path everything sabnzbd.DIR_APPDATA = long_path(sabnzbd.DIR_APPDATA) sabnzbd.DIR_LCLDATA = long_path(sabnzbd.DIR_LCLDATA) sabnzbd.DIR_HOME = long_path(sabnzbd.DIR_HOME) return elif sabnzbd.DARWIN: home = os.environ.get('HOME') if home: sabnzbd.DIR_APPDATA = '%s/Library/Application Support/SABnzbd' % home sabnzbd.DIR_LCLDATA = sabnzbd.DIR_APPDATA sabnzbd.DIR_HOME = home return else: # Unix/Linux home = os.environ.get('HOME') if home: sabnzbd.DIR_APPDATA = '%s/.%s' % (home, DEF_WORKDIR) sabnzbd.DIR_LCLDATA = sabnzbd.DIR_APPDATA sabnzbd.DIR_HOME = home return # Nothing worked panic("Cannot access the user profile.", "Please start with sabnzbd.ini file in another location") exit_sab(2) 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) else: # Something wrong with SABYenc, so let's determine and print what: if sabnzbd.decoder.SABYENC_VERSION: # We have a VERSION, thus a SABYenc module, but it's not the correct version logging.error(T("SABYenc disabled: no correct version found! (Found v%s, expecting v%s)") % (sabnzbd.decoder.SABYENC_VERSION, sabnzbd.constants.SABYENC_VERSION_REQUIRED)) else: # No SABYenc module at all logging.error(T("SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc") % sabnzbd.constants.SABYENC_VERSION_REQUIRED) # Do not allow downloading sabnzbd.NO_DOWNLOADING = True logging.info('Cryptography module (v%s)... found!', cryptography.__version__) if sabnzbd.newsunpack.PAR2_COMMAND: logging.info("par2 binary... found (%s)", sabnzbd.newsunpack.PAR2_COMMAND) else: logging.error(T('par2 binary... NOT found!')) # Do not allow downloading sabnzbd.NO_DOWNLOADING = True 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) # Report problematic unrar if sabnzbd.newsunpack.RAR_PROBLEM and not sabnzbd.cfg.ignore_wrong_unrar(): have_str = '%.2f' % (float(sabnzbd.newsunpack.RAR_VERSION) / 100) want_str = '%.2f' % (float(sabnzbd.constants.REC_RAR_VERSION) / 100) logging.warning(T('Your UNRAR version is %s, we recommend version %s or higher.
    ') % (have_str, want_str)) elif not (sabnzbd.WIN32 or sabnzbd.DARWIN): logging.info('UNRAR binary version %.2f', (float(sabnzbd.newsunpack.RAR_VERSION) / 100)) else: logging.error(T('unrar binary... NOT found')) # Do not allow downloading sabnzbd.NO_DOWNLOADING = True if sabnzbd.newsunpack.ZIP_COMMAND: logging.info("unzip binary... found (%s)", sabnzbd.newsunpack.ZIP_COMMAND) else: logging.info(T('unzip binary... NOT found!')) if sabnzbd.newsunpack.SEVEN_COMMAND: logging.info("7za binary... found (%s)", sabnzbd.newsunpack.SEVEN_COMMAND) else: logging.info(T('7za binary... NOT found!')) if not sabnzbd.WIN32: if sabnzbd.newsunpack.NICE_COMMAND: logging.info("nice binary... found (%s)", sabnzbd.newsunpack.NICE_COMMAND) else: logging.info("nice binary... NOT found!") if sabnzbd.newsunpack.IONICE_COMMAND: logging.info("ionice binary... found (%s)", sabnzbd.newsunpack.IONICE_COMMAND) else: logging.info("ionice binary... NOT found!") # Show fatal warning if sabnzbd.NO_DOWNLOADING: logging.error(T('Essential modules are missing, downloading cannot start.')) def all_localhosts(): """ Return all unique values of localhost in order of preference """ ips = ['127.0.0.1'] try: # Check whether IPv6 is available and enabled info = socket.getaddrinfo('::1', None) af, socktype, proto, _canonname, _sa = info[0] s = socket.socket(af, socktype, proto) s.close() except socket.error: return ips try: info = socket.getaddrinfo('localhost', None) except socket.error: # localhost does not resolve return ips ips = [] for item in info: item = item[4][0] # Avoid problems on strange Linux settings if not isinstance(item, str): continue # Only return IPv6 when enabled if item not in ips and ('::1' not in item or sabnzbd.cfg.ipv6_hosting()): ips.append(item) return ips def check_resolve(host): """ Return True if 'host' resolves """ try: socket.getaddrinfo(host, None) except socket.error: # Does not resolve return False return True def get_webhost(cherryhost, cherryport, https_port): """ Determine the webhost address and port, return (host, port, browserhost) """ if cherryhost == '0.0.0.0' and not check_resolve('127.0.0.1'): cherryhost = '' elif cherryhost == '::' and not check_resolve('::1'): cherryhost = '' if cherryhost is None: cherryhost = sabnzbd.cfg.cherryhost() else: sabnzbd.cfg.cherryhost.set(cherryhost) # Get IP address, but discard APIPA/IPV6 # If only APIPA's or IPV6 are found, fall back to localhost ipv4 = ipv6 = False localhost = hostip = 'localhost' try: info = socket.getaddrinfo(socket.gethostname(), None) except socket.error: # Hostname does not resolve try: # Valid user defined name? info = socket.getaddrinfo(cherryhost, None) except socket.error: if cherryhost not in ('localhost', '127.0.0.1', '::1'): cherryhost = '0.0.0.0' try: info = socket.getaddrinfo(localhost, None) except socket.error: info = socket.getaddrinfo('127.0.0.1', None) localhost = '127.0.0.1' for item in info: ip = str(item[4][0]) if ip.startswith('169.254.'): pass # Automatic Private IP Addressing (APIPA) elif ':' in ip: ipv6 = True elif '.' in ip and not ipv4: ipv4 = True hostip = ip # A blank host will use the local ip address if cherryhost == '': if ipv6 and ipv4: # To protect Firefox users, use numeric IP cherryhost = hostip browserhost = hostip else: cherryhost = socket.gethostname() browserhost = cherryhost # 0.0.0.0 will listen on all ipv4 interfaces (no ipv6 addresses) elif cherryhost == '0.0.0.0': # Just take the gamble for this cherryhost = '0.0.0.0' browserhost = localhost # :: will listen on all ipv6 interfaces (no ipv4 addresses) elif cherryhost in ('::', '[::]'): cherryhost = cherryhost.strip('[').strip(']') # Assume '::1' == 'localhost' browserhost = localhost # IPV6 address elif '[' in cherryhost or ':' in cherryhost: browserhost = cherryhost # IPV6 numeric address elif cherryhost.replace('.', '').isdigit(): # IPV4 numerical browserhost = cherryhost elif cherryhost == localhost: cherryhost = localhost browserhost = localhost else: # If on Vista and/or APIPA, use numerical IP, to help FireFoxers if ipv6 and ipv4: cherryhost = hostip browserhost = cherryhost # Some systems don't like brackets in numerical ipv6 if sabnzbd.DARWIN: cherryhost = cherryhost.strip('[]') else: try: socket.getaddrinfo(cherryhost, None) except socket.error: cherryhost = cherryhost.strip('[]') if ipv6 and ipv4 and \ (browserhost not in ('localhost', '127.0.0.1', '[::1]', '::1')): sabnzbd.AMBI_LOCALHOST = True logging.info("IPV6 has priority on this system, potential Firefox issue") if ipv6 and ipv4 and cherryhost == '' and sabnzbd.WIN32: logging.warning(T('Please be aware the 0.0.0.0 hostname will need an IPv6 address for external access')) if cherryhost == 'localhost' and not sabnzbd.WIN32 and not sabnzbd.DARWIN: # On the Ubuntu family, localhost leads to problems for CherryPy ips = ip_extract() if '127.0.0.1' in ips and '::1' in ips: cherryhost = '127.0.0.1' if ips[0] != '127.0.0.1': browserhost = '127.0.0.1' # This is to please Chrome on OSX if cherryhost == 'localhost' and sabnzbd.DARWIN: cherryhost = '127.0.0.1' browserhost = 'localhost' if cherryport is None: cherryport = sabnzbd.cfg.cherryport.get_int() else: sabnzbd.cfg.cherryport.set(str(cherryport)) if https_port is None: https_port = sabnzbd.cfg.https_port.get_int() else: sabnzbd.cfg.https_port.set(str(https_port)) # if the https port was specified, assume they want HTTPS enabling also sabnzbd.cfg.enable_https.set(True) if cherryport == https_port and sabnzbd.cfg.enable_https(): sabnzbd.cfg.enable_https.set(False) # Should have a translated message, but that's not available yet logging.error(T('HTTP and HTTPS ports cannot be the same')) return cherryhost, cherryport, browserhost, https_port def attach_server(host, port, cert=None, key=None, chain=None): """ Define and attach server, optionally HTTPS """ if sabnzbd.cfg.ipv6_hosting() or '::1' not in host: http_server = cherrypy._cpserver.Server() http_server.bind_addr = (host, port) if cert and key: http_server.ssl_module = 'builtin' http_server.ssl_certificate = cert http_server.ssl_private_key = key http_server.ssl_certificate_chain = chain http_server.subscribe() def is_sabnzbd_running(url): """ Return True when there's already a SABnzbd instance running. """ try: 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) sabnzbd.set_https_verification(prev) return ver and (re.search(b'\d+\.\d+\.', ver) or ver.strip() == sabnzbd.__version__) except: return False def find_free_port(host, currentport): """ Return a free port, 0 when nothing is free """ n = 0 while n < 10 and currentport <= 49151: try: portend.free(host, currentport, timeout=0.025) return currentport except: currentport += 5 n += 1 return 0 def check_for_sabnzbd(url, upload_nzbs, allow_browser=True): """ Check for a running instance of sabnzbd on this port allow_browser==True|None will launch the browser, False will not. """ if allow_browser is None: allow_browser = True if is_sabnzbd_running(url): # Upload any specified nzb files to the running instance if upload_nzbs: from sabnzbd.utils.upload import upload_file prev = sabnzbd.set_https_verification(False) for f in upload_nzbs: upload_file(url, f) sabnzbd.set_https_verification(prev) else: # Launch the web browser and quit since sabnzbd is already running # Trim away everything after the final slash in the URL url = url[:url.rfind('/') + 1] launch_a_browser(url, force=allow_browser) exit_sab(0) return True return False def evaluate_inipath(path): """ Derive INI file path from a partial path. Full file path: if file does not exist the name must contain a dot but not a leading dot. foldername is enough, the standard name will be appended. """ path = os.path.normpath(os.path.abspath(path)) inipath = os.path.join(path, DEF_INI_FILE) if os.path.isdir(path): return inipath elif os.path.isfile(path) or os.path.isfile(path + '.bak'): return path else: _dirpart, name = os.path.split(path) if name.find('.') < 1: return inipath else: return path def commandline_handler(): """ Split win32-service commands are true parameters Returns: service, sab_opts, serv_opts, upload_nzbs """ service = '' sab_opts = [] serv_opts = [os.path.normpath(os.path.abspath(sys.argv[0]))] upload_nzbs = [] # OSX binary: get rid of the weird -psn_0_123456 parameter for arg in sys.argv: if arg.startswith('-psn_'): sys.argv.remove(arg) break # Ugly hack to remove the extra "SABnzbd*" parameter the Windows binary # gets when it's restarted if len(sys.argv) > 1 and \ 'sabnzbd' in sys.argv[1].lower() and \ not sys.argv[1].startswith('-'): slice = 2 else: slice = 1 # Prepend options from env-variable to options info = os.environ.get('SABnzbd', '').split() info.extend(sys.argv[slice:]) try: opts, args = getopt.getopt(info, "phdvncwl:s:f:t:b:2:", ['pause', 'help', 'daemon', 'nobrowser', 'clean', 'logging=', 'weblogging', 'server=', 'templates', 'ipv6_hosting=', 'template2', 'browser=', 'config-file=', 'force', 'disable-file-log', 'version', 'https=', 'autorestarted', 'repair', 'repair-all', 'log-all', 'no-login', 'pid=', 'new', 'console', 'pidfile=', # Below Win32 Service options 'password=', 'username=', 'startup=', 'perfmonini=', 'perfmondll=', 'interactive', 'wait=', ]) except getopt.GetoptError: print_help() exit_sab(2) # Check for Win32 service commands if args and args[0] in ('install', 'update', 'remove', 'start', 'stop', 'restart', 'debug'): service = args[0] serv_opts.extend(args) if not service: # Get and remove any NZB file names for entry in args: if get_ext(entry) in VALID_NZB_FILES + VALID_ARCHIVES: upload_nzbs.append(os.path.abspath(entry)) for opt, arg in opts: if opt in ('password', 'username', 'startup', 'perfmonini', 'perfmondll', 'interactive', 'wait'): # Service option, just collect if service: serv_opts.append(opt) if arg: serv_opts.append(arg) else: if opt == '-f': arg = os.path.normpath(os.path.abspath(arg)) sab_opts.append((opt, arg)) return service, sab_opts, serv_opts, upload_nzbs def get_f_option(opts): """ Return value of the -f option """ for opt, arg in opts: if opt == '-f': return arg else: return None def main(): global LOG_FLAG import sabnzbd # Due to ApplePython bug autobrowser = None autorestarted = False sabnzbd.MY_FULLNAME = sys.argv[0] sabnzbd.MY_NAME = os.path.basename(sabnzbd.MY_FULLNAME) fork = False pause = False inifile = None cherryhost = None cherryport = None https_port = None cherrypylogging = None clean_up = False logging_level = None no_file_log = False web_dir = None vista_plus = False win64 = False repair = 0 no_login = False sabnzbd.RESTART_ARGS = [sys.argv[0]] pid_path = None pid_file = None new_instance = False osx_console = False ipv6_hosting = None _service, sab_opts, _serv_opts, upload_nzbs = commandline_handler() for opt, arg in sab_opts: if opt == '--servicecall': sabnzbd.MY_FULLNAME = arg elif opt in ('-d', '--daemon'): if not sabnzbd.WIN32: fork = True autobrowser = False sabnzbd.DAEMON = True sabnzbd.RESTART_ARGS.append(opt) elif opt in ('-f', '--config-file'): inifile = arg sabnzbd.RESTART_ARGS.append(opt) sabnzbd.RESTART_ARGS.append(arg) elif opt in ('-h', '--help'): print_help() exit_sab(0) elif opt in ('-t', '--templates'): web_dir = arg elif opt in ('-s', '--server'): (cherryhost, cherryport) = split_host(arg) elif opt in ('-n', '--nobrowser'): autobrowser = False elif opt in ('-b', '--browser'): try: autobrowser = bool(int(arg)) except ValueError: autobrowser = True elif opt == '--autorestarted': autorestarted = True elif opt in ('-c', '--clean'): clean_up = True elif opt in ('-w', '--weblogging'): cherrypylogging = True elif opt in ('-l', '--logging'): try: logging_level = int(arg) except: logging_level = -2 if logging_level < -1 or logging_level > 2: print_help() exit_sab(1) elif opt in ('-v', '--version'): print_version() exit_sab(0) elif opt in ('-p', '--pause'): pause = True elif opt == '--https': https_port = int(arg) sabnzbd.RESTART_ARGS.append(opt) sabnzbd.RESTART_ARGS.append(arg) elif opt == '--repair': repair = 1 pause = True elif opt == '--repair-all': repair = 2 pause = True elif opt == '--log-all': sabnzbd.LOG_ALL = True elif opt == '--disable-file-log': no_file_log = True elif opt == '--no-login': no_login = True elif opt == '--pid': pid_path = arg sabnzbd.RESTART_ARGS.append(opt) sabnzbd.RESTART_ARGS.append(arg) elif opt == '--pidfile': pid_file = arg sabnzbd.RESTART_ARGS.append(opt) sabnzbd.RESTART_ARGS.append(arg) elif opt == '--new': new_instance = True elif opt == '--ipv6_hosting': ipv6_hosting = arg sabnzbd.MY_FULLNAME = os.path.normpath(os.path.abspath(sabnzbd.MY_FULLNAME)) sabnzbd.MY_NAME = os.path.basename(sabnzbd.MY_FULLNAME) sabnzbd.DIR_PROG = os.path.dirname(sabnzbd.MY_FULLNAME) sabnzbd.DIR_INTERFACES = real_path(sabnzbd.DIR_PROG, DEF_INTERFACES) sabnzbd.DIR_LANGUAGE = real_path(sabnzbd.DIR_PROG, DEF_LANGUAGE) org_dir = os.getcwd() if getattr(sys, 'frozen', None) == 'macosx_app': # Correct path if frozen with py2app (OSX) sabnzbd.MY_FULLNAME = sabnzbd.MY_FULLNAME.replace("/Resources/SABnzbd.py", "/MacOS/SABnzbd") # Need console logging for SABnzbd.py and SABnzbd-console.exe console_logging = (not hasattr(sys, "frozen")) or (sabnzbd.MY_NAME.lower().find('-console') > 0) console_logging = console_logging and not sabnzbd.DAEMON LOGLEVELS = (logging.FATAL, logging.WARNING, logging.INFO, logging.DEBUG) # Setup primary logging to prevent default console logging gui_log = GUIHandler(MAX_WARNINGS) gui_log.setLevel(logging.WARNING) format_gui = '%(asctime)s\n%(levelname)s\n%(message)s' gui_log.setFormatter(logging.Formatter(format_gui)) sabnzbd.GUIHANDLER = gui_log # Create logger logger = logging.getLogger('') logger.setLevel(logging.WARNING) logger.addHandler(gui_log) # Detect Windows variant if sabnzbd.WIN32: vista_plus, win64 = windows_variant() sabnzbd.WIN64 = win64 if inifile: # INI file given, simplest case inifile = evaluate_inipath(inifile) else: # No ini file given, need profile data get_user_profile_paths(vista_plus) # Find out where INI file is inifile = os.path.abspath(os.path.join(sabnzbd.DIR_LCLDATA, DEF_INI_FILE)) # Long-path notation on Windows to be sure inifile = long_path(inifile) # If INI file at non-std location, then use INI location as $HOME if sabnzbd.DIR_LCLDATA != os.path.dirname(inifile): sabnzbd.DIR_HOME = os.path.dirname(inifile) # All system data dirs are relative to the place we found the INI file sabnzbd.DIR_LCLDATA = os.path.dirname(inifile) if not os.path.exists(inifile) and not os.path.exists(inifile + '.bak') and not os.path.exists(sabnzbd.DIR_LCLDATA): try: os.makedirs(sabnzbd.DIR_LCLDATA) except IOError: panic('Cannot create folder "%s".' % sabnzbd.DIR_LCLDATA, 'Check specified INI file location.') exit_sab(1) sabnzbd.cfg.set_root_folders(sabnzbd.DIR_HOME, sabnzbd.DIR_LCLDATA) res, msg = config.read_config(inifile) if not res: panic(msg, 'Specify a correct file or delete this file.') exit_sab(1) # Set root folders for HTTPS server file paths sabnzbd.cfg.set_root_folders2() if ipv6_hosting is not None: sabnzbd.cfg.ipv6_hosting.set(ipv6_hosting) # Determine web host address cherryhost, cherryport, browserhost, https_port = get_webhost(cherryhost, cherryport, https_port) enable_https = sabnzbd.cfg.enable_https() # When this is a daemon, just check and bail out if port in use if sabnzbd.DAEMON: if enable_https and https_port: try: portend.free(cherryhost, https_port, timeout=0.05) except IOError: abort_and_show_error(browserhost, cherryport) except: abort_and_show_error(browserhost, cherryport, '49') try: portend.free(cherryhost, cherryport, timeout=0.05) except IOError: abort_and_show_error(browserhost, cherryport) except: abort_and_show_error(browserhost, cherryport, '49') # Windows instance is reachable through registry url = None if sabnzbd.WIN32 and not new_instance: url = get_connection_info() if url and check_for_sabnzbd(url, upload_nzbs, autobrowser): exit_sab(0) # SSL if enable_https: port = https_port or cherryport try: portend.free(browserhost, port, timeout=0.05) except IOError as error: if str(error) == 'Port not bound.': pass else: if not url: url = 'https://%s:%s%s/api?' % (browserhost, port, sabnzbd.cfg.url_base()) if new_instance or not check_for_sabnzbd(url, upload_nzbs, autobrowser): # Bail out if we have fixed our ports after first start-up if sabnzbd.cfg.fixed_ports(): abort_and_show_error(browserhost, cherryport) # Find free port to bind newport = find_free_port(browserhost, port) if newport > 0: # Save the new port if https_port: https_port = newport sabnzbd.cfg.https_port.set(newport) else: # In case HTTPS == HTTP port cherryport = newport sabnzbd.cfg.cherryport.set(newport) except: # Something else wrong, probably badly specified host abort_and_show_error(browserhost, cherryport, '49') # NonSSL check if there's no HTTPS or we only use 1 port if not (enable_https and not https_port): try: portend.free(browserhost, cherryport, timeout=0.05) except IOError as error: if str(error) == 'Port not bound.': pass else: if not url: url = 'http://%s:%s%s/api?' % (browserhost, cherryport, sabnzbd.cfg.url_base()) if new_instance or not check_for_sabnzbd(url, upload_nzbs, autobrowser): # Bail out if we have fixed our ports after first start-up if sabnzbd.cfg.fixed_ports(): abort_and_show_error(browserhost, cherryport) # Find free port to bind port = find_free_port(browserhost, cherryport) if port > 0: sabnzbd.cfg.cherryport.set(port) cherryport = port except: # Something else wrong, probably badly specified host abort_and_show_error(browserhost, cherryport, '49') # We found a port, now we never check again sabnzbd.cfg.fixed_ports.set(True) # Logging-checks logdir = sabnzbd.cfg.log_dir.get_path() if fork and not logdir: print("Error: I refuse to fork without a log directory!") sys.exit(1) if clean_up: xlist = globber_full(logdir) for x in xlist: if RSS_FILE_NAME not in x: try: os.remove(x) except: pass # Prevent the logger from raising exceptions # primarily to reduce the fallout of Python issue 4749 logging.raiseExceptions = 0 # Log-related constants we always need if logging_level is None: logging_level = sabnzbd.cfg.log_level() else: sabnzbd.cfg.log_level.set(logging_level) sabnzbd.LOGFILE = os.path.join(logdir, DEF_LOG_FILE) logformat = '%(asctime)s::%(levelname)s::[%(module)s:%(lineno)d] %(message)s' logger.setLevel(LOGLEVELS[logging_level + 1]) try: if not no_file_log: rollover_log = logging.handlers.RotatingFileHandler( sabnzbd.LOGFILE, 'a+', sabnzbd.cfg.log_size.get_int(), sabnzbd.cfg.log_backups()) rollover_log.setFormatter(logging.Formatter(logformat)) logger.addHandler(rollover_log) except IOError: print("Error:") print("Can't write to logfile") exit_sab(2) # Fork on non-Windows processes if fork and not sabnzbd.WIN32: daemonize() else: if console_logging: console = logging.StreamHandler() console.setLevel(LOGLEVELS[logging_level + 1]) console.setFormatter(logging.Formatter(logformat)) logger.addHandler(console) if no_file_log: logging.info('Console logging only') logging.info('--------------------------------') logging.info('%s-%s (rev=%s)', sabnzbd.MY_NAME, sabnzbd.__version__, sabnzbd.__baseline__) logging.info('Full executable path = %s', sabnzbd.MY_FULLNAME) if sabnzbd.WIN32: suffix = '' if win64: suffix = '(win64)' try: logging.info('Platform = %s %s', platform.platform(), suffix) except: logging.info('Platform = %s ', suffix) else: logging.info('Platform = %s', os.name) logging.info('Python-version = %s', sys.version) logging.info('Arguments = %s', sabnzbd.CMDLINE) if sabnzbd.DOCKER: logging.info("Running inside a docker container") else: logging.info("Not inside a docker container") # Find encoding; relevant for external processing activities logging.info('Preferred encoding = %s', sabnzbd.encoding.CODEPAGE) # On Linux/FreeBSD/Unix "UTF-8" is strongly, strongly adviced: if not sabnzbd.WIN32 and not sabnzbd.DARWIN and not ('utf-8' in sabnzbd.encoding.CODEPAGE.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.") % sabnzbd.encoding.CODEPAGE) # 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) 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() if mylocalipv4: logging.debug('My local IPv4 address = %s', mylocalipv4) else: logging.debug('Could not determine my local IPv4 address') mypublicipv4 = publicipv4() if mypublicipv4: logging.debug('My public IPv4 address = %s', mypublicipv4) else: logging.debug('Could not determine my public IPv4 address') myipv6 = ipv6() if myipv6: logging.debug('My IPv6 address = %s', myipv6) else: logging.debug('Could not determine my IPv6 address') # Measure and log system performance measured by pystone and - if possible - CPU model from sabnzbd.utils.getperformance import getpystone, getcpu pystoneperf = getpystone() if pystoneperf: logging.debug('CPU Pystone available performance = %s', pystoneperf) else: logging.debug('CPU Pystone available performance could not be calculated') cpumodel = getcpu() # Linux only if cpumodel: logging.debug('CPU model = %s', cpumodel) logging.info('Using INI file %s', inifile) if autobrowser is not None: sabnzbd.cfg.autobrowser.set(autobrowser) if not sabnzbd.WIN_SERVICE and not getattr(sys, 'frozen', None) == 'macosx_app': signal.signal(signal.SIGINT, sabnzbd.sig_handler) signal.signal(signal.SIGTERM, sabnzbd.sig_handler) sabnzbd.initialize(pause, clean_up, evalSched=True, repair=repair) os.chdir(sabnzbd.DIR_PROG) sabnzbd.WEB_DIR = identify_web_template(sabnzbd.cfg.web_dir, DEF_STDINTF, fix_webname(web_dir)) sabnzbd.WEB_DIR_CONFIG = identify_web_template(None, DEF_STDCONFIG, '') sabnzbd.WIZARD_DIR = os.path.join(sabnzbd.DIR_INTERFACES, 'wizard') sabnzbd.WEB_COLOR = check_template_scheme(sabnzbd.cfg.web_color(), sabnzbd.WEB_DIR) sabnzbd.cfg.web_color.set(sabnzbd.WEB_COLOR) # Save the INI file config.save_config(force=True) if sabnzbd.cfg.win_menu() and not sabnzbd.DAEMON: if sabnzbd.WIN32: import sabnzbd.sabtray sabnzbd.WINTRAY = sabnzbd.sabtray.SABTrayThread() elif sabnzbd.LINUX_POWER and os.environ.get('DISPLAY'): try: import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk import sabnzbd.sabtraylinux sabnzbd.LINUXTRAY = sabnzbd.sabtraylinux.StatusIcon() except: logging.info("python3-gi not found, no SysTray.") # Find external programs sabnzbd.newsunpack.find_programs(sabnzbd.DIR_PROG) print_modules() # HTTPS certificate generation https_cert = sabnzbd.cfg.https_cert.get_path() https_key = sabnzbd.cfg.https_key.get_path() https_chain = sabnzbd.cfg.https_chain.get_path() if not (sabnzbd.cfg.https_chain() and os.path.exists(https_chain)): https_chain = None if enable_https: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not (https_cert and os.path.exists(https_cert)) or not (https_key and os.path.exists(https_key)): create_https_certificates(https_cert, https_key) if not (os.path.exists(https_cert) and os.path.exists(https_key)): 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') # For 0.0.0.0 CherryPy will always pick IPv4, so make sure the secondary localhost is IPv6 if multilocal and cherryhost == '0.0.0.0' and hosts[1] == '127.0.0.1': hosts[1] = '::1' # The Windows binary requires numeric localhost as primary address if cherryhost == 'localhost': cherryhost = hosts[0] if enable_https: if https_port: # Extra HTTP port for primary localhost attach_server(cherryhost, cherryport) if multilocal: # Extra HTTP port for secondary localhost attach_server(hosts[1], cherryport) # Extra HTTPS port for secondary localhost attach_server(hosts[1], https_port, https_cert, https_key, https_chain) cherryport = https_port elif multilocal: # Extra HTTPS port for secondary localhost attach_server(hosts[1], cherryport, https_cert, https_key, https_chain) cherrypy.config.update({'server.ssl_module': 'builtin', 'server.ssl_certificate': https_cert, 'server.ssl_private_key': https_key, 'server.ssl_certificate_chain': https_chain}) elif multilocal: # Extra HTTP port for secondary localhost attach_server(hosts[1], cherryport) if no_login: sabnzbd.cfg.username.set('') sabnzbd.cfg.password.set('') mime_gzip = ('text/*', 'application/javascript', 'application/x-javascript', 'application/json', 'application/xml', 'application/vnd.ms-fontobject', 'application/font*', 'image/svg+xml' ) cherrypy.config.update({'server.environment': 'production', 'server.socket_host': cherryhost, 'server.socket_port': cherryport, 'server.shutdown_timeout': 0, 'log.screen': False, 'engine.autoreload.on': False, 'tools.encode.on': True, 'tools.gzip.on': True, 'tools.gzip.mime_types': mime_gzip, 'request.show_tracebacks': True, 'error_page.401': sabnzbd.panic.error_page_401, 'error_page.404': sabnzbd.panic.error_page_404 }) # Do we want CherryPy Logging? Cannot be done via the config if cherrypylogging: sabnzbd.WEBLOGFILE = os.path.join(logdir, DEF_LOG_CHERRY) cherrypy.log.screen = True cherrypy.log.access_log.propagate = True cherrypy.log.access_file = str(sabnzbd.WEBLOGFILE) else: cherrypy.log.access_log.propagate = False # Force mimetypes (OS might overwrite them) forced_mime_types = {'css': 'text/css', 'js': 'application/javascript'} static = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(sabnzbd.WEB_DIR, 'static'), 'tools.staticdir.content_types': forced_mime_types} staticcfg = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(sabnzbd.WEB_DIR_CONFIG, 'staticcfg'), 'tools.staticdir.content_types': forced_mime_types} wizard_static = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(sabnzbd.WIZARD_DIR, 'static'), 'tools.staticdir.content_types': forced_mime_types} appconfig = {'/api': { 'tools.auth_basic.on': False, 'tools.response_headers.on': True, 'tools.response_headers.headers': [('Access-Control-Allow-Origin', '*')] }, '/static': static, '/wizard/static': wizard_static, '/favicon.ico': {'tools.staticfile.on': True, 'tools.staticfile.filename': os.path.join(sabnzbd.WEB_DIR_CONFIG, 'staticcfg', 'ico', 'favicon.ico')}, '/staticcfg': staticcfg } # Make available from both URLs main_page = sabnzbd.interface.MainPage() cherrypy.tree.mount(main_page, '/', config=appconfig) cherrypy.tree.mount(main_page, sabnzbd.cfg.url_base(), config=appconfig) # Set authentication for CherryPy sabnzbd.interface.set_auth(cherrypy.config) logging.info('Starting web-interface on %s:%s', cherryhost, cherryport) sabnzbd.cfg.log_level.callback(guard_loglevel) try: cherrypy.engine.start() except: logging.error(T('Failed to start web-interface: '), exc_info=True) abort_and_show_error(browserhost, cherryport) # Wait for server to become ready cherrypy.engine.wait(cherrypy.process.wspbus.states.STARTED) # Window Service support 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()) if sabnzbd.WIN_SERVICE: mail = MailSlot() if mail.connect(): logging.info('Connected to the SABHelper service') mail.send('api %s' % api_url) else: logging.error(T('Cannot reach the SABHelper service')) mail = None else: # Write URL directly to registry set_connection_info(api_url) if pid_path or pid_file: sabnzbd.pid_file(pid_path, pid_file, cherryport) # Stop here in case of fatal errors if sabnzbd.NO_DOWNLOADING: return # Start all SABnzbd tasks logging.info('Starting %s-%s', sabnzbd.MY_NAME, sabnzbd.__version__) try: sabnzbd.start() except: logging.exception("Failed to start %s-%s", sabnzbd.MY_NAME, sabnzbd.__version__) sabnzbd.halt() # Upload any nzb/zip/rar/nzb.gz/nzb.bz2 files from file association if upload_nzbs: from sabnzbd.utils.upload import add_local for f in upload_nzbs: add_local(f) # Set URL for browser if enable_https: browser_url = "https://%s:%s%s" % (browserhost, cherryport, sabnzbd.cfg.url_base()) else: browser_url = "http://%s:%s%s" % (browserhost, cherryport, sabnzbd.cfg.url_base()) sabnzbd.BROWSER_URL = browser_url if not autorestarted: launch_a_browser(browser_url) if sabnzbd.FOUNDATION: import sabnzbd.osxmenu sabnzbd.osxmenu.notify("SAB_Launched", None) notifier.send_notification('SABnzbd', T('SABnzbd %s started') % sabnzbd.__version__, 'startup') # Now's the time to check for a new version 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: if sabnzbd.LAST_WARNING: msg = sabnzbd.LAST_WARNING sabnzbd.LAST_WARNING = None sabnzbd.notifier.send_notification(T('Warning'), msg, 'warning') if sabnzbd.LAST_ERROR: msg = sabnzbd.LAST_ERROR sabnzbd.LAST_ERROR = None sabnzbd.notifier.send_notification(T('Error'), msg, 'error') if sabnzbd.WIN_SERVICE: rc = win32event.WaitForMultipleObjects((sabnzbd.WIN_SERVICE.hWaitStop, sabnzbd.WIN_SERVICE.overlapped.hEvent), 0, 3000) if rc == win32event.WAIT_OBJECT_0: if mail: mail.send('stop') sabnzbd.save_state() logging.info('Leaving SABnzbd') sabnzbd.SABSTOP = True return else: time.sleep(3) # Check for loglevel changes if LOG_FLAG: LOG_FLAG = False level = LOGLEVELS[sabnzbd.cfg.log_level() + 1] logger.setLevel(level) if console_logging: console.setLevel(level) # 30 sec polling tasks if timer > 9: timer = 0 # Keep OS awake (if needed) sabnzbd.keep_awake() # Restart scheduler (if needed) scheduler.restart() # Save config (if needed) config.save_config() # Check the threads if not sabnzbd.check_all_tasks(): autorestarted = True sabnzbd.TRIGGER_RESTART = True # Notify guardian if sabnzbd.WIN_SERVICE and mail: mail.send('active') else: timer += 1 # 3 sec polling tasks # Check for auto-restart request # Or special restart cases like Mac and WindowsService if sabnzbd.TRIGGER_RESTART: # Shutdown sabnzbd.shutdown_program() if sabnzbd.downloader.Downloader.do.paused: sabnzbd.RESTART_ARGS.append('-p') if autorestarted: sabnzbd.RESTART_ARGS.append('--autorestarted') sys.argv = sabnzbd.RESTART_ARGS os.chdir(org_dir) # If OSX frozen restart of app instead of embedded python if getattr(sys, 'frozen', None) == 'macosx_app': # [[NSProcessInfo processInfo] processIdentifier]] # logging.info("%s" % (NSProcessInfo.processInfo().processIdentifier())) my_pid = os.getpid() my_name = sabnzbd.MY_FULLNAME.replace('/Contents/MacOS/SABnzbd', '') my_args = ' '.join(sys.argv[1:]) cmd = 'kill -9 %s && open "%s" --args %s' % (my_pid, my_name, my_args) logging.info('Launching: ', cmd) os.system(cmd) elif sabnzbd.WIN_SERVICE and mail: logging.info('Asking the SABHelper service for a restart') mail.send('restart') mail.disconnect() return else: cherrypy.engine._do_execv() config.save_config() if sabnzbd.WINTRAY: sabnzbd.WINTRAY.terminate = True if sabnzbd.WIN_SERVICE and mail: mail.send('stop') if sabnzbd.WIN32: del_connection_info() if sabnzbd.FOUNDATION: sabnzbd.osxmenu.notify("SAB_Shutdown", None) logging.info('Leaving SABnzbd') sys.stderr.flush() sys.stdout.flush() sabnzbd.pid_file() if getattr(sys, 'frozen', None) == 'macosx_app': try: AppHelper.stopEventLoop() except: # Failing AppHelper libary! os._exit(0) else: notifier.send_notification('SABnzbd', T('SABnzbd shutdown finished'), 'startup') os._exit(0) ############################################################################## # Windows Service Support ############################################################################## if sabnzbd.WIN32: import servicemanager class SABnzbd(win32serviceutil.ServiceFramework): """ Win32 Service Handler """ _svc_name_ = 'SABnzbd' _svc_display_name_ = 'SABnzbd Binary Newsreader' _svc_deps_ = ["EventLog", "Tcpip", "SABHelper"] _svc_description_ = 'Automated downloading from Usenet. ' \ 'Set to "automatic" to start the service at system startup. ' \ 'You may need to login with a real user account when you need ' \ 'access to network shares.' def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) self.overlapped = pywintypes.OVERLAPPED() self.overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None) sabnzbd.WIN_SERVICE = self def SvcDoRun(self): msg = 'SABnzbd-service %s' % sabnzbd.__version__ self.Logger(servicemanager.PYS_SERVICE_STARTED, msg + ' has started') sys.argv = get_serv_parms(self._svc_name_) main() self.Logger(servicemanager.PYS_SERVICE_STOPPED, msg + ' has stopped') def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) def Logger(self, state, msg): win32evtlogutil.ReportEvent(self._svc_display_name_, state, 0, servicemanager.EVENTLOG_INFORMATION_TYPE, (self._svc_name_, msg)) def ErrLogger(self, msg, text): win32evtlogutil.ReportEvent(self._svc_display_name_, servicemanager.PYS_SERVICE_STOPPED, 0, servicemanager.EVENTLOG_ERROR_TYPE, (self._svc_name_, msg), text) def prep_service_parms(args): """ Prepare parameter list for service """ # Must store our original path, because the Python Service launcher # won't give it to us. serv = [os.path.normpath(os.path.abspath(sys.argv[0]))] # Convert the tuples to list for arg in args: serv.append(arg[0]) if arg[1]: serv.append(arg[1]) # Make sure we run in daemon mode serv.append('-d') return serv SERVICE_MSG = """ You may need to set additional Service parameters. Run services.msc from a command prompt. Don't forget to install the Service SABnzbd-helper.exe too! """ def HandleCommandLine(allow_service=True): """ Handle command line for a Windows Service Prescribed name that will be called by Py2Exe. You MUST set 'cmdline_style':'custom' in the package.py! Returns True when any service commands were detected. """ service, sab_opts, serv_opts, _upload_nzbs = commandline_handler() if service and not allow_service: # The other frozen apps don't support Services print("For service support, use SABnzbd-service.exe") return True elif service: if service in ('install', 'update'): # In this case check for required parameters path = get_f_option(sab_opts) if not path: print(('The -f parameter is required.\n' \ 'Use: -f %s' % service)) return True # First run the service installed, because this will # set the service key in the Registry win32serviceutil.HandleCommandLine(SABnzbd, argv=serv_opts) # Add our own parameter to the Registry sab_opts = prep_service_parms(sab_opts) if set_serv_parms(SABnzbd._svc_name_, sab_opts): print(SERVICE_MSG) else: print('Cannot set required Registry info.') else: # Other service commands need no manipulation win32serviceutil.HandleCommandLine(SABnzbd) return bool(service) ############################################################################## # Platform specific startup code ############################################################################## if __name__ == '__main__': args = [] for txt in sys.argv: if ' ' in txt: txt = '"%s"' % txt args.append(txt) sabnzbd.CMDLINE = ' '.join(args) if sabnzbd.WIN32: if not HandleCommandLine(allow_service=not hasattr(sys, "frozen")): main() elif getattr(sys, 'frozen', None) == 'macosx_app': try: # OSX binary runner from threading import Thread from PyObjCTools import AppHelper from sabnzbd.osxmenu import SABnzbdDelegate class startApp(Thread): def __init__(self): logging.info('[osx] sabApp Starting - starting main thread') Thread.__init__(self) def run(self): main() logging.info('[osx] sabApp Stopping - main thread quit ') AppHelper.stopEventLoop() def stop(self): logging.info('[osx] sabApp Quit - stopping main thread ') sabnzbd.shutdown_program() logging.info('[osx] sabApp Quit - main thread stopped') sabApp = startApp() sabApp.start() AppHelper.runEventLoop() except: main() else: main() sabnzbd-develop/util/0000700000175000017500000000000013642116632012710 5ustar jpjpsabnzbd-develop/util/apireg.py0000600000175000017500000001027713642116632014542 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2012-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ util.apireg - Registration of API connection info """ import winreg def reg_info(user): """ Return the reg key for API """ if user: # Normally use the USER part of the registry section = winreg.HKEY_CURRENT_USER keypath = r"Software\SABnzbd" else: # A Windows Service will use the service key instead section = winreg.HKEY_LOCAL_MACHINE keypath = r"SYSTEM\CurrentControlSet\Services\SABnzbd" return section, keypath def get_connection_info(user=True): """ Return URL of the API running SABnzbd instance 'user' == True will first try user's registry, otherwise system is used """ section, keypath = reg_info(user) url = None try: hive = winreg.ConnectRegistry(None, section) key = winreg.OpenKey(hive, keypath + r"\api") for i in range(0, winreg.QueryInfoKey(key)[1]): name, value, val_type = winreg.EnumValue(key, i) if name == "url": url = value winreg.CloseKey(key) except WindowsError: pass finally: winreg.CloseKey(hive) # Nothing in user's registry, try system registry if user and not url: url = get_connection_info(user=False) return url def set_connection_info(url, user=True): """ Set API info in register """ section, keypath = reg_info(user) try: hive = winreg.ConnectRegistry(None, section) try: winreg.CreateKey(hive, keypath) except OSError: pass key = winreg.OpenKey(hive, keypath) mykey = winreg.CreateKey(key, "api") winreg.SetValueEx(mykey, "url", None, winreg.REG_SZ, url) winreg.CloseKey(mykey) winreg.CloseKey(key) except WindowsError: if user: set_connection_info(url, user=False) finally: winreg.CloseKey(hive) def del_connection_info(user=True): """ Remove API info from register """ section, keypath = reg_info(user) try: hive = winreg.ConnectRegistry(None, section) key = winreg.OpenKey(hive, keypath) winreg.DeleteKey(key, "api") winreg.CloseKey(key) except WindowsError: if user: del_connection_info(user=False) finally: winreg.CloseKey(hive) def get_install_lng(): """ Return language-code used by the installer """ lng = 0 try: hive = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) key = winreg.OpenKey(hive, r"Software\SABnzbd") for i in range(0, winreg.QueryInfoKey(key)[1]): name, value, val_type = winreg.EnumValue(key, i) if name == "Installer Language": lng = value winreg.CloseKey(key) except WindowsError: pass finally: winreg.CloseKey(hive) if lng in LanguageMap: return LanguageMap[lng] return "en" # Map from NSIS-codepage to our language-strings LanguageMap = { "1033": "en", "1036": "fr", "1031": "de", "1043": "nl", "1035": "fi", "1045": "pl", "1053": "sv", "1030": "da", "2068": "nb", "1048": "ro", "1034": "es", "1046": "pr_BR", "3098": "sr", "1037": "he", "1049": "ru", "2052": "zh_CN", } if __name__ == "__main__": print("URL = %s" % get_connection_info()) print("Language = %s" % get_install_lng()) # del_connection_info() # set_connection_info('localhost', '8080', 'blabla', user=False) sabnzbd-develop/util/__init__.py0000600000175000017500000000000013642116632015011 0ustar jpjpsabnzbd-develop/util/mailslot.py0000600000175000017500000001004513642116632015110 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ sabnzbd.mailslot - Mailslot communication """ import sys from time import sleep from win32file import GENERIC_WRITE, FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL from ctypes import c_uint, c_buffer, byref, sizeof, windll # Win32API Shortcuts CreateFile = windll.kernel32.CreateFileW ReadFile = windll.kernel32.ReadFile WriteFile = windll.kernel32.WriteFile CloseHandle = windll.kernel32.CloseHandle CreateMailslot = windll.kernel32.CreateMailslotW class MailSlot: """ Simple Windows Mailslot communication """ slotname = r"mailslot\SABnzbd\ServiceSlot" def __init__(self): self.handle = -1 def create(self, timeout): """ Create the Mailslot, after this only receiving is possible timeout is the read timeout used for receive calls. """ slot = r"\\.\%s" % MailSlot.slotname self.handle = CreateMailslot(slot, 0, timeout, None) return self.handle != -1 def connect(self): """ Connect to existing Mailslot so that writing is possible """ slot = r"\\.\%s" % MailSlot.slotname self.handle = CreateFile(slot, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) return self.handle != -1 def disconnect(self): """ Disconnect from Mailslot """ if self.handle != -1: CloseHandle(self.handle) self.handle = -1 return True def send(self, command): """ Send one message in bytes to Mailslot """ if self.handle == -1: return False w = c_uint() command_bytes = command.encode("utf-8") return bool(WriteFile(self.handle, command_bytes, len(command_bytes), byref(w), 0)) def receive(self): """ Receive one message from Mailslot, convert back to unicode """ r = c_uint() buf = c_buffer(1024) if ReadFile(self.handle, buf, sizeof(buf), byref(r), 0): return buf.value.decode("utf-8") else: return None ############################################################################## # Simple test # # First start "mailslot.py server" in one process, # Then start "mailslot.py client" in another. # Five "restart" and one "stop" will be send from client to server. # The server will stop after receiving "stop" ############################################################################## if __name__ == "__main__": if not __debug__: print("Run this test in non-optimized mode") exit(1) if len(sys.argv) > 1 and "server" in sys.argv[1]: recv = MailSlot() ret = recv.create(2) assert ret, "Failed to create" while True: data = recv.receive() if data is not None: print(data) if data.startswith("stop"): break sleep(1.0) recv.disconnect() elif len(sys.argv) > 1 and "client" in sys.argv[1]: send = MailSlot() ret = send.connect() assert ret, "Failed to connect" for n in range(5): ret = send.send("restart") assert ret, "Failed to send" sleep(1.0) send.send("stop") assert ret, "Failed to send" send.disconnect() else: print("Usage: mailslot.py server|client") sabnzbd-develop/requirements.txt0000600000175000017500000000066313642116632015226 0ustar jpjpsix sabyenc3 cheetah3 cryptography feedparser configobj cherrypy portend chardet notify2 # Optional support for *nix tray icon. # Note that pygobject depends on pycairo, which requires pkg-config and cairo headers. # See https://pycairo.readthedocs.io/en/latest/getting_started.html #pygobject>=3.10.2; sys_platform != 'win32' # Only on Windows pywin32>=227; sys_platform == 'win32' # Only on macOS pyobjc; sys_platform == 'darwin' sabnzbd-develop/INSTALL.txt0000600000175000017500000001320613642116632013606 0ustar jpjp SABnzbd 2.3.8 ------------------------------------------------------------------------------- 0) LICENSE ------------------------------------------------------------------------------- (c) Copyright 2007-2019 by "The SABnzbd-team" This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ------------------------------------------------------------------------------- 1) INSTALL with the Windows installer ------------------------------------------------------------------------------- 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. 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. 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. ------------------------------------------------------------------------------- 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 Python-2.7.latest http://www.python.org (2.7.9+ recommended) Windows PyWin32 use "pip install pypiwin32" 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" More information: https://sabnzbd.org/sabyenc cryptography >= 1.0 use "pip install cryptography" Enables certificate generation and detection of encrypted RAR-files Optional modules Linux notify2 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. Embedded modules (preferably use the included version) CherryPy-8.1.2 with patches http://www.cherrypy.org 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 Within a few seconds your web browser will start and show the user interface. Use the "Help" button in the web-interface to be directed to the Help Wiki. ------------------------------------------------------------------------------- 5) TROUBLESHOOTING ------------------------------------------------------------------------------- Your browser may start up with just an error page. This means that SABnzbd cannot use the default port 8080 to run its web-server on. Try to use another port, you'll need to use the a command window: SABnzbd.exe -s localhost:7777 or python SABnzbd.py -s localhost:7777 You may of course try other port numbers too. For troubleshooting on Windows you can use the program SABnzbd-console.exe. This will show a black window where logging information will be shown. This may help you solve problems easier. ------------------------------------------------------------------------------- 6) MORE INFORMATION ------------------------------------------------------------------------------- Visit our wiki: https://sabnzbd.org/wiki/ ------------------------------------------------------------------------------- 7) CREDITS ------------------------------------------------------------------------------- Several parts of SABnzbd were built by other people, illustrating the wonderful world of Free Open Source Software. See the licenses folder of the main program and of the skin folders. sabnzbd-develop/README.md0000600000175000017500000000730613642116632013222 0ustar jpjpSABnzbd - The automated Usenet download tool ============================================ [![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/sabnzbd/sabnzbd.svg)](https://isitmaintained.com/project/sabnzbd/sabnzbd "Average time to resolve an issue") [![Travis CI](https://travis-ci.org/sabnzbd/sabnzbd.svg?branch=develop)](https://travis-ci.org/sabnzbd/sabnzbd) [![AppVeryor](https://ci.appveyor.com/api/projects/status/github/sabnzbd/sabnzbd?svg=true&branch=develop)](https://ci.appveyor.com/project/Safihre/sabnzbd) [![Snap Status](https://build.snapcraft.io/badge/sabnzbd/sabnzbd.svg)](https://snapcraft.io/sabnzbd) [![License](https://img.shields.io/badge/license-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) SABnzbd is an Open Source Binary Newsreader written in Python. It's totally free, incredibly easy to use, and works practically everywhere. SABnzbd makes Usenet as simple and streamlined as possible by automating everything we can. All you have to do is add an `.nzb`. SABnzbd takes over from there, where it will be automatically downloaded, verified, repaired, extracted and filed away with zero human interaction. If you want to know more you can head over to our website: https://sabnzbd.org. ## Resolving Dependencies SABnzbd has a good deal of dependencies you'll need before you can get running. If you've previously run SABnzbd from one of the various Linux packages, then you likely already have all the needed dependencies. If not, here's what you're looking for: - `python` (only 2.7.x and higher, but not 3.x.x) - `python-cheetah` - `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)) Optional: - `python-cryptography` (enables certificate generation and detection of encrypted RAR-files during download) - `python-dbus` (enable option to Shutdown/Restart/Standby PC on queue finish) - `7zip` Your package manager should supply these. If not, we've got links in our more in-depth [installation guide](https://github.com/sabnzbd/sabnzbd/blob/master/INSTALL.txt). ## Running SABnzbd from source Once you've sorted out all the dependencies, simply run: ``` python -OO SABnzbd.py ``` Or, if you want to run in the background: ``` python -OO SABnzbd.py -d -f /path/to/sabnzbd.ini ``` If you want multi-language support, run: ``` python tools/make_mo.py ``` Our many other command line options are explained in depth [here](https://sabnzbd.org/wiki/advanced/command-line-parameters). ## About Our Repo The workflow we use, is a simplified form of "GitFlow". Basically: - `master` contains only stable releases (which have been merged to `master`) and is intended for end-users. - `develop` is the target for integration and is **not** intended for end-users. - `1.1.x` is a release and maintenance branch for 1.1.x (1.1.0 -> 1.1.1 -> 1.1.2) and is **not** intended for end-users. - `feature/my_feature` is a temporary feature branch based on `develop`. - `bugfix/my_bugfix` is an optional temporary branch for bugfix(es) based on `develop`. Conditions: - Merging of a stable release into `master` will be simple: the release branch is always right. - `master` is not merged back to `develop`. - `develop` is not re-based on `master`. - Release branches branch from `develop` only. - Bugfixes created specifically for a release branch are done there (because they are specific, they're not cherry-picked to `develop`). - Bugfixes done on `develop` may be cherry-picked to a release branch. - We will not release a 1.0.2 if a 1.1.0 has already been released. sabnzbd-develop/linux/0000700000175000017500000000000013642116632013072 5ustar jpjpsabnzbd-develop/linux/sabnzbd@.service0000600000175000017500000000116113642116632016200 0ustar jpjp# copy or _hard_link to # Debian: /lib/systemd/system/sabnzbd@.service # others: /usr/lib/systemd/system/sabnzbd@.service # # To start SABNzbd once for USER use: # systemctl start sabnzbd@USER.service # # To start SABNzbd on boot for USER use: # systemctl enable sabnzbd@USER.service # # Config will be placed in ~USER/.sabnzbd/ [Unit] Description=SABnzbd binary newsreader Documentation=https://sabnzbd.org/wiki/ Wants=network-online.target After=network-online.target [Service] ExecStart=/opt/sabnzbd/SABnzbd.py --logging 1 --browser 0 User=%I Type=simple Restart=on-failure [Install] WantedBy=multi-user.target sabnzbd-develop/tools/0000700000175000017500000000000013642116632013073 5ustar jpjpsabnzbd-develop/tools/make_mo.py0000755000175000017500000002472213642116632015101 0ustar jpjp#!/usr/bin/python3 -OO # -*- coding: utf-8 -*- # Copyright 2010-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ make_mo - Compile PO files to MO files """ import glob import os import re import sys import gettext import subprocess PO_DIR = "po/main" POE_DIR = "po/email" PON_DIR = "po/nsis" MO_DIR = "locale" EMAIL_DIR = "email" MO_LOCALE = "/LC_MESSAGES" DOMAIN = "SABnzbd" DOMAIN_E = "SABemail" DOMAIN_N = "SABnsis" LANG_MARKER = "language.txt" NSIS = "NSIS_Installer.nsi" LanguageTable = { "aa": ("Afar", "Afaraf"), "af": ("Afrikaans", "Afrikaans"), "ak": ("Akan", "Akan"), "sq": ("Albanian", "Shqip"), "an": ("Aragonese", "Aragonés"), "ae": ("Avestan", "Avesta"), "ay": ("Aymara", "Aymararu"), "bm": ("Bambara", "Bamanankan"), "eu": ("Basque", "Euskara"), "bi": ("Bislama", "Bislama"), "bs": ("Bosnian", "Bosanskijezik"), "br": ("Breton", "Brezhoneg"), "ca": ("Catalan", "Català"), "ch": ("Chamorro", "Chamoru"), "kw": ("Cornish", "Kernewek"), "co": ("Corsican", "Corsu"), "hr": ("Croatian", "Hrvatski"), "cs": ("Czech", "Cesky, ceÅ¡tina"), "da": ("Danish", "Dansk"), "nl": ("Dutch", "Nederlands"), "en": ("English", "English"), "eo": ("Esperanto", "Esperanto"), "et": ("Estonian", "Eesti"), "fo": ("Faroese", "Føroyskt"), "fj": ("Fijian", "Vosa Vakaviti"), "fi": ("Finnish", "Suomi"), "fr": ("French", "Français"), "gl": ("Galician", "Galego"), "de": ("German", "Deutsch"), "he": ("Hebrew", "עִבְרִית‎"), "hz": ("Herero", "Otjiherero"), "ho": ("Hiri Motu", "Hiri Motu"), "hu": ("Hungarian", "Magyar"), "id": ("Indonesian", "Bahasa Indonesia"), "ga": ("Irish", "Gaeilge"), "io": ("Ido", "Ido"), "is": ("Icelandic", "Ãslenska"), "it": ("Italian", "Italiano"), "jv": ("Javanese", "BasaJawa"), "rw": ("Kinyarwanda", "Ikinyarwanda"), "kg": ("Kongo", "KiKongo"), "kj": ("Kwanyama", "Kuanyama"), "la": ("Latin", "Lingua latina"), "lb": ("Luxembourgish", "Lëtzebuergesch"), "lg": ("Luganda", "Luganda"), "li": ("Limburgish", "Limburgs"), "ln": ("Lingala", "Lingála"), "lt": ("Lithuanian", "Lietuviukalba"), "lv": ("Latvian", "LatvieÅ¡uvaloda"), "gv": ("Manx", "Gaelg"), "mg": ("Malagasy", "Malagasy fiteny"), "mt": ("Maltese", "Malti"), "nb": ("Norwegian", "Norsk"), # BokmÃ¥l "nn": ("Norwegian", "Norsk"), # Nynorsk "no": ("Norwegian", "Norsk"), "oc": ("Occitan", "Occitan"), "om": ("Oromo", "Afaan Oromoo"), "pl": ("Polish", "Polski"), "pt": ("Portuguese", "Português"), "pt_BR": ("PortugueseBR", "Português, Brasil"), # NSIS uses "PortugueseBR" "rm": ("Romansh", "Rumantsch grischun"), "rn": ("Kirundi", "kiRundi"), "ro": ("Romanian", "Româna"), "sc": ("Sardinian", "Sardu"), "se": ("Northern Sami", "Davvisámegiella"), "sm": ("Samoan", "Gagana fa'a Samoa"), "gd": ("Gaelic", "Gàidhlig"), "ru": ("Russian", "руÑÑкий Ñзык"), "sr": ("Serbian", "ÑрпÑки"), "sn": ("Shona", "Chi Shona"), "sk": ("Slovak", "Slovencina"), "sl": ("Slovene", "SlovenÅ¡cina"), "st": ("Southern Sotho", "Sesotho"), "es": ("Spanish", "Español, castellano"), # NSIS cannot handle "Spanish Castilian" "su": ("Sundanese", "Basa Sunda"), "sw": ("Swahili", "Kiswahili"), "ss": ("Swati", "SiSwati"), "sv": ("Swedish", "Svenska"), "tn": ("Tswana", "Setswana"), "to": ("Tonga (Tonga Islands)", "faka Tonga"), "tr": ("Turkish", "Türkçe"), "ts": ("Tsonga", "Xitsonga"), "tw": ("Twi", "Twi"), "ty": ("Tahitian", "Reo Tahiti"), "wa": ("Walloon", "Walon"), "cy": ("Welsh", "Cymraeg"), "wo": ("Wolof", "Wollof"), "fy": ("Western Frisian", "Frysk"), "xh": ("Xhosa", "isi Xhosa"), "yo": ("Yoruba", "Yorùbá"), "zu": ("Zulu", "isi Zulu"), "zh_CN": ("SimpChinese", "简体中文"), } # Filter for retrieving readable language from PO file RE_LANG = re.compile(r'"Language-Description:\s([^"]+)\\n') def run(cmd): """ Run system command, returns exit-code and stdout """ try: txt = subprocess.check_output(cmd, universal_newlines=True) ret = 0 except subprocess.CalledProcessError as e: txt = e.output ret = e.returncode return ret, txt def process_po_folder(domain, folder, extra=""): """ Process each PO file in folder """ result = True for fname in glob.glob(os.path.join(folder, "*.po")): basename = os.path.split(fname)[1] name = os.path.splitext(basename)[0] mo_path = os.path.normpath("%s/%s%s" % (MO_DIR, name, MO_LOCALE)) mo_name = "%s.mo" % domain if not os.path.exists(mo_path): os.makedirs(mo_path) # Create the MO file mo_file = os.path.join(mo_path, mo_name) print(("Compile %s" % mo_file)) if extra: cmd = TOOL + [extra, "-o", mo_file, fname] else: cmd = TOOL + ["-o", mo_file, fname] ret, output = run(cmd) if ret != 0: print(("\nMissing %s. Please install this package first." % TOOL)) exit(1) if "WARNING:" in output: print(output) result = False return result def remove_mo_files(): """ Remove MO files in locale """ for root, dirs, files in os.walk(MO_DIR, topdown=False): for f in files: if not f.startswith(DOMAIN): os.remove(os.path.join(root, f)) def translate_tmpl(prefix, lng): """ Translate template 'prefix' into language 'lng' """ # Open the original file with open(EMAIL_DIR + "/%s-en.tmpl" % prefix, "r", encoding="utf-8") as src: data = src.read() # Run through translator data = _(data) # Save the translation with open("email/%s-%s.tmpl" % (prefix, lng), "w", encoding="utf-8") as fp: if not -1 < data.find("UTF-8") < 30: fp.write("#encoding UTF-8\n") fp.write(data) def make_templates(): """ Create email templates """ if not os.path.exists("email"): os.makedirs("email") for path in glob.glob(os.path.join(MO_DIR, "*")): lng = os.path.split(path)[1] if lng != "en" and os.path.exists(os.path.join(POE_DIR, lng + ".po")): print(("Create email template for %s" % lng)) trans = gettext.translation(DOMAIN_E, MO_DIR, [lng], fallback=False) trans.install(names=["lgettext"]) translate_tmpl("email", lng) translate_tmpl("rss", lng) translate_tmpl("badfetch", lng) mo_path = os.path.normpath("%s/%s%s/%s.mo" % (MO_DIR, path, MO_LOCALE, DOMAIN_E)) if os.path.exists(mo_path): os.remove(mo_path) def patch_nsis(): """ Patch translation into the NSIS script """ RE_NSIS = re.compile(r'^(\s*LangString\s+)(\w+)(\s+\$\{LANG_)(\w+)\}\s+(".*)', re.I) languages = [os.path.split(path)[1] for path in glob.glob(os.path.join(MO_DIR, "*"))] with open(NSIS, "r") as src: new = [] for line in src: m = RE_NSIS.search(line) if m: leader = m.group(1) item = m.group(2) rest = m.group(3) langname = m.group(4).upper() text = m.group(5).strip('"\n') if langname == "ENGLISH": # Write back old content new.append(line) # Replace silly $\ construction with just a \ text = text.replace('$\\"', '"').replace("$\\", "\\") for lcode in languages: lng = LanguageTable.get(lcode) if lng and lcode != "en": lng = lng[0].upper() if item == "MsgLangCode": # The language code will be stored in the registry text_trans = lcode else: trans = gettext.translation(DOMAIN_N, MO_DIR, [lcode], fallback=False) trans.install(names=["lgettext"]) text_trans = _(text) text_trans = text_trans.replace("\r", "").replace("\n", "\\r\\n") text_trans = text_trans.replace("\\", "$\\").replace('"', '$\\"') line = '%s%s%s%s} "%s"\n' % (leader, item, rest, lng, text_trans) new.append(line) elif lng is None: print("Warning: unsupported language %s (%s)! Add it to the table." % (langname, lcode)) else: new.append(line) # Force writing of unicode to process Chinese and Hebrew with open(NSIS + ".tmp", "w", encoding="utf-8") as dst: for line in new: dst.write(line) # ---------------------------------------------------------------------------- # Determine location of MsgFmt tool path, py = os.path.split(sys.argv[0]) tl = os.path.abspath(os.path.normpath(os.path.join(path, "msgfmt.py"))) if os.path.exists(tl): if os.name == "nt": TOOL = [sys.executable, tl] else: TOOL = [tl] result = True if len(sys.argv) > 1 and sys.argv[1] == "all": print("NSIS MO file") result = result and process_po_folder(DOMAIN_N, PON_DIR) print("Patch NSIS script") patch_nsis() print("Email MO files") result = result and process_po_folder(DOMAIN_E, POE_DIR) print("Create email templates from MO files") make_templates() print("Main program MO files") # -n option added to remove all newlines from the translations result = result and process_po_folder(DOMAIN, PO_DIR, "-n") print("Remove temporary templates") remove_mo_files() print() if result: exit(0) else: print("WARNINGS present!") exit(1) sabnzbd-develop/tools/pygettext.py0000600000175000017500000005200213642116632015503 0ustar jpjp#! /usr/bin/env python3 # -*- coding: iso-8859-1 -*- # Originally written by Barry Warsaw # # Minimally patched to make it even more xgettext compatible # by Peter Funk # # 2002-11-22 Jürgen Hermann # Added checks that _() only contains string literals, and # command line args are resolved to module lists, i.e. you # can now pass a filename, a module or package name, or a # directory (including globbing chars, important for Win32). # Made docstring fit in 80 chars wide displays using pydoc. # # for selftesting try: import fintl _ = fintl.gettext except ImportError: _ = lambda s: s __doc__ = _( """pygettext -- Python equivalent of xgettext(1) Many systems (Solaris, Linux, Gnu) provide extensive tools that ease the internationalization of C programs. Most of these tools are independent of the programming language and can be used from within Python programs. Martin von Loewis' work[1] helps considerably in this regard. There's one problem though; xgettext is the program that scans source code looking for message strings, but it groks only C (or C++). Python introduces a few wrinkles, such as dual quoting characters, triple quoted strings, and raw strings. xgettext understands none of this. Enter pygettext, which uses Python's standard tokenize module to scan Python source code, generating .pot files identical to what GNU xgettext[2] generates for C and C++ code. From there, the standard GNU tools can be used. A word about marking Python strings as candidates for translation. GNU xgettext recognizes the following keywords: gettext, dgettext, dcgettext, and gettext_noop. But those can be a lot of text to include all over your code. C and C++ have a trick: they use the C preprocessor. Most internationalized C source includes a #define for gettext() to _() so that what has to be written in the source is much less. Thus these are both translatable strings: gettext("Translatable String") _("Translatable String") Python of course has no preprocessor so this doesn't work so well. Thus, pygettext searches only for _() by default, but see the -k/--keyword flag below for how to augment this. [1] http://www.python.org/workshops/1997-10/proceedings/loewis.html [2] http://www.gnu.org/software/gettext/gettext.html NOTE: pygettext attempts to be option and feature compatible with GNU xgettext where ever possible. However some options are still missing or are not fully implemented. Also, xgettext's use of command line switches with option arguments is broken, and in these cases, pygettext just defines additional switches. Usage: pygettext [options] inputfile ... Options: -a --extract-all Extract all strings. -d name --default-domain=name Rename the default output file from messages.pot to name.pot. -E --escape Replace non-ASCII characters with octal escape sequences. -D --docstrings Extract module, class, method, and function docstrings. These do not need to be wrapped in _() markers, and in fact cannot be for Python to consider them docstrings. (See also the -X option). -h --help Print this help message and exit. -k word --keyword=word Keywords to look for in addition to the default set, which are: %(DEFAULTKEYWORDS)s You can have multiple -k flags on the command line. -K --no-default-keywords Disable the default set of keywords (see above). Any keywords explicitly added with the -k/--keyword option are still recognized. --no-location Do not write filename/lineno location comments. -n --add-location Write filename/lineno location comments indicating where each extracted string is found in the source. These lines appear before each msgid. The style of comments is controlled by the -S/--style option. This is the default. -o filename --output=filename Rename the default output file from messages.pot to filename. If filename is `-' then the output is sent to standard out. -p dir --output-dir=dir Output files will be placed in directory dir. -S stylename --style stylename Specify which style to use for location comments. Two styles are supported: Solaris # File: filename, line: line-number GNU #: filename:line The style name is case insensitive. GNU style is the default. -v --verbose Print the names of the files being processed. -V --version Print the version of pygettext and exit. -w columns --width=columns Set width of output to columns. -x filename --exclude-file=filename Specify a file that contains a list of strings that are not be extracted from the input files. Each string to be excluded must appear on a line by itself in the file. -X filename --no-docstrings=filename Specify a file that contains a list of files (one per line) that should not have their docstrings extracted. This is only useful in conjunction with the -D option above. If `inputfile' is -, standard input is read. """ ) import os import importlib.machinery import importlib.util import sys import glob import time import getopt import token import tokenize __version__ = "1.5" default_keywords = ["_"] DEFAULTKEYWORDS = ", ".join(default_keywords) EMPTYSTRING = "" # The normal pot-file header. msgmerge and Emacs's po-mode work better if it's # there. pot_header = _( """\ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\\n" "POT-Creation-Date: %(time)s\\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n" "Last-Translator: FULL NAME \\n" "Language-Team: LANGUAGE \\n" "MIME-Version: 1.0\\n" "Content-Type: text/plain; charset=%(charset)s\\n" "Content-Transfer-Encoding: %(encoding)s\\n" "Generated-By: pygettext.py %(version)s\\n" """ ) def usage(code, msg=""): print(__doc__ % globals(), file=sys.stderr) if msg: print(msg, file=sys.stderr) sys.exit(code) def make_escapes(pass_nonascii): global escapes, escape if pass_nonascii: # Allow non-ascii characters to pass through so that e.g. 'msgid # "Höhe"' would result not result in 'msgid "H\366he"'. Otherwise we # escape any character outside the 32..126 range. mod = 128 escape = escape_ascii else: mod = 256 escape = escape_nonascii escapes = [r"\%03o" % i for i in range(mod)] for i in range(32, 127): escapes[i] = chr(i) escapes[ord("\\")] = r"\\" escapes[ord("\t")] = r"\t" escapes[ord("\r")] = r"\r" escapes[ord("\n")] = r"\n" escapes[ord('"')] = r"\"" def escape_ascii(s, encoding): return "".join(escapes[ord(c)] if ord(c) < 128 else c for c in s) def escape_nonascii(s, encoding): return "".join(escapes[b] for b in s.encode(encoding)) def is_literal_string(s): return s[0] in "'\"" or (s[0] in "rRuU" and s[1] in "'\"") def safe_eval(s): # unwrap quotes, safely return eval(s, {"__builtins__": {}}, {}) def normalize(s, encoding): # This converts the various Python string types into a format that is # appropriate for .po files, namely much closer to C style. lines = s.split("\n") if len(lines) == 1: s = '"' + escape(s, encoding) + '"' else: if not lines[-1]: del lines[-1] lines[-1] = lines[-1] + "\n" for i in range(len(lines)): lines[i] = escape(lines[i], encoding) lineterm = '\\n"\n"' s = '""\n"' + lineterm.join(lines) + '"' return s def containsAny(str, set): """Check whether 'str' contains ANY of the chars in 'set'""" return 1 in [c in str for c in set] def getFilesForName(name): """Get a list of module files for a filename, a module or package name, or a directory. """ if not os.path.exists(name): # check for glob chars if containsAny(name, "*?[]"): files = glob.glob(name) list = [] for file in files: list.extend(getFilesForName(file)) return list # try to find module or package try: spec = importlib.util.find_spec(name) name = spec.origin except ImportError: name = None if not name: return [] if os.path.isdir(name): # find all python files in directory list = [] # get extension for python source files _py_ext = importlib.machinery.SOURCE_SUFFIXES[0] for root, dirs, files in os.walk(name): # don't recurse into CVS directories if "CVS" in dirs: dirs.remove("CVS") # add all *.py files to list list.extend([os.path.join(root, file) for file in files if os.path.splitext(file)[1] == _py_ext]) return list elif os.path.exists(name): # a single file return [name] return [] class TokenEater: def __init__(self, options): self.__options = options self.__messages = {} self.__state = self.__waiting self.__data = [] self.__lineno = -1 self.__freshmodule = 1 self.__curfile = None self.__enclosurecount = 0 def __call__(self, ttype, tstring, stup, etup, line): # dispatch ## import token ## print('ttype:', token.tok_name[ttype], 'tstring:', tstring, ## file=sys.stderr) self.__state(ttype, tstring, stup[0]) def __waiting(self, ttype, tstring, lineno): opts = self.__options # Do docstring extractions, if enabled if opts.docstrings and not opts.nodocstrings.get(self.__curfile): # module docstring? if self.__freshmodule: if ttype == tokenize.STRING and is_literal_string(tstring): self.__addentry(safe_eval(tstring), lineno, isdocstring=1) self.__freshmodule = 0 elif ttype not in (tokenize.COMMENT, tokenize.NL): self.__freshmodule = 0 return # class or func/method docstring? if ttype == tokenize.NAME and tstring in ("class", "def"): self.__state = self.__suiteseen return if ttype == tokenize.NAME and tstring in opts.keywords: self.__state = self.__keywordseen def __suiteseen(self, ttype, tstring, lineno): # skip over any enclosure pairs until we see the colon if ttype == tokenize.OP: if tstring == ":" and self.__enclosurecount == 0: # we see a colon and we're not in an enclosure: end of def self.__state = self.__suitedocstring elif tstring in "([{": self.__enclosurecount += 1 elif tstring in ")]}": self.__enclosurecount -= 1 def __suitedocstring(self, ttype, tstring, lineno): # ignore any intervening noise if ttype == tokenize.STRING and is_literal_string(tstring): self.__addentry(safe_eval(tstring), lineno, isdocstring=1) self.__state = self.__waiting elif ttype not in (tokenize.NEWLINE, tokenize.INDENT, tokenize.COMMENT): # there was no class docstring self.__state = self.__waiting def __keywordseen(self, ttype, tstring, lineno): if ttype == tokenize.OP and tstring == "(": self.__data = [] self.__lineno = lineno self.__state = self.__openseen else: self.__state = self.__waiting def __openseen(self, ttype, tstring, lineno): if ttype == tokenize.OP and tstring == ")": # We've seen the last of the translatable strings. Record the # line number of the first line of the strings and update the list # of messages seen. Reset state for the next batch. If there # were no strings inside _(), then just ignore this entry. if self.__data: self.__addentry(EMPTYSTRING.join(self.__data)) self.__state = self.__waiting elif ttype == tokenize.STRING and is_literal_string(tstring): self.__data.append(safe_eval(tstring)) elif ttype not in [tokenize.COMMENT, token.INDENT, token.DEDENT, token.NEWLINE, tokenize.NL]: # warn if we see anything else than STRING or whitespace print( _('*** %(file)s:%(lineno)s: Seen unexpected token "%(token)s"') % {"token": tstring, "file": self.__curfile, "lineno": self.__lineno}, file=sys.stderr, ) self.__state = self.__waiting def __addentry(self, msg, lineno=None, isdocstring=0): if lineno is None: lineno = self.__lineno if not msg in self.__options.toexclude: entry = (self.__curfile, lineno) self.__messages.setdefault(msg, {})[entry] = isdocstring def set_filename(self, filename): self.__curfile = filename self.__freshmodule = 1 def write(self, fp): options = self.__options timestamp = time.strftime("%Y-%m-%d %H:%M%z") encoding = fp.encoding if fp.encoding else "UTF-8" print( pot_header % {"time": timestamp, "version": __version__, "charset": encoding, "encoding": "8bit"}, file=fp ) # Sort the entries. First sort each particular entry's keys, then # sort all the entries by their first item. reverse = {} for k, v in self.__messages.items(): keys = sorted(v.keys()) reverse.setdefault(tuple(keys), []).append((k, v)) rkeys = sorted(reverse.keys()) for rkey in rkeys: rentries = reverse[rkey] rentries.sort() for k, v in rentries: # If the entry was gleaned out of a docstring, then add a # comment stating so. This is to aid translators who may wish # to skip translating some unimportant docstrings. isdocstring = any(v.values()) # k is the message string, v is a dictionary-set of (filename, # lineno) tuples. We want to sort the entries in v first by # file name and then by line number. v = sorted(v.keys()) if not options.writelocations: pass # location comments are different b/w Solaris and GNU: elif options.locationstyle == options.SOLARIS: for filename, lineno in v: d = {"filename": filename, "lineno": lineno} print(_("# File: %(filename)s, line: %(lineno)d") % d, file=fp) elif options.locationstyle == options.GNU: # fit as many locations on one line, as long as the # resulting line length doesn't exceed 'options.width' locline = "#:" for filename, lineno in v: d = {"filename": filename, "lineno": lineno} s = _(" %(filename)s:%(lineno)d") % d if len(locline) + len(s) <= options.width: locline = locline + s else: print(locline, file=fp) locline = "#:" + s if len(locline) > 2: print(locline, file=fp) if isdocstring: print("#, docstring", file=fp) print("msgid", normalize(k, encoding), file=fp) print('msgstr ""\n', file=fp) def main(): global default_keywords try: opts, args = getopt.getopt( sys.argv[1:], "ad:DEhk:Kno:p:S:Vvw:x:X:", [ "extract-all", "default-domain=", "escape", "help", "keyword=", "no-default-keywords", "add-location", "no-location", "output=", "output-dir=", "style=", "verbose", "version", "width=", "exclude-file=", "docstrings", "no-docstrings", ], ) except getopt.error as msg: usage(1, msg) # for holding option values class Options: # constants GNU = 1 SOLARIS = 2 # defaults extractall = 0 # FIXME: currently this option has no effect at all. escape = 0 keywords = [] outpath = "" outfile = "messages.pot" writelocations = 1 locationstyle = GNU verbose = 0 width = 78 excludefilename = "" docstrings = 0 nodocstrings = {} options = Options() locations = {"gnu": options.GNU, "solaris": options.SOLARIS} # parse options for opt, arg in opts: if opt in ("-h", "--help"): usage(0) elif opt in ("-a", "--extract-all"): options.extractall = 1 elif opt in ("-d", "--default-domain"): options.outfile = arg + ".pot" elif opt in ("-E", "--escape"): options.escape = 1 elif opt in ("-D", "--docstrings"): options.docstrings = 1 elif opt in ("-k", "--keyword"): options.keywords.append(arg) elif opt in ("-K", "--no-default-keywords"): default_keywords = [] elif opt in ("-n", "--add-location"): options.writelocations = 1 elif opt in ("--no-location",): options.writelocations = 0 elif opt in ("-S", "--style"): options.locationstyle = locations.get(arg.lower()) if options.locationstyle is None: usage(1, _("Invalid value for --style: %s") % arg) elif opt in ("-o", "--output"): options.outfile = arg elif opt in ("-p", "--output-dir"): options.outpath = arg elif opt in ("-v", "--verbose"): options.verbose = 1 elif opt in ("-V", "--version"): print(_("pygettext.py (xgettext for Python) %s") % __version__) sys.exit(0) elif opt in ("-w", "--width"): try: options.width = int(arg) except ValueError: usage(1, _("--width argument must be an integer: %s") % arg) elif opt in ("-x", "--exclude-file"): options.excludefilename = arg elif opt in ("-X", "--no-docstrings"): fp = open(arg) try: while 1: line = fp.readline() if not line: break options.nodocstrings[line[:-1]] = 1 finally: fp.close() # calculate escapes make_escapes(not options.escape) # calculate all keywords options.keywords.extend(default_keywords) # initialize list of strings to exclude if options.excludefilename: try: fp = open(options.excludefilename) options.toexclude = fp.readlines() fp.close() except IOError: print(_("Can't read --exclude-file: %s") % options.excludefilename, file=sys.stderr) sys.exit(1) else: options.toexclude = [] # resolve args to module lists expanded = [] for arg in args: if arg == "-": expanded.append(arg) else: expanded.extend(getFilesForName(arg)) args = expanded # slurp through all the files eater = TokenEater(options) for filename in args: if filename == "-": if options.verbose: print(_("Reading standard input")) fp = sys.stdin.buffer closep = 0 else: if options.verbose: print(_("Working on %s") % filename) fp = open(filename, "rb") closep = 1 try: eater.set_filename(filename) try: tokens = tokenize.tokenize(fp.readline) for _token in tokens: eater(*_token) except tokenize.TokenError as e: print("%s: %s, line %d, column %d" % (e.args[0], filename, e.args[1][0], e.args[1][1]), file=sys.stderr) finally: if closep: fp.close() # write the output if options.outfile == "-": fp = sys.stdout closep = 0 else: if options.outpath: options.outfile = os.path.join(options.outpath, options.outfile) fp = open(options.outfile, "w") closep = 1 try: eater.write(fp) finally: if closep: fp.close() if __name__ == "__main__": main() # some more test strings # this one creates a warning _('*** Seen unexpected token "%(token)s"') % {"token": "test"} _("more" "than" "one" "string") sabnzbd-develop/tools/extract_pot.py0000755000175000017500000001400313642116632016014 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2011-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ extract_pot - Extract translatable strings from all PY files """ import os import sys import re # Import version.py without the sabnzbd overhead with open("sabnzbd/version.py") as version_file: exec(version_file.read()) # Fixed information for the POT header HEADER = ( r"""# # SABnzbd Translation Template file __TYPE__ # Copyright 2011-2019 The SABnzbd-Team # team@sabnzbd.org # msgid "" msgstr "" "Project-Id-Version: SABnzbd-%s\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: shypike@sabnzbd.org\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 7bit\n" """ % __version__ ) PO_DIR = "po/main" POE_DIR = "po/email" PON_DIR = "po/nsis" EMAIL_DIR = "email" DOMAIN = "SABnzbd" DOMAIN_EMAIL = "SABemail" DOMAIN_NSIS = "SABnsis" PARMS = "-d %s -p %s -w500 -k T -k TT -o %s.pot.tmp" % (DOMAIN, PO_DIR, DOMAIN) FILES = "SABnzbd.py SABHelper.py SABnzbdDelegate.py sabnzbd/*.py sabnzbd/utils/*.py" FILE_CACHE = {} RE_LINE = re.compile(r"\s*([^: \t]+)\s*:\s*(\d+)") RE_CONTEXT = re.compile(r"#:\s*(.*)$") def get_a_line(line_src, number): """ Retrieve line 'number' from file 'src' with caching """ global FILE_CACHE if line_src not in FILE_CACHE: FILE_CACHE[line_src] = [] for file_line in open(line_src, "r"): FILE_CACHE[line_src].append(file_line) try: return FILE_CACHE[line_src][number - 1] except: return "" def get_context(ctx_line): """ Read context info from source file and append to line. input: "#: filepath.py:123 filepath2.py:456" output: "#: filepath.py:123 # [context info] # filepath2.py:456 # [context info 2]" """ if not ctx_line.startswith("#:"): return ctx_line newlines = [] for item in ctx_line[2:].strip("\r\n").split(): m = RE_LINE.search(item) if m: line_src = m.group(1) number = m.group(2) else: newlines.append(item) continue srcline = get_a_line(line_src, int(number)).strip("\r\n") context = "" m = RE_CONTEXT.search(srcline) if m: context = m.group(1) else: if "logging.error(" in srcline: context = "Error message" elif "logging.warning(" in srcline: context = "Warning message" # Remove line-number item = item.split(":")[0] if context: # Format context item = "%s [%s]" % (item, context) # Only add new texts if item not in newlines: newlines.append(item) return "#: " + " # ".join(newlines) + "\n" def add_tmpl_to_pot(prefix, dst_file): """ Append english template to open POT file 'dst' """ with open(EMAIL_DIR + "/%s-en.tmpl" % prefix, "r") as tmpl_src: dst_file.write("#: email/%s.tmpl:1\n" % prefix) dst_file.write('msgid ""\n') for tmpl_line in tmpl_src: dst_file.write('"%s"\n' % tmpl_line.replace("\n", "\\n").replace('"', '\\"')) dst_file.write('msgstr ""\n\n') print("Creating POT file") if not os.path.exists(PO_DIR): os.makedirs(PO_DIR) # Determine location of PyGetText tool path, py = os.path.split(sys.argv[0]) PYGETTEXT = os.path.abspath(os.path.normpath(os.path.join(path, "pygettext.py"))) cmd = "%s %s %s %s" % (sys.executable, PYGETTEXT, PARMS, FILES) os.system(cmd) print("Finished creating POT file") print("Post-process POT file") src = open("%s/%s.pot.tmp" % (PO_DIR, DOMAIN), "r") dst = open("%s/%s.pot" % (PO_DIR, DOMAIN), "w") dst.write(HEADER.replace("__TYPE__", "MAIN")) header = True for line in src: if line.startswith("#:"): line = line.replace("\\", "/") if header: dst.write("\n\n") header = False if header: if not ('"POT-Creation-Date:' in line or '"Generated-By:' in line): continue elif line.startswith("#:"): line = get_context(line) dst.write(line) src.close() dst.close() os.remove("%s/%s.pot.tmp" % (PO_DIR, DOMAIN)) print("Finished post-process POT file") print("Creating email POT file") if not os.path.exists(POE_DIR): os.makedirs(POE_DIR) with open(os.path.join(POE_DIR, DOMAIN_EMAIL + ".pot"), "w") as dst_email: dst_email.write(HEADER.replace("__TYPE__", "EMAIL")) add_tmpl_to_pot("email", dst_email) add_tmpl_to_pot("rss", dst_email) add_tmpl_to_pot("badfetch", dst_email) print("Finished creating email POT file") # Create the NSIS POT file NSIS = "NSIS_Installer.nsi" RE_NSIS = re.compile(r'LangString\s+\w+\s+\$\{LANG_ENGLISH\}\s+(".*)', re.I) if os.path.exists(NSIS): print("Creating NSIS POT file") if not os.path.exists(PON_DIR): os.makedirs(PON_DIR) src = open(NSIS, "r") dst = open(os.path.join(PON_DIR, DOMAIN_NSIS + ".pot"), "w") dst.write(HEADER.replace("__TYPE__", "NSIS")) dst.write("\n") for line in src: m = RE_NSIS.search(line) if m and "MsgLangCode" not in line: dst.write("#: %s\n" % NSIS) text = m.group(1).replace('$\\"', '\\"').replace("$\\", "\\\\") dst.write("msgid %s\n" % text) dst.write('msgstr ""\n\n') dst.close() src.close() print("Finished creating NSIS POT file") sabnzbd-develop/tools/msgfmt.py0000755000175000017500000001645113642116632014766 0ustar jpjp#! /usr/bin/env python3 # Written by Martin v. Löwis """Generate binary message catalog from textual translation description. This program converts a textual Uniforum-style message catalog (.po file) into a binary GNU catalog (.mo file). This is essentially the same function as the GNU msgfmt program, however, it is a simpler implementation. Usage: msgfmt.py [OPTIONS] filename.po Options: -o file --output-file=file Specify the output file to write to. If omitted, output will go to a file named filename.mo (based off the input file name). -n Remove all newlines (\\r\\n) from translations -h --help Print this message and exit. -V --version Display version information and exit. """ import os import sys import ast import getopt import struct import array import re from email.parser import HeaderParser __version__ = "1.1" MESSAGES = {} nonewlines = False # Detector for HTML elements RE_HTML = re.compile(b"<[^>]+>") def usage(code, msg=""): print(__doc__, file=sys.stderr) if msg: print(msg, file=sys.stderr) sys.exit(code) def add(id, str, fuzzy): """ Add a non-fuzzy translation to the dictionary. """ global MESSAGES, nonewlines, RE_HTML if not fuzzy and str: if id.count(b"%s") == str.count(b"%s"): if nonewlines and id and (b"\r" in str or b"\n" in str) and RE_HTML.search(str): MESSAGES[id] = str.replace(b"\n", b"").replace(b"\r", b"") else: MESSAGES[id] = str else: print("WARNING: %s mismatch, skipping!") print(" %s" % id) print(" %s" % str) def generate(): "Return the generated output." global MESSAGES # the keys are sorted in the .mo file keys = sorted(MESSAGES.keys()) offsets = [] ids = strs = b"" for id in keys: # For each string, we need size and file offset. Each string is NUL # terminated; the NUL does not count into the size. offsets.append((len(ids), len(id), len(strs), len(MESSAGES[id]))) ids += id + b"\0" strs += MESSAGES[id] + b"\0" output = "" # The header is 7 32-bit unsigned integers. We don't use hash tables, so # the keys start right after the index tables. # translated string. keystart = 7 * 4 + 16 * len(keys) # and the values start after the keys valuestart = keystart + len(ids) koffsets = [] voffsets = [] # The string table first has the list of keys, then the list of values. # Each entry has first the size of the string, then the file offset. for o1, l1, o2, l2 in offsets: koffsets += [l1, o1 + keystart] voffsets += [l2, o2 + valuestart] offsets = koffsets + voffsets output = struct.pack( "Iiiiiii", 0x950412DE, # Magic 0, # Version len(keys), # # of entries 7 * 4, # start of key index 7 * 4 + len(keys) * 8, # start of value index 0, 0, ) # size and offset of hash table output += array.array("i", offsets).tobytes() output += ids output += strs return output def make(filename, outfile): ID = 1 STR = 2 # Compute .mo name from .po name and arguments if filename.endswith(".po"): infile = filename else: infile = filename + ".po" if outfile is None: outfile = os.path.splitext(infile)[0] + ".mo" try: with open(infile, "rb") as f: lines = f.readlines() except IOError as msg: print(msg, file=sys.stderr) sys.exit(1) section = None fuzzy = 0 # Start off assuming Latin-1, so everything decodes without failure, # until we know the exact encoding encoding = "latin-1" # Parse the catalog lno = 0 for l in lines: l = l.decode(encoding) lno += 1 # If we get a comment line after a msgstr, this is a new entry if l[0] == "#" and section == STR: add(msgid, msgstr, fuzzy) section = None fuzzy = 0 # Record a fuzzy mark if l[:2] == "#," and "fuzzy" in l: fuzzy = 1 # Skip comments if l[0] == "#": continue # Now we are in a msgid section, output previous section if l.startswith("msgid") and not l.startswith("msgid_plural"): if section == STR: add(msgid, msgstr, fuzzy) if not msgid: # See whether there is an encoding declaration p = HeaderParser() charset = p.parsestr(msgstr.decode(encoding)).get_content_charset() if charset: encoding = charset section = ID l = l[5:] msgid = msgstr = b"" is_plural = False # This is a message with plural forms elif l.startswith("msgid_plural"): if section != ID: print("msgid_plural not preceded by msgid on %s:%d" % (infile, lno), file=sys.stderr) sys.exit(1) l = l[12:] msgid += b"\0" # separator of singular and plural is_plural = True # Now we are in a msgstr section elif l.startswith("msgstr"): section = STR if l.startswith("msgstr["): if not is_plural: print("plural without msgid_plural on %s:%d" % (infile, lno), file=sys.stderr) sys.exit(1) l = l.split("]", 1)[1] if msgstr: msgstr += b"\0" # Separator of the various plural forms else: if is_plural: print("indexed msgstr required for plural on %s:%d" % (infile, lno), file=sys.stderr) sys.exit(1) l = l[6:] # Skip empty lines l = l.strip() if not l: continue l = ast.literal_eval(l) if section == ID: msgid += l.encode(encoding) elif section == STR: msgstr += l.encode(encoding) else: print("Syntax error on %s:%d" % (infile, lno), "before:", file=sys.stderr) print(l, file=sys.stderr) sys.exit(1) # Add last entry if section == STR: add(msgid, msgstr, fuzzy) # Compute output output = generate() try: with open(outfile, "wb") as f: f.write(output) except IOError as msg: print(msg, file=sys.stderr) def main(): global nonewlines try: opts, args = getopt.getopt(sys.argv[1:], "nhVo:", ["help", "version", "output-file="]) except getopt.error as msg: usage(1, msg) outfile = None # parse options for opt, arg in opts: if opt in ("-h", "--help"): usage(0) elif opt in ("-V", "--version"): print("msgfmt.py", __version__) sys.exit(0) elif opt in ("-o", "--output-file"): outfile = arg elif opt in ("-n",): nonewlines = True # do it if not args: print("No input file given", file=sys.stderr) print("Try `msgfmt --help' for more information.", file=sys.stderr) return for filename in args: make(filename, outfile) if __name__ == "__main__": main() sabnzbd-develop/icons/0000700000175000017500000000000013642116632013046 5ustar jpjpsabnzbd-develop/icons/sabnzbd16_32.ico0000600000175000017500000001246613642116632015653 0ustar jpjp h&  ¨Ž(  @ÿÿÿi–ÿi–ÿÿÿi–ÿÁÿÿÀÿÿi–ÿÿÿi–ÿ³ÿÿ$Èÿÿ$Çÿÿ³ÿÿi–ÿÿÿi–ÿ³ÿÿ ¸ÿÿ(Êÿÿ(Êÿÿ ¸ÿÿ³ÿÿi–ÿÿÿi–ÿ³ÿÿ³ÿÿÀÿÿ(Êÿÿ(ÊÿÿÀÿÿ³ÿÿ³ÿÿi–ÿÿÿi–ÿ³ÿÿ³ÿÿ³ÿÿ$Çÿÿ(Êÿÿ(Êÿÿ#Çÿÿ³ÿÿ³ÿÿ³ÿÿi–ÿÿÿaŠÿ³ÿÿ³ÿÿ³ÿÿ ¸ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ·ÿÿ³ÿÿ³ÿÿ³ÿÿi–ÿÿÿC_ôC_ø³ÿÿ³ÿÿ¿ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¿ÿÿ³ÿÿ³ÿÿC_øC_ôÿÿ³ÿÿ³ÿÿ#Çÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ"Æÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ·ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ·ÿÿ³ÿÿÿÿ³ÿÿ¿ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¾ÿÿ³ÿÿÿÿ³ÿÿ"Æÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ!Æÿÿ³ÿÿÿÿ³ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ³ÿÿÿÿ³ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþü?øðàÀ€ÀÀÀÀÀÀÀ( @ €ZZZÿÿZZÿ³ÿÿ³ÿÿÿZ Zÿ³ÿÿÄÿÿÃÿÿ³ÿÿÿZZÿ³ÿÿ´ÿÿ'Éÿÿ&Éÿÿ´ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ»ÿÿ(Êÿÿ(Êÿÿ»ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿÃÿÿ(Êÿÿ(ÊÿÿÂÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ´ÿÿ&Éÿÿ(Êÿÿ(Êÿÿ&Éÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ»ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ ºÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÂÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(ÊÿÿÁÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ´ÿÿ&Éÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ%Èÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ ºÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ ¹ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZZÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÂÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(ÊÿÿÁÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿZPÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ%Èÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ$Èÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿJFÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ ¹ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ ¹ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿ@<ÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÁÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(ÊÿÿÀÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿ6ÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ%Èÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ$Çÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿÿÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ ¹ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ ¸ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿÿÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÀÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¿ÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿ$Çÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ#Çÿÿ³ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ ¸ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ·ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ³ÿÿÀÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¿ÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ³ÿÿ#Çÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ"Æÿÿ³ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ¸ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ·ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ¿ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¾ÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ³ÿÿ"Æÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ!Æÿÿ³ÿÿ³ÿÿÿÿ³ÿÿ·ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¶ÿÿ³ÿÿÿÿ³ÿÿ¾ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ¾ÿÿ³ÿÿÿÿ³ÿÿ!Æÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ Åÿÿ³ÿÿÿÿ³ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ'Éÿÿ³ÿÿÿÿ³ÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ(Êÿÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþü?øðààÀ€øøøøøøøøøøøøøøsabnzbd-develop/icons/nzb.ico0000600000175000017500000006161313642116632014344 0ustar jpjp hV ˆ ¾  ¨F00 ¨%î õ–D(  @ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿÿÿ÷÷÷ÿÿ÷÷÷ÿÿÿ÷÷÷ÿÿÿÿùùùÿÿ÷÷÷ÿÿÿ÷÷÷ÿÿøøøÿÿÿÿ÷÷÷ÿÿÿ÷÷÷ÿÿ÷÷÷ÿÿÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿÿÿÿÿÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿÿùùùÿ÷÷÷ÿíííÿÿÿÿÿÿÿÿÿÿÿÿûúúÿÿÿÿÿ#aCÿB³|ÿB³|ÿB³|ÿJ¸ƒÿeÌœÿeÌœÿeÌœÿeÌœÿÿûúúÿÿB³|ÿ"^AüÿÿA-òA-øB³|ÿB³|ÿUÀÿeÌœÿeÌœÿeÌœÿeÌœÿÿÿÿA-øA-òÿÿB³|ÿB³|ÿ`ȘÿeÌœÿeÌœÿeÌœÿeÌœÿ`È—ÿB³|ÿB³|ÿÿÿB³|ÿI¸‚ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿH·ÿB³|ÿÿÿB³|ÿTÀŒÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿS¿ŒÿB³|ÿÿÿB³|ÿ_È—ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ_Ç–ÿB³|ÿÿÿB³|ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿdË›ÿB³|ÿÿÿB³|ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿB³|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€€€€€€ÀÀÀÀÀÀÀ(0 ` ÿÿÿA±zÿA±zÿÿÿA±zÿA±zÿA±zÿA±zÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿ,,,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ---ÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÿÿÿÿ¢¢¢ÿ&&&ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'''ÿ···ÿÿÿÿÿ˜˜˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ111ÿ«««ÿÿÿÿÿšššÿ,,,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%%%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ111ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿA±zÿA±zÿA±zÿA±zÿA±zÿA±zÿTÂÿgÏŸÿgÏŸÿgÏŸÿgÏŸÿ^¿’ÿÿÿÿÿÿÿÿÿÿÿA±zÿA±zÿÿÿA±zÿA±zÿA±zÿA±zÿA±zÿA±zÿTÂÿfÏžÿfÏžÿfÏžÿfÏžÿgÏŸÿgÏŸÿÿÿÿÿÿÿÿÿÿÿA±zÿA±zÿA±zÿÿÿA±zÿA±zÿA±zÿA±zÿA±zÿA±zÿD´}ÿ\Æ”ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿgÏŸÿÿÿÿÿA±zÿA±zÿA±zÿA±zÿàÿÿÿÿÿ@®yÿA±zÿI¸ƒÿcÊšÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÍœÿ`Æ–ÿB«xÿ<§sÿ;¢pÿÿÿÿÿÿÿ@®xÿB³|ÿR¾‹ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿP½‰ÿB´|ÿ?ªvÿÿÿ@®xÿC´}ÿ[Å“ÿfÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿfÌÿYÄ‘ÿC´}ÿ>©uÿÿÿ@®xÿI¸‚ÿbÊ™ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿaɘÿG·ÿ>©uÿÿÿ@­xÿQ¾ŠÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿO½ˆÿ>©uÿÿÿA¯yÿ[Å“ÿfÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿfÌÿYÄ‘ÿ?ªvÿÿÿF²~ÿbÊ™ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿaɘÿC¬yÿÿÿN¸†ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿK²€ÿÿÿYÀÿfΞÿfÍÿfÍÿfÍÿfÍÿfÍÿfÍÿfÍÿfÍÿfÍÿfÍÿfΞÿUºŠÿÿÿfΞÿfΞÿfΞÿfΞÿfΞÿfΞÿfΞÿfΞÿfΞÿfΞÿfΞÿfΞÿfΞÿfΞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÃÿÿÿ€€€€€€€À€ðððððððððð( @ €&ÿÿ&&ÿMµƒÿMµƒÿÿ&&ÿMµƒÿMµƒÿMµƒÿMµƒÿÿ&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿZÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿC³|ÿcÊšÿeÌœÿeÌœÿeÌœÿeÌœÿC³|ÿC³|ÿÿþþþÿþþþÿþþþÿÿB³|ÿB³|ÿÿ¢ZÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿC³|ÿcÊšÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿC³|ÿÿþþþÿþþþÿþþþÿÿB³|ÿB³|ÿB³|ÿÿ¢ZÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿLº…ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿLº…ÿÿþþþÿþþþÿþþþÿÿB³|ÿB³|ÿB³|ÿB³|ÿÿ¢ZÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿWÂÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿÿÿÿÿÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿÿ¢ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿbÊ™ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿaÉ™ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿÿÿÿÿÿÿÿB³|ÿB³|ÿB³|ÿB³|ÿK¹„ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿJ¸ƒÿB³|ÿB³|ÿB³|ÿB³|ÿÿÿÿÿÿÿÿB³|ÿB³|ÿB³|ÿB³|ÿVÁÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿUÁŽÿB³|ÿB³|ÿB³|ÿB³|ÿÿÿB³|ÿB³|ÿB³|ÿB³|ÿaÉ™ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ`ɘÿB³|ÿB³|ÿB³|ÿB³|ÿÿÿB³|ÿB³|ÿB³|ÿJ¹ƒÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿI¸‚ÿB³|ÿB³|ÿB³|ÿÿÿB³|ÿB³|ÿB³|ÿUÁŽÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿTÀÿB³|ÿB³|ÿB³|ÿÿÿB³|ÿB³|ÿB³|ÿaɘÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ`È—ÿB³|ÿB³|ÿB³|ÿÿÿB³|ÿB³|ÿI¸ƒÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿH·ÿB³|ÿB³|ÿÿÿB³|ÿB³|ÿUÀÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿS¿ŒÿB³|ÿB³|ÿÿÿB³|ÿB³|ÿ`È—ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ_Ç–ÿB³|ÿB³|ÿÿÿH·‚ÿH·‚ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿdË›ÿG¶€ÿH·‚ÿÿÿH·‚ÿT¿ŒÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿR¾‹ÿH·‚ÿÿÿH·‚ÿ_Ç–ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ^Ç•ÿH·‚ÿÿÿH·‚ÿdË›ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿdË›ÿH·‚ÿÿÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿøÿÿðÿÀÀÀÀÀÀÀÀÀàÀ€øøøøøøøøøøøøøø(0` €%ÿÿÿ ÿ ÿÿÿ ÿB³|ÿB³|ÿ ÿÿÿ ÿB³|ÿB³|ÿB³|ÿB³|ÿÿÿÿ ÿB³|ÿB³|ÿbÌšÿ_Ê—ÿB³|ÿB³|ÿÿÿÿÿB³|ÿB³|ÿB³|ÿbÌšÿbÌšÿB³|ÿB³|ÿB³|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿýýýÿýýýÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿ&&&ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿúúúÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿ ÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿ ÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿ ÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿ ÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"""ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿ ÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿ ÿ ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿøøøÿøøøÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿùùùÿùùùÿùùùÿùùùÿùùùÿøøøÿøøøÿøøøÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿ ÿÿÿâÿô ÿB´|ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿfÎÿfÎÿfÎÿfÎÿfÎÿfÎÿfÎÿfÎÿfÎÿfÎÿCµ}ÿCµ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿB´|ÿB´|ÿB´|ÿB´|ÿ ÿÿìÿB´|ÿCµ~ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿCµ}ÿB´}ÿDµ~ÿ\Ç•ÿfΞÿfÎÿfÎÿfÎÿfÎÿfÎÿfÎÿfÎÿfÎÿfÎÿfΞÿCµ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿCµ}ÿCµ}ÿCµ}ÿB´|ÿB´|ÿ ÿÿæ ÿB´|ÿC¶~ÿC´}ÿB´}ÿB´}ÿB´}ÿB´|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿI¸ƒÿbÊšÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿCµ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿCµ}ÿB´}ÿB´}ÿCµ}ÿB´|ÿB´|ÿ ÿÿëÿB´|ÿB´|ÿB´|ÿB´|ÿB´|ÿB´|ÿB´|ÿB´|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿB³|ÿR¾‹ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿdÊ›ÿÿÿÿÿÿÿÿÿÿB´|ÿB´|ÿB´|ÿB´|ÿB´|ÿB´|ÿB´|ÿÿÿîÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿCµ}ÿB³|ÿB³|ÿB³|ÿB³|ÿC´}ÿ[Å“ÿfÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿfÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCµ}ÿB³|ÿB³|ÿB³|ÿB³|ÿH¸‚ÿbÊ™ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿfÎÿ_È—ÿD²}ÿA°zÿA°zÿA°zÿA°zÿB²{ÿÿÿÿÿÿÿÿÿÿÿÿÿCµ}ÿB³|ÿB³|ÿB³|ÿB³|ÿQ¾ŠÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿdË›ÿM»†ÿB³|ÿB³|ÿB³|ÿB³|ÿA²{ÿÿðÿÿCµ}ÿB³|ÿB³|ÿB³|ÿC´}ÿ[Ä’ÿfÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿVÁŽÿB³|ÿB³|ÿB³|ÿB³|ÿA²{ÿÿïÿÿCµ}ÿB³|ÿB³|ÿB³|ÿH·ÿbÊ™ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ_È–ÿEµÿB³|ÿB³|ÿB³|ÿA²{ÿÿïÿÿCµ}ÿB³|ÿB³|ÿA³|ÿP½‰ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿdË›ÿLº…ÿA³|ÿB³|ÿB³|ÿA²{ÿÿïÿÿCµ}ÿB³|ÿB³|ÿC´}ÿZÄ’ÿfÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿUÁŽÿB³|ÿB³|ÿB³|ÿA²{ÿÿïÿÿCµ}ÿB³|ÿB³|ÿG·ÿaɘÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ^Ç–ÿEµ~ÿB³|ÿB³|ÿA²{ÿÿïÿÿCµ}ÿB³|ÿA³|ÿO½ˆÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿdË›ÿKº„ÿB³|ÿB³|ÿA²{ÿÿïÿÿCµ}ÿB³|ÿC³}ÿYÑÿfÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿUÀÿB³|ÿB³|ÿA²{ÿÿïÿÿCµ}ÿB³|ÿG¶€ÿaɘÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ]Ç•ÿDµ~ÿB³|ÿA²{ÿÿïÿÿCµ}ÿA³|ÿO¼ˆÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿcËšÿK¹„ÿB³|ÿA²{ÿÿïÿÿCµ}ÿB³|ÿXÃÿfÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿTÀŒÿB³|ÿA²{ÿÿïÿÿBµ}ÿF¶€ÿ`È—ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ]Æ”ÿDµ~ÿA²{ÿÿïÿÿBµ}ÿN»‡ÿdÌ›ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿcÊšÿJ¹ƒÿA±{ÿÿïÿÿCµ~ÿWÂÿfÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿS¿ŒÿA±{ÿÿïÿÿG¸ÿ`È—ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿ\Æ”ÿC³}ÿÿïÿÿN½ˆÿdË›ÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿcÊšÿI·‚ÿÿïÿÿWÄÿfÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿQ½Šÿÿïÿÿ`Ë™ÿfÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿeÍÿfÍÿ[Å“ÿÿïÿÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿeÌœÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿÿô?ÿÿÿÿøÿÿÿÿðÿÿÿÿàÿÿÿÿÀÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ @€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰PNG  IHDR\r¨f¼IDATxÚí ”\U™Ç¿ê®Þ»ºzKo& „}Ñ3ã223¢08ƒË((¨À8ǃŠÂ0ƒÃqA8¨@ÜpΉCDŒ a (‹„$L/é}¯®®®¹ÿ[]¤ººÞ}µÝ÷ªþ?ÏBÞþÞýÕýîBHÙ°}9ð*«Òñ*u¨Tíóû!þ!ªÒ°JϨtJßµ}AÙâ× ó•ÎR©Îö…²g^¥ßªt¦$òSÜö¹Áø½Jeû"IáU•ÖØ¾·øM©t‚í‹ d^Qéµ¶/ ~@P¥¯«t±í !ÄŸ«ôvÛaŠ_€¸ª_¥NÛBˆ•>¨Òl_ˆ ~!~a“JçÛ¾ü ÿ£¶/‚lŸTTûA!•Æ6ª VHm}•?îˆø–©±ˆÉf¾iðKvq V¿¾Y®ºãÛ×IJœo¼Åd³>•ºm_« %#€Cn•‹¿öViki•xœU$Ï2;7-¸Édk Ï8æèµZäÂkO‘î®nuS~¹-â'F'‡åò7ÿÄdS Ï8 àèyÿUÇÊêî5R¬²}½¤ÄXXX‘^¹òm÷šlNä#œ÷…£¥kU§4Ö‡Mv!Ęٹ%€>ùòßýÂds ÏԴȹŸß ÍÍaioî`@òÊèİŒNÈ5ïú¥Éæ@ž1À6H]]t¶ö0 yc!¾ ýý‰ÎR–0À?© ª¦BÚÂÒX×d²!ŽDæfµâ² WSV0@°ºBêeU3‡ ü069"#*¨ÜBØÁ•‚•UÒÕÖ£þ´}ÝÄçÄuñ¿OWRöp%€@c]HíÈ0€dO$QØ«›){¸@\× 5€\›UÅÿ!ýï€=\—Ð €Ö†$[Ð¥mÿ3‘)AV¡ìáZè°ª¥SêkMv'dsºøß+±…˜þ3`×À.¡ú°´…WÙ¾vâSƧÆdx|péÏ€=²€jÝPYQiûú‰ÏH-þ ÀY  ÞZ·Dçç¤ohïRñPöÈJØ­©¡YZ›Úm_?ñ™˜“¡±}ÿW ÀY @¤Z… ˆ Püß7Ú/Ó³“r`¡ì‘µt´tI]MƒÉaQÅÿ¨ô «âlþ ÿNØ#k€DÐfûˆ/Ȥ*þ¦ÿõßPÖÈIÕU5ÒÕÚ- ˆè:>82 “³Ëæ” ì‘“t¶tKmM½É¡H3‹êÚÿù”â? ì‘“@¸±YZB ÈÊàbf\GÒÿ=`œPSU+: ¨p:)cù!tSÊQöÈY éP¨­®µ}/Ä£ ØŸ(þ§_‰Ž°GÎÍ-Òjµ}/ăàrfBöéâúϰG^€_”P $•Á±™œÆ2”é³`¼õ5 H èôƒÎ?è´€=ò"ТB€° ÙO@wûE÷ßLëJRöÈ›j«ëT) K½L†d?øƒ@™²`¼ Í€]­=ºw !C~Qû!À™ ì‘7€–¦6 74Û¾'â Tñ?2%ûFú—•§ì‘GÄõÈ@ŒDaB0í¦ÿr‚°G^K˜ S‡Õ¶ï‹XÅÌû?sÜ–°G^0KPSCØö}«ôœÅ½5`< €aI02>$cS£FÛRöÈ{ af ÆÌÁ¤€= "Ю€F†eÇ¬Êø*þ_0,þ À@\/#Òˈ|ó(H>UEÿQ¸°GÁJX>­ÁJ†å~õñë?ë¢ø({L%€P]“.Ò'ÕË~£À €= &dzd~H€”¨ùqYü€= Z@ñ?mß')0èòÛ¯‹ÿ3®÷¥ìQP °½¥CkC JôúëÓÅÿ˜ë}){T8<šÑ$HJ›ñ©QÊj_ À€èÎ@èTÉ0 dAñ#ÿ00›OŸ°GÁ€îÀèŒîÁìTš`Ì?ÆþDz(þ ÀFxÿ5Çät jcP¢‹ÿƒÙ°F zh0Z*¹ŒxÉâ?¦ýÆôßÙ~ö€=Š"„˜$“…0 (-0ã/fþͶø({EÓ„aº0RJôœÿ˜û?§£PÖ(š°^–cP:䣸({M J¬÷‡Ú,ÿ €=Š&€EC°x)°ì÷¸ êe¿s<`¢  F‡=z1âPüŸœ™ÈyÎ ÀE@@/#Þ¥%þf>Õµÿ¹ÿ`¢ ` q,%NüK@ÿ't /Ç£¬QtÔT×êÖ€ .#îkû£ Ÿ:`¢  B‡ÝZÄŸ Øß‡Úÿùh^ŽGØ£èÍ*hV¡ñ#™šÁ‘¼Íñ@ØÃŠjÕ¯Ãß‚žè˜¯Ïœ°‡ P‡U üFl±øÍSñPö°"Ðj“pc³íû'®èn¿¨ý7YöÛø¨€5, .µ5õÒÙÒÍõ}ÆÐØ *þcÙïü½7 ÀÖJXF\…$Dü†üö핹ù¹¼—°‡5€Ö¦6ij`àzÎ?Ìý—Ïâ¿>2` ‹ˆë‘!È0À`Ú¯ñ©±¼—°‡Õæèlë‘ê`µíç@ÐÅÿá^=ÿ¾¡ìaU ­©]B: àÞÅÿiUüïÍ{ñ_°†eÄõtá˜6œa€·™’±ÉÑ‚›°‡õ Ak@ÃÏ‚Õ~1óO¤Å@ØÃºÖ ÀÚ ¼ üî“…¸»e¿M¡ìñ„J3mPx,†-9Ï,C ÃèİŒNŽìø€=< Ñˇcª0¬#H¼~õQû™›-Ø9({xB ½¹CBuM\FÜc ãC…*þ Àž2}c]H·o¢?B€BBØÃ°~`°’a€WÀ¯>*ÿP XH({xF%”x4û¡ùÍ€…„°‡‡€0 I×o€Ž?èTh({xH¢[Ѐp€Ø]~Ñõ]€ ý9Söð”Р½¥CjCÂNAv™ÓÅÿÞœ–ý6…°‡§€LèHì‚a¿þ[ ({xL¢Ç`l@%Ãk$Šÿ}zb|Ê€=<'Œ Dkº3 °¦üÂÔ_Å(þ Àž@" hVa@»Ý'S¶ô¤Ÿ˜ü³hg¤¬áAˆž!3aÆ R\PüǴߘþ»XŸ1`O aæ Äœ ŠKTÿûPûŸ‡e¿M¡ìáI€¦†°´61 (.½ä–þ*êY)kxVX/­ Šº`cÑÏÉÙ‰¢ÎÍ@ØÃ³H„Ý* ¨†Åëý¡ïÿ|‹ÿ€°‡'¦[ ¬ˆ5I1Èä̸ ŽÿÌ€5<-€`lV&…µÿ“3Å-þ Àž@E B:Z»¤¶ºÎÊùË ûû†PüÏ߲ߦPöð´@sc‹4‡Z­¿èâÿ„.X9?` Ï  ¦ºV…ݺ4@ bÔØøt){x^ÈøD@ Šÿ¨ýG+€ ({x^!BRºÛ/Šÿ…X÷Ïè (køB¨ìlÅ2â  zþ¡ ­Ï¶€¿Çbx¶½#ãcIÞ¿8mè Íh$ùC~Qû1¶p!ÔRv©„f![¿#‡•q¦Ô•p˜J/Yºð¬ð‚:¡cÉ'ö‹ÿú*Ì€ŒçµUd¦ÿñó*] Ò¡bÏ^®ñ†âºK0ºsñü‚i¿Æ§°ì·½çêB^ÆDHò•>¹ìžRþü€Joeü$Þ€è¹ÐPÍ0 o øÚÿ¹¨½â?ð©äi•Ž>èžø÷GT:Ùöf‹W0<ÄI>è9ÿ0÷ŸÍ⿾ÿ ìTiÝÒ=-þóv•>hûÊrÁ;ˆë B0QÀÜÁ3Ä¢cS#E{žÚ3êÿR}S"«tš¾'•Þ§Òÿ¨ÔhûªrÁ;H„X?3“PpldZFæzm_‰¾–Ôö¯*]<(‰¸ß×xIk`íÎàŽ@E@â qyáw½òÄý/É‹Ûûdd`RæçŠò$‘!*‚iWK×á!9ò´YÒ*}](”ˆÀã*ˆûÅšJ¾Ææ-Äõtá˜6œa€9*“-¨Ì×W–G·ìé »•~ X]!Gß.ïù·7JEe@¾üÎm_R¾@“J ¾Î’ø‰Z«ðÏ@ô‚!]­=zAâLò—ÿ«ß+Ï>æØï«èt¬m”~󹿬’) £P°d®Üì­H¦]… A) 5üßúÌýò‡_¿lûrV¤[…½;&l_F¾ÀGYa$€ÚÆ \þý3´¥=kŒ¸Xo&:ørâÒXÒ‹ˆ{æ?rßíOËO¾õ¸.x™ãÞñyûÇ×ëpÀk`BªØ¼釷ÉhÿŒÓæK%€Y•{­Ô…ªä²»NïÀ{`ùp´+¬~T†öNÈ×>±EzwÚ¾GêšT>¸óô¥ú ¯ ¡nü—m2¼×1óLªFvþ­J§šìÑÐ\-ŸÞtšnñЭ§ioîP]“.åTTVÈÛ_ï^µÕS*§Ÿ·VÎüà:Ï\oRF7]ô˜ î™2Ýí)•Žƒ.Té[bØj«‘K¿wê’qH&T 2?$@V@}w^÷°<ôÃgm_‰1‡Û*¸úO ™ùo¹äqéß5éf×/¨tu2ù±Jï1Ý3ÜQ+Ÿ¼õJÀÿa—OGl~An¼âÙþ›W2n‡ŠÂb4©ÆuÀÌß4Z>öß'.n[ÔÇuð3YÌß¹ìIÙûçq7»â×ÿl•^>ð‰þAR d¢¥»N.¾ùdJÀ,#Þ¡J!†i˜Ÿ‹É7>õsyîq禿bTòbN§ó´½¦^û6Ìw·}ö)Ù󬫺t«D©ÿ>}œ”¿|^¥õ¦Gj_Ó »ñDÏUˆx Ô«0 Ì0 Q%€|&€V%€OX@2óßyåïe×ö7»b1ÅKTº{éXi6ÂD ‡™±óÐFùÈ 'P@g ÌÄ0`9€;’™ÿî/m—O¹Ù¦øŒJß;èx+lŒ€lé‘{Žh’ ¿º‘áÀ vE·`tfêÁPæ$óׯ}FžßæjedT|V¥›–3ÃN{ÅÅĆkŽ Ë×G ¤%®a€9 ÀŒdoÉÿ½þOòÇ­®FA» fùúZÚã:쌿Úd|J`9ŒÖ€J.#~€3É~7›oxNžþE¯›s¢GÐÕ*ýÇŠÇÎt^I”W‡U2žìþðmrÞ¦RH„]* h†û¡2“Ìü[¾ý‚–Núº$&ýÈ|ƒƒ¡êz^%t3j0½‚£Îè”w_qÔRìBDª«ªukÀýPéIfþ_mÚ)ÛîyYò1ƒ|n”DsŸóy ŠÑ,°Šñä!¸ oí–³.}Ç,=“€ž+s2 H@¤a1øþívë4]0ÝÞªÒGݜʌŒˆáèA}pûöyÇÇ×S‹454«0 Íöex …ÅÌÿèO_‘­wî’h$fº'®ä•Îw{:7à×5‹¨`0ãŠqÓÇŸµZþæCGP"z½€.,#Î0@C,çÉÿ{U~yÛK27cœùÁT:×í¹²]Þ,¨@½€ÑW\ ÈIï>DÎ<]ÙK  —ïÒ ‰ •?Ü¿W~ñ2;5ïf·Í*ý}6çËvxæ¹BËe´ŠP°ªBN=w­K]„[¤%Ôjû2<°Ÿ?þªO~~ó‹23u³Ûý*½-Ûsæ2¾_0ú,˜§ª¦RÎxß¡ròÙ‡$¦T*Q èu%24ÖV×JW{þØÊĸ_¿d‹À^Çm½"€ähÀ¥Fò\PÙÍ{Ï=< ÷Ýôg™u5òV•Þœãés½÷‰ T×UÊiª$pÊ{_«•:ñæ*ÄýÆÔËNk?lõá¶/Ï\sÁOeçÓÎ}Û½"€¦öZùÔmF“h9‚tÛì•­wì”ñÁˆ›]±”_Α¯ˆÉÆ‹áá×ó­—"hù¨© ª_‰:9|c».í4å úÙ7Ÿ—WŸ“©‘¨ž £TKAnžÕôDDæf+¼¼"¥Ù|å´ñÇÌ›ú€žÏ/çÎÇ-àbBùy¥>”U‡`΄“ôŸ¯;g«D¦]UîðŠ<.p‡J¯“ý-sY‘«<ÿ¤¼Šþ¶§*(€e O€žeƳH.ðÍS"¥Ô¢c^VU’Ù ÀWOˆ”ÀŠ`Ø~g6;f#€WUzí;&å‘ÛUºÀíNnp™J×Û¾SRžPÙ£Ò!nwr# ¾K¥slß))O(€Œ yÉõtn€¦>t;<Éñ EXÀÁ«¸ýxø¬ ·}6$àµ÷bxï®/ÚíXQä˜<\hÉÒÐÐ ÓÓÓÆÛ—óó ‡Ã2>n¾¢M9?«ÖÖVq\€°MKK‹ŒŽš¯Ô²°°à¹_›bÑÑÑ!ûö™Oo]ÎßÖêÕ«å/q0EØÆ­b±XÙ ¢Ì¡|``à(s(s(Ÿ@˜C˜Cø À À À'PæPæP>0‡0‡ð €9€9€O Ì¡Ì¡|``àØØ À À'¸@9?// ãº(€”sàE™¾,Œ:s“)sÁ­¼F}}½ÍXŒ÷èwTUUI4¥„ L¡Ì¡RÎA €Èà``r  0P@&((s(s(€”sP… 2A8@˜C˜C¤œƒ(  À À À å@a (€LPø]IŠñÛÛÛehhÈS×Dd†pÀ‹(VÆY·nƒA£í#‘ˆìÙ³G‡öÚ}˜B¤(_”Û}Pi (€r¹ P.÷A¤ Êå>(€4P@¹Ü €(—û Ò@Pår@(  \îƒH@”Ë}Pi (€r¹ @င°ˆ[¼–q²Åk÷A¤(œdjjÊs¡Xxí¾)€4P¥!·#õŠ@,ƒ(,€3@(  PPÀÒ9(€ÂB8C¤  @,ƒ(,€3@(  PPÀÒ9(€ÂB8C¤  @,ƒ(,€3@(  PPÀÒ9ÊQÞ¡áXo]rŽRF÷y1³/. æU(€”s”а2†ù–#€9@Ê9(ÿC˜C¤œƒð?€9@Ê9(ÿC˜C¤œƒð?€9@Ê9(ÿC˜C¤œƒð?€9@Ê9(ÿC˜C¤œƒð?€9@Ê9(ÿC˜C¤œ£TÀ®À€ @º‹7Ì8õõõz]1Àˆ½ééiãíËù£†˜ÇÇÇ·/çgÕÖÖ&ÃÃÃN›T!•îW餌tñËœ øÜ|Å*f»]º«\‹ÿ€ÏÊÃgUPUú¾Jïµý0!˘W©ÊíNnq¹JÿeûN !ËxU¥5nwr+€ *mQ©ÇöÝBb“Jç»ÝÉ­„}E¥Ëlß-!d 4¥td³c¶µu¿Qé4ÛwM‘¨JÕ’øqvW«*Ù <®Òñ¶ï>…øâC¨´}!)Ä$ñ‚ʳÁß|VæDTªU©Q¥ÉlëC¾]¥³Uj°ý$*5-þûU:2÷—+Òs*µøg4z‡,_“WÁ³Ú¡Òëÿ<¢R³í‹ò0»U:T¥z•Ì;ž¤ òN•ΑDÿÄ!5E|0`ŸJ©t¡$l8»øw—/^>(ˆ¡XÈ(@F/ªt¯$êLdñ¹àzoQédIT¤†Ý^WUM¥ ›…›.1üÏå›Öý,\Þø|$&.ûê`ëA•V©ôy•®Yüï(ÒΩôm•N]|V5b_è6Áw…Þl;Uz@¥«òqÐr~ ¶@x[ü÷øb2~Wn~‹ë®í^çzŸÝ½/¹ÞçÚ|Hb® °U¥¿ÎpÿYŵÄ À>®rLM}P®øÁ¨0ÿUo ¯’¦ú°˜ü¦£´037-ýÃ}Gï3‡s ×gl~AnøçGd|pÖñøð¨$Jü-‡ï ÜI AIàî3Œ]_Û(«š;»hL ËØäˆãvP|!.ßüÐ#26à*ócLɱÂïÏ:|ÞÁ•êBUrÙ]§'ޠÞ••Aéj푪 sOQô9ïé•È\æ Ìü7~t› ÷θ¹tTоQøíy¾oáJ ÍÕòéM§%*ölwHc}“ã)fUÆî•…øÊ¡w…Êü *óßtÑc2¸ÇÕ(ËTZ/üî<_„÷p%Pk\zÛ©K¿Èé—ƺ ÐH“ù•ª¢ÿèÄÊÃN“™ÿ–K—þ]®šžwI¢ÙŠßœ‡àËð&®$OÞzJF ´õ¨®àW¿þ³+ÿ“ÇÿÎeOÊÞ?›ãWì‘Ä@~oƒ/Ä»¸’@Kw\|óÉ%ЮJ¡º¦["ÑYéGñ?ÍØóäqoûìS²çYW³+¡ŸF—ð[ó$|)ÞÆ•Ú×4ÈÇn<1­é‘ùÛ›W3‚šÿ‘4Åÿäñî¸ò÷²{»sëÀ` :ùð;ó(|1ÞÇ•:m”ÜpÂR¬~ (þ'€àò“Äãºö6rp~2óßý¥í²ãÉ!7—S´H¢3OùÎååq(à*õÑ$~uã²’:ù´·tHcmhY0HŸ.þÇöo¿¸ÿ¯}Fžßf>y§$Æ< É½Ù“ÏÃPþÁ•Ö– ®;.Eqi¬K{xÕ²íǧFex|ÿ/<: ¡TðÓëÿ$ÚÚïæÔhÄà0Ô6ÎÛ~h$3€¿p%µZäÿ~ÌA@g t ª< @Fé“™òn`©_Áæo<'O?Øëf€â‡:I æ‰Ú~XÄ À?$ûü¹’ÀáǵÉyW½$ü²£[0º'5“þá½SÅÿdæßòíä©ûö®Ø¢ŒtĈ½ÚÅ'>€ðÉÑq®$°þäUrÎçÞ¤%€&> j[ ‹ÅÿÁ¥ÌÿÀ­/Ê›_u3²¿öUÂïÉwð…ù”Ý[»’ÀQgtÊ»¯8Jgò`eµn ¨¬¨ÔÅÿ}£ý2=›èÒûЦòè=/KlÞøð¨5De¿%—æOðk‹_]ã\ŠŒ¿á­ÝrÖ¥oÐ l$€]ûÎ?ó±yùÍÝ»åáî–ù¨qÅ=6äô]>†/ο$g2—€ Ž}[¼ã¢õnl–ÖP»LÌŒÉàè>ÙvÏ+òë»vI43=\r"~C>†/Ïß Æ5ïÆ¨¨ ÈÆw­–¿ýðrH×Zy¥o·<ñ³=òÐí;enÆ8ó'á÷ãsøýOrFXc TrÊÙkå¬'Üû‚l¹ù9‰L¹n²ç·Sð%–˜\tL\H“‹®?¡Sv=3(S£snÏÇï¦Dà‹,ZUÂHžB÷»ç7SBðe–ê7 …“¿—ƒ/´tÉ·ø­” |©¥M¾$Àï¤Dá‹-}r•¿‘†/·<ÈVü>J¾àòÁ­øm”|Éå…ÓZ„hFl~e_tùüN¥Ã$1sæÇ´ÝÉ%ÌùM”ÿ]F ͉÷IEND®B`‚sabnzbd-develop/icons/sabnzbd16_32paused.ico0000600000175000017500000001246613642116632017055 0ustar jpjp h&  ¨Ž(  @ÿÿÿiiiÿiiiÿÿÿiiiÿÊÊÊÿÊÊÊÿiiiÿÿÿiiiÿ¹¹¹ÿÒÒÒÿÒÒÒÿ¹¹¹ÿiiiÿÿÿiiiÿ¹¹¹ÿÀÀÀÿÕÕÕÿÕÕÕÿÀÀÀÿ¹¹¹ÿiiiÿÿÿiiiÿ¹¹¹ÿ¹¹¹ÿÉÉÉÿÕÕÕÿÕÕÕÿÉÉÉÿ¹¹¹ÿ¹¹¹ÿiiiÿÿÿiiiÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÒÒÒÿÕÕÕÿÕÕÕÿÒÒÒÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿiiiÿÿÿiiiÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¿¿¿ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¿¿¿ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿiiiÿÿÿÿÿ¹¹¹ÿ¹¹¹ÿÈÈÈÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÈÈÈÿ¹¹¹ÿ¹¹¹ÿÿÿÿÿ¹¹¹ÿ¹¹¹ÿÑÑÑÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÑÑÑÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¾¾¾ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¾¾¾ÿ¹¹¹ÿÿÿ¹¹¹ÿÇÇÇÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÇÇÇÿ¹¹¹ÿÿÿ¹¹¹ÿÐÐÐÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÐÐÐÿ¹¹¹ÿÿÿ¹¹¹ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¹¹¹ÿÿÿ¹¹¹ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿþü?øðàÀ€ÀÀÀÀÀÀÀ( @ €ZZZÿÿZZÿÀÀÀÿ¹¹¹ÿÿZZÿ¹¹¹ÿÎÎÎÿÎÎÎÿ¹¹¹ÿÿZZÿ¹¹¹ÿ»»»ÿÔÔÔÿÔÔÔÿ»»»ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿÄÄÄÿÕÕÕÿÕÕÕÿÄÄÄÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÍÍÍÿÕÕÕÿÕÕÕÿÍÍÍÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿºººÿÔÔÔÿÕÕÕÿÕÕÕÿÔÔÔÿºººÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÃÃÃÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÃÃÃÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÌÌÌÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÌÌÌÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿºººÿÔÔÔÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÔÔÔÿºººÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÂÂÂÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÂÂÂÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿËËËÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿËËËÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÓÓÓÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÓÓÓÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÁÁÁÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÁÁÁÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÊÊÊÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÊÊÊÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿZÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÓÓÓÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÓÓÓÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿÿÿÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÀÀÀÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÀÀÀÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿÿÿÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÉÉÉÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÉÉÉÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÒÒÒÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÒÒÒÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÀÀÀÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÀÀÀÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÉÉÉÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÉÉÉÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÒÒÒÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÒÒÒÿ¹¹¹ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿ¿¿¿ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¿¿¿ÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿÈÈÈÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÈÈÈÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¹¹¹ÿÑÑÑÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÑÑÑÿ¹¹¹ÿ¹¹¹ÿÿÿ¹¹¹ÿ¾¾¾ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¾¾¾ÿ¹¹¹ÿÿÿ¹¹¹ÿÇÇÇÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÇÇÇÿ¹¹¹ÿÿÿ¹¹¹ÿÐÐÐÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÐÐÐÿ¹¹¹ÿÿÿ¹¹¹ÿÔÔÔÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÔÔÔÿ¹¹¹ÿÿÿ¹¹¹ÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿÕÕÕÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿü?ÿÿøÿÿðÿÿàÿÿÀÿÿ€ÿÿÿþü?øðàÀ€øøøøøøøøøøøøøøsabnzbd-develop/icons/sabnzbd16_32green.ico0000600000175000017500000001246613642116632016674 0ustar jpjp h&  ¨Ž(  @ÿÿÿ=’iÿ€ðŠ»:z aÀ›ýr.«Kæíÿzᆢ¼â.ÄÿDÀ0€8¡7Ô‚Vÿg'Îùàw´ E€66L×ßåù‡Gx¥6töš— ˆ «Ë…êÿêÿ£¼R›Ð½;º}çŸDªÿgµúrÛ¯)Ô&€q½ø€XTÿÔêÿܹ¿§¼R»Ð b:\âÕ­þ=·ú(¯Ô.„#z=Ú»| ½‘'Ef~ZòO€?jØ­aÀ¨0 •Aõÿ„ÈÒìö?Q^©O]ý"Cûʬ­˜·ÿkùí£¼RŸv´kpÃRTÿ§´úÿPÙ?Sþ¨O`pHψ0 eIªÿeÖõ¤¼R¿ºD†÷EvØ$3PíÇÛÿRÕ@x¥~ ÕëÒÖéûXHpè ´4­5Tÿ7Ê~„ðGýƒ{5 †dˆý§ËÿðJ:èÚÙ¡“†“Tÿ™V€rP^IGm¦Sþ%$!g^üá`¥š!à•t†öiM`HMÐóM€• ¼’žPø“0€1}þQýÇàJP^IOh@§ †E`yÖŒþÛØ¨úQ Àé ‡„ƒÂ0€$ãþ&«ŽðJŠÓˆž¤µ±­þ À+é  ½Ó´ siQrfÒÌýW­ú_ø8àt+„] ZÌú‹é¿l ¼’® îö}\Ęï?©þ/Ù}žðJúÀÐ`´0 hAô†Y™3+ÿ` ËM(¤/€$ ØoF 2 h=°æÖþ³…ðJú½#fº0ÒZ úUó‹öÛP^iŒÚ» a—orfÁOÀ¶ú_ØŒðGc,#®a@g¿0 h!æNkõÿ´Û6€W#Ð7*Ò?æûøHVà©·ÿ.Õ@x¥qÀ²aà Z½Qò F.Õÿ¦€?'€$ 7+1 h~ðæ-®P^iœ–ÇR⤹ÁS/ÿVÜ·¥¼ÒXtô˜Ö.#ÞÜä—TÇL3 +€W+| £W4+¹Bõ¢æÍ)4V §†;}'iñ—TÿçkÛžðJãÐÙ[XFœa@S‚1ÿɲß5Þ €W/4Bx@šŒœö‹ÙêØàÆ  %-¤¹@õóþaZ¡¼’Ð]ƒ4Iõÿ˜™¬V(¯d#„É2âݾ—¤–ýž4sÿ×¹ ÀÙ Œ‰ô" `s`STÿO˜é¿ëðJvèê7…äb:=¤,«+…·ÿuTÿà•ì€)Â’0 Ë÷1“ºÉ™%¿°òo »¢ü‘f ꆱƒêÿCfñÏz¡¼’­4ɲßGÍ¿õBx%[$aÀ³€‰,û=ej)íŽðG¶X: k0 ˆ—¤ú?ξ(¯d/€î³zPT§‰l’Tÿµ,®­¤³? À+٠ˇ'ˈ3 ˆœyò'Õÿ”jp€W²ÜkVfhú[L©ú(¯ø@÷ †*¨NI:ýœ=š^õP^ñ#€$ 8`þ%‘€e¿gL÷_›e¿vKøÃpŠPè†?è˜&€W< @é2ïH úŸ,û½œî~)¯øZ’Ö†á“3£þ0ùGšÕÿ®)ø@ì3/„¦ýZ˜L¿€W< @LS z’°Á„ŸèûŸvõP^ñ+Œ @kÆ@Á²ßs"Sº¯ûg¹{ À~€QØ5 fvÂÌþÛ(¯øè1ó0AõË~aù¯F@xÅ¿0CZHάøƒ•Qý/|àÿH€q3YÀðÀ’ßXû¯QP^ñ/€iÂ0k0 <õÑù'¿Ø¸ï ¼†°^@´ù>d½øù#€FUÿ _Cø# `Å ¬ÔÉ0 (æOkpº±ßAx% ¬ˆ5I੟,û½ÐØï¡¼ްz0VfÅê?Þþ7øÂS^ GI0neà¼ùG @£¡¼Ž@ßN vú>'$©þ?hú4 À+a aZ¸Œ¸_Ðë½ÿÖ3¸è€W >ÐÑ+ |¡}áŒéÿŸÑ×QþK-h ~À„ÉÛÿ ªÿ€ðJxèì5/øcþÑù§Þe¿m¡¼žÐ 8Œ0 Û÷¹iArfØ/fÿÉð+)„'Ð?Vø SPýǼËsÙ}'à•0€¾IÓ©lVWÌÔ_YUÿà•0€0 YF¼Ë÷ùi!ôb/Nš¹ÿ3þZ Àa `– fxûÂLÿ%€WÂ&Á| ²ëý%Ë~ç³ý^ À+á S„¡SÀ È™%¿°ò¯‡¯¦ü®Ö è†oÿµð/ÍdÿÕ€W¦ ÇêA  ªýxûŸuõP^ [IpÀ, B„^ä¥iSðQÓ¢¼¶VÆb bÿÅi?ßMx%|`ñÐ!,#Óiˆ¤úÌ´ø€ðJøÀòḌxÈ™Ó'Ä[ ‹ðJø¨t3 hèù‡&@_P^‰CI°ÏcšôùO–ýöTýöÀ %Q,"YJ(dX]὚ž¥é‘š0 ¾Ï)pñÝ_¯#€¶NÓ)ˆa@ŠäL·_ŒþÛðX³²2¹$~«%…êÒÿiú’¦–;¤­`íkt°VÕÊ3ïL0À)M€!a"÷¿0é7ö <п«é‰r^ Ù*tcÃF+ºÇW8Pz†L“ I‡¤úÌÌä“xPå£Ö6KIQ(ðy©g‡LP@0z€Ëˆ§‚^ØÙÂË?ŸÕÿBV"@X0²õŠ wÅ ïÜÕJPH–ß'Ò…ÓÉ0 fð(š>iÆþgIN6 »¬Ÿ÷ûøîÕt°xHE'êà J=1@ˆ¸S| ]œïO°ì¡ë‘®ÎB~šGà­š>Xš-¢^í28`hp²Œ8Ã' …ÿí;%÷µYùɉ¼äW³¯Eá~Ú9$òÌÇŠ¼æù"W_n~×Dø¦¦§€&ƒ¨Wº NI°ßŒd`G¡€=á¦#òÝCKÁœµÝZ™{믉ܦ"èlk`>µ½ET<׸—z´lüzy<óY G wÄLFªSxò?òúÃrä!õý2ôhð®—‰¼ùW4²{±Vð}\¢,­ˆ,To0Áj*ýVH>ð%߇f{lŽ&#’0à—¯F¡ð_Uxò‡ÊPŸÈ{oy]à5€‰­µÜPõc šúŠ(¾â( j3_Їk®P¥me#°|%ˈkÐÙXÆÂã-9%·æŒïlTå©Wˆüã;Ìû .©ÞjS³"+ZyÚûr-ÐÕ󆓽³Xè­š{õƒŸ7¶8 Ì<0æ;áRxú_ò¢Ëáãûù[ÒÑ.rçD^ò 'ÔÔR<£Ïó%þõt®[mõ=M+ à.Mרl5ª³3käÓH"o`Ù0,Æ0 4mx{»!WÿPV×Bz¤–ç–ëD>ñÚB«€o4ó5ÍkÌ¿ÿ&Ñsh½åŸjzCñ^©éÏ4YµYíÒêÏÄ_KXñv¨$aÀ¸YAˆ'k;…@îI‡|çÄšk.ùÏiÖ}‡Â˜ Y+M³‹"ã¯ÉÛ/’„I®×t÷V‡ýƒ¦Úîa¯ÖlO|F(°v`ÔÝ,G±m="\®º{?âY ©~z^äÀÍâÒQ šx§¦?(ìæÐ9à)¶{: ÷ôŸ’‡{n‘Òtô˜NA\F¼,6ØÈ`,@ÎbVçGï¹ïc YÌkUrNä¢ßÔZ€ý)”ÒOhºmË®¶ñ?šž`»Ç‹÷ˆþ¤P•@Á‡:z…Õ¥ÒØ`ffF›€W%gfEu‹Èœ}«)rz§¦›Ï9Þ2þ_M±Ýóeãæ„Pèß©¡ÀNß¹LOOËà`cÇ«….¯Ó3š‡[õ|,8múyM/Ùv¼6ÀL"—ÛîýàE"÷Ü!”@9:{ ˈ3 (P ÍÚ©i-”¯9ë¶.ê?izAÉã­²áýšeû-W]"r7(íä°Œø8À2PÕ2&2¡…ÿà«Í¿|UÓs+ì¶*ˆÃ §×há® %P ´ E€lƒ¨€~ÏÄ”Èã^+râ¬Ó–ßÐtmÅãµÜÑƒš¬§º½ö È¿ÿ¾P烾èÌ0`@ …ÿ‰¯9zÊiËo‰E‹žK_&ÌÎ`ݧõ9ùÊ{„Ø z¢W z’s JP(ü×ü®Èa·Õп#–-y¶(v÷Á‚QÛ\\ÿd‘/¾](­`\@/¾Ø p…Âÿô7‹:î´å÷šϥP,ƘTpÈv£_šÈçÞ$”@‘$ ç2âçAl¡Pø¯{›È=Gœ¶ÄI´n¹KŽ×1kÅé6ÐÑoõú 7]+òéßvÉ2☹È&@Báþ»Eîþ‘Ó–?‡»Íã­!‹Å)ÄÑ ¡Çê˜ô n}¶ÈÇ_#”À,A&Üò'âa(Ù,ü/z¿È]÷9m‰…|.¬éxkÌ*_è¼TøU0‰Èoÿ¢È‡oJ «ßÌÈ0`“–@¡ð¿äv‘¯ßã´%^Ö¼e=w žþ‹â°’&Sxà D>ø im 0 ØFK  Pøoþ‘¯|ÇiK4 Ö5ÛL½ rÇä‚ ¬æèRU¼åWEÞý2³ÐK³9 YS7FñæX/ñüm`ltd2Â-TPÖró#}ÞÞ÷q3!ˆÅÔ[Á>0‡ß+ïùâ·6E— 4'Õõ(M£Š+2ã’‰^}ðýücD¾ôξ=pVÖD:Q?*È.·õ,í¾Ìwö‚!&`j¼ÉÏ¥ó}§gE^¨1ÿ·9ÉdNÌB¾u×£Ó B1¿ØcSÚWS€ûhlHä9W‰|úõÿþòÛL§Ž|(óÉED(4ÅPÓíuo ™ÁËÀNßg$d.3s)¢Mw}!j†8ø¡€k˜@ªù¢BÀåâp` Å|Q!@ØC¤š/ ({(€TóE„`j¾(€ ì¡RÍ€=@ªù¢B€°‡H5_@PöP©æ‹ À Õ|Q!@ØC¤š/ ({(€Tó†°2ÎÊÊJÃOH¨PöP©æ+3,hê©ô\¤¬”Ø€Á6“““É…jô€<íÚµ+pT-kkk›çªÑP©æ+3`-«±†qÊà"µ²vìØá4â¨N« àÛšžÜð#N €°¨Î{4½³áGœ2``ÇaM7ü¨S„ l ìÉfÞ¨” (({(€PöP©æ+SÌjêoøQ§@Ø@TçNM76üˆS† l ªóCMnø§ @Ø@TgJÓPÃ8eZ]H.7*PVÀ¢¦îrÄ“ÝIC¤•à `O« Àz4`H‹]@LY¢Šµ—cÈbÕ¥àz®º¯Â@+¢B%D„  €=€=@$PöPöP‘@ØCØCD`` €=€=@$PöPöP‘@ØCØCD`` €=€=@$Pö¸ `ffF|gÛ Ñ€ ƒØŸÒ±±19yò¤ï,{ãÒK/•ûï¿ßúóY º •Pqadtxx8*Ùjàu)ÐH2::*ííí¾³ž9(vöìÙdÑ[ ̬ß„D>Ÿ—3gÎTûFÞµ¹î»LhÚåû¤BÎæ>×jÀkz’ï£%„œ¦ê¿Äu£Zð~Moó}´„m8—çZg}ø‰¦‹|-!d“šÊr=Ó¾Tl „dÊ1^:ÏÅW«zżt@{_‡ï£'¤…AÕt¶Ökoç%ÒåÂ3V.¶óÍhjÍž,v VYlbFo²Nß œº qõP¬vü…¦gjÚ+ Úd±zº¹=EL³) ?nê¿×tµ˜så úƒ„ئx#Õ5Ü?¸¾ªé¹b,øçëkš~NÌ4ôÎmÜMH^Ìw\ê/» Ÿú•Tåa”õ“îäßhukÄñ[v_^[îNÞçôñ‰IýªÜ6S{Ä}X +·‚åçæjË<±ð$€îpVÝ{TGþJdX‰Î±{äöª1öØçh]ÊSGõy³Tý³;´:©í¹Á©€j+ª¯¼=“(7¬ú¹%0¢ÏÇŽ6©^êÚ5*¹@÷nã½%VæUÇu¿UÖuÐÜžš2_ïøäGõ~Pxÿy‡ 6 Éêšôu‹üø/õª5öj[àÅÁÐ~‘®±zFÏ™¯Ò÷\w9©•ó¼Vö¼Üé½^÷Ù'i,¼aáômP£æ}Rdç EÕ! v[ä@Kô¤>ýó‹å?£wÍŒFëKy‘½7b`u–±Óá} ¼áá$„‡þ\d×`•‹ÙÞ]*½L·¨þëGæ—4-‹ì¿IdÕ¾ë Z@º„÷\Pðb„‰“v ‰ÜûQ‘±¡ [æ´Ž0¬a@gåÝÏÖÒ}ºÌ>ô¾"2«ÏññWh%Á~$/š¯:„÷[pð‚„‹“öŽŠ|ïŽ*èÓõWè³…§þä±ÒÕ½S–µOkÕÿÀÍæÿ–Ûùy¯/JØ8Ià‚]"wX%0,¦Má|:4 .è­_0ñÿÆÚö?­™—~ý†©XRlÙà}(¼0áã$‹÷ˆü×—‘@ŒkÐWz·xó€óXÓž™yÔ-úg‹®[òÞcAËNø-ãÿq{ ô=BÀ:¡ú—+çvÆÃæ§gD}«©þ;Âû+pxâÁI/ù·”@Gi È×pˆ^SÇL/À-_xJ ÿå¯9;ëœ_Þ[À‹N¸ê‘/¿ç<  àC½[v§·Á‚Vÿg'ÞX51-rå«UÓÎùä} ¼Pñá$«/ùâ;Γ@ÿN vnÙãF¡ú?o~Fÿþ)‘ǽVä„û@SÞSÁ‹'NxÆA‘Ï¿e‹:{ÍËÀb°º,2yÔTÿ …ÿ‰¯9zÊå[x?E/X¼8Ià/rç Øh+„Ýbªÿú˜Ÿ=¹Yø¯ÑÏþ©s~x/E/ZœàºYóËOùäë èÝe¼ýŸ~P$?—þ§¿YäÐñšòC"„.^PG…ÞI/~ªÈ·a•>‘A ÖVTÇdâìª\÷6‘{Ž8çƒ÷PÄðâÅMqJ6k `dð׊üá-*‹©ñÿ¢Lý©<ÿ]"wÛ/Ó·¹;ß'€Ô/`ó`-,¯÷[Ïyßæç¾Oä[‡œ¿÷NÀ‹Ø\XK ]ë/V§ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ Deobfuscation post-processing script: Will check in the completed job folder if maybe there are par2 files, for example "rename.par2", and use those to rename the files. If there is no "rename.par2" available, it will rename the largest file to the job-name in the queue. NOTES: 1) To use this script you need Python installed on your system and select "Add to path" during its installation. Select this folder in Config > Folders > Scripts Folder and select this script for each job you want it used for, or link it to a category in Config > Categories. 2) Beware that files on the 'Cleanup List' are removed before scripts are called and if any of them happen to be required by the found par2 file, it will fail. 3) If there are multiple larger (>40MB) files, then the script will not rename anything, since it could be a multi-pack. 4) If you want to modify this script, make sure to copy it out of this directory, or it will be overwritten when SABnzbd is updated. 5) Feedback or bugs in this script can be reported in on our forum: https://forums.sabnzbd.org/viewforum.php?f=9 Improved by P1nGu1n """ import os import sys import time import fnmatch import struct import hashlib # Are we being called from SABnzbd? if not os.environ.get("SAB_VERSION"): print("This script needs to be called from SABnzbd as post-processing script.") sys.exit(1) # Files to exclude and minimal file size for renaming EXCLUDED_FILE_EXTS = (".vob", ".bin") MIN_FILE_SIZE = 40 * 1024 * 1024 # see: http://parchive.sourceforge.net/docs/specifications/parity-volume-spec/article-spec.html STRUCT_PACKET_HEADER = struct.Struct( "<" "8s" # Magic sequence "Q" # Length of the entire packet (including header), must be multiple of 4 "16s" # MD5 Hash of packet "16s" # Recovery Set ID "16s" # Packet type ) PACKET_TYPE_FILE_DESC = "PAR 2.0\x00FileDesc" STRUCT_FILE_DESC_PACKET = struct.Struct( "<" "16s" # File ID "16s" # MD5 hash of the entire file "16s" # MD5 hash of the first 16KiB of the file "Q" # Length of the file ) # Supporting functions def print_splitter(): """ Simple helper function """ print("\n------------------------\n") def decode_par2(parfile): result = False dirname = os.path.dirname(parfile) with open(parfile, "rb") as parfileToDecode: while True: header = parfileToDecode.read(STRUCT_PACKET_HEADER.size) if not header: break # file fully read (_, packetLength, _, _, packet_type) = STRUCT_PACKET_HEADER.unpack(header) body_length = packetLength - STRUCT_PACKET_HEADER.size # only process File Description packets if packet_type != PACKET_TYPE_FILE_DESC: # skip this packet parfileToDecode.seek(body_length, os.SEEK_CUR) continue chunck = parfileToDecode.read(STRUCT_FILE_DESC_PACKET.size) (_, _, hash16k, filelength) = STRUCT_FILE_DESC_PACKET.unpack(chunck) # filename makes up for the rest of the packet, padded with null characters target_name = parfileToDecode.read(body_length - STRUCT_FILE_DESC_PACKET.size).rstrip(b"\0") target_path = os.path.join(dirname, target_name) # file already exists, skip it if os.path.exists(target_path): print("File already exists: %s" % target_name) continue # find and rename file src_path = find_file(dirname, filelength, hash16k) if src_path is not None: os.rename(src_path, target_path) print("Renamed file from %s to %s" % (os.path.basename(src_path), target_name)) result = True else: print("No match found for: %s" % target_name) return result def find_file(dirname, filelength, hash16k): for fn in os.listdir(dirname): filepath = os.path.join(dirname, fn) # check if the size matches as an indication if os.path.getsize(filepath) != filelength: continue with open(filepath, "rb") as fileToMatch: data = fileToMatch.read(16 * 1024) m = hashlib.md5() m.update(data) # compare hash to confirm the match if m.digest() == hash16k: return filepath return None # Run main program print_splitter() print("SABnzbd version: ", os.environ["SAB_VERSION"]) print("Job location: ", os.environ["SAB_COMPLETE_DIR"]) print_splitter() # Search for par2 files matches = [] for root, dirnames, filenames in os.walk(os.environ["SAB_COMPLETE_DIR"]): for filename in fnmatch.filter(filenames, "*.par2"): matches.append(os.path.join(root, filename)) print("Found file:", os.path.join(root, filename)) # Found any par2 files we can use? run_renamer = True if not matches: print("No par2 files found to process.") # Run par2 from SABnzbd on them for par2_file in matches: # Analyse data and analyse result print_splitter() if decode_par2(par2_file): print("Recursive repair/verify finished.") run_renamer = False else: print("Recursive repair/verify did not complete!") # No matches? Then we try to rename the largest file to the job-name if run_renamer: print_splitter() print("Trying to see if there are large files to rename") print_splitter() # If there are more larger files, we don't rename largest_file = None for root, dirnames, filenames in os.walk(os.environ["SAB_COMPLETE_DIR"]): for filename in filenames: full_path = os.path.join(root, filename) file_size = os.path.getsize(full_path) # Do we count this file? if file_size > MIN_FILE_SIZE and os.path.splitext(filename)[1].lower() not in EXCLUDED_FILE_EXTS: # Did we already found one? if largest_file: print("Found:", largest_file) print("Found:", full_path) print_splitter() print("Found multiple larger files, aborting.") largest_file = None break largest_file = full_path # Found something large enough? if largest_file: # We don't need to do any cleaning of dir-names # since SABnzbd already did that! new_name = "%s%s" % ( os.path.join(os.environ["SAB_COMPLETE_DIR"], os.environ["SAB_FINAL_NAME"]), os.path.splitext(largest_file)[1].lower(), ) print("Renaming %s to %s" % (largest_file, new_name)) # With retries for Windows for r in range(3): try: os.rename(largest_file, new_name) print("Renaming done!") break except: time.sleep(1) else: print("No par2 files or large files found") # Always exit with success-code sys.exit(0) sabnzbd-develop/scripts/Sample-PostProc.cmd0000600000175000017500000000071613642116632017105 0ustar jpjp@echo off rem Example of a post processing script for SABnzbd echo. echo Running in directory "%~d0%~p0" echo. echo The first parameter (result-dir) = %1 echo The second parameter (nzb-name) = %2 echo The third parameter (nice name) = %3 echo The fourth parameter (newzbin #) = %4 echo The fifth parameter (category) = %5 echo The sixth parameter (group) = %6 echo The seventh parameter (status) = %7 echo The eight parameter (failure_url)= %8 echo. sabnzbd-develop/scripts/Sample-PostProc.sh0000755000175000017500000000073213642116632016765 0ustar jpjp#!/bin/sh # Example of a post processing script for SABnzbd echo echo Started as $0 echo echo "The first parameter (result-dir) =" "$1" echo "The second parameter (nzb-name) =" "$2" echo "The third parameter (nice name) =" "$3" echo "The fourth parameter (newzbin-id) =" "$4" echo "The fifth parameter (category) =" "$5" echo "The sixth parameter (group) =" "$6" echo "The seventh parameter (status) =" "$7" echo "The eight parameter (failure_url) =" "$8" sabnzbd-develop/SABHelper.py0000600000175000017500000001217413642116632014061 0ustar jpjp#!/usr/bin/python3 -OO # Copyright 2007-2019 The SABnzbd-Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0): print("Sorry, requires Python 2.6 or 2.7.") sys.exit(1) import time import subprocess try: import win32api import win32file import win32serviceutil import win32evtlogutil import win32event import win32service import pywintypes except ImportError: print("Sorry, requires Python module PyWin32.") sys.exit(1) from util.mailslot import MailSlot from util.apireg import del_connection_info, set_connection_info WIN_SERVICE = None def HandleCommandLine(allow_service=True): """ Handle command line for a Windows Service Prescribed name that will be called by Py2Exe. You MUST set 'cmdline_style':'custom' in the package.py! """ win32serviceutil.HandleCommandLine(SABHelper) def start_sab(): return subprocess.Popen('net start SABnzbd', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) def main(): mail = MailSlot() if not mail.create(10): return '- Cannot create Mailslot' active = False # SABnzbd should be running counter = 0 # Time allowed for SABnzbd to be silent while True: msg = mail.receive() if msg: if msg == 'restart': time.sleep(1.0) counter = 0 del_connection_info(user=False) start_sab() elif msg == 'stop': active = False del_connection_info(user=False) elif msg == 'active': active = True counter = 0 elif msg.startswith('api '): active = True counter = 0 _cmd, url = msg.split() if url: set_connection_info(url.strip(), user=False) if active: counter += 1 if counter > 120: # 120 seconds counter = 0 start_sab() rc = win32event.WaitForMultipleObjects((WIN_SERVICE.hWaitStop, WIN_SERVICE.overlapped.hEvent), 0, 1000) if rc == win32event.WAIT_OBJECT_0: del_connection_info(user=False) mail.disconnect() return '' ############################################################################## # Windows Service Support ############################################################################## import servicemanager class SABHelper(win32serviceutil.ServiceFramework): """ Win32 Service Handler """ _svc_name_ = 'SABHelper' _svc_display_name_ = 'SABnzbd Helper' _svc_deps_ = ["EventLog", "Tcpip"] _svc_description_ = 'Automated downloading from Usenet. ' \ 'This service helps SABnzbd to restart itself.' def __init__(self, args): global WIN_SERVICE win32serviceutil.ServiceFramework.__init__(self, args) self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) self.overlapped = pywintypes.OVERLAPPED() # @UndefinedVariable self.overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None) WIN_SERVICE = self def SvcDoRun(self): msg = 'SABHelper-service' self.Logger(servicemanager.PYS_SERVICE_STARTED, msg + ' has started') res = main() self.Logger(servicemanager.PYS_SERVICE_STOPPED, msg + ' has stopped' + res) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) def Logger(self, state, msg): win32evtlogutil.ReportEvent(self._svc_display_name_, state, 0, servicemanager.EVENTLOG_INFORMATION_TYPE, (self._svc_name_, str(msg))) def ErrLogger(self, msg, text): win32evtlogutil.ReportEvent(self._svc_display_name_, servicemanager.PYS_SERVICE_STOPPED, 0, servicemanager.EVENTLOG_ERROR_TYPE, (self._svc_name_, str(msg)), str(text)) ############################################################################## # Platform specific startup code ############################################################################## if __name__ == '__main__': win32serviceutil.HandleCommandLine(SABHelper, argv=sys.argv) sabnzbd-develop/0000755000000000000000000000000013643336365012647 5ustar rootrootsabnzbd-develop/interfaces/0000755000000000000000000000000013643326315014764 5ustar rootrootsabnzbd-develop/interfaces/Glitter/0000755000000000000000000000000013643326315016376 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/0000755000000000000000000000000013643326315020374 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/0000755000000000000000000000000013643326315021663 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/0000755000000000000000000000000013643326315023700 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/js/0000755000000000000000000000000013643326315024314 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/js/src/0000755000000000000000000000000013643326315025103 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/js/src/bootstrap_3.3.5.js0000644000000000000000000020643213643326315030213 0ustar rootroot/*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under the MIT license */ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } +function ($) { 'use strict'; var version = $.fn.jquery.split(' ')[0].split('.') if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') } }(jQuery); /* ======================================================================== * Bootstrap: transition.js v3.3.5 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { WebkitTransition : 'webkitTransitionEnd', MozTransition : 'transitionend', OTransition : 'oTransitionEnd otransitionend', transition : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } return false // explicit for ie8 ( ._.) } // http://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false var $el = this $(this).one('bsTransitionEnd', function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() if (!$.support.transition) return $.event.special.bsTransitionEnd = { bindType: $.support.transition.end, delegateType: $.support.transition.end, handle: function (e) { if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) } } }) }(jQuery); /* ======================================================================== * Bootstrap: alert.js v3.3.5 * http://getbootstrap.com/javascript/#alerts * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.VERSION = '3.3.5' Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = $(selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { // detach from parent, fire event then clean up data $parent.detach().trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.alert $.fn.alert = Plugin $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(jQuery); /* ======================================================================== * Bootstrap: button.js v3.3.5 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) this.isLoading = false } Button.VERSION = '3.3.5' Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state += 'Text' if (data.resetText == null) $el.data('resetText', $el[val]()) // push to event loop to allow forms to submit setTimeout($.proxy(function () { $el[val](data[state] == null ? this.options[state] : data[state]) if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d) } else if (this.isLoading) { this.isLoading = false $el.removeClass(d).removeAttr(d) } }, this), 0) } Button.prototype.toggle = function () { var changed = true var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') if ($input.prop('type') == 'radio') { if ($input.prop('checked')) changed = false $parent.find('.active').removeClass('active') this.$element.addClass('active') } else if ($input.prop('type') == 'checkbox') { if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false this.$element.toggleClass('active') } $input.prop('checked', this.$element.hasClass('active')) if (changed) $input.trigger('change') } else { this.$element.attr('aria-pressed', !this.$element.hasClass('active')) this.$element.toggleClass('active') } } // BUTTON PLUGIN DEFINITION // ======================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } var old = $.fn.button $.fn.button = Plugin $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { var $btn = $(e.target) if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') Plugin.call($btn, 'toggle') if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() }) .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) }) }(jQuery); /* ======================================================================== * Bootstrap: carousel.js v3.3.5 * http://getbootstrap.com/javascript/#carousel * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = null this.sliding = null this.interval = null this.$active = null this.$items = null this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } Carousel.VERSION = '3.3.5' Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', wrap: true, keyboard: true } Carousel.prototype.keydown = function (e) { if (/input|textarea/i.test(e.target.tagName)) return switch (e.which) { case 37: this.prev(); break case 39: this.next(); break default: return } e.preventDefault() } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getItemIndex = function (item) { this.$items = item.parent().children('.item') return this.$items.index(item || this.$active) } Carousel.prototype.getItemForDirection = function (direction, active) { var activeIndex = this.getItemIndex(active) var willWrap = (direction == 'prev' && activeIndex === 0) || (direction == 'next' && activeIndex == (this.$items.length - 1)) if (willWrap && !this.options.wrap) return active var delta = direction == 'prev' ? -1 : 1 var itemIndex = (activeIndex + delta) % this.$items.length return this.$items.eq(itemIndex) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var that = this if ($next.hasClass('active')) return (this.sliding = false) var relatedTarget = $next[0] var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) this.$element.trigger(slideEvent) if (slideEvent.isDefaultPrevented()) return this.sliding = true isCycling && this.pause() if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) $nextIndicator && $nextIndicator.addClass('active') } var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) $active .one('bsTransitionEnd', function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger(slidEvent) }, 0) }) .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger(slidEvent) } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } var old = $.fn.carousel $.fn.carousel = Plugin $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= var clickHandler = function (e) { var href var $this = $(this) var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 if (!$target.hasClass('carousel')) return var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false Plugin.call($target, options) if (slideIndex) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() } $(document) .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) Plugin.call($carousel, $carousel.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.3.5 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + '[data-toggle="collapse"][data-target="#' + element.id + '"]') this.transitioning = null if (this.options.parent) { this.$parent = this.getParent() } else { this.addAriaAndCollapsedClass(this.$element, this.$trigger) } if (this.options.toggle) this.toggle() } Collapse.VERSION = '3.3.5' Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var activesData var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') if (actives && actives.length) { activesData = actives.data('bs.collapse') if (activesData && activesData.transitioning) return } var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return if (actives && actives.length) { Plugin.call(actives, 'hide') activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) .attr('aria-expanded', true) this.$trigger .removeClass('collapsed') .attr('aria-expanded', true) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('collapse in')[dimension]('') this.transitioning = 0 this.$element .trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element[dimension](this.$element[dimension]())[0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse in') .attr('aria-expanded', false) this.$trigger .addClass('collapsed') .attr('aria-expanded', false) this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .removeClass('collapsing') .addClass('collapse') .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } Collapse.prototype.getParent = function () { return $(this.options.parent) .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') .each($.proxy(function (i, element) { var $element = $(element) this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) }, this)) .end() } Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { var isOpen = $element.hasClass('in') $element.attr('aria-expanded', isOpen) $trigger .toggleClass('collapsed', !isOpen) .attr('aria-expanded', isOpen) } function getTargetFromTrigger($trigger) { var href var target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 return $(target) } // COLLAPSE PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.collapse $.fn.collapse = Plugin $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { var $this = $(this) if (!$this.attr('data-target')) e.preventDefault() var $target = getTargetFromTrigger($this) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() Plugin.call($target, option) }) }(jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.3.5 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle="dropdown"]' var Dropdown = function (element) { $(element).on('click.bs.dropdown', this.toggle) } Dropdown.VERSION = '3.3.5' function getParent($this) { var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = selector && $(selector) return $parent && $parent.length ? $parent : $this.parent() } function clearMenus(e) { if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { var $this = $(this) var $parent = getParent($this) var relatedTarget = { relatedTarget: this } if (!$parent.hasClass('open')) return if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) }) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we use a backdrop because click events don't delegate $(document.createElement('div')) .addClass('dropdown-backdrop') .insertAfter($(this)) .on('click', clearMenus) } var relatedTarget = { relatedTarget: this } $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this .trigger('focus') .attr('aria-expanded', 'true') $parent .toggleClass('open') .trigger('shown.bs.dropdown', relatedTarget) } return false } Dropdown.prototype.keydown = function (e) { if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) e.preventDefault() e.stopPropagation() if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') if (!isActive && e.which != 27 || isActive && e.which == 27) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } var desc = ' li:not(.disabled):visible a' var $items = $parent.find('.dropdown-menu' + desc) if (!$items.length) return var index = $items.index(e.target) if (e.which == 38 && index > 0) index-- // up if (e.which == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items.eq(index).trigger('focus') } // DROPDOWN PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.dropdown') if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.dropdown $.fn.dropdown = Plugin $.fn.dropdown.Constructor = Dropdown // DROPDOWN NO CONFLICT // ==================== $.fn.dropdown.noConflict = function () { $.fn.dropdown = old return this } // APPLY TO STANDARD DROPDOWN ELEMENTS // =================================== $(document) .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) }(jQuery); /* ======================================================================== * Bootstrap: modal.js v3.3.5 * http://getbootstrap.com/javascript/#modals * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // MODAL CLASS DEFINITION // ====================== var Modal = function (element, options) { this.options = options this.$body = $(document.body) this.$element = $(element) this.$dialog = this.$element.find('.modal-dialog') this.$backdrop = null this.isShown = null this.originalBodyPad = null this.scrollbarWidth = 0 this.ignoreBackdropClick = false if (this.options.remote) { this.$element .find('.modal-content') .load(this.options.remote, $.proxy(function () { this.$element.trigger('loaded.bs.modal') }, this)) } } Modal.VERSION = '3.3.5' Modal.TRANSITION_DURATION = 300 Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, keyboard: true, show: true } Modal.prototype.toggle = function (_relatedTarget) { return this.isShown ? this.hide() : this.show(_relatedTarget) } Modal.prototype.show = function (_relatedTarget) { var that = this var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) this.$element.trigger(e) if (this.isShown || e.isDefaultPrevented()) return this.isShown = true this.checkScrollbar() this.setScrollbar() this.$body.addClass('modal-open') this.escape() this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) this.$dialog.on('mousedown.dismiss.bs.modal', function () { that.$element.one('mouseup.dismiss.bs.modal', function (e) { if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true }) }) this.backdrop(function () { var transition = $.support.transition && that.$element.hasClass('fade') if (!that.$element.parent().length) { that.$element.appendTo(that.$body) // don't move modals dom position } that.$element .show() .scrollTop(0) that.adjustDialog() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') that.enforceFocus() var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) transition ? that.$dialog // wait for modal to slide in .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } Modal.prototype.hide = function (e) { if (e) e.preventDefault() e = $.Event('hide.bs.modal') this.$element.trigger(e) if (!this.isShown || e.isDefaultPrevented()) return this.isShown = false this.escape() this.resize() $(document).off('focusin.bs.modal') this.$element .removeClass('in') .off('click.dismiss.bs.modal') .off('mouseup.dismiss.bs.modal') this.$dialog.off('mousedown.dismiss.bs.modal') $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } Modal.prototype.enforceFocus = function () { $(document) .off('focusin.bs.modal') // guard against infinite focus loop .on('focusin.bs.modal', $.proxy(function (e) { if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { this.$element.trigger('focus') } }, this)) } Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { this.$element.off('keydown.dismiss.bs.modal') } } Modal.prototype.resize = function () { if (this.isShown) { $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) } else { $(window).off('resize.bs.modal') } } Modal.prototype.hideModal = function () { var that = this this.$element.hide() this.backdrop(function () { that.$body.removeClass('modal-open') that.resetAdjustments() that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } Modal.prototype.removeBackdrop = function () { this.$backdrop && this.$backdrop.remove() this.$backdrop = null } Modal.prototype.backdrop = function (callback) { var that = this var animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $(document.createElement('div')) .addClass('modal-backdrop ' + animate) .appendTo(this.$body) this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { if (this.ignoreBackdropClick) { this.ignoreBackdropClick = false return } if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus() : this.hide() }, this)) if (doAnimate) this.$backdrop[0].offsetWidth // force reflow this.$backdrop.addClass('in') if (!callback) return doAnimate ? this.$backdrop .one('bsTransitionEnd', callback) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback() } else if (!this.isShown && this.$backdrop) { this.$backdrop.removeClass('in') var callbackRemove = function () { that.removeBackdrop() callback && callback() } $.support.transition && this.$element.hasClass('fade') ? this.$backdrop .one('bsTransitionEnd', callbackRemove) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove() } else if (callback) { callback() } } // these following methods are used to handle overflowing modals Modal.prototype.handleUpdate = function () { this.adjustDialog() } Modal.prototype.adjustDialog = function () { var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight this.$element.css({ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' }) } Modal.prototype.resetAdjustments = function () { this.$element.css({ paddingLeft: '', paddingRight: '' }) } Modal.prototype.checkScrollbar = function () { var fullWindowWidth = window.innerWidth if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 var documentElementRect = document.documentElement.getBoundingClientRect() fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) } this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth this.scrollbarWidth = this.measureScrollbar() } Modal.prototype.setScrollbar = function () { var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) this.originalBodyPad = document.body.style.paddingRight || '' if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) } Modal.prototype.resetScrollbar = function () { this.$body.css('padding-right', this.originalBodyPad) } Modal.prototype.measureScrollbar = function () { // thx walsh var scrollDiv = document.createElement('div') scrollDiv.className = 'modal-scrollbar-measure' this.$body.append(scrollDiv) var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth this.$body[0].removeChild(scrollDiv) return scrollbarWidth } // MODAL PLUGIN DEFINITION // ======================= function Plugin(option, _relatedTarget) { return this.each(function () { var $this = $(this) var data = $this.data('bs.modal') var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.modal', (data = new Modal(this, options))) if (typeof option == 'string') data[option](_relatedTarget) else if (options.show) data.show(_relatedTarget) }) } var old = $.fn.modal $.fn.modal = Plugin $.fn.modal.Constructor = Modal // MODAL NO CONFLICT // ================= $.fn.modal.noConflict = function () { $.fn.modal = old return this } // MODAL DATA-API // ============== $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { var $this = $(this) var href = $this.attr('href') var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) if ($this.is('a')) e.preventDefault() $target.one('show.bs.modal', function (showEvent) { if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown $target.one('hidden.bs.modal', function () { $this.is(':visible') && $this.trigger('focus') }) }) Plugin.call($target, option, this) }) }(jQuery); /* ======================================================================== * Bootstrap: tooltip.js v3.3.5 * http://getbootstrap.com/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TOOLTIP PUBLIC CLASS DEFINITION // =============================== var Tooltip = function (element, options) { this.type = null this.options = null this.enabled = null this.timeout = null this.hoverState = null this.$element = null this.inState = null this.init('tooltip', element, options) } Tooltip.VERSION = '3.3.5' Tooltip.TRANSITION_DURATION = 150 Tooltip.DEFAULTS = { animation: true, placement: 'top', selector: false, template: '
    ', trigger: 'hover focus', title: '', delay: 0, html: false, container: false, viewport: { selector: 'body', padding: 0 } } Tooltip.prototype.init = function (type, element, options) { this.enabled = true this.type = type this.$element = $(element) this.options = this.getOptions(options) this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) this.inState = { click: false, hover: false, focus: false } if (this.$element[0] instanceof document.constructor && !this.options.selector) { throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') } var triggers = this.options.trigger.split(' ') for (var i = triggers.length; i--;) { var trigger = triggers[i] if (trigger == 'click') { this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) } else if (trigger != 'manual') { var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) } } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } Tooltip.prototype.getDefaults = function () { return Tooltip.DEFAULTS } Tooltip.prototype.getOptions = function (options) { options = $.extend({}, this.getDefaults(), this.$element.data(), options) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay, hide: options.delay } } return options } Tooltip.prototype.getDelegateOptions = function () { var options = {} var defaults = this.getDefaults() this._options && $.each(this._options, function (key, value) { if (defaults[key] != value) options[key] = value }) return options } Tooltip.prototype.enter = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true } if (self.tip().hasClass('in') || self.hoverState == 'in') { self.hoverState = 'in' return } clearTimeout(self.timeout) self.hoverState = 'in' if (!self.options.delay || !self.options.delay.show) return self.show() self.timeout = setTimeout(function () { if (self.hoverState == 'in') self.show() }, self.options.delay.show) } Tooltip.prototype.isInStateTrue = function () { for (var key in this.inState) { if (this.inState[key]) return true } return false } Tooltip.prototype.leave = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false } if (self.isInStateTrue()) return clearTimeout(self.timeout) self.hoverState = 'out' if (!self.options.delay || !self.options.delay.hide) return self.hide() self.timeout = setTimeout(function () { if (self.hoverState == 'out') self.hide() }, self.options.delay.hide) } Tooltip.prototype.show = function () { var e = $.Event('show.bs.' + this.type) if (this.hasContent() && this.enabled) { this.$element.trigger(e) var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this var $tip = this.tip() var tipId = this.getUID(this.type) this.setContent() $tip.attr('id', tipId) this.$element.attr('aria-describedby', tipId) if (this.options.animation) $tip.addClass('fade') var placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement var autoToken = /\s?auto?\s?/i var autoPlace = autoToken.test(placement) if (autoPlace) placement = placement.replace(autoToken, '') || 'top' $tip .detach() .css({ top: 0, left: 0, display: 'block' }) .addClass(placement) .data('bs.' + this.type, this) this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) this.$element.trigger('inserted.bs.' + this.type) var pos = this.getPosition() var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (autoPlace) { var orgPlacement = placement var viewportDim = this.getPosition(this.$viewport) placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : placement $tip .removeClass(orgPlacement) .addClass(placement) } var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) this.applyPlacement(calculatedOffset, placement) var complete = function () { var prevHoverState = that.hoverState that.$element.trigger('shown.bs.' + that.type) that.hoverState = null if (prevHoverState == 'out') that.leave(that) } $.support.transition && this.$tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() } } Tooltip.prototype.applyPlacement = function (offset, placement) { var $tip = this.tip() var width = $tip[0].offsetWidth var height = $tip[0].offsetHeight // manually read margins because getBoundingClientRect includes difference var marginTop = parseInt($tip.css('margin-top'), 10) var marginLeft = parseInt($tip.css('margin-left'), 10) // we must check for NaN for ie 8/9 if (isNaN(marginTop)) marginTop = 0 if (isNaN(marginLeft)) marginLeft = 0 offset.top += marginTop offset.left += marginLeft // $.fn.offset doesn't round pixel values // so we use setOffset directly with our own function B-0 $.offset.setOffset($tip[0], $.extend({ using: function (props) { $tip.css({ top: Math.round(props.top), left: Math.round(props.left) }) } }, offset), 0) $tip.addClass('in') // check to see if placing tip in new offset caused the tip to resize itself var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (placement == 'top' && actualHeight != height) { offset.top = offset.top + height - actualHeight } var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) if (delta.left) offset.left += delta.left else offset.top += delta.top var isVertical = /top|bottom/.test(placement) var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' $tip.offset(offset) this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { this.arrow() .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') .css(isVertical ? 'top' : 'left', '') } Tooltip.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) $tip.removeClass('fade in top bottom left right') } Tooltip.prototype.hide = function (callback) { var that = this var $tip = $(this.$tip) var e = $.Event('hide.bs.' + this.type) function complete() { if (that.hoverState != 'in') $tip.detach() that.$element .removeAttr('aria-describedby') .trigger('hidden.bs.' + that.type) callback && callback() } this.$element.trigger(e) if (e.isDefaultPrevented()) return $tip.removeClass('in') $.support.transition && $tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() this.hoverState = null return this } Tooltip.prototype.fixTitle = function () { var $e = this.$element if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') } } Tooltip.prototype.hasContent = function () { return this.getTitle() } Tooltip.prototype.getPosition = function ($element) { $element = $element || this.$element var el = $element[0] var isBody = el.tagName == 'BODY' var elRect = el.getBoundingClientRect() if (elRect.width == null) { // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) } var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null return $.extend({}, elRect, scroll, outerDims, elOffset) } Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } } Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { var delta = { top: 0, left: 0 } if (!this.$viewport) return delta var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 var viewportDimensions = this.getPosition(this.$viewport) if (/right|left/.test(placement)) { var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight if (topEdgeOffset < viewportDimensions.top) { // top overflow delta.top = viewportDimensions.top - topEdgeOffset } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset } } else { var leftEdgeOffset = pos.left - viewportPadding var rightEdgeOffset = pos.left + viewportPadding + actualWidth if (leftEdgeOffset < viewportDimensions.left) { // left overflow delta.left = viewportDimensions.left - leftEdgeOffset } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset } } return delta } Tooltip.prototype.getTitle = function () { var title var $e = this.$element var o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) return title } Tooltip.prototype.getUID = function (prefix) { do prefix += ~~(Math.random() * 1000000) while (document.getElementById(prefix)) return prefix } Tooltip.prototype.tip = function () { if (!this.$tip) { this.$tip = $(this.options.template) if (this.$tip.length != 1) { throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') } } return this.$tip } Tooltip.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) } Tooltip.prototype.enable = function () { this.enabled = true } Tooltip.prototype.disable = function () { this.enabled = false } Tooltip.prototype.toggleEnabled = function () { this.enabled = !this.enabled } Tooltip.prototype.toggle = function (e) { var self = this if (e) { self = $(e.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(e.currentTarget, this.getDelegateOptions()) $(e.currentTarget).data('bs.' + this.type, self) } } if (e) { self.inState.click = !self.inState.click if (self.isInStateTrue()) self.enter(self) else self.leave(self) } else { self.tip().hasClass('in') ? self.leave(self) : self.enter(self) } } Tooltip.prototype.destroy = function () { var that = this clearTimeout(this.timeout) this.hide(function () { that.$element.off('.' + that.type).removeData('bs.' + that.type) if (that.$tip) { that.$tip.detach() } that.$tip = null that.$arrow = null that.$viewport = null }) } // TOOLTIP PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tooltip') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tooltip $.fn.tooltip = Plugin $.fn.tooltip.Constructor = Tooltip // TOOLTIP NO CONFLICT // =================== $.fn.tooltip.noConflict = function () { $.fn.tooltip = old return this } }(jQuery); /* ======================================================================== * Bootstrap: popover.js v3.3.5 * http://getbootstrap.com/javascript/#popovers * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // POPOVER PUBLIC CLASS DEFINITION // =============================== var Popover = function (element, options) { this.init('popover', element, options) } if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') Popover.VERSION = '3.3.5' Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { placement: 'right', trigger: 'click', content: '', template: '

    ' }) // NOTE: POPOVER EXTENDS tooltip.js // ================================ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) Popover.prototype.constructor = Popover Popover.prototype.getDefaults = function () { return Popover.DEFAULTS } Popover.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() var content = this.getContent() $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' ](content) $tip.removeClass('fade top bottom left right in') // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do // this manually by checking the contents. if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() } Popover.prototype.hasContent = function () { return this.getTitle() || this.getContent() } Popover.prototype.getContent = function () { var $e = this.$element var o = this.options return $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) } Popover.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.arrow')) } // POPOVER PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.popover') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.popover', (data = new Popover(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.popover $.fn.popover = Plugin $.fn.popover.Constructor = Popover // POPOVER NO CONFLICT // =================== $.fn.popover.noConflict = function () { $.fn.popover = old return this } }(jQuery); /* ======================================================================== * Bootstrap: scrollspy.js v3.3.5 * http://getbootstrap.com/javascript/#scrollspy * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // SCROLLSPY CLASS DEFINITION // ========================== function ScrollSpy(element, options) { this.$body = $(document.body) this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) this.options = $.extend({}, ScrollSpy.DEFAULTS, options) this.selector = (this.options.target || '') + ' .nav li > a' this.offsets = [] this.targets = [] this.activeTarget = null this.scrollHeight = 0 this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) this.refresh() this.process() } ScrollSpy.VERSION = '3.3.5' ScrollSpy.DEFAULTS = { offset: 10 } ScrollSpy.prototype.getScrollHeight = function () { return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) } ScrollSpy.prototype.refresh = function () { var that = this var offsetMethod = 'offset' var offsetBase = 0 this.offsets = [] this.targets = [] this.scrollHeight = this.getScrollHeight() if (!$.isWindow(this.$scrollElement[0])) { offsetMethod = 'position' offsetBase = this.$scrollElement.scrollTop() } this.$body .find(this.selector) .map(function () { var $el = $(this) var href = $el.data('target') || $el.attr('href') var $href = /^#./.test(href) && $(href) return ($href && $href.length && $href.is(':visible') && [[$href[offsetMethod]().top + offsetBase, href]]) || null }) .sort(function (a, b) { return a[0] - b[0] }) .each(function () { that.offsets.push(this[0]) that.targets.push(this[1]) }) } ScrollSpy.prototype.process = function () { var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollHeight = this.getScrollHeight() var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() var offsets = this.offsets var targets = this.targets var activeTarget = this.activeTarget var i if (this.scrollHeight != scrollHeight) { this.refresh() } if (scrollTop >= maxScroll) { return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } if (activeTarget && scrollTop < offsets[0]) { this.activeTarget = null return this.clear() } for (i = offsets.length; i--;) { activeTarget != targets[i] && scrollTop >= offsets[i] && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) && this.activate(targets[i]) } } ScrollSpy.prototype.activate = function (target) { this.activeTarget = target this.clear() var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]' var active = $(selector) .parents('li') .addClass('active') if (active.parent('.dropdown-menu').length) { active = active .closest('li.dropdown') .addClass('active') } active.trigger('activate.bs.scrollspy') } ScrollSpy.prototype.clear = function () { $(this.selector) .parentsUntil(this.options.target, '.active') .removeClass('active') } // SCROLLSPY PLUGIN DEFINITION // =========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.scrollspy') var options = typeof option == 'object' && option if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.scrollspy $.fn.scrollspy = Plugin $.fn.scrollspy.Constructor = ScrollSpy // SCROLLSPY NO CONFLICT // ===================== $.fn.scrollspy.noConflict = function () { $.fn.scrollspy = old return this } // SCROLLSPY DATA-API // ================== $(window).on('load.bs.scrollspy.data-api', function () { $('[data-spy="scroll"]').each(function () { var $spy = $(this) Plugin.call($spy, $spy.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: tab.js v3.3.5 * http://getbootstrap.com/javascript/#tabs * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TAB CLASS DEFINITION // ==================== var Tab = function (element) { // jscs:disable requireDollarBeforejQueryAssignment this.element = $(element) // jscs:enable requireDollarBeforejQueryAssignment } Tab.VERSION = '3.3.5' Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () { var $this = this.element var $ul = $this.closest('ul:not(.dropdown-menu)') var selector = $this.data('target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } if ($this.parent('li').hasClass('active')) return var $previous = $ul.find('.active:last a') var hideEvent = $.Event('hide.bs.tab', { relatedTarget: $this[0] }) var showEvent = $.Event('show.bs.tab', { relatedTarget: $previous[0] }) $previous.trigger(hideEvent) $this.trigger(showEvent) if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return var $target = $(selector) this.activate($this.closest('li'), $ul) this.activate($target, $target.parent(), function () { $previous.trigger({ type: 'hidden.bs.tab', relatedTarget: $this[0] }) $this.trigger({ type: 'shown.bs.tab', relatedTarget: $previous[0] }) }) } Tab.prototype.activate = function (element, container, callback) { var $active = container.find('> .active') var transition = callback && $.support.transition && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) function next() { $active .removeClass('active') .find('> .dropdown-menu > .active') .removeClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', false) element .addClass('active') .find('[data-toggle="tab"]') .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition element.addClass('in') } else { element.removeClass('fade') } if (element.parent('.dropdown-menu').length) { element .closest('li.dropdown') .addClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', true) } callback && callback() } $active.length && transition ? $active .one('bsTransitionEnd', next) .emulateTransitionEnd(Tab.TRANSITION_DURATION) : next() $active.removeClass('in') } // TAB PLUGIN DEFINITION // ===================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tab') if (!data) $this.data('bs.tab', (data = new Tab(this))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tab $.fn.tab = Plugin $.fn.tab.Constructor = Tab // TAB NO CONFLICT // =============== $.fn.tab.noConflict = function () { $.fn.tab = old return this } // TAB DATA-API // ============ var clickHandler = function (e) { e.preventDefault() Plugin.call($(this), 'show') } $(document) .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) }(jQuery); /* ======================================================================== * Bootstrap: affix.js v3.3.5 * http://getbootstrap.com/javascript/#affix * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // AFFIX CLASS DEFINITION // ====================== var Affix = function (element, options) { this.options = $.extend({}, Affix.DEFAULTS, options) this.$target = $(this.options.target) .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) this.$element = $(element) this.affixed = null this.unpin = null this.pinnedOffset = null this.checkPosition() } Affix.VERSION = '3.3.5' Affix.RESET = 'affix affix-top affix-bottom' Affix.DEFAULTS = { offset: 0, target: window } Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { var scrollTop = this.$target.scrollTop() var position = this.$element.offset() var targetHeight = this.$target.height() if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false if (this.affixed == 'bottom') { if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' } var initializing = this.affixed == null var colliderTop = initializing ? scrollTop : position.top var colliderHeight = initializing ? targetHeight : height if (offsetTop != null && scrollTop <= offsetTop) return 'top' if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' return false } Affix.prototype.getPinnedOffset = function () { if (this.pinnedOffset) return this.pinnedOffset this.$element.removeClass(Affix.RESET).addClass('affix') var scrollTop = this.$target.scrollTop() var position = this.$element.offset() return (this.pinnedOffset = position.top - scrollTop) } Affix.prototype.checkPositionWithEventLoop = function () { setTimeout($.proxy(this.checkPosition, this), 1) } Affix.prototype.checkPosition = function () { if (!this.$element.is(':visible')) return var height = this.$element.height() var offset = this.options.offset var offsetTop = offset.top var offsetBottom = offset.bottom var scrollHeight = Math.max($(document).height(), $(document.body).height()) if (typeof offset != 'object') offsetBottom = offsetTop = offset if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) if (this.affixed != affix) { if (this.unpin != null) this.$element.css('top', '') var affixType = 'affix' + (affix ? '-' + affix : '') var e = $.Event(affixType + '.bs.affix') this.$element.trigger(e) if (e.isDefaultPrevented()) return this.affixed = affix this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null this.$element .removeClass(Affix.RESET) .addClass(affixType) .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') } if (affix == 'bottom') { this.$element.offset({ top: scrollHeight - height - offsetBottom }) } } // AFFIX PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.affix') var options = typeof option == 'object' && option if (!data) $this.data('bs.affix', (data = new Affix(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.affix $.fn.affix = Plugin $.fn.affix.Constructor = Affix // AFFIX NO CONFLICT // ================= $.fn.affix.noConflict = function () { $.fn.affix = old return this } // AFFIX DATA-API // ============== $(window).on('load', function () { $('[data-spy="affix"]').each(function () { var $spy = $(this) var data = $spy.data() data.offset = data.offset || {} if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom if (data.offsetTop != null) data.offset.top = data.offsetTop Plugin.call($spy, data) }) }) }(jQuery); sabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/js/src/bootstrap.js0000777000000000000000000000000013643326315032554 2bootstrap_3.3.5.jsustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/css/0000755000000000000000000000000013643326315024470 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/css/src/0000755000000000000000000000000013643326315025257 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/css/src/bootstrap.css0000777000000000000000000000000013643326315033260 2bootstrap_3.3.5.cssustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/bootstrap/css/src/bootstrap_3.3.5.css0000644000000000000000000043774613643326315030561 0ustar rootroot/*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { margin: .67em 0; font-size: 2em; } mark { color: #000; background: #ff0; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -.5em; } sub { bottom: -.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { height: 0; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { margin: 0; font: inherit; color: inherit; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { padding: .35em .625em .75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-spacing: 0; border-collapse: collapse; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { color: #000 !important; text-shadow: none !important; background: transparent !important; -webkit-box-shadow: none !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857143; color: #333; background-color: #fff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #337ab7; text-decoration: none; } a:hover, a:focus { color: #23527c; text-decoration: underline; } a:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; max-width: 100%; height: auto; padding: 4px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: all .2s ease-in-out; -o-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 20px; margin-bottom: 10px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10px; margin-bottom: 10px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small, .small { font-size: 85%; } mark, .mark { padding: .2em; background-color: #fcf8e3; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777; } .text-primary { color: #337ab7; } a.text-primary:hover, a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover, a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { background-color: #e4b9b9; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; margin-left: -5px; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-top: 0; margin-bottom: 20px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #777; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #eee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; text-align: right; border-right: 5px solid #eee; border-left: 0; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } address { margin-bottom: 20px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #fff; background-color: #333; border-radius: 3px; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; -webkit-box-shadow: none; box-shadow: none; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.42857143; color: #333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .row { margin-right: -15px; margin-left: -15px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0; } } table { background-color: transparent; } caption { padding-top: 8px; padding-bottom: 8px; color: #777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 20px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #ddd; } .table .table { background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } table col[class*="col-"] { position: static; display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { position: static; display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { min-height: .01%; overflow-x: auto; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { min-width: 0; padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 7px; font-size: 14px; line-height: 1.42857143; color: #555; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); } .form-control::-moz-placeholder { color: #999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999; } .form-control::-webkit-input-placeholder { color: #999; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 34px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { line-height: 46px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { min-height: 20px; padding-left: 20px; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-top: 4px \9; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .form-control-static { min-height: 34px; padding-top: 7px; padding-bottom: 7px; margin-bottom: 0; } .form-control-static.input-lg, .form-control-static.input-sm { padding-right: 0; padding-left: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-lg { height: 46px; line-height: 46px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .form-group-lg select.form-control { height: 46px; line-height: 46px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.3333333; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 42.5px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 34px; height: 34px; line-height: 34px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; background-color: #dff0d8; border-color: #3c763d; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; background-color: #fcf8e3; border-color: #8a6d3b; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; background-color: #f2dede; border-color: #a94442; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 25px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 27px; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .form-horizontal .control-label { padding-top: 7px; margin-bottom: 0; text-align: right; } } .form-horizontal .has-feedback .form-control-feedback { right: 15px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 14.333333px; font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.42857143; text-align: center; white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; touch-action: manipulation; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-image: none; border: 1px solid transparent; border-radius: 4px; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; opacity: .65; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333; background-color: #fff; border-color: #ccc; } .btn-default:focus, .btn-default.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #fff; border-color: #ccc; } .btn-default .badge { color: #fff; background-color: #333; } .btn-primary { color: #fff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; background-color: #204d74; border-color: #122b40; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #337ab7; border-color: #2e6da4; } .btn-primary .badge { color: #337ab7; background-color: #fff; } .btn-success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #fff; background-color: #398439; border-color: #255625; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #5cb85c; border-color: #4cae4c; } .btn-success .badge { color: #5cb85c; background-color: #fff; } .btn-info { color: #fff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #fff; } .btn-warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #fff; } .btn-danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #fff; } .btn-link { font-weight: normal; color: #337ab7; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity .15s linear; -o-transition: opacity .15s linear; transition: opacity .15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; -webkit-transition-duration: .35s; -o-transition-duration: .35s; transition-duration: .35s; -webkit-transition-property: height, visibility; -o-transition-property: height, visibility; transition-property: height, visibility; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); box-shadow: 0 6px 12px rgba(0, 0, 0, .175); } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #262626; text-decoration: none; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; background-color: #337ab7; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { right: 0; left: auto; } .dropdown-menu-left { right: auto; left: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #777; white-space: nowrap; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { content: ""; border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } .navbar-right .dropdown-menu-left { right: auto; left: 0; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-left-radius: 4px; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { display: table-cell; float: none; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 46px; line-height: 46px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; color: #555; text-align: center; background-color: #eee; border: 1px solid #ccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eee; } .nav > li.disabled > a { color: #777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eee; border-color: #337ab7; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eee #eee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555; cursor: default; background-color: #fff; border: 1px solid #ddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #fff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; background-color: #337ab7; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #fff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { padding-right: 15px; padding-left: 15px; overflow-x: visible; -webkit-overflow-scrolling: touch; border-top: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-right: 0; padding-left: 0; } } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; height: 50px; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } .navbar-form { padding: 10px 15px; margin-top: 8px; margin-right: -15px; margin-bottom: 8px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; } .navbar-text { margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { float: left; margin-right: 15px; margin-left: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; margin-right: -15px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777; } .navbar-default .navbar-nav > li > a { color: #777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #ccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555; background-color: #e7e7e7; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777; } .navbar-default .navbar-link:hover { color: #333; } .navbar-default .btn-link { color: #777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #ccc; } .navbar-inverse { background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #fff; background-color: #080808; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #ccc; content: "/\00a0"; } .breadcrumb > .active { color: #777; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; color: #337ab7; text-decoration: none; background-color: #fff; border: 1px solid #ddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 3; color: #23527c; background-color: #eee; border-color: #ddd; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #fff; cursor: default; background-color: #337ab7; border-color: #337ab7; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777; cursor: not-allowed; background-color: #fff; border-color: #ddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-top-left-radius: 6px; border-bottom-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-top-left-radius: 3px; border-bottom-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #777; cursor: not-allowed; background-color: #fff; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } a.label:hover, a.label:focus { color: #fff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #286090; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: middle; background-color: #777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; background-color: #fff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #eee; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 21px; font-weight: 200; } .jumbotron > hr { border-top-color: #d5d5d5; } .container .jumbotron, .container-fluid .jumbotron { border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 63px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 20px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: border .2s ease-in-out; -o-transition: border .2s ease-in-out; transition: border .2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-right: auto; margin-left: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #337ab7; } .thumbnail .caption { padding: 9px; color: #333; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #2b542c; } .alert-info { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #245269; } .alert-warning { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #66512c; } .alert-danger { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #843534; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); } .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; line-height: 20px; color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); -webkit-transition: width .6s ease; -o-transition: width .6s ease; transition: width .6s ease; } .progress-striped .progress-bar, .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -webkit-background-size: 40px 40px; background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { overflow: hidden; zoom: 1; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #fff; border: 1px solid #ddd; } .list-group-item:first-child { border-top-left-radius: 4px; border-top-right-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } a.list-group-item, button.list-group-item { color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { color: #555; text-decoration: none; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { color: #777; cursor: not-allowed; background-color: #eee; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #fff; background-color: #337ab7; border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #c7ddef; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success, button.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info, button.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger, button.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); box-shadow: 0 1px 1px rgba(0, 0, 0, .05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-right: 15px; padding-left: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { margin-bottom: 0; border: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333; background-color: #f5f5f5; border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, .15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000; text-shadow: 0 1px 0 #fff; filter: alpha(opacity=20); opacity: .2; } .close:hover, .close:focus { color: #000; text-decoration: none; cursor: pointer; filter: alpha(opacity=50); opacity: .5; } button.close { -webkit-appearance: none; padding: 0; cursor: pointer; background: transparent; border: 0; } .modal-open { overflow: hidden; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transition: -webkit-transform .3s ease-out; -o-transition: -o-transform .3s ease-out; transition: transform .3s ease-out; -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); box-shadow: 0 3px 9px rgba(0, 0, 0, .5); } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } .modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; } .modal-backdrop.in { filter: alpha(opacity=50); opacity: .5; } .modal-header { min-height: 16.42857143px; padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); box-shadow: 0 5px 15px rgba(0, 0, 0, .5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 12px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; filter: alpha(opacity=0); opacity: 0; line-break: auto; } .tooltip.in { filter: alpha(opacity=90); opacity: .9; } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #fff; text-align: center; background-color: #000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-left .tooltip-arrow { right: 5px; bottom: 0; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); box-shadow: 0 5px 10px rgba(0, 0, 0, .2); line-break: auto; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { content: ""; border-width: 10px; } .popover.top > .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999; border-top-color: rgba(0, 0, 0, .25); border-bottom-width: 0; } .popover.top > .arrow:after { bottom: 1px; margin-left: -10px; content: " "; border-top-color: #fff; border-bottom-width: 0; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999; border-right-color: rgba(0, 0, 0, .25); border-left-width: 0; } .popover.right > .arrow:after { bottom: -10px; left: 1px; content: " "; border-right-color: #fff; border-left-width: 0; } .popover.bottom > .arrow { top: -11px; left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999; border-bottom-color: rgba(0, 0, 0, .25); } .popover.bottom > .arrow:after { top: 1px; margin-left: -10px; content: " "; border-top-width: 0; border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999; border-left-color: rgba(0, 0, 0, .25); } .popover.left > .arrow:after { right: 1px; bottom: -10px; content: " "; border-right-width: 0; border-left-color: #fff; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: .6s ease-in-out left; -o-transition: .6s ease-in-out left; transition: .6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform .6s ease-in-out; -o-transition: -o-transform .6s ease-in-out; transition: transform .6s ease-in-out; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000px; perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { left: 0; -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { left: 0; -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { left: 0; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); filter: alpha(opacity=50); opacity: .5; } .carousel-control.left { background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); background-repeat: repeat-x; } .carousel-control.right { right: 0; left: auto; background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); background-repeat: repeat-x; } .carousel-control:hover, .carousel-control:focus { color: #fff; text-decoration: none; filter: alpha(opacity=90); outline: 0; opacity: .9; } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; margin-top: -10px; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; font-family: serif; line-height: 1; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); border: 1px solid #fff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #fff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -15px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -15px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-footer:before, .modal-footer:after { display: table; content: " "; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-right: auto; margin-left: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } /*# sourceMappingURL=bootstrap.css.map */ sabnzbd-develop/interfaces/Glitter/templates/static/javascripts/0000755000000000000000000000000013643326315024214 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/javascripts/src/0000755000000000000000000000000013643326315025003 5ustar rootrootsabnzbd-develop/interfaces/Glitter/templates/static/javascripts/src/knockout-3.4.0.js0000644000000000000000000105777413643326315027663 0ustar rootroot/*! * Knockout JavaScript library v3.4.0 * (c) Steven Sanderson - http://knockoutjs.com/ * License: MIT (http://www.opensource.org/licenses/mit-license.php) */ (function(){ var DEBUG=true; (function(undefined){ // (0, eval)('this') is a robust way of getting a reference to the global object // For details, see http://stackoverflow.com/questions/14119988/return-this-0-evalthis/14120023#14120023 var window = this || (0, eval)('this'), document = window['document'], navigator = window['navigator'], jQueryInstance = window["jQuery"], JSON = window["JSON"]; (function(factory) { // Support three module loading scenarios if (typeof define === 'function' && define['amd']) { // [1] AMD anonymous module define(['exports', 'require'], factory); } else if (typeof exports === 'object' && typeof module === 'object') { // [2] CommonJS/Node.js factory(module['exports'] || exports); // module.exports is for Node.js } else { // [3] No module loader (plain