pax_global_header00006660000000000000000000000064151622340560014516gustar00rootroot0000000000000052 comment=79f1ef9b90655d7270eb1ffab6aa08221a09db0f video-downloader-0.12.31/000077500000000000000000000000001516223405600151245ustar00rootroot00000000000000video-downloader-0.12.31/.gitignore000066400000000000000000000000531516223405600171120ustar00rootroot00000000000000*~ \#*\# /video-downloader_*.snap /po/*.mo video-downloader-0.12.31/COPYING000066400000000000000000001045141516223405600161640ustar00rootroot00000000000000 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 . video-downloader-0.12.31/README.md000066400000000000000000000043211516223405600164030ustar00rootroot00000000000000# Video Downloader [![Translation status](https://hosted.weblate.org/widgets/video-downloader/-/gui/svg-badge.svg)](https://hosted.weblate.org/engage/video-downloader/) Download videos from websites with an easy-to-use interface. Provides the following features: * Convert videos to MP3 * Supports password-protected and private videos * Download single videos or whole playlists * Automatically selects a video format based on your quality demands Based on [yt-dlp](https://github.com/yt-dlp/yt-dlp). ## Installation Download on Flathub ### Alternative installation methods * [Snap Store](https://snapcraft.io/video-downloader) * [Fedora](https://src.fedoraproject.org/rpms/video-downloader): `sudo dnf install video-downloader` * [Arch User Repository](https://aur.archlinux.org/packages/video-downloader) ## Translation We use [Weblate](https://hosted.weblate.org/engage/video-downloader/) to translate the UI, so feel free to contribute translations over there. ## Screenshots ![screenshot 1](https://raw.githubusercontent.com/Unrud/video-downloader/master/screenshots/1.png) ![screenshot 2](https://raw.githubusercontent.com/Unrud/video-downloader/master/screenshots/2.png) ![screenshot 3](https://raw.githubusercontent.com/Unrud/video-downloader/master/screenshots/3.png) ## Hidden configuration options The behavior of the program can be tweaked with GSettings. ### Automatic Subtitles List of additional automatic subtitles to download. The entry `all` matches all languages. The default is `[]`. #### Flatpak ``` flatpak run --command=gsettings com.github.unrud.VideoDownloader set com.github.unrud.VideoDownloader automatic-subtitles "['de','en']" ``` #### Snap ``` snap run --shell video-downloader -c 'gsettings "$@"' '' set com.github.unrud.VideoDownloader automatic-subtitles "['de','en']" ``` ## Debug To display messages from **yt-dlp** run program with the environment variable `G_MESSAGES_DEBUG=yt-dlp`. To display information about GOBject references, start the program with the environment variable `G_MESSAGES_DEBUG=gobject-ref`. video-downloader-0.12.31/build-aux/000077500000000000000000000000001516223405600170165ustar00rootroot00000000000000video-downloader-0.12.31/build-aux/meson/000077500000000000000000000000001516223405600201375ustar00rootroot00000000000000video-downloader-0.12.31/build-aux/meson/create-gresource.py000066400000000000000000000015701516223405600237530ustar00rootroot00000000000000import contextlib import os import sys import xml.etree.ElementTree as ET base_dirs = [ os.path.join(os.environ['MESON_SOURCE_ROOT'], os.environ['MESON_SUBDIR']), os.path.join(os.environ['MESON_BUILD_ROOT'], os.environ['MESON_SUBDIR']), ] _, prefix, *paths = sys.argv xml = ET.ElementTree() root_element = ET.Element('gresources') xml._setroot(root_element) resource_element = ET.Element('gresource') root_element.append(resource_element) resource_element.set('prefix', prefix) for path in paths: alias = path for base_dir in base_dirs: with contextlib.suppress(ValueError): alias = min(alias, os.path.relpath(path, base_dir), key=len) file_element = ET.Element('file') resource_element.append(file_element) file_element.set('alias', alias) file_element.text = path xml.write(sys.stdout.buffer, encoding='utf-8', xml_declaration=True) video-downloader-0.12.31/build-aux/meson/extract-xml.py000066400000000000000000000013001516223405600227530ustar00rootroot00000000000000import io import sys import xml.etree.ElementTree as ET from xml.sax import saxutils class CommentTreeBuilder(ET.TreeBuilder): def comment(self, data): self.start(ET.Comment, {}) self.data(data) self.end(ET.Comment) def make_xml_parser(): return ET.XMLParser(target=CommentTreeBuilder()) _, *flags, xml_path, search_xpath = sys.argv xml = ET.parse(xml_path, parser=make_xml_parser()) for element in xml.findall(search_xpath): xml._setroot(element) f = io.StringIO() xml.write(f, encoding='unicode') xml_text = f.getvalue() if '--escape' in flags: xml_text = saxutils.escape(xml_text) sys.stdout.buffer.write(xml_text.encode('utf-8')) video-downloader-0.12.31/build-aux/meson/merge-xml.py000066400000000000000000000011331516223405600224040ustar00rootroot00000000000000import sys import xml.etree.ElementTree as ET class CommentTreeBuilder(ET.TreeBuilder): def comment(self, data): self.start(ET.Comment, {}) self.data(data) self.end(ET.Comment) def make_xml_parser(): return ET.XMLParser(target=CommentTreeBuilder()) _, main_xml_path, insert_xml_path, insert_xpath = sys.argv main_xml = ET.parse(main_xml_path, parser=make_xml_parser()) insert_xml = ET.parse(insert_xml_path, parser=make_xml_parser()) main_xml.find(insert_xpath).append(insert_xml.getroot()) main_xml.write(sys.stdout.buffer, encoding='utf-8', xml_declaration=True) video-downloader-0.12.31/build-aux/meson/move.py000066400000000000000000000003621516223405600214600ustar00rootroot00000000000000from os import environ, path, sys from shutil import move destdir = environ.get('DESTDIR', '') prefix = environ['MESON_INSTALL_PREFIX'] source, dest = sys.argv[1:] move(destdir + path.join(prefix, source), destdir + path.join(prefix, dest)) video-downloader-0.12.31/com.github.unrud.VideoDownloader.json000066400000000000000000000213521516223405600243010ustar00rootroot00000000000000{ "app-id": "com.github.unrud.VideoDownloader", "runtime": "org.gnome.Platform", "runtime-version": "50", "sdk": "org.gnome.Sdk", "command": "video-downloader", "finish-args": [ "--share=network", "--share=ipc", "--socket=fallback-x11", "--device=dri", "--socket=wayland", "--filesystem=xdg-download/VideoDownloader:create" ], "cleanup": [ "/include", "/lib/pkgconfig", "/man", "/share/doc", "/share/gtk-doc", "/share/man", "/share/pkgconfig", "*.la", "*.a" ], "modules": [ { "name": "pyxattr", "buildsystem": "simple", "build-commands": [ "pip3 install --no-build-isolation --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/iustin/pyxattr/archive/refs/tags/v0.8.1.tar.gz", "sha256": "ce7ef783e751b96610a6eb32fc49a89340b5dc575fbe15054ce7935ebaf49edb", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/iustin/pyxattr/releases/latest", "version-query": ".tag_name", "url-query": "\"https://github.com/iustin/pyxattr/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "mutagen", "buildsystem": "simple", "build-commands": [ "pip3 install --no-build-isolation --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/quodlibet/mutagen/archive/refs/tags/release-1.47.0.tar.gz", "sha256": "f7489e19d375c31ba1962ab19e11eca8b9f86f05bfd99cef467f8dd875d8941e", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/quodlibet/mutagen/releases/latest", "version-query": ".tag_name", "url-query": "\"https://github.com/quodlibet/mutagen/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "pycryptodomex", "buildsystem": "simple", "build-commands": [ "touch .separate_namespace", "pip3 install --no-build-isolation --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/Legrandin/pycryptodome/archive/refs/tags/v3.23.0.tar.gz", "sha256": "5a905f0f4237b79aefee47f3e04568db2ecb70c55dd7cb118974c5260aa9e285", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/Legrandin/pycryptodome/tags", "version-query": "[.[].name | select(test(\"^v?[0-9.]+$\"))] | sort_by(sub(\"^v\"; \"\") | split(\".\") | map(tonumber))[-1]", "url-query": "\"https://github.com/Legrandin/pycryptodome/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "websockets", "buildsystem": "simple", "build-commands": [ "pip3 install --no-build-isolation --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/aaugustin/websockets/archive/refs/tags/16.0.tar.gz", "sha256": "c720700d313af5d1c61372da62d78c5b6192ed09871367df65a8e1087b60b1f0", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/aaugustin/websockets/tags", "version-query": "[.[].name | select(test(\"^v?[0-9.]+$\"))] | sort_by(sub(\"^v\"; \"\") | split(\".\") | map(tonumber))[-1]", "url-query": "\"https://github.com/aaugustin/websockets/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "brotli", "buildsystem": "simple", "build-commands": [ "pip3 install --no-build-isolation --prefix=/app ." ], "sources": [ { "type": "archive", "url": "https://github.com/google/brotli/archive/refs/tags/v1.2.0.tar.gz", "sha256": "816c96e8e8f193b40151dad7e8ff37b1221d019dbcb9c35cd3fadbfe6477dfec", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/google/brotli/releases/latest", "version-query": ".tag_name", "url-query": "\"https://github.com/google/brotli/archive/refs/tags/\" + $version + \".tar.gz\"" } } ] }, { "name": "deno", "buildsystem": "simple", "build-commands": [ "install -Dt /app/bin deno" ], "sources": [ { "type": "archive", "url": "https://github.com/denoland/deno/releases/download/v2.7.9/deno-x86_64-unknown-linux-gnu.zip", "sha256": "1d7e719118120b6e9bc6e3e76624a25732970e661d740d09bb930a3bc01119ff", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/denoland/deno/releases/latest", "version-query": ".tag_name", "url-query": ".assets[] | select(.name == \"deno-x86_64-unknown-linux-gnu.zip\").browser_download_url" }, "only-arches": [ "x86_64" ] }, { "type": "archive", "url": "https://github.com/denoland/deno/releases/download/v2.7.9/deno-aarch64-unknown-linux-gnu.zip", "sha256": "f8e13d1670ed0b3d955e7a218386e1b2c6b98c3eb7923d4cfa04f1bc73404ed9", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/denoland/deno/releases/latest", "version-query": ".tag_name", "url-query": ".assets[] | select(.name == \"deno-aarch64-unknown-linux-gnu.zip\").browser_download_url" }, "only-arches": [ "aarch64" ] } ] }, { "name": "yt-dlp-ejs", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app \"$(echo *.whl)\"" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/e3/bd/520769863744b669440a924271a6159ddd82ad5ae26b4ac4d4b69e9f8d44/yt_dlp_ejs-0.8.0-py3-none-any.whl", "sha256": "79300e5fca7f937a1eeede11f0456862c1b41107ce1d726871e0207424f4bdb4", "x-checker-data": { "type": "pypi", "name": "yt-dlp-ejs", "packagetype": "bdist_wheel" } } ] }, { "name": "yt-dlp", "buildsystem": "simple", "build-commands": [ "pip3 install --no-dependencies --prefix=/app \"$(echo *.whl)[default]\"" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/cd/13/5093bcb954878e50f7217fd2ab94282b53934022e4e4a03265582da83bf5/yt_dlp-2026.3.17-py3-none-any.whl", "sha256": "32992db94303a8a5d211a183f2174834fe7f8c29d83ed2e7a324eae97a8f26d8", "x-checker-data": { "type": "pypi", "name": "yt-dlp", "packagetype": "bdist_wheel" } } ] }, { "name": "video-downloader", "builddir": true, "buildsystem": "meson", "sources": [ { "type": "git", "path": "." } ] } ] } video-downloader-0.12.31/data/000077500000000000000000000000001516223405600160355ustar00rootroot00000000000000video-downloader-0.12.31/data/com.github.unrud.VideoDownloader-symbolic.svg000066400000000000000000000012361516223405600266560ustar00rootroot00000000000000 video-downloader-0.12.31/data/com.github.unrud.VideoDownloader.Source.svg000066400000000000000000000653631516223405600263110ustar00rootroot00000000000000 Adwaita Icon Template image/svg+xml GNOME Design Team Adwaita Icon Template Hicolor Symbolic video-downloader-0.12.31/data/com.github.unrud.VideoDownloader.desktop.in000066400000000000000000000007461516223405600263230ustar00rootroot00000000000000[Desktop Entry] Name=Video Downloader Comment=Download web videos Exec=video-downloader Icon=com.github.unrud.VideoDownloader Terminal=false Type=Application Categories=Network;GTK; StartupNotify=true X-GNOME-UsesNotifications=true Actions=new-window; # TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=YouTube;Download; [Desktop Action new-window] Name=New Window Exec=video-downloader video-downloader-0.12.31/data/com.github.unrud.VideoDownloader.gschema.xml000066400000000000000000000013341516223405600264450ustar00rootroot00000000000000 'xdg-download/VideoDownloader' false [] 'audio' 1080 video-downloader-0.12.31/data/com.github.unrud.VideoDownloader.metainfo-releases.xml.in000066400000000000000000000636411516223405600310570ustar00rootroot00000000000000
  • Update translations
  • Update translations
  • Update translations
  • Update German translation
  • Update Russian translation
  • Update translations
  • Fix Chinese translation not working
  • Update Chinese translation
  • Update German translation
  • Update Norwegian translation
  • Update Portuguese translation
  • Update Swedish translation
  • Update Arabic translation
  • Update Greek translation
  • Update Portuguese (Brazil) translation
  • Add Arabic translation
  • Update Catalan translation
  • Update Uzbek translation
  • Add Tamil translation
  • Update Indonesian translation
  • Update Catalan translation
  • Only check file extension when mode is "audio"
  • Limit ID length
  • Add Basque translation
  • Add Portuguese (Brazil) translation
  • Fix download not starting in rare circumstances
  • Update Polish translation
  • Update Romanian translation
  • Update Belarusian translation
  • Update Chinese translation
  • Update Czech translation
  • Update Hebrew translation
  • Update Portuguese translation
  • Update Portuguese translation
  • Update Ukrainian translation
  • Add Greek translation
  • Add Polish translation
  • Limit status text update rate
  • Add Estonian translation
  • Update French translation
  • Add Finnish translation
  • Update Dutch translation
  • Update Italian translation
  • Update Russian translation
  • Update Slovak translation
  • Update Croatian translation
  • Update Czech translation
  • Update Dutch translation
  • Update Hindi translation
  • Update Hungarian translation
  • Update Japanese translation
  • Update Spanish translation
  • Update Swedish translation
  • Update Turkish translation
  • Update Ukrainian translation
  • Update Appdata
  • Workaround for xdg-desktop-portal bug that causes FileNotFoundError
  • Add Hindi translation
  • Update Uzbek translation
  • Add Kurdish translation
  • Display of downloaded titles on the success page and in the notification
  • Improved readability of links in the details view in dark mode
  • Skip missing thumbnails and subtitles
  • Update Slovak translation
  • Update Persian translation
  • Update Czech translation
  • Add Spanish translation
  • Update Ukrainian translation
  • Add Chinese (Simplified) translation
  • Update Indonesian translation
  • Add Chinese (Traditional) translation
  • Add Romanian translation
  • Fix display state of "Prefer MPEG format" switch after startup
  • Add Korean translation
  • Add Hebrew translation
  • Update Catalan translation
  • Show filenames when download is finished
  • Fix open download location without OpenURI portal
  • Add Indonesian translation
  • Update Croatian translation
  • Update Czech translation
  • Update Italian translation
  • Update Japanese translation
  • Add Belarusian translation
  • Update Dutch translation
  • Update Hungarian translation
  • Update Portuguese translation
  • Update Russian translation
  • Update German translation
  • Add option to change download folder
  • Fix opening download location when file deleted
  • Add Norwegian translation
  • Add Ukrainian translation
  • Update French translation
  • Update Italian translation
  • Update Spanish translation
  • Update Swedish translation
  • Update Turkish translation
  • Workaround for focusing the URL input field at program startup
  • Update French translation
  • Update Italian translation
  • Skip unavailable videos
  • Add switch to prefer MPEG format
  • Add tooltips
  • Add navigation shortcuts
  • Update Turkish translation
  • Improve about dialog
  • Update translations
  • Show library versions and environment in about dialog
  • Fix display activity during MP3 conversion
  • Update Hungarian translation
  • Use OpenURI portal
  • Redesign start page
  • Update French translation
  • Update German translation
  • Update Italian translation
  • Add keyboard shortcuts
  • Improve keyboard navigation
  • New start page layout
  • Fix memory leaks
  • Remove dark/light switcher
  • Remove metadata migration
  • Fix dialog cancel button
  • Remove quotation marks in URL input field when opening a new window
  • Update French translation
  • Switch to GTK 4
  • Set fixed height for thumbnail
  • Trim whitespace of shortened file names
  • Fix dialog windows blocking all instances
  • Apply settings immediately
  • Remove file-based locking
  • Update Turkish translation
  • Add support for freedesktop color-scheme preference
  • Add Russian translation
  • Add Uzbek translation
  • Update Spanish translation
  • Set input purpose of entry widgets
  • Fix subtitles containing multiple consecutive captions with leading spaces
  • Select automatic subtitles based on locale settings
  • Add support for translated subtitles
  • Minor improvements
  • Fix playlist download
  • Fix subtitles containing captions with leading spaces
  • Add automatic-subtitles setting
  • Switch from youtube-dl to yt-dlp
  • Download subtitles only once
  • Don't download subtitles and thumbnail while discovering playlists
  • Save info json and thumbnail in *.part directory
  • Improve prefer-mpeg setting
  • Add Catalan translation
  • Fix tests for Python<3.9
  • Fix tests
  • Update Croatian translation
  • Update Czech translation
  • Improve detection of authentication requests
  • Fix download error when video id is too long
  • Fix reporting of FFMPEG error message
  • Add Turkish translation
  • Improve compatibility of notifications with some desktop environments
  • Fix minor bug which could cause downloads to fail under rare circumstances
  • Update Slovak translation
  • Fix cancelling when external downloader is used by youtube-dl
  • Fix warning when closing window while download is in progress
  • Show notification when download is finished
  • Add "New Window" to menu
  • Update Hungarian translation
  • Run single instance with multiple windows
  • Update Dutch translation
  • Improve UI
  • Update Croatian translation
  • Add Croatian translation
  • Exclude release notes from translations
  • Add Czech translation
  • Update Italian translation
  • Redesign finish and error page
  • Don't save video description
  • Update Dutch translation
  • Add shortcut for menu
  • Implement dark mode switcher
  • Add Portuguese translation
  • Add Swedish translation
  • Update Japanese translation
  • Update italian translation
  • Use adaptive layout
  • Add about dialog
  • youtube-dl is back
  • Update dutch translation
  • Add slovak translation
  • Enable farsi/persian translation
  • Display unexpected errors
  • Add farsi/persian translation
  • Update hungarian translation
  • Update italian translation
  • Embed metadata
  • Add hungarian translation
  • Allow download to filesystem without xattr support
  • Improve error handling
  • Show activity while converting audio to MP3
  • Skip unsupported subtitles preventing download failure
  • Improve format selection
  • Ignore unsupported locale error
  • Add dutch translation
  • New logo (by @bertob)
  • Embed subtitles in videos
  • Fix download of incompatible audio and video formats
  • Kill remaining subprocesses of youtube-dl when cancelling downloads and exiting program
  • New logo
  • Add symbolic icon
  • Save downloads as TITLE.EXT (instead of TITLE-ID-FORMAT.EXT)
  • Store all partial files for a download in a folder named TITLE.part
  • Skip audio files that are already downloaded
  • Polish the GUI (by @Kekun)
  • Display errors accessing the download folder in the GUI
  • Use file-based locking to prevent multiple instances breaking downloads by writing to the same partial files
  • Cleanup temporary files of cancelled downloads
  • Remove ImageMagick dependency
  • New logo
  • Fix zero division error causing some downloads to fail
  • Retry downloads up to 10 times before giving up
  • Limit title length to 150 characters in file names
  • Fix bugs with thumbnails in unsupported formats
  • Limit size of thumbnails to 1024x1024 pixel
  • Add Japanese translation
  • Add French translation
  • Add action to open new window (Middle-click in Gnome Shell)
  • Allow skipping videos that require authentication
  • Fix detection of private videos
  • Add --url=URL commandline argument
  • Add Italian and Spanish translation
  • Show downloaded file in file manager
  • Add German translation

Fix format selection for extractors that provide either video width or height.

  • Save thumbnail in audio files
  • Save metadata in extended attributes
  • Snap/Flatpak: Remove support for RTMP
  • Snap: Remove video-downloader.youtube-dl

Stop downloader in case of error.

  • Allow multiple instances
  • Add description to authentication requests
  • Add format id to filenames
  • Fix download of files bigger than 4 GiB

Fix link to download folder.

Remember last settings and switch to GTK.

Adjust menu colors to theme.

Fix crash with non-integer X DPI.

Move AppData to metainfo.

Download all videos in playlist.

Set window icon.

Make window resizeable and fix font sizes.

Stop progress bar jumping around.

Support videos with emoticons in the title.

Initial release.

video-downloader-0.12.31/data/com.github.unrud.VideoDownloader.metainfo.xml.in000066400000000000000000000041401516223405600272430ustar00rootroot00000000000000 com.github.unrud.VideoDownloader CC0-1.0 GPL-3.0-or-later Video Downloader Download web videos

Download videos from websites with an easy-to-use interface. Provides the following features:

  • Convert videos to MP3
  • Supports password-protected and private videos
  • Download single videos or whole playlists
  • Automatically selects a video format based on your quality demands

Based on yt-dlp.

com.github.unrud.VideoDownloader.desktop https://github.com/Unrud/video-downloader/issues https://github.com/Unrud/video-downloader https://github.com/Unrud/video-downloader https://hosted.weblate.org/engage/video-downloader/ Unrud Unrud #ffbe6f #81111e unrud_AT_outlook.com video-downloader https://raw.githubusercontent.com/Unrud/video-downloader/v0.12.31/screenshots/1.png https://raw.githubusercontent.com/Unrud/video-downloader/v0.12.31/screenshots/2.png https://raw.githubusercontent.com/Unrud/video-downloader/v0.12.31/screenshots/3.png
video-downloader-0.12.31/data/com.github.unrud.VideoDownloader.svg000066400000000000000000000054151516223405600250420ustar00rootroot00000000000000 video-downloader-0.12.31/data/meson.build000066400000000000000000000050271516223405600202030ustar00rootroot00000000000000desktop_file = i18n.merge_file( input: 'com.github.unrud.VideoDownloader.desktop.in', output: 'com.github.unrud.VideoDownloader.desktop', type: 'desktop', po_dir: '../po', install: true, install_dir: get_option('datadir') / 'applications', ) desktop_utils = find_program('desktop-file-validate', required: false) if desktop_utils.found() test('Validate desktop file', desktop_utils, args: [desktop_file], ) endif base_appstream_file = i18n.merge_file( input: 'com.github.unrud.VideoDownloader.metainfo.xml.in', output: 'com.github.unrud.VideoDownloader-base.metainfo.xml', po_dir: '../po', ) appstream_file = custom_target('com.github.unrud.VideoDownloader.metainfo.xml', input: [ base_appstream_file, 'com.github.unrud.VideoDownloader.metainfo-releases.xml.in', ], output: 'com.github.unrud.VideoDownloader.metainfo.xml', command: [ python, merge_xml_aux, '@INPUT0@', '@INPUT1@', '.', ], capture: true, install: true, install_dir: get_option('datadir') / 'metainfo', ) appstream_util = find_program('appstream-util', required: false) if appstream_util.found() test('Validate appstream file', appstream_util, args: ['validate-relax', appstream_file], ) endif install_data('com.github.unrud.VideoDownloader.gschema.xml', install_dir: get_option('datadir') / 'glib-2.0' / 'schemas', ) compile_schemas = find_program('glib-compile-schemas', required: false) if compile_schemas.found() test('Validate schema file', compile_schemas, args: ['--strict', '--dry-run', meson.current_source_dir()], ) endif icon_id = 'com.github.unrud.VideoDownloader' icon_svg = icon_id + '.svg' install_data(icon_svg, install_dir: get_option('datadir') / 'icons' / 'hicolor' / 'scalable' / 'apps', ) install_data(icon_id + '-symbolic.svg', install_dir: get_option('datadir') / 'icons' / 'hicolor' / 'symbolic' / 'apps', ) rsvg_util = find_program('rsvg-convert') foreach res : [16, 32, 48, 64, 128, 256, 512] icon_install_dir = ( get_option('datadir') / 'icons' / 'hicolor' / '@0@x@0@'.format(res) / 'apps' ) icon_png = '@0@_@1@.png'.format(icon_id, res) custom_target(icon_png, input: icon_svg, output: icon_png, command: [ rsvg_util, '--height', '@0@'.format(res), '--keep-aspect-ratio', '--format', 'png', '--output', '@OUTPUT@', '@INPUT@', ], install: true, install_dir: icon_install_dir, ) # rename icon after installation meson.add_install_script(python, move_aux, icon_install_dir / icon_png, icon_install_dir / icon_id + '.png', ) endforeach video-downloader-0.12.31/meson.build000066400000000000000000000023551516223405600172730ustar00rootroot00000000000000project('video-downloader', version: '0.12.31', meson_version: '>= 0.62.0', default_options: ['warning_level=2', 'werror=false'], ) python_sources_for_linting = [] i18n = import('i18n') gnome = import('gnome') python = import('python').find_installation('python3') python_for_linting = import('python').find_installation('python3', modules: ['flake8'], required: false, ) create_gresource_aux = meson.current_source_dir() / 'build-aux' / 'meson' / 'create-gresource.py' python_sources_for_linting += create_gresource_aux extract_xml_aux = meson.current_source_dir() / 'build-aux' / 'meson' / 'extract-xml.py' python_sources_for_linting += extract_xml_aux merge_xml_aux = meson.current_source_dir() / 'build-aux' / 'meson' / 'merge-xml.py' python_sources_for_linting += merge_xml_aux move_aux = meson.current_source_dir() / 'build-aux' / 'meson' / 'move.py' python_sources_for_linting += move_aux subdir('data') subdir('src') subdir('po') gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true, update_desktop_database: true, ) if (python_for_linting.found() and python_sources_for_linting.length() > 0) test('Lint python sources', python_for_linting, args: ['-m', 'flake8', python_sources_for_linting], ) endif video-downloader-0.12.31/po/000077500000000000000000000000001516223405600155425ustar00rootroot00000000000000video-downloader-0.12.31/po/LINGUAS000066400000000000000000000002051516223405600165640ustar00rootroot00000000000000ar be ca ckb cs de el es et eu fa fi fr gl he hi hr hu hy id it ja ka ko nb nl pl pt pt_BR ro ru sk sl sv ta tr uk uz vi zh_CN zh_TW video-downloader-0.12.31/po/POTFILES000066400000000000000000000010101516223405600167020ustar00rootroot00000000000000data/com.github.unrud.VideoDownloader.metainfo.xml.in data/com.github.unrud.VideoDownloader.desktop.in data/com.github.unrud.VideoDownloader.gschema.xml src/about_dialog.py src/about_dialog.ui.in src/authentication_dialog.py src/authentication_dialog_login.ui src/authentication_dialog_password.ui src/main.py src/model.py src/playlist_dialog.py src/shortcuts_dialog.py src/shortcuts_dialog.ui src/util/connection.py src/util/__init__.py src/util/path.py src/util/response.py src/util/rpc.py src/window.py src/window.ui video-downloader-0.12.31/po/ar.po000066400000000000000000000166321516223405600165140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # The Best Way , 2025. # Ahmed Najmawi , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-07-29 21:15+0000\n" "Last-Translator: Ahmed Najmawi \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Weblate 5.13-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Ù…Ù�نزّÙ�Ù„ الÙ�يديوهات" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "نزّÙ�Ù„ Ù�يديوهات الوÙ�ب" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "نزّÙ�Ù„ الÙ�يديوهات من مواقع الوÙ�ب مع واجهة سهلة الاستخدام. يوÙ�Ù‘Ù�ر التطبيق المزايا " "التالية:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "تحويل الÙ�يديوهات إلى MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "دعم للÙ�يديوهات الخاصة والمحمية بكلمة سر" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "تنزيل Ù�يديوهات Ù�ردية أو قوائم تشغيل كاملة" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "اختيار نسق الÙ�يديو بناءً على متطلباتك للجودة آليًا" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "يستند إلى yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "اليوتيوب;التنزيل;منزل الÙ�يديوهات;YouTube;Download;Video Downloader;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "ناÙ�ذة جديدة" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "الاستيثاق مطلوب" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ألغÙ�" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Ù„Ù�ج" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "تخطَّ" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "الÙ�يديو ليس عامًا." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "اسم المستخدم" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "كلمة السر" #: src/main.py:38 msgid "Prefill URL field" msgstr "حقل مسار الملء الآلي" #: src/model.py:67 msgid "Best" msgstr "الأÙ�ضل" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "مجلد التنزيل غير صالح" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "ليس دليلًا" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "رÙ�Ù�ض الإذن" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "أأنزّÙ�Ù„ قائمة التشغيل؟" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "الÙ�يديو جزء من قائمة التشغيل." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Ù�يديو واحد" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "جميع الÙ�يديوهات Ù�ÙŠ قائمة التشغيل" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "عام" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "اÙ�تح القائمة" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "أغلÙ�Ù‚ الناÙ�ذة" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "اخرÙ�ج" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "اختصارات لوحة المÙ�اتيح" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "التنقل" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "عÙ�د" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "حوّÙ�Ù„ إلى الصوتي" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "حوّÙ�Ù„ إلى الÙ�يديو" #: src/window.py:187 msgid "Downloading" msgstr "ينزّÙ�Ù„" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} من {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "مجهول" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "تعذَّر التنزيل" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "انتهى التنزيل" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "اÙ�تح موقع التنزيل" #: src/window.py:329 msgid "Reset to Default" msgstr "صÙ�Ù‘Ù�ر إلى المبدئي" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "غيّÙ�ر موقع التنزيل" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ø­Ù�دّÙ�د مجلد غير صالح" #: src/window.py:364 msgid "Select Folder" msgstr "حدّÙ�د المجلد" #: src/window.ui:41 msgid "About Video Downloader" msgstr "عَنْ «مÙ�نزّÙ�Ù„ الÙ�يديوهات»" #: src/window.ui:91 msgid "Main Menu" msgstr "القائمة الرئيسة" #: src/window.ui:105 msgid "Audio" msgstr "صوتي" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "المسار" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "نزّÙ�Ù„" #: src/window.ui:156 msgid "Video" msgstr "Ù�يديو" #: src/window.ui:186 msgid "Resolution" msgstr "الدقة" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Ù�ضّÙ�Ù„ نسق MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "عÙ�د" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "التÙ�اصيل" video-downloader-0.12.31/po/be.po000066400000000000000000000172731516223405600165020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Troja , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-08-02 23:04+0000\n" "Last-Translator: Troja \n" "Language-Team: Belarusian \n" "Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Спампуйце відÑ�а з вÑ�б-Ñ�айтаў" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Спампоўвайце відÑ�а з вÑ�б-Ñ�айтаў з проÑ�тым у выкарыÑ�танні інтÑ�рфейÑ�ам. " "ПрадаÑ�таўлÑ�е наÑ�тупныÑ� магчымаÑ�ці:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Канвертаваць відÑ�а Ñž MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Падтрымлівае абароненыÑ� паролем Ñ– прыватныÑ� відÑ�а" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Спампуйце аÑ�обныÑ� відÑ�а ці цÑ�лыÑ� Ñ�піÑ�Ñ‹ прайграваннÑ�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Ð�ўтаматычна выбірае фармат відÑ�а Ñž залежнаÑ�ці ад вашых патрабаваннÑ�Ñž да " "Ñ�каÑ�ці" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "ЗаÑ�наваны на yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Спампаваць;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Ð�овае акно" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Патрабуецца аўтÑ�нтыфікацыÑ�" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Ð�дмÑ�ніць" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "УвайÑ�ці" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "ПрапуÑ�ціць" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "ВідÑ�а не з'Ñ�ўлÑ�ецца агульнадаÑ�тупным." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "ІмÑ� карыÑ�тальніка" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Пароль" #: src/main.py:38 msgid "Prefill URL field" msgstr "Поле URL профілю" #: src/model.py:67 msgid "Best" msgstr "Ð�айлепшае" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ð�Ñ�правільнаÑ� папка Ñ�пампоўкі" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ð�е каталог" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "У доÑ�тупе адмоўлена" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Спампаваць Ñ�піÑ� прайграваннÑ�?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "ВідÑ�а з'Ñ�ўлÑ�ецца чаÑ�ткай плÑ�йліÑ�та." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Ð�Ñ�обнае відÑ�а" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "УÑ�е відÑ�а Ñž Ñ�піÑ�е прайграваннÑ�" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Ð�гульны" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ð�дкрыць меню" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Зачыніць акно" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "ВыйÑ�ці" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "СпалучÑ�нні клавіш" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Ð�авігацыÑ�" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Ð’Ñ�рнуцца назад" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Пераключыцца на Ð�ўдыё" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Пераключыцца на ВідÑ�а" #: src/window.py:187 msgid "Downloading" msgstr "Спампоўка" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} з {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "невÑ�дома" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Памылка Ñ�пампоўкі" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Спампоўка Ñ�кончана" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Ð�дкрыйце меÑ�цазнаходжанне загрузкі" #: src/window.py:329 msgid "Reset to Default" msgstr "Скід па змаўчанні" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "ЗмÑ�ніць меÑ�ца загрузкі" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Выбрана нÑ�правільнаÑ� папка" #: src/window.py:364 msgid "Select Folder" msgstr "Выберыце папку" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Ð�б Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Галоўнае меню" #: src/window.ui:105 msgid "Audio" msgstr "Ð�ўдыё" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Спампаваць" #: src/window.ui:156 msgid "Video" msgstr "ВідÑ�а" #: src/window.ui:186 msgid "Resolution" msgstr "Дазвол" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Ð�ддайце перавагу фармату MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Ð�азад" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "ДÑ�талі" video-downloader-0.12.31/po/ca.po000066400000000000000000000160021516223405600164640ustar00rootroot00000000000000# Catalan translation for video-downloader. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Ã�car N. S. , 2021. # Roger VC , 2023. # Eder Etxebarria Rojo , 2024. # pau oliveres , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-03-28 09:01+0000\n" "Last-Translator: pau oliveres \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.11-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Descarregador de vídeo" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Descarrega vídeos de la web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Descarrega vídeos des de llocs web amb una interfície fàcil d'usar. Suporta " "les següents característiques:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converteix vídeos a MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Suporta vídeos protegits per contrasenya i privats" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Descarrega vídeos individuals o llistes de reproducció completes" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Selecciona automàticament un format de vídeo basat en la vostra resolució " "preferida" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basat en yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "Youtube;Descarrega;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Finestra nova" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Cal autenticació" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancel·la" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Inicia la sessió" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Omet" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "El vídeo no és públic." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nom d'usuari" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Contrasenya" #: src/main.py:38 msgid "Prefill URL field" msgstr "Omple el camp de la URL" #: src/model.py:67 msgid "Best" msgstr "Millor" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Carpeta de baixada no vàlida" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "No és un directori" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permís denegat" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Voleu baixar la llista de reproducció?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "El vídeo forma part d'una llista de reproducció." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Un sol vídeo" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Tots els vídeos a la llista de reproducció" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "General" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Obre el menú" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Tanca la finestra" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Surt" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Dreceres del teclat" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navegació" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Ves enrere" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Canviar a Àudio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Canviar a Vídeo" #: src/window.py:187 msgid "Downloading" msgstr "S'està baixant" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "desconegut" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Ha fallat la baixada" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "La baixada ha finalitzat" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Obre la ubicació de la descàrrega" #: src/window.py:329 msgid "Reset to Default" msgstr "Restableix al valor per defecte" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Canviar la ubicació de baixada" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Carpeta seleccionada no vàlida" #: src/window.py:364 msgid "Select Folder" msgstr "Seleccionar carpeta" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Sobre el Descarregador de vídeo" #: src/window.ui:91 msgid "Main Menu" msgstr "Menú principal" #: src/window.ui:105 msgid "Audio" msgstr "Àudio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Baixa" #: src/window.ui:156 msgid "Video" msgstr "Vídeo" #: src/window.ui:186 msgid "Resolution" msgstr "Resolució" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Prefereix el format MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Enrere" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalls" video-downloader-0.12.31/po/ckb.po000066400000000000000000000172151516223405600166470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # "Hoshmand M. Qadir" , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2023-10-14 21:23+0000\n" "Last-Translator: \"Hoshmand M. Qadir\" \n" "Language-Team: Kurdish (Central) \n" "Language: ckb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.1-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "دابەزێنەری ڤیدیۆ" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 #, fuzzy msgid "Download web videos" msgstr "داگرتنی ڤیدیۆ Ù„Û• ماڵپەڕەکانی ÙˆÛ•Ú© یوتیوب Ùˆ چەندانی تر" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "داگرتنی ڤیدیۆ Ù„Û• ماڵپەڕەکانەوە بە ڕووکارێکی ئاسان بۆ بەکارهێنان. ئەم " "تایبەتمەندیانەی خوارەوە Ù¾ÛŽØ´Ú©Û•Ø´ دەکات:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "گۆڕینی ڤیدیۆکان بۆ MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "پشتگیری Ù„Û• ڤیدیۆی پارێزراو بە وشەی نهێنی Ùˆ تایبەت دەکات" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "تاکە ڤیدیۆ یان تەواوی پلەی لیستەکان دابەزێنە" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "بە شێوەیەکی ئۆتۆماتیکی Ù�ۆرماتێکی ڤیدیۆیی هەڵدەبژێرێت بە پشتبەستن بە " "داواکارییەکانی کوالیتی" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "لەسەر بنەمای yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "پەنجەرەی نوێ" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "سەلماندن پێویستە" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ڕەتکردنەوە" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "چوونە ژوورەوە" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "پەڕاندن" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "ڤیدیۆکە گشتی نییە." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "ناوی بەکارهێنەر" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "وشەی نهێنی" #: src/main.py:38 msgid "Prefill URL field" msgstr "مەیدانی URL Ù¾ÛŽØ´ پڕکردنەوە" #: src/model.py:67 msgid "Best" msgstr "باشترین" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ù�ۆڵدەری دابەزاندنی نادروست" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ù�ۆڵدەر نییە" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "مۆڵەت ڕەتکرایەوە" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "داگرتنی پلەی لیست؟" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "ڤیدیۆکە بەشێکە Ù„Û• پلەی لیستێک." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "تاکە ڤیدیۆ" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "هەموو ڤیدیۆکان Ù„Û• پلەیلیستدان" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "گشتی" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ù…ÛŽÙ†Û† بکەرەوە" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "پەنجەرەکە داخە" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "دەرچوون" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "کورتکراوەکانی تەختەکلیل" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "گەڕان" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "بگەڕێوە دواوە" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "بگۆڕە بۆ دەنگ" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "بگۆڕە بۆ ڤیدیۆ" #: src/window.py:187 msgid "Downloading" msgstr "دابەزاندن" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} Ù„Û• {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "نەزانراو" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "داگرتنەکە سەرکەوتوو نەبوو" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "داگرتن تەواو بوو" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "شوێنی دابەزاندن بکەرەوە" #: src/window.py:329 msgid "Reset to Default" msgstr "ڕێست بکە بۆ باری سەرەکی" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "گۆڕینی شوێنی دابەزاندن" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ù�ۆڵدەری نادروست هەڵبژێردرا" #: src/window.py:364 msgid "Select Folder" msgstr "Ù�ۆڵدەر هەڵبژێرە" #: src/window.ui:41 msgid "About Video Downloader" msgstr "دەربارەی ڤیدیۆ دابەزێنەر" #: src/window.ui:91 msgid "Main Menu" msgstr "لیستی سه‌ره‌كی" #: src/window.ui:105 msgid "Audio" msgstr "دەنگ" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "دابەزاندن" #: src/window.ui:156 msgid "Video" msgstr "ڤیدیۆ" #: src/window.ui:186 msgid "Resolution" msgstr "ڕونی" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Ù�ۆرماتەکەی MPEG بە باشتر دەزانرێت" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "گەڕانەوە" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "ووردەکاریەکان" video-downloader-0.12.31/po/cs.po000066400000000000000000000154551516223405600165210ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # VojtÄ›ch Perník , 2021. # vikdevelop , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-08-02 23:04+0000\n" "Last-Translator: vikdevelop \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Stahování videí z webu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Stahujte videa z internetu pomocí jednoduchého rozhraní s následujícími " "funkcemi:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "PÅ™evod videí do MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Podpora zaheslovaných a soukromých videí" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Stažení jednoho videa nebo celých playlistů" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Automatický výbÄ›r formátu videa podle zvolených požadavků na kvalitu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Založen na yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nové okno" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Je vyžadováno ověření" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ZruÅ¡it" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "PÅ™ihlásit se" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "PÅ™eskoÄ�it" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video není veÅ™ejné." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Uživatelské jméno" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Heslo" #: src/main.py:38 msgid "Prefill URL field" msgstr "PÅ™edvyplnÄ›né pole URL" #: src/model.py:67 msgid "Best" msgstr "Nejlepší" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Neplatná složka pro stahování" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nikoliv adresář" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Povolení zamítnuto" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Stáhnout playlist?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video je souÄ�ástí playlistu." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Jedno video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "VÅ¡echna videa z playlistu" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Obecné" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Otevřít nabídku" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Zavřít okno" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "UkonÄ�it" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigace" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "PÅ™ejít zpÄ›t" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "PÅ™ejít ke Zvuku" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "PÅ™ejít k Videu" #: src/window.py:187 msgid "Downloading" msgstr "Stahování" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} z {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "neznámý" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Stahování se nezdaÅ™ilo" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Stahování dokonÄ�eno" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Otevřít adresář pro stahování" #: src/window.py:329 msgid "Reset to Default" msgstr "Resetovat na výchozí hodnoty" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Vybrat složku pro stahování" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Vybrána nesprávná složka" #: src/window.py:364 msgid "Select Folder" msgstr "Vybrat složku" #: src/window.ui:41 msgid "About Video Downloader" msgstr "O aplikaci Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Hlavní nabídka" #: src/window.ui:105 msgid "Audio" msgstr "Zvuk" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Stáhnout" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "RozliÅ¡ení" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferovat formát MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "ZpÄ›t" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detaily" video-downloader-0.12.31/po/de.po000066400000000000000000000157221516223405600165010ustar00rootroot00000000000000# German translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Roy Meissner , 2020. # Unrud , 2023. # AnjaRuni , 2025. # HenRy , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-10-13 14:07+0000\n" "Last-Translator: HenRy \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.14-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Webvideos herunterladen" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Über eine einfach zu bedienende Oberfläche können Videos von vielen " "Webseiten heruntergeladen werden. Das Programm bietet:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Videos zu MP3 konvertieren" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Unterstützt passwortgeschützte und private Videos" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Einzelne Videos und ganze Wiedergabelisten herunterladen" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Automatisch das Videoformat auswählen, das den eigenen Qualitätsansprüchen " "entspricht" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basiert auf yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;herunterladen;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Neues Fenster" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Authentifizierung erforderlich" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Abbrechen" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Anmelden" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Überspringen" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video nicht öffentlich." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nutzername" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Passwort" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL-Feld vorausfüllen" #: src/model.py:67 msgid "Best" msgstr "Beste Verfügbare" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p (SD)" #: src/model.py:74 msgid "360p" msgstr "360p (SD)" #: src/model.py:75 msgid "240p" msgstr "240p (SD)" #: src/model.py:76 msgid "144p" msgstr "144p (SD)" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ungültiger Download-Ordner" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Kein Verzeichnis" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Zugriff verweigert" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Wiedergabeliste herunterladen?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video ist Teil einer Wiedergabeliste." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Einzelnes Video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Alle Videos der Wiedergabeliste" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Allgemein" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menü öffnen" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Fenster schließen" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Beenden" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Tastenkürzel" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigation" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Zurück gehen" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Zu Audio wechseln" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Zu Video wechseln" #: src/window.py:187 msgid "Downloading" msgstr "Herunterladen" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} von {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "unbekannt" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Download fehlgeschlagen" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Download abgeschlossen" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Download-Speicherort öffnen" #: src/window.py:329 msgid "Reset to Default" msgstr "Auf Standard zurücksetzen" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Download-Speicherort ändern" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ungültiger Ordner ausgewählt" #: src/window.py:364 msgid "Select Folder" msgstr "Ordner auswählen" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Über Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Hauptmenü" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Download" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Auflösung" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG-Format bevorzugen" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Zurück" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Details" video-downloader-0.12.31/po/el.po000066400000000000000000000170661516223405600165140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Stratos Petrelis , 2024. # GiannosOB , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-04-23 15:01+0000\n" "Last-Translator: GiannosOB \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.11.1-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Λήψη βίντεο από το διαδίκτυο" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Λήψη βίντεο από ιστοσελίδες με ένα εÏ�κολο στην χÏ�ήση πεÏ�ιβάλλον. ΠÏ�οσφέÏ�ει " "τα ακόλουθα χαÏ�ακτηÏ�ιστικά:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "ΜετατÏ�οπή βίντεο σε MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "ΥποστηÏ�ίζει Ï€Ï�οστατευόμενα με κωδικό και ιδιωτικά βίντεο" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Λήψη μεμονωμένου βίντεο ή ολόκληÏ�ων playlists" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Επιλέγει αυτόματα την μοÏ�φή του βίντεο ανάλογα με την επιθυμητή σας ποιότητα" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Βασισμένο στο yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Î�έο ΠαÏ�άθυÏ�ο" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Απαιτείται Επαλήθευση" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ΆκυÏ�ο" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "ΣÏ�νδεση" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "ΠαÏ�άληψη" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Το βίντεο δεν είναι δημόσιο." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Όνομα ΧÏ�ήστη" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Κωδικός" #: src/main.py:38 msgid "Prefill URL field" msgstr "ΣυμπληÏ�ωμένο πεδίο URL" #: src/model.py:67 msgid "Best" msgstr "ΚαλÏ�τεÏ�η" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Μη έγκυÏ�ος φάκελος λήψης" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Δεν είναι διαδÏ�ομή" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Εξουσιοδότηση αποÏ�Ï�ίπτεται" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Λήψη Playlist;" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Το βίντεο είναι μέÏ�ος ενός playlist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Μόνο Βίντεο" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Όλα τα Βίντεο στο Playlist" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Γενικά" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Άνοιγμα ΜενοÏ�" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Κλείσιμο ΠαÏ�αθÏ�Ï�ου" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Έξοδος" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "ΣυντομεÏ�σεις ΠληκτÏ�ολογίου" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "ΠεÏ�ιήγηση" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Πηγαίνετε πίσω" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Αλλαγή σε Ήχο" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Αλλαγή σε Βίντεο" #: src/window.py:187 msgid "Downloading" msgstr "Κατέβασμα" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} από {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "άγνωστο" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Η λήψη απέτυχε" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Η λήψη τελείωσε" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Άνοιγμα Θέσης Λήψης" #: src/window.py:329 msgid "Reset to Default" msgstr "ΕπαναφοÏ�ά στην ΠÏ�οκαθοÏ�ισμένη" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Αλλαγή Θέσης Λήψης" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Επιλέχτηκε μη έγκυÏ�ος φάκελος" #: src/window.py:364 msgid "Select Folder" msgstr "Επιλογή Φακέλου" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Σχετικά με Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "ΚÏ�Ï�ιο ΜενοÏ�" #: src/window.ui:105 msgid "Audio" msgstr "Ήχος" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Λήψη" #: src/window.ui:156 msgid "Video" msgstr "Βίντεο" #: src/window.ui:186 msgid "Resolution" msgstr "Ανάλυση" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "ΠÏ�οτίμηση μοÏ�φής MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "ΕπιστÏ�οφή" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "ΛεπτομέÏ�ειες" video-downloader-0.12.31/po/es.po000066400000000000000000000161101516223405600165100ustar00rootroot00000000000000# Spanish translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Rafael Mardojai CM , 2020. # Óscar Fernández Díaz , 2022. # gallegonovato , 2023, 2024. # Óscar Fernández Díaz , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-05-30 19:09+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Descargador de vídeo" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Descargar vídeos de Internet" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Descargue vídeos de sitios web con una interfaz fácil de usar. Ofrece las " "siguientes características:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Convierte vídeos a MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Soporta vídeos privados protegidos por contraseña" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Descarga vídeos individuales o listas de reproducción completas" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Selecciona automáticamente un formato de vídeo en función de sus exigencias " "de calidad" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basado en yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Descargar;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Ventana nueva" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autenticación requerida" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancelar" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Iniciar sesión" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Omitir" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "El vídeo no es público." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nombre de usuario" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Contraseña" #: src/main.py:38 msgid "Prefill URL field" msgstr "Rellenar el campo URL" #: src/model.py:67 msgid "Best" msgstr "La mejor" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Carpeta de descarga no válida" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "No es un directorio" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permiso denegado" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "¿Descargar la lista de reproducción?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "El vídeo es parte de una lista de reproducción." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Vídeo individual" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Todos los vídeos en la lista de reproducción" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "General" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Abrir menú" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Cerrar la ventana" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Salir" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Atajos del teclado" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navegación" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Volver" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Cambiar a audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Cambiar a vídeo" #: src/window.py:187 msgid "Downloading" msgstr "Descargando" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "desconocido" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Descarga fallida" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Descarga finalizada" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Abrir la ubicación de la descarga" #: src/window.py:329 msgid "Reset to Default" msgstr "Restablecer los valores predeterminados" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Cambiar la ubicación de la descarga" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Carpeta seleccionada no válida" #: src/window.py:364 msgid "Select Folder" msgstr "Seleccione una carpeta" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Acerca de Descargador de vídeo" #: src/window.ui:91 msgid "Main Menu" msgstr "Menú principal" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Descargar" #: src/window.ui:156 msgid "Video" msgstr "Vídeo" #: src/window.ui:186 msgid "Resolution" msgstr "Resolución" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferir el formato MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Atrás" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalles" video-downloader-0.12.31/po/et.po000066400000000000000000000154751516223405600165260ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Priit Jõerüüt , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-30 20:09+0000\n" "Last-Translator: Priit Jõerüüt \n" "Language-Team: Estonian \n" "Language: et\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Videote allalaadija" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Laadi alla veebivideoid" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Lihtsa kasutajaliidese abil laadi alla veebivideoid. Rakenduse " "funktsionaalsused:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "videote heliriba konverteerimine mp3 failiks" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "sobib nii salasõnaga kaitstud kui privaatsete videote allalaadimiseks" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "oskab allalaadida nii üksikuid videoid, kui terveid esitusloendeid" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "valib videovormingu automaatselt vastavalt sinu kvaliteedieelistustele" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Rakendus põhineb yt-dlp tarvikul." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;laadi alla;allalaadimine;veebivideod;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Uus aken" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autentimine on vajalik" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Katkesta" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Logi sisse" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Jäta vahele" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "See video pole avalik." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Kasutajanimi" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Salasõna" #: src/main.py:38 msgid "Prefill URL field" msgstr "Eeltäida aadressiväli" #: src/model.py:67 msgid "Best" msgstr "Parim" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Probleemne allalaadimiste kaust" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Tegemist pole kaustaga" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Õigused puuduvad" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Kas laadime esitusloendi alla?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "See video on osa esitusloendist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Laadi alla üksik video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Laadi alla kõik esitusloendi videod" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Üldised" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ava menüü" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Sulge aken" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Välju" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Klaviatuuri kiirklahvid" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Liikumine" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Mine tagasi" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Lülita heliribale" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Lülita videovoole" #: src/window.py:187 msgid "Downloading" msgstr "Laadime alla" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "teadmata" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Allalaadimine ei õnnestunud" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Allalaadimine lõppes" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Ava allalaadimiste kaust" #: src/window.py:329 msgid "Reset to Default" msgstr "Taasta algväärtused" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Muuda allalaadimiste kausta" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ebasobilik kaust on valitud" #: src/window.py:364 msgid "Select Folder" msgstr "Vali kaust" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Videote allalaadija teave" #: src/window.ui:91 msgid "Main Menu" msgstr "Põhimenüü" #: src/window.ui:105 msgid "Audio" msgstr "Heliriba" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "Võrguaadress" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Laadi alla" #: src/window.ui:156 msgid "Video" msgstr "Videovoog" #: src/window.ui:186 msgid "Resolution" msgstr "Resolutsioon" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Eelista MPEG-vormingut" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Tagasi" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Lisateave" video-downloader-0.12.31/po/eu.po000066400000000000000000000154521516223405600165220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Eder Etxebarria Rojo , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-11-27 02:54+0000\n" "Last-Translator: Eder Etxebarria Rojo \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.9-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Bideo Deskargatzailea" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Webguneetako bideoak deskargatu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Deskargatu bideoak webguneetatik, erabiltzeko erraza den interfaze batekin. " "Ezaugarri hauek eskaintzen ditu:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Bihurtu bideoak MP3ra" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Pasahitz bidez babestutako bideoak eta pribatuak onartzen ditu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Deskargatu bideoak banan-banan edo erreprodukzio-zerrenda osoak" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Bideo formatu bat automatikoki hautatzen du zure kalitate eskakizunen arabera" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Yt-dlp programan oinarritua." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "Youtube;Deskargatu;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Leiho berria" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autentikazioa derrigorrezkoa da" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Ezeztatu" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Saioa hasi" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Atzera egin" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Bideoa ez da publikoa." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Erabiltzailea" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Pasahitza" #: src/main.py:38 msgid "Prefill URL field" msgstr "Bete URL eremua" #: src/model.py:67 msgid "Best" msgstr "Onena" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Deskargen karpeta ez da zuzena" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ez da direktorio bat" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Baimena ezeztatua" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Erreprodukzio-zerrenda deskargatu?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Bideoa erreprodukzio-zerrenda baten barruan dago." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Bideo bakarra" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Erreprodukzio-zerrendaren bideo guztiak" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Orokorra" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ireki menua" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Itxi leihoa" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Atera" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Teklatuko lasterbideak" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Nabigazioa" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Atzera joan" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Audiora pasa" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Bideora pasa" #: src/window.py:187 msgid "Downloading" msgstr "Deskargatzen" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} {}etik" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "ezezagun" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Deskargak huts egin du" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Deskarga bukatu da" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Ireki deskargen kokapena" #: src/window.py:329 msgid "Reset to Default" msgstr "Berrezarri lehenetsitakoak" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Aldatu deskargen kokapena" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Baliogabeko karpeta hautatua" #: src/window.py:364 msgid "Select Folder" msgstr "Karpeta hautatu" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Bideo Deskargatzaileari buruz" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu orokorra" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Deskargatu" #: src/window.ui:156 msgid "Video" msgstr "Bideoa" #: src/window.ui:186 msgid "Resolution" msgstr "Bereizmena" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG formatua nahiago" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Atzera" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Zehaztasunak" video-downloader-0.12.31/po/fa.po000066400000000000000000000171331516223405600164750ustar00rootroot00000000000000# farsi/Persian translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Ali Khomami P. , 2020. # "P. A." , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2023-07-25 15:03+0000\n" "Last-Translator: \"P. A.\" \n" "Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.0-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 #, fuzzy msgid "Download web videos" msgstr "بارگیری ویدیو از سایت‌هایی مانند یوتیوب یا بسیاری از سایت‌های دیگر" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "به Ú©Ù…Ú© این برنامه، با یک رابط کاربریÙ� آسان، از سایت‌های گوناگون ویدیو بارگیری " "کنید. این برنامه قابلیت‌های زیر را ارئه می‌دهد:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "تبدیل ویدیوها به MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "پشتیبانی از ویدیوهای گذرواژه‌دار Ùˆ خصوصی" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "بارگیریÙ� تک ویدیو یا Ù�هرست‌های پخش" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "انتخابÙ� خودکارÙ� Ù�رمتÙ� مناسب، با توجه به نیاز شما به یک Ú©ÛŒÙ�یت خاص" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "بر پایهٔ برنامهٔ yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "پنجرهٔ جدید" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "راستی‌آزمایی لازم است" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "لغو" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "ورود" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "پرش" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "این ویدیو عمومی نیست." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "نام کاربری" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "گذرواژه" #: src/main.py:38 msgid "Prefill URL field" msgstr "کادرÙ� مربوط به نشانی اینترنتی را پر کنید" #: src/model.py:67 msgid "Best" msgstr "بهترین Ú©ÛŒÙ�یت" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "پوشه دانلود نامعتبر است" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "یک مسیر نیست" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "اجازه رد شد" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "همهٔ Ù�هرست‌پخش را بارگیری می‌کنید؟" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "این ویدیو بخشی از یک Ù�هرست پخش است." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "تک ویدیو" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "همهٔ ویدیوهای درون Ù�هرست پخش" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "عمومی" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "گشودن Ù�هرست" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "بستن پنجره" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "خروج" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "میان‌برهای صÙ�حه‌کلید" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "ناوبری" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "عقب رÙ�تن" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "تغییر به صوت/صدا" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "تغییر به ویدیو" #: src/window.py:187 msgid "Downloading" msgstr "در حال بارگیری" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} از {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "نامعلوم" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "بارگیری شکست خورد" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "بارگیری انجام شد" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "باز کردن مکان دانلود" #: src/window.py:329 msgid "Reset to Default" msgstr "بازگردانی تنظیمات پیش Ù�رض" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "تغییر مکان دانلود" #: src/window.py:360 msgid "Invalid folder selected" msgstr "پوشه نامعتبری انتخاب شده است" #: src/window.py:364 msgid "Select Folder" msgstr "انتخاب پوشه" #: src/window.ui:41 msgid "About Video Downloader" msgstr "درباره دانلود کننده ویدیو" #: src/window.ui:91 msgid "Main Menu" msgstr "Ù�هرست اصلی" #: src/window.ui:105 msgid "Audio" msgstr "صوت" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "نشانیÙ� اینترنتیÙ� ویدیو" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "بارگیری" #: src/window.ui:156 msgid "Video" msgstr "ویدیو" #: src/window.ui:186 msgid "Resolution" msgstr "وضوح" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "ترجیح دادن Ù�رمت MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "بازگشت" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "جزییات" video-downloader-0.12.31/po/fi.po000066400000000000000000000153021516223405600165010ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Jiri Grönroos , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-19 10:09+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-rc\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Lataa videoita verkosta" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Lataa videoita verkkosivustoilta helppokäyttöisellä käyttöliittymällä. " "Sisältää seuraavat ominaisuudet:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Muunna videot MP3-muotoon" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Tukee salasanalla suojattuja ja yksityisiä videoita" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Lataa yksittäisiä videoita tai kokonaisia soittolistoja" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Valitsee tiedostomuodon automaattisesti pohjautuen laatuvaatimuksiisi" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Perustuu yt-dlp:hen." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;lataa;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Uusi ikkuna" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Tunnistautuminen vaaditaan" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Peru" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Kirjaudu" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Ohita" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Tämä video ei ole julkinen." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Käyttäjätunnus" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Salasana" #: src/main.py:38 msgid "Prefill URL field" msgstr "Esitäytä verkko-osoitteen kenttä" #: src/model.py:67 msgid "Best" msgstr "Paras" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Virheellinen latauskansio" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ei kansio" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Pääsy evätty" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Ladataanko soittolista?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Tämä video on osa soittolistaa." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Yksittäinen video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Kaikki soittolistan videot" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Yleiset" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Avaa valikko" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Sulje ikkuna" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Lopeta" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Pikanäppäimet" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Liikkuminen" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Takaisin" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Vaihda ääniosioon" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Vaihda video-osioon" #: src/window.py:187 msgid "Downloading" msgstr "Ladataan" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{}/{}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "tuntematon" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Lataus epäonnistui" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Lataus valmistui" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Avaa lataussijainti" #: src/window.py:329 msgid "Reset to Default" msgstr "Palauta oletusasetus" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Vaihda lataussijainti" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Virheellinen kansio valittu" #: src/window.py:364 msgid "Select Folder" msgstr "Valitse kansio" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Tietoja - Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Päävalikko" #: src/window.ui:105 msgid "Audio" msgstr "Ääni" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "Verkko-osoite" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Lataa" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Resoluutio" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Suosi MPEG-muotoa" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Takaisin" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Yksityiskohdat" video-downloader-0.12.31/po/fr.po000066400000000000000000000163211516223405600165140ustar00rootroot00000000000000# French translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Thorfin89 , 2020. # Irénée THIRION , 2022. # "J. Lavoie" , 2023. # rene-coty , 2024. # Simeon Thuet , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-10-13 14:07+0000\n" "Last-Translator: Simeon Thuet \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.14-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Téléchargeur de vidéos" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Téléchargez des vidéos à partir de sites web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Téléchargez des vidéos à partir de sites internet grâce à une interface " "simple à utiliser. L’application propose les fonctions suivantes:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Extraire le son en MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Prise en charge des vidéos protégées par mot de passe et privées" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Télécharger une simple vidéo ou une liste complète" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Sélectionner automatiquement la vidéo en fonction de la qualité demandée" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basé sur yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;Télécharger;Vidéos;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nouvelle fenêtre" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Authentification requise" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Abandonner" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Se connecter" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Passer" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Cette vidéo n’est pas publique." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Identifiant" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Mot de passe" #: src/main.py:38 msgid "Prefill URL field" msgstr "Adresse URL préremplie" #: src/model.py:67 msgid "Best" msgstr "Meilleure" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Dossier de téléchargement invalide" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Pas un répertoire" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permission refusée" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Télécharger la liste de lecture ?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "La vidéo appartient à une liste de lecture." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Vidéo unique" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Toutes les vidéos de la liste de lecture" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Général" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ouvrir le menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Fermer la fenêtre" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Quitter" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Raccourcis clavier" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigation" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Retour" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Basculer vers l’audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Basculer vers la vidéo" #: src/window.py:187 msgid "Downloading" msgstr "Téléchargement" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "inconnue" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Le téléchargement a échoué" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Téléchargement terminé" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Ouvrir l’emplacement de téléchargement" #: src/window.py:329 msgid "Reset to Default" msgstr "Réinitialisation à la valeur par défaut" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Modifier l'emplacement du téléchargement" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Dossier sélectionné invalide" #: src/window.py:364 msgid "Select Folder" msgstr "Sélectionner le dossier" #: src/window.ui:41 msgid "About Video Downloader" msgstr "À propos de Téléchargeur de vidéos" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu principal" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Télécharger" #: src/window.ui:156 msgid "Video" msgstr "Vidéo" #: src/window.ui:186 msgid "Resolution" msgstr "Résolution" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Préférer le format MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Retour" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Détails" video-downloader-0.12.31/po/gl.po000066400000000000000000000155411516223405600165120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Yago Raña Gayoso , 2026. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2026-02-19 14:09+0000\n" "Last-Translator: Yago Raña Gayoso \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.16.1-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Descargador de vídeos" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Descargue vídeos desde Internet" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Descargue vídeos desde sitios web con unha interface fácil de usar. " "Funcionalidades:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Convertir vídeos a MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Soporte para vídeos privados e protexidos con contrasinal" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Descargar vídeos individualmente ou listas de reprodución completas" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Automaticamente seleccionar un formato de vídeo baseado nas súas demandas de " "calidade" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Baseado en yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Descargar;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nova xanela" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autenticación requirida" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancelar" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Acceder" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Omitir" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Este vídeo non é público." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nome de usuario" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Contrasinal" #: src/main.py:38 msgid "Prefill URL field" msgstr "Completar campo de URL" #: src/model.py:67 msgid "Best" msgstr "A mellor" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Cartafol de descarga non válido" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Non é un directorio" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permiso denegado" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Descargar lista de reprodución?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "O vídeo é parte dunha lista de reprodución." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Vídeo individual" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Todos os vídeos na lista de reprodución" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Xeral" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Abrir menú" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Cerrar xanela" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Saír" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Atallos de teclado" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navegación" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Ir atrás" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Cambiar a audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Cambiar a vídeo" #: src/window.py:187 msgid "Downloading" msgstr "Decargando" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "descoñecido" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Produciuse un erro na descarga" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Descarga terminada" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Abrir ubicación da descarga" #: src/window.py:329 msgid "Reset to Default" msgstr "Restablecer aos valores predeterminados" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Cambiar ubicación da descarga" #: src/window.py:360 msgid "Invalid folder selected" msgstr "O cartafol seleccionado non é válido" #: src/window.py:364 msgid "Select Folder" msgstr "Seleccionar cartafol" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Acerca de Descargador de vídeos" #: src/window.ui:91 msgid "Main Menu" msgstr "Menú principal" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Descargar" #: src/window.ui:156 msgid "Video" msgstr "Vídeo" #: src/window.ui:186 msgid "Resolution" msgstr "Resolución" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferir formato MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Atrás" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalles" video-downloader-0.12.31/po/he.po000066400000000000000000000162751516223405600165110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # SPiRiT , 2023. # yoval keshet , 2024. # Yaron Shahrabani , 2026. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2026-02-22 14:37+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" "X-Generator: Weblate 5.16.1-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "מוריד הסרטוני×�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "הורדת סרטוני×� מ×�תרי×�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "הורדת סרטוני×� ממגוון ×�תרי×�, ×¢×� ממשק פשוט לשימוש שמ×�פשר:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "המרת סרטוני×� ל-MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "תמיכה בסרטוני×� מוגני×� ×¢×� סיסמה וסרטוני×� פרטיי×�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "הורדת סרטוני×� בודדי×� ×�ו פלייליסט של×�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "בחירה ×�וטומטית של פורמט הסרטון, לפי דרישות ×”×�יכות שלך" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "מבוסס על yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "יוטיוב;הורדה;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "חלון חדש" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "נדרשת הזדהות" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ביטול" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "התחברות" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "דלג" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "הסרטון ×�ינו ציבורי." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "ש×� משתמש" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "סיסמה" #: src/main.py:38 msgid "Prefill URL field" msgstr "קישור למילוי ×�וטומטי" #: src/model.py:67 msgid "Best" msgstr "×”×›×™ טובה" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "תיקיית הורדה ל×� תקינה" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "זו ל×� תיקייה" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "הגישה נדחתה" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "להוריד פלייליסט?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "הסרטון הו×� חלק מפלייליסט." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "סרטון בודד" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "כל הסרטוני×� בפלייליסט" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "כללי" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "פתיחת תפריט" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "סגירת תפריט" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "יצי×�×”" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "קיצורי דרך במקלדת" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "ניווט" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "×�חורה" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "עבור לשמע" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "עבור לויד×�ו" #: src/window.py:187 msgid "Downloading" msgstr "מוריד" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} מתוך {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "ל×� ידוע" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "ההורדה נכשלה" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "ההורדה הושלמה" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "פתח תיקיית הורדות" #: src/window.py:329 msgid "Reset to Default" msgstr "ברירות מחדל" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "בחר תיקיית יעד להורדות" #: src/window.py:360 msgid "Invalid folder selected" msgstr "נבחרה תיקייה ל×� תקינה" #: src/window.py:364 msgid "Select Folder" msgstr "בחר תיקייה" #: src/window.ui:41 msgid "About Video Downloader" msgstr "×�ודות מוריד הסרטוני×�" #: src/window.ui:91 msgid "Main Menu" msgstr "תפריט ר×�שי" #: src/window.ui:105 msgid "Audio" msgstr "שמע" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "קישור" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "הורדה" #: src/window.ui:156 msgid "Video" msgstr "סרטון" #: src/window.ui:186 msgid "Resolution" msgstr "רזולוציה" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "עדיפות לפורמט MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "חזרה" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "פרטי×�" video-downloader-0.12.31/po/hi.po000066400000000000000000000204121516223405600165010ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Scrambled777 , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-01 17:09+0000\n" "Last-Translator: Scrambled777 \n" "Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "वीडियो डाउनलोडर" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "वेब वीडियो डाउनलोड करें" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "उपयोग में आसान इंटरफ़ेस वाली वेबसाइटों से वीडियो डाउनलोड करें। निमà¥�नलिखित " "सà¥�विधाà¤�ं पà¥�रदान करता है:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "वीडियो को MP3 में बदलें" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "पासवरà¥�ड से सà¥�रकà¥�षित और निजी वीडियो का समरà¥�थन करता है" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "à¤�कल वीडियो या संपूरà¥�ण पà¥�लेलिसà¥�ट डाउनलोड करें" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "आपकी गà¥�णवतà¥�ता की मांग के आधार पर सà¥�वचालित रूप से à¤�क वीडियो पà¥�रारूप का चयन करता है" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp पर आधारित।" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;डाउनलोड;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "नई खिड़की" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "पà¥�रमाणीकरण आवशà¥�यक" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "रदà¥�द करें" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "साइन इन" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "छोड़ें" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "वीडियो सारà¥�वजनिक नहीं है।" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "उपयोकà¥�तानाम" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "पासवरà¥�ड" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL कà¥�षेतà¥�र पहले से भरें" #: src/model.py:67 msgid "Best" msgstr "शà¥�रेषà¥�ठ" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "अमानà¥�य डाउनलोड फोलà¥�डर" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "निरà¥�देशिका नहीं" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "अनà¥�मति नहीं मिली" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "पà¥�लेलिसà¥�ट डाउनलोड करें?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "वीडियो à¤�क पà¥�लेलिसà¥�ट का हिसà¥�सा है।" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "à¤�कल वीडियो" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "पà¥�लेलिसà¥�ट में सभी वीडियो" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "सामानà¥�य" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "मेनू खोलें" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "खिड़की बंद करें" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "छोड़ें" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "कीबोरà¥�ड शॉरà¥�टकट" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "पथ-पà¥�रदरà¥�शन" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "पीछे जाà¤�ं" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "ऑडियो पर जाà¤�ं" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "वीडियो पर जाà¤�ं" #: src/window.py:187 msgid "Downloading" msgstr "डाउनलोड हो रहा है" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} का {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "अजà¥�ञात" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "डाउनलोड विफल" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "डाउनलोड समापà¥�त हो गया" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "डाउनलोड सà¥�थान खोलें" #: src/window.py:329 msgid "Reset to Default" msgstr "तयशà¥�दा पर रीसेट" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "डाउनलोड सà¥�थान बदलें" #: src/window.py:360 msgid "Invalid folder selected" msgstr "अमानà¥�य फोलà¥�डर चयनित" #: src/window.py:364 msgid "Select Folder" msgstr "फोलà¥�डर चà¥�नें" #: src/window.ui:41 msgid "About Video Downloader" msgstr "वीडियो डाउनलोडर के बारे में" #: src/window.ui:91 msgid "Main Menu" msgstr "मà¥�खà¥�य मेनू" #: src/window.ui:105 msgid "Audio" msgstr "ऑडियो" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "डाउनलोड" #: src/window.ui:156 msgid "Video" msgstr "वीडियो" #: src/window.ui:186 msgid "Resolution" msgstr "रिजोलà¥�यूशन" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG पà¥�रारूप को पà¥�राथमिकता दें" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "पीछे" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "विवरण" video-downloader-0.12.31/po/hr.po000066400000000000000000000154571516223405600165270ustar00rootroot00000000000000# Croatian translations for video-downloader package. # Copyright (C) 2021 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Milo Ivir , 2021, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-05 13:09+0000\n" "Last-Translator: Milo Ivir \n" "Language-Team: Croatian \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Preuzimanje videa" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Preuzmi web videa" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Preuzimanje videa s web-stranica s jednostavnim suÄ�eljem. Sadrži sljedeće " "znaÄ�ajke:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Pretvaranje videa u MP3 format" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "PodrÅ¡ka za privatna i lozinkom zaÅ¡tićena videa" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Preuzimanje pojedinaÄ�nih videa ili cijelih zbirki" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Automatsko biranje videoformata na osnovi tražene kvalitete" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Zasnovano na biblioteci yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;preuzimanje;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Novi prozor" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Potrebna je autentifikacija" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Odustani" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Prijavi se" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "PreskoÄ�i" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video nije javan." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "KorisniÄ�ko ime" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Lozinka" #: src/main.py:38 msgid "Prefill URL field" msgstr "Unaprijed ispuni polje URL-adrese" #: src/model.py:67 msgid "Best" msgstr "Najbolja" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320 p (8 K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160 p (4 K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440 p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080 p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720 p (HD)" #: src/model.py:73 msgid "480p" msgstr "480 p" #: src/model.py:74 msgid "360p" msgstr "360 p" #: src/model.py:75 msgid "240p" msgstr "240 p" #: src/model.py:76 msgid "144p" msgstr "144 p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Neispravna mapa za preuzimanja" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nije direktorij" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Dozvola je odbijena" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Preuzeti zbirku?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video je dio zbirke." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Jedan video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Sva videa u zbirci" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Općenito" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Otvori izbornik" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Zatvori prozor" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Zatvori" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "PreÄ�aci tipkovnice" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigacija" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Idi natrag" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "PrijeÄ‘i na audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "PrijeÄ‘i na video" #: src/window.py:187 msgid "Downloading" msgstr "Preuzimanje" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} od {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "nepoznato" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Neuspjelo preuzimanje" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Preuzimanje je gotovo" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Otvori mjesto preuzimanja" #: src/window.py:329 msgid "Reset to Default" msgstr "Resetiraj na standardne vrijednosti" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Promijeni mjesto preuzimanja" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Odabrana je neispravna mapa" #: src/window.py:364 msgid "Select Folder" msgstr "Odaberi mapu" #: src/window.ui:41 msgid "About Video Downloader" msgstr "O programu Preuzimanje videa" #: src/window.ui:91 msgid "Main Menu" msgstr "Glavni izbornik" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL-adresa" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Preuzmi" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Rezolucija" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferiraj MPEG format" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Natrag" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalji" video-downloader-0.12.31/po/hu.po000066400000000000000000000155421516223405600165250ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # ovari <>, 2020-2023. # Balazs , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-06 20:09+0000\n" "Last-Translator: Balazs \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "VideóletöltÅ‘" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Videók letöltése a YouTube és más webhelyrÅ‘l" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Töltsön le videókat weboldalakról egy könnyen használható kezelÅ‘felülettel. " "JellemzÅ‘k:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Videók átalakítása mp3 formátumba" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Jelszóval védett és privát videók támogatása" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Egyes videók vagy teljes lejátszási listák letöltése" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "MinÅ‘ségi igényeknek megfelelÅ‘ videoformátum automatikus kiválasztása" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "A \"yt-dlp\" program alapján." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "Youtube;Letöltés;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Új ablak" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Hitelesítés szükséges" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Mégsem" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Bejelentkezés" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Kihagyás" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "A videó nem nyilvános." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Felhasználónév" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Jelszó" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL-cím mezÅ‘ elÅ‘töltése" #: src/model.py:67 msgid "Best" msgstr "Legjobb" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Érvénytelen letöltési mappa" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nem könyvtár" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Hozzáférés megtagadva" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Lejátszási lista letöltése?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "A videó egy lejátszási lista része." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Egyetlen videó" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Összes videó a listában" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Ã�ltalános" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menü megnyitása" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Ablak bezárása" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Kilépés" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Gyorsbillentyűk" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigáció" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Vissza" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Hangra váltás" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Videóra váltás" #: src/window.py:187 msgid "Downloading" msgstr "Letöltés folyamatban" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "ismeretlen" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Letöltés sikertelen" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Letöltés befejezÅ‘dött" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Letöltési hely megnyitása" #: src/window.py:329 msgid "Reset to Default" msgstr "Visszaállítás alapértelmezettre" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Letöltési hely módosítása" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Érvénytelen mappa van kiválasztva" #: src/window.py:364 msgid "Select Folder" msgstr "Mappa kiválasztása" #: src/window.ui:41 msgid "About Video Downloader" msgstr "A VideóletöltÅ‘ névjegye" #: src/window.ui:91 msgid "Main Menu" msgstr "FÅ‘menü" #: src/window.ui:105 msgid "Audio" msgstr "Hang" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL-cím" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Letöltés" #: src/window.ui:156 msgid "Video" msgstr "Videó" #: src/window.ui:186 msgid "Resolution" msgstr "Felbontás" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG formátum elÅ‘nyben részesítése" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Vissza" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Részletek" video-downloader-0.12.31/po/hy.po000066400000000000000000000171271516223405600165320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # MikayelB , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-12-31 09:01+0000\n" "Last-Translator: MikayelB \n" "Language-Team: Armenian \n" "Language: hy\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.15.1\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "ÕŽÕ«Õ¤Õ¥Õ¸Õ¶Õ¥Ö€Õ« Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ«Õ¹" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Ö�Õ¡Õ¶Ö�Õ«Ö� Õ¾Õ«Õ¤Õ¥Õ¸Õ¶Õ¥Ö€" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Ö„ Õ¾Õ«Õ¤Õ¥Õ¸Õ¶Õ¥Ö€ Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ«Ö�Õ� Õ°Õ¥Õ·Õ¿ Õ«Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ« Õ´Õ«Õ»Õ¸Ö�Õ¸Õ¾Ö‰ ÕˆÖ‚Õ¶Õ« Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ " "հնարավորությունները․" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Õ“Õ¸Õ­Õ¡Õ¯Õ¥Ö€ÕºÕ¥Õ¬ Õ¾Õ«Õ¤Õ¥Õ¸Õ¶Õ¥Ö€Õ¨ MP3-Õ«" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Ô±Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´ Õ§ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¸Õ¾ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ® Ö‡ private (Õ´Õ¡Õ½Õ¶Õ¡Õ¾Õ¸Ö€) Õ¾Õ«Õ¤Õ¥Õ¸Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¡Õ¼Õ¡Õ¶Õ±Õ«Õ¶ Õ¾Õ«Õ¤Õ¥Õ¸Õ¶Õ¥Ö€ Õ¯Õ¡Õ´ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ playlist-Õ¶Õ¥Ö€" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Ô±Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ´ Õ§ Õ¾Õ«Õ¤Õ¥Õ¸ÕµÕ« Ö†Õ¸Ö€Õ´Õ¡Õ¿Õ¨Õ� Õ¨Õ½Õ¿ Õ¸Ö€Õ¡Õ¯Õ« ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¶Õ¥Ö€Õ«" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Õ€Õ«Õ´Õ¶Õ¾Õ¡Õ® Õ§ yt-dlp -Õ« Õ¾Ö€Õ¡Ö‰" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬;ÕŽÕ«Õ¤Õ¥Õ¸Õ¶Õ¥Ö€;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Õ†Õ¸Ö€ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "ÕŠÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ¸Ö‚Õ´ Õ§ Õ¶Õ¸Ö‚ÕµÕ¶Õ¡Õ¯Õ¡Õ¶Õ¡Ö�Õ¸Ö‚Õ´" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Ô²Õ¡Ö� Õ©Õ¸Õ²Õ¶Õ¥Õ¬" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "ÕŽÕ«Õ¤Õ¥Õ¸Õ¶ public Õ¹Õ§Ö‰" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ¶Õ¸Ö‚Õ¶" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼" #: src/main.py:38 msgid "Prefill URL field" msgstr "Ô¿Õ¡Õ¶Õ­Õ¡Õ¾ Õ¬Ö€Õ¡Ö�Õ¶Õ¥Õ¬ URL Õ¤Õ¡Õ·Õ¿Õ¨" #: src/model.py:67 msgid "Best" msgstr "Ô¼Õ¡Õ¾Õ¡Õ£Õ¸Ö‚ÕµÕ¶Õ¨" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ô±Õ¶Õ¾Õ¡Õ¾Õ¥Ö€ Õ¶Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ ÕºÕ¡Õ¶Õ¡Õ¯ (Folder)" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "ÕŠÕ¡Õ¶Õ¡Õ¯ Õ¹Õ§ (directory Õ¹Õ§)" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Ô¹Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ´Õ¥Ö€ÕªÕ¾Õ¡Õ® Õ§" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥ÕžÕ¬ playlist-Õ¨" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "ÕŽÕ«Õ¤Õ¥Õ¸Õ¶ playlist-Õ« Õ´Õ¡Õ½ Õ§Ö‰" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Õ„Õ¥Õ¯ Õ¾Õ«Õ¤Õ¥Õ¸" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Playlist-Õ« Õ¢Õ¸Õ¬Õ¸Ö€ Õ¾Õ«Õ¤Õ¥Õ¸Õ¶Õ¥Ö€Õ¨" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Ô¸Õ¶Õ¤Õ°Õ¡Õ¶Õ¸Ö‚Ö€" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ô²Õ¡Ö�Õ¥Õ¬ Õ´Õ¥Õ¶ÕµÕ¸Ö‚Õ¶" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Õ“Õ¡Õ¯Õ¥Õ¬ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ¨" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "ÔµÕ¬Ö„" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Õ�Õ¿Õ¥Õ²Õ¶Õ¡Õ·Õ¡Ö€Õ« Õ¯Õ¡Ö€Õ³ Õ°Ö€Õ¡Õ´Õ¡Õ¶Õ¶Õ¥Ö€ (shortcuts)" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Õ†Õ¡Õ¾Õ«Õ£Õ¡Ö�Õ«Õ¡" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Õ€Õ¥Õ¿ Õ£Õ¶Õ¡Õ¬" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Ô±Õ¶Ö�Õ¶Õ¥Õ¬ Audio-Õ«" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Ô±Õ¶Ö�Õ¶Õ¥Õ¬ Video-Õ«" #: src/window.py:187 msgid "Downloading" msgstr "Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´ Õ§" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} , {}-Õ«Ö�" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "Õ¡Õ¶Õ°Õ¡ÕµÕ¿" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¨ Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥Ö�" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´Õ¨ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¡Õ® Õ§" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Ô²Õ¡Ö�Õ¥Õ¬ Õ¶Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ (folder)" #: src/window.py:329 msgid "Reset to Default" msgstr "ÕŽÕ¥Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬ Õ½Õ¯Õ¦Õ¢Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Õ“Õ¸Õ­Õ¥Õ¬ Õ¶Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¨" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ô¸Õ¶Õ¿Ö€Õ¾Õ¡Õ® ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ (folder) Õ¡Õ¶Õ¾Õ¡Õ¾Õ¥Ö€ Õ§" #: src/window.py:364 msgid "Select Folder" msgstr "Ô¸Õ¶Õ¿Ö€Õ¥Õ¬ ÕºÕ¡Õ¶Õ¡Õ¯ (folder)" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Video Downloader-Õ« Õ´Õ¡Õ½Õ«Õ¶" #: src/window.ui:91 msgid "Main Menu" msgstr "Ô³Õ¬Õ­Õ¡Õ¾Õ¸Ö€ Õ´Õ¥Õ¶ÕµÕ¸Ö‚" #: src/window.ui:105 msgid "Audio" msgstr "Ô±Õ¸Ö‚Õ¤Õ«Õ¸" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬" #: src/window.ui:156 msgid "Video" msgstr "ÕŽÕ«Õ¤Õ¥Õ¸" #: src/window.ui:186 msgid "Resolution" msgstr "ÕˆÖ€Õ¡Õ¯" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Õ†Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ MPEG Ö†Õ¸Ö€Õ´Õ¡Õ¿Õ¨" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Õ€Õ¥Õ¿" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€" video-downloader-0.12.31/po/id.po000066400000000000000000000152661516223405600165100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Christian Elbrianno , 2023. # Reza Almanda , 2023, 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-01-01 22:00+0000\n" "Last-Translator: Reza Almanda \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.10-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Pengunduh Video" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Unduh video web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Unduh video dari situs web dengan antarmuka yang mudah digunakan. " "Menyediakan fitur berikut:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Konversi video ke MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Mendukung video yang dilindungi kata sandi dan video pribadi" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Unduh satu video atau seluruh daftar putar" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Secara otomatis memilih format video berdasarkan kualitas yg anda pilih" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Berdasarkan yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Unduh;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Jendela Baru" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Otentikasi diperlukan" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Batal" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Masuk" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Lewati" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video ini tidak untuk umum." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nama pengguna" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Kata sandi" #: src/main.py:38 msgid "Prefill URL field" msgstr "Bidang URL yang sudah diisi sebelumnya" #: src/model.py:67 msgid "Best" msgstr "Terbaik" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Folder unduhan tidak valid" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Bukan sebuah direktori" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Izin ditolak" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Unduh Daftar Putar?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video ini merupakan bagian dari daftar putar." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Video Tunggal" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Semua Video dalam Daftar Putar" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Umum" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Buka Menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Tutup Jendela" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Keluar" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Pintasan Papan Tik" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigasi" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Kembali" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Ganti ke Audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Ganti ke Video" #: src/window.py:187 msgid "Downloading" msgstr "Mengunduh" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} dari {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "tidak diketahui" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Unduhan gagal" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Unduhan selesai" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Buka Lokasi Unduhan" #: src/window.py:329 msgid "Reset to Default" msgstr "Atur Ulang ke Asal" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Ganti Lokasi Unduhan" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Folder terpilih tidak valid" #: src/window.py:364 msgid "Select Folder" msgstr "Pilih Folder" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Tentang Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu Utama" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Unduh" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Resolusi" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Lebih suka format MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Kembali" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detail" video-downloader-0.12.31/po/it.po000066400000000000000000000155271516223405600165300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Albano Battistella , 2020-2023. # "J. Lavoie" , 2023. # albanobattistella , 2024, 2026. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2026-01-25 17:05+0000\n" "Last-Translator: albanobattistella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.16-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Scarica video dal web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Scarica video da siti Web con un'interfaccia facile da usare. Fornisce le " "seguenti caratteristiche:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converte video in MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Supporta video privati e protetti da password" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Scarica singoli video o intere playlist" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Seleziona automaticamente un formato video in base alla risoluzione preferita" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basato su yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Scarica;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nuova finestra" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autenticazione richiesta" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Annulla" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Accedi" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Salta" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Il video non è pubblico." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nome Utente" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Password" #: src/main.py:38 msgid "Prefill URL field" msgstr "Campo URL precompilato" #: src/model.py:67 msgid "Best" msgstr "Migliore" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Cartella di scaricamento non valida" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Non una directory" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permesso negato" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Scaricare playlist?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Il video fa parte di una playlist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Video Singolo" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Tutti i video nella playlist" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Generale" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Apri il menù" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Chiudi finestra" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Esci" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Scorciatoie da tastiera" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigazione" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Va indietro" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Passa ad Audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Passa aL Video" #: src/window.py:187 msgid "Downloading" msgstr "Download in corso" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} di {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "sconosciuto" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Download fallito" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Download terminato" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Apri Percorso di Download" #: src/window.py:329 msgid "Reset to Default" msgstr "Ripristina impostazioni predefinite" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Cambia posizione di download" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Cartella selezionata non valida" #: src/window.py:364 msgid "Select Folder" msgstr "Seleziona cartella" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Informazioni su Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menù principale" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Download" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Risoluzione" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferisci il formato MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Indietro" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Dettagli" video-downloader-0.12.31/po/ja.po000066400000000000000000000163261516223405600165040ustar00rootroot00000000000000# Japanese translations for video-downloader package. # Copyright (C) 2020-2021 video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # sicklylife , 2020-2021. # Ryo Nakano , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-05 13:09+0000\n" "Last-Translator: Ryo Nakano \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.6-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Web 動画をダウンロードã�—ã�¾ã�™" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "使ã�„ã‚„ã�™ã�„インターフェースã�§ã‚¦ã‚§ãƒ–サイトã�‹ã‚‰å‹•画をダウンロードã�—ã�¾ã�™ã€‚以下ã�®" "機能ã�Œã�‚りã�¾ã�™:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "動画を MP3 ã�«å¤‰æ�›" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "パスワードã�§ä¿�è­·ã�•れã�Ÿé–²è¦§åˆ¶é™�å‹•ç”»ã�®ã‚µãƒ�ート" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "å�˜ä¸€ã�®å‹•ç”»ã�¾ã�Ÿã�¯å†�生リストã�«å�«ã�¾ã‚Œã‚‹å‹•ç”»ã�®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "指定ã�—ã�Ÿç”»è³ªã�«æœ€é�©ã�ªå‹•画形å¼�を自動ã�§é�¸æŠž" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp を利用ã�—ã�¦ã�„ã�¾ã�™ã€‚" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;ダウンロード;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "æ–°ã�—ã�„ウィンドウ" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "èª�証ã�Œå¿…è¦�ã�§ã�™" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "キャンセル" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "サインイン" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "スキップ" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "閲覧ã�Œåˆ¶é™�ã�•れã�¦ã�„ã‚‹å‹•ç”»ã�§ã�™ã€‚" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "ユーザーå��" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "パスワード" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL フィールドã�«äº‹å‰�入力ã�™ã‚‹" #: src/model.py:67 msgid "Best" msgstr "最高" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "無効ã�ªãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ãƒ•ォルダー" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "ディレクトリã�§ã�¯ã�‚りã�¾ã�›ã‚“" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "許å�¯ã�Œã�‚りã�¾ã�›ã‚“" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "å†�生リストã�‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã�—ã�¾ã�™ã�‹?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "å‹•ç”»ã�¯å†�生リストã�«å�«ã�¾ã‚Œã�¦ã�„ã�¾ã�™ã€‚" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "å�˜ä¸€ã�®å‹•ç”»" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "å†�生リスト内ã�®ã�™ã�¹ã�¦ã�®å‹•ç”»" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "全般" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "メニューを開ã��" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "ウィンドウを閉ã�˜ã‚‹" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "終了ã�™ã‚‹" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "キーボードショートカットを表示ã�™ã‚‹" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "移動" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "å·¦ã�¸ç§»å‹•ã�™ã‚‹" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "音声画é�¢ã�«åˆ‡ã‚Šæ›¿ã�ˆ" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "動画画é�¢ã�«åˆ‡ã‚Šæ›¿ã�ˆ" #: src/window.py:187 msgid "Downloading" msgstr "ダウンロード中" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "ä¸�明" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "ダウンロード失敗" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "ダウンロード完了" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "ダウンロード先を開ã��" #: src/window.py:329 msgid "Reset to Default" msgstr "デフォルトã�«ãƒªã‚»ãƒƒãƒˆ" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "ダウンロード先を変更" #: src/window.py:360 msgid "Invalid folder selected" msgstr "é�¸æŠžã�—ã�Ÿãƒ•ォルダーã�¯ç„¡åйã�§ã�™" #: src/window.py:364 msgid "Select Folder" msgstr "フォルダーをé�¸æŠž" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Video Downloader ã�«ã�¤ã�„ã�¦" #: src/window.ui:91 msgid "Main Menu" msgstr "メインメニュー" #: src/window.ui:105 msgid "Audio" msgstr "音声" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "ダウンロード" #: src/window.ui:156 msgid "Video" msgstr "å‹•ç”»" #: src/window.ui:186 msgid "Resolution" msgstr "è§£åƒ�度" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG å½¢å¼�ã�§å�–å¾—" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "戻る" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "詳細" video-downloader-0.12.31/po/ka.po000066400000000000000000000211751516223405600165030ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Temuri Doghonadze , 2026. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2026-02-22 14:37+0000\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.16.1-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "ვიდეáƒ�ს გáƒ�დმáƒ�მწერი" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "ვიდეáƒ�ების გáƒ�დმáƒ�წერáƒ� ვებიდáƒ�ნ" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "გáƒ�დმáƒ�წერეთ ვიდეáƒ�ები ვებსáƒ�იტებიდáƒ�ნ áƒ�დვილáƒ�დ გáƒ�მáƒ�სáƒ�ყენებელი ინტერფეისით. " "მáƒ�გáƒ�წვდით შემდეგ ფუნქციებს:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "ვიდეáƒ�ების MP3-ში გáƒ�დáƒ�ყვáƒ�ნáƒ�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "áƒ�ქვს პáƒ�რáƒ�ლით დáƒ�ცული დáƒ� პირáƒ�დი ვიდეáƒ�ების მხáƒ�რდáƒ�ჭერáƒ�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "ერთი ვიდეáƒ�სი, áƒ�ნ მთელი დáƒ�სáƒ�კრáƒ�ვი სიის გáƒ�დმáƒ�წერáƒ�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "áƒ�ვტáƒ�მáƒ�ტურáƒ�დ ირჩევს ვიდეáƒ�ს ფáƒ�რმáƒ�ტს თქვენი ვიდეáƒ�ს ხáƒ�რისხის მáƒ�თხáƒ�ვნის მიხედვით" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "დáƒ�ფუძნებულიáƒ� yt-dlp-ზე." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;გáƒ�დმáƒ�წერáƒ�;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "áƒ�ხáƒ�ლი ფáƒ�ნჯáƒ�რáƒ�" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "სáƒ�ჭირáƒ�áƒ� áƒ�ვთენტიკáƒ�ციáƒ�" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "გáƒ�უქმებáƒ�" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "შესვლáƒ�" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "გáƒ�მáƒ�ტáƒ�ვებáƒ�" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "ვიდეáƒ� სáƒ�ჯáƒ�რáƒ� áƒ�რáƒ�áƒ�." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "მáƒ�მხმáƒ�რებლის სáƒ�ხელი" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "პáƒ�რáƒ�ლი" #: src/main.py:38 msgid "Prefill URL field" msgstr "ბმულის ველის წინáƒ�სწáƒ�რი შევსებáƒ�" #: src/model.py:67 msgid "Best" msgstr "სáƒ�უკეთესáƒ�" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "áƒ�რáƒ�სწáƒ�რი გáƒ�დმáƒ�წერის სáƒ�ქáƒ�ღáƒ�ლდე" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "სáƒ�ქáƒ�ღáƒ�ლდე áƒ�რáƒ�áƒ�" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "წვდáƒ�მáƒ� áƒ�კრძáƒ�ლულიáƒ�" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "გáƒ�დმáƒ�ვწერáƒ� დáƒ�სáƒ�კრáƒ�ვი სიáƒ�?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "ვიდეáƒ� დáƒ�სáƒ�კრáƒ�ვი სიის ნáƒ�წილიáƒ�." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "ერთი ვიდეáƒ�" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "დáƒ�სáƒ�კრáƒ�ვი სიის ყველáƒ� ვიდეáƒ�" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "ზáƒ�გáƒ�დი" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "მენიუს გáƒ�ხსნáƒ�" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "ფáƒ�ნჯრის დáƒ�ხურვáƒ�" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "გáƒ�სვლáƒ�" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "კლáƒ�ვიáƒ�ტურის მáƒ�ლსáƒ�ხმáƒ�ბები" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "ნáƒ�ვიგáƒ�ციáƒ�" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "უკáƒ�ნ გáƒ�დáƒ�სვლáƒ�" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "áƒ�უდიáƒ�ზე გáƒ�დáƒ�რთვáƒ�" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "ვიდეáƒ�ზე გáƒ�დáƒ�რთვáƒ�" #: src/window.py:187 msgid "Downloading" msgstr "მიმდინáƒ�რეáƒ�ბს გáƒ�დმáƒ�წერáƒ�" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} /{}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "უცნáƒ�ბი" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "გáƒ�დმáƒ�წერáƒ� ჩáƒ�ვáƒ�რდáƒ�" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "გáƒ�დმáƒ�წერáƒ� დáƒ�სრულდáƒ�" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "გáƒ�დმáƒ�წერის მდებáƒ�რეáƒ�ბის გáƒ�ხსნáƒ�" #: src/window.py:329 msgid "Reset to Default" msgstr "ნáƒ�გულისხმევზე ჩáƒ�მáƒ�ყრáƒ�" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "გáƒ�დმáƒ�წერის მდებáƒ�რეáƒ�ბის შეცვლáƒ�" #: src/window.py:360 msgid "Invalid folder selected" msgstr "áƒ�რჩეულიáƒ� áƒ�რáƒ�სწáƒ�რი სáƒ�ქáƒ�ღáƒ�ლდე" #: src/window.py:364 msgid "Select Folder" msgstr "áƒ�ირჩიეთ სáƒ�ქáƒ�ღáƒ�ლდე" #: src/window.ui:41 msgid "About Video Downloader" msgstr "ვიდეáƒ�ს გáƒ�დმáƒ�მწერის შესáƒ�ხებ" #: src/window.ui:91 msgid "Main Menu" msgstr "მთáƒ�ვáƒ�რი მენიუ" #: src/window.ui:105 msgid "Audio" msgstr "áƒ�უდიáƒ�" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "გáƒ�დმáƒ�წერáƒ�" #: src/window.ui:156 msgid "Video" msgstr "ვიდეáƒ�" #: src/window.ui:186 msgid "Resolution" msgstr "გáƒ�რჩევáƒ�დáƒ�ბáƒ�" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "მირჩევნიáƒ� MPEG ფáƒ�რმáƒ�ტი" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "უკáƒ�ნ" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "დეტáƒ�ლები" video-downloader-0.12.31/po/ko.po000066400000000000000000000157111516223405600165200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Lee Junseo , 2023. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2023-04-25 08:48+0000\n" "Last-Translator: Lee Junseo \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.18-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "비디오 다운로ë�”" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 #, fuzzy msgid "Download web videos" msgstr "유튜브, ë˜�는 다양한 웹사ì�´íЏì—�서 ë�™ì˜�ìƒ�ì�„ 다운받으세요" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "간편한 ì�¸í„°íŽ˜ì�´ìŠ¤ë¡œ 웹사ì�´íŠ¸ë“¤ì—�서 ë�™ì˜�ìƒ�ì�„ 다운받ì�„ 수 있습니다. 다ì�Œê³¼ ê°™" "ì�€ 기능들ì�„ 제공합니다:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "ë�™ì˜�ìƒ�ì�„ MP3 형ì‹�으로 변환하기" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "암호가 있거나 비공개ë�œ ì˜�ìƒ�들ì�„ ì§€ì›�합니다" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "ë�™ì˜�ìƒ� 한개, ë˜�는 재ìƒ�목ë¡� 전체를 다운받ì�„ 수 있습니다" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "당신ì�˜ ì˜�ìƒ� 품질 ì„ íƒ�ì—� ë”°ë�¼ 비디오ì�˜ 형ì‹�ì�„ ìž�ë�™ìœ¼ë¡œ ì„ íƒ�합니다" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp를 기반으로 합니다." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "새 ì°½" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "ì�¸ì¦� í•„ìš”" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "취소" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "로그ì�¸" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "건너뛰기" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "ì�´ ì˜�ìƒ�ì�€ 공개 ìƒ�태가 아닙니다." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "ì•„ì�´ë””" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "비밀번호" #: src/main.py:38 msgid "Prefill URL field" msgstr "미리 ìž…ë ¥ë�œ URL란" #: src/model.py:67 msgid "Best" msgstr "최ìƒ�" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "잘못ë�œ 다운로드 í�´ë�”" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "경로가 아님" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "ì ‘ê·¼ 권한 ì—†ì�Œ" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "재ìƒ�목ë¡�ì�„ 다운로드 하시겠습니까?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "재ìƒ�목ë¡�ì—� í�¬í•¨ë�œ ì˜�ìƒ�입니다." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "단ì�¼ ì˜�ìƒ�" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "재ìƒ�목ë¡�ì�˜ 모든 ë�™ì˜�ìƒ�들" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "ì�¼ë°˜" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "매뉴 열기" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "ì°½ 닫기" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "나가기" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "키보드 단축키" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "네비게ì�´ì…˜" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "뒤로가기" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "ì�Œì„±ìœ¼ë¡œ 전환하기" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "ì˜�ìƒ�으로 전환하기" #: src/window.py:187 msgid "Downloading" msgstr "다운로드중" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} ì�˜ {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "알수없ì�Œ" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "다운로드 실패" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "다운로드 완료" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "다운로드 위치 열기" #: src/window.py:329 msgid "Reset to Default" msgstr "기본값으로 초기화" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "다운로드 위치 변경" #: src/window.py:360 msgid "Invalid folder selected" msgstr "잘못ë�œ í�´ë�” ì„ íƒ�ë�¨" #: src/window.py:364 msgid "Select Folder" msgstr "í�´ë�” ì„ íƒ�" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Video Downloaderì—� 대하여" #: src/window.ui:91 msgid "Main Menu" msgstr "ë©”ì�¸ 매뉴" #: src/window.ui:105 msgid "Audio" msgstr "ì�Œì„±" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "다운로드" #: src/window.ui:156 msgid "Video" msgstr "ë�™ì˜�ìƒ�" #: src/window.ui:186 msgid "Resolution" msgstr "í•´ìƒ�ë�„" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG 형ì‹� 선호" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "뒤로가기" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "ìž�세히 보기" video-downloader-0.12.31/po/meson.build000066400000000000000000000000611516223405600177010ustar00rootroot00000000000000i18n.gettext('video-downloader', preset: 'glib') video-downloader-0.12.31/po/nb.po000066400000000000000000000152501516223405600165040ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Allan Nordhøy , 2023. # AnjaRuni , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-05-19 14:36+0000\n" "Last-Translator: AnjaRuni \n" "Language-Team: Norwegian BokmÃ¥l \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.12-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Videonedlaster" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Last ned nettvideoer" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Last ned videoer med et lettfattelig brukergrensesnitt. Du kan gjøre bruk av " "følgende:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Konverter videoer til MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Støtter passordbeskyttede og private videoer" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Last ned enkeltvideoer eller hele spillelister" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Velg videoformat automatisk basert pÃ¥ dine kvalitetsinnstillinger" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Basert pÃ¥ yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;Nedlasting;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nytt vindu" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Identitetsbekreftelse kreves" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Avbryt" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Logg inn" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Hopp over" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Videoen er ikke offentlig." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Brukernavn" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Passord" #: src/main.py:38 msgid "Prefill URL field" msgstr "ForhÃ¥ndsutfyll nettadressefelt" #: src/model.py:67 msgid "Best" msgstr "Best" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ugyldig nedlastingsmappe" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ikke en mappe" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Tilgang nektet" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Last ned spilleliste?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Videoen er en del av en spilleliste." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Enkeltvideo" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Alle videoer i spilleliste" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Generelt" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Ã…pne meny" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Lukk vindu" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Avslutt" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Tastatursnarveier" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigasjon" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "GÃ¥ tilbake" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Bytt til lyd" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Bytt til video" #: src/window.py:187 msgid "Downloading" msgstr "Laster ned" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} av {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "ukjent" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Nedlasting mislyktes" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Nedlasting fullført" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Ã…pne nedlastingsmappe" #: src/window.py:329 msgid "Reset to Default" msgstr "Tilbakestill til forvalg" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Endre nedlastingsmappe" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ugyldig mappe valgt" #: src/window.py:364 msgid "Select Folder" msgstr "Velg mappe" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Om Videonedlaster" #: src/window.ui:91 msgid "Main Menu" msgstr "Hovedmeny" #: src/window.ui:105 msgid "Audio" msgstr "Lyd" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "Nettadresse" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Last ned" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Oppløsning" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Foretrekk MPEG-format" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Tilbake" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detaljer" video-downloader-0.12.31/po/nl.po000066400000000000000000000154311516223405600165170ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Heimen Stoffels , 2020-2021. # Philip Goto , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-19 10:09+0000\n" "Last-Translator: Philip Goto \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.6-rc\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video­downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Download web­video's" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Download video's van websites via een gemakkelijk te gebruiken interface. " "Bevat de volgende functies:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converteer video's naar MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Ondersteunt met wachtwoord beveiligde video's en privé­video's" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Download losse video's of hele afspeel­lijsten" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Bepaalt automatisch het video­formaat op basis van je kwaliteits­instellingen" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Gebaseerd op yt-dlp" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;downloaden;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nieuw venster" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Authenticatie vereist" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Annuleren" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Inloggen" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Overslaan" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Deze video is niet openbaar" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Gebruikers­naam" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Wachtwoord" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL-veld automatisch invullen" #: src/model.py:67 msgid "Best" msgstr "Beste" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ongeldige download­map" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Geen map" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Toestemming geweigerd" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Afspeel­lijst downloaden?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Deze video maakt deel uit van een afspeel­lijst" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Losse video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Alle video's in de afspeel­lijst" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Algemeen" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menu openen" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Venster sluiten" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Afsluiten" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Sneltoetsen" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigatie" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Ga terug" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Schakelen naar audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Schakelen naar video" #: src/window.py:187 msgid "Downloading" msgstr "Bezig met downloaden" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} van {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "onbekend" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Downloaden mislukt" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Downloaden voltooid" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Download­locatie openen" #: src/window.py:329 msgid "Reset to Default" msgstr "Standaard herstellen" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Download­locatie aanpassen" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ongeldige map geselecteerd" #: src/window.py:364 msgid "Select Folder" msgstr "Map selecteren" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Over Video­downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Hoofdmenu" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Downloaden" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Resolutie" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG-formaat voorkeur geven" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Terug" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Details" video-downloader-0.12.31/po/pl.po000066400000000000000000000156451516223405600165300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # AngryPenguinPL , 2024. # Piotr Wieczorek , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-10-23 09:19+0000\n" "Last-Translator: Piotr Wieczorek \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 5.8.2-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Pobierz filmy z internetu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Pobieraj filmy ze stron internetowych z Å‚atwym w użytkowaniu interfejsie. " "Oferuje nastÄ™pujÄ…ce funkcje:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Przekonwertuj wideo do MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "ObsÅ‚uguje prywatne filmy i te chronione hasÅ‚em" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Pobierz pojedynczy film albo całą listÄ™ odtwarzania" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Automatycznie wybiera format wideo na podstawie Twoich wymagaÅ„ jakoÅ›ciowych" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Oparty na yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Pobieranie;Wideo;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nowe Okno" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Wymagane Uwierzytelnienie" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Anuluj" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Zaloguj siÄ™" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "PomiÅ„" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "To wideo nie jest publiczne." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nazwa użytkownika" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "HasÅ‚o" #: src/main.py:38 msgid "Prefill URL field" msgstr "WstÄ™pnie wypeÅ‚nione pole adresu URL" #: src/model.py:67 msgid "Best" msgstr "Najlepsza" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "NieprawidÅ‚owy folder pobierania" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "To nie jest katalog" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Brak dostÄ™pu" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Pobrać listÄ™ odtwarzania?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "To wideo jest częściÄ… listy odtwarzania." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Pojedynczy film" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Wszystkie filmy z listy odtwarzania" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Ogólne" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Otwórz menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Zamknij okno" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Wyjdź" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Skróty klawiszowe" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Nawigacja" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Powrót" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Przełącz na dźwiÄ™k" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Przełącz na wideo" #: src/window.py:187 msgid "Downloading" msgstr "Pobieranie" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} z {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "nieznany" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Pobieranie nieudane" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Pobieranie ukoÅ„czone" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Otwórz katalog pobierania" #: src/window.py:329 msgid "Reset to Default" msgstr "Przywróć ustawienia domyÅ›lne" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "ZmieÅ„ katalog pobierania" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Wybrano niewÅ‚aÅ›ciwy folder" #: src/window.py:364 msgid "Select Folder" msgstr "Wybierz folder" #: src/window.ui:41 msgid "About Video Downloader" msgstr "O aplikacji Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu główne" #: src/window.ui:105 msgid "Audio" msgstr "DźwiÄ™k" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Pobierz" #: src/window.ui:156 msgid "Video" msgstr "Wideo" #: src/window.ui:186 msgid "Resolution" msgstr "Rozdzielczość" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferuj format MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Wróć" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Szczegóły" video-downloader-0.12.31/po/pt.po000066400000000000000000000160021516223405600165240ustar00rootroot00000000000000# Portuguese translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Gustavo Machado Peredo , 2020. # FCastro32 , 2024. # tuxanator , 2024. # Manuela Silva , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-07-10 13:17+0000\n" "Last-Translator: Manuela Silva \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.13-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Transferir vídeos da Web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Transferir vídeos dos sites da Web com uma interface fácil de utilizar. " "Fornece as seguintes funcionalidades:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converter vídeos para MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Suporte para vídeos privados e protegidos por palavra-passe" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Transferir um vídeo ou listas de reprodução inteiras" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Seleciona automaticamente um formato de vídeo baseado nas suas escolhas de " "qualidade" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Baseado no yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Transferir;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nova Janela" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autenticação Necessária" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancelar" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Iniciar sessão" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Ignorar" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "O vídeo não é público." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nome do utilizador" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Palavra-passe" #: src/main.py:38 msgid "Prefill URL field" msgstr "Preencha o campo de URL" #: src/model.py:67 msgid "Best" msgstr "Melhor" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Pasta de transferências inválida" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Não é uma diretoria" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permissão negada" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Transferir lista de reprodução?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "O vídeo é parte de uma lista de reprodução." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Um Vídeo" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Todos os Vídeos da Lista de Reprodução" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Geral" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Abrir Menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Fechar Janela" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Sair" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Teclas de Atalho" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navegação" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Anterior" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Mudar para Ã�udio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Mudar para Vídeo" #: src/window.py:187 msgid "Downloading" msgstr "A transferir" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "desconhecido" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Transferência falhou" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Transferência terminada" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Abrir Localização da Transferência" #: src/window.py:329 msgid "Reset to Default" msgstr "Reiniciar para Predefinição" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Alterar Localização da Transferência" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Pasta selecionada inválida" #: src/window.py:364 msgid "Select Folder" msgstr "Selecionar Pasta" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Sobre o Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu Principal" #: src/window.ui:105 msgid "Audio" msgstr "Ã�udio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Transferir" #: src/window.ui:156 msgid "Video" msgstr "Vídeo" #: src/window.ui:186 msgid "Resolution" msgstr "Resolução" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferir formato MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Anterior" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalhes" video-downloader-0.12.31/po/pt_BR.po000066400000000000000000000154501516223405600171150ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Thiago Carmona , 2024. # dedakir923 , 2025. # delvani , 2026. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2026-02-16 21:09+0000\n" "Last-Translator: delvani \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.16\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Baixar vídeos da web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Baixar vídeos de sites com uma intertace fácil de usar. Contém as seguintes " "funcionalidades:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Converta vídeos para MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Suporte para vídeos privados e protegidos por senha" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Baixar apenas um vídeo ou a playlist inteira" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Automaticamente seleciona um formato de arquivo baseado nas suas escolhas" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Baseado no yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nova Janela" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autenticação obrigatória" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Cancelar" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Fazer login" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Pular" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Esse vídeo não é público." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Usuário" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Senha" #: src/main.py:38 msgid "Prefill URL field" msgstr "Preencha o campo URL" #: src/model.py:67 msgid "Best" msgstr "Melhor" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (QHD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (FullHD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Pasta de download inválida" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Não é um diretório" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permissão negada" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Baixar playlist?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Esse vídeo faz parte de uma playlist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Único vídeo" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Todos os vídeos da playlist" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Geral" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Abrir menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Fechar janela" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Sair" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Teclas de atalho" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navegação" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Retornar" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Alternar para áudio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Alternar para vídeo" #: src/window.py:187 msgid "Downloading" msgstr "Fazendo o download" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} de {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "desconhecido" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Falha no download" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Download concluído" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Abrir local do download" #: src/window.py:329 msgid "Reset to Default" msgstr "Restaurar para o padrão" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Mudar local do download" #: src/window.py:360 msgid "Invalid folder selected" msgstr "A pasta selecionada não é válida" #: src/window.py:364 msgid "Select Folder" msgstr "Selecionar pasta" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Sobre o Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu principal" #: src/window.ui:105 msgid "Audio" msgstr "Ã�udio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Download" #: src/window.ui:156 msgid "Video" msgstr "Vídeo" #: src/window.ui:186 msgid "Resolution" msgstr "Resolução" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Preferir formato MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Voltar" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalhes" video-downloader-0.12.31/po/ro.po000066400000000000000000000156601516223405600165320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # mere , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-10-26 10:15+0000\n" "Last-Translator: mere \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" "X-Generator: Weblate 5.8.2-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Descărcare video-uri web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "DescărcaÈ›i videoclipuri de pe site-uri web cu o interfață uÈ™or de utilizat. " "Oferă următoarele caracteristici:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "ConvertiÈ›i videoclipuri în MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Suportă videoclipuri private È™i protejare prin parolă" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "DescărcaÈ›i videoclipuri individuale sau liste de redare întregi" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Selectează automat un format video în funcÈ›ie de cerinÈ›ele tale de calitate" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Bazat pe yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;Descărcător;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Fereastră nouă" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autentificare necesară" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Anulează" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Conectează-te" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Omite" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Videoclipul nu este public." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Nume de utilizator" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Parolă" #: src/main.py:38 msgid "Prefill URL field" msgstr "PrecompletaÈ›i câmpul URL" #: src/model.py:67 msgid "Best" msgstr "Cel mai bun" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Dosar de descărcare invalid" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nu este un director" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Permisiunea refuzată" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "DescărcaÈ›i playlist-ul?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Videoclipul face parte dintr-un playlist." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Un singur videoclip" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Toate videoclipurile din Playlist" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "General" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "DeschideÈ›i meniul" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "ÃŽnchideÈ›i fereastra" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "ÃŽnchide" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Comenzi rapide de la tastatură" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigare" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "ÃŽnapoi" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "ComutaÈ›i la Audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "ComutaÈ›i la Video" #: src/window.py:187 msgid "Downloading" msgstr "Descărcarea" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} din {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "necunoscut" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Descărcare eÈ™uată" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Descărcarea s-a terminat" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "DeschideÈ›i locaÈ›ia de descărcare" #: src/window.py:329 msgid "Reset to Default" msgstr "Resetare la valorile implicite" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Modificarea locaÈ›iei de descărcare" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Dosar nevalid selectat" #: src/window.py:364 msgid "Select Folder" msgstr "SelectaÈ›i Folder" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Despre Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Meniu principal" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL-ul" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Descarcă" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "RezoluÅ£ie" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Prefer formatul MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "ÃŽnainte" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detalii" video-downloader-0.12.31/po/ru.po000066400000000000000000000174501516223405600165370ustar00rootroot00000000000000# Russian translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Umidjon Almasov , 2022. # Valeriy Manzhos , 2023. # Host1c , 2024. # Oleksandr Pidlisniak , 2025. # Yurt Page , 2025. # klewf , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-12-13 17:00+0000\n" "Last-Translator: klewf \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Weblate 5.15-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Загрузчик видео" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "ПозволÑ�ет Ñ�качать видео из интернета" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Загружает видео Ñ� Ñ�айтов при помощи легкого в иÑ�пользовании интерфейÑ�а. " "ПредоÑ�тавлÑ�ет Ñ�ледующие возможноÑ�ти:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "КонвертациÑ� видео в MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Поддержка видео защищенных паролем и чаÑ�тные" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Загрузка отдельных видео или плейлиÑ�та целиком" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Ð�втоматичеÑ�кий выбор формата видео на оÑ�нове ваших требований к качеÑ�тву" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "ОÑ�нован на yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YuuTube;Скачать;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Ð�овое окно" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "ТребуетÑ�Ñ� авторизациÑ�" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Отмена" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Вход" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "ПропуÑ�тить" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Видео не Ñ�влÑ�етÑ�Ñ� публичным." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "ИмÑ� пользователÑ�" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Пароль" #: src/main.py:38 msgid "Prefill URL field" msgstr "Заполните поле URL" #: src/model.py:67 msgid "Best" msgstr "Ð�аилучшее" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ð�еправильнаÑ� папка длÑ� загрузки" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ð�е каталог" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Отказано в доÑ�тупе" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Загрузить плейлиÑ�Ñ‚?" #: src/playlist_dialog.py:30 #, fuzzy msgid "The video is part of a playlist." msgstr "Видео Ñ�влÑ�етÑ�Ñ� чаÑ�тью плейлиÑ�та." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Отдельное видео" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Ð’Ñ�е видео в плейлиÑ�те" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "ОÑ�новное" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Открыть меню" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Закрыть окно" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Завершить" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Комбинации клавиш" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Ð�авигациÑ�" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Перейти назад" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "ПереключитьÑ�Ñ� на аудио" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "ПереключитьÑ�Ñ� на видео" #: src/window.py:187 msgid "Downloading" msgstr "Загрузка" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} из {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "неизвеÑ�тно" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Загрузка не удалаÑ�ÑŒ" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Загрузка завершена" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Открыть меÑ�то загрузки" #: src/window.py:329 msgid "Reset to Default" msgstr "СброÑ�ить по умолчанию" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Изменить меÑ�то загрузки" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Выбрана недопуÑ�тимаÑ� папка" #: src/window.py:364 msgid "Select Folder" msgstr "Выберите папку" #: src/window.ui:41 msgid "About Video Downloader" msgstr "О программе" #: src/window.ui:91 msgid "Main Menu" msgstr "Главное меню" #: src/window.ui:105 msgid "Audio" msgstr "Ð�удио" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Загрузить" #: src/window.ui:156 msgid "Video" msgstr "Видео" #: src/window.ui:186 msgid "Resolution" msgstr "Разрешение" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Предпочитать формат MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Ð�азад" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Подробно" video-downloader-0.12.31/po/sk.po000066400000000000000000000154731516223405600165310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Albano Battistella , 2020. # MartinIIoT <>, 2020-2021. # Milan Å alka , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-06-19 10:09+0000\n" "Last-Translator: Milan Å alka \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" "X-Generator: Weblate 5.6-rc\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "StiahnuÅ¥ webové videá" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "SÅ¥ahovanie videí zo stránok s jednoduchým rozhraním s nasledujúcimi " "vlastnosÅ¥ami:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Konvertovanie videí do MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Podpora zaheslovaných a súkromných videí" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Stiahnutie jedného videa alebo celých playlistov" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Automatický výber formátu videa podľa zvolených požiadaviek na kvalitu" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Založený na yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;StiahnuÅ¥;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nové okno" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Vyžaduje sa autentifikácia" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ZruÅ¡iÅ¥" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "PrihlásiÅ¥ sa" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "PreskoÄ�iÅ¥" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video nie je verejné." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Používateľské meno" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Heslo" #: src/main.py:38 msgid "Prefill URL field" msgstr "Predvyplnené URL pole" #: src/model.py:67 msgid "Best" msgstr "NajlepÅ¡ie" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Neplatný prieÄ�inok na stiahnutie" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Nie je adresár" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Povolenie zamietnutá" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "StiahnuÅ¥ playlist?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video je Ä�asÅ¥ou playlistu." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Jedno video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "VÅ¡etky videá z playlistu" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "VÅ¡eobecné" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Otvorenie ponuky" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "ZatvoriÅ¥ okno" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "UkonÄ�enie" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Klávesové skratky" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigácia" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Prejdenie späť" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Prepnúť na Audio" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Prepnúť na video" #: src/window.py:187 msgid "Downloading" msgstr "SÅ¥ahujem" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} z {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "neznámy" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "SÅ¥ahovanie neúspeÅ¡né" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "SÅ¥ahovanie je hotové" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "OtvoriÅ¥ cieľové umiestnenie" #: src/window.py:329 msgid "Reset to Default" msgstr "Reset na Default" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "ZmeniÅ¥ Poloha" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Neplatné zložky vybrané" #: src/window.py:364 msgid "Select Folder" msgstr "Vyberte prieÄ�inok" #: src/window.ui:41 msgid "About Video Downloader" msgstr "O programe" #: src/window.ui:91 msgid "Main Menu" msgstr "Hlavná ponuka" #: src/window.ui:105 msgid "Audio" msgstr "Zvuk" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "StiahnuÅ¥" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Rozlíšenie" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "PreferenÄ�ný formát" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Späť" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detaily" video-downloader-0.12.31/po/sl.po000066400000000000000000000140001516223405600165130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Ivan Lukan , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-11-13 23:05+0000\n" "Last-Translator: Ivan Lukan \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3;\n" "X-Generator: Weblate 5.15-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Prenosnik videov" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Prenos spletnih videov" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Prenesite videe s spletnih strani z vmesnikom, ki je enostaven za uporabo. " "Ponuja naslednje funkcije:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Pretvori videe v MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Podpira videe, zaÅ¡Ä�itene z geslom, in zasebne videe" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Prenesite posamezne videe ali celotne sezname predvajanja" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Samodejno izbere format videoposnetka glede na vaÅ¡e zahteve kakovosti" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "" #: src/main.py:38 msgid "Prefill URL field" msgstr "" #: src/model.py:67 msgid "Best" msgstr "" #: src/model.py:68 msgid "4320p (8K)" msgstr "" #: src/model.py:69 msgid "2160p (4K)" msgstr "" #: src/model.py:70 msgid "1440p (HD)" msgstr "" #: src/model.py:71 msgid "1080p (HD)" msgstr "" #: src/model.py:72 msgid "720p (HD)" msgstr "" #: src/model.py:73 msgid "480p" msgstr "" #: src/model.py:74 msgid "360p" msgstr "" #: src/model.py:75 msgid "240p" msgstr "" #: src/model.py:76 msgid "144p" msgstr "" #: src/model.py:159 msgid "Invalid download folder" msgstr "" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "" #: src/window.py:187 msgid "Downloading" msgstr "" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "" #: src/window.py:329 msgid "Reset to Default" msgstr "" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "" #: src/window.py:360 msgid "Invalid folder selected" msgstr "" #: src/window.py:364 msgid "Select Folder" msgstr "" #: src/window.ui:41 msgid "About Video Downloader" msgstr "" #: src/window.ui:91 msgid "Main Menu" msgstr "" #: src/window.ui:105 msgid "Audio" msgstr "" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "" #: src/window.ui:156 msgid "Video" msgstr "" #: src/window.ui:186 msgid "Resolution" msgstr "" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "" video-downloader-0.12.31/po/sv.po000066400000000000000000000155671516223405600165500ustar00rootroot00000000000000# Swedish translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Ã…ke Engelbrektson , 2021. # Luna Jernberg , 2023. # bittin1ddc447d824349b2 , 2024. # AnjaRuni , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-05-19 14:36+0000\n" "Last-Translator: AnjaRuni \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.12-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Ladda ner webbvideor" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Ladda ner videoklipp frÃ¥n webbplatser, med ett lättanvänt gränssnitt. " "InnehÃ¥ller följande funktioner:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Konvertera videoklipp till MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Stödjer lösenordsskyddade och privata videoklipp" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Ladda ner enstaka videoklipp eller hela spelningslistor" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Väljer automatiskt ett videoformat, baserat pÃ¥ dina kvalitetskrav" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Baserat pÃ¥ yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Ladda ner;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Nytt fönster" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Autentisering krävs" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Avbryt" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Logga in" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Hoppa över" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Videon är inte offentlig." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Användarnamn" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Password" #: src/main.py:38 msgid "Prefill URL field" msgstr "Förifyll URL-fält" #: src/model.py:67 msgid "Best" msgstr "Bäst" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ogiltig nerladdningsmapp" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Inte en mapp" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Ã…tkomst nekad" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Vill du ladda ner spelningslistan?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Denna video är en del av en spelningslista." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Enstaka video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Alla videor i spelningslistan" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Allmänt" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Öppna meny" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Stänga fönster" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Avsluta" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Tangentbordsgenvägar" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigering" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "GÃ¥ bakÃ¥t" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Ändra till ljud" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Ändra till video" #: src/window.py:187 msgid "Downloading" msgstr "Nerladdning" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} av {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "okänd" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Nerladdning misslyckades" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Nerladdning slutförd" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Öppna nerladdningsplats" #: src/window.py:329 msgid "Reset to Default" msgstr "Ã…terställ till standard" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Ändra nerladdningsplats" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Ogiltig mapp vald" #: src/window.py:364 msgid "Select Folder" msgstr "Välj mapp" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Om Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Huvudmeny" #: src/window.ui:105 msgid "Audio" msgstr "Ljud" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Ladda ner" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Upplösning" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Föredra MPEG format" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Tillbaka" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Detaljerad information" video-downloader-0.12.31/po/ta.po000066400000000000000000000223511516223405600165110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # தமிழà¯�நேரமà¯� , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-03-23 19:43+0000\n" "Last-Translator: தமிழà¯�நேரமà¯� \n" "Language-Team: Tamil \n" "Language: ta\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.11-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "வீடியோ பதிவிறகà¯�கமà¯�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "வலை வீடியோகà¯�களைபà¯� பதிவிறகà¯�கவà¯�à®®à¯�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "பயனà¯�படà¯�தà¯�த எளிதான இடைமà¯�கதà¯�தà¯�டனà¯� வலைதà¯�தளஙà¯�களிலிரà¯�நà¯�தà¯� வீடியோகà¯�களைபà¯� பதிவிறகà¯�கவà¯�à®®à¯�. பினà¯�வரà¯�à®®à¯�" " à®…à®®à¯�சஙà¯�களை வழஙà¯�கà¯�கிறதà¯�:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "வீடியோகà¯�களை எமà¯�பி 3 ஆக மாறà¯�றவà¯�à®®à¯�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "கடவà¯�சà¯�சொலà¯� பாதà¯�காகà¯�கபà¯�படà¯�ட மறà¯�à®±à¯�à®®à¯� தனிபà¯�படà¯�ட வீடியோகà¯�களை ஆதரிகà¯�கிறதà¯�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "à®’à®±à¯�றை வீடியோகà¯�களà¯� அலà¯�லதà¯� à®®à¯�à®´à¯� பிளேலிசà¯�டà¯�களைபà¯� பதிவிறகà¯�கவà¯�à®®à¯�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "உஙà¯�களà¯� தரமான கோரிகà¯�கைகளினà¯� அடிபà¯�படையிலà¯� வீடியோ வடிவமைபà¯�பை தானாகவே தேரà¯�நà¯�தெடà¯�கà¯�கிறதà¯�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "YT-DLP à®� அடிபà¯�படையாககà¯� கொணà¯�டதà¯�." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube; பதிவிறகà¯�கமà¯�;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "பà¯�திய சாளரமà¯�" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "à®�à®±à¯�பà¯� தேவை" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "ரதà¯�தà¯�செயà¯�" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "விடà¯�பதிகை" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "தவிரà¯�" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "வீடியோ பொதà¯�விலà¯� இலà¯�லை." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "பயனரà¯�பெயரà¯�" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "கடவà¯�சà¯�சொலà¯�" #: src/main.py:38 msgid "Prefill URL field" msgstr "à®®à¯�கவரி பà¯�லதà¯�தை à®®à¯�னà¯�னரே நிரபà¯�பவà¯�à®®à¯�" #: src/model.py:67 msgid "Best" msgstr "சிறநà¯�த" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320 ப (8 கே)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (செகà¯�கா)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440 ப (எசà¯�டி)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (எசà¯�டி)" #: src/model.py:72 msgid "720p (HD)" msgstr "720 ப (எசà¯�டி)" #: src/model.py:73 msgid "480p" msgstr "480 ப" #: src/model.py:74 msgid "360p" msgstr "360 ப" #: src/model.py:75 msgid "240p" msgstr "240 ப" #: src/model.py:76 msgid "144p" msgstr "144 ப" #: src/model.py:159 msgid "Invalid download folder" msgstr "தவறான பதிவிறகà¯�க கோபà¯�பà¯�றை" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "à®’à®°à¯� அடைவà¯� அலà¯�ல" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "இசைவà¯� மறà¯�கà¯�கபà¯�படà¯�டதà¯�" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "பிளேலிசà¯�டà¯�டைபà¯� பதிவிறகà¯�கவா?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "வீடியோ à®’à®°à¯� பிளேலிசà¯�டà¯�டினà¯� à®’à®°à¯� பகà¯�தியாகà¯�à®®à¯�." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "à®’à®±à¯�றை வீடியோ" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "பிளேலிசà¯�டà¯�டிலà¯� உளà¯�ள அனைதà¯�தà¯� வீடியோகà¯�களà¯�à®®à¯�" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "பொதà¯�" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "திறநà¯�த படà¯�டியலà¯�" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "சாளரதà¯�தை மூடà¯�" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "வெளியேறà¯�" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "விசைபà¯�பலகை கà¯�à®±à¯�கà¯�கà¯�வழிகளà¯�" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "வானோடலà¯�" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "திரà¯�à®®à¯�பிசà¯� செலà¯�லà¯�à®™à¯�களà¯�" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "ஆடியோவà¯�கà¯�கà¯� மாறவà¯�à®®à¯�" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "வீடியோவà¯�கà¯�கà¯� மாறவà¯�à®®à¯�" #: src/window.py:187 msgid "Downloading" msgstr "பதிவிறகà¯�கà¯�கிறதà¯�" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} of}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "தெரியவிலà¯�லை" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "பதிவிறகà¯�கமà¯� தோலà¯�வியடைநà¯�ததà¯�" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "பதிவிறகà¯�கமà¯� à®®à¯�டிநà¯�ததà¯�" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "பதிவிறகà¯�க இரà¯�பà¯�பிடதà¯�தைதà¯� திறகà¯�கவà¯�à®®à¯�" #: src/window.py:329 msgid "Reset to Default" msgstr "இயலà¯�பà¯�நிலைகà¯�கà¯� மீடà¯�டமைகà¯�கவà¯�à®®à¯�" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "பதிவிறகà¯�க இரà¯�பà¯�பிடதà¯�தை மாறà¯�றவà¯�à®®à¯�" #: src/window.py:360 msgid "Invalid folder selected" msgstr "தவறான கோபà¯�பà¯�றை தேரà¯�நà¯�தெடà¯�கà¯�கபà¯�படà¯�டதà¯�" #: src/window.py:364 msgid "Select Folder" msgstr "கோபà¯�பà¯�றையைதà¯� தேரà¯�நà¯�தெடà¯�" #: src/window.ui:41 msgid "About Video Downloader" msgstr "வீடியோ பதிவிறகà¯�கமà¯� பறà¯�றி" #: src/window.ui:91 msgid "Main Menu" msgstr "படà¯�டியலà¯� விளையாடà¯�à®™à¯�களà¯�" #: src/window.ui:105 msgid "Audio" msgstr "ஆடியோ" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "à®®à¯�கவரி" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "பதிவிறகà¯�கமà¯�" #: src/window.ui:156 msgid "Video" msgstr "ஒளிதோறà¯�றமà¯�" #: src/window.ui:186 msgid "Resolution" msgstr "பகà¯�தà¯�தலà¯�" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG வடிவமைபà¯�பை விரà¯�à®®à¯�பà¯�à®™à¯�களà¯�" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "பினà¯�" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "விவரஙà¯�களà¯�" video-downloader-0.12.31/po/tr.po000066400000000000000000000155711516223405600165400ustar00rootroot00000000000000# Turkish translations for video-downloader package. # Copyright (C) 2020-2022 video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # ÜSolmaz , 2021. # Sabri Ünal , 2022. # OÄŸuz Ersen , 2023. # Sabri Ünal , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-05-30 19:09+0000\n" "Last-Translator: Sabri Ünal \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.6-dev\n" "X-Project-Style: gnome\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video İndirici" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "İnternet sitelerinden video indirin" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Kullanımı kolay bir arayüz ile web sitelerinden video indirin. AÅŸağıdaki " "özellikleri saÄŸlar:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Videoları MP3'e dönüştür" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Parola korumalı ve özel videoları destekler" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Tek videoları veya tüm çalma listelerini indirin" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Kalite taleplerinize göre kendiliÄŸinden video biçimi seçer" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp temelli." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;İndir;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Yeni Pencere" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Kimlik DoÄŸrulaması Gerekli" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "İptal Et" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Oturum aç" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Atla" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video herkese açık deÄŸil." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Kullanıcı adı" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Parola" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL alanını önceden doldur" #: src/model.py:67 msgid "Best" msgstr "En iyi" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Geçersiz indirme klasörü" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Dizin deÄŸil" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "İzin reddedildi" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Çalma Listesi İndirilsin Mi?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video bir çalma listesinin parçası." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Tek Video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Çalma Listesindeki Tüm Videolar" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Genel" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menüyü Aç" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Pencereyi Kapat" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Çıkış" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Klavye Kısayolları" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Gezinme" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Geri git" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Sese Geç" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Videoya Geç" #: src/window.py:187 msgid "Downloading" msgstr "İndiriliyor" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "bilinmeyen" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "İndirme baÅŸarısız oldu" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "İndirme tamamlandı" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "İndirme Konumunu Aç" #: src/window.py:329 msgid "Reset to Default" msgstr "Öntanımlı DeÄŸere Sıfırla" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "İndirme Konumunu DeÄŸiÅŸtir" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Geçersiz klasör seçildi" #: src/window.py:364 msgid "Select Folder" msgstr "Klasör Seç" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Video İndirici Hakkında" #: src/window.ui:91 msgid "Main Menu" msgstr "Ana Menü" #: src/window.ui:105 msgid "Audio" msgstr "Ses" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "İndir" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Çözünürlük" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG biçimini tercih et" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Geri" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Ayrıntılar" video-downloader-0.12.31/po/uk.po000066400000000000000000000174521516223405600165320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Dan , 2023. # Ihor Hordiichuk , 2023, 2024. # Dan , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-08-19 03:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.7\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Завантажувач відео" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Завантажуйте відео із Ñ�айтів" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Завантажуйте відео з вебÑ�айтів із проÑ�тим у викориÑ�танні інтерфейÑ�ом. Ð�адає " "такі функції:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "КонвертуваннÑ� відео в MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Підтримує захищені паролем Ñ– приватні відео" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Завантажуйте окремі відео або цілі Ñ�пиÑ�ки відтвореннÑ�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Ð�втоматично вибирає формат відео на оÑ�нові ваших вимог до Ñ�коÑ�ті" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Ð�а оÑ�нові yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;Завантажити;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Ð�ове вікно" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Потрібна автентифікаціÑ�" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "СкаÑ�увати" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Увійти" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "ПропуÑ�тити" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Відео не загальнодоÑ�тупне." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Ім’Ñ� кориÑ�тувача" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Пароль" #: src/main.py:38 msgid "Prefill URL field" msgstr "Заповніть поле URL-адреÑ�и" #: src/model.py:67 msgid "Best" msgstr "Ð�айкраще" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320Ñ€ (8К)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Ð�еправильна тека длÑ� завантаженнÑ�" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Ð�е каталог" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "У дозволі відмовлено" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Завантажити Ñ�пиÑ�ок відтвореннÑ�?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Відео Ñ” чаÑ�тиною Ñ�пиÑ�ку відтвореннÑ�." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Окреме відео" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "УÑ�Ñ– відео у Ñ�пиÑ�ку відтвореннÑ�" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Загальні" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Відкрити меню" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Закрити вікно" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Вийти" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Комбінації клавіш" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Ð�авігаціÑ�" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "ПовернутиÑ�Ñ�" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "ПеремикнутиÑ�Ñ� на аудіо" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "ПеремикнутиÑ�Ñ� на відео" #: src/window.py:187 msgid "Downloading" msgstr "ЗавантаженнÑ�" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} з {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "невідомо" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Ð�е вдалоÑ�Ñ� завантажити" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "ЗавантаженнÑ� завершено" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Відкрити міÑ�це завантаженнÑ�" #: src/window.py:329 msgid "Reset to Default" msgstr "Скинути до уÑ�таленого" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Змінити міÑ�це завантаженнÑ�" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Вибрано недійÑ�ну теку" #: src/window.py:364 msgid "Select Folder" msgstr "Виберіть теку" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Про Завантажувач відео" #: src/window.ui:91 msgid "Main Menu" msgstr "Головне меню" #: src/window.ui:105 msgid "Audio" msgstr "Ð�удіо" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Завантажити" #: src/window.ui:156 msgid "Video" msgstr "Відео" #: src/window.ui:186 msgid "Resolution" msgstr "РоздільніÑ�ть" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Ð�адавати перевагу формату MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Ð�азад" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Подробиці" video-downloader-0.12.31/po/uz.po000066400000000000000000000156321516223405600165470ustar00rootroot00000000000000# Uzbek translations for video-downloader package. # Copyright (C) 2020 THE video-downloader'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Umidjon Almasov , 2022. # Elvis , 2024. # Bahrom Miragzamov , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-04-01 20:33+0000\n" "Last-Translator: Bahrom Miragzamov \n" "Language-Team: Uzbek \n" "Language: uz\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.11-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Yuklab oluvchi" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Veb-videolarni yuklab olish" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Foydalanish uchun oson boÊ»lgan interfeys orqali saytlardan video yuklab " "oladi. Quyidagi imkoniyatlarni taqdim etadi:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Videoni MP3 ga aylantirish" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Parol bilan himoyalangan va xususiy videolarni qoÊ»llab-quvvatlash" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Alohida video va pleylistlarni butunlay yuklab olish" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" "Sizning sifat talablaringizga asosan video formatini avtomatik ravishda " "tanlash" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "yt-dlp da asoslangan." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Yuklab Olish;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Yangi oyna" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Avtorizatsiya talab qilinadi" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Bekor qilish" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Kirish" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "OÊ»tkazib yuborish" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video ommaviy emas." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Foydalanuvchi nomi" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Parol" #: src/main.py:38 msgid "Prefill URL field" msgstr "URL maydonini toÊ»ldiring" #: src/model.py:67 msgid "Best" msgstr "Eng yaxshi" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Yuklab olish papkasi yaroqsiz" #: src/model.py:280 src/model.py:286 src/window.py:358 #, fuzzy msgid "Not a directory" msgstr "Papka emas" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Ruxsat berilmadi" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Pleylist yuklab olinsinmi?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video pleylist tarkibiga kiradi." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "Alohida video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Pleylistdagi hamma videolar" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Umumiy" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Menyuni Ochish" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Menyuni Yopish" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Chiqish" #: src/shortcuts_dialog.ui:57 src/window.ui:37 #, fuzzy msgid "Keyboard Shortcuts" msgstr "Klaviatura yorliqlari" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Navigatsiya" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Ortga qaytish" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Audioga o'tish" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Videoga o'tish" #: src/window.py:187 msgid "Downloading" msgstr "Yuklab olinmoqda" #: src/window.py:189 src/window.py:209 #, fuzzy msgid "{} of {}" msgstr "{} {} dan" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "noma'lum" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Yuklab olinmadi" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Yuklab olindi" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Yuklab olingan joyni ochish" #: src/window.py:329 msgid "Reset to Default" msgstr "Standart holatga qaytarish" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Yuklash joyini o'zgartirish" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Yaroqsiz papka tanlandi" #: src/window.py:364 msgid "Select Folder" msgstr "Papkani tanlash" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Dastur haqida" #: src/window.ui:91 msgid "Main Menu" msgstr "Asosiy menyu" #: src/window.ui:105 msgid "Audio" msgstr "Audio" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Yuklab olish" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "O'lchamlari" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "MPEG formatini afzal ko'rish" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Orqaga" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Tafsilotlar" video-downloader-0.12.31/po/vi.po000066400000000000000000000157441516223405600165330ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # loliisdabezt , 2025. # Ngô Quang Ä�ại , 2026. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2026-02-22 14:37+0000\n" "Last-Translator: Ngô Quang Ä�ại \n" "Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.16.1-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Trình tải xuống video" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "Tải xuống video trên web" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" "Tải xuống video từ web vá»›i giao diện dá»… sá»­ dụng. Cung cấp các tính năng sau:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "Chuyển đổi video sang MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "Há»— trợ video được bảo vệ bằng mật khẩu và video riêng tư" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "Tải xuống 1 video hoặc cả danh sách phát" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "Tá»± động chá»�n định dạng video dá»±a trên yêu cầu chất lượng cá»§a bạn" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "Dá»±a trên yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Tải xuống;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "Cá»­a sổ má»›i" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "Yêu cầu xác thá»±c" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "Há»§y" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "Ä�ăng nhập" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "Bá»� qua" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "Video không được công khai." #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "Tên ngưá»�i dùng" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "Mật khẩu" #: src/main.py:38 msgid "Prefill URL field" msgstr "Ä�iá»�n trước URL" #: src/model.py:67 msgid "Best" msgstr "Tốt nhất" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "Thư mục tải xuống không hợp lệ" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "Không phải thư mục" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "Quyá»�n truy cập bị từ chối" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "Tải xuống danh sách phát?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "Video này là 1 phần cá»§a danh sách phát." #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "1 Video" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "Tất cả Video trong danh sách phát" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "Tổng quan" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "Mở Menu" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "Ä�óng cá»­a sổ" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "Thoát" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "Phím tắt" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "Ä�iá»�u hướng" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "Quay lại" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "Chuyển sang âm thanh" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "Chuyển sang video" #: src/window.py:187 msgid "Downloading" msgstr "Ä�ang tải xuống" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} cá»§a {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "không rõ" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "Tải xuống thất bại" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "Ä�ã tải xong" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "Mở vị trí tải xuống" #: src/window.py:329 msgid "Reset to Default" msgstr "Khôi phục vá»� mặc định" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "Thay đổi vị trí tải xuống" #: src/window.py:360 msgid "Invalid folder selected" msgstr "Thư mục đã chá»�n không hợp lệ" #: src/window.py:364 msgid "Select Folder" msgstr "Chá»�n thư mục" #: src/window.ui:41 msgid "About Video Downloader" msgstr "Vá»� Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "Menu chính" #: src/window.ui:105 msgid "Audio" msgstr "Âm thanh" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "Tải xuống" #: src/window.ui:156 msgid "Video" msgstr "Video" #: src/window.ui:186 msgid "Resolution" msgstr "Ä�á»™ phân giải" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "Ưu tiên định dạng MPEG" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "Quay lại" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "Chi tiết" video-downloader-0.12.31/po/video-downloader.pot000066400000000000000000000126701516223405600215360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "" #: src/main.py:38 msgid "Prefill URL field" msgstr "" #: src/model.py:67 msgid "Best" msgstr "" #: src/model.py:68 msgid "4320p (8K)" msgstr "" #: src/model.py:69 msgid "2160p (4K)" msgstr "" #: src/model.py:70 msgid "1440p (HD)" msgstr "" #: src/model.py:71 msgid "1080p (HD)" msgstr "" #: src/model.py:72 msgid "720p (HD)" msgstr "" #: src/model.py:73 msgid "480p" msgstr "" #: src/model.py:74 msgid "360p" msgstr "" #: src/model.py:75 msgid "240p" msgstr "" #: src/model.py:76 msgid "144p" msgstr "" #: src/model.py:159 msgid "Invalid download folder" msgstr "" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "" #: src/window.py:187 msgid "Downloading" msgstr "" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "" #: src/window.py:329 msgid "Reset to Default" msgstr "" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "" #: src/window.py:360 msgid "Invalid folder selected" msgstr "" #: src/window.py:364 msgid "Select Folder" msgstr "" #: src/window.ui:41 msgid "About Video Downloader" msgstr "" #: src/window.ui:91 msgid "Main Menu" msgstr "" #: src/window.ui:105 msgid "Audio" msgstr "" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "" #: src/window.ui:156 msgid "Video" msgstr "" #: src/window.ui:186 msgid "Resolution" msgstr "" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "" video-downloader-0.12.31/po/zh_CN.po000066400000000000000000000150361516223405600171100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # "L.Yang" , 2023. # Onnar Rick , 2024. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2024-07-21 16:09+0000\n" "Last-Translator: Onnar Rick \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.7-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "Video Downloader" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "下载网站上的视频" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "以简å�•易用的界é�¢ä»Žç½‘站下载视频。æ��供以下特性:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "将视频转æ�¢ä¸ºMP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "支æŒ�密ç �ä¿�护和ç§�享视频" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "下载å�•个视频或整个播放列表" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "æ ¹æ�®ä½ çš„è´¨é‡�è¦�求自动选择视频格å¼�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "基于yt-dlp。" #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "新窗å�£" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "需è¦�认è¯�" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "å�–消" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "登陆" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "跳过" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "此视频是ä¸�公开视频。" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "用户å��" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "密ç �" #: src/main.py:38 msgid "Prefill URL field" msgstr "预填充URL字段" #: src/model.py:67 msgid "Best" msgstr "最佳" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "无效下载文件夹" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "ä¸�是一个目录" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "æ‹’ç»�访问" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "下载播放列表?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "这个视频是播放列表的一部分。" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "å�•个视频" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "播放列表里的所有视频" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "常规" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "打开è�œå�•" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "关闭窗å�£" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "退出" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "键盘快æ�·é”®" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "导航" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "返回" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "切æ�¢åˆ°éŸ³é¢‘" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "切æ�¢åˆ°è§†é¢‘" #: src/window.py:187 msgid "Downloading" msgstr "下载中" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} of {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "未知" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "下载失败" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "下载完æˆ�" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "打开下载ä½�ç½®" #: src/window.py:329 msgid "Reset to Default" msgstr "é‡�置为默认值" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "改å�˜ä¸‹è½½ä½�ç½®" #: src/window.py:360 msgid "Invalid folder selected" msgstr "选择的文件夹无效" #: src/window.py:364 msgid "Select Folder" msgstr "选择文件夹" #: src/window.ui:41 msgid "About Video Downloader" msgstr "关于Video Downloader" #: src/window.ui:91 msgid "Main Menu" msgstr "主è�œå�•" #: src/window.ui:105 msgid "Audio" msgstr "音频" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "URL" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "下载" #: src/window.ui:156 msgid "Video" msgstr "视频" #: src/window.ui:186 msgid "Resolution" msgstr "分辨率" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "倾å�‘MPEGæ ¼å¼�" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "å�Žé€€" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "详情" video-downloader-0.12.31/po/zh_TW.po000066400000000000000000000151621516223405600171420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the video-downloader package. # Peter Dave Hello , 2023. # Onnar Rick , 2024. # taijuin Lee , 2025. msgid "" msgstr "" "Project-Id-Version: video-downloader\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-04-13 19:20+0200\n" "PO-Revision-Date: 2025-06-03 17:30+0000\n" "Last-Translator: taijuin Lee \n" "Language-Team: Chinese (Traditional Han script) \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.12-dev\n" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:7 #: data/com.github.unrud.VideoDownloader.desktop.in:3 src/about_dialog.ui.in:27 #: src/main.py:39 src/window.ui:50 msgid "Video Downloader" msgstr "影片下載器" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:8 #: data/com.github.unrud.VideoDownloader.desktop.in:4 msgid "Download web videos" msgstr "下載網路影片" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:10 msgid "" "Download videos from websites with an easy-to-use interface. Provides the " "following features:" msgstr "以簡單易用的介é�¢å¾žç¶²ç«™ä¸‹è¼‰å½±ç‰‡ã€‚æ��供以下功能:" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:15 msgid "Convert videos to MP3" msgstr "將影片轉æ�›ç‚º MP3" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:16 msgid "Supports password-protected and private videos" msgstr "支æ�´å¯†ç¢¼ä¿�è­·å’Œç§�人影片" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:17 msgid "Download single videos or whole playlists" msgstr "下載單一影片或整個播放清單" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:18 msgid "Automatically selects a video format based on your quality demands" msgstr "根據您的å“�質需求自動é�¸æ“‡å½±ç‰‡æ ¼å¼�" #: data/com.github.unrud.VideoDownloader.metainfo.xml.in:20 msgid "Based on yt-dlp." msgstr "基於 yt-dlp." #. TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/com.github.unrud.VideoDownloader.desktop.in:14 msgid "YouTube;Download;" msgstr "YouTube;Download;下載;" #: data/com.github.unrud.VideoDownloader.desktop.in:17 #: src/shortcuts_dialog.ui:39 src/window.ui:26 msgid "New Window" msgstr "新視窗" #: src/authentication_dialog.py:30 msgid "Authentication Required" msgstr "需è¦�驗證身分" #: src/authentication_dialog.py:34 src/window.ui:245 msgid "Cancel" msgstr "å�–消" #: src/authentication_dialog.py:46 msgid "Sign in" msgstr "登入" #: src/authentication_dialog.py:46 msgid "Skip" msgstr "ç•¥é�Ž" #: src/authentication_dialog_login.ui:31 #: src/authentication_dialog_password.ui:31 msgid "The video is not public." msgstr "此影片未公開。" #: src/authentication_dialog_login.ui:44 msgid "Username" msgstr "使用者å��稱" #: src/authentication_dialog_login.ui:70 #: src/authentication_dialog_password.ui:40 msgid "Password" msgstr "密碼" #: src/main.py:38 msgid "Prefill URL field" msgstr "é �先填寫 URL 欄ä½�" #: src/model.py:67 msgid "Best" msgstr "最佳" #: src/model.py:68 msgid "4320p (8K)" msgstr "4320p (8K)" #: src/model.py:69 msgid "2160p (4K)" msgstr "2160p (4K)" #: src/model.py:70 msgid "1440p (HD)" msgstr "1440p (HD)" #: src/model.py:71 msgid "1080p (HD)" msgstr "1080p (HD)" #: src/model.py:72 msgid "720p (HD)" msgstr "720p (HD)" #: src/model.py:73 msgid "480p" msgstr "480p" #: src/model.py:74 msgid "360p" msgstr "360p" #: src/model.py:75 msgid "240p" msgstr "240p" #: src/model.py:76 msgid "144p" msgstr "144p" #: src/model.py:159 msgid "Invalid download folder" msgstr "無效的下載資料夾" #: src/model.py:280 src/model.py:286 src/window.py:358 msgid "Not a directory" msgstr "ä¸�是目錄" #: src/model.py:284 src/model.py:289 msgid "Permission denied" msgstr "沒有權é™�" #: src/playlist_dialog.py:29 msgid "Download Playlist?" msgstr "è¦�下載播放清單嗎?" #: src/playlist_dialog.py:30 msgid "The video is part of a playlist." msgstr "此影片是播放清單的一部分。" #: src/playlist_dialog.py:32 msgid "Single Video" msgstr "單一影片" #: src/playlist_dialog.py:33 msgid "All Videos in Playlist" msgstr "播放清單中的所有影片" #: src/shortcuts_dialog.ui:29 msgid "General" msgstr "一般" #: src/shortcuts_dialog.ui:33 msgid "Open Menu" msgstr "開啟é�¸å–®" #: src/shortcuts_dialog.ui:45 msgid "Close Window" msgstr "關閉視窗" #: src/shortcuts_dialog.ui:51 msgid "Quit" msgstr "çµ�æ�Ÿ" #: src/shortcuts_dialog.ui:57 src/window.ui:37 msgid "Keyboard Shortcuts" msgstr "é�µç›¤å¿«æ�·é�µ" #: src/shortcuts_dialog.ui:64 msgid "Navigation" msgstr "導覽" #: src/shortcuts_dialog.ui:68 msgid "Go back" msgstr "返回" #: src/shortcuts_dialog.ui:74 msgid "Switch to Audio" msgstr "切æ�›è‡³éŸ³è¨Š" #: src/shortcuts_dialog.ui:80 msgid "Switch to Video" msgstr "切æ�›è‡³å½±ç‰‡" #: src/window.py:187 msgid "Downloading" msgstr "正在下載" #: src/window.py:189 src/window.py:209 msgid "{} of {}" msgstr "{} / {}" #: src/window.py:210 src/window.py:211 msgid "unknown" msgstr "未知" #: src/window.py:281 src/window.ui:386 msgid "Download failed" msgstr "下載失敗" #: src/window.py:285 src/window.ui:511 msgid "Download finished" msgstr "下載完æˆ�" #: src/window.py:291 src/window.ui:530 msgid "Open Download Location" msgstr "開啟下載ä½�ç½®" #: src/window.py:329 msgid "Reset to Default" msgstr "é‡�設為é �設值" #: src/window.py:330 src/window.py:363 src/window.ui:33 msgid "Change Download Location" msgstr "變更下載ä½�ç½®" #: src/window.py:360 msgid "Invalid folder selected" msgstr "é�¸æ“‡çš„資料夾無效" #: src/window.py:364 msgid "Select Folder" msgstr "é�¸æ“‡è³‡æ–™å¤¾" #: src/window.ui:41 msgid "About Video Downloader" msgstr "關於《影片下載器》" #: src/window.ui:91 msgid "Main Menu" msgstr "主é�¸å–®" #: src/window.ui:105 msgid "Audio" msgstr "音訊" #: src/window.ui:127 src/window.ui:178 msgid "URL" msgstr "ç¶²å�€" #: src/window.ui:137 src/window.ui:207 msgid "Download" msgstr "下載" #: src/window.ui:156 msgid "Video" msgstr "影片" #: src/window.ui:186 msgid "Resolution" msgstr "è§£æž�度" #: src/window.ui:194 msgid "Prefer MPEG format" msgstr "å��好 MPEG æ ¼å¼�" #: src/window.ui:338 src/window.ui:357 src/window.ui:463 src/window.ui:482 msgid "Back" msgstr "返回" #: src/window.ui:405 src/window.ui:547 msgid "Details" msgstr "詳細資訊" video-downloader-0.12.31/screenshots/000077500000000000000000000000001516223405600174645ustar00rootroot00000000000000video-downloader-0.12.31/screenshots/1.png000066400000000000000000000614131516223405600203370ustar00rootroot00000000000000‰PNG  IHDRÒ–@èesBIT|dˆtEXtSoftwaregnome-screenshotï¿>)tEXtCreation TimeDo 09 Nov 2023 01:08:44 CET¢ïÒ° IDATxœìÝyxSeÞÆñ;mšÒR–A©•"® `G”¥,²8 8ìŠZ@7Ô" ¼£0n¬ê (8€ "‹:È("‚lŠ‚ 8ì ²•¢(-¥{“¼ÔĤMÚô´¥Û÷s]¹’óœí9'…Þ}ò;'Ÿ˜Êº•ç”Wö²î@eBèó ç T5„îBÝq> FÀþCUŽUýøŠ«Êëª$«Úñ\jU&XW…`YŽ <ªÔ¡º2‡ÌÊ|lI¥ Ô•-lV¶ã¨l*M¨®,Á³<Gy쨚Êcx-�}*’Êö.å1T†óP�Kp+t˜®ÈÁ°4ûn*åíT$v•nè­��º"†ÅÒè³_)l 2³•Â6+T ®hAº¤úˈ3@É)Éë ¦+R˜,n_Myž/å¾*#�ÖžçùRîû’«±8}4ž}]¾"œ?€‚øZ‹nK"T—ë@]Þƒ Ñþ5@¶5Ô ª)¬º¨Üh(.·aº<éâ„èÂÖ-h¾ÉËk€ªÈîåuAËy›_©Âty ŠÅ©cö5$çm7²@eUXhö6ß—°]œúër£<D£!º¨A¸¤Ãsy<—ž­wö6ÏÓ|£AÜh?.¹òþŒ†×‚Fš=µyk/l?…-P‘§Œ£¨�Úèèt¹ Óå-¥?…h_ta¼8·Ì¨Èò]_K9Ѝ�„i‚´E ѾŽBû ½�8—§óP¼�R{ Ðy§ [¦ e}íS™)/A±´BtÞÛÖy ÐFJD R^Î+€CI•P6R�w:ïmô*M˜.�¯4BtÞå zíK¹‡¯%!•/£Ç…�:ôÚ—úë ¦ËC ,J¼}1Š©€e<…è‚‚¶§i¾�T5…�${ Êf[ó¼í· U:H—fˆ.j€öuD *ðuD¹¨�ºÒ„鲈Eù ïÂJ. ÑÞ‚±¯#ÙŒH€ª¦ Àëiž§@m4L¥Ä£JéâŽF ў´ëºÞÂtI]„PÞõ>Ï6¯=æâ†ér?*]VA°$C´§ ì©”#ï³_žg_¶—÷5@eâ-;ž½…ê¼�ÚÓ:…m¯Â…éò¤ «‹öz ÖŽíæ]Î[µ_ý¨¬lÊ?jì- ÛUp˜ö´Ž·6OýðÅ%ÒæK½C?¼˜ ›ï-@çmóSþ0 PÕ82�#({+Ûpd)×@íÊî2_.¯M^æQÜõ íðR+Îhtawßðó0ß[ˆöóÐnò°œIiPõx Î6¹‡hO¥ÞF§í–•‡ùÅ)ñ¸¤AúR�Hå.¾Îó¢=ÍË[íÌyçå¥&H€ª(oh¶+7¹†ç¼£ÀŽ6OóMy¶‘wÝ‚F”}m¾¤£ÒeQÚaTA·¯+¨NÚ—íﲎYRÀm~2^#ÍE‰ ¼0.m.«¤lI9ÊÍEyóŸ‡gÇP­Zµ›L&SM“ÉÄh4¨’ìv»Ín·_ÈÈÈØóÝwß-îÖ­ÛI™Ê Õ&ål?ý°½…i)]´”?0{ Ñ®a¼Ü¸”£¦E)ëðT¾QØmì¼]0˜·DÃ_î£Ð~’‚×®]ݹsçñþþþ�|= €ªÄjµÆ}óÍ7¯tëÖm³¤4ýYþaÕŸ#מJB<Õ[K¾Ý6O´ysIwy ÒžF•Óž‚tÞºè¼5Í~yÚÚ5LŸ?þåÚµkÿÍç#¨Â’’’V†††NPn˜v ю׮aÚµ¦ÚÓE…yC¶ä=HËC»'U6Hû¢=ÝÆNr¯vL{ Ñ©©©ï·+Ò‘TqiiißV¯^}¤ ÓyCtÞ»{¸¾.ÉQéK¤/Uýoiö¼5Ñy/Jt�vÌ÷—”˜˜ø ! è‚ƒƒÛ%&&¾")Hî%³®™+o.óË3]Z.É`qyº�®° ½�FËô§’×é€5kÖD‡††ÞS2]¨zBCCïY³fM´Üïx–7y Оrœ·ëáò*7wF»T1ZÖ!y¯ƒövq¡ä>òìZÊá§Ü»uTÏÎÎ^m6›¯,Úa@ÙKOOWff¦rrrʺ+0Àl6+00PAAAeÝ Däääœ ¸KRªrïÞázÑ¡£Ô#oY‡·oIôT?�W¹)ï¸#ÒE¹È0/oßnXÐh´ë_>y÷¿$óêÕ«Û¢T4V«UIIIJMM%DW`999JMMURR’¬VkYw(6³Ù|åêÕ«Û)w°Òõ»9¤üwR“K{AÓÞ²jqòe‰¹#ÒŹ[GA£Ñ®ÓÞF£]/2t¼¹Á)))„´-Úa@ÙJJJ"@W2f³Yµk×.ënÅvñâÅïjÔ¨ázáaŽÜ/:,hTº°‹óŽJ—›»w”§é¼<ð¼¹Öæé~ÒþÁÁÁ7–`? Ô¥§§¢+¡œœ¥§§—u7€bû#[¹ŽF{ªp}.¬M…´• å!Hçäx;Ùy¿ÖÛíbC“ÉT³û€K.33³¬»€RÂ{‹Êà�l•÷bC× ó­ZœÝcÝQ¿"ÜÁ—+5½ÝwÚÁã·òµß*F£+/Þ[”«ÕªÌÌLegg+''Gv{n•ƒÉd’ÙlV@@€åïï_ì}ý‘­¼}«´ãbo™Íî2ííëÁËÕWƒ;”v�.Ê_ …-[PøõtK¼¼Ûõtû€JÅjµ*--Íë§v»]ÙÙÙÊÎÎVZZš\�:ïE……�@{ Ç~ò|·×mø¬K5„—×i£µ2ÞîAèé–y•JFF†.^¼X¤u233•™™©��U«V­8»÷–¹òf2_G�]ÛÊå¨tE�-lôÙñìZ3í­> BKKK+rˆvuñâE¥¥¥§ ž2WAª€¶ ¡¬G¤ «ƒv½¥�cÚÛHsÞºOu:í€AÙÙÙzç�w´zõj�={Öm^ݺuu÷ÝwkĈ (£@å–‘‘QÜ,)7Œûùù™.(£Ùåžë<ÝÒεfÚ±ŒÉe^¹«Ÿ.ë  x÷ÝwµhÑ"�óΜ9£÷ß_&“I�=öØ%î™w¿ÿþ»$©~ýúeÜx“�� IªW¯^÷(߬Vk±F¢óºxñ¢Jä"ÄÊ®4ƒ´Ñ‘__Ö+É‹ÓêÕ«%IóçÏWóæÍÝæýòË/6l˜>ÿüsŸƒôÂ… 5sæLIÒo¼¡öíÛ«ß|ó�ž{î9 >\ÇWZZšúöí+Iúúë¯\¬íW999Z°`�¾þúk%&&z\¦N�:êÚµ«† "³Ùó¯˜Ç\И1cÔ½{w·y£G�Öž={4{öl=ýôÓ’¤�?þØã×ioÙ²E'NTLLŒbbbŠyt€ï¢¢¢ ­÷ÓO?•pOr•ÄH´§mÖ¨Q£¸›)j^+ldÙèès©�ZWäi_¢�KàÌ™3’”/DKÒÍ7ßì¶Œ/Ö®]ë|½aÆbö.¿jÕª)22R‘‘‘ް¦RëÑ£‡vïÞíœ~ÿý÷µlÙ2¯!Z’Î�;§¥K—jáÂ…^—‰ŽŽ–$ýðÃníÉÉÉÚ·oŸ"""Ô¤IEDD(""B���Å< òrÜ⮤eff–ÔWØWê,VYJ;*õ›T%qqq:xð úöí«5kÖhÓ¦M²Z­%ú£ŸŸŸ×Rü)##C&LÐÔ©SÕ´iS}ýõ×’¤þóŸºá†<®³wï^=õÔSZ»v­† æq™èèhÍ�;W?ÿü³rrrœ#×?üðƒl6›:tè ???Íš5«t (¦ÒY6¢°Ý¥KÝtÓMš8q¢jÕª%Iºpá‚&Nœ¨_~ùEëÖ­+pÛ¥ø‰]¹¼ GQ•e�ö5ü–f‰€rÆÖî¸ã%%%iýúõÚ±c‡þò—¿H’Õ­[75kÖL ,�$͘1CK–,ÑôéÓÕ¡C¥¥¥iƌڼy³‚ƒƒ�¿<\EGGËb±8‰Øl6½ÿþûúòË/uúôiEDDhĈjÛ¶í%:òò)55UÏ=÷œ¦N�ªsçÎI’×-I7Þx£$9—õ¤~ýúºöÚkuðàAíÞ½[-[¶”$mݺU’Ô¡CIRÏž=e±XôÉ'ŸHÊý¨ùÝwßÕ÷߯   Õ¬™ÿKj3224oÞ<}ÿý÷ºxñ¢š7o®Q£F9kám6›>úè#­_¿^gΜQxx¸bbbÔºu뢞 \ÈÎÎ.p~DD„öìÙ£ØØXM›6M’ôÜsÏé×_U£F�еí"(N–ó%l—Y(¯ì¥*˜¯¿þZÕ«WW«V­œ%E-ï˜0a‚V®\©Ë.»L‘‘‘Ú»wo¡ëL™2E³gÏ–ÙlÖm·Ý¦ƒê©§žÒÎ�; GerñâE=ÿüó%ºMGXv”wdeeé§Ÿ~RDD„ÂÃÃ=®óúë¯kõêÕ SDD„8�o™üãúì³Ï©Ûo¿]Û·o׋/¾èüF·™3gjÁ‚2›ÍŠŠŠÒáÇ5~üx· ")ì›1_{í55lØPG�Ull¬ÆŒ£_ýUõë××k¯½V¬m£b–vô•àµ(!ß~û­æÎ�ëuD£°ùÞ;vLÿûßÿÔµkW™ÍfµmÛV~~~Ú°aƒÆŒ#“©ðÚ'NœÐæÍ›U¿~}-Z´Hf³YÓ¦MÓÒ¥K½®súôi}úé§jܸ±>øà™Íf­\¹R/¿ü²>øàçˆiU–œœ\¢Ûs”wlÛ¶M�>ú¨vìØ¡ÌÌLçOyÅÇÇkëÖ­ªW¯žfÍš%³Ù¬Y³féßÿþ·s™_ýUÛ¶mÓ-·Ü¢‰'JÊýhzóæÍ:uê”,‹¾øâ EDD8ÿhZ½zµf̘¡åË—«Y³f%zŒ¨¼ÊÓņŽ?½©[·®¦M›¦ØØX=zTRî�p¦N�Zè]‹ ÛvyËkö¦Ë½ò6"Mʹ-[¶hôèÑÚ·oŸ233uøðá"Í/ˆ£¬ãë¯¿ÖØ±cõÚk¯Éf³éÌ™3>�:~QÜzë­ÎÚÛV­Z¸ÎáÇe³Ùtûí·;×éÖ­›$éÈ‘#>÷¿2«[·n‰n¯~ýújÚ´©Nž<é ÉÒŸ#Õy?~\Rî{éx�ò^ÜzâÄ IÒÏ?ÿ¬.]º¨K—.Ú¼y³¤ÜšÐ#GŽÈf³)**ʹ�N�:¹m¨Œd±XœÓ‹Åmº‚)WY±"ŽH(Cï½÷ž$é‰'žÐ€´lÙ2½ýöÛ>Ï/ˆ#HKÒúõëÝæmذÁ-8y»šÜQÓW½zuŸö)Iéééù¶™™™)“Éäñ¶kUMhh¨¦L™¢¡C‡–èv;tè C‡éûï¿×?ü «®ºJW]u•ÇeïkA>9j¦[¶l©'Ÿ|Òm^ýúõ�aÝõ}ÎÊÊ’Édâî-(’òt±¡Éd*pä811QcÆŒÑñãÇ�ŸÆÅÅ)66VÓ§OWXXX�ÛFÁÊÛˆ4€rîØ±c’¤þýû+((H �$ç·z›_ØèÇ‘#GtäȵjÕJ?ýô“ó±|ùrI¹÷‚–ä ¶G�UVV–¤Ü�ôAì»ï¾sÎ÷TKëêꫯ–”;šîXgëÖ­²Ûíºæšk \·²«U«–¦N�ªF�©N�:’T`Íùž={$I—]vY¡ÛvŒ>/\¸P‰‰‰^G£%9À¶mÛœ¡:ï§W]u•üüütøðaÕ®][�5r>œ??üðƒó}Þ¾}»ìv»"## í/Py»_»Ã¸qãœ!zúôéš>}º5j¤¸¸8½ð ÅÚ6‘PDÚ·oŸ–-[¦�:k�›6mZàü©ãÞÑykd7n¬ (>>^‡RÓ¦MuÝu×éÀ�ûì3çH’4dÈÝ{ï½Î‘iO.»ì2 4ÈçotŒB7jÔÈؽyñÅÕ¶m[�={V§N�Ò‹/¾˜¯/�=ö˜†*???-[¶LPPP�ó£ï &¨gÏžJKKÓöíÛuýõ×kæÌ™ºòÊ+}ê/ å^lhäQ û¢uëÖiΜ9n%aaaš3gN�÷�öeÛ—H¹Î‚¥Ù¹Â¶íéî¦<óü\mÚ´ñy>ŠîìÙ³eÝ”"_JaP~”§»vHRJJJ‰»a```‘¿"Üd2µ‘”,É*)ÇåÙöÇk›ËÃþÇÃõµ\ÚäÒ–wÚuyå™çM©Ü ¤¬‚´·[ ¤À‚tåF�FqX­V�?¾D·Zäo”-ã -/m¾Ì3¬¼—v¦\÷”6…„„”ØöBBBŠ¢‹¡Bg¹Ò Òú¤T$ÕªU+ðö�¾ ®¬·ƒ,•lZÑG¤ Ü\œ‘é��� ãU ·¿¨$ªU«¦€€¥¥¥ù|b`` ‚ƒƒ/e9G¥A�¨DüýýU£F +33SÙÙÙÊÉÉqÞÒd2Él6+ @���èb H@`6›•““SÖÝ@)àÛãPZüýý)Õ(eÔH@PN¾¥€÷¨¸ÒP1rY ™Íf•u7D�€ ¢F�„éJÄl6ù›ã”/ü� „¿¿¿j×®­ôôteffR3]A™Íf2 Ti¨`‚‚‚aPPÚ@� H¤Ò€Uò®qqq²ÙleÝ €JÁϯjŽÍVÉ ]¿~ý²î*¸ªùçPLiÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€æ²îJ–Ýn/ë.L&SYw%Œ ] x ÏjÊG€výÝL¨®Ò˜ë?H»Ýî|x[\:yòÉdr>¿Ÿ ÔAºò O�ÏÒ¯ Y:y>KçSmJ϶KähʆI 0)´ºŸ® µ(²žE B-êJ„ ]Á¸†h›Í&»Ý®_OghûÑ4ýžl—9 @þþ™Ì&ð�€2e·ë|¦]gãmúéXŠê×2éÖ«ƒyy5™L&ùùùý±˜�0]¤+GˆvŒ@Ûl6­ÝsAûNåȨ°ZþºîŠ@]U'@õjšU=�›²P–R3mJ¸�£ãç²uà·L%fXµjWªnh�©n7Õ”$·ÑiÂtÅRZïVaÛõ4ßäÒîxöó0íºŒŸËzŽiÇÃÿ�gó¯ϵ²²²¶áXÊ×m³Ù”–iÕg;’u6Í_j{M°nmTƽÙ~$]ßý/MÙÙÙº,ت{ZÕRp ¿üüüœ!º¢†i‹ÅÒFR²$«¤—gÛ¯m.»ËÃ1-—i¹´å�¶Ësñja­%^ðÊ�e�·&Úf³å†èt³ê‡VÓý·×"DPÜÚ8H÷ß^KõC«élºYŸíHv–j:p£€Šƒ ]�Øl6Y­V}½'EgÒüT¿v úFÕT½šTèPQÔ«iVߨšª_;PgÒüôõžY­VÙl¶ÂWF¹B�.ç•þyaa¦öý–#K€Ew6 ¡€ ¨z Ÿîl"K€Eû~Ëѯ§3�Ÿ:KŒJW¤° ÄjµêÇ£i²X,j{M0#ÑT`õjšÕöš`Y,ýx4MV«µ¬»„""H—cyG£O�ÏÒï)v…™©‰ ¸µq�B‚Ìú=%÷÷<£Ò Aº‚°Ùl:|:Sæ]wE`Yw”�ë®T€9@‡OgR']Á¤Ë9·o.LÊ‘¿Ù_WÕ (ën€rU�ù›ýu*)Çí÷>Ê?‚t9åékÀSm2ÉDm4•H½šf™dRbª-_ˆ&P—oérεN:#Û.™LÜ©€J¤z Ÿd2)#›ú芆¡Í ¤8ÿ¨.\¸ åË—ëá‡vkÿâ‹/tÝu×)22Rÿú׿d³Ùœ_S¡N�:) ·”ä_ÿú—  š5kë8@~„犇 ]\ÊX÷Þ{¯jÖ¬©‹/jÆ úþûï}Éö@UG ®8¨€G!!!jÚ´©˺+åAeeeéÀ� /ë®”K”vÀéâÅ‹Z¸p¡jÖ¬)›Í¦¦M›ªeË–eÝ-€r‰é*ÄSÍ•Ýn—Éd’”[Î1xð`Ýwß}ÊÉÉQ“&MœóàŽ ]ET¯^]ÊÉÉqkOMMÍw‹Å¢Ûo¿]6l¸”]¨PÒU„¿¿¿7n¬M›6ÉjµJ’:$«Õª:uêä[þÆo”ÕjÕþýû/uW*j¤«�.]ºhóæÍZ°`�üüütùå—«W¯^Ë7L&“:vì¨Õ«W+22R‹E’´téRùùåþýe±XsI� ¼ HW!���êÚµ«×ùy¿¬¥aÆzä‘G¼Î¨Ê(í H¤Ò€iÀ‚4’¢¢¢Êº *‚4`A0€ À7V!111êÛ·¯î¹ç�ó³²²d³ÙT­ZµÛJÓO>©¨¨(·¯÷ÔVU9ï…½¿Ei½ïE=§�Ï�?þX_|ñ…Ž=*‹Å¢N�:éÙgŸ•Åb)Ñ>§§§ë¾ûîStt´žyæIÒË/¿¬•+Wz\~É’%jÚ´i�Ûܳg�† âuþ Aƒœû*ȸqã´víÚ|íwÜq‡&Ož,IJIIÑÌ™3µcÇ�>}ZW]u•~øauìØ±ÐíqöìYÍ�;W?üðƒÎž=«:uê¨eË–Š��UÍš5%IÔ[o½¥ýû÷«qãÆzì±ÇÔªU«Ré€Ê� §yóæ)..N¯¾új�m%Íf³i×®]1bD�mUÉ¥8ïåQi¾ï%yNÏŸ?¯G}TW^y¥vïÞ­7ß|SµjÕÒ¨Q£J §zã�7têÔ)·¶1cÆhôèÑnm«V­ÒŠ+ Ñ’tà 7hãÆ�ùÚ7nܨW_}U÷ÝwŸÏýëׯŸüq·6³9÷×Jrr²bbbÔºukMœ8Q!!!úïÿ«°°0Ÿ·_YYYzì±Çtýõ×ëÍ7ßTíÚµ•�� ;v($$D’tâÄ �9R�<òˆ&L˜ ¯¾úJO<ñ„,XàÓ¹€¼Ò(s”$]wÝu¶¡ò«(ïû#�<â|Ý A:tHû÷ï/Ñ}|÷ÝwúùçŸÕ«W/·öÀÀ@ºµ}õÕWêß¿¿OÛõóósK‡ÄÄD½õÖ[?~¼®¸â Ÿûh±XòmËañâźñÆ5nÜ8gÛUW]åó¶‹jÿþýŠ‹‹Ó’%Käïï/I sûYZ²d‰Ú·o¯AƒI’†ªèÃ?ÔĉK­o*Õ×B IDAT/j¤«˜_~ùE#FŒP‡4hÐ íÚµK’´hÑ"Í›7Ok×®UëÖ­5yòd�mRîGÞË—/×ðáÃÕ¡C ]�;w–$™L&Õ­[Wµk×vë׎;òݿյ-::Z?þø£ìv»$é§Ÿ~’$·�§wìØ¡+¯¼Rwß}w©,Û°aC·þuíÚUß~û­s]IÚ´i“ºté")7$¬_¿^S¦LÑâÅ‹e±X4räHeggö6xÞ §M›6éïÿ»–.]ª°°0 >\’¤©S§*>>^‹-Ò‡~¨øøxÍœ9Óëö-Z¤Ï?ÿ\“&MÒÒ¥Kõ׿þU¡¡¡>_RR’Þyç=óÌ3Z¹r¥ÂÃ㸸8ç:'OžÔ¬Y³Üöiô}¿êª«Ô¨Q#M›6MË—/WÏž=õÒK/éøñãžÓ‚ޱ /®.\¨ßÿ]÷ß¿ºwï®Í›7Ëf³9çoذAݺuSÓ¦MµvíZ��¼áû•W^QóæÍuûí·ö¶ëã�?V·nÝœ5Àž‹¼>ùäíß¿ßí�Iš9s¦¾ÿþ{͘1Cï¾û®’’’ò…èììl¥§§»=l6›222tîÜ9j̘1êСƒzõê¥?üйîСCeµZõÑGIÊý™ºæškœ#ðEýºé¦›Ô¤I=òÈ#Z¸p¡Üúš™™©¤¤$]yå•níáááºxñb¡T€'é*$44TcÇŽU³fͦ!C†èܹsŠ‹‹+ò¶&L˜ -Z¨^½zzú駪µk×êÌ™3ÊÉÉQ»víT³fMEFFê†np®7cÆ =ôÐCÎi»Ý®�;wê–[nñÚÖ¦M¥¤¤èðáÃ’rG¼{ì1%%%éÈ‘#’¤mÛ¶©]»v¥¶l^mÛ¶UzzºöîÝ+)÷£ñƒ*::ZYYYZ¼x±Æ�§&Mš¨aÆš8q¢RSSµyóæ"Ÿk_Y­V 4H-Z´Pƒ ô÷¿ÿ]&“IëÖ­SjjªV®\©ØØX………©^½z9r¤ÇZYǶæÏŸ¯^xA×_½êÕ«§îÝ»+((ȧã«]»¶Æ�¯n¸AaaazðÁ%IÆ Sxx¸ÂÃÃÕ«W/·Þâ¼ï’Ô¿EFFªaÆ:t¨4hà|ŠzŒ’oÿ^öîÝ«yóæiÚ´iªU«–Ú´i#«Õê<®„„;vLíÛ·—¿¿¿ÂÂÂ<>jÔ¨áÜæêÕ«õÝwßùtÁ_jjªÖ¬Y£¾}ûºµûz.Nœ8¡7ß|Sÿ÷ÿçönff¦–/_®ñãÇ«iÓ¦jÔ¨‘Æ�Ÿoý+V¨}ûön�]»véÌ™3’¤7ß|S}ûöÕ矮§Ÿ~Zï¾û®¾ùæI¹�üøñš;w®¾ýö[}þùçnû(êÏ�ÅbÑüùóuß}÷iÉ’%êÑ£‡Æ�§C‡I’Î�;'IùJQjÕª%)7¸@Q¤«×» 4hÐ@AAA†FbL&“󵟟Ÿš7o®ãÇ�ëꫯVTT”  qãÆ¹•"xräÈegg»Õ1æm Q«V­ôã�?JÊ­½ãŽ;Ô¦MmÙ²ERn jÛ¶m©-›W`` Ú·oï\nóæÍjݺµªW¯®øøxåää¸SPP�š5k¦cÇŽù~’‹(""B‘‘‘Îi‹Å¢-ZèèÑ£:~ü¸l6›† ¦^½z©W¯^zþù畚šêq[ñññJKKsû#Èuž/Ççç÷ç/�7–$·Ÿµ«¯¾Úmº8ï»”„>úè#�;V£F�ÒÉ“'�£ñE=F‡Âþ½|õÕWºóÎ;uýõ×KÊ ‡�:ur– lܸQíÛ·÷ùN!§OŸÖ”)SôÐC9k•]?õÈë‹/¾P£F�Ô¬Y3·v_Î…ÕjÕ„ t×]wåûc1>>^6›Íí=v}? ¤Ÿ~úÉíѪU+g8ýË_þ¢Ûn»M5jÔP§N�Ô§O}ýõ×Îõo¾ùfÝyç�=z´ž~úiÕ«WÏmûEý VLLŒ¾øâ ½þúëJHHÐ�!CtèÐ!gŸ’““ÝöqñâEI*µ‹ Tné*Î5‡¿¿¿ªU«&???Íž=[o¼ñ†,‹ÆŒã¬ödÇŽùê£=µuèÐAÛ·o׉'äïï¯ððpuìØQ›7oÖ™3gôûï¿«eË–¥ºl^]»vu:ײÇmÖµŸ‹¥Äo�V˜€€Y,çˆçâÅ‹µjÕ*­ZµJ«W¯ö:Bî®% %u|yöŠó¾§§§kÈ�!:sæŒFŒ¡iÓ¦©iÓ¦ùúèë1úÚçÄÄÄ|!öÎ;ïtŽôoذAÝ»w—$Ÿj¤çÌ™£‹/ê�wÞQëÖ­Õºuk}üñÇZ²d‰Z·n­O?ýÔm_üq¾:d_ÏÅ{ï½§”””|w‘¤œœÙl¶"�W5kÖT@@@¾;JLLtksXÇ'Eáíÿ/³Ù¬Î�;kΜ9ª_¿¾Ö­[§êÕ«+88ØíºI:uê”jÕªUê·øP9¤á&''§Ð¶³gÏê“O>qkÛ»w¯Ûhè-·Ü¢—^zIóçÏצM›òÕ+:ìܹ3_}´§¶èèhíØ±C›7oVûöí%IíÚµÓþýûõÕW_é¶ÛnsÞv«´–Í«mÛ¶:yò¤Ž=ª�;w*::Z’Ô¨Q#çq8Øl6íÛ·OMš4‘”Ž=ê¶½¼#�yÏ{aëœ?^¿þú«Û¼½{÷ªqãÆºâŠ+ìóEU 6”Ífóx' _ŽÏˆâ¼ïû÷ïWRR’ž|òI5nÜXÁÁÁ:tè�NŸ>í¶=×sZÐ1úêå—_VÏž=ÝÚ¢¢¢”žž®ŸþY‡Òm·Ý&I>ÕHÿýïwŽìnÛ¶MÛ¶mSß¾}5hÐ mÛ¶M}úôqîgÇŽúý÷ßuç�wºíß—s±{÷n-Z´H“&Mò`uÄ®ïqQµoß^ëׯwk;vì˜Û�;Ž?®+VèÉ'ŸÔ”)S”’’bxžøûû«nݺλœtèÐA_}õ•Û2ëׯ×wÜQ¢ûPu¤átùå—kçÎ�úí·ß”žžîµ­ZµjÚ·oŸ~üñG%''kîܹJKKSçÎ�uá­ZµJ ÊÈÈÐÏ?ÿ¬   gýåsÏ=§E‹9÷¹cÇ·úhomW\q…6l¨÷Þ{Ϩý¿ùæ›nM—Ö²yûn±X­©S§ªU«VÎÚËàà`ÝsÏ=zýõ×µoß>%&&jÚ´i s†ª›o¾YŸ}ö™~ûí7ÅÇÇë•W^q»ˆÍÓy/l�ßÿ]K–,ÑŽ;œ·3³ÙlêÔ©“Ìf³¬™3gjÛ¶m²Z­:}ú´ÛÝV\�¯V­ZêÔ©“&Ož¬ãÇ�+--M›7oVZZšOÇgDqÞ÷°°0]¼xQü±’““µnÝ:I¹åÞÎiAÇ諼?Rn9B×®]5iÒ$uèÐÁ9Jïk�´¯>þøcýõ¯Upp°[{aç"--MãÇ�W¿~ýÔ¤I“| fff*88X=zôÐk¯½¦½{÷êìÙ³zë­·ŠÔ¿ûï¿_«V­ÒÒ¥K•�� o¾ùF«V­Ò€$åþñõÒK/iðàÁЉ‰Ñu×]§7ß|³ÈçÁa÷îÝš6mš¶mÛ¦S§Néĉzï½÷´ÿ~ç§E<ð€¶lÙ¢E‹)!!AŸ~ú©Ö¯__¤{g€+‚4œî¾ûn5oÞ\t^Áï©-$$DݺuÓ믿®^½zi÷îÝš3gŽ”’’¢o¾ùF<ð€:w+WjòäɲX,²ÙlŠ��wŽNÇÅÅ)--Í­ÓS›Ctt´RSSÕ¢E g[§N�$)ßÝ JzÙ¼}wèÚµ«¶oßîüEí0f̵iÓF±±±º÷Þ{�ßðæø(ú©§žRݺu5pà@ÅÆÆªK—.ª^½z�ïEaë\ýõêׯŸÞxã õë×O'NœÐœ9sœ#ê=ô�¬iÓ¦©cÇŽ>|¸8àõøþïÿþO‘‘‘zøá‡u×]wiñâÅÎúÒÂŽ¯¨Šû¾GDDèÉ'ŸÔœ9sÔ»womܸѹLAç´ c,Œ·Ÿ )·¼#>>^]»võíÑùóçµaÆ|J…Ÿ‹5kÖèÔ©SÎ{*ç}<öØc’rÿHp”�Œ9ÒYcì©VÚ“›o¾YÓ¦MÓš5kÔ¯_?½ÿþûšûLëׯ×?ÿùÏÛʳ'NhÀ€Z·n�×/¦@á*Úû^�;wNwÞy§¾ûî»K^ë©DEE9o³\j3¾:§” 4º[˜Ìf³üýý�¸–ÔõL¥Íb±´‘”,É*)ÇåÙöÇk›ËÃîòpLËeZ.my§í.¯]y¿:Û·ùEƈ4ÊL­Zµtï½÷ÚVžmܸQ·Þz+!º˜*Úû^@QQ# @� H¤Ò€iÀ‚4`÷‘®`2ÒÓõêÊ“eÝ €*� ]ÁT *ë.€R���]Ö]@¤+�a·èÊ+ë”u7@)8y2½¬»€"¢F0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� HW!ãÆ�STT”¢¢¢ô—¿üEwÝu—^~ùe�?þ’ì?&&FŸ}ö™ÏËgee)##ímÀ€zÿý÷K¸gPùlܸQ½{÷ÖòåËÝÚ<¨Q£F©S§N6l˜vìØá6?;;[o¿ý¶zöì©öíÛkèСúé§Ÿòm¿°íÕÚµk5kÖ,I¹¿¯f̘áq¹¨¨(íÙ³Ç9íú»íÖ[oUïÞ½õÜsÏéÿûŸs™C‡éùçŸ/VÿOÒUL¿~ý´qãF­[·N¯¾úªöíÛ§ñãÇ—u·<š7ož&MšäÖÖ±cG]wÝueÔ#(ÿöï߯áÇkêÔ©Š‹‹s›wâÄ �9RíÚµÓ‡~¨víÚé‰'žÐ¡C‡œËÌ™3G[¶lѤI“ôÁèæ›oÖÓO?­3gÎi;Ea³ÙôÎ;ïèÆo4´¾ãwÛW_}¥_|Qµk×VLLŒÖ®]+IŠˆˆÐÿû_mß¾ÝÐöoÒUŒÅbQHHˆjÕª¥-Z(66V?þø£RSS˺k>5j”n»í¶²î”[«V­ÒwÜ¡ÿûߺõÖ[Ýæ-Y²DíÛ·× AƒÔ A :Ô†¶lÙ¢�ªeË–ŠˆˆÐèÑ£ªýû÷i;Eñý÷ßËjµªC‡†Öwün U‹-4nÜ8=òÈ#š:uªRRRd±XÔ¿ÿ|£ó@q¤«¸jÕª) @���’r?Ò{ë­·Ô£GuíÚU¯¼òŠÒÒÒœËoݺU111j×®�þö·¿éí·ßvγÙlZ°`�úôé£N�:iôèÑ:uê”×}wïÞÝmt`ÿþýjÓ¦�$iÑ¢Eš7ožÖ®]«Ö­[kòäÉ’ò—‡¶Ï˜˜ÍŸ?_ÇWtt´ ¤]»vó¬@ù5vìX 8P‹%ß¼uëÖ©[·nnmÝ»wצM›œÓaaa:xð s:%%E.\PDDD‘¶£åË—køðáêСƒ¬}ûöyìóºuëÔ¥K™L¦"kAxàÙívmÞ¼Y’Ô­[7}ûí·E8š;w®³l¤°ÇܹsK¬ï¨8ÒU”ÝnW||¼Þ~ûmõèÑCf³Y’4uêTÅÇÇkÑ¢Eúðï™3gJ’.\¸ ØØXõêÕK«W¯ÖôéÓÕ¹sgç6çÎ�«õë×kÊ”)Z¼x±,‹FŽ©ììì"÷/&&FÆ S·nÝ´mÛ6�;Öãr…í3))I³gÏÖ“O>©•+WꦛnÒØ±c õ *²ÌÌL%%%éÊ+¯tk×Å‹�ƒ&#FŒÐ—_~©¿ÿýïúôÓOõä“OêñÇWxxx‘¶#IS¦LѨQ£´bÅ 5oÞ\£F�RJJJ¾¾;vL‘‘‘nmÙÙÙJOOÏ÷ð•ÅbQ“&MtüøqIRƒ äïïï5Ì{2|øp >¼Ä–CåC�®b–,Yâ¼ cĈjÖ¬™bcc%I©©©Z¹r¥bcc¦zõêiäȑڸq£$éÌ™3ÊÉÉQ»víT³fMEFFê†n�”{aàâÅ‹5nÜ85iÒD 6Ôĉ•ššê (i¾ì³víÚ?~¼nºé&………iÈ�!:wî\¾ºA¨ìÎ�;'I qk¯U«–¤Ü�Iºùæ›5dÈ­^½Z¯¾úªjÔ¨¡®]»y;’4aµhÑBõêÕÓÓO?­ÐÐPgݲ«“'OªaÆnm+V¬Pûöíó=Š¢nݺÎþ˜L&5lذÈÿÿ’ ÑU›¹¬;€K«_¿~zæ™g´gÏ�9R]ºtq~üwüøqÙl6 6ÌùñZNNŽóc°«¯¾ZQQQ0`€³´ÃQ¯œœ· ƒ‚‚Ô¬Y3;v¬TŽÅ×}úùýù÷bƒ ä6bU�#è&''ë²Ë.s¶_¼xQRnI‡$Mœ8Q Z¶l™ôî»ïªwïÞzï½÷éóv$¹•jøùù©yóæÎb‡ŒŒ �?^õêÕsk4h�žyæ™|Çåó1Ÿ9sÆ-|_~ùåÎ~ÅðáÃèü„Öµ�]µ1"]ÅX,Y,µjÕJ�:uÒo¼áœW£F IÒâÅ‹µjÕ*­ZµJ«W¯vŽîúùùiöìÙzã�7d±X4fÌ=ûì³’rG‡m6›¬V«Çý•£û,É<¨(ªW¯®àà`�8q­ýÔ©SªU«–ªU«¦¸¸8}þùçúÇ?þ¡ÈÈH…‡‡ëÕW_UË–-õ¯ýËçíxãïïŸo¾ãÿdO%Å‘••¥Ã‡»•Œ$''+ ÀÐö¬'žxÂ9Mˆ†D�®ÒüqíØ±Ã”¯¸â »],âÉ-·Ü¢—^zIóçÏצM›”�� F�I’vîÜé\Îf³iß¾}jÒ¤‰ÇíéèÑ£nmv»Ým:''Çk?Œìª²:諯¾rk[¿~½î¸ãI†Ù¼×^{­’““}ÞŽ$�={VŸ|ò‰Û2{÷îÍW (‹Å¢ßÿÝàQy¶dÉ5lØP­[·v¶ýþûïªY³¦ám<Ø  Ñ�ÒUZ£F�Ô¿½ùæ›ÊÉÉ‘ÙlÖàÁƒ5sæLmÛ¶MV«U§OŸv^˜qá­ZµJ ÊÈÈÐÏ?ÿ¬   Õ®][ÁÁÁºçž{ôúë¯kß¾}JLLÔ´iÓæ¼]]íÚµï Ë7ß|³>ûì3ýöÛoŠ��×+¯¼âvàå—_®�;wê·ß~óx�‰/ûüé�Ж-[´hÑ"%$$èÓO?Õúõëuß}÷I’®¹æ…‡‡ëùçŸ×Þ½{uæÌ­Y³FŸ~ú©ºtéâóv¤Ü»BíÛ·O?þø£’““5wî\¥¥¥¹]¤îФIýöÛo†�ËqaâÅ‹µwï^M›6MK—.Õøñã�dff*11Q×\s�áýHŒDÃAºŠ{øá‡uþüy­X±B’ôÐCiðàÁš6mš:vì¨áÇëÀ�’rG*¾ùæ=ðÀêܹ³V®\©É“';Ë(ÆŒ£6mÚ(66V÷Þ{¯RRR4sæLçbƒ Òš5k4fÌIÒSO=¥ºuëjàÀ�Š��U—.]T½zugßî¾ûn5oÞ\Ô¸qã<ö¿°}þtíµ×jæÌ™Ú´i“  5kÖhöìÙºúê«%Iš5k–.¿ürÅÆÆªwïÞZ¸p¡†®>}úø¼)÷bÄnݺéõ×_W¯^½´{÷nÍ™3ÇciÅ-·Ü¢_~ùÅðq9.LtܶÕf³iÙ²ejÚ´©s™ÿþ÷¿ªU«V¾q 8J+m¶]OóM.íŽg?Ó®Ëø¹¬ç˜v<üÿx6ÿñÚñ\+++kkŽ¥L8Fm5À999JIIÉw»!Ê£˜˜õíÛW÷ÜsO¡Ë9rD111úòË/�×ë”´—^zI5jÔp^ÛS�òX×vðàAÝÿýš;w®Zµjå\§°ãt]ÆÕ-·Ü¢9s渵­[·N«V­ÒáÇ•’’¢úõëëöÛo×È‘#|IÎCIÉÊÊ’ÍfSµjÕʺ+P äädÙl6Õ­[×ÐHt^‹EuëÖÕÙ³g�wö(i.\àNU AºŠéׯŸüq¥§§ë‡~ÐÔ©S•žž®‡z¨XÛýì³ÏôÓO?iÙ²eòóóSÍš5K¨ÇÒáǵeËEGGç›·`Á�ëørœŽe\¹Žxuc²6 IDATØív�7N‡Òˆ#Ô´iSY,�ùä>|X}ô‘ÛhHƒ të­·z\§4ÏT©©©²Ùlª]»v‰o»V­ZJJJr»“GIJOO'HW!ÔHWq-Z´PRR’ó/ÿ˜˜­]»VO>ù¤:tè mÛ¶I’²³³õÖ[o©G�êÚµ«^yåç:¯¾úª>øàýç?ÿQëÖ­5hРB×)h_yõîÝÛš]-\¸P÷Þ{¯O£å=N_ÌŸ?_#GŽôù#EoçÁf³iÁ‚êÓ§�:uê¤Ñ£GëÔ©SÎõ¼�‡˜˜Í›7O?ü°¢££õàƒjß¾}Zºt©î½÷^EGGëÙgŸÕùóç%åžï3f¨wïÞjÛ¶­úôé£Õ«W;÷³hÑ"Í›7Ok×®UëÖ­5yòdŸÏ\*Ži«ÕZà`‡Q!!!nµÒ%-33³Ä·‰ò‹ ]Å�={V—]v™Û¨î¸qãÔ¡C½÷Þ{ºùæ›%IS§NU||¼-Z¤?üPñññš9s¦sù|P={öÔ¶mÛ´dÉ’B×)h_yU«VMƒ r+ãHHHÐÆ�Õ¯_?ÃÇ™��­ôôt·‡ãkf/\¸ „„]ýõ>m¿ ó0wî\­_¿^S¦LÑâÅ‹e±X4räHeggx’’’ôÎ;ïè™gžÑÊ•+®˜˜ÅÅÅ9·uòäIÍš5K’ F�iÚ´iZ¾|¹zöì©—^zIÇ�—”̇ ¦nݺiÛ¶m;v¬ÏÇ—‚ã"@Çõ¥1²è¢K:L»þߎÊ� ]EY­Vè6ïž{îQß¾}Õ´iSU«VM©©©Z¹r¥bcc¦zõêiäȑڸq£×íûºNÞ}y3`ÀíÞ½[�$-^¼X½zõ*´¹ ã\±b…Ú·oïöX¿~½¤Ü .Ém´{îÜ¹ŠŠŠr>^~ùå÷-å^Ü·xñb�7NMš4QÆ 5qâD¥¦¦jóæÍž‡Úµkküøñºá†æìÿ°aîððpõêÕK»vírn§ÿþŠŒŒTÆ 5tèP5hÐ@{÷î-´ŸPžäääÈf³ëNÞøûû—Ú�;$9dP5P#]Å,Y²DK–,‘ÉdRƒ tÿý÷çÕmÞ¼¹ÛôñãÇe³Ù4lØ0g=YNNŽRSS½îÇ×uòîË›��õïß_ï¿ÿ¾Æ�§Ï?ÿ\Ë–-+Öq4HÏ<óŒÇõ4h IŠ‹‹s^è2dÈg¹Æ”)S|êw||¼rrrtÝu×9Û‚‚‚Ô¬Y3;vÌÙæí<¸ÞMÅq÷�´´4çWÒ^}õÕnå*IIIúòË/µk×.¥¤¤èäÉ“ÊÈøÿöî>8ŽúÎóøgžzFcɲÅúù„Mœ5dáp;Î* Ieƒ³›ÛË%Å(òpWÜ.•T¶®n³W—@lî În7lBа©ãrµepãÀ�ÂrvLù c°‰-cÙ’%�f4ÓsŒZjµ{žZ3š_ϼ_US=ý0­ßŒeû£¯¾ýëñšÆ &p®mÛMûÍ Òè,ésã�7êÎ;ï”eY5÷þöôôH*U�{{{›öšj>ÿùÏë3ŸùŒî½÷^]wÝuZ´hQÙcƒ¼O·t:­åË—k×®]S!×}®ZÏéüz²P(ÌÅAÇåå¾P&“Éè–[nÑu×]§/ùËZºt©n»í6ª#B'�ªX,ªP(4¼*](š¢›QE‡¹híè0ÎLõ„¸eË–)�NkçÎ�M}M5}}}úô§?­íÛ·këÖ­� ò>½¾øÅ/ê§?ýéŒÊq½V­Z%Izíµ×¦¶Ù¶­}ûöiíÚµ�Ïëç�7ÞÐÙ³guÇwèâ‹/V:�Ö�tòäÉÇåóù†~]h´D"!IMù�Z³KçŒ�� �ªâñ¸n¾ùf=ðÀzùå—U(tòäIíÛ·¯¡¯©Åí·ß®mÛ¶iõêÕ³:�ä±a.—›Ú¿eËmܸQ[·nÕc�=¦C‡éÝwßÕŽ;ôÌ3ÏøN»ç•N§µeËÝsÏ=Ú·oŸuß}÷©¯¯O›6mšõ{pëëëÓÈȈ~þóŸkhhH;vì�4ݦ"IK–,Ñk¯½¦ßýîwÜ� €±’ɤ"‘ˆ†††~î¡¡¡¦Ý�ESßuZ;P“/}éKJ&“ºï¾ûtâÄ õõõéæ›oÖúõëúšjz{{§î`8[�?þ¸üñÛÜw6ŒF£ºÿþûõ‹_üBO=õ”¶mÛ¦x<®‹.ºHwÝu—>ñ‰OÔôuî¾ûn}ï{ßÓ]wÝ¥|>¯�7ê�hø?â]t‘î¸ã=ôÐCzðÁµyóf]{íµ3ŽùÔ§>¥^xAŸûÜç´aÃ}÷»ßmè`¶"‘ˆÒ鴢Ѩfa``@±X¬iaš;v–æü8Vý¼~û#®íÎ2ê³î>&êz�³î¯wÞyGCCCZ½zuÅkbêqêÔ)½ýöÛJ¥R²,Kñx¼¡�:•JiÉ’%�_ìØ1õôô(�+‹M][Ó¬êy£Y–µYÒ�¤‚¤¼kiO>·]�¢ëá¬Ëµ.×6ïzÑõÜ­Zã{ÃãiíFpBm4Õ‚ ‹Åtøðá†Üä$›ÍêðáÃSµ·¯6%+ÚAà ÓÝÝÝZ°`�âñ¸öïß?«ˆœ{ 8•^o˜n„žžÚ::A%�*�jÑ¢EêîîV&“ÑÞ½{U¦³Ù¬öîÝ«L&£D"¡x<Þð�J¥¦æ÷Gg!Hc8éX,¦x<®eË–iþüù×îݻϛҳ’“'Oj÷îÝ—eYçéF„éT*Õ°n„³vã8a:™LjÅŠŠÇãÔÁƒuäÈ­X±B .TWW×ÔMP …‚2™ŒÎœ93ugYçXÎÅ…�¬F÷ôôP‰îpi`'èF£QÅb1Y–¥¥K—*�NkppP£££:zô¨Ž92u»oçuN[H<W*•R"‘˜ªD»{£g¦S©”æÏŸOO4ÒÀ•§'ºCÝ»ýœŸbZCf#H0ÖƒÏñ+þNÆŸ?Ó¤é©}ãLq×á^:’ÓSûÆ[= (‹ ÀH?ÙM_4ø>`6‚4ãì:”å¶ß�$Èkסl«‡¾ÒŒ³ý·ü:Óø~`*‚4£d&Šzv?HL{vV™‰b«‡牷zàöÊÑÖ_`øèm‹õ¾% IRQÒÀpAGOçõ¿_Õößš1¿ñsw/W&gë“ÿýDÓ¾ÆuïïÒ=ŸíÓŸÖwµvÂWŽætÕÚdKÇ^iFÙ{|¢ÕC˜²ã�Œì¢´za\.LêÃýI}ü÷Çu÷ÏO·zhgïñ ‚4ã¤å�A~ûÿœÕHÖ–$­_né¾?ëÓÕëRúã?Hë—ÿ�Ù$æ’Ißà H0ʱ³…VÁ×¾wsúÛg†õW7.ÔŸ\9o*HG#ÒÍ›{ôÉËÒZµÆ0ùû@ç"H0J&gîì £Ù¢F³EÍKF�F´d~Lrå<½yjB[tJßxbP÷üÓYIÒ¿ûH) îœ ÒN ÝtqJçÆmåíâT�ÞpaiŸ;HKÒŸ}ÿ¤¾öïé¡�ÓÇù÷×2ޱ\Q[þö„þãc§õWOžÑW~üžŠÒÔVõÅõ±÷¥tb¸ [>¥»?­Ÿý³9·è6ùû@ç"H@�’ñˆÒÉˆŽŸÍ+oµvqBшôÒ›YåíRÐ{z_©å£ÿ÷JUë7OMè�3yýÁʤ¢icROïËè7GsúàEIY±ˆ6\˜Ôñ³y½uzºøì˜­\¡tνÇK3™,Hûÿ“]Ë8¤RŸ÷_oY¨ÿõ–êÑÛ+"©wòœO·ûÈô9^{»õ3¨€ÉÒŒÒeEZ=„²>Ô_jÁ8t²4³H*QkÌõ/i2QQÒ¸kÞã]Æ5/ÑGÖ¤´vqB/×ó2J%"ºöý)­YœÐ®åo:R¨ÒÕPË8–/ˆé7ýžÞ¿ÔÒùåý뜜qŽx¬tޱ¬™-&_è\iF¹`ž™ÿ,­Z×_|¼W[ú¿.Í©üÖ{¥ ò^’’/½�¬I)"éÀÉéiüœöŽÛ?Ö£‰BQ¯¼•�ê�þ÷×õ–ú£Õ÷¾h$Ró8._™T*Ñ ‡ÇõÊ[Y�+]¼Ÿü¸�NVÃ?º6%k2T¯[š¨{LÍbê÷€ÎƬŒ²rALÇΘ1CÃ×?Ù«|AZÚÓe+,Å£=ðÌ�N†Óç&ôâáqm^“Ò�o]¬ý'rúØûº”+õð¯§o`òú;Y�³õûË,ýó[Y�åŠË´ÿÄ„Ö-Mh,W¬»�b(ckYoL_¹z¾þþÿž«:Ž�s¥ÏtËi%¢Òå«JýÖùÉô¡� ýË;9]±ÊÒßݺHožÊë�ÖwÍö#l˜• b­œ‡ñeíbs~¾¿áÒ´>qYZtÇ´ëà¸nyd@?yyæxù‹A=ñê¨ÒVD]›ÒÞã9Ýú?OéíÁé~g»8]q~ÑUy~~r�—ß×D¡¾‹é¾÷«!�)èO¯œ§÷-ITÇ«G³zä…sʤO~ ­''ô«7fÞ¥ñOœÖÎýãZÜÓÊ…1}ã‰A�:gÆ5&}_€£YMgÕÎë·?âÚî,£>ëîc¢®×9ëÎ#6¹ŒO>w–½¹\îÅ:Þ €9´ëPVßøÇ¡V†¹çO{¹³!`8˲6K’T�”w-íÉç¶ëQt=œu¹ÖåÚæ]/ºž»U«H4|ú*ÒŒòÁ Í™»æàû€‰ҌҕˆèÚuT1íÚuIu%˜µ€yÒŒsÃ¥åïà‡ÎÃ÷S¤窵I]ÂÅe�tÉâ8½ÑŒE�`¤/|8Ýê!À|0A€‘®_ŸÒ¦~.0ëd›ú-]¿ž¶æ"H0Ö×®énõÐBüù0A€±Ö,Šëë7ô´zh�¯ßУ5‹è“`6‚4£Ýxy—nÚHŸl'¹icZ7^nÎíÉ ‚4ã}õên}öJ‚U'øì•]úêÕ´t‚4€P¸óã=T¦ÛÜMÓºóã´ò‚4€ÐøêÕÝôL·©¯ßÐC%@èp%€P¹ñò.]º<¡ŸÑKGr­fiS¿¥¯]ÓÍ……B)Ò¢óúí�¸¶;˨Ϻû˜¨ëuκóˆM.ã“Ï�eo.—{±Ž÷ÀPOí×Ov�éà@¾ÕCA�.Y×>œfžh �X–µYÒ�¤‚¤¼kiO>·]�¢ëá¬Ëµ.×6ïzÑõÜÍo[=ûëF @h]¿>¥ë×§´ëPVÛ;®g÷g[=$Tqíº¤n¸4Åm¿´‚4€Ð»jmRW­M*3QÔ+GsÚ{|B‡ò:v¶ Ó£¶2¹†!PE—Ñó¢Z¹ ¦µ‹ãºlEB¼ÐRW¢Y¿€¹G�Ð6º‘©P @³1kA€ @� H¤€Ò@i ‚4A€ @� H¤€Ò@i ‚4A€ @� H¤€Ò@i ‚4A€ @� H¤€Ò@i ‚4A€ @� H¤€Ò@i ‚4A€ @� H¤€Ò@i ‚4A€ Ь ]lÒy€z5%›†½"M`¯Pg¹VéPh0JK²eØ*Òµ|H„tó´]Ž3=H‡êÃ@C�MÒ€‘Ò@i Ó‚ôœôÁD"‘�¹ø:�`³•Q=Ó¦éZx?À¢Ïs÷Òû¼011±¿yÃè,“Ùª ÿì%Ÿ¥÷¹ßºñL Òå>t¿?œrÛµt’4100ðJ3ÐI&³ÕÄäª;{¹3Y¥‡|žû-�ÒÊ ]ëäƒsÿA¸ÏaKÊ?üðÃ/8'|Lf«¼¦ —Þ4Ï5ò¸†‹´øÜŸçÞ¥T üîíÞGÔg=*)æzÄ]Ëî3gÎüå¼yón¬ï-ÀmttôÉ… þWI#*…é‚ké<Üjo÷@¹ê´=ýUêjñÓ”°mRkGµ7Xiµ_ xÙûï¿ÿÇÁ‡ IšÌTYÕÞ²Q­B=›L8§šY‘®åüÞýåªÒQŸõˆç¸¨Ï²RUºëÕW_ýã|àÿ¹Ž÷€I{öìùÖ† ~))£ÚªÑÞ¥4³B-×vïz¹~é–ï°éˆg[µöލJáÙ ÒÎcÞ‘#GþíŠ+þ¼ö·€ãÇ�ÿ·þþþÇ$�jfpÎkº_º–¶éü`íl“Ïvc‚t«[;fÓDî÷!VúÕAQ3ÿ0mI™þþþŸíÙ³ç[õ  “íÙ³ç[ýýý?S©íÎVÎxRõl&×v/ã/4”JUÙfj䇕.6T™}ލJ´·Š-IùmÛ¶½eÛöÓúЇ’–e­«aÌgttôÉï|ç;ÿ馛nzEÒ˜üC´wéðë™ö2zº;¯V·vx�©ªkmïpïs–1�ßæáJJHJ~ó›ß\uë­·n^ºté†D"±NÒ¢Þ@;:511±ÿĉ¯þèG?zñÛßþö;*]X8¡éðìüÆßÛÎá,½=ѳië¨ô¼œÐöH×ò5jí“öVšýªÏÞ-�ß+í]zŸÇ]ï¹æâóh%oÀuB²»÷ÙÛÿì Ïî}Þs•›YÍ»M–Þ±V{/MoæÉ¬¨R�u/åÙæ>ÖÖtK‡­ê!ØÝüžWù ÐÎÊ]¿»F— Ï~èJ_û-LÒÞ<›×»´³îp~"Ѝôíì�iæ7IDÓÁÛ]á–Ò ý¹­ßMS*õEûÍÐáðêÙæ–n‚´—_åÙ °î*³7ÔzµÃ9‡{~¨géÞï�J¯ Z;@çðëSö†joUÚ[‰®4SG¥Y:j½›¡L Òõðf÷6'@;áÛÛêá[ôç­H{ÛHÚ™ßE�•Z<üB¶ûõ’˜®4{G(ÌU0läìRõ<ÜÛ¼³~D5ó"Bo/t¹»&Öó^¨\+†_Uº\°–f-ËÍÊQn¦ùì«ô¼–÷Ò¦V¤ƒôMûµ‚¸+ÉîÊtQ3[DÜ!ÛýoEÚÙÐŽü‚´·UÃ[qö†eïoþ½çp�¬\›T‘ö¤*]iz<¿ù¨ýæ¢öç}î@;ð†UÛç¹7XûÍ í=®RÏt³ªÑõØ\U¤ƒT˜ë=w¥~i7Û³ß]•vŽ�jzf�rçq€°*—sì ëÕ.*,w‘¡_ˆn†9©`›ÚÚ!�ߢQn¿×x/8”Ϻ7Ü»§Ç³=¯ñ~#UB¸¦ª'`– Âîç~Á¸\¨.÷õë©FÅ´ ]KåÚ/L— ÝÞ×yƒ·÷|ÞÊ´ßÍ^:�_¨õ»H°\›F¹ý~Çz÷W“bsüõê�½Ã»^îÆ(~Û½Û¼¡¸Ü¹ü~ú"H€NSîbÂJV Ñ•‚µÛl«Ñs¶ç: ¹èн^îbÄrÓÓù]�Xn_¹ç¤@ç)×’Qke¹ZÕ¹ÜörAÛ˜‹ &V¤ýŽ«v½Uc¿íÞýå^ã5 ñ¦(w¡ ÷‡· í~4D‡B+*­Í ÓRõÊt¹×úU�k ÙTª@Øi±¨¥Z=›m|5Z2;Hû[o˜®´¯Z?u¥qÔ‹À æÚlCe¹04@WÚ׈]ï±³Öª€×誴߾ AÛïµ~Ç´»JUèrÇT ʵ†åPT£%óƒ´ß±AÃt½û+Ðîü‚³|¶Õ’›¢ë=¶!Zç*L×rL==ЄjЮj Îîíµ„à¶ ÑÒÜÏÚá5aº–sx?ü ­„l`º ­õö4W Æ¡ÑRëƒßl‚´w[=û+K ruºZåºÚ”võ쯦cƒ´4û0íÝ>Û@íÞgÂçÐJåz¥Ýû«=¯u¥í³=¶áLŠõŽ!h˜®vLµP]Ë¥aïHDIDATqaVëÍQêiÓzL-:>HK� Óî}�Æ�€ Vë Þõ„ójZ~D“‚_3Ât­ç­¾MúœæBµªq-A6h…»žó¶Œi1ÈxšÑ’A4À´j}Ò~Çû=¯t\�s·”ia1èxQunÖk¤žŠól^4¤+hf˜vÛÈ÷nâçPI#él*Öõ~c˜g3® ¯�Îâët";Àkf„� Ñ’¹AZšû0í}­ÉŸ À\šM»‡÷sýÚ¦1=,Îv|�x¦FÍÒˆ;Ûs¢¥p„DSÃp>;€Z4#¬š›*La°Qc Ó{“F_£´#l¡’™6ÌÓè@B!Œa’6 €Ö3µd΄9@6sìaþ\š¡™!7TÚÑ�q.ßC;|^•Ìe¨ e€v´K04ñ}˜8&ЙL ¬&Ž©.íöÚíý´›ÐhG;Ïv~oaÒ6áÙ­Âf'¼Gµe€vtZÈì´÷ 0×Ú:<»uz°ìô÷0[œ½’3ñyTÖ±ÁÙ‹àX>'ÐiÌU�ϘŠp `îý0ÃáÁ'IEND®B`‚video-downloader-0.12.31/screenshots/2.png000066400000000000000000001770451516223405600203510ustar00rootroot00000000000000‰PNG  IHDRÒ–@èesBIT|dˆtEXtSoftwaregnome-screenshotï¿>)tEXtCreation TimeDo 09 Nov 2023 01:09:40 CET›Åtî IDATxœìÝyœå�ðç}«º{f`ðD1à� 1Q“�Š!˜‚`ˆ&1—£Yc0"Q7£`@X5âE<â}pJšx„C@@Žafº»ê}÷�·ªºº§{¦§g†¹žïgggº»ºú­êŽ<õë_½Q^DS â>%""¢æJ7õZ†¾üp?Q[ÃÐ] ÄtÜDDDD5cÀö´õàØÖ·Ÿˆˆˆ¨¾Úl°nkA²­m/Ñ¡Öf‚u[–ma‰ˆˆˆš£Vª[sÈlÍÛFDDDÔ’´Ê@ÝÚÂfkÛ"""¢Ö¦Õ„êÖ<›ãv4Ç1QÛÔÃksS�´†°w(·¡5ì/"""¢šÊ€Û¢ÃtK†�9vÑÈë'"""jI47ô¶È@ÝÃbcŒY6Â:‰ˆˆˆZ3ÕëlQ�º¥é†/+ÎDDDD §!+Ö-&L·¤0Yß±ŠŒß‡òµ‰ˆˆˆZšB­Îø}(_û�k ±>c,4<ç»|KØDDDD5É7´Ö5Ü6D¨nÖ�º¹ÁBÇW×]Ûrì¡&""¢¶¦¶èºðBCq³ ÓÍ9H×'D×öÜš9þ&"""j‹tŽ¿kZ.×ã­*L7× XŸ>æ|Cræý…<�ˆˆˆ¨µª-4çz<Ÿ°]Ÿþëf£9ÄBCt]ƒpC‡çæ¸/‰ˆˆˆ²)´ß9×cÙ/4ˆ:ŽC®¹…¿BÃkM•æl÷庿¶×©m9"""¢–¬>mu Ô…V§›M˜nn¡°.ã©)Dç k àõ™2�ˆˆˆ¨%Ë ºù¶rÔ%P¦¤³¨kˆÎ· �O€ÎUqnNû‡ˆˆˆ¨)äªRg Й·k[¦¦eóS“i.A±±Btæ´u¹t!-"5i.û•ˆˆˆÈ×P-µUª3ogN£×jÂts|�¢3—«éï|Ú=òm !"""j©ò©×Vu®éï|ú¯[T˜n�°.cÈuaQÃ2ÙBtMA;Ûm^�…ˆˆˆÚšÚ*ɹ‚rM�YÕðX®×­I›Ò�¢ë ó­hµùV”ë¨[M˜nê€X—Kx×ÖrQSˆÎŒó­d³"MDDDmMM�7ÛcÙu¡aº.-m2H×·]HˆÎ¦ÃÏͦê$D"""¢æ¦®ó<«,g Ìõ Ó;*ÝTA°!Ct¶ œ­•#ó·Ìø�Ïú2ÿ&"""jMrbÿw®P�¨³=§¶õµ¸0Ý܃tm}ѹBoMÁÚ_oær¹ú¨e ã """j­ªW�sd�šÃt¶çäº/Û8òqȃ´}¨_õï5æÚÏ 3¦‰ˆˆˆÚ?ùA9WÛ†Ÿ¥Â�:L‡Gèo‘ãñBÔ÷ù½à¡VŸjtm³oÈ,�ç Ñ2Ëý"Ër ÒDDDÔöd Î é!:[kG®ê´Î²,²<^Ÿ�C¤uEº.³täûX¶�í±Ìžh?0g>–Y¥f�&""¢¶(34k˜LÏ™U`ÿ¾l�‹Œud>·¦Šr¾ÕæCZ•nŠÖŽBÕ4}]M}Òù„h+ô@Ä»O¢ðiž”HDDDÍE!áR…~\IL.Ê Ï2Ëoÿ±lí¹~‡8 ×Gs Ò™m™�åZ>[¿tM!Úö~û!: öꫯž3pàÀ«‹ŠŠú!:!X�&""¢6Ik­´Öû«ªªV/^¼ø†ú€8L¨0["°s…i z_4P=0ç Ñá0Þlʪi]Ú:²µoÔ6�]®3[4,¤W¡%€’W_}uÐ\ðs˲ºç»ADDDDm‰ëº›ß|óÍ»‡ú.€ ¤Ú?\¤*×ÙZB²õ[ùM›‡îËå�îæ¤³U•ýÛÙ‚tf_tfO³Ì¸ÏÐá0]òÅ_üª¬¬ì²¼·„ˆˆˆ¨ Û»wïs�:uš¦Ã!Úÿ;¦Ã=ÕÙN*Ì Ù@î �,÷gÓfƒt¾!:Û4v@zÿ³;gˆ>xðàJJJήӖµq‹Úµk÷Ô¦3Ctæìῲ*}H‚ô¡êÿmÌÀžÙ�yRb¸í?n(Þ³gÏÝ ÑDDDDuWRRröž={îPŒô–ÙpæÊÌe2ãvc9$Åâæt"]m'æªF#Ëíl-áéÈ+¯¼2¨S§Nßj˜¡µ=�:uúÖ+¯¼2é3žeæ¯l:[ŽËu>\¦f33Ú¡H¡m@î>è\'é•çp+‡„™­£]2™|ɶín¹SYY‰x<ÇqòzÛbÛ6b±Š‹‹›z(DDDÔÄÇÙ‰DþÀA˜Ù;Â'ú­™m¹®’˜­:S³iï8麜d˜)×Õ kªF‡�|2÷À~饗Î΢]×ÅÞ½{qðàA†èÇÁÁƒ±wï^¸®ÛÔÃ!""¢&dÛv·—^zél˜beøÚ@õ™Ôº¿¦Û¾\Yµ>ù²ÁŠŠt}f먩¾�«>ÉÐsK8ð‡ÒÒÒ�Ù²wï^è:°meeeM= """jBååå‹Û·o>ñÐAúI‡5U¥k;é0³*ÝlfïhN=Ò™²ðÌ#—ÚîË6Ÿ´URRò•l/XYYÉ]GŽã ²²²©‡ADDDMÈËVájt¶î€ðïÚîC-÷5 Í!H×gçäÚÙ™—õN;ÙPÑ!ÛÊâñx=†Òvq¿µm^¶Ê<ÙÐ>ñ°ÚSëó²õxnƒhŽ—÷ås¦f®y§}Y¯n˜ë²ß¬F†û�ˆˆ¨ùq]ñxÉdŽã@kÓå „€mÛˆD"ˆÅb°,«Þ¯åe«\W•öO¨Ê•Ùtèv®Ëƒ7«Kƒû;H×åH¡¶ekªžg›/s½Ù¦_!"""jU\×EEEEÎoŒµÖH&“H&“¨¨¨@,CIIICêÌ“ k«@ç ÇÙgë¯#ß`ݨ!¼¹V¤ í•É5a¶)󈈈ˆZ•ªª*”——×é9ñxñx¥¥¥(**ªÏËçÊ\™™,ߪsø¾fY•nÉÕÙÚªÏþïpÏt®þ"""¢­¢¢¢Î!:¬¼¼õB¶ÌUÓɆ¨á¾¡©ƒtm}Ðá)íüÛ¹*Í™}9ÙútjzM"""¢©ªªª¾!€ ãUUU…>½!2Z¶ìþ�ë5›DSi"¢³}ûvlß¾½©‡ADtH¹®[¯Jt¦òòr^p-O�¤ =BÈçy yc£yýõ×1yòd|ç;ßÁ%—\‚ &à‰'žhªá¤¹ä’K0bĈ¦Q^®¹æôë× .¬öØøñãѯ_?¬]»ÇÇðáÃsVeÞ|óMôë×�<òH£�õ»ßý.úõë‡~ýúáôÓOÇÅ_Œn¸ûÛßí5ëjРA¸è¢‹õ5ž&"£!*Ñ�´Î†Îk�™- Ò\O6l(M¢]×Å�wÞ‰¥K—¢¤¤½zõ‚Ö7nÄG}ÔC"jц ‚5kÖà½÷ÞÃ%—\ÜÿÅ_àŸÿü'zõê…Þ½{£W¯^Pß“eÄ…^!6oÞŒ•+Wâý÷ßÇk¯½†û©‡FD­ˆ?Å]C‹Çã 5“G«n©m-AºY½IO?ý4–.]Šà¶ÛnCûöí˜éfxñ¢ºþøãà¾ÚÖí?Ç¿½jÕ*”——#‘H`ñâÅ€•+WBk�sÎ9'XïsÏ=‡wÞyÝ»wÇÞ½{1kÖ¬`¿eSÛ8b±Þ{ï=tïÞƒ†R óçÏÇ£�>Ú ûþú׿â‘GAqq1N<ñÄ:íc¢¶¨¶« O�:]»vÅÇŒ‰'bÒ¤IØ´i:wS§ÖkÝÔ2[;jº$xM÷[·n€œ!Š‹‹ÓBógŸ}†Ñ£GcÅŠ;vlÚ²sæÌA$Áã�?Ž9sæàÃ?Ägœ�Ï?ÿ/¾ø"ºvíŠY³fU!Ø´i–/_ŽÓN; ¿üå/˜¯gÞ}÷]lÛ¶ ]»vmÈM&:$† ‚ÿþïÿÆ¢E‹pË-·`ùò娪ª v¦ÿûßx÷ÝwѹsgÌ›7¶mã¾ûîK;áwÆ X¼x1Î8㌠RSUU…7Þx[¶lA,Ã3Ï<ƒž={bþüù°mÏ=÷~õ«_aþüùèÛ·oÞão×®Úµk‡ƒÂqìÞ½»ÖuŸwÞy˜9s&>øàÀ²eËо}{TVVbÉ’%øö·¿�•+W@Z�L‹Y4ÅÿøGÌœ9+W®ÄÙgŸ]m\;vì¨u%%%i'znݺ—]v–,Y‚믿¾Aöõ±Ç,ëWà‰¨vµÈŽ<òHÜwß}˜8qbp ÔQGaÚ´iµ~KÝÀÅ·\yM×p»ÙknAºYõ:âðÃ`ÂqMÖ¯_�gžykÖ¬Áþýû¡µÆþýûӖ騱#"‘óÕ0ìÛ·€©j)¥púé§§…hÀÀTª2CÆþýû¤©E ·wøÁ @Î íÿƒÑ¿ÿ §úë_ÿzZ¸ûä“OË—/G¿~ýÒž¿ÿ~ìÛ·J)œyæ™Á:†Š_ýêWu>q8�£¢¢ݺuƒmÛØ¸qc­ëîÙ³'ºwïŽ?üJ),_¾C‡ÅæÍ›±bÅ $ üýïG×®]qÜqǯUVVüw¡OŸ>€½{÷fW>ãLŸ÷Ÿÿüg|øá‡Ø·o´Öiÿ=ªï¾öÅb1†h¢‰DÒ²B4­–Z�f¶›[�nñŽ=öXH)±qãF|òÉ'iÿ¸ù¶oߎ[n¹G}4n½õVôèÑ£Ö©è2Ïšõ§¥Év´Ø¡C@ß¾}qã�7¦=ÆijɆ ‚µk×â½÷Þûヒž={¢gÏžY—õ{ûÚµk—s}þ7Gýû÷Çm·Ý–öØ1Ç„õð|ªñxB×iìï¿ÿ>´Ö8ᄘ~á|Ö=hÐ <þøãXºt)þõ¯áúë¯ÇöíÛñþûïã­·Þ¦M›0räÈœ¯ëÛ\òǶmÛðýïÇs n¿ývôìÙ3mú¼†Ø×¾ºîW¢¶NQcåxÏž=˜4i>ýôÓ 'zóæÍ˜8q"¦OŸŽÃ;¬ÆuSÍØ#ÝÀb±.½ôR(¥0uêÔ ÕÃçº.V¯^�x<Ž3Î8}ûö þ�©K/R·nݘêN"‘H{¬G�A˜/++C÷î݃¿Â ­/‘¨%ð«Ï?ü0vïÞ�³ ˜ÿÀâÅ‹ƒÿ�¬[·.m™/}éK�RbݺuèÔ©zôèüD£Ñ ÷ú½÷Þ Ö±dÉ’´@œ�Í›7ãþûï‡eY?~|ðÚù¬Ûï“~øá‡‰DЯ_? 4€9O"³?:_þ?¼ùŒãƒ>@UUˆÓO?eeeRÿÍjˆ}MD…©í`ùg?ûY¢§OŸŽéÓ§£{÷îØ¼y3&Ož\¯u+Ò�âÚk¯ÅêÕ«±qãFŒ?={öD‡ðÑGáŒ3ÎÀàÁƒ˜“ “É$V¯^  nØã�?§œr þùÏâ†n@¿~ýðñÇcôèÑøÊW¾‚‹/¾ .Ä�üc\pÁصk***0eʦ:´}ûvÌ™3ßùÎwsz¢Ó¥Kœ|òÉø¿ÿû?¹Û:à„NÀ©§žŠ>ø£F�B¯^½ðꫯ¦-sÔQGáòË/Ç‚ 0fÌ|ãßÀ矎ƒâ׿þ5zõê…³Î: K–,ÁÕW_�“N: ï¼ó¢Ñhˆs¹çž{`Û6>ûì3¬^½ŽãàÆo N Ëwݧžz*ÊÊʰvíZôïß%%%())ÁI'�„õë×£¤¤¤Î­eeeضmzè!\sÍ5µŽãè£�`NbL&“A϶ÿ߬†Ø×DT˜H$Rãì7nD¯^½0uêÔ ú<}útLž<›6mªuÝT³æ^‘n‘ß)”””`ÆŒ?~˜3gNÚÉqÙ¼òÊ+xùå—±{÷n 4óæÍÃ÷¾÷½´eòY·”2¨8ŸuÖYÁýþ3 Pçìn¼ñF~øáX°`6lØPë8N;í4\{íµ°m/¿ü2N:é¤j1 ±¯‰¨îb±X��¿þúëxøá‡ÓZ8;ì0<üðÃ5Î!�Ϻ‘f�spµ­;Ûì"ã1™å¶ÈX^füíÿXÞoÛûÛÿÝQk½$Û€víÚUË�)—#Ž8¢©‡@DDÔ&8p Á/ø‹ÅÒ®…‘!ÄYöp8¡ßÊû[…~´÷þ¡ûº/óvxyd<–K£±7UEºY]µ�ÑžÙ[>›$[6÷ÖŽÚ0�Q›fYJKKl}¥¥¥Õf kD-:Ë5V�nÑ;…ˆˆˆ¨%)**j�*rII ŠŠŠ`DÍN£dÓ–^‘&""""˜\ŸÊtiiiKléhRœþŽˆˆˆ¨•(**B$AEEEÞ' Æb1”””ÊvŽVƒAšˆˆˆ¨±, íÛ·GII âñ8’É$Ç ¦šBÀ¶mD"Äb1èz`�±m»NW$ƒW>"""j~,Ëb«F#c�tH3™x¼Åá~#""¢¶ˆA:¤¸¸˜ÕÕ:²mÅÅÅM= """¢CŽA:Cûöí¦ódÛv�¯zDDDDÔZ01f°, eee¨¬¬D<gÏt¶m#‹±MDDDmƒtÅÅÅ ŠDDDD”[;ˆˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨mrÖŽÍ›7C)ÕÔà """j¤l›µÙ6¤;wîÜÔC """¢®m>Õƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDÔ Œ= ÀŠ+ÙkÞu×]0`ž~úéCöšDD­‰ÝÔ "jh?ûÙÏðæ›o·£Ñ(ºwïŽãŽ;#FŒÀ×¾öµ&]óv÷ÝwcÅŠ˜:u*N>ùä¦Q³ÆŠ4µZ�:uB�=СClÚ´ o¼ñ&L˜€©S§6õК%­5Þ~ûmlß¾~øaS‡ˆ¨ÙcEšˆZ­1cÆà;ßù`ß¾}xôÑGñ—¿üÏ?ÿ<¾öµ¯á?þã?šx„Í‹wÝuÖ¬Yƒ‹/¾¸©‡CDÔì±"MDmBÇŽqË-·`ذa€™3g6ñˆš§`ܸqhß¾}S…ˆ¨ÙcEšˆÚ”Q£Faá…صköîÝ‹²²2À?þñÌ™36l@$AŸ>}ðÃþÝ»w\ýõXµjÆ�‡ë®»ðÒK/áž{îA4ÅÂ… Q\\ ¸êª«ðñÇcΜ9˜:u*öïß�)S¦`îܹX·nŽ8â\wÝuû,ž}öYlÛ¶ 'Ÿ|2öìÙSíõF�� 6à�À€0zôè¼ÇÿÌ3ÏàÙgŸÅöíÛñÕ¯~}ûöÅŒ3póÍ7ß µ&¬HQ›Ò­[7D"ÀÇ xå•Wpà 7àïÿ;ÊÊÊ�ÇñöÛocôèÑØ¶m`èС€åË—ëzç�w�H$P^^Ž¥K—¶oߎ�?þ]ºt NÖÛ¾};~ô£aýúõ¨ªªÂ'Ÿ|‚Ûo¿}ôQ�cÍg\¶mãOúþýïã˜cŽAQQÖ¬YƒÉ“'cÙ²eÁºæÎ�‹ßüæ7ظq#?üp¬^½›6mÊkŸå3þ9sæàÞ{ïŦM›pØa‡aåÊ•˜1cF^ë'"j©¤‰¨MB@J󟾎;"™Lbúôé€{î¹O>ù$^xáœzꩨ¬¬ÄìÙ³çŸ>,ËÂÚµkqàÀÄãq,_¾‡~8à­·Þ€ PgVk/½ôR¼öÚkxñÅÑ­[7(¥°xñâœãÌw\–eaÁ‚xíµ×0wî\¼øâ‹?~<àµ×^TTT`Μ9€ßüæ7xòÉ'ñꫯÖi¿Õ4þŠŠ Ì�;·^ë'"j‰¤‰¨MÙ¹s'âñ8lÛÆ±Ç‹M›6áÀ�èܹ3Î=÷\@qq1FŒX·n ¬¬ ýû÷‡R +W®ÄŠ+PUU…Ûn» íÛ·ÇâÅ‹‘L&sé .¸€ ïg�uV0–\ò”——cÆŒ3f † „l¿uã£�>B<GçÎ�qÎ9ç"‘H�N(¬iüÙÖ‹ÅxÂ"µz ÒDÔ¦ø9õÔSaÛ6*++®ë¦-�FEEEÁ}^x!àý÷ßǻヒvíÚáÌ3ÏÄyç�‡ŠŠ ,Z´+V¬@—.]лwïœc¯3—|ÇuàÀŒ;þóŸqöÙgãÎ;ïÄÕW_�öœd2™u]…ÊC¯Ÿˆ¨¥`�&¢6!‘H`þüùøóŸÿŒH$‚‰'Ž?þxض�Ï?ÿûÛߘ@øüóÏ@ÚÅ[Î=÷\D£Q,]º‹-ÂÀ�‰D‚þé|•••y�D˜K<¯Ó¸Ö¬YƒÝ»wã°Ãõ×^‹~ýúaß¾}iëìÙ³',ËÂ矴\(¥‚v”úêÙ³'¤”ÕÖÿâ‹/6Èú‰ˆš+ÎÚAD­Ö¼yóð / �cÛ¶mPJ¡´´“&MÂqÇh¹;¾Þ IDATß¾=ÆŒƒÙ³gãŽ;îÀœ9sP^^Ž]»vᨣŽÂµ×^¬¯]»v8묳ðöÛo@ÐrqÚi§¡S§Nؾ};€êmùèÖ­6lØ€ßýîwرc†ž×¸ºwï)%vî܉Q£F¡´´´ÚÅT:vìˆáÇ㩧ž ÖµgÏTTTÔyœÙøëÿË_þ’¶~"¢ÖŽi"jµvïÞ�M›6aß¾}èÓ§FŒ�'žx]tQÚrãÇ�ÇÏþsôîÝ;vì@QQ.¿ürÌŸ?¿Ú|Ê~õYô K)ƒð\[[G.&L@ïÞ½±sçÎ`¶�|ÆÕµkWÜyç�8öØc±eËTTTà¿þ뿪�û'?ù ®½öZtéÒûöíÀðûßÿBˆ:�5››nº cÇŽE—.]°cÇœzê©8p 4Øk57�õ_·ÚÖ›íqºßÿ-³Ü/#CÏóoû?–÷ÛöþöwL$Kê°-DDT€›nº Ë–-Ã}÷݇³Ï>»©‡CD�,�ž`€ú­¼¿UèG‡~üÛÝFè¾ÌÛ:ôwX¶ûêòx�±"MDDõæº.vïÞÜþ׿þ…•+W¶mœtÒIM82"¢ÆÃi""ª·µk×b„ 8þøã‹Å°~ýz$“IŒ7GydS�ˆ¨Q0HQ½Åb1œ~úéX·n’É$Ž?þxŒ1ßøÆ7šzhDD�†=ÒDDDDToì‘&""""¢¼0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDtÈÝ~ûíxà�ò^>‘H ªªªQÆ’L&1`ÀlݺµÞëúîw¿‹yóæ5À¨r{ã�7póÍ7ãÒK/ÅùçŸ�‘#GâÁDEE³oŒ]»vU{îìÙ³qûí·§Ý§”Âc�=†ñãÇã‚ .ÀÕW_�ßþö·8xð`Úr·ß~;¾÷½ïAk�u\6lÀ€°jÕª´ç 0 ÚÏ 7ÜPëvVVVâÊ+¯¬ö9™:ujµõ]~ùåµ®�ˆ¨1ØM="¢ÚÌ™3[¶lÁ]wÝÕÔC©Ñ AƒpÒI'5ʺµÖ˜2e 6n܈ñãÇãÄOD$ÁÖ­[ñÁ ¨¨(XöàÁƒ¸ÿþûq÷Ýw׸Îd2‰ÿøÇ¨ªªÂ÷¿ÿ}ôèÑ}ôfÍš…Q£Fáá‡Æ‘G,¿iÓ&,^¼gŸ}vµu=öØcY_ãŠ+®¨œ-˪u{|ðAlÛ¶­Úý•••;v,F�Ü'„¨u}DD��Ašˆ¨�üà?h´u?ûì³Ø´iæÏŸ�h4ÜߥKœ~úéiË^~ùåøÛßþ†%K–ଳÎʹΧŸ~{÷îÅc�=†X,èÚµ+Î8ã \wÝu˜9s&î¸ãŽ`ùöíÛã±Ç«¤7oÞŒU«V¡¤¤¤ÚkD£Q”––Öi[—,Y‚U«VaذaÕ«¨¨@‡P\\\§u5¶vQ“;v,æÎ�‹ë¯¿\pF�…?ü0þ|Ì™3¯½öˆiÓ¦Ïyýõ×qóÍ7cðàÁxÿý÷¤ZFŒ� /¼·Þz+>ûì³àµ\×ÅC=„Ë.» —^z)¦OŸž6–‹/¾+V¬n¯[·ƒ J[æ‰'žÀÈ‘#1tèдõ�;/¼ðB^Ûå�eæÌ™¸ì²Ëð­o} ÷ß?®¼òʬm&sçÎÅ÷¿ÿý´�ËÑG�믿Ó¦M«±%æñÇǘ1c‚í‹F£˜0a^yå8p ¸ÿ[ßúVšÃæÏŸ�#F4H¸Ý·oî¾ûnÜ|ó͈D"Õ¯¬¬L«¾5%i"jr{÷îÅþðüèG?‚ ЧOüìg?C2™Ä¨Q£0vìX\xá…X¼x1&Mš7ß|3ž|òI,\¸S¦LÁš5k0iÒ$(¥r>‡ˆ¨±0HQ³>aì˜cŽAqqq­Õâ>}ú¤ÝÞºu+ÇI«Ü£OŸ>øôÓO±eË(¥ÒNÌçÄ7ß¶mÛPQQ�“O>9ïçäÚ®­[·æ=–.]º@Ú�Å5×\ƒ×_¯¿þ:¾ùÍof}Þ 'œ€#F`êÔ©ÕfÛ8âˆ#;vìÈúÜD"�òòrtíÚ5íþÒÒR >óæÍÃþýûñâ‹/⪫®Êµù9r$–-[–ö3dÈ�jËíØ±Ó§Oǘ1cйsgÈ:CÈW¿úUtïÞ:t@¿~ýpÏ=÷`õêÕø×¿þ•s DD�…AšˆZ�D"¥TµÖ�H$‚h4 Çq ”*¸zé÷ 7Dõ³.c)..Æ1ǃE‹÷E"”––¢´´4k/±oܸqسgž}öÙ´ûËÊÊбcG|ðÁYŸ·fÍH)ѽ{÷j��9K–,Á}÷݇óÎ;/åõ1kÖ,”——ãá‡ÆÀ�1pà@<óÌ3xâ‰'0pà@<÷ÜsYŸ×µkW´oß>çQcb�&¢ÁqœZ—éÖ­¤…C¥Ö­[‡^½ze}<³êY\\ŒO>ù$í>™®]»뫯|Æ6fÌ<ùä“i=Ëù(**ÂOúS<ôÐCؽ{wÚcW^y%þçþ§ÚœÑJ)Ìž=ßþö·³žØ×©S'\rÉ%xõÕWqõÕW×i<¹L™2%¨X/^¼‹/ÆW\�‘#GbñâŸì²Ë²>oçÎ�8pàzôèÑ ã "ª i"jöŽ>úh|ðÁؾ}{�í%%%¸ä’Kpï½÷bíڵسgî¿ÿ~têÔ gœqJJJpñÅã7¿ù Ö®]‹]»vá÷¿ÿ}Ú:N9å¼ð ؾ};¶nÝŠ©S§'vìØç�w¦M›†O?ýX´hQ�OXôÇZÛXÂ.¹äôïßcÇŽ úž?ûì3¼ñÆx뭷Ю]»œÏ0`Î<óÌjU髯¾¥¥¥7n-Z„]»vaÕªU¸é¦›°ÿ~\{íµ9×9nÜ8<ôÐC8öØckÜÎl'&‰Ÿ“ËÞ½{1uêT¬Zµ »víÂÿþïÿbòäÉ8çœs¤‰¨Ipi"jö¾ùÍobÉ’%¸êª«pÚi§á¾ûî˹쭷ފßÿþ÷¸í¶Ûà8ú÷ï�x èU¾õÖ[ñÀàÖ[oE‡0lذ ~ô£áW¿ú®ºê*tíÚC‡M›Iãç?ÿ9~ûÛßâ?ø’É$N8áüñMý–9– /¼@ö ŒH)qï½÷âùçŸÇk¯½†Ù³gömôèÑ·Ür .ºè¢_ëæ›oÆÒ¥KÓî+..ÆÿøGÌš5 �<ò6oÞŒãŽ;gœqÆ�WcËHÇŽÑ·oßZ·qÁ‚X°`AÚ}_ÿú×1sæÌZŸ›Ik�h4Š»ï¾;wîÄQG…óÏ?¿ÆÀODÔ˜ërPµ­7Ûã"t¿ÿ[f¹^F†žçßö,ï·íýíÿî˜H$–Ôa[ˆˆ‰Ý»wcذaxç�wòš/šˆ¨9‰F£gØÀà„~+ïoúÑ¡ÿ6B·º/ó¶ý–»?.¿Ç댭DDÍĆ еkW†h"¢‚­DDMäÓO?ŧŸ~НýëØ½{7fΜÙ`'ïQãc�&"j"Àܹsñ‹_üGu®¸âŠœ³SQóÃi""""ª7öHQ^¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Q¤‰ˆˆˆˆ À MDDDDTi""""¢0H€Ašˆˆˆˆ¨ ÒDDDDD`�&""""*ƒ4Qì¦5¼._{Vìá@„€.¬’º�p"QË[R@+ÐZÃÒÂ_‰”J­3:–EPÔNCZ $… ¡K ( ¡…¡Q¤ŽT–Ò„ 5,% µ9Š—Z@k-Í�°[CK%BkÓÚŒK§î“Rx¿% 5 B¯¯í-k @ @ s¿†@¥²±c®¢.Q@f\®· –›Z¥`i "$l˜m�G{/¨µ† ƒ´74¥tRC+ åjh-m�AZ¥ÖcÁì_ @è�1Û%C·…€–€Ð@Bhh[CZ€± • B(@(ï}’Rz¯ãBJ ˲‘¶Ié  !„·ß£ °”%²>Çß"ã>iIˆP G‡Þ+³×à}.”œ¤‚ë HG@îWû4DÜ´0ï‰Ò°´6ï¯yH-a+@ÅHe>™B3vh(ó“€¥¡5´£ \ }ŽÂû8sçˆô:T’©m²%4l”GÖcÚ[çÚ«DÔÂ1HµR€—y  …„”2( „‰|&ŒêTþ3áדŒ ìþ¼ %•¥ímÈâ$„°¡d�NSë…B‡�Ѐ€ ?Zxá[À`!¼°¯ƒÇEznôÖŸºéAÞÈÔ¢Â7-áýÖA˜vCáË•fœR›qZZ¤¥@‘å¯\”VA�4[�«°Ìãf5 ÐVjYÿWB½1h‘¾­þ£þÛ(Òž×”Ö\sÀ>:Êà¯Sì·LÁxD¶qd—úŒéê÷å~ ¥y\ Çq¼= -Õ^@Ç,ˆ."å€paB7¤ö]´ŒÍŽËò"æ>©éB)hÇ\¨œ‡Ù×Þï9žªó_%µ@ ÒD­�ð‚©”–©FJ!” ²á -4 ´ÉÂB¦¬.2 @âà�x%PÒQ£¨`ÇLú*wH~Ú ¡ ±HhHoÜB H‘¥"-LOèð d¼ž4 Yk/}{�Ù¯+¥á(Àõîw¤7e‹˜:~µpTS W¤ýŸÔc*Uɵ,)! Ç1�Q)/xgT¤!-ï=óB5RaÔ¯ÈûØ…òŽ !$´Vp !„¥áí¶¬A9�k¨H{üýŸÏE6Õ__=Ѐr5GA)áíG@)óy„TLCÛd…‚]!`%´ ÐÚ[0K‚ Þš•†N&!´†T&z»¡ý/œg;ð?¿@î ­‘ã"j5¤‰Z!!,) ¥€„i›0)©ß:üO¼ðþ/Tw€°C·µô¾r×p]å{qE¥EElÛX Z›Ú³ô+©HÅ.Wj(?( a™�äW�u0–)D*P†B_˜‡¯”.mSjv…—›”©D»JÃÑ€ÚDx¡¡4�0ûJ›v Ûõ*±:}<~¥Þ‹«\„BtúÒYÞ! Û–�p„F2©¡\3F¯Æ{¦9¨ðß6TïSÕ?<*o æÛi¾eÐ ®k¾i�PÒt,è`dÕvx.´^øj�”vÍ0ÒÛ8¼÷"s½™ÁTH­´Rp\mªéJ˜} ­`9å?W™ÏNU;+jÁ�h¸Š*´÷>™Ï©ðZx´7nøíAÊ…ðûI”†ðCzp„÷NÆÈÓªû©÷Ùjo¿j†g¢6ƒAš¨’°,Ó;,5Lû…�–€°„%ƒ à…m€ÿý¾Ö&tù,ï+sx-$«4ܤF2梸�BQ±„°„��ZÂR„e­ …@UÄkçðR¼éÿR 4¤ß곡ƒàÞÔŸ:ü¨_©'kp•FRi$•@B¶p]?¦6.à(@K W¶2?~xÖÂT--m“VŽRH†* 24¾ jùkï !�HL@ZÉ„F2¡áj?H›-¥€T0ß(XÚï‚1}¾þºLO±×¦#Ã=9�ÐÚ ªe™·\}¿Ðûoh  áBéeY¦"ë5‹ûM©6í†3ËúVPɸ®9q]¸®€«¬à€Ä¼y­0Þ¾ÖÞÓ…¶·DÀ±H ÑJᤲ½ÿ~ (óÙUR¹Ê �U†Š×™‡2´œð¢³ÿ¾š xŠùúÆoÒ5õ{Q«Á MÔ Iiy'á)mz£!´©ìŠô>épÐJ_³ ?XUÖpÕ׋ZB)�ªJãq%í,ØQ  ¶VÐPHX@eHÚ&”F´ ú‘ý„j*®:½ZYCOm¸o×ÿ6ßß.í�xdi´H:ŽcZ;DÚI‹A{�4AÈ‘@Ä5?QˆiÀV¦¢îÀTæM[F* ûãIÅÏšŠ½¦Ú¶Í8,K!w‘L¸PJ˜¶ HÛ«ÈËÔ‘�ëÕ=ÓZBû íÀ#tbœé?6ûBJ )ý}î·¤„÷mª·[‡Ö�Ðëú}Ü"ËVú-9¹Þ?×uá8^%_‰ŒJ¾7Ø´FdÿuÍц«5$¨h¯‘ˆ± …X¼ × :Iï+‰ðZ�䨯`pþ· @Mo8µ2 ÒD­�)šà%µ€�©“ s>ϤèT8… u*Dû/ “& yekÇÑPå ñ*%%viQ�„¥‘Ê«‚*¯ÕÂR¡‚qæj�ü½±Uë‘®Öª  ¤ ¬ÅÒ‚€ §Ê´¤•öLoÞÓÓ]à�„% @&aª§Êõ‚·dSã1a-4–ô-0™7mjHK!"5ìˆ@"n£ªÊ�”Êì ¼¦ö�ßßí7¤æÎÈ8Q3cj¯ÿ@eSSÊ›9$³½Ço¥Az}5¨Îfy»‚oÀ*<ý :Ñp´™�C§’r¨Ç\¤6¡ª~Ú~Ц'Þv�0ï“%PT¡ «Ä’®JnZdŸe¤>´Îlç`’&j+¤‰Z!mæ–3K¶åõ,[Ú¶ #ÚKN2-)-Ìlé…E‚»p«tíàµü0 ©±¿* ”ØÐí¤×ß쵆%×{¡½V á;ï+õÐT÷¦ó {R´�Ò´<„¿Û7i/ ¶ƒ˜­Ñ!fayŽVf#B³ga®ôZ \h8BEÚv�ª ,!S3›J¿ô±eöWg½÷éÄØ1 8jA¹¼Ð«Ò…‰n–×W®‚íAG±¿dz j§ÐJÂu´Ò^?¶Ld-¡…‚– Ú«\û“™aNdÔðû^¬ðåíG¿"/ƒé÷”4'Xú“dåï{3< R+82‰ˆCÕ�,á}æàzc&„+( NDa•:}|ɸƒ˜¶àjåWØ3öp�˜ÞC”õ}TÈ~^m¸ŸD{ß5¸æsCD­ƒ4Q+$¥„´Ì…©Ù x©Ì;é0 Ò{´W.6'®@¨ÊèMéáß–BCÙ ¢ÈFIûbè˜F…­S¶Ö&H›UÀ+ßú /½ÿÁ{Üo7dÉЩŠ'�t¤eúÃ¥A8G|´_86áZše,!M±›ùB&lú-ÁvÔB$"á&¤-!jhÇ5ËoíЫvdèfÚ¡«oWæÍLJ{SµyI=m¦<Óo“ö’Án uD¤O[—úL^@TÃÊ,?û93<Õ`pÆeÆ2Áf¤FdNv5½ù–-Q,-ÄIÄ«3s†ÒÁA“†ö>w., (jW 78ñ$”,Ë´-9PBA*s— ”yÿcÞÌ/º"QWCX,hئ*Ÿö~„:ò«&Wÿ8f~V "j�¤‰Z!)L%X{3>˜©ð¤f”©¸B…‚­, )ƒ¯Ý…ióJk+Õ‡¬- D€h»DLB Žeê¥I¿”'­Š”ÿZ^ €Nå2êÉ5C ]Å›�Á /ýë~%`.‡ájÀUˆYlÛ¯� (ᄎ uÀ’4¤©ÂksTLEÊ£Q vÞô�.¡áXv©™p¡.¤£¼9�:‰³æ6•̹£ý}.ºk¯Å&—^ë‰ÎÀC2;;Ò¾I÷ CÀöBŸP¦×FA¥Z€üg)½o ÒCyê}Êžƒí�˜‹Aj(éBK»H@Æ¢HÔH$\¸Ž¹‹Ð2*�؈H ¥%!@&”vÍS$½?%hèˆ Ë°#æó§”‚@P 3¸² ­ ‹ µ]cïvxße>æÕòó ÈÕ‰¨Õa�&j…¤4s›ê«Fp¢”ðap‚_ú×ÿ�:U²õ³š_Ùõ¦…~g®„% #DLBÄÌmÐf–¿ )L±ÛÕÞIŠ.` su@ÿ)©QdTlƒ¿B}Ú^:©- -)Q•T°\À²-Óp`§J¹Z{mʬÕ_¥´üÛÞŒB"•°l À…P B™)å4’RÊš«ôɤ€•P€«ÍE>2¶ zd˳ê©ý &àÍŽj�Þ{©Coœ .P­øê½¼ JÚÞïÐE_Ìù|fA¡„é‘"µ.�T�´÷ÕÞ5z¼P3‰yÓ¼XÒ‚Õ.+*¯Š›)¥ ;bZÃu“p”\@:‘„†V J9�q i $£ˆöŰ‹-sµG­ ”ùVÂõ¦Y´µ9éP¹Ê»ÐŽ !„ôÆ*ƒ1¦¿3á{R‡ï /™þ­@ê*�DÔz1HµBBxóG ¯Ú+µé}µàÍ!!à]:cº²pJÚ¯:¦­CÀô”*È( b^ˆ¶D<3Ÿ®0¹ðV'´é°VЖ€­° J9=� Í¡DÆ%ªµ×¡"<æo† ¥!’.,%ak@H¿SZCiÇõ*»ð–¥­¼Ö2UÉÖÞÔx¦*© ´2¢†”®mÁJº°’VR›+íis£uøj’¡êm-'V ¤æ–öûnýóeÐ ¡¼ÿof°ˆHÛÛ—æjŽé´0³+S 3ýŸö‚:tê› ¥ÀlØ–×Zb)3O·w�\R¤.:™ ¦©V?j¦fú`%±;f™‹Ñ( '™€«Ì· Žk™¯”†p“®‚¥DÜ\D%‚*HG!!‹xóã B'¡E$ÈðPUÐHB BÚV –¹úe¸w&xüC€Ô�„9H? u½¾mïCím§ ¦$¢Ö‰Aš¨Uò¦u“&iæäÒ|µï_�.s óL3O„§M3ÚôF[Q «H–ðBr~µ/2Ú”Þ\Æ ¯2\¤½—030x�^ùŽBiøªs&æþê\k Çqá8–%½iÍkšõY©qzá?¨²º Âõ«´~T®@já0„Xf í*H¯šZh”ò§¢ÓAˆV¡±†ªÎ'aj -äÚ] •Ù?*a.œ£m)L›‡Òþûk*¼éS奶8h+ñꪖ§¶Ó¼—Òò² µƒ¤Vp éGAis `>'@ä`±�÷ ²[ yD;¨Ž%жÙy–†7Uí3ªµù˜y±5¤´M HÁïµE ÒD­�™¶Ìk튄»T¸-—qÛû�ªR‡æ-¶TP Dl/í ퟱîg®alÞÿK@ñL0OJ�W æj¿ˆçOCç‡èômLë ©ñ•&4AAZ^VKÓ} 3¶?4Åšp½{B×8¯ÞàWÝ@K'f®€åhX0'Ä¥..z¶Î} êð%Çsl–©²†¦* ž+‚¢,tÐÆQwÒ»² æ•ùNÀTY­p@Nµ…„·Ë»Ó®ÿuG̓Bòµ ”„“HIÓ‡îW˃(m.8$…Ø."å.œöqTQ·Ôò‚4jÌ�@k@ºŽ©Ê€°Ì>ÒÌT4 ·>"jv¤‰Z!)mÀ’ÞI|fš2á•o›Ÿ@øÄ=ÿšè´³U IDAT|Ú‹­Ê…²”%¡#°µéCþ<Ħ­ ÜŒA§L_xº8 ‰¤*-�RW ¶Ð¦òí�à„h‘jÇPP–×öÓO”r½NÕT8–ŽY›´\KÀž§½¯÷MO°pµi�†ÖfÚ67½þ ˆP@ö& ŠªJ ¸¶€ÒÑæ ‰Hµ§R«ðž¡ƒµŠÔv†ªÅ™ IÛD()‘ˆ–¥ \ ; HåÏ3ì8ü~¤*ò¡¼ Ñæÿ[Þ‰ˆ~xwls¡%Í´y\ÈÅŸŸZCgÎöV£ÔÖ§‚§ð®‘® •û+ai‰HqJúþI¿¨K’ýc¡Z_3õ—²(KÃêR ³àn­Dä‹8”ÒÞÔB›Ï®€P®eÁŠEL»�ÔgÙÔ{ão“òÞw h­“°  ášÞjaß`¤ï¸ðŽÔYªÏþÁV�_Q‹À MÔ I)ÍÉu0Ã@p‚—¹,t(z›>UïÄ5KÀ•€Šy%XoΈ|ù_¿g¶Ž¹Û´ÖHH jÙp4Ì´lÞT×Þ9…Y3Iª� ç`¼“Ã"Q ´]‘ˆ×M@Àõ¾Î÷ÕB• ¤ Ÿ–´aYZ¥. nμCÖ �™Ÿ\K@K e®J;j÷ÐÙ÷Im¼k‘À€cI[ç1*­ak�$,t¤,ëø”’îOÂ*�1Ë¿Ðe½_KxGPB˜Kµ£Ô†êщv¬íû�r³�Ú›]DÙ nÔBüˆvpÊŠ m�Øç@ÔÕp„ÿ�Iê»sÉuG ¨ˆ KD  é¸nBi8VÚŠA¸¶ùpÔ²má¹³‰¨m`�&j•¼“²„?3ƒ &Òë0׫äú—%ÌU -ÀµLxñsC DFopΘ:e+¸lvxÙPsøòÑ–F0%žåà ë{�•Ñð8¼ïüËJ§ZLÏ­Ñ(*¶‹IHá@«8L¹2•vÍlm&�jef¦ÞeÕ¥�Ao…ßÈ‘­ÒžÙÆâï ¿įkH×›¢Ïkñ/y“ÖQíR÷'%àJx&ñ[J„7›ˆòO�4!Þç x� ŽŸE-wêÐ¥6­*îÂUI�“¦åÆ»�MP­&üQÈü>ßD�¤e™‘ºЮ©.^UdÁþ¬ j×A踆.²PUfAQ §8x3{ Že¦¼ËÜ—JHÈh²( eÛpÀR,­`i€ W»€ëBÈ”¶aþÉ4½;Áç X¥_¡Öi�eÿLQkÁ MÔ ‰$l©aAIï„,áMp&%„9CËëÕ5¡@y•Må_­ð¯:m–óC¸Î‘µB­ùëM»¨‡ÿ˜÷·ÒÕçGvSquaÁ ‡^«‡%»`�ÞkA{SÓio~ áBF5¢Q ±"Û4’€cA+@»PQhí¦¦Ôó»©-m¦{ƒ?¥›¹ôŸöN>Ôþ iþˆ·õ–Dh6� Béª`?k([CXæÀ šð/4© ½Ë}‡'Bñ'çÐ^µÜõt•�êý6c©K”{ÁÑ€ëÍna+ÿâ+ÞŽö:ÂEÖÌÌ·ä,°j¯Êhm#7í""ðÿì½Û¯$Ùuæ÷[kGDfžKݺ»ªobóÖ-’Š¢(ɺx4c #{ø2† ûÍ€ øaà?€_løÅö“��aCöŒa Æ6<c�5žñ�D�D‰"Ù")5›Ýì[UuÕ¹efÄÞkùaïyªª»)ûÁ}xx.™±cGt÷·¿ý­oi§H+ % CÊIÇéý»."˜:©l=$÷„[i+OÂ% ¶†:ÚUÂï i¹¤¿±(‘ˆ¹©Ž˜M\3^Æ�pmI‹%W+4 $C†)•€˜ÑT;P"+D[\Â#“âRϳ•ÈC¶ž¤ÈŒ3®.f"=cÆıA@ó¶¿hé�]”˱QFöÇPD¿J¶½ªÖӣʮ¾jbG¨w—ÛN�?O² a_�ž¾ž¦¼7d<»Ì‡1=m2·±œ�ÅÖ-Ët�f5ØK·;ÌŒKÃØÏå1ï~Þ>.1Ä/]{}Û¾s¶xyËú�-èF¶³L6*™NåâM`ùkG{û4ÏóySÝ ˜êJôøP1UvÏDõ`»6T%º\Üä$5ßz„ÚîÆ^>ÿ¸P™Ž$�? èñºÉnjԠíš4¢5}$`Ë;>$®ð¶ƒ(èÆK.w‚¹”ÓŠ%Èñ”Uõ† x½!i‹×ÌÆéΉÒÐ3Øù‡ÍâŒ3>Ƙ‰ôŒW ª �­[rSÏ)…ظHî:X� "(EÁ¾T36qìþ´·gï—þ^½ÃÓ‚¼ËïÙÿyG¤¬tO¼´õ_ýÞµ�x>fnG"AhCC³Ë@h² ž» XÊ‘ ý5ñG³™Ý1+ º}üãþÇ a­Þéšÿ<%àÕ|"åbÒØP$�Ø””eßsU¡Í2*cȇÂwÄ3Q›Ä8ˆ~ í ¶ÃÇò¢›EfÙ#ÒêŠG'I‚F�n·+Qó­¥ú–+ö#Ï l7wû„y×YTËŠ|Ž÷s$Æ’÷çE•÷ì¡H‹?>„Ǥe—•øA²@.ÕTW7¹ÐP*‘¦ð|"jNòÖÇ4Œ™ìueSdˆ[†¡GS„Д»4cÆŒ�)f"=cÆ„4J«Š'q½8) 9ë#ª\" Œ6�ºû?Ó+é Øu}$PÙò±Sq«NWhxÙÑ× )®�ÕwÒ°²ËÖ‰‰7û¤«ß;'|„Ñû�ßÐ4°Z¶4] ƒš ì‚knP#¢4�1l –Ï…IÓ™ÑÊPgdjÑ3µ#cùã„[ŠïÌ-;‚*£ícwŽš21QéW¯Žf‚å{°ñÈVš\'FÒÝgsó<-£­As‚…Ni°ï–#.N”Ì£ƒ»¡¢%áÃ÷ÆYSOê}ßß pPA´Ú�òAkƒE)k˜L¨…tÃŽv—½¡N¾¬ØYj«ô�êÌ8ÅPω(Úsäa¹ñÐðÔ5âíg�ÕBÀ¢¡½!J]¬y~�ÜÝ#⩌-ÏOîlØ ®¸'º¢¶Ä¦Á‚}Ëv{NßçΉjùx:Çß͘q¥1é3® 4Ð+¸tlbÂd½6ú ¹œÿlã1e2 GÒV¤Ô’ˆ�Ó”Ðïi1ç¨ÒÖiœ*ñå8Ó0 —ý½ƒ1)ÆÉ™Ó^º`6ކ²;"Ž›îÏÎΙ‘³Á}G¬÷üù“â¾êÃÆ RÂã@ZN^¾�/PY"É‘¸Û…0aG¤/ù`„„�ÈË­KVsÖq §1о'rÎIÂiêób )-Üw÷eÆŒW3‘ž1ã ÂÄðàHãˆKÙ}w‚*Ýœ9l»�›¸•ŠÂ�Á6*ÐOøLÍ„†]B¯’õ¸Ïì5AjŸ“lÝøï�iVúD…Ð Òz!?;â|ù<) ÛõÀ0䮆nŒÉ"�Ãã v!mÕ²á^r†ëëûN˜ÇÍl%‹Sv5±Q§/žõ;×nÐö[NÎÖ ) Š­…ñUsËÖ wŠZŸï‚›?ñÞæT Y‘6Ï…‘�¹îË^ï\Dz)[¹ìP¨ÊN-h¼Á£cÉ�Žñsû‘�^þ“6{7=­Cç ×D\8þÌQNðhîBØBÓ'Bš(ù�?8¹�JÊ>tœG\²Z�'‚_Ðú}ºt—.ÞqƺÇ�}ÆŒW3‘ž1ã*¢$8V‚Ð §©¾Ô‡ÐEØ,!¶bQü5eÃ/“ÞÇw0!ÓwfE3«~ùŬ"WSÆ¿î¥âÕw:ì±ÅÇœ$‰eÕSrI@qjîZzä³–Œm?�ÖàQG«F=ËÞ÷Q©Ÿì�u¥¾ÊHøö‰ø8ò‘|îv_m/ÇØ6Ʀ�Å-h³áz“8èž+kóUE6™anDÉ]R\¼»†#6¡õEhÖ�£ýL•’:"¹[a-�\éå ŠG~ÛÙå÷÷0HÑÆ×êË"šÏ[›ÖÔ%Eúò©vwÃÇ¿¸ÀÐ9vÜ¡7�‰ ƒB xÀ[CÌÑ!íGñ=¢D×,õú•&ÿ (âÕ;mˆ�ï‚?@­ÁeÉÓ®,䌇¬pV…tϘ1ã*c&Ò3f\ID[“,ålä&§vxpŠ7<±Ú )•®xí®XlTŽ÷ÅÆL x´ÑJ¦ƒ“-ìÑΡd7*#iY™ÓU5o÷ï¬Ùv«(ZÐÑuL Ë“’LÈádQ)IUI,ã*Å~i ýÖI±AâÎŽûžÒªÔÖç~™'æ+ôlW±‰*ú¸†,•uÖ´f³ýSu$ ¤`¤}# !¿¯1hDP�¸(�­Cå ÖëH Z ºåÂ,³¢â˜ÄQqB#Yd-cÍþaÊ�‘ñÞINÌ¢p^ÈLI®ÈžK!Û[ÈÏ”8h%�”æ5f%C$8œ¤¤Æ”wjÉØ6Ã\pܵ¸`&@(­Ç‹E§¬T’ vÐ`G ÂÁ2çj㨠êN²„«# …¦#…�Î�6f Œ«çØCÍ¡†êŽzŸÛ�k$›’ZÃ}ƒØµ pžUi–eWá§õ "ÑCœ=Ò3f\eÌDzÆŒ+ˆÍfƒ„5Ú¤i��ÿ#�ÈØÏ$$M>f5[S„Ú�=ö/‡QÞ­d|b_Èîi²"¹WÐ8ñAgâžÉS”L^Õ�V¡õJæ?`…ì§ÁˆÛIsšÄc´Õ»ø»zÏ“•{)V�šÖ1´Fêõdk„–™©šµb,Z¥Õ†¡Oœo>$ê"£*¼¡ÌËÎK &çÝÍÛì£Õ¦^+…s{±€å$µ¸p·6ÙuÌ6�R”šLäë9ÜÕOB@Š=¥]VŸÏeµ?_”� z¸$,ˆší-&e%0Zg2Ï�’‹zÜAÛ ÚÓœm‘Þh�±XT«-V h"†›�˜÷¸oQÒÞM6rQ¤•8ÈÆ#FBeý„'aÆŒW3‘ž1ã "Ƹ#.9¹"+·2–ã�™¾NVÿ’Œ$ZG•÷Q|¸ŸzBæ.½5)¸&Ð ´>ñðÊ”¬å’¯­'6žˆX¹r ÊŠÒ ]>Xñ �¢+ˆƒ�é£ÞÜòýÑ1�‡™åmûÇðÐGêKEzê$5b# R(>òjûðš‚R�UÕo!X&z¡¥$fC’)âZÌ-»’QÉþôš`2æ ~¤ËDÕëLÚ)ÇóífE�®s�[ÕËNáÖ¼{pÙû."„rÒ†À@"Åô¨Å£œ9E;E»€·!/´ª{¤®s.-àê}H"lV�Ø.iÊ!zWouWíXb÷ˆ[D<–�TŠwÇOž4Uç·b½q�‹ g̸ʘ‰ôŒW® ¹ÏAÕs3õò•É�k!Ù…PçÜ^ŠU5Û@ªè’J¡á^¶Çc¡%ïq¼Ô É}Ô±Rrzƒ5wðÄ™çï¹!‰Òˆ î¸eÓ¥-lZ•NŠê^ì H´ �!’.qëxª…cµ`îÑÁî¼ùNh÷2?•ðâcV.ŽU2L&�UµM q‘í(ãB%ÇÙ•™AÍQ)J³+JIÇr8QèÚ€ˆ#¸‘Uì¢uET,4±‘1–°FŽöžZ€Yí„ò7Ë׉J±a€[&—Õ³ž•pGÔð H“/T4/êv ·Oæ¹pT…Ô ÃÆ‰1•dCU‹œN£¹¥ýXì¹»OõÙÂvþðqqRTë>@¼Ö‘š[4´ïžÒ �8XÌä9ååî±,F*)ÞO‡ÉñׂyÈõš" dº�|öIϘq•1é3® \äöÍZ6ÿ �pÉžZ+J5ÕêÁØÏ¢Àì5 .4’IšˆO¬D¤««ã mÀ Ù‰dR¸k]�ÉtŸk"æ:’w£ñŒÞóutÑYªpAâž^(Îhå…6(m†6Ñ_6 Áô�Q’«×ztD”kS@ÌK™ÚNyL‚,)@l «>óâa´ìéš¶S¥ƒƒšdï69jÏ¢ ©\á„ÑgkC™‡|{ŸlE‘K_�{Ãngc÷Ž=˜=õf�°å)6¢@΋CBIˆQõÄÂMN¸×AC›lm CïlÖ†6°h¡QDs¸Èþ:gwÇËÚf\äìMÁÄvã@\ÞvÅâ0ppÐ×îÓmf%Zº¬` qv?À@^¾Y�Î)*†ÍDzÆŒ+�™HϘqQ½©ROþ9oµÇ¢V>PIô£6'E#nb4VM×”4�ÇÛkw1vÍc]³†]`ðLƒµG¶–àÚH¢l ¼Ï*ér!´�æÔ…‰Ÿ7ÛEv‘nÚ* mh¸x¸Í Û9‘Ÿìn®6ƒB°K'¾üã¾¢­…\'w¢:§+!u°h«^:ªh^xŒ ·çnî¥ó`ýª(ä’Þ„d¹pÑÜqO´AM(» ås—8>~aóÑ,-ãg$櫓&giÂÎ:4«Ï!/$¾<;ú˜Ä1ÑdòZh U¥m;úuDÓ‡?{—ۺˇ\Û"Á`8 œ5‡p¾âðÄi¼Xw>¨ýc=ä¡>ÉûpÁ\±sng̘ññÂL¤g̸²xt/_¸då`gUØKHs' ‰íz ëž.Áz³&-Yæ-ýÿGšS=r;ï.Ç¡¡I‘r? ‚Z¶ .¤dtÉY,š‰oz§O×mø„]ƒ¶Ž¸S"%+„òñÄg¿©ŠËF± {ìÎ’8ç­³ ÂI«lV‘+O Æ¢úWêÙ8�ÒÜ+9”‰²êD—¼øp@…e×Ò–v�VTXý�À¹ôý£`—ØbcÚå™󙃀 &¹!ãÎÇ�G*58¨£ê¤ÁPr‚‡ÿäÔGùñhŠu 'ËÀây‰¯ËäYTE¯…•±6f\#TŽ­60)Š]œœ“ĉd~°cÑãc³±%s:)å8„V„Æ…¦�K{ÌuMïÇ“�UìªÈJöG#¦M +AV �b�¼3’{Õ�iwÇBÙq¨Í\. ¨ÆØÕ‚Ïñ^iõþ )9yã¢Jïàæ%ûYЇ½øÅSDúï# %åçÍsQg(¹ê;½yw½6m·>êE²'Z²“Ý<ç.¤Åuùä ž1cÆÇ3‘ž1ã âü½ûÄíëØížãçŸbyãZVþÔ±�³Ý"Ã…7[lˆ¥Ö.à’ÕÝÚLcŒ¬Óº/ˆ4DWÖÛÈ`BÛ m 57¡h†ÅZQì2QòdªÂB)Ìï*~‘ñ%A:)J³R '‚•÷BƒÓy xV¾½7"NÅê�æø6Ëtl@™ÄºÓ4ù\Q„~ X9v¾rÓâ� ‚t-ti×DQuN4±M9×Ã<7X …È· ®§ÀÑ ¨ä|l­×_éb%›…[æâÅb~QOeRKQœ—Y—qÖ'ÙØJ’¬hG‡®x®;¤tò'ù½ïÓ{•ÏUçÅÇ×Åz!EC§9ÐX.žÄÆ'À1¼ì”Œ¾l9)ö‰|Ë'Ķ<âFÓäùU†ÁÇûšmëŽ'£±lï`ÛÃv‹¤˜ÉµÃiçyìbF¦Ò¶Û‘)C›Ömæ¸@ ÍÑ�¢,DYHÇAXšq`ÆŒW3‘ž1ã ¢qð³ öo2œ>äèù;¿ø á@s”9›‹ Ã&bÛ ‹¢¨ %½"iÍ@Ϊ*š“?@°JªUIn 1Ñšçî{As�»Þù¨�®ÖJ¢/mÉW5zÿÝ›sµ„ìêõFÂÞ¸³2¡AŠªè¥áŒduR­ü5GÇEÉŠ»”mýà“–Ö*4‹„6Î08qÈE|¦– »€.;¼+­ÊÝiHÜ0¸&Ê…;q.<@‡³p80¸–”UÌj¶º�iÖÓÎŽcCi]vq|åºÁ­n1ä÷��ºí@¶ð@&–É�ÁŒ¥Uå¸Öâ•c?I¡¾|¯òjØÜä”õ~˜’.ï$Cá0{� Ã4ã…’ãí…Ø^¶Ú×Üj„qÁÕe‘Ïj¢ž(QÀ"¤šÄbF{Öã› ²íO{ZóôrÕÁS"ÑÐ`L;6Bi?,Œ÷,‘ïMhCá6,hî S[ÑŒ3®f"=cÆD/ÎB@Rââýl×kÖrôéèåëa ïSnâQ”aUͪu!ÇÙÞYäBÕcZ¶Î«oZ-i[ƒ!F:ƒÃ6Ð[H>Äîû”¼<ÂÛêÖù¤Ñ1æ,0ÆÑ‰�+ wZjæsUt%3œPHµ(âYŽ}�`¨+Ðà’@Óh'"Ú( Í�_<8Bƒª@Wš‚”±N¯£CX"áœálR¶p›ÐÕ4uL@\Gu]ëü²›žþö(L'YàEe÷Ò¼¦¦\Ô†;‘@/€É#+iY"—á†}�ðß›í@è…®í�eµÚìdèJ¤a·ë0þíC¼ÜE�G5ïŒh# ›„o·øý ìb“U蔨Mâ«'}�H#ˆå…TŽê»ä‘ŸülìZþŠ€„ŽVCVúÇ]�ûŒ3>Þ˜‰ôŒWbŽ„Ê?Œ´Ù°}ëÞC+¤E‡kS,©–¹[m!^UÜJ˜Ë�96ÏGnáºk#n"W!7[NDÏÑty@“±ñøŸëïLËv¨Iuæ°íZWš@ë÷9›�¡Ñjºçd¹ „¥/œa�GíRí€;MÕÆEéÂ�#ow-] Ü:#g>{ùD-ÍmY"$4xI)cÏ;äÆ)#OÞS=ks/Šô“YYÎ.6¢[ÑãegG˜Ó$Z¨æœj¶ˆtÒ¢‘ô¹û‡qÛ=ˆ ¾ ¤¨lº�féè¢�ûz�噌uG®?l@õC¤t¼\ Í�ßÛ`ÛuV¢ÝJrÉ.ñeÿy+;5"Òžœ+n“64´z‡ÊÎF.IH@ú¨�3fÌøXb&Ò3f\AH‰QË…z� �$âг5Å%¤�ËÒ4£vC2 pÑ]Ñ›‚Ù‘0 Ùn,bˆ�@Û޵!PSA@$»Nk#’ñÓèˆÑì“ßÇ×ö•êÁÁƒ <4¸Ø§!qg8 ^ß�Юð¦ÇƒrЯ<»ä§^:ä™cr°"Ú IDATEèˆ1ñݬùg߸Ͻ³€X!¡ x³1^o[çâZCìàôaâö)ô%².–N†Ó±’ç·K™pgŸpûK¢Iíl„GR4v©!uq㣞€äNÂH[vÎt-ê¶X¾[.Su´(±"Д¶Ø\jÞnìmµO<Øû:®“4€dÿ¹o…øPK§]úøÌIY´¸(bŽ–f‚îÙƒl¾?¯cKö² Rú<;H€ƒýä34wÏðÝEûœò¬VÛ¡K1ù”q»#ýwE¼agàÞ�µD m@š�‹ ·ù wÏ÷%:y‡gnÈ2cÆ•ÆL¤g̸‚ÈExFМn4û9r±a‰²«Ùt"»¨;—¬4CÞÞÞ%HP"ñò�D#18*Îa)�EhT¨šçž¸Z$×rqQ¡�˜r?H‘öÒêÂ�f-&÷ŽQ¾ðYã¯ÿôuŽZçð€ï¿§ˆ<8.-·W¯}ñ&_xnE#€åk‘…rôùÀëëž×¿qÎB„¶ÜW¾»èy/äÂ3ÓœÍì oÝTNà¹ç™3hzäóüRvP¬.ºÌQsˆÂÐ64ÏÞB–Kü½„Ó3ˆR:ôŒ÷$FrGùúlV/8cÞx¡Ø¢vÓ¥ìˆäìðâ=JsgÃ3®4f"=cÆDÛhþ>²Û2WrÛæFñ¦FØ9!M„Ø(} ”˜9Ýy@«"]$T’À ÊÖ�ÖKp38R³Ÿ¥4µÃîrà ‡Á”·ã ÊQŽCm}RIKÉ .}Éœ˜ŒaÈïyúúD¸w:0xàp¯¼$ܹnãøž{¼N7°"òsŸZñ…hI$‘â�VÏ–ƒ“uä�SxÛ¶ÁØH$¦Ä0F— &9Å!x¶4É…¨p²€Í çl 7×p}˸³±Ô¦7ª¥›ùüû¤º¬=& fMàØù¶‹ÒZÔÎú™,å^yž«œ>RÔîò Õâzgö=%— Ë¥¾8Žh�{_Rn§ä Ú”[#Y­­„37W±šgÒ;uSnº§®�#°ü¤˜UõtyRþ Œ•`y1f+ô¹9\"OYžœ Û!wñÜ�Eç³ãŠä“ÓÅŠ°›:÷ݹw¯*îuù1cÆŒ�#f"=cÆDP)9·2Ú1ªš\Ò“Ñè´ÉX=‹8=\p¦ 4BrÁ\¨OÉžÔ$Bg›Œ3î�ÎÙ�8iOµp+(�B oç'”è�!©4(y�ZÖý€é–Ø-8n”`¹Õ4Âc»U¶ÑÌ9hàç?»ä_>† ü¯¿Â÷߃®…[‡š[žd…6•öÚ*ÜY _zá�ã®Û'c…%àÏîoùÝwÖ¼›ŒT» j‰µ+¾æ¼…ït’²CÙY <ÀÃ8]­uùº€`”EBñBwCL3Æû#$Ö&ņcÓ“”å"Õo]Ž©Ò”»Vˆ½—lf¥´¨§ôu¯ÄÔ1KX ãߦ ÷]4`ˆŽmb†š�9nyGÃðå’жt÷ÎÏÁ"¥�~C=ä.ŠªÙ®AÚ#ÒùÞB €•ÅŒäœquò·ϊôŒW3‘ž1ã b×줪”y[^] ¡7½Ñ¦ìWîC¶mÔ´ŽÜ½0ÿÁ‹z‡Þ�ÁsIÅàÂÝhœ˜s¿ Üéà–d=ü$:g…¼ˆäÖÖ–[²öÈûi‹Kƒ(,$ l†Äí1 !o�+|ö™†¿ùs×øÌs+WÎ×ðýÿó>f fiïú߸Ÿˆ©×®^º³@Üx´x Þ½HüÃ×Nùöà zoF{@ž8F%µÎ�È„ W%Ô�ÒÍàýœ·°náés8ìs'A+oÏ‚¸O”þzº’œ2eª— Òõ×B²¥Ø7B)šuÉ÷º@'¶�*HûcŽù$ìZ½ïTï]ÇÅú¦Dõ€Ké0³§˜?Zâåã'q©Ùåäx�š;p&Á’•çÇ©šýeG‹×ÂÉhÈ�r7Ë‘HG0 ‡£[Äб|_iÞ?…d¨åšÜÄGê„OùGQãðòÄîÚâG�ä3f|,1é3® .“è¼{ïÐG'[äPU’få�!V Ð\UT4+ÐécŽqDIªPš—@)¶BX›²ŽÂ)‘Ûdÿí¹gÏhNÉ$'&”„â& ÉXkñb naH ŠæÖÒ8ÏÜh¹u¤ñ�W>±B­gÓîží7½øã×ﳕ–Ö7­:+-™Íû¤k�¯½¶æk¯­éMÆâ±ñ=S"­;{‹"{ä´ÖÑk/ô Ü]Áº�g.àÆq—h!£<;¹oìÕñðÓ‚;v$º¾EÄÑÒÚ]U‘¸?¶i¬Ýe"ý‘ká a¯c«‹5³ª&§¢ä˨D{i1ïZÔcy”ôîObmC_R5BñêGesÑ㤳åhQyÌ‘j—”ÐB¤±ìÅÎÛ–[Ä»c6àb\ЉÒÜÛ€ ´ž˜jbñé±wQKa3½/Òþ 3f̸:˜‰ôŒWÕ7‹€¢>D¬ßpóž6¶·�è— " ˆ�š’® JÅ$°%°�‘Á4wo+[æ™UìÔÝ*ÎVïñyrÞqáF/$u¢æP6¥'‘‚ Al¼áþ�8±�›gš[|jÅ#klS$Æêù†£L¶=ß§åtc/÷Ï#¿ûÚ–C§tP1<ÏÄ8bsáŸþpà¿þ“SÞß HKõ¸JQC‘Xçâù6– ÷xœçECu×t 笅xg-<}G=´E@o-ï4eòJ’àHÞÔ�˜d¹±S�½Oωч+Xvlc¸H£Á:[´Œê�¦<9ÏZ]GÂ=6³ÙõIÌgœ ú%ÒBJŒHêx#HÎúcEJ!·ƒK¶ñh)D•ÊUVÂŽ)qëx/¤!ïbL–ãÚ"»q&–S"‚ö†n’ƒ$#˜em–jÀmÀcÂ×ß8ÉIòýÄ{t,Ê$û�%·½ )ß3“lñèUÁò5ä eGgn>cÆUÆL¤g̸‚¨ÞhuÅ¢“úL¤[âù¹ë,nqqÜ1´B E=,2ìCJ˜ø¨8�%f~ù|—ÊÏJu\“@LPÍQg2Ù’\ð—P6Q8‰‰qL:®§\°øü*òåŸ9æûoŸóí9¯½µåÞÙ†çn6@  QHª|ýÍ Ÿýþ†¿úÙ#þþ�ñƒû†k :œl›è4i¢":_{ãœÿøwN¹»�;wr%fÅ~aU‘&Ï�æáð’°±»Þ=áÑËŒ”¿›Àƒe¶z\ßÀ�s8²·¶I“s‘ÏUçSʱjœìQ!á8m8<è8X\�ÁZ²Áͬ�Ìݘ58{&�ÓûZ~­1ˆVIç¥{>ýE\KôjÆ_™¿WRsŸm´£Œ XÆÓËè)Žƒ±Ýlh¬+^iÙºì«ÓÕó�‡S,&)!1�9š² mžH– ±M‘p¶E/zBIùÙ¦‘ Ã8o»çgW¾™aeÅ�Ÿ•º­C½‹3f̸¢˜‰ôŒWFÀ#l×›o&‚j MÇpÐ!‹†Î?Ù°p'^ïèaÐ’ P­•DWú2�žx‰/Ó7#X � ƒÃ`FrÑa£ ›aà´*¡Éí½M9Òþ³ÿè ¼t#ñêÛüW_»Ç·^_óÛßI"¸p¯OüæwÖüwß|—5!7F)_”,m-ß ™P‰V×n~_¨v‰‰"­vi&œµ%&q.`P¸ÖÃS’#å¬$N¬'"‚§·[¦hñœƒƒÀÁ‘ Òã^ ÝsGɢꆠxÊq«á>Ùñí×¶ü£¯Ÿsc _üô!_û½{˜t„äX¬xÊ�aePcÀøáIäÿ”_xs�JÃï¿{ÊŸ_�)„RÐ6^D±K(;e±˜=juaÝæ¯}.‰b¤ÕU)Ö7IWS&R€MÛFØçéµrØ;Ë(5^¹L¢?fâ£i[Ž�œ®ÝçL㴲ȉºŒÝóŽC�%Ì*´±çöïâÎÿ<™‡'@ÜqëS>gv‰&Å+, *Žv�P)>†Ä#q›Z”4NšìŸ{ï·JhË÷qÚ¢!},Úñ”CBû›ÙFÄk7hÓ.S;«Êš…²gƒM­?¨Šóί>�)¤´l·}ÿþŒ3®f"=cÆD¿v—¥)]À• �¸ 93.4ĶábÙ±9léå_Sòæ™2ß'Ô�ÊÏãfxþµ¼ÞXV³«uÁ­d2«�ùÊ‚çh1WZƒÓÆYŸ}Ð]'¼p³á©…òöEÃßùís~çœMŠ:b$À�ƒÀSË–­rÜ8Û¦åÝ”sÞZþñk'v’c]‰Z´GÉÔhtˆãj¹]4™<-Cä°U:�‘(]Nw�!Ǥa™DZiôL1"Á�`)› � a­Ê�&òôZ¸îΪSD”aè¹výEŒ¶3–+g±l(HÄÍ1©48q�¥#¡ ’ò­ Y’NÖ$û§) :àA„à^îa6p×z<ªMboÅQw(öÕV1ÍD¶7ÓñÜ3Ê�ãO­×;pzwNúÈ�ΕïÞOüÞ{ðûïENH"ˆX&tRl 9q%©ñ²á+·x娹¹lè´% ðþfËç·ï¯9¿hXøâ­–O\_ñý{¾}_è­ÄÎy„ÏÜjù©Û-†óõ¿¸à�óL¨-$ìšðìKåz੃U¡ï{~ôžñê[=ïÝß°jËUKh ØòW>s�ÃUÖJON#ßþ‹ ›Ô‚ºÓˆñó?{ƒUçÆÛïmyõ»=)eúçºåÖ�õêý–¢µf²zòÀøæ7×Ä'ª£ò:þ.¢›ˆl# � 7Ûu*¯×±×<¨ì*”èÇËO}ÍSWÏYëŠæ¢ÐR_`ѳˆ™‘Ò~4ãŒ3®f"=cÆDNØÈJÞ`Æ6:�(K�´è8»±ät•iSAKc ûÐ#|HýԮƬ�’ZS¶³»bìºüU{qk9½!ˆñ¿üön-ዟ?b»�¸±lãn\oø•Ÿ<äKŸYòò�ÏÝhX´>nºïÒù2ÆöSÊß|¸à7¿sÂÿøÝžÓI!oÛW{4 !‰ðŧþöË×ùùÛw–Šr—;sxï,ò?}wË?ù~ÏQÛò+?ÑñkŸ¹É«÷Ïù;¿wÎë÷û1q£5øé;Kþ½¯Ü oßý÷Δƌ§Žœ¿ñÊ!¿ôÉÏ^_Ðêî ¶ƒñgo¬ùÆ·ÎxóÍ>|º"Áù¥/]ãé["Æ[ïö¼ýÞ=Þ¼Ÿ%Vuá™[ÆWý:7VJÂøúŸžò¯ßãl›ÉòW~yÁç>uXZ¦×«wÎùáŸoùΫ™H×ø½0vp|Mùò/âï?Ø ¥°wÜyù'œ< ‡ç.rÕØ9b¿Yˆïï¥ï»i¥jˆuË]ðKU„˜‹'ŸUÏ>T“bqhÔÁà�w„ÿö�ðÒŸœñÞ}ãâ!ãç¾°ä׿r�/¼¸àÖñ4ÒnGœ¹K�ÏÝXð·ú:߸ÿ>_wÈiìˆ?$øÄ±ñŸ|ñ)~îvG@pÞOÆfkHàÚ ž;l`ÈWÜi€FŒÏ=µäo}þûßÛðnßÒ8h,ÿ 7Á‚q"¿ñò¿ñS+ŽÛÜyñtíôCâæQÃ2(?ùÉ7þoyÈ«olQw:¥k„¶0¾ë /Ü^ð£»ëÑŽñÊ'�9ì2im`µœorGÄ%Hî^i’S'/J¬!!M2£§³Zeã�­i:çùOÂÁ±s÷�-NiFXì e¸€oüþ^C¸w`l,?­Zmh¤˜cDó³2­ruÀíRæõ>­EY²o] ÂrI/gtCÄBiCN>~ý¸º]:Ò{y{ÿŸ�¨™XÑðÀѳ;‰cbD™=Ò3f\eÌDzÆŒ+ /d‚ H …¨¤ïŸ‘zañÒMâÍk†]—¾Tš÷\Ò{¨+8ˆAã¹)Èi?�´aÕ)Í[êìÂÜ.õÉÑržrŸÃkïüà^VÍW�ñÕõ˜ý+Ç<³CÓÆùÁrùOŸzÁ¼7 n¥ûE�ÌÉ ÿáOÞágžé@÷7‘ðÆ)ÿû/¸ˆ�Ÿpå¥%|éÅ#¾õÃ-�µ=pˆ�ÿ¥úK?±âõ‡-ÿàO"Á%“5/sX¼çjÎK7œßøü ®·Êàð{ß;á¿yN3(ÏÝ„¿þËw88rn?½à•Ïòû=‰Õ¢%ènYrxÐðüí–ðí AÅùÉÏÓh¾0ÁYvÊjÑŒÄQJÞ�Œ?ý³3¾õÇ©hÎŽJâü¡°Ýî«´µ¦/ŸÖÁn�§n7<÷bÇ÷¾ó�Õª…‰£Š*›Á± tÚf"š,/¦&OWnjSÉz9ëįü¸û\Ëþê_‚Þ~ë�`‚½õxAkÅöqÉï]© w.ý™Ý‹z©P@1ipwèXãnÜpî1�W ±�¼Ï3cÆŒ�!f"=cÆDig(]Ó ¡ÉÖ iÐ>нÛÖ÷ðçH/.¡kˆJi†ñãoE«e⬞Û.çDÅMY;¤�³l�ePO;Bviï|ôV[~)jÀ’±ZÀ¿ý«|õWnpý€Üî›1u?N�œeí¥qHí¤G¾p­áן]°På"%þç�ñ_|s͹9ª[¶CËé=ãÕwÒJ#‘`íxl€e£ü›_¸Ãw_ûßz?·a'×ÿa8âFcÆ/æ:×–Y•ý­3þð›§¼ûÞ@P¸{îð/ßâ«¿ú,� Ï,yî©–ïŸ."�ÃGž¾ÑpýXyxOÝ„çî(»·8‹NX-rc–W¢Þ|{à_~cSì Ùc-¦ècì½ÕOlî‰ÅᆟþùÛ|ãwOX,ZV/œJεÞ ¡ú˜ªt®h³ÀÔè“g/µƒ»åè9rpËÝi²[µ–Œ�ª8"¾G„hBÛaÏÞdµZ‘Þ?ÃÖ[tÒ¬æòA³IŠw¿øúÇ_ .RˆurU:àk8jŽxÇ·¼7 6Ìñw3f\qüeÿK4cÆŒÿC½!вêV´Í“†¤9©¢qGܱdpÿœæÏß§yoM»ÝØé×Ä÷péµB2’ãÛ„léAbö‹+­+M $oé{Øn"ž¼jå‚­`“¯Jš,wá –8òį}é�¯þÊÓ\?(­¦ÿ_ü«ë~¾ñÞ‘žÀнÄ$oÕÿì펛-ÊÝmâï~ÿ”“¤ *¹³‰^Coˆ5„´ ¤fÏXâÀµNù÷ÿµÛüÄr§ø;•Hƒ¦Ä_<Ê�æ¼ý¶ñþ»[‚œï¼¾æì,S·›G�gŸjiƒr|ÐNš¥äƒ?u3pûö! |æÓ –ÙõnE]tÊá²AjT_%œ.´~@–4ÍmH‹§Q§¥®xöò$T–ü+õiÞ|ý‚·ßè'MQ —„c8 4A›­¡šPšªÐ¶ M“¹Ë t.2¬çMÜûÏcõ¶CNÐ(4<·ö†d–›¯ýõ%éùÈ­#¬U¢B;—˾J=µ9í=ÿ (¹QK( )»*ÎÂ'õ�Wº›Ü‘—óÅg̘q¥0+Ò3f\A´í’EXá’»j! æ™ $ „¤„ìÁ†&&†k ¾hð�‹©ª£¦ q'©¶-© 9š²úGPLMHrZGl@D±$¬Z…®UT='[„�œ`u£^ùÄ Â¯ùˆë«ªê‡;>É�µ¿ùÝs¾uÖ2¨Ñz½²RfgðÒ²£+9ÒïõÂkga UãùNyÅ”CoCbàîE$¤œÜÎI/l‡� /Á¿õå§ø{¿{?^:4h]8çécëÞ8¹ˆš-+â´© Ü}°æÖÑ]ë¬]4\¿ !áo¼sÂÓ7®q|´äù§zV݆W^\Ñ-²•âþý-Ïß9dÑE—$óåØ�¦øÂË GËU™WåÕï�óêw"ýVÇnŽ™Bæ‚N-ãOºeà›°ÆÜvöÉ…‚VTxçà`Å'?Ûa×H�²î#÷Ïá�Sc�"%ºâsþ8 Ò�ó¼Ó#…°!÷ìž$w\ò3ך"’<[,Üðã¾øéºrwv‹;PTu´åäÊ? †kC’f´Ne¾€4% Ä ¢¼°ºŽ7×~ü‡uÆŒÌDzÆŒ+Ñ´ÁJ\—“ó{},­+ï«WÖèYÊM8V^"¾�¢zŽŒó$„ Ãζ¹{¡*ª»ìÞÚàËžéÌ wÛòj€ Ħ¨�R›ç÷¸8­$>ýŸúdW #ÿrêžá\ô‘ÿã‡üÝoŸq²u<(ÆN‚¯êûªéJ×=ç¼è=CÃ3 å?xù:ÿÆí#‚+"çÛ†ÿáwßáÞiD Ó;;ßòϾû€_ûÂMnv|éG¼vwË*dû�ºp˜Œ[",›0,Ã0<1èÐ÷=p� ¬*ªÆê #hƒy뮳é/xù¥ÏÞ ¼übÇíg:Ú ¼ùnäÍ×zž¿sH×µ,—ùº¦ÐÐñÂ'^üDŽÎs”‹ÞøÞ÷Àû!gh8”þŒãd=û|ËË?µä·þ·wI)”˜ b±ÍäOœmœ·Þ¸ùô!g ¡S>uç�Õ�ñƒ·þÉŸ ¬7XyF;#g[﵇œÌÍ= Å"Dr0ÃËw’ekŠ aµQÄ{ˆ;Š\:ÇG�”7;¹>2blÝrà½ü3f̸ ˜‰ôŒW&‚¡%MCÇ-s×€¨\"™ä6–»»Å>a!hÈiyŸ\Ñ pšÐ‹œ¿BîèMa.6ÉýuÏÉ.Y9„œà 9­Ã=aÉs$YÈÑrÙ››?«×VÂg^X°¬&㿸{ùÇzÁóÍ^ë#¾RhKF‡TÏk&ñ=±ªu–ÊóG5$.pŒE(ÔÏwêýŸ¾á4þ�¿õóÏrí~õsG<<Æñ¬He^&-Ê/!·vß)­î†Yd¹ ¨æÒÈ çëžW^ZñìÓ _þüŠk‡™½}óÛ§„’cÜvÊr¥ˆøž >™sïþÀý»}y”»ïõ¤ä£Ã!ÕÏ”¨¼ãë�ÏÿÌŠ?þú=Öšp�X¸*>útò5¼ù­ßz›„“£–óƒl…yé™_ýÙ~Éœ¯ýé5a«°ÖÜ ózLE wqHObñ¦sçžwRÄ@’eÿµ¥Ü"<ùh U¥Yt$,€kÏ IDAT%<ùþY>"“vÀ"N±øËÅ?*Ÿ1cÆÇ3‘ž1ã B¼É-ŽE©]%¼¨ÓÕç©U�AD’—¿Æ¢`—Ž*vªø)Ø…!ƒƒ6HH…}’[¹±#è!Ì…EÌ$'¿¯ªÜ¦clžá„¦(‡Á2±\¶ 7®MLªŽ!(1·î®ùûô�ßzµçµs'uJè•æÐðU …RXŠÕî‰d™H__4Üè÷Ì9IÎ?üÑ)'ïö¼|$üÂ'¯—ê!“³Ü1OÊ?ÿÖÀ'ž9ã>}Ä 7<{½ËÖ/­Ó#œm×MÃÑ" âåÞ@E=q|° Y¢2É_.Cæÿ朜õÄ”XÎÍë�Õâ€ÕRˆ)ñg¯nyþ¹4\‘2 ¶EÐÞF¡|ì;V|Ç÷t"­cqf"Üyéˆï%îœqµ5>û™3ž<&\¥.Xâ±î‘ÎñÅÇJ/;NWÂÓÉq vZÜ)Ea †QWîa:lþåCá·¥m� )ÉAœ1C*‰n¶+†UÕ>Ü Å;o»Û“6”¸íùì”ý{ž}÷þÇ ÁY°`ÁŸ#,DzÁ‚[SE¤›cxÛH�KWhAUpÕ*Jׯ¹3J¤~ oN¬¿¶¡\ƒõL�á+‡“9éð®Tߪ̞Ԗ¸`s»\¢-–;ižäVȱ+ôÛÌPœ^ï”R„i‚닦A¾7‰Žc4ą߸å¿þô%ÿô+ððйsë8uaeN_²‘FãÙ©p}š�¿üôŠ/�÷¸¿^Z)ÿîÇîðÆÕ#~÷J0ILÜ; ª »çí@ç‰ä_?ù¿~ý1ÿÖ_}…ÓAcಒIWá³_ºæ:&‰ñ¡÷ßá£ïŸøìW®q+ô ~ð/¼ÌÑÔûì¢ðèIæxèX¥¦“&®¯G6Þ|8òáWîÌúéþÑ– …‹Ë\[c=8C/\^í›÷„‚Êa‹øñü曶7åÍWüü§.é²á ¶C×Ü=â‘¢=_}°ãâjË娔®¯$ºé9[£Ã@™4v ‰…pR+‹4ŒkœQœ• +:|¯p?¡z�Ͱ)ÓgÁKd:{µ{„ÕðìXK(ñðÓk­§éüP}>´ß쉻Tr=ˆâ©(£Fwl!Ñ Üz,DzÁ‚[#HÛì¢TBQÛçyí7­D G[Å¿¸eõ@ ¯Ižð^)ÊÎ(>Åpâ]fF¤ÓV�òŠ×H;˜ûÇý�HKlÝÃè¬sªN”ðwk�ë뉇.�5ïE¤ƒ:W^øÉß<ãúÅ-_ºLl(L Ä•ã¢Ü)Æ€�DÉ“Ãè¼ô¤p´s.ï%ÞRáþâßó=Ѹ÷WîŸðÁ¿ØóéG¯ ߥßÿ¾�ÕJÙìl®9?„¸’,Èöç¾rͧïÿʼÎ0¿W¥ˆðÙ/]òŸ<åƒ/­¸÷üË?ü"úàŠË«‘�|à.ï{%ò¿wyâëolxëɆWî�2¤Jp¶›‰ÊÃÇ#c†Uç¸ _üòVJ.=ÛÉXÆj%ô}µ]TUwX­ø‘¿ü2ßû}¯ÔäñxîÍfÇÿø·ŸpqYôÜ�Ç��GOŒÎ�ô�‰”7X·ÅW²¡]â�77<9Wœ–S×[3‘öùó¾8°)Ê›—#îâNïBraEä3›v R”IbE¦fQ.óNDº^)¹ Yª"Öw‡¾i+ŠÙÞÆáØLæ¹~§!ÐøX#v”¥GÙt‰R2”wâ^°`Á­ÂB¤,¸�HFÂ(D�#dé@j¼Zýš7Fk‰n'ðÐÉ· Ûhk+?_¤0¥Ðétä¼Ð�Fw§Ã�…²2Š¢ &ˆ)Ã�;D—ŒÃ’0™�HȘa2„4«æŠ’Rõ Oãó_yt–yå^Ç»åG Æ7Î ÿå/œñÓ0q‘#AB-ñB¯öðz?±JÂÆœ³1ñlñ9�‘®áî.sušø{%ó¡ÕÿÁÇŽ8Z |ìÎÀÇïhüƒé $ŰääèÎçúoD)*ˆd:ˈã®ç×~¿ðò |ï'ŽA”©Û1¥‘Ë«ÿèÓOùñ¿v—WN�¸wGø¡ï<ˆKsç2OüÁW¶üÒï�‘³p"aHɨY-Ê1bFÒÁ'²v˜ưüÙ»R|TÜ;J‚N wïCž:6“Ðõú•�—�Œã/ñS¿ù£ …Uég'›1MNX'ªE¤8˜ �)CM‡¡Vq{³eØXè&¡”1RUJ$xxJ!rÁçÕÝþø½eí©£u'E&¤9)2*=æ‰"Aþ“É8Gºâj˜xÆB¦,¸ÍXˆô‚·§Þ‘¤çÚœ¬ÎTãë´Ú D‚ªˆ Ý(è¥ÀÓ‘îÒ¼§�(òö¨´Ãt �é|B'……ã8E,¼ÐEP‹|iqÅ4<Ê!–È‹žõÏÙë�TåRD S<>û™‰—~d8h껉'øÛ¿ú”ŸøÃ-×(ÞeVÅùöuâ_ýVüõï>æã¯žp4À¹Á/þÿéÏ<ål7Üxžb=GO�r9ñ_í®ùÆõ=þõ�œðÁ£ÂJ%2 ³‘ËÄõFø¥/œñ¥'…uJ<»œøÚÓk�I;´œ��üògŸqr,œ l'Å}Å(Æ—Þù?—ø¡ï^{I軈gss.ÇÄ~yïæÛÝ*þÁî:ž^Ì�Gç™\³›ÏÏ _yã‚¡[ñÙÏ]³›Â£;åÂ×ß¼ÂÊçס¸&2�Ï o<� „Uz�gŠÁ»ífÄv™"9æíæJÀð§ÙZ˜ê•ôËt y/¬á¸ã;>qÌGÞw‡G _ße.’ñâ‰ñÉ×^æSŸ{Â?ýÊÄ�Éõ ³Zž¿ýn^«:Gk ™j/jÞñx�#“¡ÑIƒ•¨D/nÑ\ØÑî»·ß\N­/·Øñ°š;ÞÆj»Â>¢Ñ¡`‘žÓ-½g Üf,DzÁ‚[ˆµt Ý€C}š_“–בHEð è¤ËË1¤8‰bêo‹í¤F±�HHÛé#;r"tY 7§ó„š�Sb#påLè<ˆ|<›…Í£¾ŽjS¤wžžoù­ß½à»¾kÅ+÷ßùŸ¬/<ùů›’PŸ¸›•Žÿö÷ ü­¿ñC5q½äüØwžòßýü9J†âÕ·yÙ¦N²Dy´âïþú5ÿðK×|âõžW�;ŽDùÈ3GŸ]òÖ#cÜFŽÄÆ ŸþýÂoþÑ5£ÁùÕ Ã Ðóõ¯:?ùì1ý <½H`‚P˜Äøüƒ+ÞøÇW¼|¿çônOê9g?ž8¿ØáM†.Ê×ÞyôKo¡*Œ“‘µÏ\^;¿øÛüÚïœñä©°×àÆÅÆøûŸº`µº çÄÓ§#Èšô OXKAmÀܧ£žÑœ°iÃõ9õ}îíÌ–¡¨"]$FàѳÌô¯ Ýö’4î(w�øµ_Í|î¥-¯¿ÿ”ã» M‰7.œOýþ#_ Qh“ª…DcŸâ›Â%"笮ù´êf/Rst*X�lƘ3ÙwA$^!ù;“h/µ†¥rzq«4:²ÓEIvJ�L4qF Û’ÝmQ¤,¸ÍXˆô‚·!뢨utÅÙ¨3"¤Ý6F”]7vÕ®Pé‡ÖØ; 'bËæd�Ê7œØZ�¿+:9n&У„žIîl“sÞ9›-†CÕó\j8E�s­ê¨8hO\œLÇg>?ò›ÿß5õGNXo§XwçÅ£Ì eâþN9-±x½' µä#�p]Ž<ÙêB9ðï†é!,-î…G[á­ó§…~íüÅ'ð‘+Á«£X¤à–8»ž]k%�y_]]�cB8»Ð:ô™Q5A½#'åÜàú‘¡Ovs~tg×Ifø”�‹s�kæÍÛJÿ“«Äv+Ø.͉¥À£³¨çÆ ÷‚öÊ“ `tIÅ) i*èdà#øÀ�üfo1ÁVKßU·MAÜyt9ñø*“ÄÑDø˜Ï7øh<-›#�x¦Ž•ŠÓ{Ò¹Œ‡ƒÜè{!2¥õV¬Ä¾ÝK¥~­iÆY”¾¹S6F3òœ\S«¾‰ë89�ÐùÜ5íFGçwæVã†J”¹L¢ŒbŒnì<3a5ý½‡d,Xðç ‘^°à6Â5|¤µeíît.xYJ<.·:ˆ(23“VŠÌ쥞uV—¦ä5ÿ¬â[°Q Æ#á+¸ 9ÁP„¾±ËÁ¿€HˆôÚˆgˆû¬>¾p>õKç¼ò>ø ßvJw(a»?ðï|÷)ëGg<ØDÜZ¿Þð¡×_£åhï�°ÊÏ~þš³)‘«À+Ùµšªá…3E{À³BÙ~lŒ»žâ©ž†H Ab@­£åd·¤‘ u‚ÍçO¨j=~«ï-ŠWlžd³R(µõQšm¢•�ÌÀ)5gÂö×ǽ*¡n‘á‚»£t±^Bñß7ØfÒ&ÓC<ñö›jªÌCŠñËJ±:øØQbHOâo±8©ÙÑãŽt) ùtEîJT�›Tõyf‰×ÄfÒ ÌiZ¯ä¡îoè|ÍA%‘²à“3™U›Fª9Öû»a¾s®ñ¾þ†¯Ú�7ΜŸþÌ3U¢Fæ$‰:׆Õ�<â-³ÞÂz'|5OltàãƒqR5Ñ¢{²wˆ¹•ð0­eœ¿çË?|&Ó5–°œ¸Ëœ¸á¾ÿèîXãà‡«�w…ƒD�áD)Þqå†É8ÊF2ÃÅP;le©e3õ™M +”V §«z�Ÿ•ýq©ÀeRÞÒÂSÏdëé빘‹Çå¹ÏsçS¤�ŸwðN{Ø…Üã=íÄ=³²CžèR³%ùóO^õgwæPÀzêô=Ï!?ç\»±›ó¨Ö¤ºs³`Á‚[‹…H/XpÑަD×wt)�õˆŠ1a:ÊŸÒ?®Ä¡Ë=S��)ê §Ð‘èƒ‚™žȃ·]í®Br¿ÁwÜ„?ø¼ð¿üoOø÷þæ=>øÚêà'…£µò½Ÿ8æX‘GçôDé#Îa¶ìòÄÿú�ù£G#SêP·YuoÝ2-çØëñ$„^ÇžèÜ8Ë#O˜8+Îw®ŽxECÁýç÷(y‰¢Å½å s9P¨›�-ÜàÒóó<ÏJ!%¡ë]AÎÎå JZ­˜žeŽ/2G£íýЄUG¬ œÆu* »“š¡Lì.HT‘KUáož$.»K¢Âº¾Ï®ø ‹ÊY”,Î¥Ol­°C8Rã÷('2¡“ªú?·xk»±�:Ô¤¿ù{rw\„I‰Žùy3£Ø"I/Xp›±é n!¦. =º´¢ëû a[åP"Iâ Ã&„QeVg¡›ÉMÛ—ºÇm©„âØò6ªbš\E2.ÑÎ7 Ä3E�'†bôTâ- ‘‚š‘ÄIZ° ñxBp&s~ï [þ“ÿö)ÿþß|�ïùÎu}Z /Ü;NȱSš~éÍw]„¿÷kçüôgF¶SŠc‘ ©Çk[Œ1C&¬½0 ætŠu‡�Íxìk~Ã6¼®#?>âž@òBõ% Ƀ\Zšf'Kk ÔwS*”ê8§Ž™áu’fŸ¨$Û­ÔaÁJ­µX’ÂŽúí]¡ë”¡ïH@#«“µ'N~Q™ŽùlËé³+zój™0ÄʼØð’Øê€§ž]¯ Ð›ÕoG%q¾êøÚ‘s)GÕ¡¸DzËar˜’qìÂ�÷É›­"¾ÉÜÌìVªßÙ\xF溌ì0¤³ŠEs¦[ar£O‰A”$q¿PÄQ|^šì‰ïáz~Ý×Z[Œ�P‹ˆÂâT«Ò·`Á­ÆB¤,¸…èûž““TºPZ«réT¨ï-â¥3©ír2«²³×µE�Ñì½â$ƒÞ %Ÿ+ �h_8 dQ.Õ¹&3Šñ’FÔYÂÑ:!6ü‰×?273Bõ-{Á ¾öÆÈüß¼Éßø++~ü_z•—îÒwñ\Ä›Öú~ÍàÏàïüæ9?ó»×<›êqã³¼Aª³µ¯›úC%\Ô%€ŠÒ‰Ó™1ŠòféÙ^dÞ¿N¼Öw¬53„G…RÛZ¾µ´%ô0WÍ¡öiGúœ4zïõÀ.=?<>�õk\3ª�:¡:R¼TÇÉlÊ¡¨Szaê;6G'l�…ã§×¬7…” 1ŸcK‚œªµCÕLî 3e§+­…§=dM¸啪øzó‡#ìÚœ«Â‘Á‘ù¼#pc¬ôàžD¢uЀ�ãHv«°Z}åûó『g£tª ÚÍUàïræSãï‘ìÑçì•ÿv|m·cÁ‚· ‘^°àbµZ‘RÂ�9W·ÙjÅÖ"ñõà|A¦'¨¥-ÌÑp-¥CEH�@ßi�s²x$`h$4ˆ ½‡oà29×ýÄ®$^ÎÊÚ¡¯jw¨®Ië —à%—(аƒÎMø¹¼å·ëüÀ�Þỿûˆ—îÇ]GR¥ØÈ³-|æ;~úw.ù½‡…0`ºg/yóÆ:É�äû,ãÆå›®(„ÝÃ{«Uà‰kŒ/�™³Rø`7pO�>A�Ç ßsì=IÙ¼’è°oêûVBK¶'o¾l‹ukäOT 3R¯t]XÌ™½ãîûºëÈï&QžÝ]±=¸ódË�§×¬Æ¸!%¼ð–VlûDE´cẉM U8YìL4ËIËod×EØIDØMæd3Ö® ¹ù¢Ùâ™zÂÙŒW»E%;‡ 25žq%ˆm¶õõ[1p|³ëä³Ý^§-—ÐŽ n7"½`Á-„(mÏûeæ±WI §kµÈ%‘ T�ìÊTUæ�‹ÑÄXI¢£P»@0BŽ™¾X?¡F®F�š_� ¥Ó”¹š&¦bˆ$Ô©Ùçmh1h»T[JsF7b.“Å5M$Z6ÊáïŽÜ á7¯ËánFS ÷{û�� Üf,DzÁ‚[= )ÁƒëèÝi¿ösV¯KMÝ…UÝ2�‡ÇF1V G"ôDË©Ûðä·½`I`½G*FÈ—ów¼! \lÔ¹ì�WŠðŠÀ©Ù…ëâ0VÚ#Ôá5CµêÃqfZ=¾—Yxò–À[;\GŠ;ES(ÜH Åf J 7VO­EÅs#v&û(»V;œ0ì1‘y,³×VÄ"vðQ®ÍûÄ �pG-j¦ãpÈæÕmŸnñÚ¬‘åƒH;ˆ!N'üÓ5>°™‰Ò;ô í$â¦Ì@­æX7› q!«ãf³EDª H¦åx`Zßcs¼áΓk†Ë‘«¾ãÑ:±é„«®ß¿·ùþª—=•v ÄoØ7Œhµ4à:Á®ŽÌ¹3:k€bLÛ‰qWÈ“‘«ÅE4|þjÍF£³�ÆÍ( š}VÄçs,Q5¾Ã)æ$�^jDc½Þ~`ý9Š ú®Sý|ba¾7j¯Æ×…Y}}U8 ›Œá슼Ûá¦D�P³}Ä›v‰ûÃÔHÝÙ†´+ß4ÇÙpŠ—¨ WÁ’„§»k‹Í÷ºŠu,fª»î>”ÅÚ±`Á­ÆB¤,¸…hDÚêÒß ûª‰�Äêcî+A:a­Š¹1æ°hL�“S>¬dýÒÕf’ûMQ‹P2Â[É(ãĽ�²ÖheA"Ì}s7_dÿZsŸLõ ßà?�Mµµ±GA„Q“lÇ·Á2¿yæø%Jd%!´&*B’å!®ŒÅy„²ÍÎý^èeŠ<$‘ï„°n¼ÛõÛ{›‹8›:ü—UACwMµÀ„²L=ÆvŠü9"ÝFÍ&1g’»„ßÙ,†UWÑÈ8”Há¸yiy¯UÀó�ÞŸˆÊt¤ÉÄnɽ«-9 e�HY"’P 5¸¿šè¿þ”îkg ç;ZFx¶×‚•ýùžy¶8îFq§“jõðè9|§ëÓv £oJ´yû�ÛWÏ/X°àöb!Ò ÜBÌÿ)—0_iå"ºÿ¥¯^ØÈ޲ uÇ™è:eµèDPF/V·úEȽ×áÀ:À%5ÙBÀ¤PÄ#FNšYÉÌ\-ßëâ‚2ZÏ3/¤iän§¬“ÒÏD¯¦Ž¨Që…ExV­.-ÊoOœŠV²E¨–ŠF  k”Qœ�gFÙ+�“ é€9Q/މǠ%�¤ªÑΗРֵ¢DjC£»°qçÑäl¼pgHœJGrÇ4œã©6$â‚xGЫô^±Ì��®�«d\÷°Mû·¹Èºyáë׿*î(�©Ö urµ€„7<¾aµPð‚úˆLÍÆN’ô¬]�¢z ¾z}nA­Ú;Ì1¯žt=ˆ²;TÖÄ£qrr0Œ‚³ÎF¿3RΕ9 ®=cŸèˆ´ÆÌñ£+º¯<¦tMÚ–jÍ‘¹"Þö¹ûë*áÝ®û2³µÅ«•¦oþ麥Ñv ÔfEÂRSŸ'Z&cE2 üóI_°`ÁŸ,DzÁ‚[‰ ¥3Át«$a¿õîmۺŅI výŠõº‚S“[[�wúÉér<ÇÅ ¦ÙrZ­ö}ÎuÈî�·òã!‡Ú Gí2ªLâ<ö̱9wRâÅ4ˆqï2{lÅ÷êx‹MÛ?c¼^ß*¹¥%·ªièz„;’Øá\гƒú^n>WMŸ#žÚ8î Y{o0¾•FÏ„ìpQ„íu¦ôÊݾg(¥Úd ñDrÇe½e?·ƒ ÂØüÀÛ\vUõ´ænç8ˆ³5器©h*ô|\ÕkÜÖ Þü8ÉW qqÃÝ"9Ŧ¨à"¨Ç±¦‹–¢Ngqžbãû‹çî‚¶ @‹]Tj½½¡%r«=t*ô¹Ö–;ä’9¥OÜ=Ëô_x yësÔº×�}«¡µëx ô?�çÌëBÌ ½8}êf¥\Îi;£UˆûþœËb‘^°à¶c!Ò ÜBœªÒÆ$m[;Z©ÛþÒ¼âˆ:}ß±>Z¡I±l”rPLѼÈâ•Ùî¤I¸8V®èDg…Ñ–½wST—6Ùtƒg{廄M„Ku.4s ¼ä‰SkÍy{or�°¦ÂZUBsãHSU;½ý É•N…« †0¨Ðu=O&c,äy[¿Tª*ô�Ç{mYÄó0¢7Õ>j©í"mÑ�LqI<)Æ…ŒÜí†@  IDATë„�|÷zŠ _þÆ%çW™"CÕumÂä…«Þy²vF�×ëŸëü˜+Æ«º¯Þ5¿1ÐØ²Å©6Ž–¨Ò®ÚL­€;%õ¨:“ÅñL©E#M`U`59£:c_ŸÅe¿XKQÞÒÎGi­&5B®¸Ui7ˆ9ê$|*X.h1ÔœÞ3GVïé?|@ºˆûR-–vpÚ €j$ŠHÛá𶱷ɘYì'8”Jî[¼]§J¯ÝÁ.ËüÖ)óIkî"÷h]°`ÁíÅB¤,¸…¸wÔ³^ \lv\å°A4)2Ht}`rúŽŽWô½bV¢!oæZ{V¥ÞT_‰˜;‰2–ûŠp± 5²Õ,·§8×j ±ìŸ}n‡ãà뭜Ŵ„gš¹Vãž'î[b-ae˜‰ ñØ,ÎNœ�vV076nkb� ©LÕ =©c.¤ÉHÙٚՌὂÖ�x¼öþ?zûÜ«·¶“�Nå¨SD¡”Ìv[8Ÿù~áÃ=ÅÜyøί(t VëØ1Øšð¦OĹN¡ ßï8\î"Ûy¢,G=H誀›“§)&ªóàéœ`Ò®Ú¼ýdPE�”pr5[‹‚šPTÈ?«N&xíʹ¿‰Ä'ÇÂãcØv]]äÄb†µ¿XÜíÆ=!u€IX޼�-0»„Y ¸ºWNq¶ØõŽl¡¢kBœ�6qPV³¥o܈ìÕåæîöýÅ‹�D/³ Ô�Ä9Ü·HÖ™§9ÅFÊ4¾Û¯é‚ n"½`Á-„ãô}âTŽIÓ„ì —ã.Uq´ƒÔ+ýqO: B�K©ÕÆh�†w™5µVæ¯*¦8œŽ0d¸\ —+¸êÚ@—Ì??äÕ;à7J9Ô’0u�RUËëk©(ÛdwÁ™O�‘5÷Ž3ßöú ¯¿Ö3tΗž_øò5O/§ûþ#ø×¾ç˜) ?÷™K޺̘i¤Zˆ‘г*ABÕ ¸`txŽ¥�jµÑ …Œ2j¯w‹bV­DÑ—TËÁͺHòçÎd¼´ËÜÛëåìë¯_ÀÝ <¸ã\¬”ÜEFò(ﱺèÒz_´XA±j¡q%™ÑMwaÛ°fðË Å““îw¤5ÈE†]©Š³B-±Én¥)ûå]²}d]d‰‡]¥]5LÇЮ‘ c2£×D')õÞž0&7¼L˜Gì£Êô'þ}^°`ÁŸ],DzÁ‚[ˆ–¦!�²îV¤¾Ðm`³I¬Ž†ãŽÔ¥Z£½Ï2~ñåJ;ãçjìùYgè¶p2Á³ùÁ~eŽ9òÃßõ"xmÃþ÷rÒ |ÇûïP¦-¿ýÅ+vÅø±Ožòí;åÿyãŠë­q^`'Š»“EøÁ�ôü¥ƒö:fÎŽON„ó;0JT¤xõQ㕸[=¿î¡H[½Š#Ù`*‘Í\€b¸RªŸ¹HŠ >9Ç|€Ù>½F¹¹xûãÂÌÈ׿˜QlÇD!»áÖ,J /´`Á‚?ÓXˆô‚·mÈ)¢¾ŒUrúã�“£Ž])F¡�‘rðÏÀsÿá�Íð–ÿûî¬À o´�ÁñÎ9Uã: c›ë sêAõ§¦úºí%fšS-¯ºŠÀ¸CÖðå>år›é6p‘•ÍÅR ®5Šàôz£IÇÖ�Ñœ+ R6MñÂ)%Ϭ‘FÏtƒ;šbX°“–üQ› uX;š"­¡Tk¢™&’*ê‰'g#ŸùÒ%}yàÞÐÑyWKDeX¯;>ùñ#~å�sþîï>å>pÍÂQJŒºãŽÀ÷ø¿÷õk^zñ.Ÿ|ÿ?ÿ×ìÌ#o; L¡B#à)bÝ ûaP©×VMpu$Eu¸©"5ðf# ÐX2\àåÑ9Ý…ªëRÈõ“W ·r5ãtÅ.ç'ÊT[›Q�•H[û¤×/™Ã˜aŠAB/^?˜éΆ›b(Mg,%¢ú„:¹´üVkÚßv¯×'˜�BΙ‹’)A£)„ýÇýO‡°/X°àÏ6"½`Á-D‘ªæV† ê Cb{§¦?Xøf±<')XõÌ2ÛŠÆpŸŠÌ zÁϪ·UöþÐ,Î(ι|rN.”U'L”®z¨«¡£%=HónP[S0æÒXj­ºF+©&¢ú†+GŸúT1‡þN†ù~Ïx®>oÊg“™\·á]+©Ñx?Ùs ±“}nue‹0MÃ9NB§†’Â?ì¤s4ÒÙØZU®]kSžò±W{î¾�xù¤ãïüüD4†+uUáèHH}áëç…R:þÚ‡ïqÿXùéÏ^ò¹gÊÇî'>rgà‹—ŽøÐ +>pïˆ/<ž0qÆ tÉABSŽ&Ér0�©õ¸Sµ/äù¸©¹Ýõš´k¯ºo«ºv…x!ÕÐE O¯�Ÿÿ­Ç|âå~ì‡_æ�~ê‚0I…!–¸•Ÿúôü›ÿâøÏ~ü}d�ËÝ–Ï]ŒôƒðÉW~ë� ÿý¯<ådPþÃ}{u`ý‡ÏØìºj=ïÂÞ‘«ò‹A’½KØ�©Z0¢ ¥‘É}ŠEƒªÌ¡ÔÖ®�¤2_7vª¼5(O…§k¡è@o�žZ¤fXõF;(Bä}§$:3’C*ŽL;ð*¼E7˜Æ‰<ÆPeÄ‚èžÇµ¶ºD¸ydR7"4äf‹a[XRß÷ÖœÉ2£…‰ÃªªÝZ “À J‚°Ò¸!Kµá‚· ‘^°à¢˜ÕÂV^NŠ6M.TgÕD×9ekØ®`…y{þðçýà/&°íaÓÃXãðJU¶÷\¥ µ ZÂâ »×.í•íJFLÛ 4Ûˆ„_wg¤·®IO-šè(µLdOŒÄ”Þ&pt^Hy‡ÞUÆ{ Iç÷?“烟–Õqß)ÓΟ„j\TÔªãDH"$I4y5=§|«÷\ï2ÿç/}•‰‡»;ü?ý€a=’Üyzåü̧ÏP®¶ÇdQ>ýáÿ‰/ðú+'HéxãÉ3oúuÏôOΙƑˢüÿð!ƒve ‹1”jwð Ê»A¹¦òò5MûÆÃ¶ÑþPéfË“Žkãó.ES¤ËF¤^«¢¡„¿q’xz¤L)|ÕjZm=лͶƒA2½åËWÆÊ½¾!‹  '×=<;Îl:åZáëÇÂÎᥭ°ÎÐ%§¨Sqjëû\l4õ‚D{‹ŠóƒÁEájµâ|OŽ`Ûw43M·PÄ •³¹=�êU ž;gpgÈÆº„r­Ù`;¡ÛX f3¬Ô’ï:ž)µtE$µ_„z÷uó±7¬+âaäÉqÅN ͹ÓÛ2QÜ(’çÖ&ÛËÞ7íµ”Èëq%WŠ&,Xp{±é n!dþX‡«™×þØÌúôæäèJèSÇ´Éd1Ø9¸Rìzc»R®‡½v׈ա²;¿‰wP㤾ÔL¢ÄÂ{+A(ÇŠÓ=[1<ÎøµÓÙ¢8vðLï$õ½ýkâÐLl'e:JÐ+¤°ŽHÊœÉt³¤žÈ·€„} žãjë¾ñ�CKŒXms4§‹üãæ¢ÖªxÄÛ¢voÎX~7LÄàgÁé$ÊQ¶‹‚™‹5\€& ‚™q©ð…SxÜÇÏá®Åû(¢û" A7\>>{‰›—Z�¢ŠxXz¶½ðd¤Ý´�ƒýÉ»q=T`1¯Ö¯_ ¢;5ršÂzsRÂÚ±›26ÌŒRʼHs?p5ײUÙÇþ3À2±`,U…Îeâ`{á]°/·i ¬øtIîX°à¶c!Ò ÜF´ŒçÊè¼%n´müF¨]�¦ >Pº 1ÚC·ò•1æÂvHìzaL•eVÅ9†Î|²õ£TŒ72TÅO¨1bÍ`¸â ž ºx’ëk(5a~®úfo&òù;SkAŠC¿1º epòI¢ôZ·üëû¯2£û\Îý6x#ÉÝ� 4ä‹ÉaÞ6á¥É¹Dª„eVM á¥e~ž=u¾YqÝ®‘ßxÞB¨ ¥?‰œ‹#çjEÛÄ�Bp åI%cs¯n`°ÙÚN¤�8ˆVwÄáqkx­MÀ5±Kp¾‚ËA0•ùÜ´A×ös7ÏŸ× èê‘ö8¸¸ˆ×6 BkêÑŠ¢N±‚NÓ\íÝÜÎ^çöøC2ý¼Y£�Ë·_×8çÎä¡xç’™˜pñšøQXí~¡ ±¸jÖ –³`Á‚Û�…H/Xp aR0±hÖ«u„99ÖU×h•Kã;²g¡±E]ë°×a÷pƒQ5¶«­¶Òa¸$zÌq1à˜l_.�¼4‚þ€xMK›ÂRþ�º….ûèµ=nÒfoÒ»72 xä ·†F ¤(i•ÓÚC>’:�æÍeDî°IËŠži< ‰˜¾YÐ�(?q�í"âigQl2r-½qÝw÷º3P_·Y[�h 3K¡Ö¾œ¡y¶�°e‚¥ ´�1¥Jð¥Qt°žcQ!ÅØ d�¡éé"ó’ʼnÅ�É> N‘°�\­”ëžHã i²õsg>cÏ#lTC½ÏŸR_´)Õaƒv®ÕÉ/ô¤ïz�þ‹�IO® 8†Ö¢Ÿ°˜ˆî•é´JœœÜaº#á£Y/îšù¾´8o£8×ebc9† ï»H-¬©Ë¥yb/;3Kèó=ZH×ve|Á‚~°é n!\*¹C’@lJ™½e²FÒFûß›=C,ð.2ƒODèLÙ–ÂÎŒ©Ò; ÇÍ·ÑÊ(´ª¨A®*Ѫá½srD†2Óä�C=–ö<ÛSR³D­úUžm£Œãp欒mÁISøm;„ÒÕöDöV«Ï-íkRk¬ÅÔ÷Z¹]‡Ùb­Ã&w–3];Ÿ©Ñ¬Æ÷»ñºM™Ž„‰ Ò5_Zöö�FÛÐ\ûÚDð·õÎ̇Ä4ÔÇÇJH½jÎéä¼–;^ßü° ÒÜ6€PYÝë.‚0ª³éaÛÁ®‹Žù\sx¼ËöD´U¦\åçC"Mñy‘Ñ, %)|üUüÞ ÝWÓé1zUbÀUê¢#%åää„Õéð"�1œxøV‰]šº@.=s6mÙÖ$íÊZ”U-Þ±JŒ#‰Fæ¶Çû1.fµuHÜ+Ò¤ý ÜZ,DzÁ‚[ˆ"]$UÐi%‰†‹5�:’’]¤–uTnÓl•Öá³ÂJ�*ë"\dcª Æ»l¡S Ò�o[u‡ËåJ{áhkï`4�2”ÄM%¹&±´ÅV9xÖFœÛç7>¾‘ÆÁKÁ›µ£ªÍ�DG|KµÕ˜ÅÀ^6Ô JŽ¿x%×-FoRçìÅİRŽÏFV› 7ç¼�|äjŠñØÝ“c˜ýαàÐZù-5:ú&™nÿS‘ZAn¸GO’�£nÍÐ ôÚƒ$ÌÒ¼ð\°`ÁíÄB¤,¸…U,EÌÙäѰ† ;qNLè4±o} RW’sÝÁ¶wv Æ$x¯¬·Î±Ã*;bÕk]½Æè™rGEE;غ‘n¸´!’¤Ut?WªR-sxÚ�‚|3�ù@Aœ¼z:rø‚}¥”*‡Ú.äZ;îÞ~¶Ê¬Mb­Ÿ»ëL8[ÿµ¶‡jͳ.γ+a¸„´1¤š<¼žŸí/õcm…l®lŸI¹×ï)%äá2©+1ƒ-úùN Æ7û´Y—ù9˜É3DâDka4�m'L'=—=L»Ln­ŠçÝñ™X·Ssã>»á~÷ÅÊ Rm†å Ù‚™[¼l¶+•;f¥Ú=wƒ– ©ñyb %lÍñs»^Øž Åvœ=Ûp– Å�$yÐõZhÝ�Qj�·„í¤5R¶ÈC™ÿvpo  q¨žHªÜ]ßeÕÝ!ItŒŸZ2;,¸ÝXˆô‚·¢˜î›âZýó(NÚÇIö©\¢8…œ"Ò캃�Æ�ÖQ.t٢ݮÞø™C2kaáp¡H�d°* ƒñáó3žv§<ìVlº„‘˜³ÎfNbûŠCûÀs¼¬ièÒ¶ÜÍû›è²£)1Ýéð;9YDÎÕ·»÷PWÂZ @b³Dº(ØñX*ÉòÉñb”ÑxS å´ާx¤I¤> É­ä¥I>qt0—ȸnŠy=^«Ä;cLÒTàH­8@¬ïnÖ;ËÛ¾;;â%cm€J$B;‰­Á…gvÉ�nEÂéŸ÷¡×–Å·Ýb7>—wýÞÛkSÆs(ÊUèoÁÑ`yþ»[‰Ä–ä‘£ÜÍÑk2«ÄÚÆzÍyâübÃùÅ%ÛIQ‹ÁÏxq©‹™F�ëÔ€Ä.€ÔTÑôÿ·woA’\÷}ç¿çœÌªêžži nÀàˆ,‘"Þ$›IK¦aš–D1lK–%G¬Þ6ü°ÏÞpl86Ö~rÄ>0aGX{m‰zцdXaI”LaiÓx/" @‚ƒÛ`¦§»«*ÏùïÃ9™•]S}«¹u÷ü>R³nYY™YàŸÿüŸÿ¡"ôv`6áLT㨼gàkVÂ)£üÛ¢tÈi¬ŠÈ‰¥@Zä²à°à1KLbdêrVµ.¥1&œåÙßrf.g?·«<å³›&Ö&°–ëBr0I?ÝWr ÞðCƒA" "ƒ‰±–¶M`­™ra4àõÁ°LR¶“½ò˜ó;” R¬‰Ø•i´6�„äˆ>O횈� °r&7år ×eggÛo¶óóÛç»LxôÐDü$â£QE�[õ\æcµV§§ù¸¶%+½yfJF8gW»šò’ÁïZ)w9lße“áêàõªcemÆøê#¸×q�TL’1nÛ“†íäp¡¢Â“ˆ4äàÏyGµ( ÝîÚ¡¾¼Þ¶¥”¿¿&•RŽ2ØÐ,OÒÒÖA'£Š¥FºÐ±œèøÞI ÌJefG.ŸX¥i˜”«7ä)Ç]îìѶÐksήWsÝ–€´Ÿ£öw"'›i‘“¨ôAnJÀìTæË´Öm­nʰÄ\ï™pX2Nm+ÛFg5½©�øn.ˆn3¬Uñu"MpTæ© ͹#6Œ6kÖã/ ×ÙÓRbpÐ yi{BO©¶Û~ÏžäsàRM Ûh`:arGM<3€º?ñ6³Àv>Š.;Ôf¥Üf„ñ œBò„˜H!�w¼>rlŒ3cc-–ÌüŽ8­|²›mA7럕LyÉ·“¼´ý£ÛIç·mVv±`óÛ p—àÍÌØœD6§‰I4¢y¢7ò)G$Ï£h]YMÕ ü¯2¿}•ll^ˆ IDATV#ÁÒ´»d�¸¶Ü£ ²Ë€DR"M›ÒãºÍHç`z¼µÍë›lmmÑL›ˆ“K�¼÷LK'Rƒ÷•«ºn'–Ìl·Ê Qþnš1k †¸n°!8¹Lȃ…Üz/õ~k‡ +"Ç–i‘¨¾Ys *®ç©—ŸB7qŒ+Á¦ßjp›\Š3BʽžSp9ËîsÍq2lGx=ÁvÄÝ1`{½É3ÙEò„RskÆ”�?‹<;¡™Ã5�š†aj«hÉuaŠ£¦Š¾+·ž8xuäx3ÖÏ 9< ï!•ÞÛDÞåiýa.aÞ“„2Ø3zJË>ð–›6'›ö²è³ŠäòÑE)éME� —”c‰sl'ÇÖÄØŠF,uâæò JpyúïYqÀŒ‰år‘¶“…ßÑâ»WŠÓ¥«ûmϳØ�¦ShÊ„%%Ëœû_çRW2Ò)¦\;=�¤&ÊoËE#%GáòåK\¾¼Á$¦nPfSf!ç ½'Z¢ÁˆÍ„ÆE†¡b*0#0˰{**g¸�p4%8öXãñ¾Æy�óžPšìy‚ϵîÎçúèÜc<‚Ï�¼ˆœ\ ¤EN waƒ˜®PŸY!ÔïµÏƒŸEf€ÑX‚&rêr‚串âÙ¬s‡”$Â`#bã1Õ¦#� Øj.{‰ø¸ç>Å9y˜r U²ðuo¦Åîr}™Õ.ä)òº¶pÑÃ8À«5¬Ma”ò´êuªufäv;Ûûíë´³K–¼5ý$s»Ž~iJÿµŽO¥æ<01ckll7)Ð9äkÿ¿;Ž®ûߢԨSê vê•–t<Ø[[¢Ñ6,mð\W=ëÆa%�®šœ�Ží ĘØÞšpeã “étGF¹½Ðà0*Ÿ{D{3ÑÉÑŒÍ8aœθº+Åèmä+Gík†Õ(¯ËU@(û½³R¼ûßRçÞ¬)"'“i‘¨N5aÍ¥-X©ðÃ_y|[ãìJyCJ% œˆUžh¢Âá}ž:•šj3#…H•ÎXd„1²†Ô”™]ž³Ò½¢ô¢žd¾„¬­ÇNŒ¬áþ-XmàõQ`³ö4> ‰¸­1~s’ƒ.f™Ñý«ó`KïHáJÂO¦¤;j&ëàG9ºõÐ  t]KÀÙÉåNp—û$÷ê(Ú“ saV+�Œh1—³€¯=™ØM*Å%ž¶G÷lÙÔÖ`w34^}°S*'M¼ÆÜGšR®áJg×X ¢#.5øaÅðÜýðÈ_¡ö¶¾þ¾‰ §%ß)w>ÉW<!_py€¢#÷*ôX鳞ºûÔ~ÀÚè )Ât:ΓÂà–Ç´Ÿëº[G¿õ]{ˆ¬}¬„´È‰¦@Zä$êèTZ„•VtÁãJD™,bÁpÞãC“šàðÖp×kü•+cFÓm̹’­Цm�'Oß\2u9s[*k Ì— Ùµ5£mM‚ëš=´�H› s2�aØpH=5¶¦‰qrD—´Í§YtÑ4Ì]0]>#÷*.ÛÁWL§Ù˜¦)¶ê©Î8ü°¿]ì’Ú~Ç>¶¥®¡”Î#9m=Ü2V6£íˆÃãS`°�pM¢G6Ï86蘒¹á\YO2_¶ÛSê‚°vŸÛöwyæ¼¶ö<S*ÍëÊ Í]Ê`‰Ð â,óÓ,Ô~�X7áy·h[«} žÉÑpÓˆM#Ä”[á%°&—v8g¬_é0ëN4\9Q«¬mé—7¶1GmFÍsÓ<ݺo—3šÔ0M¹´¦ryºï`0pµ8Wá]Í ß0�Nˆi –§b mÖß'‚¹òónOÀÎ<µÙ‚N'"r’(�9�.nlâÝ6ë~„w©LÞ–RäúeGbê¬ š ë[¯1J—˜Ñ” ”fYh WFÙ9Ÿ»{äÕÖ^æ)Ó:3›Í¯—›sm!C»@[�1W¥áʲÞ;†u…óalë´¶ž"s17h .¥U²<�Ð{zƒãèê~>jç®Í$±²VVJ½pÛÙƒY0�Ê:i¬´hË�tÝ.–“ ×VÍÎŽ*ÂúŒ'ªÍ1Wî°½RºtXÉlwµÇ;ÞœŸ1HavÌv®�rª2{ì̲÷�q—ü6m!H®JgGî9•Ca;Âfc|÷¶d· u4Ü´ÁMRL„ñµ±þrç{ÁÖWˆ>·ÜkšÜÆbéâQÊ]¬tœiËMÚ:åVoø‡Ñ@dÙJ‘i‚ÆùnŠp�'8¨¼§ry€¥/5R+ƒ†Õ�&NO¶ˆqš3®÷i–ÿ™˜#¸<†@DN.Ò"'Ð$¯lm1­ŒÓÚ‘ÏC¡¼.Eð#œEV›MîØ|ƒS¼AÍsC&•'XÈ#|‰spLÈ™@kGç‘/w'gyŸ/›[[ÊJ†5–¾º)g£C© Žý+â¥$�I,­ÌRÎ@×fݦL,Ò$W²Ó³lxe9pà4PŸ[¸Yð“ŸÕ ·Ÿ…/SŸûœANɈÏæ¥HÕ£•Šªn5‚A•Œ”Á 4†o.’Û£ºõE.wHÁ°ÆX»ƒ+6ÖWÎVl�ò6Åd˜�]@š°n†I «Ã]V[‘ûM»œUÅÑ¥¡ÉÇ·]Ƭ­åΟ»5å:ø�' ½Ù!{5ç�Í´¡šlSÕŽõîâ¯üÌ;©8CŒ‘¦I0ÍÝZRs‹ÅÉ‹ÖÕcçßE9y+Ô¸4kÍW‚àÊjWc>AÚŠ‘-KÄäp¾¢ÆQùÙ¤3£ö9óíJë¼|JãÀW }`¥0�Œ™6b·aVè�+A}JT*ð9ÑH‹œ@¡Ô_NSÆ[ §­beX3rŽ•”ا'o°>}�•8)S^{,¤DðŽíÚ�%yšqB[#r5ƒ¹8æêrÝ?1%ƒÝ Pëfd™µ›Õ w•´/™s¹ÎµMõµõ©fT®ÍÊzp©âùúÏ(Fb(3"R¦?/›‘?«Í0·ŸÑ–pç�g¹|Á1™8bL G�áj—Ûµùi™£ŽyfBß”µõãÐ~åÚ›Yi…s¹•^ �Áĸã�Äh{Ê•³›§*ÆCv¼¿—¼?°ÞØ·�Ûш˜§(/Ùÿ¹è_%È#³ÍÅô;JIfµéíãYÅph¦8—ݻƃï~;§ßõVžé´!%OL‰iL¤‰M$5†M›¹Io£ÊófФˆw¾Ë{˃5·,q¹³íà©]o‚—O |ÉNW.ÏXØ–§´µñù£=P�V‰6d{ºMŠÚƒ!µg7¹T*·ïköúŠDä˜S -r™3*j\™ûõq¤"pg wp�‡®¼Î©´‘k›ý*G*=ݼƒ¦JTÎÓø<(‘às].–€ÚwAŒKçK¡EÉ\†˜‡ÒI"åÁõfï+Û[2�Îå’…r7ˆäsMu΢ç‰F¼uJøàsbŒ‘¯ðÎ1pU4Lñ¤®‡4x’³D*Yð<@²­©¥�š0ŸKU’Oà*bJlOÑŒ¡sø1TÃÇÔe…s(» &ì zÛA‚ó岩­+pau“ÄÊjw8.œÍÛ}†Zo�m¹(¼îo¸¶ßq¿ c&2ÌWú�7rÍuêÞa]'”ö‰�Ÿ6ßþ®_ZRòÈÔ§×+Vß÷ ÷ÿøÛpë£<@2Æ<è0Mž¢Ýb‰AcÄOcîÄQRòfVº°´YéYéM2ŸÛÚmØ´1LqÁ•žÒ¾ ¢qŽÚ…nŸj<5CªJéR{õ‚R»1; ¾b8\#Mcù&\*µîÖ@jr—šzqµºˆœ ¤EN ç}îm©äjnbL&FÓ‹TÓKXÕäÀÏçÎÎ ’˵Èå"¾÷ó%d3Ƚ�SD˜ò,†æJ—ŽrI¿ÌNè“#ù’µN³ ¥™ÛQö�²•×\o–8çv´KÉ(í�ó2~J]9V‡CVWr¿éí锦ə붫Îõ2ܳI[Ì·ŸG~Ü»Ìêš½EÌ;BòÔWŒÁvb4 „vÚ×ÖÃŽµýlzÛ{ÀZY�ÕK‘jÛñôXíéfaéTìø¾wYwW¾²ãå<è´,‘;‰;×e¼Ûnyœ޻ÚIeºw¶Ï3·þÒwºMÍ;¨¬¡rpÚë�<ÌjíÀ˜Æ”gxŒ ©‰¹|£!ÖM~.M§ÄÉÎiÀÛ½p,>‘ÈÿÀ…ñ®1ðBéfâɃmóï<Ï䙓§r¹{‡ó¾;nוŒô³ð®d¬}UãͰfÒ;V³ÉåÙEäÄR -r‚9Ÿk_Gf¬Æ|K¼ƒmŒÆ6ÆHåc<“Ç|Ä…T¹¾ÙG0O %x°Dr×¶Á’%RŠx›Õc«ò,†¡)=§KÐ9û´-Ýz´Ñ™÷ž”òD$Éåuxï©†Ž••ƒaEU'’ŸâÇ5[[F·+Î7yP¡+Ý<ܬ|ÄÏbÀ6x·òÀ9H>QGÏ[Æú&¬MŒ0êÃYìpÉ3v >ŽÁ<¡PyŸûA—™5óÉB>°¹$dvÖöˆnåÆŒ³“3gyªøv:yß+á0ŒhшiñÉ�ˆœ ¤EN 猑%æ™1L‰@b@$8˜º¢’5 šm°ˆcŠK‹W•�~Ñ‘B è-ÏÔæ“Q¹DdJf�"8Ã[ öå~Êíß*ŸBK¸†\;ÚÊmý´ƒÆç4Ÿ ¹Îšh¤2kbžÐ.âëÄÊê€á ¢®r�¹„÷0Á'| ›Û‘˜òP¯&äiÑsæ6•>Æó] Šƒäb.=q¹tåôfä®Mãôv¤ŠŽš²ÙeFÁÙow§ ÒÛšëE_ÌW;·ÝC¬ äó¤6•Ac š|öá½uõèmç’®lÃ]�ù´’¶6(ôŽ@¯ö×Y—èæCï7 ¶YÍwÞÅvëí›u�g®CÏA¦‘â9ãëæ¸—…¸MžiÑQÚì±#Zë.©›/Óh;ÃÇÊhÄpuîž1 ^Ú’�D¨Œ•à©‚c{W& \ž±±-Zq¥0À{š©Ä’�®œçôÄqçœÞ†ac]‰ƒó½8x× ¹XêǯZ.W¥ý1©´ìëJ+Èûý¬ÉŸ3ƒH×·ÛºÙSfŸ»hRšî�–,qð¥g2ýr�ü99œŒô#Ôþ¦·ÛÖ•ËÐ~fûJ ¨-ÿ>Ö|ź °^ 8+ç,%[í<£aUýÁåK4ã†8�ÄICŒcl«!m7¸væ˜vc®Ú²Þ±T×Þƒ¹÷¶%¦Ó W¢c¥ö¬ø�Ë:|À›£2Gå vUÙÞXwÛlmv¾½fR²âíGöÚýåàÛçÂe.#ˆÈ±¡@ZäZ3Ç)søÒÎÚ²…d¥…[™�Ú9̯�;/7XÚÊÁ”‘Û¹ß�jK>8ð s07ØÖ6�LïXe¼:(µ±eö7#Üëu(Æ<�w¥dÄáš”[êívvA^ÀE‚÷¬®ŽƒŠvfFb¾”n¥u,có<3‘:8 1pÇ%Ó®†;ðT\•K'æ¹sîÙ„SÓ\÷�J�×kÇÌÕ%Ï*QöåK.;‘·y\ц¹†7?Ì™½ˆ X*û¸[Æ{n½sTνÁsý Ó[™Ñ�Òº­—Y­˜Õ…´S˜w[U’Âfm&ÝQ[dœq�•u0¦!áÒì}nn»�‹ žº>Åh4àÕ¾Áxs7¤é˜´Õ7›ÏÁM̵×ýåhãœâ5çˆÎçId„à¸Ó ¤ÈëiJC¯”¢-QpÆÙ1ܽkS¨J¦1XpK¹GÕ+ß w׺méíBÿ„ —u£ ÐøHG—³�¡;ÛÈfq{/pëó–òœ‡!ø2€s–õm·Å{GåòŸÎRwÑ?„¾ûm쬙??è÷ؾ^2Ü•9N»š5�”gfô u2âžÿ©I¥ÄVV†<ôWàÍ•^zá<Û¦[Òv,iûvŠ˜v»\ïž›mcù-ÕÎ3 `ÁÓ@îMm¹lfÇüpsÂÙ§G§¨}î�îÍåã„¶½L9ñÄbw’˜çƒdö©íWm³‡eBQ9ÁH‹œ@Ý€)šÒÞ,²Á°Ü“·í}k% oƒÜ3š‹1ÑðÁS5‡‘š-M"¤”%©RÂ]ÜÀ�§°¾ÂdmÀ¤â]�ÃçÀ•E¬† õ`Èp”³yf†/íö¬­Gõ®kµ—¼#º€saG°gÞò‰Û¬á%ÏEs¼Nd ïw¤†õM8;…:•€¬½DrFÚ9¨R Š\U²ü¹ÖºÍƒö‡”•žyÛ];{"LlrÝç]É2“ƒ¼€£)ÅÌ],níŒ�m­®ï>ØyHUȵÎä>-Þà ¤ÒÚn€Îîåc”|ÄÔ´Aß,òkÇ7¶A�YüH)ÿ1#k©ô`.åÖy¶È�ý¥óÉ•ÃÝ¾ïØž„…Äú}§�=ÇËßû/=ó"“Í1\®á/µ5·î�mùOyЕV ª§Ò So ÊÉZƒ1õ‘hùw¹1½Â¶MX®r¶ZÅòÄE4�Æt—Lº®3ÝŽtÏ;èkÎÊqòw¿ÛTé"r2(�9�ºÚY¢¬+ð$†Ǩ T‚KåcìÎgÝ>÷·§—àï¿c8òWìG¸ãÌ:ÏÇïqáå+L/OqæÊIU¯èÅ9µÁ«ñ œïú…[2‚³Ü#=%–¯ ¹¸}‰j¹¿©qVË}Pý醺 µj¤EN4Ò"'PH¹¾µßRnv<á,v­ÎÜŽÄïì \&¾p½ 0’o×7û×GbóTݱ‚©¥<ÁFÝ–.´¥”‰QòVY¹LÞǕʳ=¨U5uŬ¤d.HêZåÍ=ßÍZÈ,ì!wm(ú†ó‘°â¹w¨&‰AÊ}°½ómŒYË7Ÿ;u4Þ8^ADp:ù\w<+µ'2ã—‡°5ÈÁ5%›ÜÏWm=¹QLævri¿ø+÷œË«1—ã•2J÷ïrÍuÿT¤ß¯Í ¶·¡›�2 sq¤w®k÷6ŠŽà¡NmÖ¿tVñó!ôNóuÝýOœoÕçh¸ãþ³<ò¡G‰›Æ•ç^eó�+ؤ;X|hÊJkY…/ÇÔ|"bDŒÊ{’3Æ!148CͽԜš6àÇeŠú¶3Êì·¶_?ð|.–û§_ÝÃ[DNÒ"'Q{ùÛÙŽ€9X™¬¤ »:iSØidõªOÍϦzÎYm0WaTD牃Šé ¦Y]Å|xÚýÚl©dH“y¢ƒ+µqqWêœMµ©Ç'Ã[žÚrnï:~¹œžoÛÎV²ŽxO,™VRè˜|ôF]‘Fž8 TSÇdÜÐø<ís…£vV*_-ãÉs¹6^&^x®Ô�¯{ãÕL�û£gÔ?‚Î1®Œ­ÚØäšh+CÛÂÙµå7eûçJÌòL“³ÞÜ»dýÀΑ+&Ó†!Vž*”)³]׳dîw’£Î`y ª›{ÙQú$[™�œè¯]®Ÿm±´w¤T²Ü½þÜÖýbÚ«W¤ýŒ´ïòò³.U€Ó÷�fT9†¯Œ¸|aƒÉ›ãr…ċީš.IDAT]•�n� \ž¬'‘ˆxBtê½á’q‡yÖ«w×+¬¹•óy¦M?ûåwÿÛ^¡¡=žtÿÈ´-òDäö¢@ZäÊÿ�oÒåqz¾Í,Ó^²N%°ê4iÇålo”.®ü;è H¥^Öyb¨hªŠfPcU °hy†8©ô)Nx¬L1¾Y^[�Ë£Hãó¯Êò¹ËCÜ9à ÏýI?¬é¹sΈ¶‘irF ‰84âJE•)ÀË zXÎ6—™©™zX5¨S.Ç8?J¼1‚�º=Zç<�‡×�çJH¼9M<Ð8ΖúŽ+xs®”Zè:Ñ�Ф’&Ïñ¾ëê�»®n½‘jÑw!ÛÂS˜ÏŽöBds4ÑHfÄh „ªÍŽö×ÖÕRþnçÇ˵Ò!åÁwmý½/¿_šf§@çs�ÞojGt™öÌÐöÅy†BòÕ�†[õœºï ƒÕ[¯nñæ«ob› Þ÷­æ5 ¨¨CEšñΈæð–¨Í³jî£bXp!ÿ“‘Ê?'Äö{q]ÉOûìø§&ÿ&ÛãÖ¿ #"'Ÿi‘(Xé�» úÊm¼b™lb®ŽõªçfSI»2èʵu¼¾ê®\;<†Ïó¬4ä‚ÝœÏ3"F,g.‹WWáåU‡¤ Ržª9×Ú¶“¬ÌO³ Î|ï{3Û~̱ ¤óF’¼}ÄF�fœwDK¸¦téŸü¯ÁÇ„†©3ÒÐñêÈxuf�5z%GH0öŽ—jx³ŠÜíŒSÕ€ÍAn]ׯ’]™‰kK`\÷Ð ð*ï9ãkÖ¨óšÔö#_´M½Œº•²·ÿ¾YÙ‡„[8XVDNŽuj¿õ.z½ÿß–öÖ/xÜ_Æ÷Þ×>nÿÚ™p«r¿½]ŸL&_<ľˆˆˆˆÈ>ƒÁ�7)s½Û2@÷Ý]_êþÚÇôÓ{nþñnoû]ºî׈ÔâRDDDDd ¤EDDDD– @ZDDDDd ¤EDDDD– @ZDDDDd ¤EDDDD– @ZDDDDd ¤EDDDD– @ZDDDDd ¤EDDDD– @ZDDDDd ¤EDDDD– @ZDDDDd ¤EDDDD– @ZDDDDd ¤EDDDD– @ZDDDDd Õ­Þ9¼o|‹ßyü2O|ìVoŒœxxï‰O¼³ámw¦[½9""'ÊÊÊ ëëë ƒ[½)²e¤�™o|‹ÿõ÷.óeÑr“ðäyÏ?û/ž}]ÿʹž¶¶¶xùå—™L&·zSd ú¯â1ó;�_V-·„ÿï·tKDäFxóÍ7oõ&ÈH3O|ÿVo�Üξr^ÿʹ¶¶¶nõ&Èô_E‘%(�>fÞÿЭÞ¹�½÷ 6¹VVVnõ&ÈH3ÿËÏœÆÝê��Û’>ñÎæVo†ˆÈ‰´¾¾~«7A– @ú˜y÷C+üö¯�æ¡€Zn ¼ï�Äÿù µ¿¹ÎVVV¸ï¾ûÔþQ±Ø~ë]ôºë=ßÞú�ûËøÞûÚÇí_(·U¹ßÞ®O&“/b_DDDDdƒÁàƒÀ›@šÞm*÷SïÏzícz�é=7ÿØXÜx¿Æf×½ñ™2Ò"""""KP -""""²Ò"""""KP -""""²Ò"""""KP -""""²Ò"""""KP -""""²Ò"""""K¨nõˆÈµyå•WxüñǹpáwÞy'üàyà�®ù=Gi½ûùÞ÷¾Çã�?Îc�=Æ»ßýîkÚ¾ÖýÑñÚk¯ñë¿þë»®ë÷~ï÷øä'?Ù­ã�þè�xúé§ðÞ³¶¶ÆÛßþvþÆßø„½_fƾð¾ûÝï²²²ÂÇ>ö1îºë.&“ ßøÆ7xæ™g¸xñ"u]sîÜ9~ú§šápxÕº»üÍÚÿ§Ÿ~šW_}•~ðƒ;žŸN§üîïþ.çÎ�ãÃþðÂ÷þéŸþ)ßúÖ·¾öÿá?äî»ï¾©ûô‡ø‡<øàƒ¼ï}ï[¸~€W_}•/ùËüí¿ý·w]FDŽÒ"ÇØÅ‹ùƒ?ø~ò'’¿õ·þO?ý4ø‡Èßû{�{î¹gé÷¥õîåÂ… üÅ_ü—.]âòåË×ýX½öÚk<÷Üsœ;wîª×žx≅ïy÷»ßÍOÿôOcä‡?ü!ò'BJi×`p/ßúÖ·xñÅùõ_ÿuœsŒF£îµ¦i¸rå þð‡9sæ ?üáùò—¿ÌŸþéŸò±�}ìªuvù›±ÿfÆÿïÿ�Ÿù™Ÿ¹êµö{ÝËG>ò>ô¡íxîÛßþ6ßøÆ7® ¢oô>™?øÁøëý¯ï¹ÍgÏžå?øßÿþ÷y衇ö\VDŽ>•vˆc_ýêW9wîïyÏ{8sæ ïÿûyë[ßÊ×¾öµn™Ï}îs<ù䓇zÏ­\ïa|ûÛßæío;¿ù›¿¹oP²Ìg‡Ã…ÁÕÅ‹9þ<ƒÁàª×¼÷ÔuÍh4âá‡æÑG套^:üΕϹ÷Þ{9uê«««x?ûWöêê*ùÈGxË[ÞÂÚÚo{ÛÛøÙŸýY^xá……ë:ìòpã÷ÿ…^ ¥Ä�üÈ�ìxþùçŸçüùó¼ãïØuÛªªb0ìøûîw¿»çU‰µO¯¼ò f¶ï a�w¿ûÝ|ãߨs99H‹cÏ<ó �<òÈŽçyä¾÷½ï9KvéÒ%666üž[¹ÞÃú›óoòè£�¨lb™Ï~ç;ßÙX}O>ù$�>ú(UµÿE½���®cž™ñÄOðþÃà_ÿëÍg>ó™. ûùÏž¯|å+|ç;ßáSŸú¿û»¿»ïgmnnrúôé}—;èò7zÿÿçÿüŸüè�þèŽç¶··ù“?ù>üáºæ•W^áÕW_åÇüÇw]æFíÓùóçyà�º“�^x�OúÓüöoÿ6ÿþßÿ{¾øÅ/vËþè�þ(Ï=÷“Éä0»'"G�J;DŽ©¦iØÚÚb}}}ÇógÏže<3™L üÚ¯ýÚ¡Þ㽿¥ë½z¬æÕuÍc�=ÆO<ÑÕÌnllðì³Ïò�ÿñ?æë_ÿúUïyá…xþùçI)ñì³Ïòì³ÏòþÁ?X¸]_úÒ—xþùçù;çïPU�?þ8ðÀoüÆoðs?÷s ¶¶¶øùŸÿù]÷Í̘L&¼üòË|ùË_æç~îçö<‡YþFïÿo¼Áƒ>¸ã¹ÏþóÜÿý<üðÃ<÷Üs{î˼§žzŠGydaÍ÷�Þ§—^z©[ßx<泟ý,þð‡yä‘GØØØ išnÙõõu¼÷\¸páªý‘ãE�´È1µ¹¹ pUØÖÑnoo_õÚAÞÓ: ë½^–9V­G}”¯|å+\¸p�{ï½—¯~õ«¼ãïØ5X{ã�7øÌg>Ó=vÎñÍo~óªZÞ#_ùÊWøä'?Ùe7á~�÷ïþÏ=÷oûÛ´oÿãü¾ô¥/ùÄ Ý×ëµü�Ú€7ß|sÇÉÍ_þå_òüóÏó¿ñ{nÓ"“É„ï~÷»|âŸØwÙ±OçÏŸçýï?�ó”o}ë[‡ ×{æÌ.^¼¨@Zä˜S -rLõƒÀS§NuÏ�Çc ×Ä.óž”Ò‘Yïõ²Ì±j Þõ®wñä“Oò³?û³|ç;ßÙµëÀc�=Ö B›L&|ûÛßæ _ø<ðÀŽZà7ß|“”÷Þ{o÷\]×Üwß}¼ñÆÞ·Ÿú©Ÿâ'ò'¹té_ûÚ×øÏÿù?ó«¿ú«»ÖêvùµÿíU‚µµ5._¾Ìý¯ÿ•|à]¹‰™ø8|ç;ßa}}�ûî»oße¯÷>½öÚkÄ»cxç�wòàƒòÿãäܹs¼ó�J†ÿôéÓÝïODŽ/ÕH‹Síઋ/îxþÒ¥KŒF£…µžyÏQYoŒ‘O}êS;þ~ðƒì`XfŸúÞóž÷ðüóÏóçþç¼ímoÛŒï÷¹�=öoyË[xñÅw¼cÄ̺ŒVáеÁÎ9Ö××ùÈG>ÂÝwß½çÂe–¿ûßjƒÉ/}éKŒÇcþÛûoÝ÷ýÔSOñµ¯}�O}êS|ó›ßÜó³¾ùÍoî9ÈðFîÓ|}´sŽO|âüÝ¿ûw !ð¹Ï}ŽÏ~ö³;Ö³µµµTKD9Z”‘9ÆÎ�;ÇÓO?ÍÛÞö¶î¹gžyfGYÀ§?ýiÞò–·tµƒ¼çV®·BàŸü“r¸²‡Ã|ö¼••ÞñŽwðõ¯�ßüÍß<ôg¯¬¬\uy¿-ix饗ºl¥™qáÂ~â'~âÐŸÑ !ìY#¼Ìò7bÿ«ª"„ÀåË—¹çž{øèG?ÊG?úÑËüÙŸý!„}[ž?žK—.]5˜t¿mº^ûÔ¯�î{ðÁyðÁyï{ßËúOÿ‰���.¿±±q¨ïIDŽ&e¤Eޱ÷¾÷½<÷Üs<ùä“lllðÍo~“gžy†Ç{¬[fmm�•••C½çV®÷z™oÏw­ŸýS?õS|ò“ŸäŽ;îØs93#ÆHŒ‘íímžyæ^|ñÅ«öÁ`À;ßùNþìÏþŒþð‡lnnò…/|�••~øá}·çÅ_äñÇçüùó\¾|™_|‘?ÿó?çÒ¥K] Eÿdù›¹ÿwÝu×¾ý¿çͯ�þØ�ýØ¡kì¯×>�?~G­óöö6ßþö·»A†çÏŸ§®ë¦iØÜÜܵ׵ˆÊH‹c÷Üs¿ôK¿Ä¿øEžxâ î¾ûn>ñ‰Opç�wvË|üã?ô{nåz¯‡¶=_›ý»Ÿ=�4ã׿þõ®óÃh4âî»ïæãÿøÂpùÈGxüñÇùÜç>GJ‰‡zˆ_þå_>Ðö¬­­cäóŸÿ<—/_f8rÿý÷ó+¿ò+œ:uêªc°ßò·bÿ|ðA^zé%}ôÑíó¢ïukk‹gŸ}–¿ÿ÷ÿþ�ÖÑw=öéâÅ‹L§Ó5æãñ˜gžy†/~ñ‹ŒÇcΞ=ËÇ>ö±®”ãå—_f4íÚPDŽw‹Ö»èu×{¾½õ ÷—ñ½÷µ�Û¿Pn«r¿½]ŸL&³†ž""rK¼öÚküþïÿ>¿õ[¿ul˾õ­oñì³Ïò‹¿ø‹~Ïÿñ3—šíRä( Þ"ÐônS¹ŸzÖûkÓ{Lï¹ùÇֻ߷ßåƒ�`> •vˆˆÈ-q×]wñðÃóÕ¯~õVoÊÒVVVœQ‡<ÀõÙgŸå=ïyÏ Ü*¹YTÚ!""·Ì‡>ô!^ýõ[½K;H}y_UU|ô£=Ô ”"rt)�‘[æÌ™3œ9sæVoÆM³ººzàÉvDäèSi‡ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈH‹ˆˆˆˆ,A�´ˆˆˆˆÈnT m7h½"""""‡uCbÓãž‘VÀ."""r|ëXîVÒÇú ‰ˆˆˆÈ‘rKbËã–‘>ÈAR�."""rôœ¸8î¨ÒÇê`ŠˆˆˆÈuu¤cÁ£H‹ˆˆˆˆI ¤EDDDD– @ZDDDDd G-�¾)u0ι 7ãsDDDDn71¶:R5ÓG-�>ˆùh î÷oçïÇétúÝ·y""""·—[EÇ^,¸�¿¿èñ‘wTéÝú¢/g·¿Ô»mÿ¦.\xâFn¼ˆˆˆÈí¤ÄVÓò°{õc²½þXpÑí‘r+éƒ�e\ÿ‹è¯#ÍïüÎïüK¬SDDDD(±UÃ,q9‡-Ï]Ïå®;w‹×íÜŸ¿…ð÷ŸŸÿó { ôþªÞíÚo¼ñ¿Ÿ:uê·K""""ÒwåʕϜ={öÿ6ÈÁtìݶý õ|õÀnÙé4û”C•ˆ,rC‚í£TÚ±ßîõú~—æÿÆÿê_ý«ÿgùM€S�9xÉÆ~êk‰ oª™‘>Èúç_ß-+íwîܧ�+ì œfõÒ)뀫ëö9<dé[]Úq-Eä‹â^—Œ�_f¶Î�;÷ûO=õÔ??ÌF‹ˆˆˆÜΞzê©~îܹß'g¢û±UÛö�Íè=?ïÈ4„œ•½‘®ç€Ã½²Ëk-O>ÐóYl€æßü›ó|Jé�?ð� ƒÁ_;À6‹ˆˆˆÜv®\¹ò™ù/ÿå?ûGÿè=l²8ˆž¿m-ª™žw¤ÛÝͻեóËìT´¼£ÿZ{¸ºÌ£_?í�þÓúOú­ßú­Þwß}ï«ëú¯÷`DDDDN¢W¦Óéw_~ùå'ÿí¿ý·_üÿâ_|Ÿ<°pÊ,xn¯øÏ—s´·ó5Ñ×RÖ±×ýÝÛéƒ|ÆAë¤ç3Í‹²Ïó4\]+=;¿êýͯëf/‘[i>Àmƒä~íó|ýó|ðÜm~]»uV›Ž=nç·u¿}¹!ª¹òëÌÈ�lÿ–¹çúË&f%‰ýƒà~ñ{Ãî�ºˆˆˆÈI¶[ »hÖèÝ‚çEè½>cþ¹cá(ÒóA𵼿@·�[í‘#Ñíë��?Ç,ðîg¸A�´ˆˆˆœ|ý€vѤ){ÕE/êÐÑš¨¯5`¾å÷Q¤ç-Ê<·l?Ë<ÔÎÔ­výþ„~î¶ÿú|+½ˆJ;DDDäö±¨Ny>¨žÏJÏg¢÷êÔ±W—ŽƒÎfx$Å@ú0ææþsmÝßó¥í²6·Ü|Fz¾ŒDDDDä$[4(p¯�EAvÿý°8˜Þ«{DZp³ÃëÙ½öïàÑn¾ë‡gç ÂùZèÝfM<̾ˆˆˆˆG»•b,ÊJïXÃΤån]9vëÔÁ‚×öº�}¹!ŽjFz™ºéE¥ ýLr?3mì,éÙý÷Ìg¤ÛçEDDDN¢E�ô|©Æ|Æy>Xž¿ò?¿îeÜ#™¹>Jéùå–ÉJïÕoQ?êE½¨ç—›¿?¿""""'Á|°šÜŸ¬õ„ž_n¯šé•�>ÌrK»Yée2̇]÷^õÒ}iîõ~Vº]Þ3ëì±ÛzúŸ#"""r\íç¤=ï7¨p·A†‹‚èá¦d°�ji\]¢±[�Eï™pÈ‚ÇóÁ}¿=^š{Ïüi/ ®EDDä¨:L€¹[ Ü¿¿(0Þ-¨Þíó“�>RŽZ }�Ìõ¢`z· {þ}ó�÷üúæ3Ó‹&{¹, j Ü­Lc·×-;ÿú~Ût$„›üy‡íÞ1ÿx·‰Q=?ÿÜ|P¼Ûº�})�‘ÛÍnƒ ÷@¸W½W`Ýw­Ùè›lßìq™A‡ýÇ» FÜ­=Ý¢‰»½¶Û}‡i¹ýìV’qÐÌò~YçÝžß-Ð>2ƒ [G1#½h¹ý‚Ýù¬ñ¢çç_ßí=ónFA¼ˆˆˆÈQ±Û@ÁùeZóYèþýeƒècáVdZoT0 ûg¦w{óA‚leªEDDä¸[¦Äâ Ùêk ¢�|6Žv ½hÙÃÓ{½¶_=õ^ÛqX ¸EDDäf»Ö r·`vÙz¯×®G}Øe¯Ù­ ð®wVzÑkËÚ‹Þ»h‘“n¯,ônËì(4X>Ùh8ú�ô¢e— ¦ûú^ˉˆˆˆœt‹gÈr""""ÇÙA'G9L™Æ²ËÄmHÃõ ¦û¯]�Àøzn—ˆˆˆÈQp=ƒÕÃÞ‡ Î÷sËgA6""""7Óµ”{̯ãf¿÷†9êÁâµnßõØ¿£~ŒDDDDn”ëÀ^ë:Žd Ç#H<ªÁðq8v""""q#‚Õ£„ßPÇ)¼^ÛzœöYDDDä8¹^�ï‘ [Ç-¨T§ ‘£çzw9Žc0©2 ‘[猪ƒÜ4Ç9€¼‘Û~œ�‹ˆˆˆÈ�p#ƒÜc@·NBÀx3÷á$/‘½ÜÌ öXЭ“Åý8ŠÛ$"""·§£°Åm:”“ì�´ý9iŽ}Ý:É�çIÞ7‘ãäÄÏ}·C°y;죈ˆˆÈQt"èÖídÞnû+"""r³�èà¹ïv,o÷ý¹V·Mà)tEXtCreation TimeDo 09 Nov 2023 01:08:51 CET¡SŽe IDATxœìÝixSåÚöñ3m:ÒB‹Œ-¤L**"`ePÝ¢¢ðð 2 *ƒ3 ²õÑíAerDÔE™AÝ€X-ƒ (Plii“&ì´MÚduHhÿ¿ãÈ‘¬éΕèÙ»×Z‘xÅäï*!Î)TvP™ú¼ÃyU ¡»Ä‚8Å#`ŸWÕƒcUÿü¥UeƒuU ’UíóT´*¬«B°¬ Ÿ UêP]™Cfeþl’J¨+[جlŸ ²©4¡º²Ï@ü�X¨š1¼bM>© a¯"?Ce8_ũȀ{A‡é 9–gí¦ràBbWù†Þ 2P_ˆa±ÅíëmM~(A±¼BtáÛÖy ÐFZDŠ(çÀ¡¬Z(Jš©.¼\ø6z•&LBà+�]x¿â^{ÓîámKÀ…Ê›Ùã’f�‹{íMÿõ¦!úRƒ§/F1³�»]\Ðv·Ì²€ª¦¤™dOA¹¸Àl+f›§÷-N•Òå¢} ÐÞÎhTÞÎ(û¨+M˜öw@ôå+¼Kj¹(.D{ ÆÞÎd3# ªšâ¯»mîµÑ0íK‹G• Ò¥��6¢Ý…i×c=…鲺 ÐøzŸg››×îsiÃtÀÏJû+–eˆv”ݵr~*ôìÍx…_T&ž±ãÙS¨.¨ÝSÒx\˜ô ]R_´§Ð[\°vŒ[x?O}ÔAÅÔPYÙTtÖØS@¶«ø0íîOëÜÕá� ÒæŠ~C•>¼˜KÚî)@^¤¢a ªqd GPöÔ¶áÈR®�Ú•Ýe»\^›ÜÉÌÌÜízá¡U/:,nVº¤‹ ÏJÌÝ;©Gº0w¼ðO.%­sw?éàÈÈÈË˰N€*í|¶r��v×àú\Ò:•°. B�.ÍÉñt² ­w�‹ M&SõR¼'\œÏV…/6tp½ð°È¡¥yÛR[&ñ+¼¹RÓÓ}§Ü~»!_û *»¼¼<åääÈb±ÈjµÊnÏïr0™L2›Í QXX˜‚ƒƒKý^糕§o•ÎsìVø°óÏv—eO_P_ îPÞAÚ—ŸJÚ·¸ðëî–x…Çuwû€J%//OYYYÊÉÉq»Ýn·Ëb±Èb±(++KaaaŠŒŒ,‹@]ø¢Â’f =…ã ¹¿[‡ëÞër á�:#m´WÆÓ=ÝÝ2 R9wîœ233}:&''G999ŠŠŠRxxxiÞÞSæ*œÉ¼�uv]�³ÒòìlI³ÏŽgמiOý9´¬¬,ŸC´«ÌÌLeee•¦w™«¸‹ U̺ ‚¿ƒtI}Ю·´s,{ši.Ü—ã®O§¸÷¸ �;w®´!XR~?wîœÑÃË"£¹Ë~®ÏžÞÓ/ü¤+¥S§NiÀ€6l˜¿Kª”ÔÔT¥¦¦ú» ¨Pyyy¥š‰.,33Syyy%ïˆr ÒFBðæ¸²¼ˆ±L�:uJ#FŒÐ¯¿þªÜÜÜŠ|k Ò4h�Ú´i£/¿ü²È¶aÆ©M›6Ú³g�zõê¥^½zyœ•ùî»ïÔ¦MÍ™3§ÜjíׯŸÚ´i£6mÚ¨mÛ¶ºí¶Û4räH}óÍ7åöž¾êر£ºwï^®ïQç@¾²˜‰.§1Ë:¯•g¶4¤²ÏHWhˆ>}ú´FŽ©””5jÔH3f̨ȷ*­›o¾Y’´~ýúëOŸ>­_~ùE‰‰‰jÑ¢…•˜˜XÚ‹eÊD×®]ÕµkWÕ¬YS?þø£žyæ�3Æße¨d·¸+k999e5+]©[j+K�öûÒéÓ§5bÄýñÇjÔ¨‘fÏž­‹.ºÈße•ÂM7Ý$IÚ²e‹¬V«sý† d³ÙtóÍ7+((H .ÔÂ… äÿÿ´=óÌ3ú÷¿ÿ­E‹iÞ¼yªU«–Ö®]ëvVŒ*)Dß|óÍzì±ÇtæÌ线ÿþ[£G�vNR»”üžÝÊ‚?oçí ¸iüÂÑ@ùŠ‹‹Óe—]¦={öè§Ÿ~R»ví$IëÖ­“ôßëŽ;*44Tß~û­¤ü_MNŸ>]ßÿ½"##U£F�"cgggëÍ7ßÔ÷߯ŒŒ ]}õÕ3fŒâââ$I6›MóçÏ××_­cÇŽ©Q£FzðÁÕ¡C¯ë¿ì²ËôÈ#�èÙgŸÕÒ¥Kuûí·{5ö Aƒ´{÷n½ýöÛºúê«•““£îÝ»+77WŸ~ú©âââô÷ß릛nÒÕW_­9sæ¨cÇŽêÖ­›"""´fÍåææªW¯^zðÁ=ÖWR§OŸÖÛo¿­Í›7ëøñãªY³¦n¾ùf�1B¡¡¡ev®;vì¨o¼QqqqZ¶l™âââ4wî\¯Ï3PY,–b·7jÔH»víÒ˜1c4uêTIÒ“O>©””%$$”jl”&ËysË;¿ÝÏÿÓ68B4P1ayÆ ’¤ÜÜ\mÙ²E�7Ö%—\âö˜ñãÇkÙ²eªU«–µ{÷î"û<ýôÓZ¼x±š5k¦Ž;jÓ¦M3fŒl¶üï˜�c *rý-�;'NT||¼öï߯1cÆhìØ±JIIQ½zõ4qâÄR�� 3H÷•àÅ­+�<òˆþøã%&&jΜ9„h œÒ[·nÕ¹sç<þjòÏ?ÿÔ÷߯zõêiáÂ…š6mšúöí[`ŸäädmܸQmÛ¶ÕÔ©Sõÿ÷êÔ©“’““uøða;vLŸ}ö™7n¬E‹iòäÉ7nœ$iÑ¢E>Õ_­Z5U«VMgÏž•ÕjõjìÎ�;K’vîÜ))¿µ%::Zf³Y›6m’”¤%Ò’ôé§ŸjÖ¬Y>|x�ý ó¦ŽÈÈH}ùå—zíµ×ô /hΜ92™LÎÊâ\»zûí·µdÉ=ùä“>�c *r|í·'µk×ÖÔ©S�azß¾}ªS§Ž¦L™¢zõê•jly“×.¸v�@ ÒÜ 4™.¸’� ’£½ãÏ?ÿt7Iƒ´cæ·]»v2›ó»ØZ·n]`ŸHÊåŽ;m¬^½ZR~áü!›Í¦ë®»Î9F·nÝ$Iûöíó©þœœeee)>>^f³Ù«±7n¬„„ýüóϲÙlÚºu«ºuë¦Ö­[kûöíÊÍÍÕ?ü øøx5jÔÈù^111Ζ‹–-[J’ÒÓÓÝÖåígܳg�&L˜ ;î¸Cýúõ“Ýnwö\–Źv ÓÕW_íõyP²��ç$)44´Àò& ‚W é Ϋ¯¾ª&Mš(%%E<ð€ÒÒÒü]Pi¹Þ½ãûï¿WãÆ�Õ¸qc·û:zûªU«æqû¬Àeq®|=¯@UWÒ„Þ©S§4zôhíß¿_ JHHÐáÇ5fÌ�:uªTcƒ ]j±±±š5k–š4i¢høðá„i œ8‚ôìÙ³uòäÉb¯8oذ¡$iãÆ�Î{ºïÝ»·À>—\r‰‚‚‚´wï^ÅÆÆªaÆÎGhh¨³÷zýúõÎ16mÚT {ãСCš1c†‚ƒƒ�_ÔäíØŽ>éÙ³g+$$DmÚ´qç×_½H´·¿²õ¦Ž�;wêܹsêСƒÚ¶m«˜˜IÿíŸ,‹s À˜’~Xþç?ÿ©ƒ*!!AÓ¦MÓ´iÓ”�� C‡9Û¸ŒŽ ÿÞµ£Òp„iÇE‡Ã‡×[o½¥Zµjù»4 R‰‹‹Ó¥—^ª_ýU’ç¶IjÚ´©Zµj¥�;wjÀ€JLLÔÊ•+ ìS§NÝu×]Z²d‰¬[n¹E'NœÐÙ³gõïÿ[‰‰‰jß¾½6mÚ¤þýû«yóæZ·n�BCCKüæÒI“&Él6믿þÒ®]»dµZõÈ#�8g_½»U«VЉ‰Ñž={Ô®];EFF*22RÍ›7×o¿ý¦ÈÈHŸ[!bbbtôèQÍš5Kƒ *±ŽºuëJÊ¿ˆÑb±8{¶ÿ“-‹s À˜���bï®á¸ŽkâĉªY³¦$iÚ´i7nœRRRJÅ ôé æw ÌL£k×®’ògA=µu8Lž™Íf}ýõ×jÞ¼y‘bÊâ\ð]XXX±Û¿ýö[Íž=Û¢%©fÍšš={¶óV¡FÇ® �˳¸’Ævw¥¦©Ð¶ 7˦BûzíxŸ6Ÿíx®a·Û7ùøY¼æøŠð””]vÙeZ¸pay½€222ÊüËSÂÂÂíÓ1&“©½¤3’ò$Y]žmç_Û\öó××rY'—u…—]÷W¡mž”ËOìþš‘èŸ.J£fÍšš5k–.»ì2úþ@¹‹ŒŒ¼ Æ,g~É–þš‘öt/A_g¤]g£bF ¢�;wN™™™e2VTT”ÂÃÃ}>ÎàŒ´ë¬´d|FZÖy³Í°òš‘®´3Î�&<<¼Lf‘### …è @¹dÓ@¿Ø^ˆŒŒTTT”á㣢¢.Ä–¿âöw•Dxx¸BBB”••åõˆaaaŠŒŒTppp9WWù¤*‘àà`EGG+22R999²X,²Z­Î[MšL&™Íf…„„(,,Œ] i€J(88˜V�rF�4`A0€ @� H¤Ò€iÀ‚4`A0 J~Eø¡C‡d³Ùü]@¥T5çf«d�®W¯ž¿KÀ®jþø”A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`€ÙßòY,-[¶L+V¬Ð¾}û$I�7Ö-·Ü¢ž={*$$ÄÏ\™ü4®»í&—õŽç 7Ë®û¹çXv<‚Ï?›Ï¿v<×ÈÍÍÝäÃg€rwâÄ =ñÄúý÷ßÝnoÖ¬™¦M›¦ÚµkWpeà�ÐÐÐö’ÎHÊ“duy¶�msyØ]Že¹,Ëe]áe»ËkWîÖù²Ýg´v€ŸY,–bC´$%''kôèѲX,X 8ið³¥K—¢’““õùçŸW@Eo¤ÀÏV¬XQ.ûÊAülÿþý^ï›’’RŽ•|A�?ËÎÎ.—}å‹ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ `öwp¡³X,Z¶l™V¬X¡}ûöI’7n¬[n¹E={öTHHH…׳téR­X±Bû÷ï÷{=PY™ü4®»í&—õŽç 7Ë®û¹çXv<‚Ï?›Ï¿v<×ÈÍÍÝäÃg�Nœ8¡Ñ£G+99ÙíöfÍšiêÔ©ªS§ŽÇ1’’’|zÏ-[¶xÜvüøq�3¦Øz¦M›¦ÚµkûôžP’ÐÐÐö’ÎHÊ“duy¶�msyØ]Že¹,Ëe]áe»ËkWîÖù²Ýg´v€A¹¹¹Å†hIJNNÖˆ#”ššZîõ¤¦¦jĈ%Ö3zôhY,–r¯*;‚4ôùçŸZŽ9¢Q£F•k˜NMMÕ¨Q£täÈ‘÷MNNÖ²eËÊ­¨*Ò`Ð×_íõ¾å¦} Ñß|óM™×U A r\Èç­#GŽhøðá:zôh™ÕpìØ1ŸC´$¥¤¤”Y PU¤ ¥¦¦jäÈ‘e¦�;¦‘#Gú¢%Éd*¯kÍ ê H€A�76t\jjª~øáRµy8¹‘-¯ð_i0è–[n1|liz¦�ôDÖ½{wÃÇòqi0Èb±hèС^ݹÓøøxŸ±‘c\5oÞ\sçÎå‹Y”)î# ðZHHˆ¦L™¢øøxÃc Ä¥ Ññññš2e !ÊAJ¡nݺš9sf©ÂtE©W¯ž^ýõb¿eà=‚4”Ò…¦ëÕ«§™3g*..Îߥ@¥A�€2Èaš åƒ e$Ã4!ÊAÊP …iB4”/‚4”±@Ó„h(i(þ Ó„h¨i('þÓ„h¨8i(G¦ ÑP±ÒPÎ*"L¢ â¤ ”g˜&D€¤ ‚”G˜&D€ÿ¤ •e˜&D€¤ ‚•E˜&D€ÿ¤ÀJ¦ ÑÒà'FÂ4!AüÈ—0Mˆ€ÀB�?«[·®fÍš¥fÍšyܧyóæš3g!ˆÉOãºÛnrYïxr³ìºO�ËqŽeÇ#øü³ùükÇs�ÜÜÜM>|¨‹EË–-Ó7ß|£””IR“&MÔ½{wÝyç� ñs…àYhhh{Ig$åI²º<Ûο¶¹<ì.Dz\–å²®ð²Ýåµ+wë|Ùî3‚4J­*iZ;Ò€iÀ‚4`A0Àìï ¢%%%ù»„JeË–-þ.ü‚iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0Àìï ¢mÙ²Åß%*f¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4øhàÀ�JJJÒöíÛ+ì=_|ñE%%%éÓO?õ¸OjjªÆŒ£®]»jàÀ�Z³f�~ÿýw½óÎ;:vìX¹×XÞçÅ›sÉìïTmÿüç?õÝwß9—CCC•�� F�©OŸ>ºêª«üXÝ…Ãf³é‰'žÐ¾}û«ôôtÙl6M™2E¿üò‹Nž<©'Ÿ|Ò§1_zé%mß¾]'NÔ¥—^ZN•À…‹ ÄÆÆªzõê:{ö¬RRR”’’¢Õ«WëÎ;ïÔ¸qãü]^Àûå—_´oß>Õ«WO‹/Vhh¨ìv»:¤#GލM›6>�g·ÛµvíZeddèçŸ&H€iaðàÁúßÿý_IÒ™3gôÎ;ïè“O>Ñ矮«®ºJÿøÇ?ü\a`;räˆ$éÊ+¯Thh¨$Éd2iðàÁ|XV«U�5RÿþýÕ¥K—c-]ºTK—.ÕÑ£Gu饗êÔ©Sß÷ùçŸ×Š+$IË—/×òåË£+Vh„ Zµj•yäõë×ORþE�Þ|Î�*99Y¯¼òŠ’’’´oß>Í™3G»víRff¦tÅWé½Þ±c‡,X _ýUuëÖÕƒ>¨N�:ØgåÊ•úøã�µÿ~Õ¬YS]»vÕàÁƒfè€?0# `5hÐÀ9úÿ~IÒŠ+4räHýðÃЉ‰QNNŽÖ®]«�êèÑ£’¤nݺI’¶nÝêkݺuÊÍÍUff¦6oÞ,)ÿ.û÷ïW\\œ³855U=ô�~ûí7�;wNЄ ´oß¾bkõ¦.³Ù¬>ø@þù§êׯ¯ððpíÞ½[ãÆ�Ó–-[œcÍŸ?_/¿ü²þøã]tÑEÚµk—RRR<¾w‹- ,wêÔI×]w]±õúú9srr4jÔ(­]»V±±±jÓ¦�l6›rrrŠì %  IDATûî»ï*99YçÎ�Ó¾}ûôÌ3ÏèàÁƒ>ß³Ï>«}ûö©U«VÊÊÊÒ¼yó4yòdÃçü� `™L&åÿgªF�²X,š6mš$iÒ¤Iúøã�õÅ_¨U«VÊÎÎÖܹs%I]ºtQpp°öìÙ£ŒŒ åäähëÖ­ºè¢‹$IkÖ¬‘$g .<Û|ÇwhÕªUZ¾|¹4h ›Í¦�7z¬ÓÛº‚ƒƒµdÉ­ZµJóçÏ×òåË5lØ0IÒªU«$É*%éå—_ÖǬ•+W{žúöí«§žzJ’tÛm·éå—_ÖsÏ=Wâùõås\~ø¡222Šì{Ë-·HÊÿsHJJ’$¥¥¥I’~ÿýwY­VÙívõìÙSIIIêÞ½»rsse³ÙtæÌ™ =PôHXŽ/ÞhÕª•Ìf³²³³%IyyyösÜ¥"<<ܹ®k×®Ú¼y³¶mÛ&«ÕªjÕªéºë®SçÎ�õå—_jÆ Ú¾}»ââ⊴F¸rÓoëÊÈÈÐ�!CtæÌ ­¨¨(5iÒÄëqBCCõØc�é_ÿú—f̘¡Õ«W«~ýúúã�?Ô¢E M˜0!`ÏÆŒ4€€pòäI¥¤¤èÌ™3jÙ²¥úôé£�>úHÝ»w/°ß°aÃôÌ3ϨE‹:vì˜ÂÃÃu×]wiÑ¢EEÚ ³Ï&“ÉÙä Ï%µuxòàƒªE‹:~ü¸ónÞÔ¯çŸ^_|±>¬¬¬,½ð Eê~ôÑGuß}÷)..NgΜQRR’Þxã ™L&Ÿk-+999êÞ½»‚‚‚´mÛ6=zT×]w�^{í5Õ¨Qç±zôè¡×_]mÚ´ÑáǵvíZY,Õ®]Û¹O ž(¬¼þ‹TҸ\Ö;žƒÜ,»îärœcÙñ>ÿl>ÿÚñ\#77w“Ÿ% m/錤]gÏž-°ß„ tï½÷Ên·»­+99YIIIÚ±cG�c’’’Šþøc}ùå—?~¼vïÞ­±cÇÊf³y<Ê A@@p½`¬~ýúŠˆˆ(q¶¸eË––�9"«ÕZ`æ6""B-[¶ÔÁƒuøðaÙl¶zsá›ÃÑ£G•••¥K/½Ôëc<}®#GŽx]K\\œ$øÁbРAúöÛoõí·ßêÖ[ou{\Ó¦MÕ§OMœ8±ÈÝ6jÕª%I:vì˜Ûcsss•™™©øøø룢¢Ô«W/-\¸Pÿý·–/_®{î¹ÇÓÇWß¾}µeË–�›o¾¹È~ÇŽÓ´iÓ4xð`Õ«WO’ÜÞ!äŠ+®PBB‚ªW¯®6mÚhÒ¤IÚµk—~ÿýw�5@y!H¨4rsse³ÙŠ´„„„(44TV«U6›Íð쥣_¸,f?}©%""Bõë×׆ œëBBB¥¨¨(·½ÄC‡Õ©S§´téÒëcbbT£F íܹÓíq»wïVPP�ŠlëÛ·¯6mÚ¤©S§ªsçÎÎP^o¿ý¶2335{öluèÐA:tÐgŸ}¦�>úH:tвeËܯèèh�?@y"H¸ X­Ö÷iР�$‡6›M{÷îUbb¢Ûí…g=#""tàÀ�ëûÄÇÇ;Ç+-ojq5xð`}üñÇz–½®'Ÿ|R³fÍÒÉ“' lëÝ»·Þ{ï½"÷Œ¶Ùlš;w®þçþÇí…}±±±ºýöÛµråJõïßß§z<?~¼sÆzãÆ�Ú¸q£î¾ûnõíÛW7nTÏž=Ýwüøqedd¨aÆeRø‚ àÕ­[W;wîTjjj±í‘‘‘ºýöÛ5yòdíÙ³G§N�ÒŒ3«k¯½V‘‘‘ºí¶ÛôòË/kÏž=JKKÓo¼Q`Œ+¯¼R_|ñ…RSSuäÈMœ8Ñyq`�5Ô¹sgM™2ETVV–6lØàó‹ŽZKªÅÕí·ß®víÚiÈ�!ξç¿þúK«W¯Öš5kT­Z5�Ç&%%éºë®+2+Ý¿EEEièСڰaƒÒÒÒ´cÇ=öØcúûï¿uß}÷ysèСš5k–.¾øâb?§»‹ sss‹=Æ“ôôtMœ8Q;vìPZZšþóŸÿhܸqºá†Òü‚ûHx·Þz«6mÚ¤{î¹G×\s�¦N�êqßÑ£Gë�7ÞÐSO=%«ÕªvíÚé•W^qö*�=Z¯¼òŠF�­êÕ««G�ÎdIz衇ô¯ýK÷Üs�âããÕ­[·wÒxæ™g4}út >\‹EM›6U“&M Ýú­p-]»v•äþ F‚‚‚4yòd}þùçZµj•æÎ�+³Ù¬† ê‰'žP÷îÝ‹}¯Ç\›7o.°.""Bï¾û®Þ~ûmÍ™3G‡R£F�tíµ×jèСŶŒÔ¨QCW_}u‰ŸqÉ’%Z²dI�u­[·ÖÌ™3K<¶0»Ý®ÐÐP½ôÒK:~ü¸êÔ©£.]ºø <•××A•4®»í&—õŽç 7Ë®û¹çXv<‚Ï?›Ï¿v<×ÈÍÍÝäÃg€ qòäIõèÑCëÖ­óê~ÑHBCCÛK:#)O’ÕåÙvþµÍåawy8–å²,—u…—í.¯]yî�ón»Ïh퀑œœ¬øøxB4\ hí?9xð <¨Ö­[ëäÉ“š9sf™]¼(i𓌌 ÍŸ?_Ï>û¬êÔ©£»ï¾ÛãÝ)�‡i”=Ò¼B� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ `öwCvv¶rrrdµZý] pÌf³ÂÂÂáïR‚4PÅååå)##ƒ ÃjµÊjµ*''GÑÑÑ öwI­@Gˆ¼gµZ•‘‘áï2‚4P…egg¢Y­Veggû» € Ta999þ.¸ ño€D�ª4f£cø·@"H†¤Ò€iÀ‚4  ?~\Ç�÷wPßl LX­V}òÉ'Ú¾}»8 š5kªY³f0`€êׯï×ÚF�¥””I’ÉdR­ZµÔ AuïÞ]�;wökmwÝu—ÂÃÃõᇖÛ{lذAÿú׿Կõïß¿ÈvÇyZ¼x±ªW¯^nuxâøŠúÈÈH™L&Iù÷:¿ÿþû%I}ô_Ñ  0#  Ô²³³õÄOhÁ‚:zô¨Z´h¡œœ}÷Ýw9r¤vìØáï%I;vT§N�£_~ùE“&MÒ /¼àï²pÞŒ3Ô«W/í߿߹.,,L 6TÆ æÇê (f¤”Ú| ääduìØQcÇŽUHHˆìv»Þ{ï=½ÿþûzíµ×4gÎ…„„øµÎG}TÕªU“$%''ëùçŸ×¦M›´jÕ*uíÚÕ¯µÁ½   ½öÚkþ.Ü"H(‹Å¢¥K—*""B?ü°3,›L& 0@Û·oWrr²¶lÙ¢n¸AwÝu—î¸ã�9sF[·nUdd¤z÷î­[o½Õ9æ¹sç4oÞ>^³fÍrÎŒ;Wïõ×_¯Î�;kíÚµêß¿¿7nl¸#çŒ`F@©Ô¬YS’”––ævûéÓ§%©À�;âââd6çÿvÌ ;žúé'ÝrË-ºå–[´~ýzIRFF†sŒêÕ«;ÛH.½ôRIùí¾ÈÍÍUvv¶êׯ/³Ù¬Èn·ëšk®qÖשS'IÒÁƒ%I 6T\\œöìÙ#›Í¦Ÿ~úI�:uÒW\¡�;wÊb±è—_~Qýúõ•��`¨^oê�òû¼'Ož¬AƒiÔ¨Q²Ûíúûï¿%ý÷7W_}µsŒ+®¸Â§óãkMû÷ï—ÍfS›6mŠ„è’ê-Ë:Êâï‡i¥’�� “ɤääd�}z�Zºté¢öíÛ—XSbb¢®¸â ýç?ÿÑ#�<¢Ö­[ëÀ�êß¿‰õJRãÆ�µzõjÍž=[×^{­úöí[¤EÄÛ?#¨ÌH(µ˜˜½ùæ›êÝ»·êÔ©£Ý»w+((HÿøÇ?ôÖ[o©Y³fö�ŽŽVóæÍõÃ?¨^½zzþùçÕ¢E çö#FhРA Ö'Ÿ|¢½{÷*<<¼À];ŒX³f�¾ûî;�>}Z×^{­^{í5Ý}÷Ýö7nœzôè¡ììlmÛ¶M-Z´Ð+¯¼Rà"Ç   猳ëL»c¦ºuëÖÎþ]o 6L±±±Z¾|¹öíÛWbW^y¥úöí«àà`­^½Z‰‰‰ºá† Œ9~üxµoß^iiiú믿4~üø"­7îlÙ²Eëׯw>>ìõ¹™0a‚ºuë¦ÌÌL-_¾\éééÊÍÍõªÞÛo¿]7Þx£RSSµbÅŠ"=ÏÞÔÁTò.å2®»í&—õŽç 7Ë®û¹çXv<‚Ï?›Ï¿v<×ÈÍÍÝäÃg*-O–§»îºK±±±z÷Ýw+ü½�²ä˜e�/44´½¤3’ò$Y]žmç_Û\v—‡cY.ËrYWxÙîòÚUI³-¥›�qƒiÀ‚4`A0€»v¨PK—.õw ” f¤Ò€i  óõ^Çòño€D�ª´°°0—\�ø·@"HUZDD3k€�Ìf³"""ü]€@�ª¸èèhÂ4à%³Ù¬èèh— @ðO Š VLLŒ²³³•““#«Õêï’€€c6›ÆL4€Ò$å·yð­€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ @� H¤Ò€iÀ‚4`A0€ ] ¤¤¤ø»€*‡ }�³ÛíZ¹r¥Oaz„ JJJRRR’Ú·o¯Þ½{ëé§ŸÖüáÓ{çææêܹs>Ó¯_?-\¸Ð¹�Ò•@JJŠÏaúî»ïÖ·ß~«¯¾úJ&LPll¬† ¢U«Vy=ƼyóôÒK/ùTkÇŽÕ¼ysŸŽDf€²áÓ7ß|³š6mZâþ¡¡¡ŠŠŠ’$ÅÄÄ誫®Rݺu5}út%%%)::º\ê>|x¹Œ Pј‘®Daú÷ß7t|¿~ýd·Ûµ~ýzI’ÅbÑ믿®ž={êÖ[oÕĉ•��-IZ´h‘æÍ›§U«V©C‡š2eŠ,‹^}õUõîÝ[�:uRŸ>}ôõ×_x�’Z9¶lÙ¢!C†¨sçÎêÝ»·fΜiè³”7f¤+™ýû÷kåÊ•’äÕÌ´«ÐÐP%&&êСC’¤éÓ§+==]ï¾û®¬V«^|ñE½ñÆ;v¬  ¬¬,>|X/¾ø¢sŒ hòäÉ Ó·ß~«_|Q—]v™6lXâûgddèÉ'ŸÔc�=¦®]»êĉ>÷`Tf¤+¡ýû÷¾“G­Zµ”žž®³gÏêóÏ?×O<¡š5kªN�:zà�´nݺb�ïÕ«—7n¬øøx 4HqqqÚ³g�Wï}âÄ Y­Vµoß^ÑÑÑjܸ±.»ì2CŸ ¼1#] %&&ú<í�––¦ë¯¿^þù§l6›î¿ÿ~™L&I’ÕjÕÙ³g‹=>==]ß|h€Šâ ,IDATó�~þùgeddèðáÃ^Ï*7jÔH×\s�î¹ç]ýõºãŽ;Ô¶m[CŸ ¼¤+™ÄÄDuëÖM‰‰‰>›››«”” 8Ðy±á‚ T£F ¯ŽÏÎÎÖ°aÃÔ¥K 6LõêÕÓƒ>(›ÍæÕñAAAzýõ×õÓO?iùòåzúé§uÍ5×hòäÉ>€òF�®DJ¢%é£�>R\\œÚµk§¼¼ýôÓxç�wâðð0{챸~ýzìíí]€EÚYÑqsÛwZë›ånæu{ŸÝÖûš×ÍãÜÉòüÉófùËŸþùÖˆÏR½/¿ü²x:À<ìíí=ÿŽˆ{q·µœœ<Ÿ´÷[�æu´^Gk]úú~ëy[nÝ˜í£™Ú±D4Àò i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i( ¤ €�€B i(°¨�¾¿ ãÀX iÓu‘ìëk­[nU!½Ö €ª¬¤-×mDzÈEéõÙ¸Ž«=¤×êb0WU·`í! UÒP@H@�ÚBz)ó`vvvî,ãçlƒ%¶UUs¦k é!Ò x?ó¼½LŸß;::úbq§°]NÚê^äÛ+2Ëôyîuõj 鮋žûÃézLZËæqtçÎ�ÏyòÛ䤭ŽN^¶Û«Ýd}�È<Ï-«²Ê�zAJ.\û¢}ŒIDÜýðÃÿ^pL2NÚênœ\¦VÚsóÜoîvV|ì�Ìótqüíõéc7óz7"εç[Ë_|ÿý÷¿¿|ùòoÇ}$Ú?y衇þÿ‰ã˜¾×Z6�öu:{ ktzrúSFMÉYHl×4µcÚìÛ>í¿ÒÇOo½õÖ_ÊO€ˆˆ“¦ú)†OÙ˜6B=K.Õ"G¤‡?ÝÞ5*½›y½“ì·›Yö�J_º}ûöož|òÉ?Žø<œ888xíÊ•+7#âÇ6�.#ÎŽPGk}úºk¾ôÊÂ{]Cz'Y7mzÇnÇsÒÍãò×_}õÑGýÝð�À7ß|óçýýý¿FÄaœ ç»q:_zÈ´ŽˆúY™õÕ„ôª§vÌ2‰ÍÖ†tÄì1�®Ÿ5¨ÛÛj¸>«Ô5Wº½}Úó¡ÛûÖϺïÜÕŠcÏ¡4¦§í3-ª‡ì°Î†þr”1Ó4J÷bëC:b~1ÝÞ6�0žçyÔ`ž±:6¼ÇÄù4+ÿ-ˆ5…ß"bzèq§ÅwM× `¦� ÙÒî1Ç]™Ú±ä|1%Ãüh€SÓæIçöÏ=ïÛ¯äØ+U[,–žÏ # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import os import platform import traceback from gi.repository import Adw, GLib, Gtk from video_downloader.util import g_log def build_about_dialog(parent): builder = Gtk.Builder.new_from_resource( '/com/github/unrud/VideoDownloader/about_dialog.ui') about_window = builder.get_object('about_window') about_window.set_debug_info(get_debug_info(about_window.get_version())) about_window.set_transient_for(parent) return about_window def get_debug_info(version): try: import yt_dlp yt_dlp_version = str(yt_dlp.version.__version__) except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) yt_dlp_version = None return '\n'.join([ 'OS: %s' % (GLib.get_os_info('PRETTY_NAME')), '', 'Libraries:', *('\t%s %s' % (name, version) for name, version in [ ('Python', platform.python_version()), *((name, '%d.%d.%d' % (lib.MAJOR_VERSION, lib.MINOR_VERSION, lib.MICRO_VERSION)) for name, lib in [('GLib', GLib), ('Gtk', Gtk), ('Libadwaita', Adw)]), ('video-downloader', version), ('yt-dlp', yt_dlp_version), ] if version), '', 'Env:', *('\t%s=%s' % (name, os.environ[name]) for name in [ 'LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG', 'G_MESSAGES_DEBUG', ] if name in os.environ) ]) video-downloader-0.12.31/src/about_dialog.ui.in000066400000000000000000000060631516223405600213150ustar00rootroot00000000000000 1 1 com.github.unrud.VideoDownloader Video Downloader Unrud @VERSION@ @releasenotes@ https://github.com/unrud/video-downloader https://github.com/unrud/video-downloader/issues video-downloader.txt Unrud Adrien Plazas Gustavo Peredo Dave Patrick Artem Polishchuk Óscar Fernández Díaz Tobias Bernard Ahmed Najmawi Ã…ke Engelbrektson Albano Battistella Ali Khomami P. Allan Nordhøy AngryPenguinPL AnjaRuni Bahrom Miragzamov Balazs Christian Elbrianno Dan dedakir923 delvani Eder Etxebarria Rojo Elvis FCastro32 gallegonovato GiannosOB Gustavo Machado Peredo Heimen Stoffels HenRy Hoshmand M. Qadir Host1c Ã�car N. S. Ihor Hordiichuk Irénée THIRION Ivan Lukan Jiri Grönroos J. Lavoie klewf Lee Junseo Littux Luna Jernberg L.Yang Manuela Silva MartinIIoT mere MikayelB Milan Å alka Milo Ivir Ngô Quang Ä�ại OÄŸuz Ersen Oleksandr Pidlisniak Onnar Rick Óscar Fernández Díaz ovari P. A. pau oliveres Peter Dave Hello Philip Goto Piotr Wieczorek Priit Jõerüüt Rafael Mardojai CM Reza Almanda Roger VC Roy Meissner Ryo Nakano Sabri Ünal Scrambled777 sicklylife Simeon Thuet SPiRiT Stratos Petrelis taijuin Lee TamilNeram Temuri Doghonadze The Best Way Thiago Carmona Thorfin89 Troja tuxanator Umidjon Almasov Ümit Solmaz Valeriy Manzhos vikdevelop VojtÄ›ch Perník Yago Raña Gayoso Yaron Shahrabani yoval keshet Yurt Page Copyright © 2019–2025 Unrud gpl-3-0 video-downloader-0.12.31/src/authentication_dialog.py000066400000000000000000000070501516223405600226250ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import gettext from gi.repository import GObject, Gtk from video_downloader.util.connection import CloseStack, PropertyBinding N_ = gettext.gettext class BaseAuthenticationDialog(Gtk.Dialog): def __init__(self, parent): super().__init__(modal=True, destroy_with_parent=True, resizable=False, title=N_('Authentication Required'), use_header_bar=True) self._cs = CloseStack() self.set_transient_for(parent) self.add_button(N_('Cancel'), Gtk.ResponseType.CANCEL) self._ok_button = self.add_button('', Gtk.ResponseType.OK) self._update_response(False) self.set_default_response(Gtk.ResponseType.OK) area_wdg = self.get_content_area() area_wdg.append(self._build_content()) def destroy(self): self._cs.close() super().destroy() def _update_response(self, form_filled): self._ok_button.set_label(N_('Sign in') if form_filled else N_('Skip')) def _build_content(self): raise NotImplementedError class LoginDialog(BaseAuthenticationDialog): username = GObject.Property(type=str) password = GObject.Property(type=str) def _update_form(self): self._update_response(self.username or self.password) def _build_content(self): content = LoginDialogContent() self._cs.push(PropertyBinding( self, 'username', content.username_wdg, 'text', bi=True)) self._cs.push(PropertyBinding( self, 'password', content.password_wdg, 'text', bi=True)) self._cs.push(PropertyBinding( self, 'username', func_a_to_b=lambda _: self._update_form())) self._cs.push(PropertyBinding( self, 'password', func_a_to_b=lambda _: self._update_form())) return content class PasswordDialog(BaseAuthenticationDialog): password = GObject.Property(type=str) def _update_form(self): self._update_response(self.password) def _build_content(self): content = PasswordDialogContent() self._cs.push(PropertyBinding( self, 'password', content.password_wdg, 'text', bi=True)) self._cs.push(PropertyBinding( self, 'password', func_a_to_b=lambda _: self._update_form())) return content @Gtk.Template(resource_path='/com/github/unrud/VideoDownloader/' 'authentication_dialog_login.ui') class LoginDialogContent(Gtk.Box): __gtype_name__ = 'VideoDownloaderLoginDialogContent' username_wdg = Gtk.Template.Child() password_wdg = Gtk.Template.Child() @Gtk.Template(resource_path='/com/github/unrud/VideoDownloader/' 'authentication_dialog_password.ui') class PasswordDialogContent(Gtk.Box): __gtype_name__ = 'VideoDownloaderPasswordDialogContent' password_wdg = Gtk.Template.Child() video-downloader-0.12.31/src/authentication_dialog_login.ui000066400000000000000000000076741516223405600240160ustar00rootroot00000000000000 video-downloader-0.12.31/src/authentication_dialog_password.ui000066400000000000000000000046561516223405600245450ustar00rootroot00000000000000 video-downloader-0.12.31/src/downloader/000077500000000000000000000000001516223405600200515ustar00rootroot00000000000000video-downloader-0.12.31/src/downloader/__init__.py000077500000000000000000000230241516223405600221660ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import contextlib import fcntl import functools import os import re import signal import subprocess import sys import traceback import typing from gi.repository import GLib from video_downloader.util import g_log from video_downloader.util.response import AsyncResponse, Response from video_downloader.util.rpc import handle_rpc_request, rpc_response MAX_RESOLUTION = 2**16-1 # RegEx for splitting lines because `bytes.splitlines` transforms # `b'abc\n'` to `[b'abc']` instead of `[b'abc', b'']` _SPLITLINES_RE = re.compile(rb'\r\n|\r|\n') class Downloader: def __init__(self, handler): self._handler = handler self._process = None self._pending_response = None def destroy(self): self._handler = None if self._process: self._finish_process_and_kill_pgrp() def cancel(self): assert self._process self._process.terminate() if self._pending_response: self._pending_response.cancel() def start(self): assert not self._process extra_env = {'PYTHONPATH': os.pathsep.join(sys.path)} # Start child process in its own process group to shield it from # signals by terminals (e.g. SIGINT) and to identify remaning children. # yt-dlp doesn't kill ffmpeg and other subprocesses on error. self._process = subprocess.Popen( [sys.executable, '-u', '-m', 'video_downloader.downloader'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env={**os.environ, **extra_env}, universal_newlines=True, preexec_fn=os.setpgrp) # WARNING: O_NONBLOCK can break mult ibyte decoding and line splitting # under rare circumstances. # E.g. when the buffer only includes the first byte of a multi byte # UTF-8 character, TextIOWrapper would normally block until all bytes # of the character are read. This does not work with O_NONBLOCK, and it # raises UnicodeDecodeError instead. # E.g. when the buffer only includes `b'\r'`, TextIOWrapper would # normally block to read the next byte and check if it's `b'\n'`. # This does not work with O_NONBLOCK, and it gets transformed to `'\n'` # directly. The line ending `b'\r\n'` will be transformed to `'\n\n'`. fcntl.fcntl(self._process.stdout, fcntl.F_SETFL, os.O_NONBLOCK) fcntl.fcntl(self._process.stderr, fcntl.F_SETFL, os.O_NONBLOCK) self._process.stdout_remainder = self._process.stderr_remainder = b'' GLib.unix_fd_add_full( GLib.PRIORITY_DEFAULT_IDLE, self._process.stdout.fileno(), GLib.IOCondition.IN, self._on_process_stdout, self._process) GLib.unix_fd_add_full( GLib.PRIORITY_DEFAULT_IDLE, self._process.stderr.fileno(), GLib.IOCondition.IN, self._on_process_stderr, self._process) def _finish_process_and_kill_pgrp(self): assert self._process process, self._process = self._process, None try: # Terminate process gracefully so it can delete temporary files process.terminate() process.wait() except BaseException: # including SystemExit and KeyboardInterrupt process.kill() process.wait() finally: # Kill remaining children identified by process group with contextlib.suppress(OSError): os.killpg(process.pid, signal.SIGKILL) return process.returncode def _pending_response_callback(self, process, request_line, response): assert self._pending_response is response self._pending_response = None if response.cancelled: self.cancel() else: self._send_response(process, request_line, response.result) @staticmethod def _send_response(process, request_line, result): try: print(rpc_response(result), file=process.stdin, flush=True) except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_CRITICAL, 'failed request %r\n%s', request_line, traceback.format_exc()) process.terminate() def _on_process_stdout(self, fd, condition, process): # Don't use `process.stdout.read` because of O_NONBLOCK (see `start`) s = process.stdout.buffer.read() pipe_closed = not s process.stdout_remainder += s *lines, process.stdout_remainder = _SPLITLINES_RE.split( process.stdout_remainder) if self._process is not process: return not pipe_closed failure = False line: typing.AnyStr for line in filter(None, lines): # Filter empty lines try: line = line.decode(process.stdout.encoding) if self._pending_response: raise RuntimeError('request during pending request') result = handle_rpc_request( HandlerInterface, self._handler, line) except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_CRITICAL, 'failed request %r\n%s', line, traceback.format_exc()) failure = True break if isinstance(result, AsyncResponse): self._pending_response = result self._pending_response.add_done_callback(functools.partial( self._pending_response_callback, self._process, line)) else: self._send_response(self._process, line, result) if pipe_closed and process.stdout_remainder: g_log(None, GLib.LogLevelFlags.LEVEL_CRITICAL, 'incomplete request %r', process.stdout_remainder) failure = True if pipe_closed or failure: returncode = self._finish_process_and_kill_pgrp() if self._pending_response: self._pending_response.cancel() self._handler.on_finished(returncode == 0 and not failure) return not pipe_closed def _on_process_stderr(self, fd, condition, process): # Don't use `process.stderr.read` because of O_NONBLOCK (see `start`) s = process.stderr.buffer.read() pipe_closed = not s process.stderr_remainder += s if pipe_closed: process.stderr_remainder += b'\n' *lines, process.stderr_remainder = _SPLITLINES_RE.split( process.stderr_remainder) for line in filter(None, lines): # Filter empty lines # Don't use `errors='strict'` because programs might write garbage # to stderr line = line.decode(process.stderr.encoding, errors='replace') g_log('yt-dlp', GLib.LogLevelFlags.LEVEL_DEBUG, '%s', line) if self._process is process: self._handler.on_pulse() return not pipe_closed class HandlerInterface: def get_download_dir(self) -> Response[str]: raise NotImplementedError def get_prefer_mpeg(self) -> Response[bool]: raise NotImplementedError def get_automatic_subtitles(self) -> Response[typing.List[str]]: raise NotImplementedError def get_url(self) -> Response[str]: raise NotImplementedError def get_mode(self) -> Response[str]: raise NotImplementedError def get_resolution(self) -> Response[int]: raise NotImplementedError def on_playlist_request(self) -> Response[bool]: raise NotImplementedError # user password def on_login_request(self) -> Response[typing.Tuple[str, str]]: raise NotImplementedError # password def on_password_request(self) -> Response[str]: raise NotImplementedError def on_error(self, msg: str) -> Response[None]: raise NotImplementedError def on_progress(self, filename: str, progress: float, bytes_: int, bytes_total: int, eta: int, speed: int) -> Response[None]: raise NotImplementedError def on_download_start(self, playlist_index: int, playlist_count: int, title: str) -> Response[None]: raise NotImplementedError # lock acquired def on_download_lock(self, name: str) -> Response[bool]: """Lock gets released by `on_download_finished` or process termination. It's not allowed to hold more than one lock at a time.""" raise NotImplementedError def on_download_thumbnail(self, thumbnail: str) -> Response[None]: raise NotImplementedError def on_download_finished(self, filename: str) -> Response[None]: raise NotImplementedError def on_pulse(self) -> Response[None]: raise NotImplementedError def on_finished(self, success: bool) -> Response[None]: raise NotImplementedError video-downloader-0.12.31/src/downloader/__main__.py000066400000000000000000000043651516223405600221530ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import os import signal import sys from video_downloader.util.rpc import RpcClient if __name__ == '__main__': # Exit gracefully on SIGTERM to allow cleanup code to run signal.signal(signal.SIGTERM, lambda *_: sys.exit(1)) # Duplicate stdin and stdout for exclusive usage with handler. # The handler waits for stdin and stdout to be closed. The fds must not # be closed before the process exits to avoid race. input_file = os.fdopen(os.dup(sys.stdin.fileno()), 'r', closefd=False) output_file = os.fdopen(os.dup(sys.stdout.fileno()), 'w', closefd=False) # Prevent leaking the fds to children that might remain after this process # exits os.set_inheritable(input_file.fileno(), False) os.set_inheritable(output_file.fileno(), False) # Redirect stdin and stdout to /dev/null to prevent interferences with open(os.devnull, 'r+') as devnull: os.dup2(devnull.fileno(), sys.stdin.fileno(), inheritable=True) os.dup2(devnull.fileno(), sys.stdout.fileno(), inheritable=True) handler = RpcClient(output_file, input_file) try: from video_downloader.downloader.yt_dlp_monkey_patch import ( install_monkey_patches) install_monkey_patches() import yt_dlp from video_downloader.downloader.yt_dlp_slave import YoutubeDLSlave try: YoutubeDLSlave(handler) except yt_dlp.utils.DownloadError: sys.exit(1) except Exception as e: handler.on_error('%s: %s' % (type(e).__name__, e)) raise video-downloader-0.12.31/src/downloader/meson.build000066400000000000000000000003771516223405600222220ustar00rootroot00000000000000video_downloader_sources = files([ '__init__.py', '__main__.py', 'yt_dlp_monkey_patch.py', 'yt_dlp_slave.py', ]) python_sources_for_linting += video_downloader_sources install_data(video_downloader_sources, install_dir: moduledir / 'downloader') video-downloader-0.12.31/src/downloader/yt_dlp_monkey_patch.py000066400000000000000000000050241516223405600244600ustar00rootroot00000000000000# Copyright (C) 2020 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import io import os import subprocess import sys import threading def _tee(fin, *fouts): '''Read from `fin` and write to all `fouts`''' while True: b = fin.read(1) if not b: break for fout in fouts: fout.write(b) class PatchedPopen(subprocess.Popen): def communicate(self, *args, **kwargs): '''When processe's stderr gets redirected by `subprocess.PIPE` duplicate it to `sys.stderr` ''' if not self.stderr: return super().communicate(*args, **kwargs) if hasattr(self.stderr, 'encoding'): errs_buf = io.StringIO() sys_stderr = sys.stderr else: errs_buf = io.BytesIO() sys_stderr = sys.stderr.buffer tee_thread = threading.Thread( target=_tee, args=(self.stderr, sys_stderr, errs_buf), daemon=True) self.stderr = None tee_thread.start() outs, _ = super().communicate(*args, **kwargs) tee_thread.join() return outs, errs_buf.getvalue() def patch_getcwd(): def patched_chdir(path): nonlocal cwd chdir(path) if os.path.isabs(path): cwd = os.path.normpath(path) else: cwd = os.path.normpath(os.path.join(cwd, path)) chdir = os.chdir cwd = os.getcwd() os.getcwd = lambda: cwd os.getcwdb = lambda: os.fsencode(cwd) os.chdir = patched_chdir def install_monkey_patches(): # ffmpeg writes progress information to stderr, but yt-dlp captures it # by default. Overriding this behavior allows us to show activity while # converting audio to MP3 or finishing videos. subprocess.Popen = PatchedPopen # getcwd is broken inside of xdg-desktop-portal FUSE for documents if os.name == 'posix': patch_getcwd() video-downloader-0.12.31/src/downloader/yt_dlp_slave.py000066400000000000000000000505211516223405600231130ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import contextlib import glob import json import os import re import shutil import sys import tempfile import time import traceback import yt_dlp from yt_dlp.postprocessor.common import PostProcessor from yt_dlp.postprocessor.ffmpeg import (FFmpegPostProcessor, FFmpegPostProcessorError) from yt_dlp.utils import dfxp2srt, sanitize_filename from video_downloader.util.path import encode_filesystem_path # File names are typically limited to 255 bytes MAX_OUTPUT_TITLE_LENGTH = 200 MAX_ID_LENGTH = 200 MAX_THUMBNAIL_RESOLUTION = 1024 def log(format_string, *args): print(f'[yt_dlp_slave] {format_string % args}', file=sys.stderr, flush=True) def _short_filename(name, length): for i in range(len(name), -1, -1): output = name[:i].strip() if i < len(name): output += '…' output = sanitize_filename(output) # Check length with file system encoding if len(encode_filesystem_path(output)) < length: return output raise ValueError('can\'t shorten filename %r to %r bytes' % (name, length)) def _convert_filepath(info, files_to_delete, filepath, new_ext, type_='conv'): prefix = '.%s.%s' % (type_, new_ext) files_to_delete.append(filepath) info['__files_to_move'][filepath + prefix] = ( info['__files_to_move'][filepath] + prefix) return filepath + prefix class SubtitlesConverterPP(FFmpegPostProcessor): """A more robust subtitles converter""" def run(self, info): files_to_delete = [] new_subtitles = {} for lang, sub in (info.get('requested_subtitles') or {}).items(): filepath = sub.get('filepath') if not filepath: continue if not os.path.isfile(filepath): log('Skipping missing subtitle (%r, %r)', lang, sub.get('ext')) continue log('Converting subtitle (%r, %r)', lang, sub.get('ext')) if sub.get('ext') in ['dfxp', 'ttml', 'tt']: # Try to use yt-dlp's internal dfxp2srt converter with open(filepath, 'rb') as f: data = f.read() try: data = dfxp2srt(data) except Exception: files_to_delete.append(filepath) traceback.print_exc(file=sys.stderr) sys.stderr.flush() continue filepath = _convert_filepath(info, files_to_delete, filepath, 'srt') with open(filepath, 'w', encoding='utf-8') as f: f.write(data) # Try to convert subtitles with ffmpeg new_filepath = _convert_filepath(info, files_to_delete, filepath, 'vtt') try: self.run_ffmpeg(filepath, new_filepath, ['-f', 'webvtt']) except FFmpegPostProcessorError: files_to_delete.append(new_filepath) continue filepath = new_filepath # Fix broken WEBVTT files generated by FFmpeg (v4.4) # All leading spaces from the first line after a timestamp are # removed. If the first line only contains spaces it leaves an # empty line. with open(filepath, encoding='utf-8') as f: webvtt = f.read() new_webvtt = re.sub(r'(?<=\n\n)' # check for empty line behind r'([0-9.:]+ --> [0-9.:]+\n)' # timestamp r'\n' # broken empty line r'(?: +\n)* *', # leading whitespaces r'\1', webvtt) if webvtt != new_webvtt: filepath = _convert_filepath(info, files_to_delete, filepath, 'vtt', type_='fix') with open(filepath, 'w', encoding='utf-8') as f: f.write(new_webvtt) new_subtitles[lang] = {**sub, 'filepath': filepath, 'ext': 'vtt'} info['requested_subtitles'] = new_subtitles return files_to_delete, info class ThumbnailConverterPP(FFmpegPostProcessor): """Convert thumbnail to JPEG and if required decrease resolution""" def __init__(self, thumbnail_callback=None): super().__init__() self._thumbnail_callback = thumbnail_callback def run(self, info): files_to_delete = [] new_thumbnails = [] # Thumbnails are ordered worst to best for thumb in reversed(info.get('thumbnails') or []): filepath = thumb.get('filepath') if not filepath: continue if new_thumbnails: # Convert only one thumbnail files_to_delete.append(filepath) continue if not os.path.isfile(filepath): log('Skipping missing thumbnail (%r)', thumb.get('id')) continue log('Converting thumbnail (%r)', thumb.get('id')) # Try to convert thumbnail with ffmpeg new_filepath = _convert_filepath(info, files_to_delete, filepath, 'jpg') try: # FFmpeg uses % pattern for image input and output files self.real_run_ffmpeg( # Disable pattern matching for input file [(filepath, ['-f', 'image2', '-pattern_type', 'none'])], # Escape % for output file [(new_filepath.replace('%', '%%'), [ '-vf', ('scale=\'min({0},iw):min({0},ih):' 'force_original_aspect_ratio=decrease\'' ).format(MAX_THUMBNAIL_RESOLUTION)])]) except FFmpegPostProcessorError: files_to_delete.append(new_filepath) continue filepath = new_filepath new_thumbnails.insert(0, {**thumb, 'filepath': filepath}) if self._thumbnail_callback is not None: self._thumbnail_callback(os.path.abspath(filepath)) info['thumbnails'] = new_thumbnails return files_to_delete, info class RetryException(BaseException): pass class YoutubeDLSlave: def _on_progress(self, d): if d['status'] not in ['downloading', 'finished']: return filename = d['filename'] bytes_ = d.get('downloaded_bytes') if bytes_ is None: bytes_ = -1 bytes_total = d.get('total_bytes') if bytes_total is None: bytes_total = d.get('total_bytes_estimate') if bytes_total is None: bytes_total = -1 if d['status'] == 'downloading': fragments = d.get('fragment_index') if fragments is None: fragments = -1 fragments_total = d.get('fragment_count') if fragments_total is None: fragments_total = -1 if bytes_ >= 0 and bytes_total >= 0: progress = bytes_ / bytes_total if bytes_total > 0 else -1 elif fragments >= 0 and fragments_total >= 0: progress = (fragments / fragments_total if fragments_total > 0 else -1) else: progress = -1 eta = d.get('eta') if eta is None: eta = -1 speed = d.get('speed') if speed is None: speed = -1 speed = round(speed) elif d['status'] == 'finished': progress = -1 eta = -1 speed = -1 self._handler.on_progress(filename, progress, bytes_, bytes_total, eta, speed) def _load_playlist(self, url): '''Retrieve info for all videos available on URL. Returns the absolute paths of the generated and downloaded files: ([info_dict, ...], skipped videos) ''' with tempfile.TemporaryDirectory() as temp_dir: os.chdir(temp_dir) while True: ydl_opts = {**self.ydl_opts, 'writeinfojson': True, 'skip_download': True, 'outtmpl': '%(autonumber)s.%(ext)s'} saved_skipped_count = self._skipped_count try: with yt_dlp.YoutubeDL(ydl_opts) as ydl: for args in self.extra_postprocessors: ydl.add_post_processor(*args) ydl.download([url]) except RetryException: continue break info_dicts = [] for filename in sorted(os.listdir(temp_dir)): if re.fullmatch(r'[0-9]+\.info\.json', filename): with open(os.path.join(temp_dir, filename), encoding='utf-8') as f: info_dicts.append(json.load(f)) return info_dicts, self._skipped_count - saved_skipped_count def _load_video(self, dir_, info_path): class GetFilepathPP(PostProcessor): def run(self, info): nonlocal filepath filepath = info['filepath'] return [], info filepath = None os.chdir(dir_) while True: try: with yt_dlp.YoutubeDL(self.ydl_opts) as ydl: for args in self.extra_postprocessors: ydl.add_post_processor(*args) ydl.add_post_processor(GetFilepathPP()) ydl.download_with_info_file(info_path) except RetryException: continue break return os.path.abspath(filepath) def debug(self, msg): print(msg, file=sys.stderr, flush=True) def warning(self, msg): print(msg, file=sys.stderr, flush=True) def error(self, msg): print(msg, file=sys.stderr, flush=True) traceback.print_exc(file=sys.stderr) sys.stderr.flush() # Handle authentication requests if (self._allow_authentication_request and re.search(r'\b[Ss]ign in\b|--username', msg)): if self._skip_authentication: self._skipped_count += 1 return user, password = self._handler.on_login_request() if not user and not password: self._skip_authentication = True self._skipped_count += 1 return self.ydl_opts['username'] = user self.ydl_opts['password'] = password self._allow_authentication_request = False raise RetryException(msg) if self._allow_authentication_request and '--video-password' in msg: if self._skip_authentication: self._skipped_count += 1 return password = self._handler.on_password_request() if not password: self._skip_authentication = True self._skipped_count += 1 return self.ydl_opts['videopassword'] = password self._allow_authentication_request = False raise RetryException(msg) # Skip unavailable videos if 'Video unavailable.' in msg: self._skipped_count += 1 return # Ignore missing xattr support if 'This filesystem doesn\'t support extended attributes.' in msg: return self._handler.on_error(msg) sys.exit(1) @staticmethod def _find_existing_download(download_dir, output_title, mode): for filepath in glob.iglob(glob.escape( os.path.join(download_dir, output_title)) + '.*'): filename = os.path.basename(filepath) file_title, file_ext = os.path.splitext(filename) if file_title == output_title and ( mode == 'audio' and file_ext.lower() == '.mp3' or mode != 'audio') and ( os.path.isfile(filepath)): return filename return None def __init__(self, handler): self._handler = handler self._allow_authentication_request = True self._skip_authentication = False self._skipped_count = 0 self.ydl_opts = { 'logger': self, 'logtostderr': True, 'no_color': True, 'progress_hooks': [self._on_progress], 'fixup': 'detect_or_warn', 'ignoreerrors': True, # handled via logger error callback 'retries': 10, 'fragment_retries': 10, 'subtitleslangs': ['all'], 'subtitlesformat': 'vtt/best', 'keepvideo': True, 'allow_playlist_files': False, # no info.json files for playlists # Include id and format_id in outtmpl to prevent yt-dlp # from continuing wrong file 'outtmpl': '%(id)s.%(format_id)s.%(ext)s', 'postprocessors': [ {'key': 'FFmpegMetadata'}, {'key': 'FFmpegEmbedSubtitle'}, {'key': 'XAttrMetadata'}]} self.extra_postprocessors = [ (ThumbnailConverterPP(self._handler.on_download_thumbnail), 'before_dl'), (SubtitlesConverterPP(), 'before_dl')] mode = self._handler.get_mode() if mode == 'audio': self.ydl_opts['format'] = 'bestaudio/best' self.ydl_opts['postprocessors'].insert(0, { 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192'}) self.ydl_opts['postprocessors'].insert(1, { 'key': 'EmbedThumbnail', 'already_have_thumbnail': True}) else: self.ydl_opts['format_sort'] = [ 'res~%d' % self._handler.get_resolution()] if self._handler.get_prefer_mpeg(): self.ydl_opts['format_sort'].append('+codec:avc:m4a') url = self._handler.get_url() download_dir = os.path.abspath(self._handler.get_download_dir()) requested_automatic_subtitles = set( self._handler.get_automatic_subtitles()) with tempfile.TemporaryDirectory() as temp_dir: self.ydl_opts['cookiefile'] = os.path.join(temp_dir, 'cookies') self.ydl_opts['playlistend'] = 2 # Test playlist info_testplaylist, skipped_testplaylist = self._load_playlist(url) self.ydl_opts['noplaylist'] = True if len(info_testplaylist) + skipped_testplaylist > 1: info_noplaylist, skipped_noplaylist = self._load_playlist(url) else: info_noplaylist = info_testplaylist skipped_noplaylist = skipped_testplaylist del self.ydl_opts['noplaylist'] del self.ydl_opts['playlistend'] if (len(info_testplaylist) + skipped_testplaylist > len(info_noplaylist) + skipped_noplaylist): self.ydl_opts['noplaylist'] = ( not self._handler.on_playlist_request()) if not self.ydl_opts['noplaylist']: info_playlist, _ = self._load_playlist(url) else: info_playlist = info_noplaylist elif len(info_testplaylist) + skipped_testplaylist > 1: info_playlist, _ = self._load_playlist(url) else: info_playlist = info_testplaylist # Download videos self._allow_authentication_request = False self.ydl_opts['writesubtitles'] = True self.ydl_opts['writeautomaticsub'] = True self.ydl_opts['writethumbnail'] = True for i, info in enumerate(info_playlist): title = info.get('title') or info.get('id') or 'video' output_title = _short_filename(title, MAX_OUTPUT_TITLE_LENGTH) self._handler.on_download_start(i, len(info_playlist), title) # Lock download name to prevent other instances from # writing to the same files while not self._handler.on_download_lock(output_title): time.sleep(1) automatic_captions = info.get('automatic_captions') or {} skip_captions = {*(info.get('subtitles') or {})} new_automatic_captions = {} for lang, subs in automatic_captions.items(): if lang in skip_captions: continue for requested_lang in requested_automatic_subtitles: if requested_lang == 'all' or requested_lang == lang: break # Translated subtitles if (lang.startswith(requested_lang+'-') and requested_lang not in skip_captions and requested_lang not in automatic_captions): skip_captions.add(requested_lang) break else: continue new_automatic_captions[lang] = subs if automatic_captions != new_automatic_captions: info['_backup_automatic_captions'] = automatic_captions info['automatic_captions'] = new_automatic_captions # Check if we already got the file existing_filename = self._find_existing_download( download_dir, output_title, mode) if existing_filename is not None: self._handler.on_download_finished(existing_filename) continue # Download into separate directory because yt-dlp generates # many temporary files temp_download_dir = os.path.join( download_dir, output_title + '.part') try: with contextlib.suppress(FileExistsError): os.mkdir(temp_download_dir) except OSError as e: traceback.print_exc(file=sys.stderr) sys.stderr.flush() self._handler.on_error( 'ERROR: Failed to create download folder: %s' % e) sys.exit(1) if len(info.get('id', '')) > MAX_ID_LENGTH: info['id'] = info.get( 'id', '')[:max(0, MAX_ID_LENGTH - 1)] + '…' info_path = os.path.join( temp_download_dir, sanitize_filename((info.get('id') or '') + '.info.json')) with open(info_path, 'w', encoding='utf-8') as f: json.dump(info, f) temp_filepath = self._load_video(temp_download_dir, info_path) _, filename_ext = os.path.splitext(temp_filepath) filename = output_title + filename_ext # Move finished download from download to target dir try: os.replace(temp_filepath, os.path.join(download_dir, filename)) except OSError as e: traceback.print_exc(file=sys.stderr) sys.stderr.flush() self._handler.on_error(( 'ERROR: Falied to move finished download to ' 'download folder: %s') % e) sys.exit(1) # Delete download directory with contextlib.suppress(OSError): shutil.rmtree(temp_download_dir) self._handler.on_download_finished(filename) video-downloader-0.12.31/src/main.py000066400000000000000000000073361516223405600172220ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import gettext import sys from gi.repository import Adw, Gio, GLib from video_downloader.util import gobject_log from video_downloader.util.connection import ( CloseStack, SignalConnection, create_action) from video_downloader.window import Window N_ = gettext.gettext class Application(Adw.Application): def __init__(self): super().__init__(application_id='com.github.unrud.VideoDownloader', flags=Gio.ApplicationFlags.FLAGS_NONE) self._cs = CloseStack() self.add_main_option( 'url', ord('u'), GLib.OptionFlags.NONE, GLib.OptionArg.STRING, N_('Prefill URL field'), 'URL') GLib.set_application_name(N_('Video Downloader')) def do_startup(self): Adw.Application.do_startup(self) self._cs.push(SignalConnection( self, 'shutdown', self._cs.close, no_args=True)) self.settings = gobject_log( Gio.Settings.new(self.props.application_id)) # Setup actions create_action(self, self._cs, 'new-window', lambda _, param: self._new_window(param.get_string()), parameter_type=GLib.VariantType('s')) create_action(self, self._cs, 'quit', self._quit, no_args=True) self._cs.push(SignalConnection( self, 'window-removed', lambda _, win: win.destroy())) def _quit(self): for win in self.get_windows(): win.close() def _new_window(self, url=''): win = gobject_log(Window(self)) win.set_default_icon_name(self.props.application_id) model = win.model model.url = url # Apply/Bind settings self.settings.bind('download-folder', model, 'download-folder', Gio.SettingsBindFlags.DEFAULT) self.settings.bind('prefer-mpeg', model, 'prefer-mpeg', ( Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.GET_NO_CHANGES)) self.settings.bind('automatic-subtitles', model, 'automatic-subtitles', Gio.SettingsBindFlags.DEFAULT) self.settings.bind('mode', model, 'mode', ( Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.GET_NO_CHANGES)) resolution = self.settings.get_uint('resolution') model.resolution = sorted(model.resolutions, key=lambda x: abs(x - resolution))[0] self.settings.bind('resolution', model, 'resolution', Gio.SettingsBindFlags.SET) win.present() def do_activate(self): self._new_window() def do_handle_local_options(self, options): url_variant = options.lookup_value('url', GLib.VariantType('s')) if url_variant: self.register() self.activate_action('new-window', url_variant) return 0 return -1 def main(version): app = gobject_log(Application()) return app.run(sys.argv) video-downloader-0.12.31/src/meson.build000066400000000000000000000040061516223405600200550ustar00rootroot00000000000000pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name() moduledir = pkgdatadir / 'video_downloader' release_notes = run_command([ python, extract_xml_aux, '--escape', '..' / 'data' / 'com.github.unrud.VideoDownloader.metainfo-releases.xml.in', './/release[@version="' + meson.project_version() + '"]/description/*'], check: true, ).stdout() conf = configuration_data() conf.set('VERSION', meson.project_version()) conf.set('releasenotes', release_notes) about_dialog_ui_source = configure_file( input: 'about_dialog.ui.in', output: 'about_dialog.ui', configuration: conf, ) video_downloader_ui_sources = [ files([ 'authentication_dialog_login.ui', 'authentication_dialog_password.ui', 'shortcuts_dialog.ui', 'window.ui', ]), about_dialog_ui_source, ] video_downloader_gresource_xml = configure_file( capture: true, command: [python, create_gresource_aux, '/com/github/unrud/VideoDownloader', video_downloader_ui_sources], output: 'video_downloader.gresource.xml', ) gnome.compile_resources('video-downloader', video_downloader_gresource_xml, gresource_bundle: true, install: true, install_dir: pkgdatadir, ) conf = configuration_data() conf.set('PYTHON', python.full_path()) conf.set_quoted('VERSION', meson.project_version()) conf.set_quoted('localedir', get_option('prefix') / get_option('localedir')) conf.set_quoted('pkgdatadir', pkgdatadir) video_downloader_bin = configure_file( input: 'video-downloader.in', output: 'video-downloader', configuration: conf, install: true, install_dir: get_option('bindir'), install_mode: 'r-xr-xr-x', ) python_sources_for_linting += video_downloader_bin video_downloader_sources = files([ '__init__.py', 'about_dialog.py', 'authentication_dialog.py', 'main.py', 'model.py', 'playlist_dialog.py', 'shortcuts_dialog.py', 'window.py', ]) python_sources_for_linting += video_downloader_sources install_data(video_downloader_sources, install_dir: moduledir) subdir('downloader') subdir('util') video-downloader-0.12.31/src/model.py000066400000000000000000000312641516223405600173730ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import collections import gettext import os import traceback import typing from gi.repository import Gio, GLib, GObject from video_downloader import downloader from video_downloader.downloader import MAX_RESOLUTION from video_downloader.util import g_log, gobject_log, languages_from_locale from video_downloader.util.connection import (CloseStack, PropertyBinding, SignalConnection) from video_downloader.util.path import expand_path, open_in_file_manager from video_downloader.util.response import AsyncResponse, Response N_ = gettext.gettext class Model(GObject.GObject, downloader.HandlerInterface): __gsignals__ = { 'download-pulse': (GObject.SIGNAL_RUN_FIRST, None, ()) } state = GObject.Property(type=str, default='start') mode = GObject.Property(type=str, default='audio') url = GObject.Property(type=str) error = GObject.Property(type=str) resolution = GObject.Property(type=GObject.TYPE_UINT, default=1080) download_folder = GObject.Property(type=str) # absolute path to dir of active/finished download (empty if no download) finished_download_dir = GObject.Property(type=str) # TYPE_STRV is None by default, empty list can be None or [] finished_download_filenames = GObject.Property(type=GObject.TYPE_STRV) automatic_subtitles = GObject.Property(type=GObject.TYPE_STRV) prefer_mpeg = GObject.Property(type=bool, default=False) download_playlist_index = GObject.Property(type=GObject.TYPE_INT64) download_playlist_count = GObject.Property(type=GObject.TYPE_INT64) download_filename = GObject.Property(type=str) download_title = GObject.Property(type=str) download_titles = GObject.Property(type=GObject.TYPE_STRV) download_thumbnail = GObject.Property(type=str) # 0.0 - 1.0 (inclusive), negative if unknown: download_progress = GObject.Property(type=float, default=-1) download_bytes = GObject.Property(type=GObject.TYPE_INT64, default=-1) download_bytes_total = GObject.Property(type=GObject.TYPE_INT64, default=-1) download_speed = GObject.Property(type=GObject.TYPE_INT64, default=-1) download_eta = GObject.Property(type=GObject.TYPE_INT64, default=-1) resolutions = collections.OrderedDict([ (MAX_RESOLUTION, N_('Best')), (4320, N_('4320p (8K)')), (2160, N_('2160p (4K)')), (1440, N_('1440p (HD)')), (1080, N_('1080p (HD)')), (720, N_('720p (HD)')), (480, N_('480p')), (360, N_('360p')), (240, N_('240p')), (144, N_('144p'))]) _global_download_lock = set() def __init__(self, handler=None): super().__init__() self._cs = CloseStack() self._handler = handler self._cs.add_close_callback(setattr, self, '_handler', None) self._downloader = downloader.Downloader(self) self._cs.add_close_callback(self._downloader.destroy) self._active_download_lock = None self.actions = gobject_log(Gio.SimpleActionGroup.new()) for action_name, callback, *extra_args in [ ('download', self.set_property, 'state', 'prepare'), ('cancel', self.set_property, 'state', 'cancel'), ('back', self.set_property, 'state', 'start'), ('open-finished-download-dir', self._open_finished_download_dir)]: action = gobject_log(Gio.SimpleAction.new(action_name), action_name) self._cs.push(SignalConnection( action, 'activate', callback, *extra_args, no_args=True)) self.actions.add_action(action) def update_download_action_enabled(): self.actions.lookup_action('download').set_property( 'enabled', bool(self.url) and self._is_valid_state_transition(self.state, 'prepare')) for name in ['state', 'url']: self._cs.push(SignalConnection( self, 'notify::' + name, update_download_action_enabled, no_args=True)) update_download_action_enabled() self._cs.push(PropertyBinding( self, 'state', self.actions.lookup_action('cancel'), 'enabled', lambda state: self._is_valid_state_transition(state, 'cancel'))) self._cs.push(PropertyBinding( self, 'state', self.actions.lookup_action('back'), 'enabled', lambda state: self._is_valid_state_transition(state, 'start'))) self._cs.push(PropertyBinding( self, 'state', self.actions.lookup_action('open-finished-download-dir'), 'enabled', lambda state: state == 'success')) self._prev_state = None self._cs.push(PropertyBinding( self, 'state', func_a_to_b=self._state_transition)) @staticmethod def _is_valid_state_transition(state, next_state): if next_state == 'start': return state not in ['start', 'download'] if next_state == 'prepare': return state == 'start' if next_state == 'download': return state == 'prepare' if next_state in ['cancel', 'success', 'error']: return state == 'download' return False def _state_transition(self, state): if self._prev_state == state: return if not self._is_valid_state_transition(self._prev_state, state): self.state = self._prev_state assert False, 'invalid state transition %r -> %r' % ( self._prev_state, state) return self._prev_state = state if state == 'prepare': self.error = '' self.download_playlist_index = 0 self.download_playlist_count = 0 self.download_filename = '' self.download_title = '' self.download_titles = None self.download_thumbnail = '' self.download_progress = -1 self.download_bytes = -1 self.download_bytes_total = -1 self.download_speed = -1 self.download_eta = -1 self.finished_download_filenames = None self.finished_download_dir = '' self._try_start_download() if state == 'download': self._downloader.start() if state == 'cancel': self._downloader.cancel() def _open_finished_download_dir(self): assert self.finished_download_dir open_in_file_manager(self.finished_download_dir, self.finished_download_filenames or []) def _try_start_download(self): path = expand_path(self.download_folder) message = check_download_dir(path, create=True) if message is None: self.finished_download_dir = path self.state = 'download' return response = self._handler.on_download_folder_error( N_('Invalid download folder'), message, path) def handle_response(response): if response.cancelled: self.state = 'start' else: self._try_start_download() response.add_done_callback(handle_response) def destroy(self): self._cs.close() def on_pulse(self): assert self.state in ['download', 'cancel'] self.emit('download-pulse') def on_finished(self, success): assert self.state in ['download', 'cancel'] self._download_unlock() if self.state == 'cancel': self.state = 'start' else: self.state = 'success' if success else 'error' def get_download_dir(self): assert self.state in ['download', 'cancel'] return self.finished_download_dir def get_prefer_mpeg(self): assert self.state in ['download', 'cancel'] return self.prefer_mpeg def get_automatic_subtitles(self): assert self.state in ['download', 'cancel'] return [*languages_from_locale(), *(self.automatic_subtitles or [])] def get_url(self): assert self.state in ['download', 'cancel'] return self.url def get_mode(self): assert self.state in ['download', 'cancel'] return self.mode def get_resolution(self): assert self.state in ['download', 'cancel'] return self.resolution def _forward_response(self, response): def callback(response): if response.cancelled: self.state = 'cancel' if isinstance(response, AsyncResponse): response.add_done_callback(callback) if self.state == 'cancel': response.cancel() return response def on_playlist_request(self): assert self.state in ['download', 'cancel'] return self._forward_response(self._handler.on_playlist_request()) def on_login_request(self): assert self.state in ['download', 'cancel'] return self._forward_response(self._handler.on_login_request()) def on_password_request(self): assert self.state in ['download', 'cancel'] return self._forward_response(self._handler.on_password_request()) def on_error(self, msg): assert self.state in ['download', 'cancel'] self.error = msg def on_progress(self, filename, progress, bytes_, bytes_total, eta, speed): assert self.state in ['download', 'cancel'] self.download_filename = filename self.download_progress = progress self.download_bytes = bytes_ self.download_bytes_total = bytes_total self.download_eta = eta self.download_speed = speed def on_download_start(self, playlist_index, playlist_count, title): assert self.state in ['download', 'cancel'] self.download_playlist_index = playlist_index self.download_playlist_count = playlist_count self.download_title = title self.download_titles = [*(self.download_titles or []), title] def _download_unlock(self): if self._active_download_lock: self._global_download_lock.remove(self._active_download_lock) self._active_download_lock = None def on_download_lock(self, name): assert self.state in ['download', 'cancel'] assert self._active_download_lock is None if name in self._global_download_lock: return False self._global_download_lock.add(name) self._active_download_lock = name return True def on_download_thumbnail(self, thumbnail): assert self.state in ['download', 'cancel'] self.download_thumbnail = thumbnail def on_download_finished(self, filename): assert self.state in ['download', 'cancel'] self._download_unlock() self.finished_download_filenames = [ *(self.finished_download_filenames or []), filename] def check_download_dir(path: str, create: bool = False ) -> typing.Optional[str]: if create: try: os.makedirs(path, exist_ok=True) except FileExistsError: return N_('Not a directory') except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_DEBUG, '%s', traceback.format_exc()) return N_('Permission denied') elif not os.path.isdir(path): return N_('Not a directory') if not os.access(path, os.R_OK | os.W_OK | os.X_OK, effective_ids=os.access in os.supports_effective_ids): return N_('Permission denied') return None class HandlerInterface: def on_playlist_request(self) -> Response[bool]: raise NotImplementedError # user password def on_login_request(self) -> Response[typing.Tuple[str, str]]: raise NotImplementedError # password def on_password_request(self) -> Response[str]: raise NotImplementedError def on_download_folder_error(self, title: str, message: str ) -> Response[None]: raise NotImplementedError video-downloader-0.12.31/src/playlist_dialog.py000066400000000000000000000025511516223405600214500ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import gettext from gi.repository import Gtk N_ = gettext.gettext class PlaylistDialog(Gtk.MessageDialog): def __init__(self, parent): super().__init__(modal=True, destroy_with_parent=True, message_type=Gtk.MessageType.QUESTION, text=N_('Download Playlist?'), secondary_text=N_('The video is part of a playlist.')) self.set_transient_for(parent) self.add_button(N_('Single Video'), Gtk.ResponseType.NO) self.add_button(N_('All Videos in Playlist'), Gtk.ResponseType.YES) self.set_default_response(Gtk.ResponseType.NO) video-downloader-0.12.31/src/shortcuts_dialog.py000066400000000000000000000020741516223405600216450ustar00rootroot00000000000000# Copyright (C) 2022 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . from gi.repository import Gtk @Gtk.Template(resource_path='/com/github/unrud/VideoDownloader/' 'shortcuts_dialog.ui') class ShortcutsDialog(Gtk.ShortcutsWindow): __gtype_name__ = 'VideoDownloaderShortcutsDialog' def __init__(self, parent): super().__init__() self.set_transient_for(parent) video-downloader-0.12.31/src/shortcuts_dialog.ui000066400000000000000000000070121516223405600216270ustar00rootroot00000000000000 video-downloader-0.12.31/src/util/000077500000000000000000000000001516223405600166705ustar00rootroot00000000000000video-downloader-0.12.31/src/util/__init__.py000066400000000000000000000036071516223405600210070ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import locale import os from gi.repository import GLib def gobject_log(obj, info=None): DOMAIN = 'gobject-ref' LEVEL = GLib.LogLevelFlags.LEVEL_DEBUG name = repr(obj) if info: name += ' (' + str(info) + ')' g_log(DOMAIN, LEVEL, 'Create %s', name) obj.weak_ref(g_log, DOMAIN, LEVEL, 'Destroy %s', name) return obj def g_log(domain, log_level, format_string, *args): fields = GLib.Variant('a{sv}', { 'MESSAGE': GLib.Variant('s', format_string % args)}) GLib.log_variant(domain, log_level, fields) def languages_from_locale(): locale_languages = [] for envar in ['LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG']: val = os.environ.get(envar) if val: locale_languages.extend(val.split(':')) break if 'C' not in locale_languages: locale_languages.append('C') languages = [] for lang in locale_languages: lang = locale.normalize(lang) for sep in ['@', '.', '_']: lang = lang.split(sep, maxsplit=1)[0] if lang == 'C': lang = 'en' if lang not in languages: languages.append(lang) return languages video-downloader-0.12.31/src/util/connection.py000066400000000000000000000130251516223405600214020ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import functools import math import time import traceback from collections import OrderedDict from gi.repository import Gio, GLib, GObject from video_downloader.util import g_log, gobject_log class Closable: def __init__(self): self.__closed = False self.__close_callbacks = [] @property def closed(self): return self.__closed def add_close_callback(self, callback, *args, **kwargs): self.__close_callbacks.append( functools.partial(callback, *args, **kwargs)) if self.closed: self.close() def close(self): self.__closed = True while self.__close_callbacks: try: self.__close_callbacks[-1]() except Exception: g_log(None, GLib.LogLevelFlags.LEVEL_CRITICAL, '%s', traceback.format_exc()) del self.__close_callbacks[-1] def __del__(self): self.close() class CloseStack(Closable): def __init__(self): super().__init__() self.__key = 0 self.__closables = OrderedDict() def push(self, closable): assert not self.closed, 'closed' self.__closables[self.__key] = closable closable.add_close_callback(self.__closables.pop, self.__key) self.__key += 1 return closable def close(self): while self.__closables: key = next(reversed(self.__closables)) self.__closables[key].close() super().close() class SignalConnection(Closable): def __init__(self, obj, signal_name, callback, *extra_args, no_args=False): super().__init__() def on_notify(*args): if no_args: args = [] return callback(*args, *extra_args) handler = obj.connect(signal_name, on_notify) self.add_close_callback(obj.disconnect, handler) class PropertyBinding(Closable): def __init__(self, obj_a, prop_a, obj_b=None, prop_b=None, func_a_to_b=None, func_b_to_a=None, bi=False): super().__init__() self.__frozen = False if not func_a_to_b and not func_b_to_a: binding = GObject.Binding.bind_property( obj_a, prop_a, obj_b, prop_b, GObject.BindingFlags.SYNC_CREATE | ( GObject.BindingFlags.BIDIRECTIONAL if bi else GObject.BindingFlags.DEFAULT)) self.add_close_callback(binding.unbind) return try: connection_a_to_b = SignalConnection( obj_a, 'notify::' + prop_a, self.__apply, obj_a, prop_a, obj_b, prop_b, func_a_to_b, no_args=True) self.add_close_callback(connection_a_to_b.close) if bi: connection_b_to_a = SignalConnection( obj_b, 'notify::' + prop_b, self.__apply, obj_b, prop_b, obj_a, prop_a, func_b_to_a, no_args=True) self.add_close_callback(connection_b_to_a.close) except BaseException: self.close() raise self.__apply(obj_a, prop_a, obj_b, prop_b, func_a_to_b) def __apply(self, src_obj, src_prop, dest_obj, dest_prop, to_func): if self.__frozen: return value = src_obj.get_property(src_prop) if to_func: value = to_func(value) if dest_obj and value is not None: self.__frozen = True try: dest_obj.set_property(dest_prop, value) finally: self.__frozen = False class RateLimit(Closable): def __init__(self, func, seconds=0): super().__init__() self.__seconds = seconds self.__func = func self.__last_call = 0 self.__timeout = None def cleanup_timeout(): if self.__timeout is None: return GLib.Source.remove(self.__timeout) self.__timeout = None self.add_close_callback(cleanup_timeout) def __call__(self): if self.__timeout is not None or self.closed: return timeout = max(self.__seconds - (time.monotonic() - self.__last_call), 0) self.__timeout = GLib.timeout_add( math.ceil(timeout * 1000), self.__handle_timeout) def __handle_timeout(self): self.__func() self.__last_call = time.monotonic() self.__timeout = None return False def create_action(action_group, closable, name, callback, *extra_args, parameter_type=None, no_args=False): action = gobject_log(Gio.SimpleAction.new(name, parameter_type), name) closable.push(SignalConnection( action, 'activate', callback, *extra_args, no_args=no_args)) action_group.add_action(action) closable.add_close_callback(action_group.remove_action, name) video-downloader-0.12.31/src/util/meson.build000066400000000000000000000003641516223405600210350ustar00rootroot00000000000000video_downloader_sources = files([ 'connection.py', '__init__.py', 'path.py', 'response.py', 'rpc.py', ]) python_sources_for_linting += video_downloader_sources install_data(video_downloader_sources, install_dir: moduledir / 'util') video-downloader-0.12.31/src/util/path.py000066400000000000000000000124611516223405600202020ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import os import subprocess import sys import traceback from gi.repository import Gio, GLib from video_downloader.util import g_log, gobject_log def expand_path(path): parts = path.replace(os.altsep or os.sep, os.sep).split(os.sep) home_dir = os.path.expanduser('~') if parts[0] == '~': parts[0] = home_dir elif parts[0].startswith('xdg-'): name = parts[0][len('xdg-'):].replace('-', '').upper() try: parts[0] = subprocess.check_output( ['xdg-user-dir', name], universal_newlines=True, stdin=subprocess.DEVNULL).splitlines()[0] except FileNotFoundError: parts[0] = home_dir return os.path.normpath(os.path.join(os.sep, *parts)) def encode_filesystem_path(path): return path.encode(sys.getfilesystemencoding(), sys.getfilesystemencodeerrors()) def decode_filesystem_path(path): return path.decode(sys.getfilesystemencoding(), sys.getfilesystemencodeerrors()) def open_in_file_manager(directory, filenames): # org.freedesktop.portal.Documents portal_documents_proxy = gobject_log(Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS | Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION, None, 'org.freedesktop.portal.Documents', '/org/freedesktop/portal/documents', 'org.freedesktop.portal.Documents')) try: documents_mount_point = decode_filesystem_path( portal_documents_proxy.call_sync( 'GetMountPoint', None, Gio.DBusCallFlags.NONE, -1 ).get_child_value(0).get_bytestring()) except GLib.Error: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) else: directory_in_documents_portal = os.path.normpath(directory).startswith( os.path.normpath(documents_mount_point)+os.sep) if directory_in_documents_portal: # WORAROUND: Subpaths in the documents portal are not translated filenames = [] # org.freedesktop.portal.OpenURI portal_open_uri_proxy = gobject_log(Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS | Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION, None, 'org.freedesktop.portal.Desktop', '/org/freedesktop/portal/desktop', 'org.freedesktop.portal.OpenURI')) fdlist = gobject_log(Gio.UnixFDList()) for filename in filenames: path = os.path.join(directory, filename) try: fd = os.open(path, os.O_RDONLY) except OSError: g_log(None, GLib.LogLevelFlags.LEVEL_DEBUG, '%s', traceback.format_exc()) continue break else: path = directory try: fd = os.open(path, os.O_RDONLY) except OSError: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) return try: handle = fdlist.append(fd) finally: os.close(fd) try: parameters = GLib.Variant('(sha{sv})', ('', handle, {})) portal_open_uri_proxy.call_with_unix_fd_list_sync( 'OpenDirectory', parameters, Gio.DBusCallFlags.NONE, -1, fdlist) except GLib.Error: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) else: return # org.freedesktop.FileManager1 filemanager_proxy = gobject_log(Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES | Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS | Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION, None, 'org.freedesktop.FileManager1', '/org/freedesktop/FileManager1', 'org.freedesktop.FileManager1')) method = 'ShowFolders' if path == directory else 'ShowItems' parameters = GLib.Variant( '(ass)', ([Gio.File.new_for_path(path).get_uri()], '')) try: filemanager_proxy.call_sync( method, parameters, Gio.DBusCallFlags.NONE, -1) except GLib.Error: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) else: return # xdg-open try: subprocess.run(['xdg-open', directory], check=True) except subprocess.SubprocessError: g_log(None, GLib.LogLevelFlags.LEVEL_WARNING, '%s', traceback.format_exc()) else: return video-downloader-0.12.31/src/util/response.py000066400000000000000000000050001516223405600210730ustar00rootroot00000000000000# Copyright (C) 2019-2020 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import typing from video_downloader.util.connection import Closable _R = typing.TypeVar('R') class AsyncResponse(typing.Generic[_R], Closable): def __init__(self) -> None: super().__init__() self.__done = False self.__cancelled = False self.__result = None @property def done(self) -> bool: return self.__done @property def cancelled(self) -> bool: return self.__cancelled @property def result(self) -> typing.Optional[_R]: return self.__result def add_done_callback(self, callback: typing.Callable[ ["AsyncResponse[_R]"], None]) -> None: self.add_close_callback(callback, self) def set_result(self, result: _R) -> None: assert not self.done, 'done' self.__result = result self.__done = True self.close() def cancel(self) -> None: assert not self.done, 'done' self.close() def chain(self, chained_response: "AsyncResponse[_R]" ) -> "AsyncResponse[_R]": def callbackChain(response): assert response.done if not response.cancelled: chained_response.set_result(response.result) elif not chained_response.cancelled: chained_response.cancel() self.add_done_callback(callbackChain) def callbackCancel(chained_response): assert chained_response.done if not self.done: assert chained_response.cancelled self.cancel() chained_response.add_done_callback(callbackCancel) def close(self): if not self.done: self.__cancelled = True self.__done = True super().close() Response = typing.Union[_R, AsyncResponse[_R]] video-downloader-0.12.31/src/util/rpc.py000066400000000000000000000037511516223405600200340ustar00rootroot00000000000000# Copyright (C) 2023 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import functools import json class RpcClient: def __init__(self, output_file, input_file=None): self._output_file = output_file self._input_file = input_file def _rpc(self, name, *args): print(json.dumps({'method': name, 'args': args}), file=self._output_file, flush=True) if self._input_file is None: return None answer = json.loads(self._input_file.readline()) return answer['result'] def __getattr__(self, name): return functools.partial(self._rpc, name) def handle_rpc_request(interface, implementation, json_request): request = json.loads(json_request) # Validate request if (not isinstance(request, dict) or not isinstance(request.get('method'), str) or not isinstance(request.get('args'), list)): raise ValueError('invalid request format') if request['method'].startswith('_'): raise ValueError('invalid method name: %r' % request['method']) if not hasattr(interface, request['method']): raise ValueError('unknown method: %r' % request['method']) # Execute request return getattr(implementation, request['method'])(*request['args']) def rpc_response(result): return json.dumps({'result': result}) video-downloader-0.12.31/src/video-downloader.in000066400000000000000000000031361516223405600215100ustar00rootroot00000000000000#!@PYTHON@ # Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import contextlib import gettext import locale import os import signal import sys VERSION = @VERSION@ pkgdatadir = @pkgdatadir@ localedir = @localedir@ sys.path.insert(1, pkgdatadir) signal.signal(signal.SIGINT, signal.SIG_DFL) locale.bindtextdomain('video-downloader', localedir) locale.textdomain('video-downloader') gettext.bindtextdomain('video-downloader', localedir) gettext.textdomain('video-downloader') with contextlib.suppress(locale.Error): locale.setlocale(locale.LC_ALL, '') if __name__ == '__main__': import gi gi.require_version('Gdk', '4.0') gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gio resource = Gio.Resource.load(os.path.join( pkgdatadir, 'video-downloader.gresource')) resource._register() from video_downloader import main sys.exit(main.main(VERSION)) video-downloader-0.12.31/src/window.py000066400000000000000000000460431516223405600176030ustar00rootroot00000000000000# Copyright (C) 2019-2021 Unrud # # This file is part of Video Downloader. # # Video Downloader 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. # # Video Downloader 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 Video Downloader. If not, see . import gettext import locale import math import os import uuid from gi.repository import Adw, GdkPixbuf, Gio, GLib, Gtk from video_downloader.about_dialog import build_about_dialog from video_downloader.authentication_dialog import LoginDialog, PasswordDialog from video_downloader.model import HandlerInterface, Model, check_download_dir from video_downloader.playlist_dialog import PlaylistDialog from video_downloader.shortcuts_dialog import ShortcutsDialog from video_downloader.util import gobject_log from video_downloader.util.connection import (CloseStack, PropertyBinding, RateLimit, SignalConnection, create_action) from video_downloader.util.path import expand_path, open_in_file_manager from video_downloader.util.response import AsyncResponse DOWNLOAD_IMAGE_SIZE = 128 MAX_ASPECT_RATIO = 2.39 N_ = gettext.gettext @Gtk.Template(resource_path='/com/github/unrud/VideoDownloader/window.ui') class Window(Adw.ApplicationWindow, HandlerInterface): __gtype_name__ = 'VideoDownloaderWindow' error_detail_wdg = Gtk.Template.Child() success_detail_wdg = Gtk.Template.Child() audio_url_wdg = Gtk.Template.Child() video_url_wdg = Gtk.Template.Child() resolution_wdg = Gtk.Template.Child() prefer_mpeg_wdg = Gtk.Template.Child() main_stack_wdg = Gtk.Template.Child() audio_video_stack_wdg = Gtk.Template.Child() audio_download_wdg = Gtk.Template.Child() video_download_wdg = Gtk.Template.Child() error_back_wdg = Gtk.Template.Child() success_back_wdg = Gtk.Template.Child() download_cancel_wdg = Gtk.Template.Child() finished_download_dir_wdg = Gtk.Template.Child() finished_download_titles_wdg = Gtk.Template.Child() download_page_title_wdg = Gtk.Template.Child() download_title_wdg = Gtk.Template.Child() download_progress_wdg = Gtk.Template.Child() download_info_wdg = Gtk.Template.Child() download_images_wdg = Gtk.Template.Child() def __init__(self, application): super().__init__(application=application) self._cs = CloseStack() self.application = application self.model = gobject_log(Model(self)) self._cs.add_close_callback(self.model.destroy) self.window_group = gobject_log(Gtk.WindowGroup()) self.window_group.add_window(self) # Setup actions for action_name in self.model.actions.list_actions(): self.add_action(self.model.actions.lookup_action(action_name)) self._cs.add_close_callback(self.remove_action, action_name) create_action(self, self._cs, 'close', self.destroy, no_args=True) create_action(self, self._cs, 'about', self._show_about_dialog, no_args=True) create_action(self, self._cs, 'shortcuts', self._show_shortcuts_dialog, no_args=True) create_action(self, self._cs, 'change-download-folder', self._change_download_folder, no_args=True) create_action( self, self._cs, 'set-audio-video-page', lambda _, param: self.audio_video_stack_wdg.set_visible_child_name( param.get_string()), parameter_type=GLib.VariantType('s')) # Register notifcation actions self._notification_uuid = str(uuid.uuid4()) create_action(application, self._cs, 'notification-success--' + self._notification_uuid, self.present, no_args=True) create_action(application, self._cs, 'notification-error--' + self._notification_uuid, self.present, no_args=True) create_action( application, self._cs, 'notification-open-finished-download-dir--' + self._notification_uuid, self.model.actions.activate_action, 'open-finished-download-dir', no_args=True) # Bind properties to UI self._cs.push(PropertyBinding( self.model, 'error', self.error_detail_wdg, 'label')) self._cs.push(PropertyBinding( self.model, 'url', self.audio_url_wdg, 'text', bi=True)) self._cs.push(PropertyBinding( self.model, 'url', self.video_url_wdg, 'text', bi=True)) for description in self.model.resolutions.values(): self.resolution_wdg.get_model().append(description) self._cs.push(PropertyBinding( self.model, 'resolution', self.resolution_wdg, 'selected', lambda r: list(self.model.resolutions).index(r), lambda i: list(self.model.resolutions)[i], bi=True)) self._cs.push(PropertyBinding( self.model, 'prefer-mpeg', self.prefer_mpeg_wdg, 'active', bi=True)) self._cs.push(PropertyBinding( self.model, 'state', self.main_stack_wdg, 'visible-child-name', func_a_to_b=lambda s: {'prepare': 'download', 'cancel': 'download'}.get(s, s))) self._cs.push(PropertyBinding( self.model, 'state', func_a_to_b=self._update_notification)) self._cs.push(PropertyBinding( self.model, 'mode', self.audio_video_stack_wdg, 'visible-child-name', bi=True)) self._cs.push(PropertyBinding( self.main_stack_wdg, 'visible-child-name', func_a_to_b=lambda _: self._update_focus_and_default())) self._cs.push(PropertyBinding( self.audio_video_stack_wdg, 'visible-child-name', func_a_to_b=lambda _: self._update_focus_and_default())) self._cs.push(PropertyBinding( self.model, 'finished-download-dir', func_a_to_b=self._update_finished_download_dir_wdg_tooltip)) update_download_msg_rate_limited = self._cs.push(RateLimit( self._update_download_msg, 1)) for name in ['download-bytes', 'download-bytes-total', 'download-speed', 'download-eta']: self._cs.push(SignalConnection( self.model, 'notify::' + name, update_download_msg_rate_limited, no_args=True)) self._cs.push(PropertyBinding( self.model, 'download-progress', func_a_to_b=lambda _: self._update_download_progress())) self._cs.push(SignalConnection( self.model, 'download-pulse', self._update_download_progress, no_args=True)) for name in ['download-playlist-count', 'download-playlist-index']: self._cs.push(PropertyBinding( self.model, name, func_a_to_b=lambda _: self._update_download_page_title())) self._cs.push(PropertyBinding( self.model, 'download-title', self.download_title_wdg, 'label', func_a_to_b=lambda title: title or '…')) self._cs.push(PropertyBinding( self.model, 'download-thumbnail', func_a_to_b=self._add_thumbnail)) self._cs.push(PropertyBinding( self.download_images_wdg, 'transition-running', func_a_to_b=lambda b: b or self._clean_thumbnails())) self._cs.push(PropertyBinding( self.model, 'download-titles', self.finished_download_titles_wdg, 'label', func_a_to_b=lambda titles: ' | '.join(titles or []))) self._cs.push(PropertyBinding( self.model, 'finished-download-filenames', self.success_detail_wdg, 'label', func_a_to_b=lambda filenames: '\n'.join( (f'' f'{s}' f'') for s in map(GLib.markup_escape_text, filenames or [])))) self._cs.push(SignalConnection( self.success_detail_wdg, 'activate_link', lambda sender, filename: open_in_file_manager( self.model.finished_download_dir, [filename]))) # Workaround for focusing AdwEntryRow at program startup self._cs.push(SignalConnection( self, 'show', self._update_focus_and_default, no_args=True)) def _update_download_progress(self): progress = self.model.download_progress if progress < 0: self.download_progress_wdg.pulse() else: self.download_progress_wdg.set_fraction(progress) def _update_download_page_title(self): playlist_count = self.model.download_playlist_count playlist_index = self.model.download_playlist_index s = N_('Downloading') if playlist_count > 1: s += ' (' + N_('{} of {}').format( playlist_index + 1, playlist_count) + ')' self.download_page_title_wdg.set_text(s) def _update_download_msg(self): def filesize_fmt(num, suffix='B'): for unit in ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']: if abs(num) < 1000: break num /= 1000 return locale.format_string('%.1f\u00A0%s%s', (num, unit, suffix)) bytes_ = self.model.download_bytes bytes_total = self.model.download_bytes_total speed = self.model.download_speed eta = self.model.download_eta eta_h = eta // 60 // 60 eta_m = eta // 60 % 60 eta_s = eta % 60 time_msg = '%d∶%02d∶%02d' % (eta_h, eta_m, eta_s) if eta >= 0 else '' size_msg = N_('{} of {}').format( filesize_fmt(bytes_) if bytes_ >= 0 else N_('unknown'), filesize_fmt(bytes_total) if bytes_total >= 0 else N_('unknown') ) if bytes_ >= 0 or bytes_total >= 0 else '' speed_msg = filesize_fmt(speed, 'B/\u2060s') if speed >= 0 else '' self.download_info_wdg.set_text( time_msg + ('\u00A0- ' if time_msg and (size_msg or speed_msg) else '') + size_msg + (f" ({speed_msg})" if size_msg and speed_msg else speed_msg)) def _add_thumbnail(self, thumbnail): try: pixbuf = gobject_log(GdkPixbuf.Pixbuf.new_from_file_at_size( thumbnail, math.ceil(DOWNLOAD_IMAGE_SIZE * MAX_ASPECT_RATIO), DOWNLOAD_IMAGE_SIZE)) except GLib.Error: img_wdg = gobject_log(Gtk.Image.new_from_icon_name( 'video-x-generic')) img_wdg.set_pixel_size(DOWNLOAD_IMAGE_SIZE) else: img_wdg = gobject_log(Gtk.Picture.new_for_pixbuf(pixbuf)) img_wdg.set_size_request(-1, DOWNLOAD_IMAGE_SIZE) self.download_images_wdg.add_child(img_wdg) self.download_images_wdg.set_visible_child(img_wdg) def _clean_thumbnails(self): visible_child_wdg = self.download_images_wdg.get_visible_child() for page in list(self.download_images_wdg.get_pages()): child_wdg = page.get_child() if child_wdg is not visible_child_wdg: self.download_images_wdg.remove(child_wdg) def _update_finished_download_dir_wdg_tooltip(self, download_dir): if download_dir: home_dir = os.path.expanduser('~') if os.path.commonpath([home_dir, download_dir]) == home_dir: download_dir = '~' + download_dir[len(home_dir):] self.finished_download_dir_wdg.set_tooltip_text(download_dir) def _update_focus_and_default(self): state = self.main_stack_wdg.get_visible_child_name() mode = self.audio_video_stack_wdg.get_visible_child_name() default_wdg = None if state == 'start': if mode == 'audio': default_wdg = self.audio_download_wdg self.audio_url_wdg.grab_focus() elif mode == 'video': default_wdg = self.video_download_wdg self.video_url_wdg.grab_focus() else: assert False, 'unreachable' elif state in ['download', 'cancel']: self.download_cancel_wdg.grab_focus() elif state == 'error': self.error_back_wdg.grab_focus() elif state == 'success': self.finished_download_dir_wdg.grab_focus() else: assert False, 'unreachable' self.set_default_widget(default_wdg) def _hide_notification(self): self.application.withdraw_notification(self._notification_uuid) def _update_notification(self, state): self._hide_notification() if state not in ('error', 'success') or self.is_active(): return notification = gobject_log(Gio.Notification()) if state == 'error': notification.set_title(N_('Download failed')) notification.set_default_action( 'app.notification-error--' + self._notification_uuid) elif state == 'success': notification.set_title(N_('Download finished')) if self.model.download_titles: notification.set_body(' | '.join(self.model.download_titles)) notification.set_default_action( 'app.notification-success--' + self._notification_uuid) notification.add_button( N_('Open Download Location'), 'app.notification-open-finished-download-dir--' + self._notification_uuid) else: assert False, 'unreachable' self.application.send_notification(self._notification_uuid, notification) def _show_shortcuts_dialog(self): dialog = gobject_log(ShortcutsDialog(self)) self.window_group.add_window(dialog) dialog.show() def _show_about_dialog(self): dialog = gobject_log(build_about_dialog(self)) self.window_group.add_window(dialog) dialog.show() def on_download_folder_error(self, title, message, path, show_reset_button=True): def handle_response(dialog, res): if res == RESPONSE_TYPE_CHANGE: self._change_download_folder().chain(async_response) connection.close() elif res == RESPONSE_TYPE_RESET: self.application.settings.reset('download-folder') async_response.set_result(None) else: async_response.cancel() RESPONSE_TYPE_RESET = 100 RESPONSE_TYPE_CHANGE = 101 if path is not None: message = '%s: %r' % (message, path) if message else repr(path) dialog = Gtk.MessageDialog( modal=True, destroy_with_parent=True, message_type=Gtk.MessageType.ERROR, text=title, secondary_text=message, buttons=Gtk.ButtonsType.CANCEL) if show_reset_button: dialog.add_button(N_('Reset to Default'), RESPONSE_TYPE_RESET) dialog.add_button(N_('Change Download Location'), RESPONSE_TYPE_CHANGE) dialog.set_default_response(RESPONSE_TYPE_CHANGE) dialog.set_transient_for(self) connection = SignalConnection(dialog, 'response', handle_response) connection.add_close_callback(dialog.destroy) async_response = AsyncResponse() async_response.add_close_callback(connection.close) self._cs.push(async_response) dialog.show() return async_response def _change_download_folder(self): def handle_callback(dialog, task): try: file = dialog.select_folder_finish(task) except GLib.GError: # Dialog cancelled async_response.cancel() return message = path = None if file and file.get_path(): path = file.get_path() message = check_download_dir(expand_path(path)) if message is None: self.model.download_folder = path async_response.set_result(None) return else: message = N_('Not a directory') self.on_download_folder_error( N_('Invalid folder selected'), message, path, show_reset_button=False).chain(async_response) dialog = gobject_log(Gtk.FileDialog( modal=True, title=N_('Change Download Location'), accept_label=N_('Select Folder'))) cancellable = Gio.Cancellable() async_response = AsyncResponse() async_response.add_close_callback(cancellable.cancel) self._cs.push(async_response) dialog.select_folder(self, cancellable, handle_callback) return async_response def on_playlist_request(self): def handle_response(dialog, res): if res == Gtk.ResponseType.NO: async_response.set_result(False) elif res == Gtk.ResponseType.YES: async_response.set_result(True) else: async_response.cancel() dialog = gobject_log(PlaylistDialog(self)) connection = SignalConnection(dialog, 'response', handle_response) connection.add_close_callback(dialog.destroy) async_response = AsyncResponse() async_response.add_close_callback(connection.close) self._cs.push(async_response) self.window_group.add_window(dialog) dialog.show() return async_response def on_login_request(self): def handle_response(dialog, res): if res == Gtk.ResponseType.OK: async_response.set_result((dialog.username, dialog.password)) else: async_response.cancel() dialog = gobject_log(LoginDialog(self)) connection = SignalConnection(dialog, 'response', handle_response) connection.add_close_callback(dialog.destroy) async_response = AsyncResponse() async_response.add_close_callback(connection.close) self._cs.push(async_response) self.window_group.add_window(dialog) dialog.show() return async_response def on_password_request(self): def handle_response(dialog, res): if res == Gtk.ResponseType.OK: async_response.set_result(dialog.password) else: async_response.cancel() dialog = gobject_log(PasswordDialog(self)) connection = SignalConnection(dialog, 'response', handle_response) connection.add_close_callback(dialog.destroy) async_response = AsyncResponse() async_response.add_close_callback(connection.close) self._cs.push(async_response) self.window_group.add_window(dialog) dialog.show() return async_response def destroy(self): self._hide_notification() self._cs.close() super().destroy() video-downloader-0.12.31/src/window.ui000066400000000000000000001016341516223405600175660ustar00rootroot00000000000000
New Window app.new-window
Change Download Location win.change-download-folder Keyboard Shortcuts win.shortcuts About Video Downloader win.about
hamburger_menu